void createanchor(float position[3]) { //int count; float vec[3]; memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_ANCHOR; object[numofobjects].timetolive=10000; object[numofobjects].radius=1.0f; object[numofobjects].friction=0.8f; object[numofobjects].numofparticles=0; copyvector(vec,position); vec[0]+=0.00001f; createparticle(2,position,NULL,10000.0f,numofobjects,10000); object[numofobjects].particle[0]=numofparticles-1; copyvector(object[numofobjects].position,position); object[numofobjects].numofcdlines=0; object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void createhead(float position[3],float sizex,float sizey,float mass,float friction) { int count; float vec[3]; float angle; memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_HEAD; object[numofobjects].timetolive=10000; if (sizex>=sizey) object[numofobjects].radius=sizex*1.25f; else object[numofobjects].radius=sizey*1.25f; object[numofobjects].mass=mass; object[numofobjects].texturenum=animation[19].stand[0]; object[numofobjects].friction=friction; object[numofobjects].numofparticles=8; for (count=0;count<8;count++) { angle=(float)count*pi/4.0f; vec[0]=position[0]+cos(angle)*sizex*0.5f; vec[1]=position[1]-sin(angle)*sizey*0.5f; vec[2]=0.0f; createparticle(3,vec,NULL,mass/8.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; } for (count=0;count<8;count++) { createbond(object[numofobjects].particle[((count+1)&7)],object[numofobjects].particle[count],1,numofobjects); createbond(object[numofobjects].particle[((count+2)&7)],object[numofobjects].particle[count],1,numofobjects); createbond(object[numofobjects].particle[((count+4)&7)],object[numofobjects].particle[count],1,numofobjects); } copyvector(object[numofobjects].position,position); object[numofobjects].numofcdlines=8; for (count=0;count<8;count++) { object[numofobjects].cdline[count][0]=count; object[numofobjects].cdline[count][1]=((count+1)&7); } object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void createamber(float position[3]) { int count; float vec[3]; float angle; memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_AMBER; object[numofobjects].timetolive=10000; object[numofobjects].radius=1.0f; object[numofobjects].texturenum=369; object[numofobjects].friction=0.3f; object[numofobjects].numofparticles=8; for (count=0;count<8;count++) { angle=(float)count*pi/4.0f; vec[0]=position[0]+cos(angle)*0.35f; vec[1]=position[1]-sin(angle)*0.35f; vec[2]=0.0f; createparticle(3,vec,NULL,0.125f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; } for (count=0;count<8;count++) { createbond(object[numofobjects].particle[((count+1)&7)],object[numofobjects].particle[count],1,numofobjects); createbond(object[numofobjects].particle[((count+2)&7)],object[numofobjects].particle[count],1,numofobjects); createbond(object[numofobjects].particle[((count+4)&7)],object[numofobjects].particle[count],1,numofobjects); } copyvector(object[numofobjects].position,position); object[numofobjects].numofcdlines=8; for (count=0;count<8;count++) { object[numofobjects].cdline[count][0]=count; object[numofobjects].cdline[count][1]=((count+1)&7); } object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void objectanimation(void) { int count,count2; int particlelist[2]; float vec[3]; float intersectpoint[3]; float normal[3]; float scale; for (count=0;count<numofobjects;count++) { if (object[count].type==1) { /* for (count2=0;count2<object[count].numofparticles;count2++) if ((rand()&8191)==0) createparticle(5,particle[object[count].particle[count2]].position,particle[object[count].particle[count2]].velocity,0.125f,-1,100); */ if (object[count].frame==12) { object[count].framedelay+=0.125f; if (object[count].framedelay>=1.0f) { object[count].frame=0; object[count].framedelay=0.0f; } } if (object[count].numoforientations==0) { if (object[count].frame>=5 && object[count].frame<=7) object[count].frame=1; if (object[count].frame<4) { object[count].framedelay+=1.0f; if (object[count].framedelay>=4.0f) { object[count].frame++; object[count].framedelay=0.0f; } } } else { if (object[count].frame>0 && object[count].frame<=4) { object[count].framedelay+=1.0f; if (object[count].framedelay>=4.0f) { object[count].frame--; object[count].framedelay=0.0f; } } if (object[count].frame==0) if ((rnd()&255)==0) object[count].frame=5; if (object[count].frame>=5 && object[count].frame<=7) { object[count].framedelay+=1.0f; if (object[count].framedelay>=4.0f) { object[count].frame++; if (object[count].frame==8) object[count].frame=0; object[count].framedelay=0.0f; } } } if ((object[count].button&8)==8) if (object[count].frame<8) { object[count].frame=8; object[count].framedelay=0.0f; } if (object[count].frame>=8 && object[count].frame<=11) { object[count].framedelay+=1.0f; if (object[count].framedelay>=4.0f) { if ((object[count].button&8)==8) { if (object[count].frame<11) object[count].frame++; } else { if (object[count].frame>7) object[count].frame--; if (object[count].frame==7) object[count].frame=0; } object[count].framedelay=0.0f; } } } if (object[count].type==4) { if (object[count].animationtype==0 || object[count].animationtype==1) if ((object[count].button&1)==1) { object[count].animationtype=2; object[count].frame=0; object[count].framedelay=0.0f; } if (object[count].beasttype==12) if (object[count].animationtype==0) if ((object[count].button&2)==2) { object[count].animationtype=1; object[count].frame=0; object[count].framedelay=0.0f; } if (object[count].animationtype==0) { if (object[count].link!=-1) { object[object[count].link].texturenum=animation[object[count].animationnum+32].stand[0]; if (fabs(object[0].position[0]-object[count].position[0])<1.5f) if (object[0].position[1]>object[count].position[1]) object[object[count].link].texturenum=animation[object[count].animationnum+32].stand[1]; } object[count].framedelay+=0.1f; if (object[count].framedelay>=1.0f) { object[count].framedelay=0.0f; object[count].frame++; if (object[count].frame>=animation[object[count].animationnum].stand[1]) object[count].frame=0; } object[count].texturenum=animation[object[count].animationnum].stand[0]+object[count].frame; if (vectorlength(object[count].velocity)>=0.01f) { object[count].animationtype=1; object[count].frame=0; object[count].framedelay=0.0f; } } if (object[count].animationtype==1) { if (object[count].link!=-1) { object[object[count].link].texturenum=animation[object[count].animationnum+32].walk[0]; if (fabs(object[0].position[0]-object[count].position[0])<1.5f) if (object[0].position[1]>object[count].position[1]) object[object[count].link].texturenum=animation[object[count].animationnum+32].stand[1]; } if (object[count].beasttype!=12) object[count].framedelay+=vectorlength(object[count].velocity)*6.0f; else object[count].framedelay+=0.2f; if (object[count].framedelay>=1.0f) { object[count].framedelay=0.0f; object[count].frame++; if (object[count].frame>=animation[object[count].animationnum].walk[1]) { object[count].frame=0; if (object[count].beasttype==12) object[count].animationtype=0; } } object[count].texturenum=animation[object[count].animationnum].walk[0]+object[count].frame; if (object[count].beasttype!=12) if (vectorlength(object[count].velocity)<0.01f) { object[count].animationtype=0; object[count].frame=0; object[count].framedelay=0.0f; } if (object[count].beasttype==12) if (object[count].frame==4) if (object[count].framedelay==0.0f) { addvectors(vec,object[count].position,yaxis); createbeast(11,vec,1.0f,1.0f,1.0f,0.2f); object[numofobjects-1].timetolive=512; object[numofobjects-1].link=-1; for (count2=0;count2<4;count2++) { particle[object[numofobjects-1].particle[count2]].velocity[1]=0.08f; if (object[count].direction==0) particle[object[numofobjects-1].particle[count2]].velocity[0]=-0.04f; else particle[object[numofobjects-1].particle[count2]].velocity[0]=0.04f; } } } if (object[count].animationtype==2) { if (object[count].link!=-1) object[object[count].link].texturenum=animation[object[count].animationnum+32].attack[0]; object[count].framedelay+=0.2f; if (object[count].framedelay>=1.0f) { object[count].framedelay=0.0f; object[count].frame++; if (object[count].frame>=animation[object[count].animationnum].attack[1]) { object[count].animationtype=0; object[count].frame=0; } } object[count].texturenum=animation[object[count].animationnum].attack[0]+object[count].frame; if (object[count].frame==1) if (object[count].framedelay==0.0f) { if (object[count].beasttype<3 || object[count].beasttype==8 || object[count].beasttype==11 || object[count].beasttype==16) playsound(11,object[count].position,NULL,0.25f,0,0.7f,-1,0); else if (object[count].beasttype==7 || object[count].beasttype==13) playsound(12,object[count].position,NULL,0.5f,0,1.0f,-1,0); else playsound(13,object[count].position,NULL,0.5f,0,1.0f,-1,0); } if (object[count].frame==5) { //if (object[count].beasttype!=7 && object[count].beasttype!=13) { scale=1.25f; if (object[count].beasttype<3 || object[count].beasttype==8 || object[count].beasttype==11 || object[count].beasttype==16) scale=0.75f; if (object[count].beasttype==15) scale=1.5f; if (object[count].beasttype==7 || object[count].beasttype==13) scale=3.0f; if (object[count].direction==0) scaleaddvectors(vec,object[count].position,object[count].orientation[0],-scale); if (object[count].direction==1) scaleaddvectors(vec,object[count].position,object[count].orientation[0],scale); if (lineintersectobject(intersectpoint,normal,&scale,object[count].position,vec,0,particlelist)) { scale=0.06f; if (object[count].beasttype<3) scale=0.03f; if (object[count].beasttype==15) scale=0.15f; if (object[count].direction==0) { scaleaddvectors(particle[particlelist[0]].velocity,particle[particlelist[0]].velocity,object[count].orientation[0],-scale); scaleaddvectors(particle[particlelist[1]].velocity,particle[particlelist[1]].velocity,object[count].orientation[0],-scale); } if (object[count].direction==1) { scaleaddvectors(particle[particlelist[0]].velocity,particle[particlelist[0]].velocity,object[count].orientation[0],scale); scaleaddvectors(particle[particlelist[1]].velocity,particle[particlelist[1]].velocity,object[count].orientation[0],scale); } if (object[count].beasttype<3 || object[count].beasttype==11) object[0].hitpoints-=20; else object[0].hitpoints-=40; if (object[count].beasttype==15) object[0].hitpoints-=40; } } if (object[count].beasttype==7 || object[count].beasttype==13) if (object[count].framedelay==0.0f) { if (object[count].beasttype==7) createbeast(2,object[count].position,1.0f,1.0f,1.0f,0.2f); else createbeast(8,object[count].position,1.0f,1.0f,1.0f,0.2f); object[numofobjects-1].timetolive=512; object[numofobjects-1].link=-1; for (count2=0;count2<4;count2++) { if (object[count].direction==0) particle[object[numofobjects-1].particle[count2]].velocity[0]=-0.08f; else particle[object[numofobjects-1].particle[count2]].velocity[0]=0.08f; } } } } if (object[count].timetolive>=0 && object[count].timetolive<45) { if (object[count].timetolive==44) { if (object[count].beasttype<3 || object[count].beasttype==8 || object[count].beasttype==11 || object[count].beasttype==16) { game.score[0]+=100*game.combo; createsprite(100*game.combo,object[count].position); game.combo++; game.combodelay+=100; if (game.combodelay>250) game.combodelay=250; playsound(7,object[count].position,NULL,1.0f,0,1.0f,-1,0); } else { game.score[0]+=200*game.combo; createsprite(200*game.combo,object[count].position); game.combo++; game.combodelay+=100; if (game.combodelay>250) game.combodelay=250; playsound(19,object[count].position,NULL,1.0f,0,1.0f,-1,0); } for (count2=0;count2<10;count2++) { vec[0]=(float)((rnd()&255)-127)/1270.0f; vec[1]=(float)((rnd()&255)-127)/1270.0f; vec[2]=0.0f; addvectors(vec,vec,object[count].velocity); createparticle(5,object[count].position,vec,0.25f,-1,100+(rnd()&63)); particle[numofparticles-1].rendersize=0.125+(float)(rnd()&127)/1000.0f; particle[numofparticles-1].texturenum=367; if (object[count].beasttype==11 || object[count].beasttype==12) particle[numofparticles-1].texturenum=364; if (object[count].beasttype==0 || object[count].beasttype==3 || object[count].beasttype==4) particle[numofparticles-1].texturenum=365; } } if (object[count].link!=-1) { object[object[count].link].texturenum=animation[object[count].animationnum+32].die[0]; if (object[object[count].link].timetolive>150) object[object[count].link].timetolive=150; } object[count].animationtype=3; object[count].frame=8-object[count].timetolive/5; object[count].framedelay=0.0f; object[count].texturenum=animation[object[count].animationnum].die[0]+object[count].frame; } } } if (game.levelnum==34) if (object[1].type==2) if ((rnd()&255)==0) { object[1].texturenum=64+(rnd()&3); } }
void setuplevel(void) { int count,count2; int numofobjectstemp; float vec[3]; for (count=0;count<256;count++) for (count2=0;count2<256;count2++) level.gridmod[count][count2]=0; setuplevellines(1,1,254,254); numofparticles=0; numofbonds=0; numofobjects=0; numofropes=0; physicstemp.numofbonds=0; numofsprites=0; numofbosses=0; for (count=0;count<level.numofobjects;count++) if (level.object[count].type>=20 && level.object[count].type<40) { if (animation[level.object[count].type-20].loaded==0) animation[level.object[count].type-20].loaded=2; if (level.object[count].type-20==7) if (animation[2].loaded==0) animation[2].loaded=2; if (level.object[count].type-20==13) if (animation[8].loaded==0) animation[8].loaded=2; if (level.object[count].type-20==12) if (animation[11].loaded==0) animation[11].loaded=2; } loadanimations(); for (count=0;count<level.numofobjects;count++) { numofobjectstemp=numofobjects; if (level.object[count].type==1) { createtarboy(level.object[count].position); object[numofobjects-1].texturenum=1; } if (level.object[count].type==2) createbox(level.object[count].position,level.object[count].size[0],level.object[count].size[1],level.object[count].mass,level.object[count].friction); if (level.object[count].type==3) { createbox(level.object[count].position,level.object[count].size[0],level.object[count].size[1],level.object[count].mass,level.object[count].friction); createparticle(2,level.object[count].position,NULL,10000.0f,-1,10000); createbond(numofparticles-5,numofparticles-1,1,-1); createbond(numofparticles-4,numofparticles-1,1,-1); createbond(numofparticles-3,numofparticles-1,1,-1); createbond(numofparticles-2,numofparticles-1,1,-1); } if (level.object[count].type==4) { if (level.gametype!=16) { createbox(level.object[count].position,level.object[count].size[0],level.object[count].size[1],level.object[count].mass,level.object[count].friction); vec[0]=level.object[count].position[0]-(level.object[count].size[0]-1.0f)*0.5f; vec[1]=level.object[count].position[1]-(level.object[count].size[1]-1.0f)*0.5f; vec[2]=0.0f; createparticle(2,vec,NULL,10000.0f,-1,10000); createbond(numofparticles-5,numofparticles-1,1,-1); createbond(numofparticles-4,numofparticles-1,1,-1); createbond(numofparticles-3,numofparticles-1,1,-1); createbond(numofparticles-2,numofparticles-1,1,-1); } else createcar(level.object[count].position,level.object[count].size[0],level.object[count].size[1],level.object[count].mass,level.object[count].friction); } if (level.object[count].type==5) { createbox(level.object[count].position,level.object[count].size[0],level.object[count].size[1],level.object[count].mass,level.object[count].friction); vec[0]=level.object[count].position[0]+(level.object[count].size[0]-1.0f)*0.5f; vec[1]=level.object[count].position[1]+(level.object[count].size[1]-1.0f)*0.5f; vec[2]=0.0f; createparticle(2,vec,NULL,10000.0f,-1,10000); createbond(numofparticles-5,numofparticles-1,1,-1); createbond(numofparticles-4,numofparticles-1,1,-1); createbond(numofparticles-3,numofparticles-1,1,-1); createbond(numofparticles-2,numofparticles-1,1,-1); } if (level.object[count].type==6) { createwheel(level.object[count].position,level.object[count].size[0],level.object[count].size[1],level.object[count].mass,level.object[count].friction,0); } if (level.object[count].type==7) { createwheel(level.object[count].position,level.object[count].size[0],level.object[count].size[1],level.object[count].mass,level.object[count].friction,1); //createparticle(2,level.object[count].position,NULL,10000.0f,-1,10000); //for (count2=0;count2<16;count2++) // createbond(numofparticles-17+count2,numofparticles-1,1,-1); } if (level.object[count].type==8) createanchor(level.object[count].position); if (level.object[count].type==9) createbutton(level.object[count].position,level.object[count].mass); if (level.object[count].type==10) { createbutton(level.object[count].position,level.object[count].mass); object[numofobjects-1].idata[1]=1; } if (level.object[count].type==11) createswitch(level.object[count].position,level.object[count].mass,0); if (level.object[count].type==12) createswitch(level.object[count].position,level.object[count].mass,1); if (level.object[count].type==13) createswitch(level.object[count].position,level.object[count].mass,2); if (level.object[count].type==14) createswitch(level.object[count].position,level.object[count].mass,3); if (level.object[count].type==15) createareaswitch(level.object[count].position,level.object[count].size[0],level.object[count].size[1]); if (level.object[count].type==16) { createareaswitch(level.object[count].position,level.object[count].size[0],level.object[count].size[1]); object[numofobjects-1].idata[1]=1; } if (level.object[count].type==18) { createareaswitch(level.object[count].position,level.object[count].size[0],level.object[count].size[1]); object[numofobjects-1].idata[1]=2; } if (level.object[count].type==17) creategenerator(level.object[count].position,level.object[count].mass); if (level.object[count].type==20) createbeast(0,level.object[count].position,1.0f,1.0f,1.0f,0.2f); if (level.object[count].type==21) createbeast(1,level.object[count].position,1.0f,1.0f,1.0f,0.2f); if (level.object[count].type==22) createbeast(2,level.object[count].position,1.0f,1.0f,1.0f,0.2f); if (level.object[count].type==23) createbeast(3,level.object[count].position,1.5f,1.1f,8.0f,0.2f); if (level.object[count].type==24) createbeast(4,level.object[count].position,1.5f,1.1f,8.0f,0.2f); if (level.object[count].type==25) createbeast(5,level.object[count].position,1.5f,1.1f,8.0f,0.2f); if (level.object[count].type==26) createbeast(6,level.object[count].position,1.5f,1.1f,8.0f,0.2f); if (level.object[count].type==27) createbeast(7,level.object[count].position,3.0f,3.0f,20.0f,0.2f); if (level.object[count].type==28) createbeast(8,level.object[count].position,1.0f,1.0f,1.0f,0.2f); if (level.object[count].type==29) createbeast(9,level.object[count].position,1.5f,1.1f,8.0f,0.2f); if (level.object[count].type==30) createbeast(10,level.object[count].position,1.5f,1.1f,8.0f,0.2f); if (level.object[count].type==31) createbeast(11,level.object[count].position,1.0f,1.0f,1.0f,0.2f); if (level.object[count].type==32) createbeast(12,level.object[count].position,2.0f,0.85f,3.0f,0.2f); if (level.object[count].type==33) createbeast(13,level.object[count].position,3.0f,3.0f,20.0f,0.2f); if (level.object[count].type==34) createboss(14,level.object[count].position); if (level.object[count].type==35) createbeast(15,level.object[count].position,2.0f,2.0f,8.0f,0.2f); if (level.object[count].type==36) createbeast(16,level.object[count].position,1.0f,1.0f,1.0f,0.2f); if (numofobjects!=numofobjectstemp) { if (level.object[count].type>1 && level.object[count].type<20) object[numofobjects-1].texturenum=level.object[count].texturenum; object[numofobjects-1].link=level.object[count].link; object[numofobjects-1].lighttype=level.object[count].lighttype; if (level.object[count].lighttype==1 || level.object[count].lighttype==3) object[numofobjects-1].lighton=1; if (level.object[count].lighttype==2) object[numofobjects-1].lighton=0; object[numofobjects-1].size[0]=level.object[count].size[0]; object[numofobjects-1].size[1]=level.object[count].size[1]; object[numofobjects-1].lightcolor[0]=level.object[count].lightcolor[0]; object[numofobjects-1].lightcolor[1]=level.object[count].lightcolor[1]; object[numofobjects-1].lightcolor[2]=level.object[count].lightcolor[2]; object[numofobjects-1].lightintensity=level.object[count].lightintensity; object[numofobjects-1].lightintensitymax=level.object[count].lightintensity; } } for (count=0;count<level.numofobjects;count++) { if ((level.object[count].type>=23 && level.object[count].type<=26) || level.object[count].type==29 || level.object[count].type==30) { vec[0]=level.object[count].position[0]; vec[1]=level.object[count].position[1]+1.4f;//+1.42f; vec[2]=0.0f; createhead(vec,2.0f,1.6f,2.0f,0.5f); object[count].link=numofobjects-1; //createbond(object[numofobjects-1].particle[0],object[count].particle[0],6,count); createbond(object[numofobjects-1].particle[2],object[count].particle[0],6,count); createbond(object[numofobjects-1].particle[4],object[count].particle[0],6,count); createbond(object[numofobjects-1].particle[0],object[count].particle[1],6,count); createbond(object[numofobjects-1].particle[2],object[count].particle[1],6,count); //createbond(object[numofobjects-1].particle[4],object[count].particle[1],6,count); } } for (count=0;count<level.numofropes;count++) { createrope(level.rope[count].type,object[level.rope[count].obj1].particle[level.rope[count].obj1part],object[level.rope[count].obj2].particle[level.rope[count].obj2part],level.rope[count].obj1,level.rope[count].obj2,level.rope[count].texturenum); } }
void createbobble(int beasttype,float position[3],float sizex,float sizey,float mass,float friction) { int count,count2; float vec[3]; memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_BEAST; object[numofobjects].timetolive=10000; object[numofobjects].mass=mass; object[numofobjects].beasttype=beasttype; if (beasttype==1) object[numofobjects].texturenum=500; if (beasttype==2) object[numofobjects].texturenum=540; object[numofobjects].numofparticles=6; if (sizex>=sizey) object[numofobjects].radius=sizex*1.5f; else object[numofobjects].radius=sizey*1.5f; object[numofobjects].friction=friction; count=0; vec[0]=-sizex*0.5f; vec[1]=sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); vec[0]=sizex*0.5f; vec[1]=sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); vec[0]=sizex*0.5f; vec[1]=-sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); vec[0]=-sizex*0.5f; vec[1]=-sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); vec[0]=-sizex*0.25f; vec[1]=sizey*0.65f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); vec[0]=sizex*0.25f; vec[1]=sizey*0.65f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); for (count=0;count<object[numofobjects].numofparticles;count++) for (count2=count+1;count2<object[numofobjects].numofparticles;count2++) createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],6,numofobjects); object[numofobjects].numofcdlines=6; count=0; object[numofobjects].cdline[count][0]=4; object[numofobjects].cdline[count][1]=5; count=1; object[numofobjects].cdline[count][0]=5; object[numofobjects].cdline[count][1]=1; count=2; object[numofobjects].cdline[count][0]=1; object[numofobjects].cdline[count][1]=2; count=3; object[numofobjects].cdline[count][0]=2; object[numofobjects].cdline[count][1]=3; count=4; object[numofobjects].cdline[count][0]=3; object[numofobjects].cdline[count][1]=0; count=5; object[numofobjects].cdline[count][0]=0; object[numofobjects].cdline[count][1]=4; object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void createbeast(int beasttype,float position[3],float sizex,float sizey,float mass,float friction) { int count,count2; float vec[3]; memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_BEAST; object[numofobjects].timetolive=10000; object[numofobjects].beasttype=beasttype; object[numofobjects].animationnum=beasttype; object[numofobjects].texturenum=animation[object[numofobjects].animationnum].stand[0]; object[numofobjects].mass=mass; object[numofobjects].hitpoints=250; if (beasttype==7 || beasttype==13) object[numofobjects].hitpoints=15000; object[numofobjects].size[0]=sizex; object[numofobjects].size[1]=sizey; object[numofobjects].numofparticles=4; if (sizex>=sizey) object[numofobjects].radius=sizex*1.5f; else object[numofobjects].radius=sizey*1.5f; object[numofobjects].friction=friction; count=0; vec[0]=-sizex*0.5f; vec[1]=sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.5f,-1,10000); vec[0]=sizex*0.5f; vec[1]=sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.5f,-1,10000); vec[0]=sizex*0.5f; vec[1]=-sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; if (beasttype!=12) createparticle(3,vec,NULL,mass*0.5f,-1,10000); else createparticle(2,vec,NULL,mass*0.5f,-1,10000); vec[0]=-sizex*0.5f; vec[1]=-sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; if (beasttype!=12) createparticle(3,vec,NULL,mass*0.5f,-1,10000); else createparticle(2,vec,NULL,mass*0.5f,-1,10000); for (count=0;count<object[numofobjects].numofparticles;count++) for (count2=count+1;count2<object[numofobjects].numofparticles;count2++) createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],6,numofobjects); copyvector(object[numofobjects].position,position); object[numofobjects].numofcdlines=4; for (count=0;count<4;count++) { object[numofobjects].cdline[count][0]=count; object[numofobjects].cdline[count][1]=((count+1)&3); } object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void createswitch(float position[3],float mass,int rotate) { int count,count2; float vec[3],vec2[3]; float orientation[2][2]; if (rotate==0) { orientation[0][0]=1.0f; orientation[0][1]=0.0f; orientation[1][0]=0.0f; orientation[1][1]=1.0f; } if (rotate==1) { orientation[0][0]=0.0f; orientation[0][1]=-1.0f; orientation[1][0]=1.0f; orientation[1][1]=0.0f; } if (rotate==2) { orientation[0][0]=-1.0f; orientation[0][1]=0.0f; orientation[1][0]=0.0f; orientation[1][1]=-1.0f; } if (rotate==3) { orientation[0][0]=0.0f; orientation[0][1]=-1.0f; orientation[1][0]=-1.0f; orientation[1][1]=0.0f; } memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_SWITCH; object[numofobjects].timetolive=10000; object[numofobjects].radius=1.5f; object[numofobjects].friction=0.3f; object[numofobjects].rotate=rotate; object[numofobjects].numofparticles=5; count=0; vec[0]=-0.875f; vec[1]=0.875f; vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0]; vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1]; vec2[2]=0.0f; createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=0.25f; vec[1]=0.0f; vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0]; vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1]; vec2[2]=0.0f; createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=-0.25f; vec[1]=-0.5f; vec[2]=0.0f; vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0]; vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1]; vec2[2]=0.0f; createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=-1.125f; vec[1]=0.625f; vec[2]=0.0f; vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0]; vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1]; vec2[2]=0.0f; createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=0.0f; vec[1]=-0.25f; vec[2]=0.0f; vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0]; vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1]; vec2[2]=0.0f; createparticle(2,vec2,NULL,10000.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; for (count=0;count<5;count++) for (count2=count+1;count2<5;count2++) createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],1,numofobjects); copyvector(object[numofobjects].position,position); object[numofobjects].numofcdlines=4; for (count=0;count<4;count++) { object[numofobjects].cdline[count][0]=count; if (rotate!=3) object[numofobjects].cdline[count][1]=((count+1)&3); else object[numofobjects].cdline[count][1]=((count-1)&3); } object[numofobjects].texcoord[0][0]=0.0f; object[numofobjects].texcoord[0][1]=0.0f; object[numofobjects].texcoord[1][0]=1.0f; object[numofobjects].texcoord[1][1]=0.0f; object[numofobjects].texcoord[2][0]=1.0f; object[numofobjects].texcoord[2][1]=1.0f; object[numofobjects].texcoord[3][0]=0.0f; object[numofobjects].texcoord[3][1]=1.0f; object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void createbutton(float position[3],float mass) { int count,count2; float vec[3]; memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_BUTTON; object[numofobjects].timetolive=10000; object[numofobjects].friction=0.3f; object[numofobjects].radius=1.5f; object[numofobjects].numofparticles=7; count=0; vec[0]=position[0]-0.499f; vec[1]=position[1]+0.5f; vec[2]=0.0f; createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=position[0]-0.125f; vec[1]=position[1]+0.75f; vec[2]=0.0f; createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=position[0]+0.125f; vec[1]=position[1]+0.75f; vec[2]=0.0f; createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=position[0]+0.499f; vec[1]=position[1]+0.5f; vec[2]=0.0f; createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=position[0]+0.499f; vec[1]=position[1]-0.125f; vec[2]=0.0f; createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=position[0]-0.499f; vec[1]=position[1]-0.125f; vec[2]=0.0f; createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; vec[0]=position[0]; vec[1]=position[1]-0.125f; vec[2]=0.0f; createparticle(2,vec,NULL,1.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; count++; for (count=0;count<6;count++) for (count2=count+1;count2<6;count2++) createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],1,numofobjects); copyvector(object[numofobjects].position,position); object[numofobjects].numofcdlines=6; for (count=0;count<6;count++) { object[numofobjects].cdline[count][0]=count; object[numofobjects].cdline[count][1]=((count+1)%6); } object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void createbox(float position[3],float sizex,float sizey,float mass,float friction) { int count,count2; float vec[3]; memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_BOX; object[numofobjects].timetolive=10000; object[numofobjects].mass=mass; object[numofobjects].numofparticles=4; if (sizex>=sizey) object[numofobjects].radius=sizex*1.5f; else object[numofobjects].radius=sizey*1.5f; object[numofobjects].size[0]=sizex; object[numofobjects].size[1]=sizey; object[numofobjects].friction=friction; count=0; vec[0]=-sizex*0.5f; vec[1]=sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); vec[0]=sizex*0.5f; vec[1]=sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); vec[0]=sizex*0.5f; vec[1]=-sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); vec[0]=-sizex*0.5f; vec[1]=-sizey*0.5f; vec[2]=0.0f; addvectors(vec,vec,position); object[numofobjects].particle[count]=numofparticles; count++; createparticle(3,vec,NULL,mass*0.25f,-1,10000); for (count=0;count<object[numofobjects].numofparticles;count++) for (count2=count+1;count2<object[numofobjects].numofparticles;count2++) createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],1,-1); copyvector(object[numofobjects].position,position); object[numofobjects].numofcdlines=4; for (count=0;count<4;count++) { object[numofobjects].cdline[count][0]=count; object[numofobjects].cdline[count][1]=((count+1)&3); } object[numofobjects].texcoord[0][0]=0.0f; object[numofobjects].texcoord[0][1]=0.0f; object[numofobjects].texcoord[1][0]=1.0f; object[numofobjects].texcoord[1][1]=0.0f; object[numofobjects].texcoord[2][0]=1.0f; object[numofobjects].texcoord[2][1]=1.0f; object[numofobjects].texcoord[3][0]=0.0f; object[numofobjects].texcoord[3][1]=1.0f; object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void createrope(int type,int particlenum,int particlenum2,int objectnum,int objectnum2,int texturenum) { int count/*,count2*/; int length; float vec[3],vec2[3]; float mass; if (type<5) { if (type==1) mass=0.125f; if (type==2) mass=0.25f; if (type==3) mass=1.0f; if (type==4) mass=2.0f; subtractvectors(vec,particle[particlenum2].position,particle[particlenum].position); length=vectorlength(vec); if (length<1) length=1; length*=2; scalevector(vec,vec,1.0f/(float)length); copyvector(vec2,particle[particlenum].position); addvectors(vec2,vec2,vec); createparticle(4,vec2,NULL,mass,-1,10000); createbond(particlenum,numofparticles-1,4,numofropes); rope[numofropes].type=type; rope[numofropes].part1=particlenum; rope[numofropes].part2=numofparticles-1; if (type<3) rope[numofropes].texturenum=360; else rope[numofropes].texturenum=361; numofropes++; for (count=1;count<length-1;count++) { addvectors(vec2,vec2,vec); createparticle(4,vec2,NULL,mass,-1,10000); createbond(numofparticles-2,numofparticles-1,4,numofropes); rope[numofropes].type=type; rope[numofropes].part1=numofparticles-2; rope[numofropes].part2=numofparticles-1; if (type<3) rope[numofropes].texturenum=360; else rope[numofropes].texturenum=361; numofropes++; } createbond(numofparticles-1,particlenum2,4,numofropes); rope[numofropes].type=type; rope[numofropes].part1=numofparticles-1; rope[numofropes].part2=particlenum2; if (type<3) rope[numofropes].texturenum=360; else rope[numofropes].texturenum=361; numofropes++; } else { if (type<10) createbond(particlenum,particlenum2,7,numofropes); else createbond(particlenum,particlenum2,8,numofropes); if (type<9) { if (level.object[objectnum2].type==6 || level.object[objectnum2].type==7) { subtractvectors(vec,level.object[objectnum2].position,particle[particlenum].position); subtractvectors(vec2,particle[particlenum2].position,object[objectnum2].position); rope[numofropes].range=vectorlength(vec2); bond[numofbonds-1].length=vectorlength(vec)-rope[numofropes].range; bond[numofbonds-1].maxlength=vectorlength(vec)-rope[numofropes].range; } if (level.object[objectnum2].type>=2 && level.object[objectnum2].type<6) { subtractvectors(vec2,level.object[objectnum2].position,object[objectnum].position); subtractvectors(vec,particle[particlenum2].position,particle[particlenum].position); if (fabs(vec2[0])>fabs(vec2[1])) vec[1]=0.0f; else vec[0]=0.0f; normalizevector(vec,vec); if (type==5 || type==9) copyvector(vec2,particle[particlenum2].position); if (type==6 || type==8) scaleaddvectors(vec2,particle[particlenum2].position,vec,-level.object[objectnum].lightcolor[0]*0.5f); if (type==7) scaleaddvectors(vec2,particle[particlenum2].position,vec,-level.object[objectnum].lightcolor[0]); subtractvectors(vec2,particle[particlenum].position,vec2); bond[numofbonds-1].length=vectorlength(vec2); bond[numofbonds-1].maxlength=vectorlength(vec2); if (type==5) scaleaddvectors(vec2,particle[particlenum2].position,vec,level.object[objectnum].lightcolor[0]); if (type==6 || type==8) scaleaddvectors(vec2,particle[particlenum2].position,vec,level.object[objectnum].lightcolor[0]*0.5f); if (type==7 || type==9) copyvector(vec2,particle[particlenum2].position); subtractvectors(vec2,particle[particlenum].position,vec2); rope[numofropes].range=(vectorlength(vec2)-bond[numofbonds-1].maxlength)*0.5f; } } rope[numofropes].type=type; rope[numofropes].part1=particlenum; rope[numofropes].part2=particlenum2; rope[numofropes].bondnum=numofbonds-1; if (type==5) rope[numofropes].angle=0.0f; if (type==6) rope[numofropes].angle=pi/2.0f; if (type==7) rope[numofropes].angle=pi; if (type==8) rope[numofropes].angle=3.0f*pi/2.0f; rope[numofropes].cycle=level.object[objectnum].lightcolor[1]; rope[numofropes].cyclelength=level.object[objectnum].lightcolor[2]; rope[numofropes].cyclecount=0.0f; rope[numofropes].link=level.object[objectnum].link; if (texturenum==0) rope[numofropes].texturenum=0; if (texturenum==1) rope[numofropes].texturenum=362; if (texturenum==2) rope[numofropes].texturenum=362; if (texturenum==3) rope[numofropes].texturenum=362; numofropes++; } }
void createwheel(float position[3],float sizex,float sizey,float mass,float friction,int anchor) { int count; float vec[3]; float angle; memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_WHEEL; object[numofobjects].timetolive=10000; if (sizex>=sizey) object[numofobjects].radius=sizex*1.25f; else object[numofobjects].radius=sizey*1.25f; object[numofobjects].mass=mass; object[numofobjects].friction=friction; object[numofobjects].numofparticles=17; for (count=0;count<16;count++) { angle=(float)count*pi/8.0f; vec[0]=position[0]+cos(angle)*sizex*0.5f; vec[1]=position[1]-sin(angle)*sizey*0.5f; vec[2]=0.0f; createparticle(3,vec,NULL,mass/20.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; } count=16; if (!anchor) createparticle(3,position,NULL,mass/5.0f,numofobjects,10000); else createparticle(2,position,NULL,mass/5.0f,numofobjects,10000); object[numofobjects].particle[count]=numofparticles-1; for (count=0;count<16;count++) { createbond(object[numofobjects].particle[((count+1)&15)],object[numofobjects].particle[(count&15)],1,numofobjects); createbond(object[numofobjects].particle[((count+2)&15)],object[numofobjects].particle[(count&15)],1,numofobjects); createbond(object[numofobjects].particle[((count+3)&15)],object[numofobjects].particle[(count&15)],1,numofobjects); //createbond(object[numofobjects].particle[((count+4)&15)],object[numofobjects].particle[(count&15)],1,numofobjects); //createbond(object[numofobjects].particle[((count+8)&15)],object[numofobjects].particle[(count&15)],1,numofobjects); createbond(object[numofobjects].particle[16],object[numofobjects].particle[(count&15)],1,numofobjects); } copyvector(object[numofobjects].position,position); object[numofobjects].numofcdlines=16; for (count=0;count<16;count++) { object[numofobjects].cdline[count][0]=count; object[numofobjects].cdline[count][1]=((count+1)&15); } object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void createtarboy(float position[3]) { int resolution = 16; //standard: 16 int count; float vec[3]; float angle; float size; memset(&object[numofobjects],0,sizeof(object[numofobjects])); object[numofobjects].type = OBJ_TYPE_GISH; object[numofobjects].timetolive=10000; object[numofobjects].radius=1.5f; object[numofobjects].mass=4.0f; object[numofobjects].friction=1.2f; if (numofobjects==0) object[numofobjects].direction=1; object[numofobjects].hitpoints=1000; /* Particles */ object[numofobjects].numofparticles = resolution; for (count=0; count < resolution; count++) { // Changing resolution changes count range. angle=(float)count*pi/8.0f; size=0.9f; if (game.supersize) size=0.9f*1.25f; if (game.difficulty==4) size=0.9f*0.8f; vec[0]=position[0]+cos(angle)*size; vec[1]=position[1]-sin(angle)*size; vec[2]=0.0f; createparticle(1,vec,NULL,0.25f,numofobjects,10000); object[numofobjects].particle[count] = numofparticles - 1; } /* Create bonds */ for (count = 0; count < resolution; count++) { _object *o; int i1, i2; o = &object[numofobjects]; i1 = o->particle[(count+1)&(resolution-1)]; i2 = o->particle[(count&(resolution-1))]; createbond(i1, i2, 3, -1); i1 = o->particle[((count+2)&(resolution-1))]; i2 = o->particle[(count&(resolution-1))]; createbond(i1, i2, 3, -1); i1 = o->particle[((count+(resolution / 2))&(resolution-1))]; i2 = o->particle[(count&(resolution-1))]; createbond(i1, i2, 2, numofobjects); } copyvector(object[numofobjects].position, position); object[numofobjects].numofcdlines = resolution; /* lines around */ for (count = 0; count < resolution; count++) { object[numofobjects].cdline[count][0]=count; object[numofobjects].cdline[count][1]=((count+1)&(resolution-1)); } /* set no sounds */ object[numofobjects].soundnum[0]=-1; object[numofobjects].soundnum[1]=-1; object[numofobjects].soundnum[2]=-1; object[numofobjects].soundnum[3]=-1; numofobjects++; }
void objectcycle(void) { int count,count2,count3,count4; int x,y; float vec[3],vec2[3]; float veclength,bondlength; float angle,spin; float intersectpoint[3]; float normal[3]; float scale,scale2; for (count=0;count<numofropes;count++) { updateogg(); if (rope[count].type>=5 && rope[count].type<9) { bond[rope[count].bondnum].length=bond[rope[count].bondnum].maxlength+(rope[count].range-cos(rope[count].angle)*rope[count].range); if (rope[count].cyclelength==0.0f) { if (rope[count].link==-1 || object[rope[count].link].idata[0]==1) { rope[count].angle+=2.0f*pi/(50.0f*rope[count].cycle); if (rope[count].angle>2.0f*pi) rope[count].angle-=2.0f*pi; } } else { if (rope[count].link==-1) { if (rope[count].cyclecount<rope[count].cyclelength*2.0f*pi) { rope[count].angle+=2.0f*pi/(50.0f*rope[count].cycle); if (rope[count].angle>2.0f*pi) rope[count].angle-=2.0f*pi; rope[count].cyclecount+=2.0f*pi/(50.0f*rope[count].cycle); } } else { count2=0; if (object[rope[count].link].idata[0]==1 && rope[count].cyclecount==0.0f) count2=1; if (rope[count].cyclecount>0.0f && rope[count].cyclecount<rope[count].cyclelength*2.0f*pi) count2=1; if (rope[count].cyclecount>rope[count].cyclelength*2.0f*pi+2.0f*pi/(50.0f*rope[count].cycle)) count2=1; if (object[rope[count].link].idata[0]==0 && rope[count].cyclecount>0.0f) count2=1; if (count2==1) { rope[count].angle+=2.0f*pi/(50.0f*rope[count].cycle); if (rope[count].angle>2.0f*pi) rope[count].angle-=2.0f*pi; rope[count].cyclecount+=2.0f*pi/(50.0f*rope[count].cycle); if (rope[count].cyclecount>=rope[count].cyclelength*4.0f*pi) rope[count].cyclecount=0.0f; } } } } } for (count=0;count<numofobjects;count++) { updateogg(); if (object[count].damagedelay>0) object[count].damagedelay--; if (object[count].numofparticles!=0) { zerovector(object[count].velocity); for (count2=0;count2<object[count].numofparticles;count2++) addvectors(object[count].velocity,object[count].velocity,particle[object[count].particle[count2]].velocity); scalevector(object[count].velocity,object[count].velocity,1.0f/(float)object[count].numofparticles); zerovector(object[count].position); for (count2=0;count2<object[count].numofparticles;count2++) addvectors(object[count].position,object[count].position,particle[object[count].particle[count2]].position); scalevector(object[count].position,object[count].position,1.0f/(float)object[count].numofparticles); } objectsound(count); if (object[count].link!=-1) { if (object[count].lighttype==1 || object[count].lighttype==3) { if (object[object[count].link].idata[0]) object[count].lighton=0; else object[count].lighton=1; } if (object[count].lighttype==2) { if (object[object[count].link].idata[0]) object[count].lighton=1; else object[count].lighton=0; } } if (object[count].lighttype==3) { object[count].lightintensity+=((rand()&255)/255.0f-0.5f)*0.2f*object[count].lightintensitymax; if (object[count].lightintensity<object[count].lightintensitymax*0.5f) object[count].lightintensity=object[count].lightintensitymax*0.5f; if (object[count].lightintensity>object[count].lightintensitymax*1.5f) object[count].lightintensity=object[count].lightintensitymax*1.5f; } if (object[count].type==9) if (object[count].idata[0]==0 || object[count].idata[1]==0) { vec[1]=particle[object[count].particle[6]].position[1]-particle[object[count].particle[4]].position[1]; vec[1]*=0.08f; vec[1]-=particle[object[count].particle[4]].velocity[1]; particle[object[count].particle[4]].velocity[1]+=vec[1]; vec[1]=particle[object[count].particle[6]].position[1]-particle[object[count].particle[5]].position[1]; vec[1]*=0.08f; vec[1]-=particle[object[count].particle[5]].velocity[1]; particle[object[count].particle[5]].velocity[1]+=vec[1]; if (particle[object[count].particle[4]].position[1]>particle[object[count].particle[6]].position[1]-0.1f) if (particle[object[count].particle[5]].position[1]>particle[object[count].particle[6]].position[1]-0.1f) { if (object[count].idata[0]==1) playsound(14,object[count].position,NULL,0.2f,0,1.0f,-1,0); object[count].idata[0]=0; } if (particle[object[count].particle[4]].position[1]<particle[object[count].particle[6]].position[1]-0.2f) if (particle[object[count].particle[5]].position[1]<particle[object[count].particle[6]].position[1]-0.2f) { if (object[count].idata[0]==0) playsound(14,object[count].position,NULL,0.2f,0,1.0f,-1,0); object[count].idata[0]=1; } if (object[count].link!=-1) if (object[object[count].link].idata[0]==1) object[count].idata[0]=1; } if (object[count].type==9) if (object[count].idata[0]==1 && object[count].idata[1]==1) { vec[1]=particle[object[count].particle[6]].position[1]-0.375f-particle[object[count].particle[4]].position[1]; vec[1]*=0.08f; vec[1]-=particle[object[count].particle[4]].velocity[1]; particle[object[count].particle[4]].velocity[1]+=vec[1]; vec[1]=particle[object[count].particle[6]].position[1]-0.375f-particle[object[count].particle[5]].position[1]; vec[1]*=0.08f; vec[1]-=particle[object[count].particle[5]].velocity[1]; particle[object[count].particle[5]].velocity[1]+=vec[1]; } if (object[count].type==16) if (object[count].idata[0]==0 || object[count].idata[1]==0) { object[count].idata[0]=0; if (fabs(object[0].position[0]-object[count].position[0])<object[count].size[0]*0.5f) if (fabs(object[0].position[1]-object[count].position[1])<object[count].size[1]*0.5f) { object[count].idata[0]=1; if (object[count].idata[1]==2) { if ((rand()&3)==0) playsound(8,object[count].position,NULL,1.0f,0,1.0f,-1,0); else playsound(9,object[count].position,NULL,1.0f,0,1.0f,-1,0); game.bonus[8]++; } } if (level.gametype==11) if (fabs(object[1].position[0]-object[count].position[0])<object[count].size[0]*0.5f) if (fabs(object[1].position[1]-object[count].position[1])<object[count].size[1]*0.5f) { object[count].idata[0]=1; if (object[count].idata[1]==2) { if ((rand()&3)==0) playsound(8,object[count].position,NULL,1.0f,0,1.0f,-1,0); else playsound(9,object[count].position,NULL,1.0f,0,1.0f,-1,0); game.bonus[8]++; } } } if (object[count].type==15) { if (object[count].link==-1 || object[object[count].link].idata[0]==1) if ((game.framenum&255)==128) { createwheel(object[count].position,object[count].size[0],object[count].size[1],object[count].mass,0.8f,0); object[numofobjects-1].texturenum=object[count].texturenum; object[numofobjects-1].timetolive=512; object[numofobjects-1].link=-1; for (count2=0;count2<object[numofobjects-1].numofparticles;count2++) { particle[object[numofobjects-1].particle[count2]].velocity[0]=object[count].lightcolor[0]/PHYSICSCYCLE; particle[object[numofobjects-1].particle[count2]].velocity[1]=object[count].lightcolor[1]/PHYSICSCYCLE; } } } if (object[count].type==10) { if (object[count].rotate==0 || object[count].rotate==2) count3=1; else count3=0; for (count2=1;count2<=2;count2++) { vec[count3]=particle[object[count].particle[4]].position[count3]-particle[object[count].particle[count2]].position[count3]; if (vec[count3]<0.0f) vec[count3]+=0.25f; else vec[count3]-=0.25f; if (vec[count3]<0.0f) { vec[2]=-0.04f; if (vec[2]<vec[count3]) vec[2]=vec[count3]; } else { vec[2]=0.04f; if (vec[2]>vec[count3]) vec[2]=vec[count3]; } vec[2]-=particle[object[count].particle[count2]].velocity[count3]; particle[object[count].particle[count2]].velocity[count3]+=vec[2]; if (particle[object[count].particle[count2]].position[count3]>particle[object[count].particle[4]].position[count3]+0.25f) particle[object[count].particle[count2]].position[count3]=particle[object[count].particle[4]].position[count3]+0.25f; if (particle[object[count].particle[count2]].position[count3]<particle[object[count].particle[4]].position[count3]-0.25f) particle[object[count].particle[count2]].position[count3]=particle[object[count].particle[4]].position[count3]-0.25f; } vec[0]=particle[object[count].particle[4]].position[count3]-particle[object[count].particle[1]].position[count3]; if (object[count].rotate==3) vec[0]=-vec[0]; if (vec[0]<-0.2f) { if (object[count].idata[0]==1) playsound(14,object[count].position,NULL,0.2f,0,1.0f,-1,0); object[count].idata[0]=0; } if (vec[0]>0.2f) { if (object[count].idata[0]==0) playsound(14,object[count].position,NULL,0.2f,0,1.0f,-1,0); object[count].idata[0]=1; } if (object[count].link!=-1) if (object[object[count].link].idata[0]==1) object[count].idata[0]=1; } if (object[count].type==1) { if (count!=0) if (level.gametype==0 && game.levelnum==34) objectai(count); for (count2=0;count2<16;count2++) { x=particle[object[count].particle[count2]].position[0]; y=particle[object[count].particle[count2]].position[1]; if (x>0 && x<254) if (y>0 && y<254) { if (block[level.foregrid[y][x]].density!=0.0f) if ((rand()&255)==0) { createparticle(5,object[count].position,object[count].velocity,0.125f*0.25f,-1,100+(rand()&63)); particle[numofparticles-1].rendersize=0.125+(float)(rand()&127)/1000.0f; particle[numofparticles-1].texturenum=366; } if (block[level.foregrid[y][x]].foredamage!=0) object[count].hitpoints-=block[level.foregrid[y][x]].foredamage; if ((level.grid[y][x]>=248 && level.grid[y][x]<=255 && level.gridmod[y][x]==0) || (level.grid[y][x]>=240 && level.grid[y][x]<=247 && level.gridmod[y][x]==2)) { vec[0]=(float)x+0.5f; vec[1]=(float)y+0.5f; vec[2]=0.0f; subtractvectors(vec2,vec,particle[object[count].particle[count2]].position); if (vectorlength(vec2)<0.45f) { scale=1.0f; if (level.grid[y][x]==251 || (level.grid[y][x]==251-8 && level.gridmod[y][x]==2)) { if (game.numoflives<99 && game.difficulty!=3) { game.numoflives++; createsprite(0,vec); sprintf(sprite[numofsprites-1].text,"1UP"); sprite[numofsprites-1].size=14; } else { game.score[0]+=1000; createsprite(1000,vec); } } if (level.grid[y][x]==252 || (level.grid[y][x]==252-8 && level.gridmod[y][x]==2)) { if (object[count].hitpoints<900) object[count].hitpoints+=100; else object[count].hitpoints=1000; } if (level.grid[y][x]==253 || (level.grid[y][x]==253-8 && level.gridmod[y][x]==2)) { if (level.gametype!=15) { game.score[0]+=50; createsprite(50,vec); } else game.score[count]++; } if (level.grid[y][x]==254 || (level.grid[y][x]==254-8 && level.gridmod[y][x]==2)) { game.score[0]+=100; createsprite(100,vec); if (game.oldschool==0) scale=0.9f; } if (level.grid[y][x]==255 || (level.grid[y][x]==255-8 && level.gridmod[y][x]==2)) { game.score[0]+=1000; createsprite(1000,vec); if (game.oldschool==0) scale=0.8f; } if (level.grid[y][x]==252 || (level.grid[y][x]==252-8 && level.gridmod[y][x]==2)) playsound(20,vec,NULL,0.7f,0,scale,-1,0); else playsound(10,vec,NULL,0.4f,0,scale,-1,0); level.gridmod[y][x]=1; if (level.grid[y][x]>=248 && level.grid[y][x]<=255) game.bonus[level.grid[y][x]-248]++; if (level.grid[y][x]>=240 && level.grid[y][x]<=247) game.bonus[level.grid[y][x]-240]++; } } } } count4=0; for (count2=0;count2<16;count2++) for (count3=0;count3<16;count3++) if (abs(count2-count3)>6) { subtractvectors(vec,particle[object[count].particle[count3]].position,particle[object[count].particle[count2]].position); veclength=vectorlength(vec); if (veclength<0.15f) count4++; //if (veclength<0.15f) // object[count].hitpoints-=(0.2f-veclength)*500.0f; } if (count4>=2) object[count].hitpoints-=(count4-1)*50; if (object[count].numoforientations==0) copyvector(object[count].orientation[1],yaxis); else normalizevector(object[count].orientation[1],object[count].orientation[1]); crossproduct(object[count].orientation[0],zaxis,object[count].orientation[1]); normalizevector(object[count].orientation[0],object[count].orientation[0]); if (dotproduct(object[count].velocity,object[count].orientation[0])<-0.02f) object[count].direction=0; if (dotproduct(object[count].velocity,object[count].orientation[0])>0.02f) object[count].direction=1; angle=atan2(object[count].orientation[0][1],object[count].orientation[0][0]); spin=cos(angle)*fabs(cos(angle))*object[count].axis[0]+sin(angle)*fabs(sin(angle))*object[count].axis[1]; if (spin<-1.0f) spin=-1.0f; if (spin>1.0f) spin=1.0f; if (angle<object[count].angle-pi) angle+=2.0f*pi; if (angle>object[count].angle+pi) angle-=2.0f*pi; /* scale=(angle-object[count].angle); if (scale<-0.1f) scale=-0.1f; if (scale>0.1f) scale=0.1f; object[count].angle+=scale; */ object[count].angle+=(angle-object[count].angle)*0.05f; if (object[count].angle<0.0f) object[count].angle+=2.0f*pi; if (object[count].angle>2.0f*pi) object[count].angle-=2.0f*pi; for (count2=0;count2<16;count2++) { subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position); crossproduct(vec2,zaxis,vec); normalizevector(vec2,vec2); if (object[count].numoforientations!=0) { scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2,spin*0.004f); } //if (object[count].numoforientations==0) { scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,xaxis,object[count].axis[0]*0.001f); if (object[count].axis[1]<0.0f) scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,object[count].axis[1]*0.001f); else scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,object[count].axis[1]*0.0005f); } } if ((object[count].button&4)==4) object[count].friction=0.01f; else object[count].friction=1.2f; if ((object[count].button&2)==2 || (object[count].button&8)==8) { for (count2=0;count2<numofbonds;count2++) if (bond[count2].objectnum==count && bond[count2].type==2) { bond[count2].cycles=0; //bond[count2].elasticity=0.02f; } } else { for (count2=0;count2<numofbonds;count2++) if (bond[count2].objectnum==count && bond[count2].type==2) { bond[count2].cycles=31; /* if ((object[count].button&4)==4) bond[count2].elasticity=0.005f; else bond[count2].elasticity=0.02f; */ } } if ((object[count].button&8)==8) { for (count2=0;count2<object[count].numofparticles;count2++) { particle[object[count].particle[count2]].gravity=10.0f/(PHYSICSCYCLE*PHYSICSCYCLE); particle[object[count].particle[count2]].mass=0.5f; } } else { for (count2=0;count2<object[count].numofparticles;count2++) { particle[object[count].particle[count2]].gravity=4.0f/(PHYSICSCYCLE*PHYSICSCYCLE); particle[object[count].particle[count2]].mass=0.25f; } } } if (object[count].type==20) { subtractvectors(object[count].orientation[1],particle[object[count].particle[0]].position,particle[object[count].particle[3]].position); normalizevector(object[count].orientation[1],object[count].orientation[1]); object[count].orientation[0][0]=object[count].orientation[1][1]; object[count].orientation[0][1]=-object[count].orientation[1][0]; object[count].orientation[0][2]=0.0f; object[count].data[0]+=object[count].axis[0]*0.05f; if (object[count].data[0]<0.0f) object[count].data[0]+=0.02f; if (object[count].data[0]>0.0f) object[count].data[0]-=0.02f; if (object[count].data[0]<-0.5f) object[count].data[0]=-0.5f; if (object[count].data[0]>0.5f) object[count].data[0]=0.5f; object[count].data[1]+=object[count].axis[1]*0.008f; if ((object[count].button&2)==2) object[count].data[1]=0.0f; if (object[count].data[1]<0.0f) object[count].data[1]+=0.004f; if (object[count].data[1]>0.0f) object[count].data[1]-=0.004f; if (object[count].data[1]<-0.3f) object[count].data[1]=-0.3f; if (object[count].data[1]>0.3f) object[count].data[1]=0.3f; for (count2=0;count2<4;count2++) { copyvector(vec,particle[object[count].particle[count2]].velocity); if (count2==1 || count2==2) { //normal[0]=object[count].orientation[0][0]*cos(object[count].data[0])+object[count].orientation[0][1]*sin(object[count].data[0]); //normal[1]=object[count].orientation[1][1]*cos(object[count].data[0])-object[count].orientation[1][0]*sin(object[count].data[0]); scalevector(normal,object[count].orientation[0],cos(object[count].data[0])); scaleaddvectors(normal,normal,object[count].orientation[1],-sin(object[count].data[0])); calculatefriction(vec,vec2,normal,0.8f); subtractvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2); } else { copyvector(normal,object[count].orientation[0]); scaleaddvectors(vec,vec,normal,-object[count].data[1]); vec[2]=1.0f/PHYSICSCYCLE; calculatefriction(vec,vec2,zaxis,0.8f); vec2[2]=0.0f; subtractvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2); } //copyvector(particle[object[count].particle[count2]].velocity,vec); } for (count2=0;count2<4;count2++) { subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position); crossproduct(vec2,zaxis,vec); normalizevector(vec2,vec2); //scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2,object[count].axis[0]*0.002f); //scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,object[count].orientation[0],object[count].axis[1]*0.003f); } } if (object[count].type==4) { for (count2=0;count2<4;count2++) { x=particle[object[count].particle[count2]].position[0]; y=particle[object[count].particle[count2]].position[1]; if (x>0 && x<254) if (y>0 && y<254) { if (block[level.foregrid[y][x]].foredamage!=0) object[count].hitpoints-=block[level.foregrid[y][x]].foredamage*4; } } if (object[count].hitpoints<0) if (object[count].timetolive>45) object[count].timetolive=45; subtractvectors(object[count].orientation[1],particle[object[count].particle[0]].position,particle[object[count].particle[3]].position); normalizevector(object[count].orientation[1],object[count].orientation[1]); object[count].orientation[0][0]=object[count].orientation[1][1]; object[count].orientation[0][1]=-object[count].orientation[1][0]; object[count].orientation[0][2]=0.0f; objectai(count); if (object[0].position[0]<object[count].position[0]) object[count].direction=0; else object[count].direction=1; if (object[count].velocity[0]<-0.01f) object[count].direction=0; if (object[count].velocity[0]>0.01f) object[count].direction=1; if (object[count].link!=-1) object[object[count].link].direction=object[count].direction; if (dotproduct(object[count].orientation[1],yaxis)>0.7f) if (object[count].numoforientations!=0) { if (object[count].beasttype>=0 && object[count].beasttype<=2) scale=2.0f; if (object[count].beasttype==8 || object[count].beasttype==11) scale=2.0f; if (object[count].beasttype==16) scale=2.0f; if (object[count].beasttype>=3 && object[count].beasttype<=6) scale=2.0f; if (object[count].beasttype==9 || object[count].beasttype==10) scale=2.0f; if (object[count].beasttype==7 || object[count].beasttype==13) scale=1.5f; if (object[count].beasttype==15) scale=2.5f; if (object[count].axis[0]==-1.0f) { for (count2=0;count2<4;count2++) if (particle[object[count].particle[count2]].velocity[0]>-3.0f/PHYSICSCYCLE) particle[object[count].particle[count2]].velocity[0]-=scale/(PHYSICSCYCLE*PHYSICSCYCLE); } if (object[count].axis[0]==1.0f) { for (count2=0;count2<4;count2++) if (particle[object[count].particle[count2]].velocity[0]<3.0f/PHYSICSCYCLE) particle[object[count].particle[count2]].velocity[0]+=scale/(PHYSICSCYCLE*PHYSICSCYCLE); } } if (object[count].beasttype==0 || object[count].beasttype==2 || object[count].beasttype==8 || object[count].beasttype==16) if (object[count].numoforientations!=0) if ((object[count].button&2)==2) for (count2=0;count2<4;count2++) { if (object[count].beasttype!=8) scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,0.08f); else scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,0.12f); } if (object[count].beasttype==15) if (object[count].numoforientations!=0) if ((object[count].button&2)==2) for (count2=0;count2<2;count2++) scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,0.08f); if (object[count].numoforientations!=0) if (dotproduct(object[count].orientation[1],yaxis)<0.7f) { if (object[count].orientation[1][0]<0.0f) spin=1.0f; else spin=-1.0f; for (count2=0;count2<4;count2++) { subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position); crossproduct(vec2,zaxis,vec); normalizevector(vec2,vec2); scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2,spin*0.003f); } } } } }