- }
- }
- }
- }
- }
- if(player[k].collide<=0){
- //in the air
- if(!player[k].onterrain&&
- player[k].targetanimation!=jumpupanim&&
- player[k].targetanimation!=jumpdownanim&&
- player[k].targetanimation!=climbanim&&
- player[k].targetanimation!=hanganim&&
- !player[k].isWallJump()&&
- !player[k].isFlip()){
- if(player[k].currentanimation!=climbanim&&
- player[k].currentanimation!=tempanim&&
- player[k].targetanimation!=backhandspringanim&&
- (player[k].targetanimation!=rollanim||
- player[k].targetframe<2||
- player[k].targetframe>6)){
- //stagger off ledge (?)
- if(player[k].targetanimation==staggerbackhighanim||player[k].targetanimation==staggerbackhardanim)
- player[k].RagDoll(0);
- setAnimation(k,jumpdownanim);
-
- if(!k)
- emit_sound_at(whooshsound, player[k].coords, 128.);
- }
- //gravity
- player[k].velocity.y+=gravity;
- }
- }
- }
- player[k].realoldcoords=player[k].coords;
- }
-}
-
-void Game::doAttacks(){
- static XYZ relative;
- static int randattack;
- static bool playerrealattackkeydown=0;
-
- if(!Input::isKeyDown(attackkey))
- oldattackkey=0;
- if(oldattackkey)
- player[0].attackkeydown=0;
- if(oldattackkey)
- playerrealattackkeydown=0;
- if(!oldattackkey)
- playerrealattackkeydown=Input::isKeyDown(attackkey);
- if((player[0].parriedrecently<=0||
- player[0].weaponactive==-1)&&
- (!oldattackkey||
- (realthreat&&
- player[0].lastattack!=swordslashanim&&
- player[0].lastattack!=knifeslashstartanim&&
- player[0].lastattack!=staffhitanim&&
- player[0].lastattack!=staffspinhitanim)))
- player[0].attackkeydown=Input::isKeyDown(attackkey);
- if(Input::isKeyDown(attackkey)&&
- !oldattackkey&&
- !player[0].backkeydown){
- for(int k=0;k<numplayers;k++){
- if((player[k].targetanimation==swordslashanim||
- player[k].targetanimation==staffhitanim||
- player[k].targetanimation==staffspinhitanim)&&
- player[0].currentanimation!=dodgebackanim&&
- !player[k].skeleton.free)
- player[k].Reverse();
- }
- }
-
- if(!hostile||indialogue!=-1)player[0].attackkeydown=0;
-
- for(int k=0;k<numplayers;k++){
- if(indialogue!=-1)player[k].attackkeydown=0;
- if(player[k].targetanimation!=rabbitrunninganim&&player[k].targetanimation!=wolfrunninganim){
- if(player[k].aitype!=playercontrolled)
- player[k].victim=&player[0];
- //attack key pressed
- if(player[k].attackkeydown){
- //dodge backward
- if(player[k].backkeydown&&
- player[k].targetanimation!=backhandspringanim&&
- (player[k].isIdle()||
- player[k].isStop()||
- player[k].isRun()||
- player[k].targetanimation==walkanim)){
- if(player[k].jumppower<=1){
- player[k].jumppower-=2;
- }else{
- for(int i=0;i<numplayers;i++){
- if(i==k)continue;
- if(player[i].targetanimation==swordslashanim||
- player[i].targetanimation==knifeslashstartanim||
- player[i].targetanimation==staffhitanim||
- player[i].targetanimation==staffspinhitanim)
- if(findDistancefast(&player[k].coords,&player[i].coords)<6.5&&!player[i].skeleton.free){
- setAnimation(k,dodgebackanim);
- player[k].targetrotation=roughDirectionTo(player[k].coords,player[i].coords);
- player[k].targettilt2=pitchTo(player[k].coords,player[i].coords);
- }
- }
- if(player[k].targetanimation!=dodgebackanim){
- if(k==0)numflipped++;
- setAnimation(k,backhandspringanim);
- player[k].targetrotation=-rotation+180;
- if(player[k].leftkeydown)
- player[k].targetrotation-=45;
- if(player[k].rightkeydown)
- player[k].targetrotation+=45;
- player[k].rotation=player[k].targetrotation;
- player[k].jumppower-=2;
- }
- }
- }
- //attack
- if(!animation[player[k].targetanimation].attack&&
- !player[k].backkeydown&&
- (player[k].isIdle()||
- player[k].isRun()||
- player[k].targetanimation==walkanim||
- player[k].targetanimation==sneakanim||
- player[k].isCrouch())){
- const int attackweapon=player[k].weaponactive==-1?0:weapons.type[player[k].weaponids[player[k].weaponactive]];
- //normal attacks (?)
- player[k].hasvictim=0;
- if(numplayers>1)
- for(int i=0;i<numplayers;i++){
- if(i==k||!(k==0||i==0))continue;
- if(!player[k].hasvictim)
- if(animation[player[k].targetanimation].attack!=reversal){
- //choose an attack
- const float distance=findDistancefast(&player[k].coords,&player[i].coords);
- if(distance<4.5&&
- !player[i].skeleton.free&&
- player[i].howactive<typedead1&&
- player[i].targetanimation!=jumpreversedanim&&
- player[i].targetanimation!=rabbitkickreversedanim&&
- player[i].targetanimation!=rabbitkickanim&&
- player[k].targetanimation!=rabbitkickanim&&
- player[i].targetanimation!=getupfrombackanim&&
- (player[i].targetanimation!=staggerbackhighanim&&
- (player[i].targetanimation!=staggerbackhardanim||
- animation[staggerbackhardanim].label[player[i].targetframe]==6))&&
- player[i].targetanimation!=jumpdownanim&&
- player[i].targetanimation!=jumpupanim&&
- player[i].targetanimation!=getupfromfrontanim){
- player[k].victim=&player[i];
- player[k].hasvictim=1;
- if(player[k].aitype==playercontrolled){ //human player
- //sweep
- if(distance<2.5*sq(player[k].scale*5)&&
- player[k].crouchkeydown&&
- animation[player[i].targetanimation].height!=lowheight)
- player[k].targetanimation=sweepanim;
- //winduppunch
- else if(distance<1.5*sq(player[k].scale*5)&&
- animation[player[i].targetanimation].height!=lowheight&&
- !player[k].forwardkeydown&&
- !player[k].leftkeydown&&
- !player[k].rightkeydown&&
- !player[k].crouchkeydown&&
- !attackweapon&&
- !reversaltrain)
- player[k].targetanimation=winduppunchanim;
- //upunch
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].targetanimation].height!=lowheight&&
- !player[k].forwardkeydown&&
- !player[k].leftkeydown&&
- !player[k].rightkeydown&&
- !player[k].crouchkeydown&&
- !attackweapon)
- player[k].targetanimation=upunchanim;
- //knifefollow
- else if(distance<2.5*sq(player[k].scale*5)&&
- player[i].staggerdelay>0&&
- attackweapon==knife&&
- player[i].bloodloss>player[i].damagetolerance/2)
- player[k].targetanimation=knifefollowanim;
- //knifeslashstart
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].targetanimation].height!=lowheight&&
- !player[k].forwardkeydown&&
- !player[k].leftkeydown&&
- !player[k].rightkeydown&&
- !player[k].crouchkeydown&&
- attackweapon==knife&&
- player[k].weaponmissdelay<=0)
- player[k].targetanimation=knifeslashstartanim;
- //swordslash
- else if(distance<4.5*sq(player[k].scale*5)&&
- animation[player[i].targetanimation].height!=lowheight&&
- !player[k].crouchkeydown&&
- attackweapon==sword&&
- player[k].weaponmissdelay<=0)
- player[k].targetanimation=swordslashanim;
- //staffhit
- else if(distance<4.5*sq(player[k].scale*5)&&
- animation[player[i].targetanimation].height!=lowheight&&
- !player[k].crouchkeydown&&
- attackweapon==staff&&
- player[k].weaponmissdelay<=0&&
- !player[k].leftkeydown&&
- !player[k].rightkeydown&&
- !player[k].forwardkeydown)
- player[k].targetanimation=staffhitanim;
- //staffspinhit
- else if(distance<4.5*sq(player[k].scale*5)&&
- animation[player[i].targetanimation].height!=lowheight&&
- !player[k].crouchkeydown&&
- attackweapon==staff&&
- player[k].weaponmissdelay<=0)
- player[k].targetanimation=staffspinhitanim;
- //spinkick
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].targetanimation].height!=lowheight)
- player[k].targetanimation=spinkickanim;
- //lowkick
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].targetanimation].height==lowheight&&
- animation[player[k].targetanimation].attack!=normalattack)
- player[k].targetanimation=lowkickanim;
- } else { //AI player
- if(distance<4.5*sq(player[k].scale*5)){
- randattack=abs(Random()%5);
- if(!attackweapon&&distance<2.5*sq(player[k].scale*5)){
- //sweep
- if(randattack==0&&animation[player[i].targetanimation].height!=lowheight)
- player[k].targetanimation=sweepanim;
- //upunch
- else if(randattack==1&&animation[player[i].targetanimation].height!=lowheight&&
- !attackweapon)
- player[k].targetanimation=upunchanim;
- //spinkick
- else if(randattack==2&&animation[player[i].targetanimation].height!=lowheight)
- player[k].targetanimation=spinkickanim;
- //lowkick
- else if(animation[player[i].targetanimation].height==lowheight)
- player[k].targetanimation=lowkickanim;
- }
- if(attackweapon){
- //sweep
- if((tutoriallevel!=1||!attackweapon)&&
- distance<2.5*sq(player[k].scale*5)&&
- randattack==0&&
- animation[player[i].targetanimation].height!=lowheight)
- player[k].targetanimation=sweepanim;
- //knifeslashstart
- else if(distance<2.5*sq(player[k].scale*5)&&
- attackweapon==knife&&
- player[k].weaponmissdelay<=0)
- player[k].targetanimation=knifeslashstartanim;
- //swordslash
- else if(!(player[0].victim==&player[i]&&
- player[0].hasvictim&&
- player[0].targetanimation==swordslashanim)&&
- attackweapon==sword&&
- player[k].weaponmissdelay<=0)
- player[k].targetanimation=swordslashanim;
- //staffhit
- else if(!(player[0].victim==&player[i]&&
- player[0].hasvictim&&
- player[0].targetanimation==swordslashanim)&&
- attackweapon==staff&&
- player[k].weaponmissdelay<=0&&
- randattack<3)
- player[k].targetanimation=staffhitanim;
- //staffspinhit
- else if(!(player[0].victim==&player[i]&&
- player[0].hasvictim&&
- player[0].targetanimation==swordslashanim)&&
- attackweapon==staff&&
- player[k].weaponmissdelay<=0&&
- randattack>=3)
- player[k].targetanimation=staffspinhitanim;
- //spinkick
- else if((tutoriallevel!=1||!attackweapon)&&
- distance<2.5*sq(player[k].scale*5)&&
- randattack==1&&
- animation[player[i].targetanimation].height!=lowheight)
- player[k].targetanimation=spinkickanim;
- //lowkick
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].targetanimation].height==lowheight&&
- animation[player[k].targetanimation].attack!=normalattack)
- player[k].targetanimation=lowkickanim;
- }
- }
- }
- //upunch becomes wolfslap
- if(player[k].targetanimation==upunchanim&&player[k].creature==wolftype)
- player[k].targetanimation=wolfslapanim;
- }
- //sneak attacks
- if((k==0)&&(tutoriallevel!=1||tutorialstage==22)&&
- player[i].howactive<typedead1&&
- distance<1.5*sq(player[k].scale*5)&&
- !player[i].skeleton.free&&
- player[i].targetanimation!=getupfrombackanim&&
- player[i].targetanimation!=getupfromfrontanim&&
- (player[i].stunned>0&&player[k].madskills||
- player[i].surprised>0||
- player[i].aitype==passivetype||
- attackweapon&&player[i].stunned>0)&&
- normaldotproduct(player[i].facing,player[i].coords-player[k].coords)>0){
- //sneakattack
- if(!attackweapon){
- player[k].currentanimation=sneakattackanim;
- player[k].targetanimation=sneakattackanim;
- player[i].currentanimation=sneakattackedanim;
- player[i].targetanimation=sneakattackedanim;
- player[k].oldcoords=player[k].coords;
- player[k].coords=player[i].coords;
- }
- //knifesneakattack
- if(attackweapon==knife){
- player[k].currentanimation=knifesneakattackanim;
- player[k].targetanimation=knifesneakattackanim;
- player[i].currentanimation=knifesneakattackedanim;
- player[i].targetanimation=knifesneakattackedanim;
- player[i].oldcoords=player[i].coords;
- player[i].coords=player[k].coords;
- }
- //swordsneakattack
- if(attackweapon==sword){
- player[k].currentanimation=swordsneakattackanim;
- player[k].targetanimation=swordsneakattackanim;
- player[i].currentanimation=swordsneakattackedanim;
- player[i].targetanimation=swordsneakattackedanim;
- player[i].oldcoords=player[i].coords;
- player[i].coords=player[k].coords;
- }
- if(attackweapon!=staff){
- player[k].victim=&player[i];
- player[k].hasvictim=1;
- player[i].targettilt2=0;
- player[i].targetframe=1;
- player[i].currentframe=0;
- player[i].target=0;
- player[i].velocity=0;
- player[k].targettilt2=player[i].targettilt2;
- player[k].currentframe=player[i].currentframe;
- player[k].targetframe=player[i].targetframe;
- player[k].target=player[i].target;
- player[k].velocity=0;
- player[k].targetrotation=player[i].rotation;
- player[k].rotation=player[i].rotation;
- player[i].targetrotation=player[i].rotation;
- }
- }
- if(animation[player[k].targetanimation].attack==normalattack&&
- player[k].victim==&player[i]&&
- (!player[i].skeleton.free)){
- oldattackkey=1;
- player[k].targetframe=0;
- player[k].target=0;
-
- player[k].targetrotation=roughDirectionTo(player[k].coords,player[i].coords);
- player[k].targettilt2=pitchTo(player[k].coords,player[i].coords);
- player[k].lastattack3=player[k].lastattack2;
- player[k].lastattack2=player[k].lastattack;
- player[k].lastattack=player[k].targetanimation;
- }
- if(player[k].targetanimation==knifefollowanim&&
- player[k].victim==&player[i]){
- oldattackkey=1;
- player[k].targetrotation=roughDirectionTo(player[k].coords,player[i].coords);
- player[k].targettilt2=pitchTo(player[k].coords,player[i].coords);
- player[k].victim=&player[i];
- player[k].hasvictim=1;
- player[i].targetanimation=knifefollowedanim;
- player[i].currentanimation=knifefollowedanim;
- player[i].targettilt2=0;
- player[i].targettilt2=player[k].targettilt2;
- player[i].targetframe=1;
- player[i].currentframe=0;
- player[i].target=0;
- player[i].velocity=0;
- player[k].currentanimation=knifefollowanim;
- player[k].targetanimation=knifefollowanim;
- player[k].targettilt2=player[i].targettilt2;
- player[k].currentframe=player[i].currentframe;
- player[k].targetframe=player[i].targetframe;
- player[k].target=player[i].target;
- player[k].velocity=0;
- player[k].oldcoords=player[k].coords;
- player[i].coords=player[k].coords;
- player[i].targetrotation=player[k].targetrotation;
- player[i].rotation=player[k].targetrotation;
- player[k].rotation=player[k].targetrotation;
- player[i].rotation=player[k].targetrotation;
- }
- }
- }
- const bool hasstaff=attackweapon==staff;
- if(k==0&&numplayers>1)
- for(int i=0;i<numplayers;i++){
- if(i==k)continue;
- if((playerrealattackkeydown||player[i].dead||!hasstaff)&&
- animation[player[k].targetanimation].attack==neutral){
- const float distance=findDistancefast(&player[k].coords,&player[i].coords);
- if(!player[i].dead||!realthreat||(!attackweapon&&player[k].crouchkeydown))
- if(player[i].skeleton.free)
- if(distance<3.5*sq(player[k].scale*5)&&
- (player[i].dead||
- player[i].skeleton.longdead>1000||
- player[k].isRun()||
- hasstaff||
- (attackweapon&&
- (player[i].skeleton.longdead>2000||
- player[i].damage>player[i].damagetolerance/8||
- player[i].bloodloss>player[i].damagetolerance/2)&&
- distance<1.5*sq(player[k].scale*5)))){
- player[k].victim=&player[i];
- player[k].hasvictim=1;
- if(attackweapon&&tutoriallevel!=1){
- //crouchstab
- if(player[k].crouchkeydown&&attackweapon==knife&&distance<1.5*sq(player[k].scale*5))
- player[k].targetanimation=crouchstabanim;
- //swordgroundstab
- if(player[k].crouchkeydown&&distance<1.5*sq(player[k].scale*5)&&attackweapon==sword)
- player[k].targetanimation=swordgroundstabanim;
- //staffgroundsmash
- if(distance<3.5*sq(player[k].scale*5)&&attackweapon==staff)
- player[k].targetanimation=staffgroundsmashanim;
- }
- if(distance<2.5&&
- player[k].crouchkeydown&&
- player[k].targetanimation!=crouchstabanim&&
- !attackweapon&&
- player[i].dead&&
- player[i].skeleton.free&&
- player[i].skeleton.longdead>1000){
- player[k].targetanimation=killanim;
- //TODO: refactor this out, what does it do?
- for(int j=0;j<terrain.numdecals;j++){
- if((terrain.decaltype[j]==blooddecal||terrain.decaltype[j]==blooddecalslow)&&
- terrain.decalalivetime[j]<2)
- terrain.DeleteDecal(j);
- }
- for(int l=0;l<objects.numobjects;l++){
- if(objects.model[l].type==decalstype)
- for(int j=0;j<objects.model[l].numdecals;j++){
- if((objects.model[l].decaltype[j]==blooddecal||
- objects.model[l].decaltype[j]==blooddecalslow)&&
- objects.model[l].decalalivetime[j]<2)
- objects.model[l].DeleteDecal(j);
- }
- }
- }
- if(!player[i].dead||musictype!=2)
- if(distance<3.5&&
- (player[k].isRun()||player[k].isIdle()&&player[k].attackkeydown)&&
- player[k].staggerdelay<=0&&
- (player[i].dead||
- player[i].skeleton.longdead<300&&
- player[k].lastattack!=spinkickanim&&
- player[i].skeleton.free)&&
- (!player[i].dead||musictype!=stream_fighttheme)){
- player[k].targetanimation=dropkickanim;
- for(int j=0;j<terrain.numdecals;j++){
- if((terrain.decaltype[j]==blooddecal||terrain.decaltype[j]==blooddecalslow)&&
- terrain.decalalivetime[j]<2){
- terrain.DeleteDecal(j);
- }
- }
- for(int l=0;l<objects.numobjects;l++){
- if(objects.model[l].type==decalstype)
- for(int j=0;j<objects.model[l].numdecals;j++){
- if((objects.model[l].decaltype[j]==blooddecal||
- objects.model[l].decaltype[j]==blooddecalslow)&&
- objects.model[l].decalalivetime[j]<2){
- objects.model[l].DeleteDecal(j);
- }
- }