- //Collisions
- static float collisionradius;
- if(numplayers>1)
- for(k=0;k<numplayers;k++){
- for(i=k;i<numplayers;i++){
- if(i==k)i++;
- if(i<numplayers)
- if((animation[player[i].targetanimation].attack!=reversed&&animation[player[i].targetanimation].attack!=reversal&&animation[player[k].targetanimation].attack!=reversed&&animation[player[k].targetanimation].attack!=reversal)||(i!=0&&k!=0))
- if((animation[player[i].currentanimation].attack!=reversed&&animation[player[i].currentanimation].attack!=reversal&&animation[player[k].currentanimation].attack!=reversed&&animation[player[k].currentanimation].attack!=reversal)||(i!=0&&k!=0))
- if(player[i].howactive<=typesleeping&&player[k].howactive<=typesleeping)
- if(player[i].howactive!=typesittingwall&&player[k].howactive!=typesittingwall)
- if(i!=k&&player[i].whichpatchx==player[k].whichpatchx&&player[i].whichpatchz==player[k].whichpatchz&&player[k].skeleton.oldfree==player[k].skeleton.free&&player[i].skeleton.oldfree==player[i].skeleton.free&&player[i].targetanimation!=climbanim&&player[i].targetanimation!=hanganim&&player[k].targetanimation!=climbanim&&player[k].targetanimation!=hanganim)
- if(player[i].coords.y>player[k].coords.y-3)
- if(player[i].coords.y<player[k].coords.y+3)
- if(player[i].coords.x>player[k].coords.x-3)
- if(player[i].coords.x<player[k].coords.x+3)
- if(player[i].coords.z>player[k].coords.z-3)
- if(player[i].coords.z<player[k].coords.z+3){
- if(findDistancefast(&player[i].coords,&player[k].coords)<3*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5)){
- if(player[i].onfire||player[k].onfire){
- if(!player[i].onfire)player[i].CatchFire();
- if(!player[k].onfire)player[k].CatchFire();
- }
- }
-
- tempcoords1=player[i].coords;
- tempcoords2=player[k].coords;
- if(!player[i].skeleton.oldfree)tempcoords1.y+=player[i].skeleton.joints[player[i].skeleton.jointlabels[abdomen]].position.y*player[i].scale;
- if(!player[k].skeleton.oldfree)tempcoords2.y+=player[k].skeleton.joints[player[k].skeleton.jointlabels[abdomen]].position.y*player[k].scale;
- collisionradius=1.2*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5);
- if(player[0].hasvictim)
- if(player[0].targetanimation==rabbitkickanim&&(k==0||i==0)&&!player[0].victim->skeleton.free)collisionradius=3;
- if((!player[i].skeleton.oldfree||!player[k].skeleton.oldfree)&&(findDistancefast(&tempcoords1,&tempcoords2)<collisionradius||findDistancefast(&player[i].coords,&player[k].coords)<collisionradius)){
- if(k==0)
- if(player[k].targetanimation==jumpdownanim&&!player[k].skeleton.oldfree&&!player[k].skeleton.free&&player[i].skeleton.oldfree&&player[i].skeleton.free&&player[i].dead&&player[k].lastcollide<=0&&abs(player[i].coords.y-player[k].coords.y)<.2&&findDistancefast(&player[k].coords,&player[i].coords)<.7*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5)){
- player[k].coords.y=player[i].coords.y;
- player[i].velocity=player[k].velocity;
- player[i].skeleton.free=0;
- player[i].rotation=0;
- player[i].RagDoll(0);
- player[i].DoDamage(20);
- if(k==0)camerashake+=.3;
- player[i].skeleton.longdead=0;
- player[k].lastcollide=1;
- }
- if(i==0)
- if(player[i].targetanimation==jumpdownanim&&!player[i].skeleton.oldfree&&!player[i].skeleton.free&&player[k].skeleton.oldfree&&player[k].skeleton.free&&player[k].dead&&player[i].lastcollide<=0&&abs(player[i].coords.y-player[k].coords.y)<.2&&findDistancefast(&player[k].coords,&player[i].coords)<.7*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5)){
- player[i].coords.y=player[k].coords.y;
- player[k].velocity=player[i].velocity;
- player[k].skeleton.free=0;
- player[k].rotation=0;
- player[k].RagDoll(0);
- player[k].DoDamage(20);
- if(i==0)camerashake+=.3;
- player[k].skeleton.longdead=0;
- player[i].lastcollide=1;
- }
-
- if((player[i].skeleton.oldfree==1&&findLengthfast(&player[i].velocity)>1)||(player[k].skeleton.oldfree==1&&findLengthfast(&player[k].velocity)>1)||(player[i].skeleton.oldfree==0&&player[k].skeleton.oldfree==0)){
- rotatetarget=player[k].velocity-player[i].velocity;
- if(((player[i].targetanimation!=getupfrombackanim&&player[i].targetanimation!=getupfromfrontanim)||player[i].skeleton.free)&&((player[k].targetanimation!=getupfrombackanim&&player[k].targetanimation!=getupfromfrontanim)||player[k].skeleton.free))
- if(((((findLengthfast(&rotatetarget)>150&&(i!=0&&k!=0))||(findLengthfast(&rotatetarget)>50&&player[0].rabbitkickragdoll/*currentanimation==rabbitkickanim*/&&(i==0||k==0)))&&normaldotproduct(rotatetarget,player[k].coords-player[i].coords)>0)&&((i==0||k==0)||((player[i].skeleton.oldfree==1&&k!=0&&animation[player[k].currentanimation].attack==neutral)||(player[k].skeleton.oldfree==1&&i!=0&&animation[player[i].currentanimation].attack==neutral)||(player[i].isFlip()&&!player[i].skeleton.oldfree&&(i==0||k==0))||(player[k].isFlip()&&!player[k].skeleton.oldfree&&(i==0||k==0))||(i==0||k==0))))||((player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip())&&(player[k].targetanimation==jumpupanim||player[k].targetanimation==jumpdownanim||player[k].isFlip())&&(i==0||k==0)&&(!player[i].skeleton.oldfree&&!player[k].skeleton.oldfree))){
- //If hit by body
- if((i!=0||player[i].skeleton.free)&&(k!=0||player[k].skeleton.free)||(animation[player[i].targetanimation].height==highheight&&animation[player[k].targetanimation].height==highheight)){
- static float gLoc[3];
- static float vel[3];
- gLoc[0]=player[i].coords.x;
- gLoc[1]=player[i].coords.y;
- gLoc[2]=player[i].coords.z;
- vel[0]=player[i].velocity.x;
- vel[1]=player[i].velocity.y;
- vel[2]=player[i].velocity.z;
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 256);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- //player[i].velocity=player[k].velocity;
- //player[k].velocity=player[i].velocity;
-
- player[i].RagDoll(0);
- if(player[i].damage>player[i].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[i].dead){
- bonus=aimbonus;
- bonustime=0;
- bonusvalue=150;
- }
- player[i].DoDamage(findLengthfast(&rotatetarget)/4);
- player[k].RagDoll(0);
- if(player[k].damage>player[k].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[k].dead){
- bonus=aimbonus;
- bonustime=0;
- bonusvalue=150;
- }
- player[k].DoDamage(findLengthfast(&rotatetarget)/4);
-
- //if(player[i].skeleton.oldfree){
- for(j=0;j<player[i].skeleton.num_joints;j++){
- player[i].skeleton.joints[j].velocity=player[i].skeleton.joints[j].velocity/5+player[k].velocity;
- }
- //}
- //if(player[k].skeleton.oldfree){
- for(j=0;j<player[k].skeleton.num_joints;j++){
- player[k].skeleton.joints[j].velocity=player[k].skeleton.joints[j].velocity/5+player[i].velocity;
- }
- //}
-
- }
- }
- if((animation[player[i].targetanimation].attack==neutral||animation[player[i].targetanimation].attack==normalattack)&&(animation[player[k].targetanimation].attack==neutral||animation[player[k].targetanimation].attack==normalattack)){
- //If bumped
- if(player[i].skeleton.oldfree==0&&player[k].skeleton.oldfree==0){
- if(findDistancefast(&player[k].coords,&player[i].coords)<.5*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5)){
- rotatetarget=player[k].coords-player[i].coords;
- Normalise(&rotatetarget);
- player[k].coords=(player[k].coords+player[i].coords)/2;
- player[i].coords=player[k].coords-rotatetarget*fast_sqrt(.6)/2*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5);
- player[k].coords+=rotatetarget*fast_sqrt(.6)/2*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5);
- if(player[k].howactive==typeactive||hostile)
- if(player[k].isIdle()){
- if(player[k].howactive<typesleeping){
- player[k].targetanimation=player[k].getStop();
- player[k].targetframe=0;
- player[k].target=0;
- }
- else if(player[k].howactive==typesleeping)
- {
- player[k].targetanimation=getupfromfrontanim;
- player[k].targetframe=0;
- player[k].target=0;
- }
- if(!editorenabled)player[k].howactive=typeactive;
- }
- if(player[i].howactive==typeactive||hostile)
- if(player[i].isIdle()){
- if(player[i].howactive<typesleeping){
- player[i].targetanimation=player[i].getStop();
- player[i].targetframe=0;
- player[i].target=0;
- }
- else
- {
- player[i].targetanimation=getupfromfrontanim;
- player[i].targetframe=0;
- player[i].target=0;
- }
- if(!editorenabled)player[i].howactive=typeactive;
- }
- }
- if(hostile){
- if(k==0&&i!=0&&player[k].targetanimation==jumpdownanim&&!player[i].isCrouch()&&player[i].targetanimation!=rollanim&&!player[k].skeleton.oldfree&&!player[k].skeleton.free&&player[k].lastcollide<=0&&player[k].velocity.y<-10){
- player[i].velocity=player[k].velocity;
- player[k].velocity=player[k].velocity*-.5;
- //player[i].velocity.y-=10;
- player[k].velocity.y=player[i].velocity.y;
- player[i].DoDamage(20);
- player[i].RagDoll(0);
- player[k].lastcollide=1;
- if(k==0){
- bonus=AboveBonus;
- bonustime=0;
- bonusvalue=50;
- }
- }
- if(i==0&&k!=0&&player[i].targetanimation==jumpdownanim&&!player[k].isCrouch()&&player[k].targetanimation!=rollanim&&!player[i].skeleton.oldfree&&!player[i].skeleton.free&&player[i].lastcollide<=0&&player[i].velocity.y<-10){
- player[k].velocity=player[i].velocity;
- player[i].velocity=player[i].velocity*-.3;
- //player[k].velocity.y-=10;
- player[i].velocity.y=player[k].velocity.y;
- player[k].DoDamage(20);
- player[k].RagDoll(0);
- player[i].lastcollide=1;
- if(i==0){
- bonus=AboveBonus;
- bonustime=0;
- bonusvalue=50;
- }
- }
- }
- }
- }
- }
- player[i].CheckKick();
- player[k].CheckKick();
- }
- }
- }
- }
-
- for(k=0;k<numplayers;k++){
- for(i=k;i<numplayers;i++){
- if(i==k)i++;
- if(i<numplayers&&i!=k&&player[k].skeleton.free==0&&player[i].skeleton.oldfree==0&&(player[i].targetanimation==jumpupanim||player[k].targetanimation==jumpupanim)&&(player[i].aitype==playercontrolled||player[k].aitype==playercontrolled)&&((player[i].aitype==attacktypecutoff&&player[i].stunned<=0)||(player[k].aitype==attacktypecutoff&&player[k].stunned<=0))){
- if(findDistancefast(&player[i].coords,&player[k].coords)<10*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5)&&findDistancefastflat(&player[i].coords,&player[k].coords)<2*((player[i].scale+player[k].scale)*2.5)*((player[i].scale+player[k].scale)*2.5)){
- if(player[i].targetanimation==jumpupanim&&player[k].targetanimation!=getupfrombackanim&&player[k].targetanimation!=getupfromfrontanim&&animation[player[k].targetanimation].height==middleheight&&normaldotproduct(player[i].velocity,player[k].coords-player[i].coords)<0&&((player[k].aitype==playercontrolled&&player[k].attackkeydown)||player[k].aitype!=playercontrolled)){
- player[i].victim=&player[k];
- player[i].targetanimation=jumpreversedanim;
- player[i].currentanimation=jumpreversedanim;
- player[k].currentanimation=jumpreversalanim;
- player[k].targetanimation=jumpreversalanim;
- player[i].targettilt2=0;
- player[i].currentframe=0;
- player[i].targetframe=1;
- player[k].currentframe=0;
- player[k].targetframe=1;
- if(player[i].coords.y<player[k].coords.y+1){
- player[i].targetanimation=rabbitkickreversedanim;
- player[i].currentanimation=rabbitkickreversedanim;
- player[k].currentanimation=rabbitkickreversalanim;
- player[k].targetanimation=rabbitkickreversalanim;
- player[k].currentframe=1;
- player[k].targetframe=2;
- player[i].currentframe=1;
- player[i].targetframe=2;
- }
- player[k].targettilt2=0;
- player[i].target=0;
- player[i].velocity=0;
- player[k].velocity=0;
- player[k].oldcoords=player[k].coords;
- player[i].coords=player[k].coords;
- player[k].targetrotation=player[i].targetrotation;
- player[k].rotation=player[i].targetrotation;
- player[k].victim=&player[i];
- if(player[k].aitype==attacktypecutoff)player[k].stunned=.5;
- }
- if(player[k].targetanimation==jumpupanim&&player[i].targetanimation!=getupfrombackanim&&player[i].targetanimation!=getupfromfrontanim&&animation[player[i].targetanimation].height==middleheight&&normaldotproduct(player[k].velocity,player[i].coords-player[k].coords)<0&&((player[i].aitype==playercontrolled&&player[i].attackkeydown)||player[i].aitype!=playercontrolled)){
- player[k].victim=&player[i];
- player[k].targetanimation=jumpreversedanim;
- player[k].currentanimation=jumpreversedanim;
- player[i].currentanimation=jumpreversalanim;
- player[i].targetanimation=jumpreversalanim;
- player[k].targettilt2=0;
- player[i].targettilt2=0;
- player[k].currentframe=0;
- player[k].targetframe=1;
- player[i].currentframe=0;
- player[i].targetframe=1;
- if(player[k].coords.y<player[i].coords.y+1){
- player[k].targetanimation=rabbitkickreversedanim;
- player[k].currentanimation=rabbitkickreversedanim;
- player[i].currentanimation=rabbitkickreversalanim;
- player[i].targetanimation=rabbitkickreversalanim;
- player[k].currentframe=1;
- player[k].targetframe=2;
- player[i].currentframe=1;
- player[i].targetframe=2;
- }
- player[k].target=0;
- player[k].velocity=0;
- player[i].velocity=0;
- player[i].oldcoords=player[i].coords;
- player[k].coords=player[i].coords;
- player[i].targetrotation=player[k].targetrotation;
- player[i].rotation=player[k].targetrotation;
- player[i].victim=&player[k];
- if(player[i].aitype==attacktypecutoff)player[i].stunned=.5;
- }
- }
- }
- }
- }
-
- for(k=0;k<numplayers;k++)
- if(player[k].immobile&&k!=0)player[k].coords=player[k].realoldcoords;
-
-
- //pile
- if(!Input::isKeyDown(SDLK_n)){
- texturesizetogglekeydown=0;
- }
-
- for(k=0;k<numplayers;k++){
- if(!isnormal(player[k].coords.x)||!isnormal(player[k].coords.y)||!isnormal(player[k].coords.z)){
- if(!isnormal(player[k].coords.x)||!isnormal(player[k].coords.y)||!isnormal(player[k].coords.z)){
- player[k].DoDamage(1000);
- }
- }
- }
-
- static bool respawnkeydown;
- if(!editorenabled&&(whichlevel!=-2&&(Input::isKeyDown(SDLK_z)&&Input::isKeyDown(SDLK_LMETA)&&debugmode&&!editorenabled)||(Input::isKeyDown(jumpkey)&&!respawnkeydown&&!oldattackkey&&player[0].dead))){
- targetlevel=whichlevel;
- loading=1;
- leveltime=5;
- }
- if(!Input::isKeyDown(jumpkey))respawnkeydown=0;
- if(Input::isKeyDown(jumpkey))respawnkeydown=1;
-
-
-
-
- if(whichlevel!=-2&&Input::isKeyDown(SDLK_k)&&Input::isKeyDown(SDLK_LSHIFT)&&!slomotogglekeydown&&debugmode&&!editorenabled){
- targetlevel++;
- if(targetlevel>numchallengelevels-1)targetlevel=0;
- loading=1;
- leveltime=5;
- slomotogglekeydown=1;
- }
- static bool movekey;
- static bool connected;
-
- for(int i=0;i<numplayers;i++){
- if(!player[i].skeleton.free){
- oldtargetrotation=player[i].targetrotation;
- if(i==0&&indialogue==-1){
- if(!animation[player[0].targetanimation].attack&&player[0].targetanimation!=staggerbackhighanim&&player[0].targetanimation!=staggerbackhardanim&&player[0].targetanimation!=crouchremoveknifeanim&&player[0].targetanimation!=removeknifeanim&&player[0].targetanimation!=backhandspringanim&&player[0].targetanimation!=dodgebackanim&&player[0].targetanimation!=walljumprightkickanim&&player[0].targetanimation!=walljumpleftkickanim){
- if(!cameramode)player[0].targetrotation=-rotation+180;
- if(cameramode)player[0].targetrotation=0;
- }
-
- facing=0;
- facing.z=-1;
-
- flatfacing=DoRotation(facing,0,player[i].rotation+180,0);
- if(cameramode){facing=flatfacing;}
- else{
- facing=DoRotation(facing,-rotation2,0,0);
- facing=DoRotation(facing,0,0-rotation,0);
- }
-
- player[0].lookrotation=-rotation;
-
- player[i].targetheadrotation=rotation;
- player[i].targetheadrotation2=rotation2;
- }
- if(i!=0&&player[i].aitype==playercontrolled&&indialogue==-1){
- if(!animation[player[i].targetanimation].attack&&player[i].targetanimation!=staggerbackhighanim&&player[i].targetanimation!=staggerbackhardanim&&player[i].targetanimation!=crouchremoveknifeanim&&player[i].targetanimation!=removeknifeanim&&player[i].targetanimation!=backhandspringanim&&player[i].targetanimation!=dodgebackanim&&player[i].targetanimation!=walljumprightkickanim&&player[i].targetanimation!=walljumpleftkickanim){
- player[i].targetrotation=-player[i].lookrotation+180;
- }
-
- facing=0;
- facing.z=-1;
-
- flatfacing=DoRotation(facing,0,player[i].rotation+180,0);
-
- facing=DoRotation(facing,-player[i].lookrotation2,0,0);
- facing=DoRotation(facing,0,0-player[i].lookrotation,0);
-
- player[i].targetheadrotation=player[i].lookrotation;
- player[i].targetheadrotation2=player[i].lookrotation2;
- }
- if(indialogue!=-1){
- rotatetarget=participantfacing[whichdialogue][indialogue][i];
- Normalise(&rotatetarget);
- player[i].targetheadrotation=-asin(0-rotatetarget.x);
- player[i].targetheadrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetheadrotation=180-player[i].targetheadrotation;
-
- player[i].targetheadrotation*=-1;
- player[i].targetheadrotation+=180;
- player[i].targetheadrotation2=-asin(rotatetarget.y)*360/6.28;
- }
-
- bool pause;
-
- if(leveltime<.5)
- numenvsounds=0;
-
- player[i].avoidsomething=0;
-
- for(j=0;j<objects.numobjects;j++){
- if(objects.onfire[j]){
- if(findDistancefast(&objects.position[j],&player[i].coords)<objects.scale[j]*objects.scale[j]*200)
- {
- if(findDistancefast(&player[i].coords,&objects.position[j])<findDistancefast(&player[i].coords,&player[0].coords)){
- player[i].collided=0;
- player[i].avoidcollided=1;
- if(player[i].avoidsomething==0||findDistancefast(&objects.position[j],&player[i].coords)<findDistancefast(&player[i].coords,&player[i].avoidwhere))
- player[i].avoidwhere=objects.position[j];
- }
- }
- }
- }
-
- //Add avoidwhere to players
-
- for(j=0;j<numplayers;j++){
- if(player[j].onfire){
- if(findDistancefast(&player[j].coords,&player[i].coords)<0.3*0.3*200)
- {
- if(findDistancefast(&player[i].coords,&player[j].coords)<findDistancefast(&player[i].coords,&player[0].coords)){
- player[i].collided=0;
- player[i].avoidcollided=1;
- if(player[i].avoidsomething==0||findDistancefast(&player[j].coords,&player[i].coords)<findDistancefast(&player[i].coords,&player[i].avoidwhere))
- player[i].avoidwhere=objects.position[j];
- }
- }
- }
- }
-
- if(player[i].collided>.8)player[i].avoidcollided=0;
- if(player[i].aitype!=playercontrolled&&indialogue==-1){
- player[i].jumpclimb=0;
- //AI
- if(editorenabled)player[i].stunned=1;
-
- player[i].pause=0;
- //if(findDistancefastflat(&player[i].coords,&player[0].coords)<3/*&&player[0].coords.y>player[i].coords.y+.1*/)player[i].pause=1;
- if(findDistancefastflat(&player[0].coords,&player[i].coords)<30&&player[0].coords.y>player[i].coords.y+2&&!player[0].onterrain)player[i].pause=1;
-
- /*if(player[i].aitype==passivetype&&player[i].numwaypoints<=1){
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].attackkeydown=0;
- player[i].jumpkeydown=0;
- player[i].throwkeydown=0;
- }*/
-
- if(player[i].aitype==pathfindtype){
- if(player[i].finalpathfindpoint==-1){
- float closestdistance;
- float tempdist;
- int closest;
- XYZ colpoint;
- closest=-1;
- closestdistance=-1;
- for(j=0;j<numpathpoints;j++){
- if(closest==-1||findDistancefast(&player[i].finalfinaltarget,&pathpoint[j])<closestdistance){
- closestdistance=findDistancefast(&player[i].finalfinaltarget,&pathpoint[j]);
- closest=j;
- player[i].finaltarget=pathpoint[j];
- }
- }
- player[i].finalpathfindpoint=closest;
- for(j=0;j<numpathpoints;j++){
- if(numpathpointconnect[j])
- for(k=0;k<numpathpointconnect[j];k++){
- DistancePointLine(&player[i].finalfinaltarget, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist,&colpoint );
- if(tempdist*tempdist<closestdistance){
- if(findDistance(&colpoint,&pathpoint[j])+findDistance(&colpoint,&pathpoint[pathpointconnect[j][k]])<findDistance(&pathpoint[j],&pathpoint[pathpointconnect[j][k]])+.1){
- closestdistance=tempdist*tempdist;
- closest=j;
- player[i].finaltarget=colpoint;
- }
- }
- }
- }
- player[i].finalpathfindpoint=closest;
-
- }
- if(player[i].targetpathfindpoint==-1){
- float closestdistance;
- float tempdist;
- int closest;
- XYZ colpoint;
- closest=-1;
- closestdistance=-1;
- if(player[i].lastpathfindpoint==-1){
- for(j=0;j<numpathpoints;j++){
- if(j!=player[i].lastpathfindpoint)
- if(closest==-1||(findDistancefast(&player[i].coords,&pathpoint[j])<closestdistance/*&&findDistancefast(&player[i].finaltarget,&pathpoint[j])<findDistancefast(&player[i].finaltarget,&player[i].coords)*/)){
- closestdistance=findDistancefast(&player[i].coords,&pathpoint[j]);
- closest=j;
- }
- }
- player[i].targetpathfindpoint=closest;
- for(j=0;j<numpathpoints;j++){
- if(j!=player[i].lastpathfindpoint)
- if(numpathpointconnect[j])
- for(k=0;k<numpathpointconnect[j];k++){
- DistancePointLine(&player[i].coords, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist,&colpoint );
- if(tempdist*tempdist<closestdistance){
- if(findDistance(&colpoint,&pathpoint[j])+findDistance(&colpoint,&pathpoint[pathpointconnect[j][k]])<findDistance(&pathpoint[j],&pathpoint[pathpointconnect[j][k]])+.1){
- //if(findDistancefast(&player[i].finaltarget,&colpoint)<findDistancefast(&player[i].finaltarget,&player[i].coords)){
- closestdistance=tempdist*tempdist;
- closest=j;
- //}
- }
- }
- }
- }
- player[i].targetpathfindpoint=closest;
- }
- else
- {
- for(j=0;j<numpathpoints;j++){
- if(j!=player[i].lastpathfindpoint&&j!=player[i].lastpathfindpoint2&&j!=player[i].lastpathfindpoint3&&j!=player[i].lastpathfindpoint4)
- {
- connected=0;
- if(numpathpointconnect[j])
- for(k=0;k<numpathpointconnect[j];k++){
- if(pathpointconnect[j][k]==player[i].lastpathfindpoint)connected=1;
- }
- if(!connected)
- if(numpathpointconnect[player[i].lastpathfindpoint])
- for(k=0;k<numpathpointconnect[player[i].lastpathfindpoint];k++){
- if(pathpointconnect[player[i].lastpathfindpoint][k]==j)connected=1;
- }
- if(connected){
- tempdist=findPathDist(j,player[i].finalpathfindpoint);
- if(closest==-1||tempdist<closestdistance){
- closestdistance=tempdist;
- closest=j;
- }
- }
- }
- }
- player[i].targetpathfindpoint=closest;
- }
- }
- player[i].losupdatedelay-=multiplier;
-
- rotatetarget=pathpoint[player[i].targetpathfindpoint]-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
- player[i].lookrotation=player[i].targetrotation;
- //player[i].aiupdatedelay=.05;
-
- if(findDistancefastflat(&player[i].coords,&pathpoint[player[i].targetpathfindpoint])<.6){
- player[i].lastpathfindpoint4=player[i].lastpathfindpoint3;
- player[i].lastpathfindpoint3=player[i].lastpathfindpoint2;
- player[i].lastpathfindpoint2=player[i].lastpathfindpoint;
- player[i].lastpathfindpoint=player[i].targetpathfindpoint;
- if(player[i].lastpathfindpoint2==-1)player[i].lastpathfindpoint2=player[i].lastpathfindpoint;
- if(player[i].lastpathfindpoint3==-1)player[i].lastpathfindpoint3=player[i].lastpathfindpoint2;
- if(player[i].lastpathfindpoint4==-1)player[i].lastpathfindpoint4=player[i].lastpathfindpoint3;
- player[i].targetpathfindpoint=-1;
- }
- if(findDistancefastflat(&player[i].coords,&player[i].finalfinaltarget)<findDistancefastflat(&player[i].coords,&player[i].finaltarget)||findDistancefastflat(&player[i].coords,&player[i].finaltarget)<.6*(player[i].scale*5)*(player[i].scale*5)||player[i].lastpathfindpoint==player[i].finalpathfindpoint){
- player[i].aitype=passivetype;
- }
-
- player[i].forwardkeydown=1;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].attackkeydown=0;
- player[i].throwkeydown=0;
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8)player[i].targetrotation+=90*(player[i].whichdirection*2-1);
-
- if(player[i].collided<1||player[i].targetanimation!=jumpupanim)player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5))player[i].jumpkeydown=1;
-
- if((tutoriallevel!=1||cananger)&&hostile&&!player[0].dead&&findDistancefast(&player[i].coords,&player[0].coords)<400&&player[i].occluded<25){
- if(findDistancefast(&player[i].coords,&player[0].coords)<12&&animation[player[0].targetanimation].height!=lowheight&&!editorenabled&&(player[0].coords.y<player[i].coords.y+5||player[0].onterrain))
- player[i].aitype=attacktypecutoff;
- if(findDistancefast(&player[i].coords,&player[0].coords)<30&&animation[player[0].targetanimation].height==highheight&&!editorenabled)
- player[i].aitype=attacktypecutoff;
-
- if(player[i].losupdatedelay<0&&!editorenabled&&player[i].occluded<2){
- player[i].losupdatedelay=.2;
- for(j=0;j<numplayers;j++){
- if(j==0||player[j].skeleton.free||player[j].aitype!=passivetype){
- if(abs(Random()%2)||animation[player[j].targetanimation].height!=lowheight||j!=0)
- if(findDistancefast(&player[i].coords,&player[j].coords)<400)
- if(normaldotproduct(player[i].facing,player[j].coords-player[i].coords)>0)
- if(player[j].coords.y<player[i].coords.y+5||player[j].onterrain)
- if((-1==checkcollide(DoRotation(player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position,0,player[i].rotation,0)*player[i].scale+player[i].coords,DoRotation(player[j].skeleton.joints[player[j].skeleton.jointlabels[head]].position,0,player[j].rotation,0)*player[j].scale+player[j].coords)&&!player[j].isWallJump())||(player[j].targetanimation==hanganim&&normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){
- player[i].aitype=searchtype;
- player[i].lastchecktime=12;
- player[i].lastseen=player[j].coords;
- player[i].lastseentime=12;
- }
- }
- }
- }
- }
- if(player[i].aitype==attacktypecutoff&&musictype!=2){
- if(player[i].creature!=wolftype){
- player[i].stunned=.6;
- player[i].surprised=.6;
- }
- }
- }
-
- if(player[i].aitype!=passivetype&&leveltime>.5){
- player[i].howactive=typeactive;
- }
-
- if(player[i].aitype==passivetype){
- player[i].aiupdatedelay-=multiplier;
- player[i].losupdatedelay-=multiplier;
- player[i].lastseentime+=multiplier;
- player[i].pausetime-=multiplier;
- if(player[i].lastseentime>1)player[i].lastseentime=1;
-
- if(player[i].aiupdatedelay<0){
- if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0){
- rotatetarget=player[i].waypoints[player[i].waypoint]-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
- player[i].lookrotation=player[i].targetrotation;
- player[i].aiupdatedelay=.05;
-
- if(findDistancefastflat(&player[i].coords,&player[i].waypoints[player[i].waypoint])<1){
- if(player[i].waypointtype[player[i].waypoint]==wppause)player[i].pausetime=4;
- player[i].waypoint++;
- if(player[i].waypoint>player[i].numwaypoints-1)player[i].waypoint=0;
-
- }
- }
-
- if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0)player[i].forwardkeydown=1;
- else player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].attackkeydown=0;
- player[i].throwkeydown=0;
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
- if(!player[i].avoidsomething)player[i].targetrotation+=90*(player[i].whichdirection*2-1);
- else{
- XYZ leftpos,rightpos;
- float leftdist,rightdist;
- leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
- rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
- leftdist = findDistancefast(&leftpos, &player[i].avoidwhere);
- rightdist = findDistancefast(&rightpos, &player[i].avoidwhere);
- if(leftdist<rightdist)player[i].targetrotation+=90;
- else player[i].targetrotation-=90;
- }
- }
- }
- if(player[i].collided<1||player[i].targetanimation!=jumpupanim)player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5))player[i].jumpkeydown=1;
-
-
- if(!editorenabled){
- if(player[i].howactive<typesleeping)
- if(numenvsounds>0&&(tutoriallevel!=1||cananger)&&hostile)
- for(j=0;j<numenvsounds;j++){
- if(findDistancefast(&player[i].coords,&envsound[j])<2*(envsoundvol[j]+envsoundvol[j]*(player[i].creature==rabbittype)*3)){
- player[i].aitype=attacktypecutoff;
- }
- }
-
- if(player[i].howactive==typesleeping)
- if(numenvsounds>0&&(tutoriallevel!=1||cananger)&&hostile)
- for(j=0;j<numenvsounds;j++){
- if(envsoundvol[j]>14)
- if(findDistancefast(&player[i].coords,&envsound[j])<2*((envsoundvol[j]-14)+(envsoundvol[j]-14)*(player[i].creature==rabbittype)*3)){
- player[i].aitype=attacktypecutoff;
- }
- }
-
- if(player[i].aitype!=passivetype){
- if(player[i].howactive==typesleeping){
- player[i].targetanimation=getupfromfrontanim;
- player[i].targetframe=0;
- player[i].target=0;
- }
-
- player[i].howactive=typeactive;
- }
- }
-
- if(player[i].howactive<typesleeping&&((tutoriallevel!=1||cananger)&&hostile)&&!player[0].dead&&findDistancefast(&player[i].coords,&player[0].coords)<400&&player[i].occluded<25){
- if(findDistancefast(&player[i].coords,&player[0].coords)<12&&animation[player[0].targetanimation].height!=lowheight&&!editorenabled)
- player[i].aitype=attacktypecutoff;
- if(findDistancefast(&player[i].coords,&player[0].coords)<30&&animation[player[0].targetanimation].height==highheight&&!editorenabled)
- player[i].aitype=attacktypecutoff;
-
- if(player[i].creature==wolftype){
- XYZ windsmell;
- float smelldistance;
- smelldistance=50;
- for(j=0;j<numplayers;j++){
- if(j==0||(player[j].dead&&player[j].bloodloss>0)){
- if(j==0&&player[j].num_weapons>0){
- if(weapons.bloody[player[j].weaponids[0]])smelldistance=100;
- if(player[j].num_weapons==2)
- if(weapons.bloody[player[j].weaponids[1]])smelldistance=100;
- }
- if(j!=0){
- smelldistance=100;
- }
- windsmell=windvector;
- Normalise(&windsmell);
- windsmell=windsmell*2+player[j].coords;
- if(findDistancefast(&player[i].coords,&windsmell)<smelldistance&&!editorenabled)
- player[i].aitype=attacktypecutoff;
- }
- }
- }
-
- if(player[i].howactive<typesleeping&&player[i].losupdatedelay<0&&!editorenabled&&player[i].occluded<2){
- player[i].losupdatedelay=.2;
- for(j=0;j<numplayers;j++){
- if(j==0||player[j].skeleton.free||player[j].aitype!=passivetype){
- if(abs(Random()%2)||animation[player[j].targetanimation].height!=lowheight||j!=0)
- if(findDistancefast(&player[i].coords,&player[j].coords)<400)
- if(normaldotproduct(player[i].facing,player[j].coords-player[i].coords)>0)
- if((-1==checkcollide(DoRotation(player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position,0,player[i].rotation,0)*player[i].scale+player[i].coords,DoRotation(player[j].skeleton.joints[player[j].skeleton.jointlabels[head]].position,0,player[j].rotation,0)*player[j].scale+player[j].coords)&&!player[j].isWallJump())||(player[j].targetanimation==hanganim&&normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){
- player[i].lastseentime-=.2;
- if(j==0&&animation[player[j].targetanimation].height==lowheight)player[i].lastseentime-=.4;
- else player[i].lastseentime-=.6;
- }
- if(player[i].lastseentime<=0){
- player[i].aitype=searchtype;
- player[i].lastchecktime=12;
- player[i].lastseen=player[j].coords;
- player[i].lastseentime=12;
- }
- }
- }
- }
- }
- if(player[i].aitype==attacktypecutoff&&musictype!=2){
- if(player[i].creature!=wolftype){
- player[i].stunned=.6;
- player[i].surprised=.6;
- }
- if(player[i].creature==wolftype){
- player[i].stunned=.47;
- player[i].surprised=.47;
- }
- numseen++;
- }
- }
-
- if(player[i].aitype==searchtype){
- player[i].aiupdatedelay-=multiplier;
- player[i].losupdatedelay-=multiplier;
- if(!player[i].pause)player[i].lastseentime-=multiplier;
- player[i].lastchecktime-=multiplier;
-
- if(player[i].isRun()&&!player[i].onground){
- if(player[i].coords.y>terrain.getHeight(player[i].coords.x,player[i].coords.z)+10){
- test2=player[i].coords+player[i].facing;
- test2.y+=5;
- test=player[i].coords+player[i].facing;
- test.y-=10;
- j=checkcollide(test2,test,player[i].laststanding);
- if(j==-1)j=checkcollide(test2,test);
- if(j==-1){
- player[i].velocity=0;
- player[i].targetanimation=player[i].getStop();
- player[i].targetframe=0;
- player[i].target=0;
- player[i].targetrotation+=180;
- player[i].stunned=.5;
- //player[i].aitype=passivetype;
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
- }
- else player[i].laststanding=j;
- }
- }
- if(player[i].aiupdatedelay<0){
- rotatetarget=player[i].lastseen-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
- player[i].lookrotation=player[i].targetrotation;
- player[i].aiupdatedelay=.05;
- player[i].forwardkeydown=1;
-
- if(findDistancefastflat(&player[i].coords,&player[i].lastseen)<1*(player[i].scale*5)*(player[i].scale*5)||player[i].lastchecktime<0){
- player[i].forwardkeydown=0;
- player[i].aiupdatedelay=1;
- player[i].lastseen.x+=(float(Random()%100)-50)/25;
- player[i].lastseen.z+=(float(Random()%100)-50)/25;
- player[i].lastchecktime=3;
- }
-
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].attackkeydown=0;
- player[i].throwkeydown=0;
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
- if(!player[i].avoidsomething)player[i].targetrotation+=90*(player[i].whichdirection*2-1);
- else{
- XYZ leftpos,rightpos;
- float leftdist,rightdist;
- leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
- rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
- leftdist = findDistancefast(&leftpos, &player[i].avoidwhere);
- rightdist = findDistancefast(&rightpos, &player[i].avoidwhere);
- if(leftdist<rightdist)player[i].targetrotation+=90;
- else player[i].targetrotation-=90;
- }
- }
- }
- if(player[i].collided<1||player[i].targetanimation!=jumpupanim)player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5))player[i].jumpkeydown=1;
-
- if(numenvsounds>0&&((tutoriallevel!=1||cananger)&&hostile))
- for(j=0;j<numenvsounds;j++){
- if(findDistancefast(&player[i].coords,&envsound[j])<2*(envsoundvol[j]+envsoundvol[j]*(player[i].creature==rabbittype)*3)){
- player[i].aitype=attacktypecutoff;
- }
- }
-
- if(!player[0].dead&&player[i].losupdatedelay<0&&!editorenabled&&player[i].occluded<2&&((tutoriallevel!=1||cananger)&&hostile)){
- player[i].losupdatedelay=.2;
- if(findDistancefast(&player[i].coords,&player[0].coords)<4&&animation[player[i].targetanimation].height!=lowheight)
- {player[i].aitype=attacktypecutoff;
- player[i].lastseentime=1;}
- if(abs(Random()%2)||animation[player[i].targetanimation].height!=lowheight)
- if(findDistancefast(&player[i].coords,&player[0].coords)<400)
- if(normaldotproduct(player[i].facing,player[0].coords-player[i].coords)>0)
- if((-1==checkcollide(DoRotation(player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position,0,player[i].rotation,0)*player[i].scale+player[i].coords,DoRotation(player[0].skeleton.joints[player[0].skeleton.jointlabels[head]].position,0,player[0].rotation,0)*player[0].scale+player[0].coords))||(player[j].targetanimation==hanganim&&normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){
- player[i].aitype=attacktypecutoff;
- player[i].lastseentime=1;
- }
- }
- if(player[i].lastseentime<0){
- //player[i].aitype=passivetype;
- numescaped++;
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
- }
- }
-
- if(player[i].aitype!=gethelptype){
- player[i].runninghowlong=0;
- }
-
- if(player[i].aitype==gethelptype){
- player[i].runninghowlong+=multiplier;
- player[i].aiupdatedelay-=multiplier;
-
- if(player[i].aiupdatedelay<0||player[i].ally==0){
- player[i].aiupdatedelay=.2;
-
- int closest;
- float closestdist;
- closest=-1;
- closestdist=-1;
- float distance;
-
- if(!player[i].ally){
- for(j=0;j<numplayers;j++){
- if(j!=i&&j!=0&&!player[j].dead&&player[j].howactive<typedead1&&!player[j].skeleton.free&&player[j].aitype==passivetype){
- distance=findDistancefast(&player[i].coords,&player[j].coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=j;
- }
- closest=j;
- }
- }
- if(closest!=-1)player[i].ally=closest;
- else player[i].ally=0;
- player[i].lastseen=player[0].coords;
- player[i].lastseentime=12;
- }
-
-
- player[i].lastchecktime=12;
- //player[i].lastseentime-=.5;
-
- facing=player[i].coords;
- flatfacing=player[player[i].ally].coords;
- facing.y+=player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position.y*player[i].scale;
- flatfacing.y+=player[player[i].ally].skeleton.joints[player[player[i].ally].skeleton.jointlabels[head]].position.y*player[player[i].ally].scale;
- if(-1!=checkcollide(facing,flatfacing))
- player[i].lastseentime-=.1;
-
- if(player[i].ally<=0||player[player[i].ally].skeleton.free||player[player[i].ally].aitype!=passivetype||player[i].lastseentime<=0){
- player[i].aitype=searchtype;
- player[i].lastseentime=12;
- }
-
- if(player[i].ally>0){
- rotatetarget=player[player[i].ally].coords-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
- player[i].lookrotation=player[i].targetrotation;
- player[i].aiupdatedelay=.05;
- player[i].forwardkeydown=1;
-
- if(findDistancefastflat(&player[i].coords,&player[player[i].ally].coords)<3){
- player[i].aitype=searchtype;
- player[i].lastseentime=12;
- player[player[i].ally].aitype=searchtype;
- if(player[player[i].ally].lastseentime<player[i].lastseentime){
- player[player[i].ally].lastseen=player[i].lastseen;
- player[player[i].ally].lastseentime=player[i].lastseentime;
- player[player[i].ally].lastchecktime=player[i].lastchecktime;
- }
- }
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
- if(!player[i].avoidsomething)player[i].targetrotation+=90*(player[i].whichdirection*2-1);
- else{
- XYZ leftpos,rightpos;
- float leftdist,rightdist;
- leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
- rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
- leftdist = findDistancefast(&leftpos, &player[i].avoidwhere);
- rightdist = findDistancefast(&rightpos, &player[i].avoidwhere);
- if(leftdist<rightdist)player[i].targetrotation+=90;
- else player[i].targetrotation-=90;
- }
- }
- }
-
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].attackkeydown=0;
- }
- if(player[i].collided<1||player[i].targetanimation!=jumpupanim)player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5))player[i].jumpkeydown=1;
- }
-
- if(player[i].aitype==getweapontype){
- player[i].aiupdatedelay-=multiplier;
- player[i].lastchecktime-=multiplier;
-
- if(player[i].aiupdatedelay<0){
- player[i].aiupdatedelay=.2;
-
- int closest;
- float closestdist;
- closest=-1;
- closestdist=-1;
- float distance;
-
- if(player[i].ally<0){
- for(j=0;j<weapons.numweapons;j++){
- if(weapons.owner[j]==-1){
- distance=findDistancefast(&player[i].coords,&weapons.position[j]);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=j;
- }
- closest=j;
- }
- }
- if(closest!=-1)player[i].ally=closest;
- else player[i].ally=-1;
- }
-
- player[i].lastseentime=12;
-
- if(!player[0].dead&&((tutoriallevel!=1||cananger)&&hostile))
- if(player[i].ally<0||player[i].weaponactive!=-1||player[i].lastchecktime<=0){
- player[i].aitype=attacktypecutoff;
- player[i].lastseentime=1;
- }
- if(!player[0].dead)
- if(player[i].ally>=0){
- if(weapons.owner[player[i].ally]!=-1||findDistancefast(&player[i].coords,&weapons.position[player[i].ally])>16){
- player[i].aitype=attacktypecutoff;
- player[i].lastseentime=1;
- }
- rotatetarget=weapons.position[player[i].ally]-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
- player[i].lookrotation=player[i].targetrotation;
- player[i].aiupdatedelay=.05;
- player[i].forwardkeydown=1;
-
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
- if(!player[i].avoidsomething)player[i].targetrotation+=90*(player[i].whichdirection*2-1);
- else{
- XYZ leftpos,rightpos;
- float leftdist,rightdist;
- leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
- rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
- leftdist = findDistancefast(&leftpos, &player[i].avoidwhere);
- rightdist = findDistancefast(&rightpos, &player[i].avoidwhere);
- if(leftdist<rightdist)player[i].targetrotation+=90;
- else player[i].targetrotation-=90;
- }
- }
- /*if(findDistancefast(&player[i].coords,&weapons.position[player[i].ally])<3){
- if(abs(Random()%6)){
- player[i].crouchkeydown=1;
- if(!findDistancefast(&player[i].coords,&weapons.position[player[i].ally])<1){
- if(player[i].isRun()){
- player[i].targetframe=0;
- player[i].target=0;
- player[i].targetanimation=sneakanim;
- }
- }
- else player[i].forwardkeydown=0;
- }
- else player[i].crouchkeydown=0;
- }
- else player[i].crouchkeydown=0;*/
- }
-
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].attackkeydown=0;
- player[i].throwkeydown=1;
- player[i].crouchkeydown=0;
- if(player[i].targetanimation!=crouchremoveknifeanim&&player[i].targetanimation!=removeknifeanim)player[i].throwtogglekeydown=0;
- player[i].drawkeydown=0;
- }
- if(player[i].collided<1||player[i].targetanimation!=jumpupanim)player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5))player[i].jumpkeydown=1;
- }
-
- if(player[i].aitype==attacktypecutoff){
- player[i].aiupdatedelay-=multiplier;
- if(player[i].damage<player[i].damagetolerance*2/3)
- if((player[0].targetanimation==rabbitkickanim||player[0].targetanimation==knifethrowanim||(player[0].isFlip()&&normaldotproduct(player[0].facing,player[0].coords-player[i].coords)<0))&&!player[0].skeleton.free&&(player[i].aiupdatedelay<.1)){
- player[i].attackkeydown=0;
- if(player[i].isIdle())player[i].crouchkeydown=1;
- if(player[0].targetanimation!=rabbitkickanim&&player[0].weaponactive!=-1){
- if(weapons.type[player[0].weaponids[0]]==knife){
- if(player[i].isIdle()||player[i].isCrouch()||player[i].isRun()||player[i].isFlip()){
- if(abs(Random()%2==0))player[i].targetanimation=backhandspringanim;
- else player[i].targetanimation=rollanim;
- player[i].target=0;
- player[i].targetframe=0;
- player[i].targetrotation+=90*(abs(Random()%2)*2-1);
- player[i].wentforweapon=0;
- }
- if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim){
- player[i].targetanimation=flipanim;
- player[i].target=0;
- player[i].targetframe=0;
- }
- }
- }
- player[i].forwardkeydown=0;
- player[i].aiupdatedelay=.02;
- }
- if(player[0].isFlip()&&!player[0].skeleton.free&&player[0].targetanimation!=walljumprightkickanim&&player[0].targetanimation!=walljumpleftkickanim){
- if(findDistancefast(&player[0].coords,&player[i].coords)<25)
- if((1-player[i].damage/player[i].damagetolerance)>.5)player[i].stunned=1;
- }
- if(player[i].wentforweapon<3)
- for(j=0;j<weapons.numweapons;j++){
- if(player[i].creature!=wolftype)
- if(player[i].num_weapons==0&&weapons.owner[j]==-1&&weapons.velocity[i].x==0&&weapons.velocity[i].z==0&&weapons.velocity[i].y==0){
- if(findDistancefast(&player[i].coords,&weapons.position[j])<16){
- player[i].wentforweapon++;
- player[i].lastchecktime=6;
- player[i].aitype=getweapontype;
- player[i].ally=-1;
- }
- }
- }
- if(player[i].damage<player[i].damagetolerance/2)
- if(animation[player[i].targetanimation].height!=highheight)
- if(player[i].damage<player[i].damagetolerance*.5&&((player[0].targetanimation==walljumprightkickanim||player[0].targetanimation==walljumpleftkickanim)&&((player[i].aiupdatedelay<.15&&difficulty==2)||(player[i].aiupdatedelay<.08&&difficulty!=2)))){
- player[i].crouchkeydown=1;
- }
- if(player[i].isRun()&&!player[i].onground){
- if(player[i].coords.y>terrain.getHeight(player[i].coords.x,player[i].coords.z)+10){
- test2=player[i].coords+player[i].facing;
- test2.y+=5;
- test=player[i].coords+player[i].facing;
- test.y-=10;
- j=checkcollide(test2,test,player[i].laststanding);
- if(j==-1)j=checkcollide(test2,test);
- if(j==-1){
- player[i].velocity=0;
- player[i].targetanimation=player[i].getStop();
- player[i].targetframe=0;
- player[i].target=0;
- player[i].targetrotation+=180;
- player[i].stunned=.5;
- //player[i].aitype=passivetype;
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
- }
- else player[i].laststanding=j;
- }
- }
- if(player[0].coords.y>player[i].coords.y+5&&animation[player[0].targetanimation].height!=highheight&&!player[0].onterrain){
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
- }
- if(player[i].aiupdatedelay<0&&!animation[player[i].targetanimation].attack&&player[i].targetanimation!=staggerbackhighanim&&player[i].targetanimation!=staggerbackhardanim&&player[i].targetanimation!=backhandspringanim&&player[i].targetanimation!=dodgebackanim){
- if(player[i].weaponactive==-1&&player[i].num_weapons>0)player[i].drawkeydown=Random()%2;
- else player[i].drawkeydown=0;
- player[i].rabbitkickenabled=Random()%2;
- rotatetarget=player[player[i].aitarget].coords+player[player[i].aitarget].velocity;
- if(findDistancefast(&player[player[i].aitarget].coords,&player[i].coords)<findDistancefast(&rotatetarget,&player[i].coords))
- rotatetarget=player[player[i].aitarget].coords+player[player[i].aitarget].velocity*findDistance(&player[player[i].aitarget].coords,&player[i].coords)/findLength(&player[i].velocity)-player[i].coords;
- else rotatetarget=player[player[i].aitarget].coords-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
- player[i].lookrotation=player[i].targetrotation;
- player[i].aiupdatedelay=.2+abs((float)(Random()%100)/1000);
-
- oldkey=player[i].forwardkeydown;
- if(findDistancefast(&player[i].coords,&player[0].coords)>5&&(player[0].weaponactive==-1||player[i].weaponactive!=-1))player[i].forwardkeydown=1;
- else if((findDistancefast(&player[i].coords,&player[0].coords)>16||findDistancefast(&player[i].coords,&player[0].coords)<9)&&player[0].weaponactive!=-1)player[i].forwardkeydown=1;
- else if(Random()%6==0||(player[i].creature==wolftype&&Random()%3==0))player[i].forwardkeydown=1;
- else player[i].forwardkeydown=0;
- if(player[0].dead){
- player[i].forwardkeydown=0;
- if(Random()%10==0)player[i].forwardkeydown=1;
- if(Random()%100==0){
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
- }
- }
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].throwkeydown=0;
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8)player[i].targetrotation+=90*(player[i].whichdirection*2-1);
- if(Random()%2==0/*||player[0].weaponactive!=-1*/||player[i].weaponactive!=-1||player[i].creature==wolftype)player[i].attackkeydown=1;
- else player[i].attackkeydown=0;
- if((player[i].isRun())&&Random()%6&&findDistancefast(&player[i].coords,&player[0].coords)>7)player[i].attackkeydown=0;
-
- if(player[i].aitype!=playercontrolled&&(player[i].isIdle()||player[i].isCrouch()||player[i].isRun())){
- target=-2;
- for(j=0;j<numplayers;j++){
- if(j!=i&&!player[j].skeleton.free&&player[j].hasvictim&&((tutoriallevel==1&&reversaltrain)||(Random()%2==0&&difficulty==2)||(Random()%4==0&&difficulty==1)||(Random()%8==0&&difficulty==0)||(player[j].lastattack2==player[j].targetanimation&&player[j].lastattack3==player[j].targetanimation&&(Random()%2==0||difficulty==2))||((player[i].isIdle()||player[i].isRun())&&player[j].weaponactive!=-1)||(player[j].targetanimation==swordslashanim&&player[i].weaponactive!=-1)||player[j].targetanimation==staffhitanim||player[j].targetanimation==staffspinhitanim)){
- if(findDistancefast(&player[j].coords,&player[j].victim->coords)<4&&player[j].victim==&player[i]&&(player[j].targetanimation==sweepanim||player[j].targetanimation==spinkickanim||player[j].targetanimation==staffhitanim||player[j].targetanimation==staffspinhitanim||player[j].targetanimation==winduppunchanim||player[j].targetanimation==upunchanim||player[j].targetanimation==wolfslapanim||player[j].targetanimation==knifeslashstartanim||((player[j].targetanimation==swordslashanim)&&(findDistancefast(&player[j].coords,&player[i].coords)<2||(player[i].weaponactive!=-1))))){
- if(target>=0)target=-1;
- else target=j;
- }
- }
- }
- if(target>=0)player[target].Reverse();
- }
-
- if(player[i].collided<1)player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5)||(findDistancefast(&player[i].coords,&player[0].coords)>400&&player[i].onterrain&&player[i].creature==rabbittype))player[i].jumpkeydown=1;
- if(normaldotproduct(player[i].facing,player[0].coords-player[i].coords)>0)
- player[0].jumpkeydown=0;
- if(player[0].targetanimation==jumpdownanim&&findDistancefast(&player[0].coords,&player[i].coords)<40)player[i].crouchkeydown=1;
- if(player[i].jumpkeydown)player[i].attackkeydown=0;
- //if(animation[player[i].targetanimation].attack==reversed)player[i].crouchkeydown=1;
-
- if(tutoriallevel==1){
- if(!canattack)player[i].attackkeydown=0;
- }
-
-
- facing=player[i].coords;
- flatfacing=player[0].coords;
- facing.y+=player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position.y*player[i].scale;
- flatfacing.y+=player[0].skeleton.joints[player[0].skeleton.jointlabels[head]].position.y*player[0].scale;
- if(player[i].occluded>=2)
- if(-1!=checkcollide(facing,flatfacing)){
- if(!player[i].pause)player[i].lastseentime-=.2;
- if(player[i].lastseentime<=0&&(player[i].creature!=wolftype||player[i].weaponstuck==-1)){
- player[i].aitype=searchtype;
- player[i].lastchecktime=12;
- player[i].lastseen=player[0].coords;
- player[i].lastseentime=12;
- }
- }
- else player[i].lastseentime=1;
- }
- }
- if(animation[player[0].targetanimation].height==highheight&&(player[i].aitype==attacktypecutoff||player[i].aitype==searchtype)){
- if(player[0].coords.y>terrain.getHeight(player[0].coords.x,player[0].coords.z)+10){
- test=player[0].coords;
- test.y-=40;
- if(-1==checkcollide(player[0].coords,test))player[i].stunned=1;
- }
- }
- // NOTE: Ask about logic of this call : NOTE
- if((player[i].aitype==passivetype && !(player[i].numwaypoints>1)) ||
- player[i].stunned>0 ||
- (player[i].pause && (player[i].damage > player[i].superpermanentdamage)))
- {
- if(/*player[i].aitype==attacktypecutoff&&*/player[i].pause)player[i].lastseentime=1;
- player[i].targetrotation=player[i].rotation;
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].jumpkeydown=0;
- player[i].attackkeydown=0;
- player[i].crouchkeydown=0;
- player[i].throwkeydown=0;
- }
-
-
- facing=0;
- facing.z=-1;
-
- flatfacing=DoRotation(facing,0,player[i].rotation+180,0);
- facing=flatfacing;
-
- if(player[i].aitype==attacktypecutoff){
- rotatetarget=player[0].coords-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetheadrotation=-asin(0-rotatetarget.x);
- player[i].targetheadrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetheadrotation=180-player[i].targetheadrotation;
-
- player[i].targetheadrotation*=-1;
- player[i].targetheadrotation+=180;
- //player[i].targetheadrotation2=0;
- player[i].targetheadrotation2=-asin(rotatetarget.y)*360/6.28;
- }
- else if(player[i].howactive>=typesleeping){
- player[i].targetheadrotation=player[i].targetrotation;
- player[i].targetheadrotation2=0;
- }
- else {
- if(player[i].interestdelay<=0){
- player[i].interestdelay=.7+(float)(abs(Random()%100))/100;
- player[i].headtarget=player[i].coords;
- player[i].headtarget.x+=(float)(abs(Random()%200)-100)/100;
- player[i].headtarget.z+=(float)(abs(Random()%200)-100)/100;
- player[i].headtarget.y+=(float)(abs(Random()%200)-100)/300;
- player[i].headtarget+=player[i].facing*1.5;
- }
- rotatetarget=player[i].headtarget-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetheadrotation=-asin(0-rotatetarget.x);
- player[i].targetheadrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetheadrotation=180-player[i].targetheadrotation;
-
- player[i].targetheadrotation*=-1;
- player[i].targetheadrotation+=180;
- player[i].targetheadrotation2=-asin(rotatetarget.y)*360/6.28;
- }
- //if(whichlevel==2)player[i].jumpkeydown=0;
- }
- if(animation[player[i].targetanimation].attack==reversed){
- //player[i].targetrotation=player[i].rotation;
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].jumpkeydown=0;
- player[i].attackkeydown=0;
- //player[i].crouchkeydown=0;
- player[i].throwkeydown=0;
- }
-
- if(indialogue!=-1){
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].jumpkeydown=0;
- player[i].crouchkeydown=0;
- player[i].drawkeydown=0;
- player[i].throwkeydown=0;
- }
-
- if(player[i].collided<-.3)player[i].collided=-.3;
- if(player[i].collided>1)player[i].collided=1;
- player[i].collided-=multiplier*4;
- player[i].whichdirectiondelay-=multiplier;
- if(player[i].avoidcollided<-.3||player[i].whichdirectiondelay<=0){
- player[i].avoidcollided=-.3;
- player[i].whichdirection=abs(Random()%2);
- player[i].whichdirectiondelay=.4;
- }
- if(player[i].avoidcollided>1)player[i].avoidcollided=1;
- player[i].avoidcollided-=multiplier/4;
- if(!player[i].skeleton.free)player[i].stunned-=multiplier;
- if(!player[i].skeleton.free)player[i].surprised-=multiplier;
- if(player[i].surprised<=0&&player[i].aitype==attacktypecutoff&&i!=0&&!player[i].dead&&!player[i].skeleton.free&&animation[player[i].targetanimation].attack==neutral)numresponded=1;
-
- if(!player[i].throwkeydown){
- player[i].throwtogglekeydown=0;
- }
- if(player[i].throwkeydown&&!player[i].throwtogglekeydown){
- if(player[i].weaponactive==-1&&player[i].num_weapons<2&&(player[i].isIdle()||player[i].isCrouch()||player[i].targetanimation==sneakanim||player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim||player[i].isFlip()||player[i].isFlip()||player[i].aitype!=playercontrolled)){
- for(j=0;j<weapons.numweapons;j++){
- if(((weapons.velocity[j].x==0&&weapons.velocity[j].y==0&&weapons.velocity[j].z==0)||player[i].aitype==playercontrolled)&&weapons.owner[j]==-1&&player[i].weaponactive==-1)
- if(findDistancefastflat(&player[i].coords,&weapons.position[j])<2){
- if(findDistancefast(&player[i].coords,&weapons.position[j])<2){
- if(player[i].isCrouch()||player[i].targetanimation==sneakanim||player[i].isRun()||player[i].isIdle()||player[i].aitype!=playercontrolled){
- player[i].throwtogglekeydown=1;
- player[i].targetanimation=crouchremoveknifeanim;
- player[i].target=0;
- player[i].targetframe=0;
- rotatetarget=weapons.position[j]-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
- player[i].hasvictim=0;
- }
- if(player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim){
- player[i].throwtogglekeydown=1;
- player[i].hasvictim=0;
-
- //for(i=0;i<weapons.numweapons;i++){
- if((((weapons.velocity[j].x==0&&weapons.velocity[j].y==0&&weapons.velocity[j].z==0)||player[i].aitype==playercontrolled)&&weapons.owner[j]==-1)||(player[i].victim&&weapons.owner[j]==player[i].victim->id))
- if(findDistancefastflat(&player[i].coords,&weapons.position[j])<2&&player[i].weaponactive==-1){
- if(findDistancefast(&player[i].coords,&weapons.position[j])<1||player[i].victim){
- float gLoc[3];
- float vel[3];
- gLoc[0]=player[i].coords.x;
- gLoc[1]=player[i].coords.y;
- gLoc[2]=player[i].coords.z;
- vel[0]=player[i].velocity.x;
- vel[1]=player[i].velocity.y;
- vel[2]=player[i].velocity.z;
- if(weapons.type[j]!=staff){
- PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
- OPENAL_SetVolume(channels[knifedrawsound], 128);
- OPENAL_SetPaused(channels[knifedrawsound], false);
- }
-
- player[i].weaponactive=0;
- weapons.owner[j]=player[i].id;
- if(player[i].num_weapons>0){
- player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
- }
- player[i].num_weapons++;
- player[i].weaponids[0]=j;
- }
- }
- //}
- }
- }
- else if ((player[i].isIdle()||player[i].isFlip()||player[i].aitype!=playercontrolled)&&findDistancefast(&player[i].coords,&weapons.position[j])<5&&player[i].coords.y<weapons.position[j].y){
- if(!player[i].isFlip()){
- player[i].throwtogglekeydown=1;
- player[i].targetanimation=removeknifeanim;
- player[i].target=0;
- player[i].targetframe=0;
- rotatetarget=weapons.position[j]-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
- }
- if(player[i].isFlip()){
- player[i].throwtogglekeydown=1;
- player[i].hasvictim=0;
-
- for(k=0;k<weapons.numweapons;k++){
- if(player[i].weaponactive==-1)
- if((((weapons.velocity[k].x==0&&weapons.velocity[k].y==0&&weapons.velocity[k].z==0)||player[i].aitype==playercontrolled)&&weapons.owner[k]==-1)||(player[i].victim&&weapons.owner[k]==player[i].victim->id))
- if(findDistancefastflat(&player[i].coords,&weapons.position[k])<3&&player[i].weaponactive==-1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=player[i].coords.x;
- gLoc[1]=player[i].coords.y;
- gLoc[2]=player[i].coords.z;
- vel[0]=player[i].velocity.x;
- vel[1]=player[i].velocity.y;
- vel[2]=player[i].velocity.z;
- if(weapons.type[k]!=staff){
- PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
- OPENAL_SetVolume(channels[knifedrawsound], 128);
- OPENAL_SetPaused(channels[knifedrawsound], false);
- }
-
- player[i].weaponactive=0;
- weapons.owner[k]=player[i].id;
- if(player[i].num_weapons>0){
- player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
- }
- player[i].num_weapons++;
- player[i].weaponids[0]=k;
- }
- }
- }
- }
- }
- }
- if(player[i].isCrouch()||player[i].targetanimation==sneakanim||player[i].isRun()||player[i].isIdle()||player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim){
- if(numplayers>1)
- for(j=0;j<numplayers;j++){
- if(player[i].weaponactive==-1)
- if(j!=i)
- if(player[j].num_weapons&&player[j].skeleton.free&&findDistancefast(&player[i].coords,&player[j].coords)<2/*&&player[j].dead*/&&(((player[j].skeleton.forward.y<0&&player[j].weaponstuckwhere==0)||(player[j].skeleton.forward.y>0&&player[j].weaponstuckwhere==1))||player[j].weaponstuck==-1||player[j].num_weapons>1)){
- if(player[i].targetanimation!=rollanim&&player[i].targetanimation!=backhandspringanim){
- player[i].throwtogglekeydown=1;
- player[i].victim=&player[j];
- player[i].hasvictim=1;
- player[i].targetanimation=crouchremoveknifeanim;
- player[i].target=0;
- player[i].targetframe=0;
- rotatetarget=player[j].coords-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
- }
- if(player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim){
- player[i].throwtogglekeydown=1;
- player[i].victim=&player[j];
- player[i].hasvictim=1;
- int k = player[j].weaponids[0];
- if(player[i].hasvictim){
- float gLoc[3];
- float vel[3];
- gLoc[0]=player[i].coords.x;
- gLoc[1]=player[i].coords.y;
- gLoc[2]=player[i].coords.z;
- vel[0]=player[i].velocity.x;
- vel[1]=player[i].velocity.y;
- vel[2]=player[i].velocity.z;
- bool fleshstuck;
- fleshstuck=0;
- if(player[i].victim->weaponstuck!=-1){
- if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){
- fleshstuck=1;
- }
- }
- if(!fleshstuck){
- if(weapons.type[k]!=staff){
- PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
- OPENAL_SetVolume(channels[knifedrawsound], 128);
- OPENAL_SetPaused(channels[knifedrawsound], false);
- }
- }
- if(fleshstuck){
- PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
- OPENAL_SetVolume(channels[fleshstabremovesound], 128);
- OPENAL_SetPaused(channels[fleshstabremovesound], false);
- }
-
- player[i].weaponactive=0;
- if(weapons.owner[k]!=-1){
- if(player[i].victim->num_weapons==1)player[i].victim->num_weapons=0;
- else player[i].victim->num_weapons=1;
-
- player[i].victim->skeleton.longdead=0;
- player[i].victim->skeleton.free=1;
- player[i].victim->skeleton.broken=0;
-
- for(int l=0;l<player[i].victim->skeleton.num_joints;l++){
- player[i].victim->skeleton.joints[l].velchange=0;
- player[i].victim->skeleton.joints[l].locked=0;
- }
-
- XYZ relative;
- relative=0;
- relative.y=10;
- Normalise(&relative);
- XYZ footvel,footpoint;
- footvel=0;
- footpoint=weapons.position[k];
- if(player[i].victim->weaponstuck!=-1){
- if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){
- if(bloodtoggle)sprites.MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
- weapons.bloody[k]=2;
- weapons.blooddrip[k]=5;
- player[i].victim->weaponstuck=-1;
- player[i].victim->bloodloss+=2000;
- player[i].victim->DoDamage(2000);
- }
- }
- if(player[i].victim->num_weapons>0){
- if(player[i].victim->weaponstuck!=0&&player[i].victim->weaponstuck!=-1)player[i].victim->weaponstuck=0;
- if(player[i].victim->weaponids[0]==k)
- player[i].victim->weaponids[0]=player[i].victim->weaponids[player[i].victim->num_weapons];
- }
-
- player[i].victim->weaponactive=-1;
-
- player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[abdomen]].velocity+=relative*6;
- player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[neck]].velocity+=relative*6;
- player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[rightshoulder]].velocity+=relative*6;
- player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[leftshoulder]].velocity+=relative*6;
- }
- weapons.owner[k]=i;
- if(player[i].num_weapons>0){
- player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
- }
- player[i].num_weapons++;
- player[i].weaponids[0]=k;
- }
- }
- }
- }
- }
- }
- if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){
- if(weapons.type[player[i].weaponids[0]]==knife){
- if(player[i].isIdle()||player[i].isRun()||player[i].isCrouch()||player[i].targetanimation==sneakanim||player[i].isFlip())
- if(numplayers>1)
- for(j=0;j<numplayers;j++){
- if(i!=j)
- if(tutoriallevel!=1||tutorialstage==49)
- if(hostile)
- if(normaldotproduct(player[i].facing,player[i].coords-player[j].coords)<0&&findDistancefast(&player[i].coords,&player[j].coords)<100&&findDistancefast(&player[i].coords,&player[j].coords)>1.5&&!player[j].skeleton.free&&-1==checkcollide(DoRotation(player[j].skeleton.joints[player[j].skeleton.jointlabels[head]].position,0,player[j].rotation,0)*player[j].scale+player[j].coords,DoRotation(player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position,0,player[i].rotation,0)*player[i].scale+player[i].coords)){
- if(!player[i].isFlip()){
- player[i].throwtogglekeydown=1;
- player[i].victim=&player[j];
- player[i].targetanimation=knifethrowanim;
- player[i].target=0;
- player[i].targetframe=0;
- rotatetarget=player[j].coords-player[i].coords;
- Normalise(&rotatetarget);
- player[i].targetrotation=-asin(0-rotatetarget.x);
- player[i].targetrotation*=360/6.28;
- if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation;
-
- player[i].targettilt2=-asin(rotatetarget.y)*360/6.28;
- }
- if(player[i].isFlip()){
- if(player[i].weaponactive!=-1){
- player[i].throwtogglekeydown=1;
- player[i].victim=&player[j];
- XYZ aim;
- weapons.owner[player[i].weaponids[0]]=-1;
- aim=player[i].victim->coords+DoRotation(player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[abdomen]].position,0,player[i].victim->rotation,0)*player[i].victim->scale+player[i].victim->velocity*findDistance(&player[i].victim->coords,&player[i].coords)/50-(player[i].coords+DoRotation(player[i].skeleton.joints[player[i].skeleton.jointlabels[righthand]].position,0,player[i].rotation,0)*player[i].scale);
- Normalise(&aim);
-
- aim=DoRotation(aim,(float)abs(Random()%30)-15,(float)abs(Random()%30)-15,0);
-
- weapons.velocity[player[i].weaponids[0]]=aim*50;
- weapons.tipvelocity[player[i].weaponids[0]]=aim*50;
- weapons.missed[player[i].weaponids[0]]=0;
- weapons.freetime[player[i].weaponids[0]]=0;
- weapons.firstfree[player[i].weaponids[0]]=1;
- weapons.physics[player[i].weaponids[0]]=0;
- player[i].num_weapons--;
- if(player[i].num_weapons){
- player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons];
- }
- player[i].weaponactive=-1;
- }
- }
- }
- }
- }
- }
- if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){
- if(player[i].isCrouch()||player[i].targetanimation==sneakanim)
- {
- player[i].throwtogglekeydown=1;
- weapons.owner[player[i].weaponids[0]]=-1;
- weapons.velocity[player[i].weaponids[0]]=player[i].velocity*.2;
- if(weapons.velocity[player[i].weaponids[0]].x==0)weapons.velocity[player[i].weaponids[0]].x=.1;
- weapons.tipvelocity[player[i].weaponids[0]]=weapons.velocity[player[i].weaponids[0]];
- weapons.missed[player[i].weaponids[0]]=1;
- weapons.freetime[player[i].weaponids[0]]=0;
- weapons.firstfree[player[i].weaponids[0]]=1;
- weapons.physics[player[i].weaponids[0]]=1;
- player[i].num_weapons--;
- if(player[i].num_weapons){
- player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons];
- if(player[i].weaponstuck==player[i].num_weapons)player[i].weaponstuck=0;
- }
-
- player[i].weaponactive=-1;
- for(j=0;j<numplayers;j++){
- player[j].wentforweapon=0;
- }
- }
- }
-
- }
-
- if(i==0||!player[0].dead||player[i].weaponactive!=-1)
- if((player[i].drawkeydown&&!player[i].drawtogglekeydown)||(player[i].num_weapons==2&&player[i].weaponactive==-1&&player[i].isIdle())||(player[0].dead&&player[i].weaponactive!=-1&&i!=0)){
- //Setenvironment(1-environment);
- bool isgood;
- isgood=1;
- if(player[i].weaponactive!=-1){
- if(weapons.type[player[i].weaponids[player[i].weaponactive]]==staff)isgood=0;
- }
- if(/*(player[i].weaponactive==-1||player[i].num_weapons==1)&&*/isgood&&player[i].creature!=wolftype){
- if(player[i].isIdle()&&player[i].num_weapons&&weapons.type[player[i].weaponids[0]]==knife){
- player[i].targetanimation=drawrightanim;
- player[i].targetframe=0;
- player[i].target=0;
- player[i].drawtogglekeydown=1;
- }
- if((player[i].isIdle()||(player[i].aitype!=playercontrolled&&player[0].weaponactive!=-1&&player[i].isRun()))&&player[i].num_weapons&&weapons.type[player[i].weaponids[0]]==sword){
- player[i].targetanimation=drawleftanim;
- player[i].targetframe=0;
- player[i].target=0;
- player[i].drawtogglekeydown=1;
- }
- if(player[i].isCrouch()&&player[i].num_weapons&&weapons.type[player[i].weaponids[0]]==knife){
- player[i].targetanimation=crouchdrawrightanim;
- player[i].targetframe=0;
- player[i].target=0;
- player[i].drawtogglekeydown=1;
- }
- }
- }
- if(player[i].isCrouch()&&weapons.bloody[player[i].weaponids[player[i].weaponactive]]&&bloodtoggle&&player[i].onterrain&&player[i].num_weapons&&player[i].weaponactive!=-1&&player[i].attackkeydown){
- if(weapons.bloody[player[i].weaponids[player[i].weaponactive]]&&player[i].onterrain&&bloodtoggle&&musictype!=stream_music2){
- if(weapons.type[player[i].weaponids[player[i].weaponactive]]==knife)player[i].targetanimation=crouchstabanim;
- if(weapons.type[player[i].weaponids[player[i].weaponactive]]==sword)player[i].targetanimation=swordgroundstabanim;
- player[i].targetframe=0;
- player[i].target=0;
- player[i].hasvictim=0;
- //player[i].attacktogglekeydown=1;
- }
- }
-
- if(!player[i].drawkeydown){
- player[i].drawtogglekeydown=0;
- }
-
- if(i==0){
- absflatfacing=0;
- absflatfacing.z=-1;
-
- absflatfacing=DoRotation(absflatfacing,0,-rotation,0);
- }
- else absflatfacing=flatfacing;
-
- if(indialogue!=-1){
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].jumpkeydown=0;
- player[i].crouchkeydown=0;
- player[i].drawkeydown=0;
- player[i].throwkeydown=0;
- }
- movekey=0;
- //Do controls
- if(!animation[player[i].targetanimation].attack&&player[i].targetanimation!=staggerbackhighanim&&player[i].targetanimation!=staggerbackhardanim&&player[i].targetanimation!=backhandspringanim&&player[i].targetanimation!=dodgebackanim){
- if(!player[i].forwardkeydown){
- player[i].forwardstogglekeydown=0;
- }
- if(player[i].crouchkeydown){
- //Crouch
- target=-2;
- if(i==0){
- player[i].superruntoggle=1;
- if(numplayers>1)
- for(j=0;j<numplayers;j++){
- if(j!=i&&!player[j].skeleton.free&&player[j].aitype==passivetype){
- if(findDistancefast(&player[j].coords,&player[i].coords)<16){
- player[i].superruntoggle=0;
- }
- }
- }
- }
-
- if(numplayers>1)
- for(j=0;j<numplayers;j++){
- if(j!=i&&!player[j].skeleton.free&&player[j].victim&&player[i].lowreversaldelay<=0){
- if(findDistancefast(&player[j].coords,&player[j].victim->coords)<3&&player[j].victim==&player[i]&&(player[j].targetanimation==sweepanim||player[j].targetanimation==upunchanim||player[j].targetanimation==wolfslapanim||((player[j].targetanimation==swordslashanim||player[j].targetanimation==knifeslashstartanim||player[j].targetanimation==staffhitanim||player[j].targetanimation==staffspinhitanim)&&findDistancefast(&player[j].coords,&player[i].coords)<2))){
- if(target>=0)target=-1;
- else target=j;
- }
- }
- }
- if(target>=0)player[target].Reverse();
- player[i].lowreversaldelay=.5;
-
- if(player[i].isIdle()){
- player[i].targetanimation=player[i].getCrouch();
- player[i].target=0;
- player[i].targetframe=0;
- player[i].transspeed=10;
- }
- if(player[i].isRun()||(player[i].isStop()&&(player[i].leftkeydown||player[i].rightkeydown||player[i].forwardkeydown||player[i].backkeydown))){
- player[i].targetanimation=rollanim;
- player[i].target=0;
- player[i].targetframe=0;
- player[i].transspeed=20;
- }
- }
- if(!player[i].crouchkeydown){
- //Uncrouch
- if(!player[i].isRun()&&player[i].targetanimation!=sneakanim&&i==0)player[i].superruntoggle=0;
- target=-2;
- if(player[i].isCrouch()){
- if(numplayers>1)
- for(j=0;j<numplayers;j++){
- if(j!=i&&!player[j].skeleton.free&&player[j].victim&&player[i].highreversaldelay<=0){
- if(findDistancefast(&player[j].coords,&player[j].victim->coords)<3&&player[j].victim==&player[i]&&(player[j].targetanimation==spinkickanim)&&player[i].isCrouch()){
- if(target>=0)target=-1;
- else target=j;
- }
- }
- }
- if(target>=0)player[target].Reverse();
- player[i].highreversaldelay=.5;
-
- if(player[i].isCrouch()){
- if(!player[i].wasCrouch()){
- player[i].currentanimation=player[i].getCrouch();
- player[i].currentframe=0;
- }
- player[i].target=0;
- player[i].targetanimation=player[i].getIdle();
- player[i].targetframe=0;
- player[i].transspeed=10;
- }
- }
- if(player[i].targetanimation==sneakanim){
- player[i].targetanimation=player[i].getIdle();
- player[i].target=0;
- player[i].targetframe=0;
- player[i].transspeed=10;
- }
- }
- if(player[i].forwardkeydown){
- if(player[i].isIdle()||(player[i].isStop()&&player[i].targetrotation==player[i].rotation)||(player[i].isLanding()&&player[i].targetframe>0&&!player[i].jumpkeydown)||(player[i].isLandhard()&&player[i].targetframe>0&&!player[i].jumpkeydown&&player[i].crouchkeydown)){
- if(player[i].aitype==passivetype)player[i].targetanimation=walkanim;
- else player[i].targetanimation=player[i].getRun();
- player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].isCrouch()){
- player[i].targetanimation=sneakanim;
- if(player[i].wasCrouch())player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].targetanimation==hanganim/*&&(!player[i].forwardstogglekeydown||player[i].aitype!=playercontrolled)*/){
- player[i].targetanimation=climbanim;
- player[i].target=0;
- player[i].targetframe=1;
- player[i].jumpclimb=1;
- }
- if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){
- player[i].velocity+=absflatfacing*5*multiplier;
- }
- player[i].forwardstogglekeydown=1;
- movekey=1;
- }
- if (player[i].rightkeydown){
- if(player[i].isIdle()||(player[i].isStop()&&player[i].targetrotation==player[i].rotation)||(player[i].isLanding()&&player[i].targetframe>0&&!player[i].jumpkeydown)||(player[i].isLandhard()&&player[i].targetframe>0&&!player[i].jumpkeydown&&player[i].crouchkeydown)){
- player[i].targetanimation=player[i].getRun();
- player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].isCrouch()){
- player[i].targetanimation=sneakanim;
- if(player[i].wasCrouch()) player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){
- player[i].velocity+=DoRotation(absflatfacing*5*multiplier,0,-90,0);
- }
- player[i].targetrotation-=90;
- if(player[i].forwardkeydown)player[i].targetrotation+=45;
- if(player[i].backkeydown)player[i].targetrotation-=45;
- movekey=1;
- }
- if ( player[i].leftkeydown){
- if(player[i].isIdle()||(player[i].isStop()&&player[i].targetrotation==player[i].rotation)||(player[i].isLanding()&&player[i].targetframe>0&&!player[i].jumpkeydown)||(player[i].isLandhard()&&player[i].targetframe>0&&!player[i].jumpkeydown&&player[i].crouchkeydown)){
- player[i].targetanimation=player[i].getRun();
- player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].isCrouch()){
- player[i].targetanimation=sneakanim;
- if(player[i].wasCrouch())player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){
- player[i].velocity-=DoRotation(absflatfacing*5*multiplier,0,-90,0);
- }
- player[i].targetrotation+=90;
- if(player[i].forwardkeydown)player[i].targetrotation-=45;
- if(player[i].backkeydown)player[i].targetrotation+=45;
- movekey=1;
- }
- if(player[i].backkeydown){
- if(player[i].isIdle()||(player[i].isStop()&&player[i].targetrotation==player[i].rotation)||(player[i].isLanding()&&player[i].targetframe>0&&!player[i].jumpkeydown)||(player[i].isLandhard()&&player[i].targetframe>0&&!player[i].jumpkeydown&&player[i].crouchkeydown)){
- player[i].targetanimation=player[i].getRun();
- player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].isCrouch()){
- player[i].targetanimation=sneakanim;
- if(player[i].wasCrouch())player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){
- player[i].velocity-=absflatfacing*5*multiplier;
- }
- if(player[i].targetanimation==hanganim){
- player[i].currentanimation=jumpdownanim;
- player[i].targetanimation=jumpdownanim;
- player[i].target=0;
- player[i].currentframe=0;
- player[i].targetframe=1;
- player[i].velocity=0;
- player[i].velocity.y+=gravity;
- player[i].coords.y-=1.4;
- player[i].grabdelay=1;
- }
- if ( !player[i].leftkeydown&&!player[i].rightkeydown)
- player[i].targetrotation+=180;
- movekey=1;
- }
- if((player[i].jumpkeydown&&!player[i].jumpclimb)||player[i].jumpstart){
- if((((player[i].isLanding()&&player[i].targetframe>=3)||player[i].isRun()||player[i].targetanimation==walkanim||player[i].isCrouch()||player[i].targetanimation==sneakanim)&&player[i].jumppower>1)&&((player[i].targetanimation!=rabbitrunninganim&&player[i].targetanimation!=wolfrunninganim)||i!=0)){
- player[i].jumpstart=0;
- player[i].targetanimation=jumpupanim;
- player[i].target=0;
- player[i].targetframe=0;
- player[i].rotation=player[i].targetrotation;
- player[i].transspeed=20;
- player[i].FootLand(0,1);
- player[i].FootLand(1,1);
-
- facing=0;
- facing.z=-1;
- flatfacing=DoRotation(facing,0,player[i].targetrotation+180,0);
-
- if(movekey)player[i].velocity=flatfacing*player[i].speed*45*player[i].scale;
- if(!movekey)player[i].velocity=0;
-
- //Dodge sweep?
- target=-2;
- if(numplayers>1)
- for(j=0;j<numplayers;j++){
- if(j!=i&&!player[j].skeleton.free&&player[j].victim){
- if(findDistancefast(&player[j].coords,&player[j].victim->coords)<3&&player[j].victim==&player[i]&&(player[j].targetanimation==sweepanim)){
- if(target>=0)target=-1;
- else target=j;
- }
- }
- }
- if(target>=0)player[i].velocity.y=1;
- else if(player[i].crouchkeydown||player[i].aitype!=playercontrolled){
- player[i].velocity.y=7;
- player[i].crouchtogglekeydown=1;
- }
- else player[i].velocity.y=5;
-
- if(mousejump&&i==0&&debugmode){
- if(!player[i].isLanding())player[i].tempdeltav=deltav;
- if(player[i].tempdeltav<0)player[i].velocity.y-=(float)(player[i].tempdeltav)/multiplier/1000;
- }
-
- player[i].coords.y+=.2;
- player[i].jumppower-=1;
-
- static float gLoc[3];
- static float vel[3];
- gLoc[0]=player[i].coords.x;
- gLoc[1]=player[i].coords.y;
- gLoc[2]=player[i].coords.z;
- vel[0]=player[i].velocity.x;
- vel[1]=player[i].velocity.y;
- vel[2]=player[i].velocity.z;
-
- if(i==0){
- PlaySoundEx( whooshsound, samp[whooshsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel);
- OPENAL_SetVolume(channels[whooshsound], 128);
- OPENAL_SetPaused(channels[whooshsound], false);
- }
-
- PlaySoundEx( jumpsound, samp[jumpsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[jumpsound], gLoc, vel);
- OPENAL_SetVolume(channels[jumpsound], 128);
- OPENAL_SetPaused(channels[jumpsound], false);
- }
- if((player[i].isIdle())&&player[i].jumppower>1){
- player[i].targetanimation=player[i].getLanding();
- player[i].landhard=0;
- player[i].target=0;
- player[i].targetframe=2;
- player[i].jumpstart=1;
- player[i].tempdeltav=deltav;
- }
- if(player[i].targetanimation==jumpupanim&&(((!floatjump&&!editorenabled)||!debugmode)||player[i].aitype!=playercontrolled)){
- if(player[i].jumppower>multiplier*6){
- player[i].velocity.y+=multiplier*6;
- player[i].jumppower-=multiplier*6;
- }
- if(player[i].jumppower<=multiplier*6){
- player[i].velocity.y+=player[i].jumppower;
- player[i].jumppower=0;
- }
- }
- if(((floatjump||editorenabled)&&debugmode)&&i==0)player[i].velocity.y+=multiplier*30;
- }
-
- if(!movekey){
- if(player[i].isRun()||player[i].targetanimation==walkanim){
- player[i].targetanimation=player[i].getStop();
- player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].targetanimation==sneakanim){
- player[i].targetanimation=player[i].getCrouch();
- if(player[i].currentanimation==sneakanim)player[i].target=0;
- player[i].targetframe=0;
- }
- }
- if(player[i].targetanimation==walkanim&&(player[i].aitype==attacktypecutoff||player[i].aitype==searchtype||(player[i].aitype==passivetype&&player[i].numwaypoints<=1))){
- player[i].targetanimation=player[i].getStop();
- player[i].target=0;
- player[i].targetframe=0;
- }
- if(player[i].isRun()&&(player[i].aitype==passivetype)){
- player[i].targetanimation=player[i].getStop();
- player[i].target=0;
- player[i].targetframe=0;
- }
- }
- }
- if(player[i].targetanimation==rollanim)player[i].targetrotation=oldtargetrotation;
- }
-
- //Rotation
- for(k=0;k<numplayers;k++){
- if(abs(player[k].rotation-player[k].targetrotation)>180){
- if(player[k].rotation>player[k].targetrotation)player[k].rotation-=360;
- else player[k].rotation+=360;
- }
-
- if(abs(player[k].rotation-player[k].targetrotation)>90&&(player[k].isRun()||player[k].targetanimation==walkanim)){
- player[k].targetanimation=player[k].getStop();
- player[k].targetframe=0;
- player[k].target=0;
- }
-
- if(player[k].targetanimation==backhandspringanim||player[k].targetanimation==dodgebackanim){
- player[k].targettilt=0;
- }
- if(player[k].targetanimation!=jumpupanim&&player[k].targetanimation!=backhandspringanim&&player[k].targetanimation!=jumpdownanim&&!player[k].isFlip()){
- player[k].targettilt=0;
- if(player[k].jumppower<0&&!player[k].jumpkeydown)player[k].jumppower=0;
- player[k].jumppower+=multiplier*7;
- if(player[k].isCrouch())player[k].jumppower+=multiplier*7;
- //*(1-(player[k].damage/player[k].damagetolerance))
- if(player[k].jumppower>5)player[k].jumppower=5;
- }
-
- if(player[k].isRun()){
- player[k].targettilt=(player[k].rotation-player[k].targetrotation)/4;
- }
-
- if(abs(player[k].tilt-player[k].targettilt)<multiplier*150)player[k].tilt=player[k].targettilt;
- else if(player[k].tilt>player[k].targettilt){
- player[k].tilt-=multiplier*150;
- }
- else if(player[k].tilt<player[k].targettilt){
- player[k].tilt+=multiplier*150;
- }
-
- player[k].grabdelay-=multiplier;
- }
-
- for(k=0;k<numplayers;k++){
- player[k].DoAnimations();
- player[k].whichpatchx=player[k].coords.x/(terrain.size/subdivision*terrain.scale*terraindetail);
- player[k].whichpatchz=player[k].coords.z/(terrain.size/subdivision*terrain.scale*terraindetail);
- }
-
- objects.DoStuff();
-
- if(numenvsounds!=0)
- for(j=numenvsounds-1;j>=0;j--){
- envsoundlife[j]-=multiplier;
- if(envsoundlife[j]<0){
- numenvsounds--;
- envsoundlife[j]=envsoundlife[numenvsounds];
- envsound[j]=envsound[numenvsounds];
- }
- }
- if(!slomo)OPENAL_SetFrequency(OPENAL_ALL, 22050);
- if(slomo)OPENAL_SetFrequency(OPENAL_ALL, slomofreq);
-
- if(tutoriallevel==1){
- XYZ temp;
- XYZ temp2;
- XYZ temp3;
- XYZ oldtemp;
- XYZ oldtemp2;
- temp.x=1011;
- temp.y=84;
- temp.z=491;
- temp2.x=1025;
- temp2.y=75;
- temp2.z=447;
- temp3.x=1038;
- temp3.y=76;
- temp3.z=453;
- oldtemp=temp;
- oldtemp2=temp2;
- if(tutorialstage>=51)
- if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){
- OPENAL_StopSound(OPENAL_ALL); // hack...OpenAL renderer isn't stopping music after tutorial goes to level menu...
- OPENAL_SetFrequency(OPENAL_ALL, 0.001);
-
- PlayStreamEx( stream_music3, strm[stream_music3], NULL, true);
- OPENAL_SetPaused(channels[stream_music3], false);
- OPENAL_SetVolume(channels[stream_music3], 256);
-
- gameon=0;
- mainmenu=5;
-
- float gLoc[3]={0,0,0};
- float vel[3]={0,0,0};
- OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
- PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
- OPENAL_SetVolume(channels[fireendsound], 256);
- OPENAL_SetPaused(channels[fireendsound], false);
- OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-
- flash();
- }
- if(tutorialstage<51)
- if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){
- float gLoc[3];
- float vel[3];
- gLoc[0]=player[0].coords.x;
- gLoc[1]=player[0].coords.y;
- gLoc[2]=player[0].coords.z;
- vel[0]=0;
- vel[1]=0;
- vel[2]=0;
- PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
- OPENAL_SetVolume(channels[fireendsound], 256);
- OPENAL_SetPaused(channels[fireendsound], false);
-
- player[0].coords=(oldtemp+oldtemp2)/2;
-
- flash();
- }
- if(tutorialstage>=14&&tutorialstage<50)
- if(findDistancefast(&temp,&player[1].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[1].coords)<4){
- float gLoc[3];
- float vel[3];
- gLoc[0]=player[1].coords.x;
- gLoc[1]=player[1].coords.y;
- gLoc[2]=player[1].coords.z;
- vel[0]=0;
- vel[1]=0;
- vel[2]=0;
- PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
- OPENAL_SetVolume(channels[fireendsound], 256);
- OPENAL_SetPaused(channels[fireendsound], false);
-
- for(int i=0;i<player[1].skeleton.num_joints;i++){
- if(Random()%2==0){
- if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
- if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
- if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].rotation,0)*player[1].scale+player[1].coords;
- if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
- sprites.MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
- }
- }
-
- player[1].coords=(oldtemp+oldtemp2)/2;
- for(int i=0;i<player[1].skeleton.num_joints;i++){
- player[1].skeleton.joints[i].velocity=0;
- if(Random()%2==0){
- if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
- if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
- if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].rotation,0)*player[1].scale+player[1].coords;
- if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
- sprites.MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
- }
- }
- }
- }
-
-
- //3d sound
- static float gLoc[3];
- gLoc[0]=viewer.x;
- gLoc[1]=viewer.y;
- gLoc[2]=viewer.z;
- static float vel[3];
- vel[0]=(viewer.x-oldviewer.x)/multiplier;
- vel[1]=(viewer.y-oldviewer.y)/multiplier;
- vel[2]=(viewer.z-oldviewer.z)/multiplier;
-
- //Set orientation with forward and up vectors
- static XYZ upvector;
- upvector=0;
- upvector.z=-1;
-
- upvector=DoRotation(upvector,-rotation2+90,0,0);
- upvector=DoRotation(upvector,0,0-rotation,0);
-
- facing=0;
- facing.z=-1;
-
- facing=DoRotation(facing,-rotation2,0,0);
- facing=DoRotation(facing,0,0-rotation,0);
-
-
- static float ori[6];
- ori[0] = -facing.x;
- ori[1] = facing.y;
- ori[2] = -facing.z;
- ori[3] = -upvector.x;
- ori[4] = upvector.y;
- ori[5] = -upvector.z;
-
- OPENAL_3D_Listener_SetAttributes(&gLoc[0], &vel[0], ori[0], ori[1], ori[2], ori[3], ori[4], ori[5]);
- OPENAL_Update();
-
- oldviewer=viewer;
+ if(talkdelay<=0&&indialogue==-1&&animation[player[0].targetanimation].height!=highheight)
+ for(int i=0;i<numdialogues;i++){
+ int realdialoguetype;
+ bool special;
+ if(dialoguetype[i]>49){
+ realdialoguetype=dialoguetype[i]-50;
+ special=1;
+ }
+ else if(dialoguetype[i]>39){
+ realdialoguetype=dialoguetype[i]-40;
+ special=1;
+ }
+ else if(dialoguetype[i]>29){
+ realdialoguetype=dialoguetype[i]-30;
+ special=1;
+ }
+ else if(dialoguetype[i]>19){
+ realdialoguetype=dialoguetype[i]-20;
+ special=1;
+ }
+ else if(dialoguetype[i]>9){
+ realdialoguetype=dialoguetype[i]-10;
+ special=1;
+ }
+ else {
+ realdialoguetype=dialoguetype[i];
+ special=0;
+ }
+ if((!hostile||dialoguetype[i]>40&&dialoguetype[i]<50)&&
+ realdialoguetype<numplayers&&
+ realdialoguetype>0&&
+ (dialoguegonethrough[i]==0||!special)&&
+ (special||Input::isKeyPressed(attackkey))){
+ if(findDistancefast(&player[0].coords,&player[realdialoguetype].coords)<6||
+ player[realdialoguetype].howactive>=typedead1||
+ dialoguetype[i]>40&&dialoguetype[i]<50){
+ whichdialogue=i;
+ for(int j=0;j<numdialogueboxes[whichdialogue];j++){
+ player[participantfocus[whichdialogue][j]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].rotation=participantrotation[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].targetrotation=participantrotation[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].velocity=0;
+ player[participantfocus[whichdialogue][j]].targetanimation=player[participantfocus[whichdialogue][j]].getIdle();
+ player[participantfocus[whichdialogue][j]].targetframe=0;
+ }
+ directing=0;
+ indialogue=0;
+ dialoguetime=0;
+ dialoguegonethrough[i]++;
+ if(dialogueboxsound[whichdialogue][indialogue]!=0){
+ playdialogueboxsound();
+ }
+ }
+ }
+ }
+
+ windvar+=multiplier;
+ smoketex+=multiplier;
+ tutorialstagetime+=multiplier;
+
+ //hotspots
+ static float hotspotvisual[40];
+ if(numhotspots){
+ XYZ hotspotsprite;
+ if(editorenabled)
+ for(int i=0;i<numhotspots;i++)
+ hotspotvisual[i]-=multiplier/320;
+
+ for(int i=0;i<numhotspots;i++){
+ //if(hotspottype[i]<=10)
+ while(hotspotvisual[i]<0){
+ hotspotsprite=0;
+ hotspotsprite.x=float(abs(Random()%100000))/100000*hotspotsize[i];
+ hotspotsprite=DoRotation(hotspotsprite,0,0,Random()%360);
+ hotspotsprite=DoRotation(hotspotsprite,0,Random()%360,0);
+ hotspotsprite+=hotspot[i];
+ Sprite::MakeSprite(breathsprite, hotspotsprite, hotspotsprite*0, 1,0.5,0, 7, 0.4);
+ hotspotvisual[i]+=0.1/hotspotsize[i]/hotspotsize[i]/hotspotsize[i];
+ }
+ }
+
+ for(int i=0;i<numhotspots;i++){
+ if(hotspottype[i]<=10&&hotspottype[i]>0){
+ hotspot[i]=player[hotspottype[i]].coords;
+ }
+ }
+ }
+
+ //Tutorial
+ if(tutoriallevel){
+ doTutorial();
+ }
+
+ //bonuses
+ if(tutoriallevel!=1){
+ if(bonustime==0&&
+ bonus!=solidhit&&
+ bonus!=spinecrusher&&
+ bonus!=tracheotomy&&
+ bonus!=backstab&&
+ bonusvalue>10){
+ emit_sound_np(consolesuccesssound);
+ }
+ } else if(bonustime==0){
+ emit_sound_np(fireendsound);
+ }
+ if(bonustime==0){
+ if(bonus!=solidhit&&
+ bonus!=twoxcombo&&
+ bonus!=threexcombo&&
+ bonus!=fourxcombo&&
+ bonus!=megacombo)
+ bonusnum[bonus]++;
+ else
+ bonusnum[bonus]+=0.15;
+ if(tutoriallevel)
+ bonusvalue=0;
+ bonusvalue/=bonusnum[bonus];
+ bonustotal+=bonusvalue;
+ }
+ bonustime+=multiplier;
+
+ //snow effects
+ if(environment==snowyenvironment){
+ precipdelay-=multiplier;
+ while(precipdelay<0){
+ precipdelay+=.04;
+ if(!detail)
+ precipdelay+=.04;
+ XYZ footvel,footpoint;
+
+ footvel=0;
+ footpoint=viewer+viewerfacing*6;
+ footpoint.y+=((float)abs(Random()%1200))/100-6;
+ footpoint.x+=((float)abs(Random()%1200))/100-6;
+ footpoint.z+=((float)abs(Random()%1200))/100-6;
+ Sprite::MakeSprite(snowsprite, footpoint,footvel, 1,1,1, .1, 1);
+ }
+ }
+
+
+ doAerialAcrobatics();
+
+
+ static XYZ oldviewer;
+
+ //control keys
+ if(indialogue==-1){
+ player[0].forwardkeydown=Input::isKeyDown(forwardkey);
+ player[0].leftkeydown=Input::isKeyDown(leftkey);
+ player[0].backkeydown=Input::isKeyDown(backkey);
+ player[0].rightkeydown=Input::isKeyDown(rightkey);
+ player[0].jumpkeydown=Input::isKeyDown(jumpkey);
+ player[0].crouchkeydown=Input::isKeyDown(crouchkey);
+ player[0].drawkeydown=Input::isKeyDown(drawkey);
+ player[0].throwkeydown=Input::isKeyDown(throwkey);
+ }
+ else
+ {
+ player[0].forwardkeydown=0;
+ player[0].leftkeydown=0;
+ player[0].backkeydown=0;
+ player[0].rightkeydown=0;
+ player[0].jumpkeydown=0;
+ player[0].crouchkeydown=0;
+ player[0].drawkeydown=0;
+ player[0].throwkeydown=0;
+ }
+
+ if(!player[0].jumpkeydown)
+ player[0].jumpclimb=0;
+
+
+ if(indialogue!=-1){
+ cameramode=1;
+ if(directing){
+ facing=0;
+ facing.z=-1;
+
+ facing=DoRotation(facing,-rotation2,0,0);
+ facing=DoRotation(facing,0,0-rotation,0);
+
+ flatfacing=0;
+ flatfacing.z=-1;
+
+ flatfacing=DoRotation(flatfacing,0,-rotation,0);
+
+ if(Input::isKeyDown(forwardkey))
+ viewer+=facing*multiplier*4;
+ if(Input::isKeyDown(backkey))
+ viewer-=facing*multiplier*4;
+ if(Input::isKeyDown(leftkey))
+ viewer+=DoRotation(flatfacing*multiplier,0,90,0)*4;
+ if(Input::isKeyDown(rightkey))
+ viewer+=DoRotation(flatfacing*multiplier,0,-90,0)*4;
+ if(Input::isKeyDown(jumpkey))
+ viewer.y+=multiplier*4;
+ if(Input::isKeyDown(crouchkey))
+ viewer.y-=multiplier*4;
+ if( Input::isKeyPressed(SDLK_1)||
+ Input::isKeyPressed(SDLK_2)||
+ Input::isKeyPressed(SDLK_3)||
+ Input::isKeyPressed(SDLK_4)||
+ Input::isKeyPressed(SDLK_5)||
+ Input::isKeyPressed(SDLK_6)||
+ Input::isKeyPressed(SDLK_7)||
+ Input::isKeyPressed(SDLK_8)||
+ Input::isKeyPressed(SDLK_9)||
+ Input::isKeyPressed(SDLK_0)||
+ Input::isKeyPressed(SDLK_MINUS)){
+ int whichend;
+ if(Input::isKeyPressed(SDLK_1))whichend=1;
+ if(Input::isKeyPressed(SDLK_2))whichend=2;
+ if(Input::isKeyPressed(SDLK_3))whichend=3;
+ if(Input::isKeyPressed(SDLK_4))whichend=4;
+ if(Input::isKeyPressed(SDLK_5))whichend=5;
+ if(Input::isKeyPressed(SDLK_6))whichend=6;
+ if(Input::isKeyPressed(SDLK_7))whichend=7;
+ if(Input::isKeyPressed(SDLK_8))whichend=8;
+ if(Input::isKeyPressed(SDLK_9))whichend=9;
+ if(Input::isKeyPressed(SDLK_0))whichend=0;
+ if(Input::isKeyPressed(SDLK_MINUS))
+ whichend=-1;
+ if(whichend!=-1){
+ participantfocus[whichdialogue][indialogue]=whichend;
+ participantlocation[whichdialogue][whichend]=player[whichend].coords;
+ participantrotation[whichdialogue][whichend]=player[whichend].rotation;
+ }
+ if(whichend==-1){
+ participantfocus[whichdialogue][indialogue]=-1;
+ }
+ if(player[participantfocus[whichdialogue][indialogue]].dead){
+ indialogue=-1;
+ directing=0;
+ cameramode=0;
+ }
+ dialoguecamera[whichdialogue][indialogue]=viewer;
+ dialoguecamerarotation[whichdialogue][indialogue]=rotation;
+ dialoguecamerarotation2[whichdialogue][indialogue]=rotation2;
+ indialogue++;
+ if(indialogue<numdialogueboxes[whichdialogue]){
+ if(dialogueboxsound[whichdialogue][indialogue]!=0){
+ playdialogueboxsound();
+ }
+ }
+
+ for(int j=0;j<numplayers;j++){
+ participantfacing[whichdialogue][indialogue][j]=participantfacing[whichdialogue][indialogue-1][j];
+ }
+ }
+ //TODO: should these be KeyDown or KeyPressed?
+ if( Input::isKeyDown(SDLK_KP1)||
+ Input::isKeyDown(SDLK_KP2)||
+ Input::isKeyDown(SDLK_KP3)||
+ Input::isKeyDown(SDLK_KP4)||
+ Input::isKeyDown(SDLK_KP5)||
+ Input::isKeyDown(SDLK_KP6)||
+ Input::isKeyDown(SDLK_KP7)||
+ Input::isKeyDown(SDLK_KP8)||
+ Input::isKeyDown(SDLK_KP9)||
+ Input::isKeyDown(SDLK_KP0)){
+ int whichend;
+ if(Input::isKeyDown(SDLK_KP1))whichend=1;
+ if(Input::isKeyDown(SDLK_KP2))whichend=2;
+ if(Input::isKeyDown(SDLK_KP3))whichend=3;
+ if(Input::isKeyDown(SDLK_KP4))whichend=4;
+ if(Input::isKeyDown(SDLK_KP5))whichend=5;
+ if(Input::isKeyDown(SDLK_KP6))whichend=6;
+ if(Input::isKeyDown(SDLK_KP7))whichend=7;
+ if(Input::isKeyDown(SDLK_KP8))whichend=8;
+ if(Input::isKeyDown(SDLK_KP9))whichend=9;
+ if(Input::isKeyDown(SDLK_KP0))whichend=0;
+ participantfacing[whichdialogue][indialogue][whichend]=facing;
+ }
+ if(indialogue>=numdialogueboxes[whichdialogue]){
+ indialogue=-1;
+ directing=0;
+ cameramode=0;
+ }
+ }
+ if(!directing){
+ pause_sound(whooshsound);
+ viewer=dialoguecamera[whichdialogue][indialogue];
+ viewer.y=max((double)viewer.y,terrain.getHeight(viewer.x,viewer.z)+.1);
+ rotation=dialoguecamerarotation[whichdialogue][indialogue];
+ rotation2=dialoguecamerarotation2[whichdialogue][indialogue];
+ if(dialoguetime>0.5)
+ if( Input::isKeyPressed(SDLK_1)||
+ Input::isKeyPressed(SDLK_2)||
+ Input::isKeyPressed(SDLK_3)||
+ Input::isKeyPressed(SDLK_4)||
+ Input::isKeyPressed(SDLK_5)||
+ Input::isKeyPressed(SDLK_6)||
+ Input::isKeyPressed(SDLK_7)||
+ Input::isKeyPressed(SDLK_8)||
+ Input::isKeyPressed(SDLK_9)||
+ Input::isKeyPressed(SDLK_0)||
+ Input::isKeyPressed(SDLK_MINUS)||
+ Input::isKeyPressed(attackkey)){
+ indialogue++;
+ if(indialogue<numdialogueboxes[whichdialogue]){
+ if(dialogueboxsound[whichdialogue][indialogue]!=0){
+ playdialogueboxsound();
+ if(dialogueboxsound[whichdialogue][indialogue]==-5){
+ hotspot[numhotspots]=player[0].coords;
+ hotspotsize[numhotspots]=10;
+ hotspottype[numhotspots]=-1;
+
+ numhotspots++;
+ }
+ if(dialogueboxsound[whichdialogue][indialogue]==-6){
+ hostile=1;
+ }
+
+ if(player[participantfocus[whichdialogue][indialogue]].dead){
+ indialogue=-1;
+ directing=0;
+ cameramode=0;
+ }
+ }
+ }
+ }
+ if(indialogue>=numdialogueboxes[whichdialogue]){
+ indialogue=-1;
+ directing=0;
+ cameramode=0;
+ if(dialoguetype[whichdialogue]>19&&dialoguetype[whichdialogue]<30){
+ hostile=1;
+ }
+ if(dialoguetype[whichdialogue]>29&&dialoguetype[whichdialogue]<40){
+ windialogue=1;
+ }
+ if(dialoguetype[whichdialogue]>49&&dialoguetype[whichdialogue]<60){
+ hostile=1;
+ for(int i=1;i<numplayers;i++){
+ player[i].aitype = attacktypecutoff;
+ }
+ }
+ }
+ }
+ }
+
+ static float keyrefreshdelay=0,bigrefreshdelay=0;
+
+ if(!player[0].jumpkeydown){
+ player[0].jumptogglekeydown=0;
+ }
+ if(player[0].jumpkeydown&&
+ player[0].targetanimation!=jumpupanim&&
+ player[0].targetanimation!=jumpdownanim&&
+ !player[0].isFlip())
+ player[0].jumptogglekeydown=1;
+
+
+ dialoguetime+=multiplier;
+ hawkrotation+=multiplier*25;
+ realhawkcoords=0;
+ realhawkcoords.x=25;
+ realhawkcoords=DoRotation(realhawkcoords,0,hawkrotation,0)+hawkcoords;
+ hawkcalldelay-=multiplier/2;
+
+ if(hawkcalldelay<=0){
+ emit_sound_at(hawksound, realhawkcoords);
+
+ hawkcalldelay=16+abs(Random()%8);
+ }
+ static float temptexdetail;
+
+
+ doDebugKeys();
+
+ doAttacks();
+
+ doPlayerCollisions();
+
+ doJumpReversals();
+
+ for(int k=0;k<numplayers;k++)
+ if(k!=0&&player[k].immobile)
+ player[k].coords=player[k].realoldcoords;
+
+ for(int k=0;k<numplayers;k++){
+ if(!isnormal(player[k].coords.x)||!isnormal(player[k].coords.y)||!isnormal(player[k].coords.z)){
+ if(!isnormal(player[k].coords.x)||!isnormal(player[k].coords.y)||!isnormal(player[k].coords.z)){
+ player[k].DoDamage(1000);
+ }
+ }
+ }
+
+ //respawn
+ static bool respawnkeydown;
+ if(!editorenabled&&
+ (whichlevel!=-2&&
+ (Input::isKeyDown(SDLK_z)&&
+ Input::isKeyDown(SDLK_LMETA)&&
+ debugmode)||
+ (Input::isKeyDown(jumpkey)&&
+ !respawnkeydown&&
+ !oldattackkey&&
+ player[0].dead))){
+ targetlevel=whichlevel;
+ loading=1;
+ leveltime=5;
+ }
+ if(!Input::isKeyDown(jumpkey))
+ respawnkeydown=0;
+ if(Input::isKeyDown(jumpkey))
+ respawnkeydown=1;
+
+
+
+
+ static bool movekey;
+
+ //?
+ for(int i=0;i<numplayers;i++){
+ static float oldtargetrotation;
+ if(!player[i].skeleton.free){
+ oldtargetrotation=player[i].targetrotation;
+ if(i==0&&indialogue==-1){
+ //TODO: refactor repetitive code
+ if(!animation[player[0].targetanimation].attack&&
+ player[0].targetanimation!=staggerbackhighanim&&
+ player[0].targetanimation!=staggerbackhardanim&&
+ player[0].targetanimation!=crouchremoveknifeanim&&
+ player[0].targetanimation!=removeknifeanim&&
+ player[0].targetanimation!=backhandspringanim&&
+ player[0].targetanimation!=dodgebackanim&&
+ player[0].targetanimation!=walljumprightkickanim&&
+ player[0].targetanimation!=walljumpleftkickanim){
+ if(cameramode)
+ player[0].targetrotation=0;
+ else
+ player[0].targetrotation=-rotation+180;
+ }
+
+ facing=0;
+ facing.z=-1;
+
+ flatfacing=DoRotation(facing,0,player[i].rotation+180,0);
+ if(cameramode){
+ facing=flatfacing;
+ }else{
+ facing=DoRotation(facing,-rotation2,0,0);
+ facing=DoRotation(facing,0,0-rotation,0);
+ }
+
+ player[0].lookrotation=-rotation;
+
+ player[i].targetheadrotation=rotation;
+ player[i].targetheadrotation2=rotation2;
+ }
+ if(i!=0&&player[i].aitype==playercontrolled&&indialogue==-1){
+ if(!animation[player[i].targetanimation].attack&&
+ player[i].targetanimation!=staggerbackhighanim&&
+ player[i].targetanimation!=staggerbackhardanim&&
+ player[i].targetanimation!=crouchremoveknifeanim&&
+ player[i].targetanimation!=removeknifeanim&&
+ player[i].targetanimation!=backhandspringanim&&
+ player[i].targetanimation!=dodgebackanim&&
+ player[i].targetanimation!=walljumprightkickanim&&
+ player[i].targetanimation!=walljumpleftkickanim){
+ player[i].targetrotation=-player[i].lookrotation+180;
+ }
+
+ facing=0;
+ facing.z=-1;
+
+ flatfacing=DoRotation(facing,0,player[i].rotation+180,0);
+
+ facing=DoRotation(facing,-player[i].lookrotation2,0,0);
+ facing=DoRotation(facing,0,0-player[i].lookrotation,0);
+
+ player[i].targetheadrotation=player[i].lookrotation;
+ player[i].targetheadrotation2=player[i].lookrotation2;
+ }
+ if(indialogue!=-1){
+ player[i].targetheadrotation=180-roughDirection(participantfacing[whichdialogue][indialogue][i]);
+ player[i].targetheadrotation2=pitch(participantfacing[whichdialogue][indialogue][i]);
+ }
+
+ bool pause;
+
+ if(leveltime<.5)
+ numenvsounds=0;
+
+ player[i].avoidsomething=0;
+
+ //avoid flaming things
+ for(int j=0;j<objects.numobjects;j++)
+ if(objects.onfire[j])
+ if(findDistancefast(&player[i].coords,&objects.position[j])<sq(objects.scale[j])*200)
+ if( findDistancefast(&player[i].coords,&objects.position[j])<
+ findDistancefast(&player[i].coords,&player[0].coords)){
+ player[i].collided=0;
+ player[i].avoidcollided=1;
+ if(player[i].avoidsomething==0||
+ findDistancefast(&player[i].coords,&objects.position[j])<
+ findDistancefast(&player[i].coords,&player[i].avoidwhere)){
+ player[i].avoidwhere=objects.position[j];
+ player[i].avoidsomething=1;
+ }
+ }
+
+ //avoid flaming players
+ for(int j=0;j<numplayers;j++)
+ if(player[j].onfire)
+ if(findDistancefast(&player[j].coords,&player[i].coords)<sq(0.3)*200)
+ if( findDistancefast(&player[i].coords,&player[j].coords)<
+ findDistancefast(&player[i].coords,&player[0].coords)){
+ player[i].collided=0;
+ player[i].avoidcollided=1;
+ if(player[i].avoidsomething==0||
+ findDistancefast(&player[i].coords,&player[j].coords)<
+ findDistancefast(&player[i].coords,&player[i].avoidwhere)){
+ player[i].avoidwhere=player[j].coords;
+ player[i].avoidsomething=1;
+ }
+ }
+
+ if(player[i].collided>.8)
+ player[i].avoidcollided=0;
+
+ doAI(i);
+
+ if(animation[player[i].targetanimation].attack==reversed){
+ //player[i].targetrotation=player[i].rotation;
+ player[i].forwardkeydown=0;
+ player[i].leftkeydown=0;
+ player[i].backkeydown=0;
+ player[i].rightkeydown=0;
+ player[i].jumpkeydown=0;
+ player[i].attackkeydown=0;
+ //player[i].crouchkeydown=0;
+ player[i].throwkeydown=0;
+ }
+
+ if(indialogue!=-1){
+ player[i].forwardkeydown=0;
+ player[i].leftkeydown=0;
+ player[i].backkeydown=0;
+ player[i].rightkeydown=0;
+ player[i].jumpkeydown=0;
+ player[i].crouchkeydown=0;
+ player[i].drawkeydown=0;
+ player[i].throwkeydown=0;
+ }
+
+ if(player[i].collided<-.3)
+ player[i].collided=-.3;
+ if(player[i].collided>1)
+ player[i].collided=1;
+ player[i].collided-=multiplier*4;
+ player[i].whichdirectiondelay-=multiplier;
+ if(player[i].avoidcollided<-.3||player[i].whichdirectiondelay<=0){
+ player[i].avoidcollided=-.3;
+ player[i].whichdirection=abs(Random()%2);
+ player[i].whichdirectiondelay=.4;
+ }
+ if(player[i].avoidcollided>1)
+ player[i].avoidcollided=1;
+ player[i].avoidcollided-=multiplier/4;
+ if(!player[i].skeleton.free){
+ player[i].stunned-=multiplier;
+ player[i].surprised-=multiplier;
+ }
+ if(i!=0&&player[i].surprised<=0&&
+ player[i].aitype==attacktypecutoff&&
+ !player[i].dead&&
+ !player[i].skeleton.free&&
+ animation[player[i].targetanimation].attack==neutral)
+ numresponded=1;
+
+ if(!player[i].throwkeydown)
+ player[i].throwtogglekeydown=0;
+
+ //pick up weapon
+ if(player[i].throwkeydown&&!player[i].throwtogglekeydown){
+ if(player[i].weaponactive==-1&&
+ player[i].num_weapons<2&&
+ (player[i].isIdle()||
+ player[i].isCrouch()||
+ player[i].targetanimation==sneakanim||
+ player[i].targetanimation==rollanim||
+ player[i].targetanimation==backhandspringanim||
+ player[i].isFlip()||
+ player[i].isFlip()||
+ player[i].aitype!=playercontrolled)){
+ for(int j=0;j<weapons.numweapons;j++){
+ if((weapons.velocity[j].x==0&&weapons.velocity[j].y==0&&weapons.velocity[j].z==0||
+ player[i].aitype==playercontrolled)&&
+ weapons.owner[j]==-1&&
+ player[i].weaponactive==-1)
+ if(findDistancefastflat(&player[i].coords,&weapons.position[j])<2){
+ if(findDistancefast(&player[i].coords,&weapons.position[j])<2){
+ if(player[i].isCrouch()||
+ player[i].targetanimation==sneakanim||
+ player[i].isRun()||
+ player[i].isIdle()||
+ player[i].aitype!=playercontrolled){
+ player[i].throwtogglekeydown=1;
+ setAnimation(i,crouchremoveknifeanim);
+ player[i].targetrotation=roughDirectionTo(player[i].coords,weapons.position[j]);
+ player[i].hasvictim=0;
+ }
+ if(player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim){
+ player[i].throwtogglekeydown=1;
+ player[i].hasvictim=0;
+
+ if((weapons.velocity[j].x==0&&weapons.velocity[j].y==0&&weapons.velocity[j].z==0||
+ player[i].aitype==playercontrolled)&&
+ weapons.owner[j]==-1||
+ player[i].victim&&
+ weapons.owner[j]==player[i].victim->id)
+ if(findDistancefastflat(&player[i].coords,&weapons.position[j])<2&&player[i].weaponactive==-1)
+ if(findDistancefast(&player[i].coords,&weapons.position[j])<1||player[i].victim){
+ if(weapons.type[j]!=staff)
+ emit_sound_at(knifedrawsound, player[i].coords, 128.);
+
+ player[i].weaponactive=0;
+ weapons.owner[j]=player[i].id;
+ if(player[i].num_weapons>0)
+ player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
+ player[i].num_weapons++;
+ player[i].weaponids[0]=j;
+ }
+ }
+ }else if((player[i].isIdle()||
+ player[i].isFlip()||
+ player[i].aitype!=playercontrolled)&&
+ findDistancefast(&player[i].coords,&weapons.position[j])<5&&
+ player[i].coords.y<weapons.position[j].y){
+ if(!player[i].isFlip()){
+ player[i].throwtogglekeydown=1;
+ setAnimation(i,removeknifeanim);
+ player[i].targetrotation=roughDirectionTo(player[i].coords,weapons.position[j]);
+ }
+ if(player[i].isFlip()){
+ player[i].throwtogglekeydown=1;
+ player[i].hasvictim=0;
+
+ for(int k=0;k<weapons.numweapons;k++){
+ if(player[i].weaponactive==-1)
+ if((weapons.velocity[k].x==0&&weapons.velocity[k].y==0&&weapons.velocity[k].z==0||
+ player[i].aitype==playercontrolled)&&
+ weapons.owner[k]==-1||
+ player[i].victim&&
+ weapons.owner[k]==player[i].victim->id)
+ if(findDistancefastflat(&player[i].coords,&weapons.position[k])<3&&
+ player[i].weaponactive==-1){
+ if(weapons.type[k]!=staff)
+ emit_sound_at(knifedrawsound, player[i].coords, 128.);
+
+ player[i].weaponactive=0;
+ weapons.owner[k]=player[i].id;
+ if(player[i].num_weapons>0)
+ player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
+ player[i].num_weapons++;
+ player[i].weaponids[0]=k;
+ }
+ }
+ }
+ }
+ }
+ }
+ if(player[i].isCrouch()||
+ player[i].targetanimation==sneakanim||
+ player[i].isRun()||
+ player[i].isIdle()||player[i].targetanimation==rollanim||
+ player[i].targetanimation==backhandspringanim){
+ if(numplayers>1)
+ for(int j=0;j<numplayers;j++){
+ if(player[i].weaponactive==-1)
+ if(j!=i)
+ if(player[j].num_weapons&&
+ player[j].skeleton.free&&
+ findDistancefast(&player[i].coords,&player[j].coords)<2/*&&player[j].dead*/&&
+ (((player[j].skeleton.forward.y<0&&
+ player[j].weaponstuckwhere==0)||
+ (player[j].skeleton.forward.y>0&&
+ player[j].weaponstuckwhere==1))||
+ player[j].weaponstuck==-1||
+ player[j].num_weapons>1)){
+ if(player[i].targetanimation!=rollanim&&player[i].targetanimation!=backhandspringanim){
+ player[i].throwtogglekeydown=1;
+ player[i].victim=&player[j];
+ player[i].hasvictim=1;
+ setAnimation(i,crouchremoveknifeanim);
+ player[i].targetrotation=roughDirectionTo(player[i].coords,player[j].coords);
+ }
+ if(player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim){
+ player[i].throwtogglekeydown=1;
+ player[i].victim=&player[j];
+ player[i].hasvictim=1;
+ int k = player[j].weaponids[0];
+ if(player[i].hasvictim){
+ bool fleshstuck;
+ fleshstuck=0;
+ if(player[i].victim->weaponstuck!=-1){
+ if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){
+ fleshstuck=1;
+ }
+ }
+ if(!fleshstuck){
+ if(weapons.type[k]!=staff)
+ emit_sound_at(knifedrawsound, player[i].coords, 128.);
+ }
+ if(fleshstuck)
+ emit_sound_at(fleshstabremovesound, player[i].coords, 128.);
+
+ player[i].weaponactive=0;
+ if(weapons.owner[k]!=-1){
+ if(player[i].victim->num_weapons==1)player[i].victim->num_weapons=0;
+ else player[i].victim->num_weapons=1;
+
+ player[i].victim->skeleton.longdead=0;
+ player[i].victim->skeleton.free=1;
+ player[i].victim->skeleton.broken=0;
+
+ for(int l=0;l<player[i].victim->skeleton.num_joints;l++){
+ player[i].victim->skeleton.joints[l].velchange=0;
+ player[i].victim->skeleton.joints[l].locked=0;
+ }
+
+ XYZ relative;
+ relative=0;
+ relative.y=10;
+ Normalise(&relative);
+ XYZ footvel,footpoint;
+ footvel=0;
+ footpoint=weapons.position[k];
+ if(player[i].victim->weaponstuck!=-1){
+ if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){
+ if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
+ weapons.bloody[k]=2;
+ weapons.blooddrip[k]=5;
+ player[i].victim->weaponstuck=-1;
+ player[i].victim->bloodloss+=2000;
+ player[i].victim->DoDamage(2000);
+ }
+ }
+ if(player[i].victim->num_weapons>0){
+ if(player[i].victim->weaponstuck!=0&&player[i].victim->weaponstuck!=-1)player[i].victim->weaponstuck=0;
+ if(player[i].victim->weaponids[0]==k)
+ player[i].victim->weaponids[0]=player[i].victim->weaponids[player[i].victim->num_weapons];
+ }
+
+ player[i].victim->weaponactive=-1;
+
+ playerJoint(player[i].victim,abdomen).velocity+=relative*6;
+ playerJoint(player[i].victim,neck).velocity+=relative*6;
+ playerJoint(player[i].victim,rightshoulder).velocity+=relative*6;
+ playerJoint(player[i].victim,leftshoulder).velocity+=relative*6;
+ }
+ weapons.owner[k]=i;
+ if(player[i].num_weapons>0){
+ player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
+ }
+ player[i].num_weapons++;
+ player[i].weaponids[0]=k;
+ }
+ }
+ }
+ }
+ }
+ }
+ if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){
+ if(weapons.type[player[i].weaponids[0]]==knife){
+ if(player[i].isIdle()||
+ player[i].isRun()||
+ player[i].isCrouch()||
+ player[i].targetanimation==sneakanim||
+ player[i].isFlip())
+ if(numplayers>1)
+ for(int j=0;j<numplayers;j++){
+ if(i!=j)
+ if(tutoriallevel!=1||tutorialstage==49)
+ if(hostile)
+ if(normaldotproduct(player[i].facing,player[i].coords-player[j].coords)<0&&
+ findDistancefast(&player[i].coords,&player[j].coords)<100&&
+ findDistancefast(&player[i].coords,&player[j].coords)>1.5&&
+ !player[j].skeleton.free&&
+ -1==checkcollide(DoRotation(playerJoint(j,head).position,0,player[j].rotation,0)*player[j].scale+player[j].coords,DoRotation(playerJoint(i,head).position,0,player[i].rotation,0)*player[i].scale+player[i].coords)){
+ if(!player[i].isFlip()){
+ player[i].throwtogglekeydown=1;
+ player[i].victim=&player[j];
+ setAnimation(i,knifethrowanim);
+ player[i].targetrotation=roughDirectionTo(player[i].coords,player[j].coords);
+ player[i].targettilt2=pitchTo(player[i].coords,player[j].coords);
+ }
+ if(player[i].isFlip()){
+ if(player[i].weaponactive!=-1){
+ player[i].throwtogglekeydown=1;
+ player[i].victim=&player[j];
+ XYZ aim;
+ weapons.owner[player[i].weaponids[0]]=-1;
+ aim=player[i].victim->coords+DoRotation(playerJoint(player[i].victim,abdomen).position,0,player[i].victim->rotation,0)*player[i].victim->scale+player[i].victim->velocity*findDistance(&player[i].victim->coords,&player[i].coords)/50-(player[i].coords+DoRotation(playerJoint(i,righthand).position,0,player[i].rotation,0)*player[i].scale);
+ Normalise(&aim);
+
+ aim=DoRotation(aim,(float)abs(Random()%30)-15,(float)abs(Random()%30)-15,0);
+
+ weapons.velocity[player[i].weaponids[0]]=aim*50;
+ weapons.tipvelocity[player[i].weaponids[0]]=aim*50;
+ weapons.missed[player[i].weaponids[0]]=0;
+ weapons.freetime[player[i].weaponids[0]]=0;
+ weapons.firstfree[player[i].weaponids[0]]=1;
+ weapons.physics[player[i].weaponids[0]]=0;
+ player[i].num_weapons--;
+ if(player[i].num_weapons){
+ player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons];
+ }
+ player[i].weaponactive=-1;
+ }
+ }
+ }
+ }
+ }
+ }
+ if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){
+ if(player[i].isCrouch()||player[i].targetanimation==sneakanim){
+ player[i].throwtogglekeydown=1;
+ weapons.owner[player[i].weaponids[0]]=-1;
+ weapons.velocity[player[i].weaponids[0]]=player[i].velocity*.2;
+ if(weapons.velocity[player[i].weaponids[0]].x==0)weapons.velocity[player[i].weaponids[0]].x=.1;
+ weapons.tipvelocity[player[i].weaponids[0]]=weapons.velocity[player[i].weaponids[0]];
+ weapons.missed[player[i].weaponids[0]]=1;
+ weapons.freetime[player[i].weaponids[0]]=0;
+ weapons.firstfree[player[i].weaponids[0]]=1;
+ weapons.physics[player[i].weaponids[0]]=1;
+ player[i].num_weapons--;
+ if(player[i].num_weapons){
+ player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons];
+ if(player[i].weaponstuck==player[i].num_weapons)player[i].weaponstuck=0;
+ }
+
+ player[i].weaponactive=-1;
+ for(int j=0;j<numplayers;j++){
+ player[j].wentforweapon=0;
+ }
+ }
+ }
+
+ }
+
+ //draw weapon
+ if(i==0||!player[0].dead||player[i].weaponactive!=-1)
+ if(player[i].drawkeydown&&!player[i].drawtogglekeydown||
+ player[i].num_weapons==2&&
+ player[i].weaponactive==-1&&
+ player[i].isIdle()||
+ player[0].dead&&
+ player[i].weaponactive!=-1&&
+ i!=0){
+ bool isgood=1;
+ if(player[i].weaponactive!=-1)
+ if(weapons.type[player[i].weaponids[player[i].weaponactive]]==staff)
+ isgood=0;
+ if(isgood&&player[i].creature!=wolftype){
+ if(player[i].isIdle()&&player[i].num_weapons&&weapons.type[player[i].weaponids[0]]==knife){
+ setAnimation(i,drawrightanim);
+ player[i].drawtogglekeydown=1;
+ }
+ if((player[i].isIdle()||
+ (player[i].aitype!=playercontrolled&&
+ player[0].weaponactive!=-1&&
+ player[i].isRun()))&&
+ player[i].num_weapons&&
+ weapons.type[player[i].weaponids[0]]==sword){
+ setAnimation(i,drawleftanim);
+ player[i].drawtogglekeydown=1;
+ }
+ if(player[i].isCrouch()&&player[i].num_weapons&&weapons.type[player[i].weaponids[0]]==knife){
+ setAnimation(i,crouchdrawrightanim);
+ player[i].drawtogglekeydown=1;
+ }
+ }
+ }
+ //clean weapon
+ if(player[i].isCrouch()&&
+ weapons.bloody[player[i].weaponids[player[i].weaponactive]]&&
+ bloodtoggle&&
+ player[i].onterrain&&
+ player[i].num_weapons&&
+ player[i].weaponactive!=-1&&
+ player[i].attackkeydown){
+ if(weapons.bloody[player[i].weaponids[player[i].weaponactive]]&&
+ player[i].onterrain&&
+ bloodtoggle&&musictype!=stream_music2){
+ if(weapons.type[player[i].weaponids[player[i].weaponactive]]==knife)
+ setAnimation(i,crouchstabanim);
+ if(weapons.type[player[i].weaponids[player[i].weaponactive]]==sword)
+ setAnimation(i,swordgroundstabanim);
+ player[i].hasvictim=0;
+ //player[i].attacktogglekeydown=1;
+ }
+ }
+
+ if(!player[i].drawkeydown)
+ player[i].drawtogglekeydown=0;
+
+ XYZ absflatfacing;
+ if(i==0){
+ absflatfacing=0;
+ absflatfacing.z=-1;
+
+ absflatfacing=DoRotation(absflatfacing,0,-rotation,0);
+ }
+ else absflatfacing=flatfacing;
+
+ if(indialogue!=-1){
+ player[i].forwardkeydown=0;
+ player[i].leftkeydown=0;
+ player[i].backkeydown=0;
+ player[i].rightkeydown=0;
+ player[i].jumpkeydown=0;
+ player[i].crouchkeydown=0;
+ player[i].drawkeydown=0;
+ player[i].throwkeydown=0;
+ }
+ movekey=0;
+ //Do controls
+ if(!animation[player[i].targetanimation].attack&&
+ player[i].targetanimation!=staggerbackhighanim&&
+ player[i].targetanimation!=staggerbackhardanim&&
+ player[i].targetanimation!=backhandspringanim&&
+ player[i].targetanimation!=dodgebackanim){
+ if(!player[i].forwardkeydown)
+ player[i].forwardstogglekeydown=0;
+ if(player[i].crouchkeydown){
+ //Crouch
+ target=-2;
+ if(i==0){
+ player[i].superruntoggle=1;
+ if(numplayers>1)
+ for(int j=0;j<numplayers;j++)
+ if(j!=i&&!player[j].skeleton.free&&player[j].aitype==passivetype)
+ if(findDistancefast(&player[j].coords,&player[i].coords)<16)
+ player[i].superruntoggle=0;
+ }
+
+ if(numplayers>1)
+ for(int j=0;j<numplayers;j++){
+ if(j!=i&&!player[j].skeleton.free&&player[j].victim&&player[i].lowreversaldelay<=0){
+ if(findDistancefast(&player[j].coords,&player[j].victim->coords)<3&&
+ player[j].victim==&player[i]&&
+ (player[j].targetanimation==sweepanim||
+ player[j].targetanimation==upunchanim||
+ player[j].targetanimation==wolfslapanim||
+ ((player[j].targetanimation==swordslashanim||
+ player[j].targetanimation==knifeslashstartanim||
+ player[j].targetanimation==staffhitanim||
+ player[j].targetanimation==staffspinhitanim)&&
+ findDistancefast(&player[j].coords,&player[i].coords)<2))){
+ if(target>=0)
+ target=-1;
+ else
+ target=j;
+ }
+ }
+ }
+ if(target>=0)
+ player[target].Reverse();
+ player[i].lowreversaldelay=.5;
+
+ if(player[i].isIdle()){
+ setAnimation(i,player[i].getCrouch());
+ player[i].transspeed=10;
+ }
+ if(player[i].isRun()||
+ (player[i].isStop()&&
+ (player[i].leftkeydown||
+ player[i].rightkeydown||
+ player[i].forwardkeydown||
+ player[i].backkeydown))){
+ setAnimation(i,rollanim);
+ player[i].transspeed=20;
+ }
+ }
+ if(!player[i].crouchkeydown){
+ //Uncrouch
+ if(!player[i].isRun()&&player[i].targetanimation!=sneakanim&&i==0)player[i].superruntoggle=0;
+ target=-2;
+ if(player[i].isCrouch()){
+ if(numplayers>1)
+ for(int j=0;j<numplayers;j++){
+ if(j!=i&&
+ !player[j].skeleton.free&&
+ player[j].victim&&
+ player[i].highreversaldelay<=0){
+ if(findDistancefast(&player[j].coords,&player[j].victim->coords)<3&&
+ player[j].victim==&player[i]&&
+ (player[j].targetanimation==spinkickanim)&&
+ player[i].isCrouch()){
+ if(target>=0)
+ target=-1;
+ else
+ target=j;
+ }
+ }
+ }
+ if(target>=0)
+ player[target].Reverse();
+ player[i].highreversaldelay=.5;
+
+ if(player[i].isCrouch()){
+ if(!player[i].wasCrouch()){
+ player[i].currentanimation=player[i].getCrouch();
+ player[i].currentframe=0;
+ }
+ setAnimation(i,player[i].getIdle());
+ player[i].transspeed=10;
+ }
+ }
+ if(player[i].targetanimation==sneakanim){
+ setAnimation(i,player[i].getIdle());
+ player[i].transspeed=10;
+ }
+ }
+ if(player[i].forwardkeydown){
+ if(player[i].isIdle()||
+ (player[i].isStop()&&
+ player[i].targetrotation==player[i].rotation)||
+ (player[i].isLanding()&&
+ player[i].targetframe>0&&
+ !player[i].jumpkeydown)||
+ (player[i].isLandhard()&&
+ player[i].targetframe>0&&
+ !player[i].jumpkeydown&&
+ player[i].crouchkeydown)){
+ if(player[i].aitype==passivetype)
+ setAnimation(i,walkanim);
+ else
+ setAnimation(i,player[i].getRun());
+ }
+ if(player[i].isCrouch()){
+ player[i].targetanimation=sneakanim;
+ if(player[i].wasCrouch())
+ player[i].target=0;
+ player[i].targetframe=0;
+ }
+ if(player[i].targetanimation==hanganim/*&&(!player[i].forwardstogglekeydown||player[i].aitype!=playercontrolled)*/){
+ setAnimation(i,climbanim);
+ player[i].targetframe=1;
+ player[i].jumpclimb=1;
+ }
+ if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){
+ player[i].velocity+=absflatfacing*5*multiplier;
+ }
+ player[i].forwardstogglekeydown=1;
+ movekey=1;
+ }
+ if (player[i].rightkeydown){
+ if(player[i].isIdle()||
+ (player[i].isStop()&&
+ player[i].targetrotation==player[i].rotation)||
+ (player[i].isLanding()&&
+ player[i].targetframe>0&&
+ !player[i].jumpkeydown)||
+ (player[i].isLandhard()&&
+ player[i].targetframe>0&&
+ !player[i].jumpkeydown&&
+ player[i].crouchkeydown)){
+ setAnimation(i,player[i].getRun());
+ }
+ if(player[i].isCrouch()){
+ player[i].targetanimation=sneakanim;
+ if(player[i].wasCrouch())
+ player[i].target=0;
+ player[i].targetframe=0;
+ }
+ if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){
+ player[i].velocity+=DoRotation(absflatfacing*5*multiplier,0,-90,0);
+ }
+ player[i].targetrotation-=90;
+ if(player[i].forwardkeydown)player[i].targetrotation+=45;
+ if(player[i].backkeydown)player[i].targetrotation-=45;
+ movekey=1;
+ }
+ if ( player[i].leftkeydown){
+ if(player[i].isIdle()||
+ (player[i].isStop()&&
+ player[i].targetrotation==player[i].rotation)||
+ (player[i].isLanding()&&
+ player[i].targetframe>0&&
+ !player[i].jumpkeydown)||
+ (player[i].isLandhard()&&
+ player[i].targetframe>0&&
+ !player[i].jumpkeydown&&
+ player[i].crouchkeydown)){
+ setAnimation(i,player[i].getRun());
+ }
+ if(player[i].isCrouch()){
+ player[i].targetanimation=sneakanim;
+ if(player[i].wasCrouch())
+ player[i].target=0;
+ player[i].targetframe=0;
+ }
+ if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){
+ player[i].velocity-=DoRotation(absflatfacing*5*multiplier,0,-90,0);
+ }
+ player[i].targetrotation+=90;
+ if(player[i].forwardkeydown)player[i].targetrotation-=45;
+ if(player[i].backkeydown)player[i].targetrotation+=45;
+ movekey=1;
+ }
+ if(player[i].backkeydown){
+ if(player[i].isIdle()||
+ (player[i].isStop()&&
+ player[i].targetrotation==player[i].rotation)||
+ (player[i].isLanding()&&
+ player[i].targetframe>0&&
+ !player[i].jumpkeydown)||
+ (player[i].isLandhard()&&
+ player[i].targetframe>0&&
+ !player[i].jumpkeydown&&
+ player[i].crouchkeydown)){
+ setAnimation(i,player[i].getRun());
+ }
+ if(player[i].isCrouch()){
+ player[i].targetanimation=sneakanim;
+ if(player[i].wasCrouch())
+ player[i].target=0;
+ player[i].targetframe=0;
+ }
+ if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){
+ player[i].velocity-=absflatfacing*5*multiplier;
+ }
+ if(player[i].targetanimation==hanganim){
+ player[i].currentanimation=jumpdownanim;
+ player[i].targetanimation=jumpdownanim;
+ player[i].target=0;
+ player[i].currentframe=0;
+ player[i].targetframe=1;
+ player[i].velocity=0;
+ player[i].velocity.y+=gravity;
+ player[i].coords.y-=1.4;
+ player[i].grabdelay=1;
+ }
+ if ( !player[i].leftkeydown&&!player[i].rightkeydown)
+ player[i].targetrotation+=180;
+ movekey=1;
+ }
+ if((player[i].jumpkeydown&&!player[i].jumpclimb)||player[i].jumpstart){
+ if((((player[i].isLanding()&&player[i].targetframe>=3)||
+ player[i].isRun()||
+ player[i].targetanimation==walkanim||
+ player[i].isCrouch()||
+ player[i].targetanimation==sneakanim)&&
+ player[i].jumppower>1)&&
+ ((player[i].targetanimation!=rabbitrunninganim&&
+ player[i].targetanimation!=wolfrunninganim)||i!=0)){
+ player[i].jumpstart=0;
+ setAnimation(i,jumpupanim);
+ player[i].rotation=player[i].targetrotation;
+ player[i].transspeed=20;
+ player[i].FootLand(0,1);
+ player[i].FootLand(1,1);
+
+ facing=0;
+ facing.z=-1;
+ flatfacing=DoRotation(facing,0,player[i].targetrotation+180,0);
+
+ if(movekey)player[i].velocity=flatfacing*player[i].speed*45*player[i].scale;
+ if(!movekey)player[i].velocity=0;
+
+ //Dodge sweep?
+ target=-2;
+ if(numplayers>1)
+ for(int j=0;j<numplayers;j++){
+ if(j!=i&&!player[j].skeleton.free&&player[j].victim){
+ if(findDistancefast(&player[j].coords,&player[j].victim->coords)<3&&
+ player[j].victim==&player[i]&&
+ (player[j].targetanimation==sweepanim)){
+ if(target>=0)target=-1;
+ else target=j;
+ }
+ }
+ }
+ if(target>=0)player[i].velocity.y=1;
+ else if(player[i].crouchkeydown||player[i].aitype!=playercontrolled){
+ player[i].velocity.y=7;
+ player[i].crouchtogglekeydown=1;
+ }
+ else player[i].velocity.y=5;
+
+ if(mousejump&&i==0&&debugmode){
+ if(!player[i].isLanding())player[i].tempdeltav=deltav;
+ if(player[i].tempdeltav<0)player[i].velocity.y-=(float)(player[i].tempdeltav)/multiplier/1000;
+ }
+
+ player[i].coords.y+=.2;
+ player[i].jumppower-=1;
+
+ if (!i)
+ emit_sound_at(whooshsound, player[i].coords, 128.);
+
+ emit_sound_at(jumpsound, player[i].coords, 128.);
+ }
+ if((player[i].isIdle())&&player[i].jumppower>1){
+ setAnimation(i,player[i].getLanding());
+ player[i].targetframe=2;
+ player[i].landhard=0;
+ player[i].jumpstart=1;
+ player[i].tempdeltav=deltav;
+ }
+ if(player[i].targetanimation==jumpupanim&&
+ (((!floatjump&&
+ !editorenabled)||
+ !debugmode)||
+ player[i].aitype!=playercontrolled)){
+ if(player[i].jumppower>multiplier*6){
+ player[i].velocity.y+=multiplier*6;
+ player[i].jumppower-=multiplier*6;
+ }
+ if(player[i].jumppower<=multiplier*6){
+ player[i].velocity.y+=player[i].jumppower;
+ player[i].jumppower=0;
+ }
+ }
+ if(((floatjump||editorenabled)&&debugmode)&&i==0)player[i].velocity.y+=multiplier*30;
+ }
+
+ if(!movekey){
+ if(player[i].isRun()||player[i].targetanimation==walkanim)
+ setAnimation(i,player[i].getStop());
+ if(player[i].targetanimation==sneakanim){
+ player[i].targetanimation=player[i].getCrouch();
+ if(player[i].currentanimation==sneakanim)
+ player[i].target=0;
+ player[i].targetframe=0;
+ }
+ }
+ if(player[i].targetanimation==walkanim&&
+ (player[i].aitype==attacktypecutoff||
+ player[i].aitype==searchtype||
+ (player[i].aitype==passivetype&&
+ player[i].numwaypoints<=1)))
+ setAnimation(i,player[i].getStop());
+ if(player[i].isRun()&&(player[i].aitype==passivetype))
+ setAnimation(i,player[i].getStop());
+ }
+ }
+ if(player[i].targetanimation==rollanim)
+ player[i].targetrotation=oldtargetrotation;
+ }
+
+ //Rotation
+ for(int k=0;k<numplayers;k++){
+ if(fabs(player[k].rotation-player[k].targetrotation)>180){
+ if(player[k].rotation>player[k].targetrotation)
+ player[k].rotation-=360;
+ else
+ player[k].rotation+=360;
+ }
+
+ //stop to turn in right direction
+ if(fabs(player[k].rotation-player[k].targetrotation)>90&&(player[k].isRun()||player[k].targetanimation==walkanim))
+ setAnimation(k,player[k].getStop());
+
+ if(player[k].targetanimation==backhandspringanim||player[k].targetanimation==dodgebackanim)
+ player[k].targettilt=0;
+
+ if(player[k].targetanimation!=jumpupanim&&
+ player[k].targetanimation!=backhandspringanim&&
+ player[k].targetanimation!=jumpdownanim&&
+ !player[k].isFlip()){
+ player[k].targettilt=0;
+ if(player[k].jumppower<0&&!player[k].jumpkeydown)
+ player[k].jumppower=0;
+ player[k].jumppower+=multiplier*7;
+ if(player[k].isCrouch())
+ player[k].jumppower+=multiplier*7;
+ if(player[k].jumppower>5)
+ player[k].jumppower=5;
+ }
+
+ if(player[k].isRun())
+ player[k].targettilt=(player[k].rotation-player[k].targetrotation)/4;
+
+ player[k].tilt=stepTowardf(player[k].tilt,player[k].targettilt,multiplier*150);
+ player[k].grabdelay-=multiplier;
+ }
+
+ //do animations
+ for(int k=0;k<numplayers;k++){
+ player[k].DoAnimations();
+ player[k].whichpatchx=player[k].coords.x/(terrain.size/subdivision*terrain.scale);
+ player[k].whichpatchz=player[k].coords.z/(terrain.size/subdivision*terrain.scale);
+ }
+
+ //do stuff
+ objects.DoStuff();
+
+ for(int j=numenvsounds-1;j>=0;j--){
+ envsoundlife[j]-=multiplier;
+ if(envsoundlife[j]<0){
+ numenvsounds--;
+ envsoundlife[j]=envsoundlife[numenvsounds];
+ envsound[j]=envsound[numenvsounds];
+ }
+ }
+ if(slomo)
+ OPENAL_SetFrequency(OPENAL_ALL, slomofreq);
+ else
+ OPENAL_SetFrequency(OPENAL_ALL, 22050);
+
+ if(tutoriallevel==1){
+ XYZ temp;
+ XYZ temp2;
+ XYZ temp3;
+ XYZ oldtemp;
+ XYZ oldtemp2;
+ temp.x=1011;
+ temp.y=84;
+ temp.z=491;
+ temp2.x=1025;
+ temp2.y=75;
+ temp2.z=447;
+ temp3.x=1038;
+ temp3.y=76;
+ temp3.z=453;
+ oldtemp=temp;
+ oldtemp2=temp2;
+ if(tutorialstage>=51)
+ if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){
+ OPENAL_StopSound(OPENAL_ALL); // hack...OpenAL renderer isn't stopping music after tutorial goes to level menu...
+ OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+
+ emit_stream_np(stream_music3);
+
+ gameon=0;
+ mainmenu=5;
+
+ fireSound();
+
+ flash();
+ }
+ if(tutorialstage<51)
+ if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){
+ emit_sound_at(fireendsound, player[0].coords);
+
+ player[0].coords=(oldtemp+oldtemp2)/2;
+
+ flash();
+ }
+ if(tutorialstage>=14&&tutorialstage<50)
+ if(findDistancefast(&temp,&player[1].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[1].coords)<4){
+ emit_sound_at(fireendsound, player[1].coords);
+
+ for(int i=0;i<player[1].skeleton.num_joints;i++){
+ if(Random()%2==0){
+ if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
+ if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
+ if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].rotation,0)*player[1].scale+player[1].coords;
+ if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
+ Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
+ }
+ }
+
+ player[1].coords=(oldtemp+oldtemp2)/2;
+ for(int i=0;i<player[1].skeleton.num_joints;i++){
+ player[1].skeleton.joints[i].velocity=0;
+ if(Random()%2==0){
+ if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
+ if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
+ if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].rotation,0)*player[1].scale+player[1].coords;
+ if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
+ Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
+ }
+ }
+ }
+ }
+
+
+ //3d sound
+ static float gLoc[3];
+ gLoc[0]=viewer.x;
+ gLoc[1]=viewer.y;
+ gLoc[2]=viewer.z;
+ static float vel[3];
+ vel[0]=(viewer.x-oldviewer.x)/multiplier;
+ vel[1]=(viewer.y-oldviewer.y)/multiplier;
+ vel[2]=(viewer.z-oldviewer.z)/multiplier;
+
+ //Set orientation with forward and up vectors
+ static XYZ upvector;
+ upvector=0;
+ upvector.z=-1;
+
+ upvector=DoRotation(upvector,-rotation2+90,0,0);
+ upvector=DoRotation(upvector,0,0-rotation,0);
+
+ facing=0;
+ facing.z=-1;
+
+ facing=DoRotation(facing,-rotation2,0,0);
+ facing=DoRotation(facing,0,0-rotation,0);
+
+
+ static float ori[6];
+ ori[0] = -facing.x;
+ ori[1] = facing.y;
+ ori[2] = -facing.z;
+ ori[3] = -upvector.x;
+ ori[4] = upvector.y;
+ ori[5] = -upvector.z;
+
+ OPENAL_3D_Listener_SetAttributes(&gLoc[0], &vel[0], ori[0], ori[1], ori[2], ori[3], ori[4], ori[5]);
+ OPENAL_Update();
+
+ oldviewer=viewer;