void checkbonds(void) { int count/*,count2*/; //int numofbondstemp; int part1,part2; float vec[3]/*,vec2[3]*/; float veclength; //float scale; for (count=0; count<numofbonds; count++) if (bond[count].type==4 || bond[count].type==6 || bond[count].type==16) if (bond[count].timetolive!=-1) { part1=bond[count].part1; part2=bond[count].part2; subtractvectors(vec,particle[part2].position,particle[part1].position); scaleaddvectors(vec,vec,particle[part2].velocity,1.0f); scaleaddvectors(vec,vec,particle[part1].velocity,-1.0f); veclength=vectorlength(vec); if (bondtype[bond[count].type].compression!=0.0f) if (veclength<bond[count].length*bond[count].compression) { bond[count].timetolive=-1; /* if (bond[count].type==6) { for (count2=0;count2<numofbonds;count2++) if (bond[count2].type==6) if (bond[count2].objectnum==bond[count].objectnum) bond[count2].timetolive=-1; } */ } if (veclength>bond[count].length*bond[count].tension) { bond[count].timetolive=-1; /* if (bond[count].type==6) { for (count2=0;count2<numofbonds;count2++) if (bond[count2].type==6) if (bond[count2].objectnum==bond[count].objectnum) bond[count2].timetolive=-1; } */ } } count=0; while (count<numofbonds) { while (count<numofbonds && bond[count].timetolive==-1) deletebond(count); count++; } }
int pointintersectobject(float *intersectpoint,float *normal,float *scale,float *point,int objectnum,int objectnum2,int *particlelist) { int count; int particlelisttemp[2]; float vec[3]; float intersectpointtemp[3]; float normaltemp[3]; float scaletemp; float angle; *scale=0.0f; for (count=0;count<object[objectnum].numofcdlines;count++) { particlelisttemp[0]=object[objectnum].cdline[count][0]; particlelisttemp[1]=object[objectnum].cdline[count][1]; normaltemp[0]=particle[object[objectnum].particle[particlelisttemp[0]]].position[1]-particle[object[objectnum].particle[particlelisttemp[1]]].position[1]; normaltemp[1]=particle[object[objectnum].particle[particlelisttemp[1]]].position[0]-particle[object[objectnum].particle[particlelisttemp[0]]].position[0]; normaltemp[2]=0.0f; normalizevector(normaltemp,normaltemp); scaleaddvectors(vec,point,normaltemp,0.5f); if (object[objectnum].type==10) scaleaddvectors(vec,point,normaltemp,0.25f); if (object[objectnum].type==2 && object[objectnum].size[0]<=0.5f) scaleaddvectors(vec,point,normaltemp,0.25f); if (object[objectnum2].type==2 && object[objectnum2].size[0]<=0.5f) scaleaddvectors(vec,point,normaltemp,0.25f); if (lineintersectline2(intersectpointtemp,normaltemp,&scaletemp,vec,point,particle[object[objectnum].particle[particlelisttemp[0]]].position,particle[object[objectnum].particle[particlelisttemp[1]]].position)) { subtractvectors(vec,intersectpointtemp,object[objectnum2].position); normalizevector(vec,vec); if (object[objectnum2].type==OBJ_TYPE_GISH) angle=0.707f; else angle=0.0f; if (object[objectnum].type==2 && object[objectnum].size[0]<=0.5f) angle=0.0f; if (dotproduct(vec,normaltemp)<angle) if (scaletemp>*scale) { *scale=scaletemp; particlelist[0]=particlelisttemp[0]; particlelist[1]=particlelisttemp[1]; copyvector(normal,normaltemp); copyvector(intersectpoint,intersectpointtemp); } } } if (*scale>0.0f) return(1); return(0); }
void bondsimulation(void) { int count,count2; int part1,part2; float vec[3]; float bondnormal[3]; float veclength; float force[2]; for (count=0; count<32; count++) { for (count2=0; count2<numofparticles; count2++) copyvector(particle[count2].prevvelocity,particle[count2].velocity); for (count2=0; count2<numofbonds; count2++) if ((count&bond[count2].cycles)==0) { part1=bond[count2].part1; part2=bond[count2].part2; subtractvectors(bondnormal,particle[part2].position,particle[part1].position); veclength=vectorlength(bondnormal)-bond[count2].length; normalizevector(bondnormal,bondnormal); zerovector(vec); scaleaddvectors(vec,vec,particle[part2].prevvelocity,1.0f); scaleaddvectors(vec,vec,particle[part1].prevvelocity,-1.0f); veclength+=dotproduct(vec,bondnormal); if (bondtype[bond[count2].type].compression==0.0f) if (veclength<0.0f) veclength=0.0f; veclength*=bond[count2].elasticity; veclength/=(particle[part1].mass+particle[part2].mass); force[0]=veclength*particle[part2].mass; force[1]=veclength*particle[part1].mass; scaleaddvectors(particle[part1].velocity,particle[part1].velocity,bondnormal,force[0]); scaleaddvectors(particle[part2].velocity,particle[part2].velocity,bondnormal,-force[1]); } } }
int lineintersectplane(float *intersectpoint,float *normal,float *scale,float *startpoint,float *endpoint,float *point) { float vec[3],vec2[3],vec3[3]; subtractvectors(vec,endpoint,point); if (dotproduct(vec,normal)>0.0f) return(0); subtractvectors(vec,startpoint,point); if (dotproduct(vec,normal)<0.0f) return(0); subtractvectors(vec,point,startpoint); *scale=dotproduct(vec,normal); subtractvectors(vec2,endpoint,startpoint); *scale/=dotproduct(vec2,normal); scaleaddvectors(intersectpoint,startpoint,vec2,*scale); return(1); }
int lineintersecttriangle(float *intersectpoint,float *normal,float *scale,float *startpoint,float *endpoint,float *vertex1,float *vertex2,float *vertex3) { float vec[3],vec2[3],vec3[3]; subtractvectors(vec,endpoint,vertex1); if (dotproduct(vec,normal)>0.0f) return(0); subtractvectors(vec,startpoint,vertex1); if (dotproduct(vec,normal)<0.0f) return(0); subtractvectors(vec,vertex1,startpoint); *scale=dotproduct(vec,normal); subtractvectors(vec2,endpoint,startpoint); *scale/=dotproduct(vec2,normal); scaleaddvectors(intersectpoint,startpoint,vec2,*scale); subtractvectors(vec,vertex2,vertex1); subtractvectors(vec2,intersectpoint,vertex1); crossproduct(vec3,vec,vec2); if (dotproduct(vec3,normal)<0.0f) return(0); subtractvectors(vec,vertex3,vertex2); subtractvectors(vec2,intersectpoint,vertex2); crossproduct(vec3,vec,vec2); if (dotproduct(vec3,normal)<0.0f) return(0); subtractvectors(vec,vertex1,vertex3); subtractvectors(vec2,intersectpoint,vertex3); crossproduct(vec3,vec,vec2); if (dotproduct(vec3,normal)<0.0f) return(0); return(1); }
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); } }
int lineintersectline(float *intersectpoint,float *normal,float *scale,float *startpoint,float *endpoint,float *vertex1,float *vertex2) { float vec[3],vec2[3]; float dot1,dot2; normal[0]=vertex1[1]-vertex2[1]; normal[1]=vertex2[0]-vertex1[0]; normal[2]=0.0f; vec[0]=startpoint[0]-vertex1[0]; vec[1]=startpoint[1]-vertex1[1]; vec[2]=0.0f; vec2[0]=endpoint[0]-vertex1[0]; vec2[1]=endpoint[1]-vertex1[1]; vec2[2]=0.0f; dot1=dotproduct(normal,vec); dot2=dotproduct(normal,vec2); if (dot1>0.0f) if (dot2>0.0f) return(0); if (dot1<0.0f) if (dot2<0.0f) return(0); normalizevector(normal,normal); if (dot1<0.0f) { normal[0]=-normal[0]; normal[1]=-normal[1]; } vec[0]=vertex1[0]-startpoint[0]; vec[1]=vertex1[1]-startpoint[1]; vec[2]=0.0f; *scale=dotproduct(vec,normal); vec[0]=endpoint[0]-startpoint[0]; vec[1]=endpoint[1]-startpoint[1]; vec[2]=0.0f; *scale/=dotproduct(vec,normal); scaleaddvectors(intersectpoint,startpoint,vec,*scale); vec[0]=intersectpoint[0]-vertex1[0]; vec[1]=intersectpoint[1]-vertex1[1]; vec[2]=0.0f; vec2[0]=vertex2[0]-vertex1[0]; vec2[1]=vertex2[1]-vertex1[1]; vec2[2]=0.0f; if (dotproduct(vec,vec2)<0.0f) return(0); vec[0]=intersectpoint[0]-vertex2[0]; vec[1]=intersectpoint[1]-vertex2[1]; vec[2]=0.0f; vec2[0]=vertex1[0]-vertex2[0]; vec2[1]=vertex1[1]-vertex2[1]; vec2[2]=0.0f; if (dotproduct(vec,vec2)<0.0f) return(0); return(1); }
void setuprenderobjects(void) { int count,count2; float vec[3],vec2[3]; //float intersectpoint[3]; float normal[3]; float angle; float scale; float w; numofobjectrenders=0; for (count=0;count<numofobjects;count++) if (object[count].texturenum!=0) { if (object[count].type==8) { subtractvectors(vec,view.position,object[count].position); if (fabs(vec[0])-object[count].radius<view.zoom) if (fabs(vec[1])-object[count].radius<view.zoom) { objectrender[numofobjectrenders].type=8; objectrender[numofobjectrenders].depth=-1.0f; if (object[count].texturenum==58) objectrender[numofobjectrenders].texturenum=256+object[count].texturenum+1+(game.framenum/7)%5; else objectrender[numofobjectrenders].texturenum=256+object[count].texturenum; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=0; objectrender[numofobjectrenders].alpha=1.0f; scale=0.35f; objectrender[numofobjectrenders].numofverts=4; for (count2=0;count2<4;count2++) { if (count2==0 || count2==3) vec[0]=object[count].position[0]-scale; else vec[0]=object[count].position[0]+scale; if (count2<2) vec[1]=object[count].position[1]+scale*2.0f; else vec[1]=object[count].position[1]; vec[2]=0.0f; copyvector(objectrender[numofobjectrenders].vertex[count2],vec); if (count2==0 || count2==3) objectrender[numofobjectrenders].texcoord[count2][0]=0.0f; else objectrender[numofobjectrenders].texcoord[count2][0]=1.0f; if (count2<2) objectrender[numofobjectrenders].texcoord[count2][1]=0.0f; else objectrender[numofobjectrenders].texcoord[count2][1]=1.0f; } objectrender[numofobjectrenders].numoftris=2; objectrender[numofobjectrenders].tri[0][0]=0; objectrender[numofobjectrenders].tri[0][1]=1; objectrender[numofobjectrenders].tri[0][2]=2; objectrender[numofobjectrenders].tri[1][0]=0; objectrender[numofobjectrenders].tri[1][1]=2; objectrender[numofobjectrenders].tri[1][2]=3; numofobjectrenders++; objectrender[numofobjectrenders].type=8; objectrender[numofobjectrenders].depth=-1.0f; objectrender[numofobjectrenders].texturenum=256+object[count].texturenum; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=0; objectrender[numofobjectrenders].alpha=1.0f; objectrender[numofobjectrenders].numofverts=4; for (count2=0;count2<4;count2++) { if (count2==0 || count2==3) vec[0]=object[count].position[0]-scale; else vec[0]=object[count].position[0]+scale; if (count2<2) vec[1]=object[count].position[1]; else vec[1]=object[count].position[1]-scale*2.0f; vec[2]=0.0f; copyvector(objectrender[numofobjectrenders].vertex[count2],vec); if (count2==0 || count2==3) objectrender[numofobjectrenders].texcoord[count2][0]=0.0f; else objectrender[numofobjectrenders].texcoord[count2][0]=1.0f; if (count2<2) objectrender[numofobjectrenders].texcoord[count2][1]=0.0f; else objectrender[numofobjectrenders].texcoord[count2][1]=1.0f; } objectrender[numofobjectrenders].numoftris=2; objectrender[numofobjectrenders].tri[0][0]=0; objectrender[numofobjectrenders].tri[0][1]=1; objectrender[numofobjectrenders].tri[0][2]=2; objectrender[numofobjectrenders].tri[1][0]=0; objectrender[numofobjectrenders].tri[1][1]=2; objectrender[numofobjectrenders].tri[1][2]=3; numofobjectrenders++; } } } for (count=0;count<numofobjects;count++) if (object[count].texturenum!=0) { if (object[count].type==10) { subtractvectors(vec,view.position,object[count].position); if (fabs(vec[0])-object[count].radius<view.zoom) if (fabs(vec[1])-object[count].radius<view.zoom) { objectrender[numofobjectrenders].type=2; objectrender[numofobjectrenders].depth=2.0f; objectrender[numofobjectrenders].texturenum=object[count].texturenum+256; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count); objectrender[numofobjectrenders].alpha=1.0f; objectrender[numofobjectrenders].numofverts=4; for (count2=0;count2<4;count2++) { copyvector(objectrender[numofobjectrenders].vertex[count2],particle[object[count].particle[count2]].position); objectrender[numofobjectrenders].texcoord[count2][0]=object[count].texcoord[count2][0]; objectrender[numofobjectrenders].texcoord[count2][1]=object[count].texcoord[count2][1]; } objectrender[numofobjectrenders].numoftris=2; objectrender[numofobjectrenders].tri[0][0]=0; objectrender[numofobjectrenders].tri[0][1]=1; objectrender[numofobjectrenders].tri[0][2]=2; objectrender[numofobjectrenders].tri[1][0]=0; objectrender[numofobjectrenders].tri[1][1]=2; objectrender[numofobjectrenders].tri[1][2]=3; objectrender[numofobjectrenders].numofedges=4; for (count2=0;count2<4;count2++) { normal[0]=-(particle[object[count].particle[((count2+1)&3)]].position[1]-particle[object[count].particle[count2]].position[1]); normal[1]=(particle[object[count].particle[((count2+1)&3)]].position[0]-particle[object[count].particle[count2]].position[0]); normal[2]=0.0f; normalizevector(normal,normal); if (object[count].rotate==3) negvector(normal,normal); copyvector(objectrender[numofobjectrenders].edgenormal[count2],normal); copyvector(objectrender[numofobjectrenders].edgevertex[count2][0],particle[object[count].particle[count2]].position); copyvector(objectrender[numofobjectrenders].edgevertex[count2][1],particle[object[count].particle[((count2+1)&3)]].position); copyvector(vec,particle[object[count].particle[((count2+1)&3)]].position); vec[0]-=normal[0]*0.125f; vec[1]-=normal[1]*0.125f; copyvector(objectrender[numofobjectrenders].edgevertex[count2][2],vec); copyvector(vec,particle[object[count].particle[count2]].position); vec[0]-=normal[0]*0.125f; vec[1]-=normal[1]*0.125f; copyvector(objectrender[numofobjectrenders].edgevertex[count2][3],vec); if (count2==0) { normal[0]=0.0f; normal[1]=0.125f; } if (count2==1) { normal[0]=-0.125f; normal[1]=0.0f; } if (count2==2) { normal[0]=0.0f; normal[1]=-0.125f; } if (count2==3) { normal[0]=0.125f; normal[1]=0.0f; } objectrender[numofobjectrenders].edgetexcoord[count2][0][0]=object[count].texcoord[count2][0]; objectrender[numofobjectrenders].edgetexcoord[count2][0][1]=object[count].texcoord[count2][1]; objectrender[numofobjectrenders].edgetexcoord[count2][1][0]=object[count].texcoord[((count2+1)&3)][0]; objectrender[numofobjectrenders].edgetexcoord[count2][1][1]=object[count].texcoord[((count2+1)&3)][1]; objectrender[numofobjectrenders].edgetexcoord[count2][2][0]=object[count].texcoord[((count2+1)&3)][0]+normal[0]; objectrender[numofobjectrenders].edgetexcoord[count2][2][1]=object[count].texcoord[((count2+1)&3)][1]+normal[1]; objectrender[numofobjectrenders].edgetexcoord[count2][3][0]=object[count].texcoord[count2][0]+normal[0]; objectrender[numofobjectrenders].edgetexcoord[count2][3][1]=object[count].texcoord[count2][1]+normal[1]; } numofobjectrenders++; } } } for (count=0;count<numofobjects;count++) if (object[count].texturenum!=0) { /* gish */ if (object[count].type==OBJ_TYPE_GISH) { subtractvectors(vec,view.position,object[count].position); if (fabs(vec[0])-object[count].radius<view.zoom) if (fabs(vec[1])-object[count].radius<view.zoom) { objectrender[numofobjectrenders].type=1; objectrender[numofobjectrenders].depth=0.0f; objectrender[numofobjectrenders].angle=object[count].angle; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count); objectrender[numofobjectrenders].alpha=1.0f; if (count==0) objectrender[numofobjectrenders].texturenum=370+object[count].frame; else if (count==1) objectrender[numofobjectrenders].texturenum=390+object[count].frame; else if (count==2) objectrender[numofobjectrenders].texturenum=410+object[count].frame; else objectrender[numofobjectrenders].texturenum=430+object[count].frame; objectrender[numofobjectrenders].numofverts=33; for (count2=0;count2<16;count2++) { if (!object[count].particlestick[count2]) copyvector(objectrender[numofobjectrenders].vertex[count2*2+0],particle[object[count].particle[count2]].position); else copyvector(objectrender[numofobjectrenders].vertex[count2*2+0],object[count].particlestickposition[count2]); } for (count2=0;count2<16;count2++) { addvectors(vec,objectrender[numofobjectrenders].vertex[count2*2+0],objectrender[numofobjectrenders].vertex[((count2+1)&15)*2+0]); addvectors(vec2,objectrender[numofobjectrenders].vertex[((count2-1)&15)*2+0],objectrender[numofobjectrenders].vertex[((count2+2)&15)*2+0]); w=1.0f/16.0f; scalevector(vec,vec,0.5f+w); scalevector(vec2,vec2,w); subtractvectors(vec,vec,vec2); copyvector(objectrender[numofobjectrenders].vertex[count2*2+1],vec); } /* for (count2=0;count2<16;count2++) { if (!object[count].particlestick[count2]) copyvector(objectrender[numofobjectrenders].vertex[count2*2+0],particle[object[count].particle[count2]].position); else copyvector(objectrender[numofobjectrenders].vertex[count2*2+0],object[count].particlestickposition[count2]); w=1.0f/16.0f; //addvectors(vec,particle[object[count].particle[((count2+0)&15)]].position,particle[object[count].particle[((count2+1)&15)]].position); //addvectors(vec2,particle[object[count].particle[((count2-1)&15)]].position,particle[object[count].particle[((count2+2)&15)]].position); if (!object[count].particlestick[((count2+0)&15)]) copyvector(vec,particle[object[count].particle[((count2+0)&15)]].position); else copyvector(vec,object[count].particlestickposition[((count2+0)&15)]); if (!object[count].particlestick[((count2+1)&15)]) addvectors(vec,vec,particle[object[count].particle[((count2+1)&15)]].position); else addvectors(vec,vec,object[count].particlestickposition[((count2+1)&15)]); if (!object[count].particlestick[((count2-1)&15)]) copyvector(vec2,particle[object[count].particle[((count2-1)&15)]].position); else copyvector(vec2,object[count].particlestickposition[((count2-1)&15)]); if (!object[count].particlestick[((count2+2)&15)]) addvectors(vec2,vec2,particle[object[count].particle[((count2+2)&15)]].position); else addvectors(vec2,vec2,object[count].particlestickposition[((count2+2)&15)]); scalevector(vec,vec,0.5f+w); scalevector(vec2,vec2,w); subtractvectors(vec,vec,vec2); copyvector(objectrender[numofobjectrenders].vertex[count2*2+1],vec); } */ for (count2=0;count2<32;count2++) { vec[0]=objectrender[numofobjectrenders].vertex[((count2-1)&31)][1]-objectrender[numofobjectrenders].vertex[((count2+0)&31)][1]; vec[1]=objectrender[numofobjectrenders].vertex[((count2+0)&31)][0]-objectrender[numofobjectrenders].vertex[((count2-1)&31)][0]; vec[2]=0.0f; vec2[0]=objectrender[numofobjectrenders].vertex[((count2+0)&31)][1]-objectrender[numofobjectrenders].vertex[((count2+1)&31)][1]; vec2[1]=objectrender[numofobjectrenders].vertex[((count2+1)&31)][0]-objectrender[numofobjectrenders].vertex[((count2+0)&31)][0]; vec2[2]=0.0f; addvectors(vec,vec,vec2); normalizevector(vec,vec); objectrender[numofobjectrenders].texcoord[count2][0]=0.5f+vec[0]*0.5f; objectrender[numofobjectrenders].texcoord[count2][1]=0.5f+vec[1]*0.5f; } count2=32; copyvector(objectrender[numofobjectrenders].vertex[count2],object[count].position); objectrender[numofobjectrenders].texcoord[count2][0]=0.5f; objectrender[numofobjectrenders].texcoord[count2][1]=0.5f; numofobjectrenders++; } } } for (count=0;count<numofobjects;count++) if (object[count].texturenum!=0) { if (object[count].type==2 || object[count].type==20) { subtractvectors(vec,view.position,object[count].position); if (fabs(vec[0])-object[count].radius<view.zoom) if (fabs(vec[1])-object[count].radius<view.zoom) { objectrender[numofobjectrenders].type=2; objectrender[numofobjectrenders].depth=2.0f; objectrender[numofobjectrenders].texturenum=object[count].texturenum+256; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count); objectrender[numofobjectrenders].alpha=1.0f; if (object[count].timetolive<50) objectrender[numofobjectrenders].alpha=(float)object[count].timetolive/50.0f; objectrender[numofobjectrenders].numofverts=4; for (count2=0;count2<4;count2++) { copyvector(objectrender[numofobjectrenders].vertex[count2],particle[object[count].particle[count2]].position); objectrender[numofobjectrenders].texcoord[count2][0]=object[count].texcoord[count2][0]; objectrender[numofobjectrenders].texcoord[count2][1]=object[count].texcoord[count2][1]; } objectrender[numofobjectrenders].numoftris=2; objectrender[numofobjectrenders].tri[0][0]=0; objectrender[numofobjectrenders].tri[0][1]=1; objectrender[numofobjectrenders].tri[0][2]=2; objectrender[numofobjectrenders].tri[1][0]=0; objectrender[numofobjectrenders].tri[1][1]=2; objectrender[numofobjectrenders].tri[1][2]=3; objectrender[numofobjectrenders].numofedges=4; for (count2=0;count2<4;count2++) { normal[0]=-(particle[object[count].particle[((count2+1)&3)]].position[1]-particle[object[count].particle[count2]].position[1]); normal[1]=(particle[object[count].particle[((count2+1)&3)]].position[0]-particle[object[count].particle[count2]].position[0]); normal[2]=0.0f; normalizevector(normal,normal); copyvector(objectrender[numofobjectrenders].edgenormal[count2],normal); copyvector(objectrender[numofobjectrenders].edgevertex[count2][0],particle[object[count].particle[count2]].position); copyvector(objectrender[numofobjectrenders].edgevertex[count2][1],particle[object[count].particle[((count2+1)&3)]].position); copyvector(vec,particle[object[count].particle[((count2+1)&3)]].position); vec[0]-=normal[0]*0.125f; vec[1]-=normal[1]*0.125f; copyvector(objectrender[numofobjectrenders].edgevertex[count2][2],vec); copyvector(vec,particle[object[count].particle[count2]].position); vec[0]-=normal[0]*0.125f; vec[1]-=normal[1]*0.125f; copyvector(objectrender[numofobjectrenders].edgevertex[count2][3],vec); if (count2==0) { normal[0]=0.0f; normal[1]=0.125f; } if (count2==1) { normal[0]=-0.125f; normal[1]=0.0f; } if (count2==2) { normal[0]=0.0f; normal[1]=-0.125f; } if (count2==3) { normal[0]=0.125f; normal[1]=0.0f; } objectrender[numofobjectrenders].edgetexcoord[count2][0][0]=object[count].texcoord[count2][0]; objectrender[numofobjectrenders].edgetexcoord[count2][0][1]=object[count].texcoord[count2][1]; objectrender[numofobjectrenders].edgetexcoord[count2][1][0]=object[count].texcoord[((count2+1)&3)][0]; objectrender[numofobjectrenders].edgetexcoord[count2][1][1]=object[count].texcoord[((count2+1)&3)][1]; objectrender[numofobjectrenders].edgetexcoord[count2][2][0]=object[count].texcoord[((count2+1)&3)][0]+normal[0]; objectrender[numofobjectrenders].edgetexcoord[count2][2][1]=object[count].texcoord[((count2+1)&3)][1]+normal[1]; objectrender[numofobjectrenders].edgetexcoord[count2][3][0]=object[count].texcoord[count2][0]+normal[0]; objectrender[numofobjectrenders].edgetexcoord[count2][3][1]=object[count].texcoord[count2][1]+normal[1]; } numofobjectrenders++; } } } for (count=0;count<numofobjects;count++) if (object[count].texturenum!=0) { if (object[count].type==3) { subtractvectors(vec,view.position,object[count].position); if (fabs(vec[0])-object[count].radius<view.zoom) if (fabs(vec[1])-object[count].radius<view.zoom) { objectrender[numofobjectrenders].type=3; objectrender[numofobjectrenders].depth=1.0f; objectrender[numofobjectrenders].texturenum=object[count].texturenum+256; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count); objectrender[numofobjectrenders].alpha=1.0f; if (object[count].timetolive<50) objectrender[numofobjectrenders].alpha=(float)object[count].timetolive/50.0f; objectrender[numofobjectrenders].numofverts=17; for (count2=0;count2<16;count2++) { copyvector(objectrender[numofobjectrenders].vertex[count2],particle[object[count].particle[count2]].position); angle=(float)count2*pi/8.0f; objectrender[numofobjectrenders].texcoord[count2][0]=0.5f+cos(angle)*0.5f; objectrender[numofobjectrenders].texcoord[count2][1]=0.5f+sin(angle)*0.5f; } count2=16; copyvector(objectrender[numofobjectrenders].vertex[count2],object[count].position); objectrender[numofobjectrenders].texcoord[count2][0]=0.5f; objectrender[numofobjectrenders].texcoord[count2][1]=0.5f; objectrender[numofobjectrenders].numoftris=16; for (count2=0;count2<16;count2++) { objectrender[numofobjectrenders].tri[count2][0]=count2; objectrender[numofobjectrenders].tri[count2][1]=((count2+1)&15); objectrender[numofobjectrenders].tri[count2][2]=16; } numofobjectrenders++; } } } for (count=0;count<numofobjects;count++) if (object[count].texturenum!=0) { if (object[count].type==4) { subtractvectors(vec,view.position,object[count].position); if (fabs(vec[0])-object[count].radius<view.zoom) if (fabs(vec[1])-object[count].radius<view.zoom) { objectrender[numofobjectrenders].type=4; objectrender[numofobjectrenders].depth=1.0f; objectrender[numofobjectrenders].texturenum=object[count].texturenum; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count); objectrender[numofobjectrenders].alpha=1.0f; objectrender[numofobjectrenders].numofverts=4; for (count2=0;count2<4;count2++) { subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position); if (object[count].beasttype==12) { if (count2==0) { subtractvectors(vec,particle[object[count].particle[0]].position,particle[object[count].particle[3]].position); addvectors(vec,particle[object[count].particle[0]].position,vec); subtractvectors(vec,vec,object[count].position); } if (count2==1) { subtractvectors(vec,particle[object[count].particle[1]].position,particle[object[count].particle[2]].position); addvectors(vec,particle[object[count].particle[1]].position,vec); subtractvectors(vec,vec,object[count].position); } } scaleaddvectors(objectrender[numofobjectrenders].vertex[count2],object[count].position,vec,2.0f); if ((object[count].direction==0 && (count2==0 || count2==3)) || (object[count].direction==1 && (count2==1 || count2==2))) objectrender[numofobjectrenders].texcoord[count2][0]=0.0f; else objectrender[numofobjectrenders].texcoord[count2][0]=1.0f; if (count2<2) objectrender[numofobjectrenders].texcoord[count2][1]=0.0f; else objectrender[numofobjectrenders].texcoord[count2][1]=1.0f; } objectrender[numofobjectrenders].numoftris=2; objectrender[numofobjectrenders].tri[0][0]=0; objectrender[numofobjectrenders].tri[0][1]=1; objectrender[numofobjectrenders].tri[0][2]=2; objectrender[numofobjectrenders].tri[1][0]=0; objectrender[numofobjectrenders].tri[1][1]=2; objectrender[numofobjectrenders].tri[1][2]=3; numofobjectrenders++; } } } for (count=0;count<numofbosses;count++) if (boss[count].texturenum!=0) { subtractvectors(vec,view.position,boss[count].position); if (fabs(vec[0])-4.0f<view.zoom) if (fabs(vec[1])-4.0f<view.zoom) { objectrender[numofobjectrenders].type=4; objectrender[numofobjectrenders].depth=1.0f; objectrender[numofobjectrenders].texturenum=boss[count].texturenum; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=255; objectrender[numofobjectrenders].alpha=1.0f; objectrender[numofobjectrenders].numofverts=4; for (count2=0;count2<4;count2++) { copyvector(vec,boss[count].position); //subtractvectors(vec2,object[0].position,boss[count].position); copyvector(vec2,boss[count].velocity); normalizevector(vec2,vec2); if (boss[count].direction==1) negvector(vec2,vec2); normal[0]=-vec2[1]; normal[1]=vec2[0]; normal[2]=0.0f; if (count2==0 || count2==3) scaleaddvectors(vec,vec,vec2,-boss[count].size[0]); else scaleaddvectors(vec,vec,vec2,boss[count].size[0]); if (count2<2) scaleaddvectors(vec,vec,normal,boss[count].size[1]); else scaleaddvectors(vec,vec,normal,-boss[count].size[1]); copyvector(objectrender[numofobjectrenders].vertex[count2],vec); if ((boss[count].direction==0 && (count2==0 || count2==3)) || (boss[count].direction==1 && (count2==1 || count2==2))) objectrender[numofobjectrenders].texcoord[count2][0]=0.0f; else objectrender[numofobjectrenders].texcoord[count2][0]=1.0f; if (count2<2) objectrender[numofobjectrenders].texcoord[count2][1]=0.0f; else objectrender[numofobjectrenders].texcoord[count2][1]=1.0f; } objectrender[numofobjectrenders].numoftris=2; objectrender[numofobjectrenders].tri[0][0]=0; objectrender[numofobjectrenders].tri[0][1]=1; objectrender[numofobjectrenders].tri[0][2]=2; objectrender[numofobjectrenders].tri[1][0]=0; objectrender[numofobjectrenders].tri[1][1]=2; objectrender[numofobjectrenders].tri[1][2]=3; numofobjectrenders++; } } for (count=0;count<numofobjects;count++) if (object[count].texturenum!=0) { if (object[count].type==5 || object[count].type==6) { subtractvectors(vec,view.position,object[count].position); if (fabs(vec[0])-object[count].radius<view.zoom) if (fabs(vec[1])-object[count].radius<view.zoom) { objectrender[numofobjectrenders].type=5; objectrender[numofobjectrenders].depth=1.1f; objectrender[numofobjectrenders].texturenum=object[count].texturenum; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count); objectrender[numofobjectrenders].alpha=1.0f; if (object[count].timetolive<50) objectrender[numofobjectrenders].alpha=(float)object[count].timetolive/50.0f; objectrender[numofobjectrenders].numofverts=9; for (count2=0;count2<8;count2++) { if ((count2&1)==0) scale=1.0f; else scale=1.41f; subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position); scaleaddvectors(objectrender[numofobjectrenders].vertex[count2],object[count].position,vec,scale); angle=(float)count2*pi/4.0f; if (object[count].direction==0) objectrender[numofobjectrenders].texcoord[count2][0]=0.5f+cos(angle)*0.5f*scale; else objectrender[numofobjectrenders].texcoord[count2][0]=0.5f-cos(angle)*0.5f*scale; objectrender[numofobjectrenders].texcoord[count2][1]=0.5f+sin(angle)*0.5f*scale; } count2=8; copyvector(objectrender[numofobjectrenders].vertex[count2],object[count].position); objectrender[numofobjectrenders].texcoord[count2][0]=0.5f; objectrender[numofobjectrenders].texcoord[count2][1]=0.5f; objectrender[numofobjectrenders].numoftris=8; for (count2=0;count2<8;count2++) { objectrender[numofobjectrenders].tri[count2][0]=count2; objectrender[numofobjectrenders].tri[count2][1]=((count2+1)&7); objectrender[numofobjectrenders].tri[count2][2]=8; } numofobjectrenders++; } } } for (count=0;count<numofobjects;count++) if (object[count].texturenum!=0) { if (object[count].type==9) { subtractvectors(vec,view.position,object[count].position); if (fabs(vec[0])-object[count].radius<view.zoom) if (fabs(vec[1])-object[count].radius<view.zoom) { objectrender[numofobjectrenders].type=9; objectrender[numofobjectrenders].depth=2.0f; objectrender[numofobjectrenders].texturenum=object[count].texturenum+256; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count); objectrender[numofobjectrenders].alpha=1.0f; objectrender[numofobjectrenders].numofverts=6; for (count2=0;count2<6;count2++) copyvector(objectrender[numofobjectrenders].vertex[count2],particle[object[count].particle[count2]].position); objectrender[numofobjectrenders].texcoord[0][0]=0.0f; objectrender[numofobjectrenders].texcoord[0][1]=1.0f; objectrender[numofobjectrenders].texcoord[1][0]=0.0f; objectrender[numofobjectrenders].texcoord[1][1]=0.0f; objectrender[numofobjectrenders].texcoord[2][0]=1.0f; objectrender[numofobjectrenders].texcoord[2][1]=0.0f; objectrender[numofobjectrenders].texcoord[3][0]=1.0f; objectrender[numofobjectrenders].texcoord[3][1]=1.0f; objectrender[numofobjectrenders].texcoord[4][0]=1.0f; objectrender[numofobjectrenders].texcoord[4][1]=0.0f; objectrender[numofobjectrenders].texcoord[5][0]=0.0f; objectrender[numofobjectrenders].texcoord[5][1]=0.0f; objectrender[numofobjectrenders].numoftris=4; objectrender[numofobjectrenders].tri[0][0]=0; objectrender[numofobjectrenders].tri[0][1]=1; objectrender[numofobjectrenders].tri[0][2]=2; objectrender[numofobjectrenders].tri[1][0]=0; objectrender[numofobjectrenders].tri[1][1]=2; objectrender[numofobjectrenders].tri[1][2]=3; objectrender[numofobjectrenders].tri[2][0]=0; objectrender[numofobjectrenders].tri[2][1]=3; objectrender[numofobjectrenders].tri[2][2]=4; objectrender[numofobjectrenders].tri[3][0]=0; objectrender[numofobjectrenders].tri[3][1]=4; objectrender[numofobjectrenders].tri[3][2]=5; numofobjectrenders++; } } } for (count=0;count<numofropes;count++) if (rope[count].texturenum!=0) { scale=1.0f; if (rope[count].type>=5 && rope[count].type<10) scale=bond[rope[count].bondnum].length+1.0f; subtractvectors(vec,view.position,particle[rope[count].part1].position); if (fabs(vec[0])-scale<view.zoom) if (fabs(vec[1])-scale<view.zoom) { objectrender[numofobjectrenders].type=32; objectrender[numofobjectrenders].depth=3.0f+(float)count/1000.0f; objectrender[numofobjectrenders].objectnum=count; objectrender[numofobjectrenders].texturenum=rope[count].texturenum; objectrender[numofobjectrenders].lightflags=setuprenderropelight(count,scale); objectrender[numofobjectrenders].alpha=1.0f; normal[0]=particle[rope[count].part1].position[1]-particle[rope[count].part2].position[1]; normal[1]=particle[rope[count].part2].position[0]-particle[rope[count].part1].position[0]; normal[2]=0.0f; normalizevector(normal,normal); if (rope[count].type==1 || rope[count].type==3) scalevector(normal,normal,0.35f); if (rope[count].type==2 || rope[count].type==4) scalevector(normal,normal,0.5f); if (rope[count].type>=5 && rope[count].type<=10) scalevector(normal,normal,0.5f); objectrender[numofobjectrenders].numofverts=4; count2=0; subtractvectors(objectrender[numofobjectrenders].vertex[count2],particle[rope[count].part1].position,normal); objectrender[numofobjectrenders].texcoord[count2][0]=0.0f; objectrender[numofobjectrenders].texcoord[count2][1]=0.0f; count2=1; addvectors(objectrender[numofobjectrenders].vertex[count2],particle[rope[count].part1].position,normal); objectrender[numofobjectrenders].texcoord[count2][0]=1.0f; objectrender[numofobjectrenders].texcoord[count2][1]=0.0f; count2=2; addvectors(objectrender[numofobjectrenders].vertex[count2],particle[rope[count].part2].position,normal); objectrender[numofobjectrenders].texcoord[count2][0]=1.0f; objectrender[numofobjectrenders].texcoord[count2][1]=1.0f; count2=3; subtractvectors(objectrender[numofobjectrenders].vertex[count2],particle[rope[count].part2].position,normal); objectrender[numofobjectrenders].texcoord[count2][0]=0.0f; objectrender[numofobjectrenders].texcoord[count2][1]=1.0f; objectrender[numofobjectrenders].numoftris=2; objectrender[numofobjectrenders].tri[0][0]=0; objectrender[numofobjectrenders].tri[0][1]=1; objectrender[numofobjectrenders].tri[0][2]=2; objectrender[numofobjectrenders].tri[1][0]=0; objectrender[numofobjectrenders].tri[1][1]=2; objectrender[numofobjectrenders].tri[1][2]=3; numofobjectrenders++; } } }
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 objectai(int objectnum) { float vec[3]; float intersectpoint[3]; float normal[3]; float scale; object[objectnum].axis[0]=0.0f; object[objectnum].axis[1]=0.0f; object[objectnum].button=0; if (object[objectnum].type==1) if (game.levelnum==34) { /* object[objectnum].axis[0]=-object[0].axis[0]; object[objectnum].axis[1]=object[0].axis[0]; object[objectnum].button=object[0].button; */ subtractvectors(vec,object[0].position,object[objectnum].position); if (vec[0]<-0.5f) object[objectnum].axis[0]=-1.0f; if (vec[0]>0.5f) object[objectnum].axis[0]=1.0f; if (vectorlength(vec)<2.0f) object[objectnum].button|=8; /* subtractvectors(vec,object[2].position,object[objectnum].position); if (vectorlength(vec)>3.0f) object[objectnum].button=1; */ } if (object[objectnum].type==4) { if (object[0].idata[0]==0) if (fabs(object[0].position[0]-object[objectnum].position[0])<12.0f) if (fabs(object[0].position[1]-object[objectnum].position[1])<8.0f) { if (object[objectnum].beasttype!=7 && object[objectnum].beasttype!=13) { subtractvectors(vec,object[0].position,object[objectnum].position); if ((vec[0]>-2.5f && vec[0]<0.0f && object[objectnum].direction==0) || (vec[0]<2.5f && vec[0]>0.0f && object[objectnum].direction==1)) if (fabs(vec[1])<1.0f) object[objectnum].button|=1; //if (object[objectnum].beasttype==12) //if ((game.framenum&511)==0) // object[objectnum].button|=2; if ((rnd()&7)!=7) { if (object[0].position[0]<object[objectnum].position[0]) object[objectnum].axis[0]-=1.0f; else object[objectnum].axis[0]+=1.0f; if (object[objectnum].beasttype!=12) if ((rnd()&255)==0) object[objectnum].button|=2; if (object[objectnum].beasttype==12) if ((rnd()&255)==0 && (rnd()&1)==0) object[objectnum].button|=2; } } else { subtractvectors(vec,object[0].position,object[objectnum].position); if (vec[0]>-8.0f && vec[0]<8.0f) if (fabs(vec[1])<6.0f) if ((game.framenum&127)==0) object[objectnum].button|=1; /* if (object[0].position[0]<object[objectnum].position[0]-5.0f) object[objectnum].axis[0]-=1.0f; if (object[0].position[0]>object[objectnum].position[0]+5.0f) object[objectnum].axis[0]+=1.0f; */ //if (object[0].position[0]<object[objectnum].position[0]) if (object[0].position[0]<object[objectnum].position[0]-5.0f) { scaleaddvectors(vec,object[objectnum].position,object[objectnum].orientation[0],-3.0f); scaleaddvectors(vec,vec,object[objectnum].orientation[1],-2.0); if (lineintersectlevel(intersectpoint,normal,&scale,object[objectnum].position,vec)) object[objectnum].axis[0]-=1.0f; else { if (object[objectnum].velocity[0]<-0.01f) object[objectnum].axis[0]+=1.0f; } } if (object[0].position[0]>object[objectnum].position[0]+5.0f) { scaleaddvectors(vec,object[objectnum].position,object[objectnum].orientation[0],3.0f); scaleaddvectors(vec,vec,object[objectnum].orientation[1],-2.0f); if (lineintersectlevel(intersectpoint,normal,&scale,object[objectnum].position,vec)) object[objectnum].axis[0]+=1.0f; else { if (object[objectnum].velocity[0]>0.01f) object[objectnum].axis[0]-=1.0f; } } } } } if (object[objectnum].axis[0]<-1.0f) object[objectnum].axis[0]=-1.0f; if (object[objectnum].axis[0]>1.0f) object[objectnum].axis[0]=1.0f; if (object[objectnum].axis[1]<-1.0f) object[objectnum].axis[1]=-1.0f; if (object[objectnum].axis[1]>1.0f) object[objectnum].axis[1]=1.0f; }
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); } } } } }