-
-void Person::DoAnimations(){
- if(!skeleton.free){
- int i = 0;
- static float oldtarget;
-
- if(isIdle()&¤tanimation!=getIdle())normalsupdatedelay=0;
-
- if(targetanimation==tempanim||currentanimation==tempanim){
- animation[tempanim]=tempanimation;
- }
- if(targetanimation==jumpupanim||targetanimation==jumpdownanim||isFlip()){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- if(id==0){
- OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel);
- OPENAL_SetVolume(channels[whooshsound], 64*findLength(&velocity)/5);
- }
- if(((velocity.y<-15)||(crouchkeydown&&velocity.y<-8))&&abs(velocity.y)*4>fast_sqrt(velocity.x*velocity.x*velocity.z*velocity.z))landhard=1;
- if(!crouchkeydown&&velocity.y>=-15)landhard=0;
- }
- if((currentanimation==jumpupanim||targetanimation==jumpdownanim)/*&&velocity.y<40*/&&!isFlip()&&(!isLanding()&&!isLandhard())&&((crouchkeydown&&!crouchtogglekeydown))){
- XYZ targfacing;
- targfacing=0;
- targfacing.z=1;
-
- targfacing=DoRotation(targfacing,0,targetrotation,0);
-
- if(normaldotproduct(targfacing,velocity)>=-.3)targetanimation=flipanim;
- else targetanimation=backflipanim;
- crouchtogglekeydown=1;
- targetframe=0;
- target=0;
-
- if(id==0)numflipped++;
- }
-
- if(animation[targetanimation].attack!=reversed)feint=0;
- if(!crouchkeydown||(isLanding()||isLandhard())||(wasLanding()||wasLandhard())){
- crouchtogglekeydown=0;
- if(aitype==playercontrolled)feint=0;
- }
- else
- {
- if(!crouchtogglekeydown&&animation[targetanimation].attack==reversed&&aitype==playercontrolled&&(escapednum<2||reversaltrain))feint=1;
- if(!isFlip())crouchtogglekeydown=1;
- }
-
-
- if(animation[targetanimation].attack||currentanimation==getupfrombackanim||currentanimation==getupfromfrontanim){
- if(detail)normalsupdatedelay=0;
- }
-
- if(target>=1){
- if(targetanimation==rollanim&&targetframe==3&&onfire){
- onfire=0;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=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);
- OPENAL_SetPaused(channels[stream_firesound], true);
- deathbleeding=0;
- }
-
- if(targetanimation==rabbittacklinganim&&targetframe==1){
- //if(victim->aitype==attacktypecutoff&&Random()%2==0&&victim->stunned<=0&&animation[victim->targetanimation].attack==neutral&&victim->id!=0)Reverse();
- if(victim->aitype==attacktypecutoff&&victim->stunned<=0&&victim->surprised<=0&&victim->id!=0)Reverse();
- if(targetanimation==rabbittacklinganim&&targetframe==1&&!victim->isCrouch()&&victim->targetanimation!=backhandspringanim){
- if(normaldotproduct(victim->facing,facing)>0)victim->targetanimation=rabbittackledbackanim;
- else victim->targetanimation=rabbittackledfrontanim;
- victim->targetframe=2;
- victim->target=0;
- victim->rotation=rotation;
- victim->targetrotation=rotation;
- if(victim->aitype==gethelptype)victim->DoDamage(victim->damagetolerance-victim->damage);
- //victim->DoDamage(30);
- if(creature==wolftype){
- DoBloodBig(0,255);
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(1/victim->armorhead,210);
- }
- if(id==0){
- bonus=TackleBonus;
- bonustime=0;
- bonusvalue=5;
- if(victim->aitype==gethelptype)bonusvalue=50;
- }
- }
- }
-
- if(!drawtogglekeydown&&drawkeydown&&(weaponactive==-1||num_weapons==1)&&(animation[targetanimation].label[targetframe]||(targetanimation!=currentanimation&¤tanimation==rollanim))&&num_weapons>0&&creature!=wolftype){
- if(weapons.type[weaponids[0]]==knife){
- if(weaponactive==-1)weaponactive=0;
- else if(weaponactive==0)weaponactive=-1;
-
- if(weaponactive==-1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifesheathesound], 128);
- OPENAL_SetPaused(channels[knifesheathesound], false);
- }
- if(weaponactive!=-1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
- OPENAL_SetVolume(channels[knifedrawsound], 128);
- OPENAL_SetPaused(channels[knifedrawsound], false);
- }
- }
- drawtogglekeydown=1;
- }
- //Footstep sounds
- if(tutoriallevel!=1||id==0)
- if((animation[targetanimation].label[targetframe]&&(animation[targetanimation].label[targetframe]<5||animation[targetanimation].label[targetframe]==8))/*||(targetanimation==rollanim&&targetframe==animation[rollanim].numframes-1)*/){
- int whichsound;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(onterrain){
- if(terrain.getOpacity(coords.x,coords.z)<.2){
- if(animation[targetanimation].label[targetframe]==1)whichsound=footstepsound;
- else whichsound=footstepsound2;
- if(animation[targetanimation].label[targetframe]==1)FootLand(0,1);
- if(animation[targetanimation].label[targetframe]==2)FootLand(1,1);
- if(animation[targetanimation].label[targetframe]==3&&isRun()){
- FootLand(1,1);
- FootLand(0,1);
- }
-
- }
- if(terrain.getOpacity(coords.x,coords.z)>=.2){
- if(animation[targetanimation].label[targetframe]==1)whichsound=footstepsound3;
- else whichsound=footstepsound4;
- }
- }
- if(!onterrain){
- if(animation[targetanimation].label[targetframe]==1)whichsound=footstepsound3;
- else whichsound=footstepsound4;
- }
- if(animation[targetanimation].label[targetframe]==4&&(weaponactive==-1||(targetanimation!=knifeslashstartanim&&targetanimation!=knifethrowanim&&targetanimation!=crouchstabanim&&targetanimation!=swordgroundstabanim&&targetanimation!=knifefollowanim))){
- if(animation[targetanimation].attack!=neutral){
- i=abs(Random()%3);
- if(i==0)whichsound=lowwhooshsound;
- if(i==1)whichsound=midwhooshsound;
- if(i==2)whichsound=highwhooshsound;
- }
- if(animation[targetanimation].attack==neutral)whichsound=movewhooshsound;
- }
- else if(animation[targetanimation].label[targetframe]==4)whichsound=knifeswishsound;
- if(animation[targetanimation].label[targetframe]==8&&tutoriallevel!=1)whichsound=landsound2;
-
- PlaySoundEx( whichsound, samp[whichsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[whichsound], gLoc, vel);
- if(whichsound!=knifeswishsound)OPENAL_SetVolume(channels[whichsound], 128);
- if(whichsound!=knifeswishsound&&(targetanimation==staffhitanim||targetanimation==staffgroundsmashanim||targetanimation==staffspinhitanim))OPENAL_SetVolume(channels[whichsound], 256);
- if(whichsound==knifeswishsound)OPENAL_SetVolume(channels[whichsound], 512);
- OPENAL_SetPaused(channels[whichsound], false);
-
- if(id==0)
- if(whichsound==footstepsound||whichsound==footstepsound2||whichsound==footstepsound3||whichsound==footstepsound4){
- envsound[numenvsounds]=coords;
- if(targetanimation==wolfrunninganim||targetanimation==rabbitrunninganim)envsoundvol[numenvsounds]=15;
- else envsoundvol[numenvsounds]=6;
- envsoundlife[numenvsounds]=.4;
- numenvsounds++;
- }
-
- if(animation[targetanimation].label[targetframe]==3){
- whichsound--;
- PlaySoundEx( whichsound, samp[whichsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[whichsound], gLoc, vel);
- OPENAL_SetVolume(channels[whichsound], 128);
- OPENAL_SetPaused(channels[whichsound], false);
- }
- }
-
- //Combat sounds
- if(tutoriallevel!=1||id==0)
- if(speechdelay<=0)
- if(targetanimation!=crouchstabanim&&targetanimation!=swordgroundstabanim&&targetanimation!=staffgroundsmashanim)
- if((animation[targetanimation].label[targetframe]&&(animation[targetanimation].label[targetframe]<5||animation[targetanimation].label[targetframe]==8))/*||(targetanimation==rollanim&&targetframe==animation[rollanim].numframes-1)*/){
- int whichsound=-1;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(animation[targetanimation].label[targetframe]==4&&aitype!=playercontrolled){
- if(animation[targetanimation].attack!=neutral){
- i=abs(Random()%4);
- if(creature==rabbittype){
- if(i==0)whichsound=rabbitattacksound;
- if(i==1)whichsound=rabbitattack2sound;
- if(i==2)whichsound=rabbitattack3sound;
- if(i==3)whichsound=rabbitattack4sound;
- }
- if(creature==wolftype){
- if(i==0)whichsound=barksound;
- if(i==1)whichsound=bark2sound;
- if(i==2)whichsound=bark3sound;
- if(i==3)whichsound=barkgrowlsound;
- }
- speechdelay=.3;
- }
- //if(animation[targetanimation].attack==neutral)whichsound=movewhooshsound;
- }
- //else if(animation[targetanimation].label[targetframe]==4)whichsound=knifeswishsound;
- //if(animation[targetanimation].label[targetframe]==8)whichsound=landsound2;
-
- if(whichsound!=-1){
- PlaySoundEx( whichsound, samp[whichsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[whichsound], gLoc, vel);
- OPENAL_SetVolume(channels[whichsound], 512);
- OPENAL_SetPaused(channels[whichsound], false);
- }
- }
-
-
-
- if((!wasLanding()&&!wasLandhard())&¤tanimation!=getIdle()&&(isLanding()||isLandhard())){
- FootLand(0,1);
- FootLand(1,1);
- }
-
- transspeed=0;
- currentoffset=targetoffset;
- targetframe=currentframe;
- currentanimation=targetanimation;
- targetframe++;
-
- if(targetanimation==removeknifeanim&&animation[targetanimation].label[currentframe]==5){
- for(i=0;i<weapons.numweapons;i++){
- if(/*weapons.velocity[i].x==0&&weapons.velocity[i].y==0&&weapons.velocity[i].z==0&&*/weapons.owner[i]==-1)
- if(findDistancefastflat(&coords,&weapons.position[i])<4&&weaponactive==-1){
- if(findDistancefast(&coords,&weapons.position[i])>=1){
- if(weapons.type[i]!=staff){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
- OPENAL_SetVolume(channels[knifedrawsound], 128);
- OPENAL_SetPaused(channels[knifedrawsound], false);
- }
-
- weaponactive=0;
- weapons.owner[i]=id;
- if(num_weapons>0){
- weaponids[num_weapons]=weaponids[0];
- }
- num_weapons++;
- weaponids[0]=i;
- }
- }
- }
- }
-
- static bool willwork;
- if(targetanimation==crouchremoveknifeanim&&animation[targetanimation].label[currentframe]==5){
- for(i=0;i<weapons.numweapons;i++){
- bool willwork=1;
- if(weapons.owner[i]!=-1)
- if(player[weapons.owner[i]].weaponstuck!=-1)
- if(player[weapons.owner[i]].weaponids[player[weapons.owner[i]].weaponstuck]==i)
- if(player[weapons.owner[i]].num_weapons>1)willwork=0;
- if((/*weapons.velocity[i].x==0&&weapons.velocity[i].y==0&&weapons.velocity[i].z==0&&*/weapons.owner[i]==-1)||(hasvictim&&weapons.owner[i]==victim->id&&victim->skeleton.free))
- if(willwork&&findDistancefastflat(&coords,&weapons.position[i])<3&&weaponactive==-1){
- if(findDistancefast(&coords,&weapons.position[i])<1||hasvictim){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- bool fleshstuck=0;
- if(weapons.owner[i]!=-1)
- if(victim->weaponstuck!=-1){
- if(victim->weaponids[victim->weaponstuck]==i){
- fleshstuck=1;
- }
- }
- if(!fleshstuck){
- if(weapons.type[i]!=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);
- }
- weaponactive=0;
- if(weapons.owner[i]!=-1){
-
- victim=&player[weapons.owner[i]];
- if(victim->num_weapons==1)victim->num_weapons=0;
- else victim->num_weapons=1;
-
- //victim->weaponactive=-1;
- victim->skeleton.longdead=0;
- victim->skeleton.free=1;
- victim->skeleton.broken=0;
-
- for(int j=0;j<victim->skeleton.num_joints;j++){
- victim->skeleton.joints[j].velchange=0;
- victim->skeleton.joints[j].locked=0;
- }
-
- XYZ relative;
- relative=0;
- relative.y=10;
- Normalise(&relative);
- XYZ footvel,footpoint;
- footvel=0;
- footpoint=weapons.position[i];
- if(victim->weaponstuck!=-1){
- if(victim->weaponids[victim->weaponstuck]==i){
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
- weapons.bloody[i]=2;
- weapons.blooddrip[i]=5;
- victim->weaponstuck=-1;
- }
- }
- if(victim->num_weapons>0){
- if(victim->weaponstuck!=0&&victim->weaponstuck!=-1)victim->weaponstuck=0;
- if(victim->weaponids[0]==i)
- victim->weaponids[0]=victim->weaponids[victim->num_weapons];
- }
-
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*6;
- victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity+=relative*6;
- victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity+=relative*6;
- victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity+=relative*6;
- }
- weapons.owner[i]=id;
- if(num_weapons>0){
- weaponids[num_weapons]=weaponids[0];
- }
- num_weapons++;
- weaponids[0]=i;
- }
- }
- }
- }
-
- if(currentanimation==drawleftanim&&animation[targetanimation].label[currentframe]==5){
- if(weaponactive==-1)weaponactive=0;
- else if(weaponactive==0){
- weaponactive=-1;
- if(num_weapons==2){
- int buffer;
- buffer=weaponids[0];
- weaponids[0]=weaponids[1];
- weaponids[1]=buffer;
- }
- }
- if(weaponactive==-1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifesheathesound], 128);
- OPENAL_SetPaused(channels[knifesheathesound], false);
- }
- if(weaponactive!=-1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
- OPENAL_SetVolume(channels[knifedrawsound], 128);
- OPENAL_SetPaused(channels[knifedrawsound], false);
- }
- }
-
-
- if((currentanimation==walljumprightkickanim&&targetanimation==walljumprightkickanim)||(currentanimation==walljumpleftkickanim&&targetanimation==walljumpleftkickanim)){
- XYZ rotatetarget=DoRotation(skeleton.forward,0,rotation,0);
- Normalise(&rotatetarget);
- targetrotation=-asin(0-rotatetarget.x);
- targetrotation*=360/6.28;
- if(rotatetarget.z<0)targetrotation=180-targetrotation;
-
- if(targetanimation==walljumprightkickanim)targetrotation+=40;
- if(targetanimation==walljumpleftkickanim)targetrotation-=40;
- }
-
- bool dojumpattack;
- dojumpattack=0;
- if((targetanimation==rabbitrunninganim||targetanimation==wolfrunninganim)&&targetframe==3&&(jumpkeydown||attackkeydown||id!=0))dojumpattack=1;
- if(hasvictim)
- if(findDistancefast(&victim->coords,&/*player[i].*/coords)<5&&victim->aitype==gethelptype&&(attackkeydown)&&!victim->skeleton.free&&victim->isRun()&&victim->runninghowlong>=1)dojumpattack=1; if(!hostile)dojumpattack=0;
- if(dojumpattack){
- if((targetanimation==rabbitrunninganim||targetanimation==wolfrunninganim)&&id==0){
- targetanimation=rabbittackleanim;
- targetframe=0;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( jumpsound, samp[jumpsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[jumpsound], gLoc, vel);
- OPENAL_SetVolume(channels[jumpsound], 128);
- OPENAL_SetPaused(channels[jumpsound], false);
- }
-
- float closestdist;
- closestdist=0;
- int closestid;
- closestid=-1;
- XYZ targetloc;
- targetloc=velocity;
- Normalise(&targetloc);
- targetloc+=coords;
- for(i=0;i<numplayers;i++){
- if(i!=id)
- if(findDistancefast(&targetloc,&player[i].coords)<closestdist||closestdist==0){
- closestdist=findDistancefast(&targetloc,&player[i].coords);
- closestid=i;
- }
- }
- if(closestid!=-1)
- if(closestdist<5&&!player[closestid].dead&&animation[player[closestid].targetanimation].height!=lowheight&&player[closestid].targetanimation!=backhandspringanim){
- hasvictim=1;
- victim=&player[closestid];
- coords=victim->coords;
- currentanimation=rabbittacklinganim;
- targetanimation=rabbittacklinganim;
- currentframe=0;
- targetframe=1;
- XYZ rotatetarget;
- if(coords.z!=victim->coords.z||coords.x!=victim->coords.x){
- rotatetarget=coords-victim->coords;
- Normalise(&rotatetarget);
- targetrotation=-asin(0-rotatetarget.x);
- targetrotation*=360/6.28;
- if(rotatetarget.z<0)targetrotation=180-targetrotation;
- }
- if(targetanimation!=rabbitrunninganim){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( jumpsound, samp[jumpsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[jumpsound], gLoc, vel);
- OPENAL_SetVolume(channels[jumpsound], 128);
- OPENAL_SetPaused(channels[jumpsound], false);
- }
- }
- }
-
- //Move impacts
- float damagemult=1*power;
- if(creature==wolftype)damagemult=2.5*power;
- if(hasvictim){damagemult/=victim->damagetolerance/200;}
- //if(onfire)damagemult=3;
- if((animation[targetanimation].attack==normalattack||targetanimation==walljumprightkickanim||targetanimation==walljumpleftkickanim)&&(!feint)&&(victim->skeleton.free!=2||targetanimation==killanim||targetanimation==dropkickanim||targetanimation==crouchstabanim||targetanimation==swordgroundstabanim||targetanimation==staffgroundsmashanim)){
- if(targetanimation==spinkickanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&3&&animation[victim->targetanimation].height!=lowheight){
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2||creature==wolftype){
- victim->spurt=1;
- DoBlood(.2,250);
- if(creature==wolftype)DoBloodBig(0,250);
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 128);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- if(creature==wolftype){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2/victim->armorhead,175);
- }
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,-90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*40;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
- //FootLand(1,2);
- victim->Puff(head);
- victim->DoDamage(damagemult*100/victim->protectionhead);
-
- if(id==0){
- SolidHitBonus();
- }
- }
- }
-
- if(targetanimation==wolfslapanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&3&&animation[victim->targetanimation].height!=lowheight){
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2||creature==wolftype){
- victim->spurt=1;
- if(creature==wolftype)DoBloodBig(0,235);
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( whooshhitsound, samp[whooshhitsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
- OPENAL_SetVolume(channels[whooshhitsound], 512);
- OPENAL_SetPaused(channels[whooshhitsound], false);
- if(creature==wolftype){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2,175);
- }
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- relative.y-=1;
- Normalise(&relative);
- relative=DoRotation(relative,0,90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*20;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*100;
- //FootLand(1,2);
- victim->Puff(head);
- victim->DoDamage(damagemult*50/victim->protectionhead);
- }
- }
-
- if(targetanimation==walljumprightkickanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&animation[victim->targetanimation].height!=lowheight){
- escapednum=0;
- if(id==0)camerashake+=.4;
- victim->spurt=1;
- DoBlood(.2,250);
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 160);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- if(creature==wolftype){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2/victim->armorhead,175);
- }
- victim->RagDoll(0);
- XYZ relative;
- relative=facing;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,-90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*40;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
- //FootLand(1,2);
- victim->Puff(head);
- victim->DoDamage(damagemult*150/victim->protectionhead);
-
- if(victim->damage>victim->damagetolerance){
- if(id==0){
- bonus=style;
- bonustime=0;
- bonusvalue=150;
- }
- }
- else if(id==0){
- SolidHitBonus();
- }
- }
- }
-
- if(targetanimation==walljumpleftkickanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&animation[victim->targetanimation].height!=lowheight){
- escapednum=0;
- if(id==0)camerashake+=.4;
- victim->spurt=1;
- DoBlood(.2,250);
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 160);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- if(creature==wolftype){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2/victim->armorhead,175);
- }
- victim->RagDoll(0);
- XYZ relative;
- relative=facing;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*40;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
- //FootLand(1,2);
- victim->Puff(head);
- victim->DoDamage(damagemult*150/victim->protectionhead);
-
- if(victim->damage>victim->damagetolerance){
- if(id==0){
- bonus=style;
- bonustime=0;
- bonusvalue=150;
- }
- }
- else if(id==0){
- SolidHitBonus();
- }
- }
- }
-
- if(targetanimation==blockhighleftstrikeanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&animation[victim->targetanimation].height!=lowheight){
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2){
- victim->spurt=1;
- DoBlood(.2,235);
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( whooshhitsound, samp[whooshhitsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
- OPENAL_SetVolume(channels[whooshhitsound], 512);
- OPENAL_SetPaused(channels[whooshhitsound], false);
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*30;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*100;
- //FootLand(1,2);
- victim->Puff(head);
- victim->DoDamage(damagemult*50/victim->protectionhead);
- }
- }
-
- if(targetanimation==killanim&&animation[targetanimation].label[currentframe]==8){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&victim->dead){
- escapednum=0;
- if(id==0)camerashake+=.2;
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- /*PlaySoundEx( landsound2, samp[landsound2], NULL, true);
- OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
- OPENAL_SetVolume(channels[landsound2], 128);
- OPENAL_SetPaused(channels[landsound2], false);
- */
- PlaySoundEx( movewhooshsound, samp[movewhooshsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[movewhooshsound], gLoc, vel);
- OPENAL_SetVolume(channels[movewhooshsound], 128);
- OPENAL_SetPaused(channels[movewhooshsound], false);
-
- victim->skeleton.longdead=0;
- victim->skeleton.free=1;
- victim->skeleton.broken=0;
- victim->skeleton.spinny=1;
-
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velchange=0;
- victim->skeleton.joints[i].delay=0;
- victim->skeleton.joints[i].locked=0;
- //victim->skeleton.joints[i].velocity=0;
- }
-
- XYZ relative;
- relative=0;
- relative.y=1;
- Normalise(&relative);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity.y=relative.y*10;
- victim->skeleton.joints[i].position.y+=relative.y*.3;
- victim->skeleton.joints[i].oldposition.y+=relative.y*.3;
- victim->skeleton.joints[i].realoldposition.y+=relative.y*.3;
- }
- victim->Puff(abdomen);
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity.y=relative.y*400;
- }
- }
-
- if(targetanimation==killanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9&&victim->dead){
- escapednum=0;
- if(id==0)camerashake+=.4;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 128);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*90;
- }
- victim->Puff(abdomen);
- if(victim->dead!=2&&victim->permanentdamage>victim->damagetolerance-250&&autoslomo){
- slomo=1;
- slomodelay=.2;
- }
- victim->DoDamage(damagemult*500/victim->protectionhigh);
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*300;
- }
- }
-
- if(targetanimation==dropkickanim&&animation[targetanimation].label[currentframe]==7){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9&&victim->skeleton.free){
- escapednum=0;
- if(id==0)camerashake+=.4;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(tutoriallevel!=1){
- PlaySoundEx( thudsound, samp[thudsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[thudsound], gLoc, vel);
- OPENAL_SetVolume(channels[thudsound], 400);
- OPENAL_SetPaused(channels[thudsound], false);
- }
-
- victim->skeleton.longdead=0;
- victim->skeleton.free=1;
- victim->skeleton.broken=0;
- victim->skeleton.spinny=1;
-
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velchange=0;
- //victim->skeleton.joints[i].delay=0;
- victim->skeleton.joints[i].locked=0;
- }
- XYZ relative;
- relative=victim->coords-coords;
- Normalise(&relative);
- relative.y+=.3;
- Normalise(&relative);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*20;
- }
- if(id==0&&!victim->dead){
- SolidHitBonus();
- }
-
- victim->Puff(abdomen);
- victim->DoDamage(damagemult*20/victim->protectionhigh);
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
- staggerdelay=.5;
- if(!victim->dead)staggerdelay=1.2;
-
-
- }
- }
-
- if((targetanimation==crouchstabanim||targetanimation==swordgroundstabanim)&&animation[targetanimation].label[currentframe]==5){
- // if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9){
- //if(id==0)camerashake+=.4;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- if(hasvictim)
- if(!victim->skeleton.free)hasvictim=0;
-
- if(!hasvictim){
- terrain.MakeDecal(blooddecalfast,(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2),.08,.6,Random()%360);
- PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifesheathesound], 128);
- OPENAL_SetPaused(channels[knifesheathesound], false);
- }
-
- if(victim&&hasvictim){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3){
-
- XYZ where,startpoint,endpoint,movepoint,colpoint;
- float rotationpoint;
- int whichtri;
- if(weapons.type[weaponids[weaponactive]]==knife){
- where=(weapons.tippoint[weaponids[weaponactive]]*.6+weapons.position[weaponids[weaponactive]]*.4);
- where-=victim->coords;
- if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
- //where=scale;
- startpoint=where;
- startpoint.y+=100;
- endpoint=where;
- endpoint.y-=100;
- }
- if(weapons.type[weaponids[weaponactive]]==sword){
- where=weapons.position[weaponids[weaponactive]];
- where-=victim->coords;
- if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
- startpoint=where;
- where=weapons.tippoint[weaponids[weaponactive]];
- where-=victim->coords;
- if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
- endpoint=where;
- }
- if(weapons.type[weaponids[weaponactive]]==staff){
- where=weapons.position[weaponids[weaponactive]];
- where-=victim->coords;
- if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
- startpoint=where;
- where=weapons.tippoint[weaponids[weaponactive]];
- where-=victim->coords;
- if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
- endpoint=where;
- }
- movepoint=0;
- rotationpoint=0;
- whichtri=victim->skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &colpoint, &movepoint, &rotationpoint);
-
- if(whichtri!=-1){
- if(victim->dead!=2){
- victim->DoDamage(abs((victim->damagetolerance-victim->permanentdamage)*2));
- if(id==0&&!victim->dead){
- bonus=FinishedBonus;
- bonustime=0;
- bonusvalue=200;
- }
- }
- if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
-
- victim->skeleton.longdead=0;
- victim->skeleton.free=1;
- victim->skeleton.broken=0;
-
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velchange=0;
- victim->skeleton.joints[i].locked=0;
- //victim->skeleton.joints[i].velocity=0;
- }
- PlaySoundEx( fleshstabsound, samp[fleshstabsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fleshstabsound], gLoc, vel);
- OPENAL_SetVolume(channels[fleshstabsound], 128);
- OPENAL_SetPaused(channels[fleshstabsound], false);
-
- }
- if(whichtri!=-1||weapons.bloody[weaponids[weaponactive]]){
- weapons.blooddrip[weaponids[weaponactive]]+=5;
- weapons.blooddripdelay[weaponids[weaponactive]]=0;
- }
- if(whichtri==-1){
- hasvictim=0;
- PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifesheathesound], 128);
- OPENAL_SetPaused(channels[knifesheathesound], false);
- }
- }
- }
- }
-
- if((targetanimation==crouchstabanim||targetanimation==swordgroundstabanim)&&animation[targetanimation].label[currentframe]==6){
- // if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9){
- //if(id==0)camerashake+=.4;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(!hasvictim){
- PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
- OPENAL_SetVolume(channels[knifedrawsound], 128);
- OPENAL_SetPaused(channels[knifedrawsound], false);
- }
-
- if(victim&&hasvictim){
- XYZ footvel,footpoint;
-
- PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
- OPENAL_SetVolume(channels[fleshstabremovesound], 128);
- OPENAL_SetPaused(channels[fleshstabremovesound], false);
-
- footvel=0;
- footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
-
- if(weapons.type[weaponids[weaponactive]]==sword){
- XYZ where,startpoint,endpoint,movepoint;
- float rotationpoint;
- int whichtri;
-
- where=weapons.position[weaponids[weaponactive]];
- where-=victim->coords;
- if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
- startpoint=where;
- where=weapons.tippoint[weaponids[weaponactive]];
- where-=victim->coords;
- if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
- endpoint=where;
-
- movepoint=0;
- rotationpoint=0;
- whichtri=victim->skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &footpoint, &movepoint, &rotationpoint);
- footpoint+=victim->coords;
-
- if(whichtri==-1){
- footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
- }
- }
- if(weapons.type[weaponids[weaponactive]]==staff){
- XYZ where,startpoint,endpoint,movepoint;
- float rotationpoint;
- int whichtri;
-
- where=weapons.position[weaponids[weaponactive]];
- where-=victim->coords;
- if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
- startpoint=where;
- where=weapons.tippoint[weaponids[weaponactive]];
- where-=victim->coords;
- if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
- endpoint=where;
-
- movepoint=0;
- rotationpoint=0;
- whichtri=victim->skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &footpoint, &movepoint, &rotationpoint);
- footpoint+=victim->coords;
-
- if(whichtri==-1){
- footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
- }
- }
- hasvictim=victim->DoBloodBigWhere(2,220,footpoint);
- if(hasvictim){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3){
- victim->skeleton.longdead=0;
- victim->skeleton.free=1;
- victim->skeleton.broken=0;
-
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velchange=0;
- victim->skeleton.joints[i].locked=0;
- //victim->skeleton.joints[i].velocity=0;
- }
-
- XYZ relative;
- relative=0;
- relative.y=10;
- Normalise(&relative);
- //victim->Puff(abdomen);
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
-
- if(victim->bloodloss<victim->damagetolerance){
- victim->bloodloss+=1000;
- victim->bled=0;
- }
-
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*20;
- }
- }
- }
- if(!hasvictim&&onterrain){
- weapons.bloody[weaponids[weaponactive]]=0;
- weapons.blooddrip[weaponids[weaponactive]]=0;
- }
- }
-
- if(targetanimation==upunchanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3){
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2){
- victim->spurt=1;
- DoBlood(.2,235);
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- //if(!victim->isIdle()||victim->damage>victim->damagetolerance-60){
- if(1==1){
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 128);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- }
- else {
- if(tutoriallevel!=1){
- PlaySoundEx( landsound2, samp[landsound2], NULL, true);
- OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
- OPENAL_SetVolume(channels[landsound2], 256);
- OPENAL_SetPaused(channels[landsound2], false);
- }
- }
-
- //if(!victim->isIdle()||victim->damage>victim->damagetolerance-60)
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity=relative*30;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*150;
-
- victim->targetframe=0;
- victim->targetanimation=staggerbackhardanim;
- victim->targetrotation=targetrotation+180;
- victim->target=0;
- victim->stunned=1;
-
- victim->Puff(head);
- victim->Puff(abdomen);
- victim->DoDamage(damagemult*60/victim->protectionhigh);
-
- if(id==0){
- SolidHitBonus();
- }
- }
- }
-
-
- if(targetanimation==winduppunchanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*2){
- escapednum=0;
- if(id==0)camerashake+=.4;
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- //if(!victim->isIdle()||victim->damage>victim->damagetolerance-60){
- if(victim->damage<=victim->damagetolerance-60&&normaldotproduct(victim->facing,victim->coords-coords)<(scale*5)*(scale*5)*0&&animation[victim->targetanimation].height!=lowheight){
- if(tutoriallevel!=1){
- PlaySoundEx( thudsound, samp[thudsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[thudsound], gLoc, vel);
- OPENAL_SetVolume(channels[thudsound], 512);
- OPENAL_SetPaused(channels[thudsound], false);
- }
- }
- else if(victim->damage<=victim->damagetolerance-60&&normaldotproduct(victim->facing,victim->coords-coords)<(scale*5)*(scale*5)*0&&animation[victim->targetanimation].height==lowheight){
- if(tutoriallevel!=1){
- PlaySoundEx( whooshhitsound, samp[whooshhitsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
- OPENAL_SetVolume(channels[whooshhitsound], 512);
- OPENAL_SetPaused(channels[whooshhitsound], false);
- }
- }
- else {
- 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);
- }
- }
-
- if(victim->damage>victim->damagetolerance-60||normaldotproduct(victim->facing,victim->coords-coords)>0||animation[victim->targetanimation].height==lowheight)
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- relative.y=.3;
- Normalise(&relative);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity=relative*5;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*400;
-
- victim->targetframe=0;
- victim->targetanimation=staggerbackhardanim;
- victim->targetrotation=targetrotation+180;
- victim->target=0;
- victim->stunned=1;
-
- victim->Puff(abdomen);
- victim->DoDamage(damagemult*60/victim->protectionhigh);
-
- if(id==0){
- SolidHitBonus();
- }
- }
- }
-
- if(targetanimation==blockhighleftanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*4){
- if(victim->id==0)camerashake+=.4;
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( landsound2, samp[landsound2], NULL, true);
- OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
- OPENAL_SetVolume(channels[landsound2], 256);
- OPENAL_SetPaused(channels[landsound2], false);
-
- Puff(righthand);
- }
- }
-
- if(targetanimation==swordslashparryanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*4){
- if(victim->id==0)camerashake+=.4;
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- if(weaponactive!=-1){
- if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
- if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
- if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
-
- PlaySoundEx( swordstaffsound, samp[swordstaffsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
- OPENAL_SetVolume(channels[swordstaffsound], 512);
- OPENAL_SetPaused(channels[swordstaffsound], false);
- }
- else{
- PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
- OPENAL_SetVolume(channels[metalhitsound], 512);
- OPENAL_SetPaused(channels[metalhitsound], false);
- }
- }
-
- //Puff(righthand);
- }
- }
-
- if(targetanimation==knifethrowanim&&animation[targetanimation].label[currentframe]==5){
- if(weaponactive!=-1){
- escapednum=0;
- XYZ aim;
- weapons.owner[weaponids[0]]=-1;
- aim=victim->coords+DoRotation(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position,0,victim->rotation,0)*victim->scale+victim->velocity*findDistance(&victim->coords,&coords)/50-(coords+DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position,0,rotation,0)*scale);
- Normalise(&aim);
- /*if(victim->targetanimation==jumpupanim||victim->targetanimation==jumpdownanim){
- aim=DoRotation(aim,(float)abs(Random()%15)-7,(float)abs(Random()%15)-7,0);
- }*/
- weapons.velocity[weaponids[0]]=aim*50;
- weapons.tipvelocity[weaponids[0]]=aim*50;
- weapons.missed[weaponids[0]]=0;
- weapons.hitsomething[weaponids[0]]=0;
- weapons.freetime[weaponids[0]]=0;
- weapons.firstfree[weaponids[0]]=1;
- weapons.physics[weaponids[0]]=0;
- num_weapons--;
- if(num_weapons){
- weaponids[0]=weaponids[num_weapons];
- }
- weaponactive=-1;
- }
- }
-
- if(targetanimation==knifeslashstartanim&&animation[targetanimation].label[currentframe]==5){
- if(hasvictim)
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*4.5&&/*animation[victim->targetanimation].height!=lowheight&&*/victim->targetanimation!=dodgebackanim&&victim->targetanimation!=rollanim){
- escapednum=0;
- //if(Random()%2){
- if(tutoriallevel!=1)victim->DoBloodBig(1.5/victim->armorhigh,225);
- //}
-
- if(id==0){
- bonus=Slicebonus;
- bonustime=0;
- bonusvalue=10;
- }
- if(tutoriallevel!=1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifeslicesound], 512);
- OPENAL_SetPaused(channels[knifeslicesound], false);
- }
- //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
- if(animation[victim->targetanimation].attack&&(victim->aitype!=playercontrolled||victim->targetanimation==knifeslashstartanim)&&(victim->creature==rabbittype||victim->deathbleeding<=0)){
- if(victim->id != 0 || difficulty==2){
- victim->targetframe=0;
- victim->targetanimation=staggerbackhardanim;
- victim->targetrotation=targetrotation+180;
- victim->target=0;
- }
- }
- victim->lowreversaldelay=0;
- victim->highreversaldelay=0;
- if(aitype!=playercontrolled)weaponmissdelay=.6;
-
- if(tutoriallevel!=1)if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
- if(tutoriallevel!=1)weapons.blooddrip[weaponids[weaponactive]]+=3;
-
- XYZ footvel,footpoint;
- footvel=0;
- if(skeleton.free){
- footpoint=(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2*victim->scale+victim->coords;
- }
- if(!skeleton.free){
- footpoint=DoRotation((victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2,0,victim->rotation,0)*victim->scale+victim->coords;
- }
- if(tutoriallevel!=1){
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .6, .3);
- footvel=DoRotation(facing,0,90,0)*.8;
- //footvel.y-=.3;
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .2, 1);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .2, 1);
- }
- if(tutoriallevel==1){
- Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .6, .3);
- }
- victim->DoDamage(damagemult*0);
- }
- }
- if(targetanimation==swordslashanim&&animation[targetanimation].label[currentframe]==5&&victim->targetanimation!=rollanim){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5&&victim->targetanimation!=dodgebackanim){
- if(victim->weaponactive==-1||normaldotproduct(victim->facing,victim->coords-coords)>0||(Random()%2==0)){
- if(id==0){
- bonus=Slashbonus;
- bonustime=0;
- bonusvalue=40;
- }
- escapednum=0;
- if(tutoriallevel!=1){
- if(normaldotproduct(victim->facing,victim->coords-coords)<0)victim->DoBloodBig(2/victim->armorhigh,190);
- else victim->DoBloodBig(2/victim->armorhigh,185);
- victim->deathbleeding=1;
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( swordslicesound, samp[swordslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[swordslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[swordslicesound], 512);
- OPENAL_SetPaused(channels[swordslicesound], false);
- }
- //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
- //if(animation[victim->targetanimation].attack){
- //if(victim->creature==rabbittype){
- if(tutoriallevel!=1){
- victim->targetframe=0;
- victim->targetanimation=staggerbackhardanim;
- victim->targetrotation=targetrotation+180;
- victim->target=0;
- }
- //}
- //}
-
- if(tutoriallevel!=1){
- if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
- weapons.blooddrip[weaponids[weaponactive]]+=3;
-
- float bloodlossamount;
- bloodlossamount=200+abs((float)(Random()%40))-20;
- victim->bloodloss+=bloodlossamount/victim->armorhigh;
- //victim->bloodloss+=100*(6.5-findDistancefast(&coords,&victim->coords));
- victim->DoDamage(damagemult*0);
-
- XYZ footvel,footpoint;
- footvel=0;
- if(skeleton.free){
- footpoint=(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2*victim->scale+victim->coords;
- }
- if(!skeleton.free){
- footpoint=DoRotation((victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2,0,victim->rotation,0)*victim->scale+victim->coords;
- }
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
- footvel=DoRotation(facing,0,90,0)*.8;
- footvel.y-=.3;
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
- }
- }
- else {
-
-
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(victim->weaponactive!=-1){
- if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
- if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
- if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
-
- PlaySoundEx( swordstaffsound, samp[swordstaffsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[swordstaffsound], gLoc, vel);
- OPENAL_SetVolume(channels[swordstaffsound], 512);
- OPENAL_SetPaused(channels[swordstaffsound], false);
- }
- else{
- PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
- OPENAL_SetVolume(channels[metalhitsound], 512);
- OPENAL_SetPaused(channels[metalhitsound], false);
- }
- }
-
-
- XYZ aim;
- victim->Puff(righthand);
- victim->target=0;
- victim->targetframe=0;
- victim->targetanimation=staggerbackhighanim;
- victim->targetrotation=targetrotation+180;
- victim->target=0;
- weapons.owner[victim->weaponids[0]]=-1;
- aim=DoRotation(facing,0,90,0)*21;
- aim.y+=7;
- weapons.velocity[victim->weaponids[0]]=aim*-.2;
- weapons.tipvelocity[victim->weaponids[0]]=aim;
- weapons.missed[victim->weaponids[0]]=1;
- weapons.hitsomething[weaponids[0]]=0;
- weapons.freetime[victim->weaponids[0]]=0;
- weapons.firstfree[victim->weaponids[0]]=1;
- weapons.physics[victim->weaponids[0]]=1;
- victim->num_weapons--;
- if(victim->num_weapons){
- victim->weaponids[0]=victim->weaponids[num_weapons];
- if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
- }
- victim->weaponactive=-1;
- for(i=0;i<numplayers;i++){
- player[i].wentforweapon=0;
- }
-
- /*PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
- OPENAL_SetVolume(channels[metalhitsound], 512);
- OPENAL_SetPaused(channels[metalhitsound], false);*/
-
- }
- }
- }
-
- if(targetanimation==staffhitanim&&animation[targetanimation].label[currentframe]==5&&victim->targetanimation!=rollanim){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5&&victim->targetanimation!=dodgebackanim&&victim->targetanimation!=sweepanim){
- if(tutoriallevel!=1){
- weapons.damage[weaponids[0]]+=.4+float(abs(Random()%100)-50)/250;
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2||creature==wolftype){
- victim->spurt=1;
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( staffheadsound, samp[staffheadsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[staffheadsound], gLoc, vel);
- OPENAL_SetVolume(channels[staffheadsound], 256);
- OPENAL_SetPaused(channels[staffheadsound], false);
- }
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,90,0);
- relative.y-=1;
- Normalise(&relative);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*60;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*230;
- victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity+=relative*damagemult*230;
- //FootLand(1,2);
- victim->Puff(head);
- if(tutoriallevel!=1){
- victim->DoDamage(damagemult*120/victim->protectionhigh);
-
- if(id==0){
- bonus=solidhit;
- bonustime=0;
- bonusvalue=30;
- }
- }
- }
- }
-
- if(targetanimation==staffspinhitanim&&animation[targetanimation].label[currentframe]==5&&victim->targetanimation!=rollanim){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5&&victim->targetanimation!=dodgebackanim&&victim->targetanimation!=sweepanim){
- if(tutoriallevel!=1){
- weapons.damage[weaponids[0]]+=.6+float(abs(Random()%100)-50)/250;
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2||creature==wolftype){
- victim->spurt=1;
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( staffheadsound, samp[staffheadsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[staffheadsound], gLoc, vel);
- OPENAL_SetVolume(channels[staffheadsound], 256);
- OPENAL_SetPaused(channels[staffheadsound], false);
- }
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,-90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*40;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*220;
- victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity+=relative*damagemult*220;
- //FootLand(1,2);
- victim->Puff(head);
- if(tutoriallevel!=1){victim->DoDamage(damagemult*350/victim->protectionhead);
-
- if(id==0){
- bonus=solidhit;
- bonustime=0;
- bonusvalue=60;
- }
- }
- }
- }
-
- if(targetanimation==staffgroundsmashanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5){
- escapednum=0;
- if(tutoriallevel!=1){
- if(!victim->dead)weapons.damage[weaponids[0]]+=.4+float(abs(Random()%100)-50)/500;
- if(id==0)camerashake+=.4;
- if(Random()%2||creature==wolftype){
- victim->spurt=1;
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( staffbodysound, samp[staffbodysound], NULL, true);
- OPENAL_3D_SetAttributes(channels[staffbodysound], gLoc, vel);
- OPENAL_SetVolume(channels[staffbodysound], 256);
- OPENAL_SetPaused(channels[staffbodysound], false);
- }
- victim->skeleton.longdead=0;
- victim->skeleton.free=1;
- victim->skeleton.broken=0;
-
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velchange=0;
- victim->skeleton.joints[i].locked=0;
- //victim->skeleton.joints[i].velocity=0;
- }
-
- victim->RagDoll(0);
- XYZ relative;
- relative=0;
- /*relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,90,0);*/
- relative.y=-1;
- Normalise(&relative);
- if(!victim->dead){
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity=relative*damagemult*40;
- }
- //FootLand(1,2);
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*40;
- }
- if(victim->dead){
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity=relative*damagemult*abs(Random()%20);
- }
- //FootLand(1,2);
- //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*20;
- }
- victim->Puff(abdomen);
- if(tutoriallevel!=1){victim->DoDamage(damagemult*100/victim->protectionhigh);
-
- if(!victim->dead){
- if(id==0){
- bonus=solidhit;
- bonustime=0;
- bonusvalue=40;
- }
- }
- }
- }
- }
-
- if(targetanimation==lowkickanim&&animation[targetanimation].label[currentframe]==5){
- if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&animation[victim->targetanimation].height!=highheight){
- escapednum=0;
- if(id==0)camerashake+=.4;
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
-
- if(id==0){
- SolidHitBonus();
- }
-
- if(animation[victim->targetanimation].height==lowheight){
- if(Random()%2){
- victim->spurt=1;
- DoBlood(.2,250);
- }
- victim->RagDoll(0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*40;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 128);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- victim->Puff(head);
- victim->DoDamage(damagemult*100/victim->protectionhead);
- if(victim->howactive==typesleeping)victim->DoDamage(damagemult*150/victim->protectionhead);
- if(creature==wolftype){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2/victim->armorhead,175);
- }
- }
- else{
- if(victim->damage>=victim->damagetolerance)victim->RagDoll(0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*10;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
- victim->targetframe=0;
- victim->targetanimation=staggerbackhighanim;
- victim->targetrotation=targetrotation+180;
- victim->target=0;
- if(tutoriallevel!=1){
- PlaySoundEx( landsound2, samp[landsound2], NULL, true);
- OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
- OPENAL_SetVolume(channels[landsound2], 128);
- OPENAL_SetPaused(channels[landsound2], false);
- }
- victim->Puff(abdomen);
- victim->DoDamage(damagemult*30/victim->protectionhigh);
- if(creature==wolftype){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2/victim->armorhigh,170);
- }
- }
-
- }
- }
-
- if(targetanimation==sweepanim&&animation[targetanimation].label[currentframe]==5){
- if(victim->targetanimation!=jumpupanim&&findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&victim!=this){
- escapednum=0;
- if(id==0)camerashake+=.2;
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(tutoriallevel!=1){
- PlaySoundEx( landsound2, samp[landsound2], NULL, true);
- OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
- OPENAL_SetVolume(channels[landsound2], 128);
- OPENAL_SetPaused(channels[landsound2], false);
- }
- XYZ relative;
- relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
-
- if(animation[victim->targetanimation].height==middleheight||animation[victim->currentanimation].height==middleheight||victim->damage>=victim->damagetolerance-40){
- victim->RagDoll(0);
-
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*15;
- }
- relative=DoRotation(relative,0,-90,0);
- relative.y+=.1;
- for(i=0;i<victim->skeleton.num_joints;i++){
- if(victim->skeleton.joints[i].label==leftfoot||victim->skeleton.joints[i].label==rightfoot||victim->skeleton.joints[i].label==leftankle||victim->skeleton.joints[i].label==rightankle)
- victim->skeleton.joints[i].velocity=relative*80;
- }
- victim->Puff(rightankle);
- victim->Puff(leftankle);
- victim->DoDamage(damagemult*40/victim->protectionlow);
- }
- else{
- if(victim->damage>=victim->damagetolerance)victim->RagDoll(0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*10;
- }
- relative=DoRotation(relative,0,-90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- if(victim->skeleton.joints[i].label==leftfoot||victim->skeleton.joints[i].label==rightfoot||victim->skeleton.joints[i].label==leftankle||victim->skeleton.joints[i].label==rightankle)
- victim->skeleton.joints[i].velocity+=relative*damagemult*80;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
- victim->targetframe=0;
- victim->targetanimation=staggerbackhighanim;
- victim->targetrotation=targetrotation+180;
- victim->target=0;
- if(tutoriallevel!=1){
- PlaySoundEx( landsound2, samp[landsound2], NULL, true);
- OPENAL_3D_SetAttributes(channels[landsound2], gLoc, vel);
- OPENAL_SetVolume(channels[landsound2], 128);
- OPENAL_SetPaused(channels[landsound2], false);
- }
- victim->Puff(abdomen);
- victim->DoDamage(damagemult*30/victim->protectionlow);
- }
-
- if(id==0){
- SolidHitBonus();
- }
-
- }
- }
- }
- if(animation[targetanimation].attack==reversal&&(!victim->feint||(victim->lastattack==victim->lastattack2&&victim->lastattack2==victim->lastattack3&&Random()%2)||targetanimation==knifefollowanim)){
- if(targetanimation==spinkickreversalanim&&animation[targetanimation].label[currentframe]==7){
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2){
- victim->spurt=1;
- DoBlood(.2,230);
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 128);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- if(creature==wolftype){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2/victim->armorhigh,170);
- }
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-oldcoords;
- relative.y=0;
- Normalise(&relative);
- //relative=DoRotation(relative,0,-90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*40;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
- //FootLand(1,2);
- victim->Puff(abdomen);
- victim->DoDamage(damagemult*150/victim->protectionhigh);
-
- if(id==0){
- bonus=Reversal;
- bonustime=0;
- bonusvalue=60;
- }
- }
-
- if((targetanimation==swordslashreversalanim||targetanimation==knifeslashreversalanim||targetanimation==staffhitreversalanim||targetanimation==staffspinhitreversalanim)&&animation[targetanimation].label[currentframe]==5){
- if(victim->weaponactive!=-1&&victim->num_weapons>0){
- if(weapons.owner[victim->weaponids[victim->weaponactive]]==victim->id){
- weapons.owner[victim->weaponids[victim->weaponactive]]=id;
- weaponactive=0;
- if(num_weapons>0){
- weaponids[num_weapons]=weaponids[victim->weaponactive];
- }
- num_weapons++;
- weaponids[0]=victim->weaponids[victim->weaponactive];
- victim->num_weapons--;
- if(victim->num_weapons>0){
- victim->weaponids[victim->weaponactive]=victim->weaponids[victim->num_weapons];
- //if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
- }
- victim->weaponactive=-1;
- }
- }
- }
-
- if(targetanimation==staffhitreversalanim&&animation[targetanimation].label[currentframe]==5){
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2){
- victim->spurt=1;
- DoBlood(.2,230);
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( whooshhitsound, samp[whooshhitsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[whooshhitsound], gLoc, vel);
- OPENAL_SetVolume(channels[whooshhitsound], 128);
- OPENAL_SetPaused(channels[whooshhitsound], false);
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-oldcoords;
- relative.y=0;
- Normalise(&relative);
- //relative=DoRotation(relative,0,-90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*30;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
- //FootLand(1,2);
- victim->Puff(head);
- victim->DoDamage(damagemult*70/victim->protectionhigh);
- }
-
- if(targetanimation==staffspinhitreversalanim&&animation[targetanimation].label[currentframe]==7){
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2){
- victim->spurt=1;
- DoBlood(.2,230);
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- if(id==0){
- bonus=staffreversebonus;
- bonustime=0;
- bonusvalue=100;
- }
-
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 128);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- victim->RagDoll(0);
- if(id==0){
- bonus=staffreversebonus;
- bonustime=0;
- bonusvalue=100;
- }
-
- XYZ relative;
- relative=victim->coords-oldcoords;
- relative.y=0;
- Normalise(&relative);
- //relative=DoRotation(relative,0,-90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*30;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
- //FootLand(1,2);
- victim->Puff(head);
- victim->DoDamage(damagemult*70/victim->protectionhigh);
- }
-
- if(targetanimation==upunchreversalanim&&animation[targetanimation].label[currentframe]==7){
- escapednum=0;
- victim->RagDoll(1);
- XYZ relative;
- relative=facing;
- relative.y=0;
- Normalise(&relative);
- //relative*=-1;
- relative.y-=.1;
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*70;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[lefthand]].velocity*=.1;
- victim->skeleton.joints[victim->skeleton.jointlabels[leftwrist]].velocity*=.2;
- victim->skeleton.joints[victim->skeleton.jointlabels[leftelbow]].velocity*=.5;
- victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity*=.7;
- victim->skeleton.joints[victim->skeleton.jointlabels[righthand]].velocity*=.1;
- victim->skeleton.joints[victim->skeleton.jointlabels[rightwrist]].velocity*=.2;
- victim->skeleton.joints[victim->skeleton.jointlabels[rightelbow]].velocity*=.5;
- victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity*=.7;
-
- victim->Puff(abdomen);
- victim->DoDamage(damagemult*90/victim->protectionhigh);
-
- if(id==0){
- bonus=Reversal;
- bonustime=0;
- bonusvalue=60;
- }
-
- bool doslice;
- doslice=0;
- if(weaponactive!=-1||creature==wolftype)doslice=1;
- if(creature==rabbittype&&weaponactive!=-1)if(weapons.type[weaponids[0]]==staff)doslice=0;
- if(doslice){
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(weaponactive!=-1){
- victim->DoBloodBig(2/victim->armorhigh,225);
- PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifeslicesound], 512);
- OPENAL_SetPaused(channels[knifeslicesound], false);
- if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
- weapons.blooddrip[weaponids[weaponactive]]+=3;
- }
- if(weaponactive==-1&&creature==wolftype){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2/victim->armorhigh,175);
- }
- }
- }
-
-
-
- if(targetanimation==swordslashreversalanim&&animation[targetanimation].label[currentframe]==7){
- escapednum=0;
- victim->RagDoll(1);
- XYZ relative;
- relative=facing;
- relative.y=0;
- Normalise(&relative);
- //relative*=-1;
- relative.y-=.1;
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*70;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[lefthand]].velocity*=.1-1;
- victim->skeleton.joints[victim->skeleton.jointlabels[leftwrist]].velocity*=.2-1;
- victim->skeleton.joints[victim->skeleton.jointlabels[leftelbow]].velocity*=.5-1;
- victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity*=.7-1;
- victim->skeleton.joints[victim->skeleton.jointlabels[righthand]].velocity*=.1-1;
- victim->skeleton.joints[victim->skeleton.jointlabels[rightwrist]].velocity*=.2-1;
- victim->skeleton.joints[victim->skeleton.jointlabels[rightelbow]].velocity*=.5-1;
- victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity*=.7-1;
-
- if(id==0){
- bonus=swordreversebonus;
- bonustime=0;
- bonusvalue=100;
- }
- //victim->DoDamage(90);
-
- /*if(weaponactive!=-1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- victim->DoBloodBig(2,225);
- PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifeslicesound], 512);
- OPENAL_SetPaused(channels[knifeslicesound], false);
- if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
- weapons.blooddrip[weaponids[weaponactive]]+=3;
- }*/
- }
-
- if(hasvictim&&targetanimation==knifeslashreversalanim&&animation[targetanimation].label[currentframe]==7){
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2){
- victim->spurt=1;
- DoBlood(.2,230);
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 128);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- victim->RagDoll(0);
- XYZ relative;
- relative=victim->coords-oldcoords;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,-90,0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*40;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
- //FootLand(1,2);
- victim->Puff(abdomen);
- victim->DoDamage(damagemult*30/victim->protectionhigh);
-
- if(id==0){
- bonus=Reversal;
- bonustime=0;
- bonusvalue=60;
- }
- }
-
- if(hasvictim&&targetanimation==sneakattackanim&&animation[targetanimation].label[currentframe]==7){
- escapednum=0;
- victim->RagDoll(0);
- victim->skeleton.spinny=0;
- XYZ relative;
- relative=facing*-1;
- relative.y=-3;
- Normalise(&relative);
- if(victim->id==0)relative/=30;
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*40;
- }
- //victim->DoDamage(1000);
- victim->damage=victim->damagetolerance;
- victim->permanentdamage=victim->damagetolerance-1;
- bool doslice;
- doslice=0;
- if(weaponactive!=-1||creature==wolftype)doslice=1;
- if(creature==rabbittype&&weaponactive!=-1)if(weapons.type[weaponids[0]]==staff)doslice=0;
- if(doslice){
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(weaponactive!=-1){
- victim->DoBloodBig(200,225);
- PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifeslicesound], 512);
- OPENAL_SetPaused(channels[knifeslicesound], false);
- if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
- weapons.blooddrip[weaponids[weaponactive]]+=5;
- }
-
- if(creature==wolftype&&weaponactive==-1){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2,175);
- }
- }
- if(id==0){
- bonus=spinecrusher;
- bonustime=0;
- bonusvalue=100;
- }
- }
-
- if(hasvictim&&(targetanimation==knifefollowanim||targetanimation==knifesneakattackanim)&&animation[targetanimation].label[currentframe]==5){
- if(weaponactive!=-1&&victim->bloodloss<victim->damagetolerance){
- escapednum=0;
- if(targetanimation==knifefollowanim)victim->DoBloodBig(200,210);
- if(targetanimation==knifesneakattackanim){
- /*victim->DoBloodBig(200,195);
- XYZ bloodvel;
- bloodvel=0;
- bloodvel.z=20;
- bloodvel.y=5;
- bloodvel=DoRotation(bloodvel,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
- Sprite::MakeSprite(bloodsprite, DoRotation(skeleton.joints[skeleton.jointlabels[neck]].position,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
- */
- XYZ footvel,footpoint;
- footvel=0;
- footpoint=weapons.tippoint[weaponids[0]];
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
- footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]]);
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
- victim->DoBloodBig(200,195);
- if(id==0){
- bonus=tracheotomy;
- bonustime=0;
- bonusvalue=100;
- }
-
- //victim->neckspurtamount=5;
- }
- if(targetanimation==knifefollowanim){
- if(id==0){
- bonus=Stabbonus;
- bonustime=0;
- bonusvalue=40;
- }
- XYZ footvel,footpoint;
- footvel=0;
- footpoint=weapons.tippoint[weaponids[0]];
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
- footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .2, 1);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .2, 1);
-
- }
- victim->bloodloss+=10000;
- victim->velocity=0;
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( fleshstabsound, samp[fleshstabsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fleshstabsound], gLoc, vel);
- OPENAL_SetVolume(channels[fleshstabsound], 512);
- OPENAL_SetPaused(channels[fleshstabsound], false);
- if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
- weapons.blooddrip[weaponids[weaponactive]]+=5;
- }
- }
-
- if(hasvictim&&(targetanimation==knifefollowanim||targetanimation==knifesneakattackanim)&&animation[targetanimation].label[currentframe]==6){
- escapednum=0;
- victim->velocity=0;
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity=0;
- }
- if(targetanimation==knifefollowanim){
- victim->RagDoll(0);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity=0;
- }
- }
- if(weaponactive!=-1&&animation[victim->targetanimation].attack!=reversal){
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
- OPENAL_SetVolume(channels[fleshstabremovesound], 512);
- OPENAL_SetPaused(channels[fleshstabremovesound], false);
- if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
- weapons.blooddrip[weaponids[weaponactive]]+=5;
-
- XYZ footvel,footpoint;
- footvel=0;
- footpoint=weapons.tippoint[weaponids[0]];
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
- footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
- }
- }
-
- if(hasvictim&&(targetanimation==swordsneakattackanim)&&animation[targetanimation].label[currentframe]==5){
- if(weaponactive!=-1&&victim->bloodloss<victim->damagetolerance){
- if(id==0){
- bonus=backstab;
- bonustime=0;
- bonusvalue=100;
- }
-
- escapednum=0;
-
- XYZ footvel,footpoint;
- footvel=0;
- footpoint=(weapons.tippoint[weaponids[0]]+weapons.position[weaponids[0]])/2;
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
- footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]]);
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodflamesprite, footpoint,DoRotation(footvel*5,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .3, 1);
- Sprite::MakeSprite(bloodflamesprite, footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .3, 1);
- victim->DoBloodBig(200,180);
- victim->DoBloodBig(200,215);
- victim->bloodloss+=10000;
- victim->velocity=0;
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( fleshstabsound, samp[fleshstabsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fleshstabsound], gLoc, vel);
- OPENAL_SetVolume(channels[fleshstabsound], 512);
- OPENAL_SetPaused(channels[fleshstabsound], false);
- if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
- weapons.blooddrip[weaponids[weaponactive]]+=5;
- }
- }
-
- if(hasvictim&&targetanimation==swordsneakattackanim&&animation[targetanimation].label[currentframe]==6){
- escapednum=0;
- victim->velocity=0;
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity=0;
- }
- if(weaponactive!=-1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel);
- OPENAL_SetVolume(channels[fleshstabremovesound], 512);
- OPENAL_SetPaused(channels[fleshstabremovesound], false);
- if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
- weapons.blooddrip[weaponids[weaponactive]]+=5;
-
- XYZ footvel,footpoint;
- footvel=0;
- footpoint=weapons.tippoint[weaponids[0]];
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
- footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
- }
- }
-
- if(targetanimation==sweepreversalanim&&animation[targetanimation].label[currentframe]==7){
- escapednum=0;
- if(id==0)camerashake+=.4;
- if(Random()%2){
- victim->spurt=1;
- DoBlood(.2,240);
- }
- float gLoc[3];
- float vel[3];
- gLoc[0]=victim->coords.x;
- gLoc[1]=victim->coords.y;
- gLoc[2]=victim->coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- if(weaponactive==-1){
- if(tutoriallevel!=1){
- PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel);
- OPENAL_SetVolume(channels[heavyimpactsound], 128);
- OPENAL_SetPaused(channels[heavyimpactsound], false);
- }
- }
- bool doslice;
- doslice=0;
- if(weaponactive!=-1||creature==wolftype)doslice=1;
- if(creature==rabbittype&&weaponactive!=-1)if(weapons.type[weaponids[0]]==staff)doslice=0;
- if(doslice){
- if(weaponactive!=-1){
- victim->DoBloodBig(2/victim->armorhead,225);
- PlaySoundEx( knifeslicesound, samp[knifeslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifeslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifeslicesound], 512);
- OPENAL_SetPaused(channels[knifeslicesound], false);
- if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
- weapons.blooddrip[weaponids[weaponactive]]+=3;
- }
- if(weaponactive==-1&&creature==wolftype){
- PlaySoundEx( clawslicesound, samp[clawslicesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[clawslicesound], gLoc, vel);
- OPENAL_SetVolume(channels[clawslicesound], 128);
- OPENAL_SetPaused(channels[clawslicesound], false);
- victim->spurt=1;
- victim->DoBloodBig(2/victim->armorhead,175);
- }
- }
-
- if(id==0){
- bonus=Reversal;
- bonustime=0;
- bonusvalue=60;
- }
-
- victim->Puff(neck);
-
- XYZ relative;
- //relative=victim->coords-oldcoords;
- relative=facing*-1;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,90,0);
- relative.y=.5;
- Normalise(&relative);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*20;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
- if(victim->damage<victim->damagetolerance-100)victim->velocity=relative*200;
- victim->DoDamage(damagemult*100/victim->protectionhead);
- victim->velocity=0;
- }
-
- if(targetanimation==sweepreversalanim&&((animation[targetanimation].label[currentframe]==9&&victim->damage<victim->damagetolerance)||(animation[targetanimation].label[currentframe]==7&&victim->damage>victim->damagetolerance))){
- escapednum=0;
- victim->RagDoll(0);
- XYZ relative;
- //relative=victim->coords-oldcoords;
- relative=facing*-1;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,90,0);
- relative.y=.5;
- Normalise(&relative);
- for(i=0;i<victim->skeleton.num_joints;i++){
- victim->skeleton.joints[i].velocity+=relative*damagemult*20;
- }
- victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
- }
-
- if(hasvictim&&(targetanimation==spinkickreversalanim||targetanimation==sweepreversalanim||targetanimation==rabbitkickreversalanim||targetanimation==upunchreversalanim||targetanimation==jumpreversalanim||targetanimation==swordslashreversalanim||targetanimation==knifeslashreversalanim||targetanimation==rabbittacklereversal||targetanimation==wolftacklereversal||targetanimation==staffhitreversalanim||targetanimation==staffspinhitreversalanim))
- if(victim->damage>victim->damagetolerance&&bonus!=reverseko){
- if(id==0){
- bonus=reverseko;
- bonustime=0;
- bonusvalue=100;
- }
- }
- }
-
-
- //Animation end
- if(targetframe>animation[currentanimation].numframes-1){
- targetframe=0;
- if(wasStop()){
- targetanimation=getIdle();
- FootLand(0,1);
- FootLand(1,1);
- }
- if(currentanimation==rabbittackleanim||currentanimation==rabbittacklinganim){
- targetanimation=rollanim;
- targetframe=3;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( movewhooshsound, samp[movewhooshsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[movewhooshsound], gLoc, vel);
- OPENAL_SetVolume(channels[movewhooshsound], 128);
- OPENAL_SetPaused(channels[movewhooshsound], false);
- }
- if(currentanimation==staggerbackhighanim){
- targetanimation=getIdle();
- }
- if(currentanimation==staggerbackhardanim){
- targetanimation=getIdle();
- }
- if(currentanimation==removeknifeanim){
- targetanimation=getIdle();
- }
- if(currentanimation==crouchremoveknifeanim){
- targetanimation=getCrouch();
- }
- if(currentanimation==backhandspringanim){
- targetanimation=getIdle();
- }
- if(currentanimation==dodgebackanim){
- targetanimation=getIdle();
- }
- if(currentanimation==drawleftanim){
- targetanimation=getIdle();
- }
- if(currentanimation==drawrightanim||currentanimation==crouchdrawrightanim){
- targetanimation=getIdle();
- if(currentanimation==crouchdrawrightanim){
- targetanimation=getCrouch();
- }
- if(weaponactive==-1)weaponactive=0;
- else if(weaponactive==0){
- weaponactive=-1;
- if(num_weapons==2){
- int buffer;
- buffer=weaponids[0];
- weaponids[0]=weaponids[1];
- weaponids[1]=buffer;
- }
- }
-
- if(weaponactive==-1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( knifesheathesound, samp[knifesheathesound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifesheathesound], gLoc, vel);
- OPENAL_SetVolume(channels[knifesheathesound], 128);
- OPENAL_SetPaused(channels[knifesheathesound], false);
- }
- if(weaponactive!=-1){
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
-
- PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel);
- OPENAL_SetVolume(channels[knifedrawsound], 128);
- OPENAL_SetPaused(channels[knifedrawsound], false);
- }
- }
- if(currentanimation==rollanim){
- targetanimation=getCrouch();
- FootLand(0,1);
- FootLand(1,1);
- }
- if(isFlip()){
- if(targetanimation==walljumprightkickanim){
- targetrot=-190;
- }
- if(targetanimation==walljumpleftkickanim){
- targetrot=190;
- }
- targetanimation=jumpdownanim;
- }
- if(currentanimation==climbanim){
- targetanimation=getCrouch();
- targetframe=1;
- coords+=facing*.1;
- if(!isnormal(coords.x))
- coords=oldcoords;
- oldcoords=coords;
- collided=0;
- targetoffset=0;
- currentoffset=0;
- grabdelay=1;
- velocity=0;
- collided=0;
- avoidcollided=0;
- }
- if(targetanimation==rabbitkickreversalanim){
- targetanimation=getCrouch();
- lastfeint=0;
- }
- if(targetanimation==jumpreversalanim){
- targetanimation=getCrouch();
- lastfeint=0;
- }
- if(targetanimation==walljumprightanim||targetanimation==walljumpbackanim||targetanimation==walljumpfrontanim){
- if(attackkeydown&&targetanimation!=walljumpfrontanim){
- int closest=-1;
- float closestdist=-1;
- float distance;
- if(numplayers>1)
- for(i=0;i<numplayers;i++){
- if(id!=i&&player[i].coords.y<coords.y&&!player[i].skeleton.free){
- distance=findDistancefast(&player[i].coords,&coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- }
- }
- }
- if(closestdist>0&&closest>=0&&closestdist<16){
- victim=&player[closest];
- targetanimation=walljumprightkickanim;
- targetframe=0;
- XYZ rotatetarget=victim->coords-coords;
- Normalise(&rotatetarget);
- rotation=-asin(0-rotatetarget.x);
- rotation*=360/6.28;
- if(rotatetarget.z<0)rotation=180-rotation;
- targettilt2=-asin(rotatetarget.y)*360/6.28;
- velocity=(victim->coords-coords)*4;
- velocity.y+=2;
- transspeed=40;
- }
- }
- if(targetanimation==walljumpbackanim){
- targetanimation=backflipanim;
- targetframe=3;
- velocity=facing*-8;
- velocity.y=4;
- if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
- }
- if(targetanimation==walljumprightanim){
- targetanimation=rightflipanim;
- targetframe=4;
- targetrotation-=90;
- rotation-=90;
- velocity=DoRotation(facing,0,30,0)*-8;
- velocity.y=4;
- }
- if(targetanimation==walljumpfrontanim){
- targetanimation=frontflipanim;
- targetframe=2;
- //targetrotation-=180;
- ////rotation-=180;
- velocity=facing*8;
- velocity.y=4;
- }
- if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
- }
- if(targetanimation==walljumpleftanim){
- if(attackkeydown){
- int closest=-1;
- float closestdist=-1;
- float distance;
- if(numplayers>1)
- for(i=0;i<numplayers;i++){
- if(id!=i&&player[i].coords.y<coords.y&&!player[i].skeleton.free){
- distance=findDistancefast(&player[i].coords,&coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- }
- }
- }
- if(closestdist>0&&closest>=0&&closestdist<16){
- victim=&player[closest];
- targetanimation=walljumpleftkickanim;
- targetframe=0;
- XYZ rotatetarget=victim->coords-coords;
- Normalise(&rotatetarget);
- rotation=-asin(0-rotatetarget.x);
- rotation*=360/6.28;
- if(rotatetarget.z<0)rotation=180-rotation;
- targettilt2=-asin(rotatetarget.y)*360/6.28;
- velocity=(victim->coords-coords)*4;
- velocity.y+=2;
- transspeed=40;
- }
- }
- if(targetanimation!=walljumpleftkickanim){
- targetanimation=leftflipanim;
- targetframe=4;
- targetrotation+=90;
- rotation+=90;
- velocity=DoRotation(facing,0,-30,0)*-8;
- velocity.y=4;
- }
- if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
- }
- if(targetanimation==sneakattackanim){
- float ycoords=oldcoords.y;
- currentanimation=getCrouch();
- targetanimation=getCrouch();
- targetframe=1;
- currentframe=0;
- targetrotation+=180;
- rotation+=180;
- targettilt2*=-1;
- tilt2*=-1;
- transspeed=1000000;
- targetheadrotation+=180;
- coords-=facing*.7;
- if(onterrain)coords.y=terrain.getHeight(coords.x,coords.z);
-
- lastfeint=0;
- }
- if(targetanimation==knifesneakattackanim||targetanimation==swordsneakattackanim){
- float ycoords=oldcoords.y;
- targetanimation=getIdle();
- targetframe=0;
- if(onterrain)coords.y=terrain.getHeight(coords.x,coords.z);
-
- lastfeint=0;
- }
- if(currentanimation==knifefollowanim){
- targetanimation=getIdle();
- lastfeint=0;
- }
- if(animation[targetanimation].attack==reversal&¤tanimation!=sneakattackanim&¤tanimation!=knifesneakattackanim&¤tanimation!=swordsneakattackanim&¤tanimation!=knifefollowanim){
- float ycoords=oldcoords.y;
- targetanimation=getStop();
- targetrotation+=180;
- rotation+=180;
- targettilt2*=-1;
- tilt2*=-1;
- transspeed=1000000;
- targetheadrotation+=180;
- if(!isnormal(coords.x))
- coords=oldcoords;
- if(currentanimation==spinkickreversalanim||currentanimation==swordslashreversalanim)
- oldcoords=coords+facing*.5;
- else if(currentanimation==sweepreversalanim)
- oldcoords=coords+facing*1.1;
- else if(currentanimation==upunchreversalanim){
- oldcoords=coords+facing*1.5;
- targetrotation+=180;
- rotation+=180;
- targetheadrotation+=180;
- targettilt2*=-1;
- tilt2*=-1;
- }
- else if(currentanimation==knifeslashreversalanim){
- oldcoords=coords+facing*.5;
- targetrotation+=90;
- rotation+=90;
- targetheadrotation+=90;
- targettilt2=0;
- tilt2=0;
- }
- else if(currentanimation==staffspinhitreversalanim){
- targetrotation+=180;
- rotation+=180;
- targetheadrotation+=180;
- targettilt2=0;
- tilt2=0;
- }
- if(onterrain)oldcoords.y=terrain.getHeight(oldcoords.x,oldcoords.z);
- else oldcoords.y=ycoords;
- currentoffset=coords-oldcoords;
- targetoffset=0;
- coords=oldcoords;
-
- lastfeint=0;
- }
- if(currentanimation==knifesneakattackedanim||currentanimation==swordsneakattackedanim){
- velocity=0;
- velocity.y=-5;
- RagDoll(0);
- }
- if(animation[targetanimation].attack==reversed){
- escapednum++;
- if(targetanimation==sweepreversedanim)targetrotation+=90;
- targetanimation=backhandspringanim;
- targetframe=2;
- float gLoc[3];
- float vel[3];
- gLoc[0]=coords.x;
- gLoc[1]=coords.y;
- gLoc[2]=coords.z;
- vel[0]=velocity.x;
- vel[1]=velocity.y;
- vel[2]=velocity.z;
- PlaySoundEx( landsound, samp[landsound], NULL, true);
- OPENAL_3D_SetAttributes(channels[landsound], gLoc, vel);
- OPENAL_SetVolume(channels[landsound], 128);
- OPENAL_SetPaused(channels[landsound], false);
-
- if(currentanimation==upunchreversedanim||currentanimation==swordslashreversedanim){
- targetanimation=rollanim;
- targetframe=5;
- oldcoords=coords;
- coords+=(DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)+DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0))/2*scale;
- coords.y=oldcoords.y;
- }
- if(currentanimation==knifeslashreversedanim){
- targetanimation=rollanim;
- targetframe=0;
- targetrotation+=90;
- rotation+=90;
- oldcoords=coords;
- coords+=(DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)+DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0))/2*scale;
- coords.y=oldcoords.y;
- }
- }
- if(wasFlip()){
- targetanimation=jumpdownanim;
- }
- if(wasLanding())targetanimation=getIdle();
- if(wasLandhard())targetanimation=getIdle();
- if(currentanimation==spinkickanim||currentanimation==getupfrombackanim||currentanimation==getupfromfrontanim||currentanimation==lowkickanim){
- targetanimation=getIdle();
- oldcoords=coords;
- coords+=(DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)+DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0))/2*scale;
- coords.y=oldcoords.y;
- //coords+=DoRotation(animation[currentanimation].offset,0,rotation,0)*scale;
- targetoffset.y=coords.y;
- if(onterrain)targetoffset.y=terrain.getHeight(coords.x,coords.z);
- currentoffset=DoRotation(animation[currentanimation].offset*-1,0,rotation,0)*scale;
- currentoffset.y-=(coords.y-targetoffset.y);
- coords.y=targetoffset.y;
- targetoffset=0;
- normalsupdatedelay=0;
- }
- if(currentanimation==upunchanim){
- targetanimation=getStop();
- normalsupdatedelay=0;
- lastfeint=0;
- }
- if(currentanimation==rabbitkickanim&&targetanimation!=backflipanim){
- targetrotation=rotation;
- bool hasstaff;
- hasstaff=0;
- if(num_weapons>0)if(weapons.type[0]==staff)hasstaff=1;
- if(!hasstaff)DoDamage(35);
- RagDoll(0);
- lastfeint=0;
- rabbitkickragdoll=1;
- }
- if(currentanimation==rabbitkickreversedanim){
- if(!feint){
- velocity=0;
- velocity.y=-10;
- //DoDamage(100);
- RagDoll(0);
- skeleton.spinny=0;
- if(id!=0)SolidHitBonus();
- }
- if(feint){
- escapednum++;
- targetanimation=rollanim;
- coords+=facing;
- if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
- }
- lastfeint=0;
- }
- if(currentanimation==rabbittackledbackanim||currentanimation==rabbittackledfrontanim){
- velocity=0;
- velocity.y=-10;
- RagDoll(0);
- skeleton.spinny=0;
- }
- if(currentanimation==jumpreversedanim){
- if(!feint){
- velocity=0;
- velocity.y=-10;
- //DoDamage(100);
- RagDoll(0);
- skeleton.spinny=0;
- if(id!=0)SolidHitBonus();
- }
- if(feint){
- escapednum++;
- targetanimation=rollanim;
- coords+=facing*2;
- if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
- }
- lastfeint=0;
- }
-
- if(animation[currentanimation].attack==normalattack&&!victim->skeleton.free&&victim->targetanimation!=staggerbackhighanim&&victim->targetanimation!=staggerbackhardanim&&targetanimation!=winduppunchblockedanim&&targetanimation!=blockhighleftanim&&targetanimation!=swordslashparryanim&&targetanimation!=swordslashparriedanim&&targetanimation!=crouchstabanim&&targetanimation!=swordgroundstabanim){
- targetanimation=getupfromfrontanim;
- lastfeint=0;
- }
- else if(animation[currentanimation].attack==normalattack){
- targetanimation=getIdle();
- lastfeint=0;
- }
- if(currentanimation==blockhighleftanim&&aitype!=playercontrolled){
- targetanimation=blockhighleftstrikeanim;
- }
- if(currentanimation==knifeslashstartanim||currentanimation==knifethrowanim||currentanimation==swordslashanim||currentanimation==staffhitanim||currentanimation==staffgroundsmashanim||currentanimation==staffspinhitanim){
- targetanimation=getIdle();
- lastfeint=0;
- }
- if(currentanimation==spinkickanim&&victim->skeleton.free){
- if(creature==rabbittype)targetanimation=fightidleanim;
- }
- }
- target=0;
-
- if(isIdle()&&!wasIdle())normalsupdatedelay=0;
-
- if(currentanimation==jumpupanim&&velocity.y<0&&!isFlip()){
- targetanimation=jumpdownanim;
- }
- }
- if(!skeleton.free){
- oldtarget=target;
- if(!transspeed&&animation[targetanimation].attack!=2&&animation[targetanimation].attack!=3){
- if(!isRun()||!wasRun()){
- if(animation[targetanimation].speed[targetframe]>animation[currentanimation].speed[currentframe])
- target+=multiplier*animation[targetanimation].speed[targetframe]*speed*2;
- if(animation[targetanimation].speed[targetframe]<=animation[currentanimation].speed[currentframe])
- target+=multiplier*animation[currentanimation].speed[currentframe]*speed*2;
- }
- if(isRun()&&wasRun()){
- float tempspeed;
- tempspeed=velspeed;
- if(tempspeed<10*speedmult)tempspeed=10*speedmult;
- target+=multiplier*animation[targetanimation].speed[currentframe]*speed*1.7*tempspeed/(speed*45*scale);
- }
- }
- else if(transspeed)target+=multiplier*transspeed*speed*2;
- else{
- if(!isRun()||!wasRun()){
- if(animation[targetanimation].speed[targetframe]>animation[currentanimation].speed[currentframe])
- target+=multiplier*animation[targetanimation].speed[targetframe]*2;
- if(animation[targetanimation].speed[targetframe]<=animation[currentanimation].speed[currentframe])
- target+=multiplier*animation[currentanimation].speed[currentframe]*2;
- }
- }
-
- if(currentanimation!=targetanimation)target=(target+oldtarget)/2;
-
- if(target>1){currentframe=targetframe; target=1;}
- oldrot=rot;
- rot=targetrot*target;
- rotation+=rot-oldrot;
- if(target==1){
- rot=0;
- oldrot=0;
- targetrot=0;
- }
- if(currentanimation!=oldcurrentanimation||targetanimation!=oldtargetanimation||((currentframe!=oldcurrentframe||targetframe!=oldtargetframe)&&!calcrot)){
- //Old rotates
- for(i=0;i<skeleton.num_joints;i++){
- skeleton.joints[i].position=animation[currentanimation].position[i][currentframe];
- }
-
- skeleton.FindForwards();
-
- for(i=0;i<skeleton.num_muscles;i++){
- if(skeleton.muscles[i].visible)
- {
- skeleton.FindRotationMuscle(i,targetanimation);
- }
- }
- for(i=0;i<skeleton.num_muscles;i++){
- if(skeleton.muscles[i].visible)
- {
- if(isnormal((float)((int)(skeleton.muscles[i].rotate1*100)%36000)/100))skeleton.muscles[i].oldrotate1=(float)((int)(skeleton.muscles[i].rotate1*100)%36000)/100;
- if(isnormal((float)((int)(skeleton.muscles[i].rotate2*100)%36000)/100))skeleton.muscles[i].oldrotate2=(float)((int)(skeleton.muscles[i].rotate2*100)%36000)/100;
- if(isnormal((float)((int)(skeleton.muscles[i].rotate3*100)%36000)/100))skeleton.muscles[i].oldrotate3=(float)((int)(skeleton.muscles[i].rotate3*100)%36000)/100;
- }
- }
-
- //New rotates
- for(i=0;i<skeleton.num_joints;i++){
- skeleton.joints[i].position=animation[targetanimation].position[i][targetframe];
- }
-
- skeleton.FindForwards();
-
- for(i=0;i<skeleton.num_muscles;i++){
- if(skeleton.muscles[i].visible)
- {
- skeleton.FindRotationMuscle(i,targetanimation);
- }
- }
- for(i=0;i<skeleton.num_muscles;i++){
- if(skeleton.muscles[i].visible)
- {
- if(isnormal((float)((int)(skeleton.muscles[i].rotate1*100)%36000)/100))skeleton.muscles[i].newrotate1=(float)((int)(skeleton.muscles[i].rotate1*100)%36000)/100;
- if(isnormal((float)((int)(skeleton.muscles[i].rotate2*100)%36000)/100))skeleton.muscles[i].newrotate2=(float)((int)(skeleton.muscles[i].rotate2*100)%36000)/100;
- if(isnormal((float)((int)(skeleton.muscles[i].rotate3*100)%36000)/100))skeleton.muscles[i].newrotate3=(float)((int)(skeleton.muscles[i].rotate3*100)%36000)/100;
- if(skeleton.muscles[i].newrotate3>skeleton.muscles[i].oldrotate3+180)skeleton.muscles[i].newrotate3-=360;
- if(skeleton.muscles[i].newrotate3<skeleton.muscles[i].oldrotate3-180)skeleton.muscles[i].newrotate3+=360;
- if(skeleton.muscles[i].newrotate2>skeleton.muscles[i].oldrotate2+180)skeleton.muscles[i].newrotate2-=360;
- if(skeleton.muscles[i].newrotate2<skeleton.muscles[i].oldrotate2-180)skeleton.muscles[i].newrotate2+=360;
- if(skeleton.muscles[i].newrotate1>skeleton.muscles[i].oldrotate1+180)skeleton.muscles[i].newrotate1-=360;
- if(skeleton.muscles[i].newrotate1<skeleton.muscles[i].oldrotate1-180)skeleton.muscles[i].newrotate1+=360;
- }
- }
- }
- if(currentframe>=animation[currentanimation].numframes)currentframe=animation[currentanimation].numframes-1;
-
- oldcurrentanimation=currentanimation;
- oldtargetanimation=targetanimation;
- oldtargetframe=targetframe;
- oldcurrentframe=currentframe;
-
- for(i=0;i<skeleton.num_joints;i++){
- skeleton.joints[i].velocity=(animation[currentanimation].position[i][currentframe]*(1-target)+animation[targetanimation].position[i][targetframe]*(target)-skeleton.joints[i].position)/multiplier;
- skeleton.joints[i].position=animation[currentanimation].position[i][currentframe]*(1-target)+animation[targetanimation].position[i][targetframe]*(target);
- }
- offset=currentoffset*(1-target)+targetoffset*target;
- for(i=0;i<skeleton.num_muscles;i++){
- if(skeleton.muscles[i].visible)
- {
- skeleton.muscles[i].rotate1=skeleton.muscles[i].oldrotate1*(1-target)+skeleton.muscles[i].newrotate1*(target);
- skeleton.muscles[i].rotate2=skeleton.muscles[i].oldrotate2*(1-target)+skeleton.muscles[i].newrotate2*(target);
- skeleton.muscles[i].rotate3=skeleton.muscles[i].oldrotate3*(1-target)+skeleton.muscles[i].newrotate3*(target);
- }
- }
- }
-
- if(isLanding()&&landhard){
- //if(abs(velocity.y)>fast_sqrt(velocity.x*velocity.x*velocity.z*velocity.z)){
- if(id==0)camerashake+=.4;
- targetanimation=getLandhard();
- targetframe=0;
- target=0;
- landhard=0;
- transspeed=15;
- //}
- }
- }
- //skeleton.DoConstraints();
+/* EFFECT
+ * MONSTER
+ * TODO
+ */
+void Person::DoStuff()
+{
+ static XYZ terrainnormal;
+ static XYZ flatfacing;
+ static XYZ flatvelocity;
+ static float flatvelspeed;
+ static int i, j, l;
+ static XYZ average;
+ static int howmany;
+ static int bloodsize;
+ static int startx, starty, endx, endy;
+ static GLubyte color;
+ static XYZ bloodvel;
+
+ onfiredelay -= multiplier;
+ if (onfiredelay < 0 && onfire) {
+ if (Random() % 2 == 0) {
+ crouchkeydown = 1;
+ }
+ onfiredelay = 0.3;
+ }
+
+ crouchkeydowntime += multiplier;
+ if (!crouchkeydown)
+ crouchkeydowntime = 0;
+ jumpkeydowntime += multiplier;
+ if (!jumpkeydown && skeleton.free)
+ jumpkeydowntime = 0;
+
+ if (hostile || damage > 0 || bloodloss > 0)
+ immobile = 0;
+
+ if (isIdle() || isRun())
+ targetoffset = 0;
+
+ if (num_weapons == 1 && weaponactive != -1)
+ weaponstuck = -1;
+
+ if (id == 0)
+ blooddimamount -= multiplier * .3;
+ speechdelay -= multiplier;
+ texupdatedelay -= multiplier;
+ interestdelay -= multiplier;
+ flamedelay -= multiplier;
+ parriedrecently -= multiplier;
+ if (!victim) {
+ victim = this->shared_from_this();
+ hasvictim = 0;
+ }
+
+ if (id == 0)
+ speed = 1.1 * speedmult;
+ else
+ speed = 1.0 * speedmult;
+ if (!skeleton.free)
+ rabbitkickragdoll = 0;
+
+ speed *= speedmult;
+
+ if (id != 0 && (creature == rabbittype || difficulty != 2))
+ superruntoggle = 0;
+ if (id != 0 && creature == wolftype && difficulty == 2) {
+ superruntoggle = 0;
+ if (aitype != passivetype) {
+ superruntoggle = 1;
+ if (aitype == attacktypecutoff && (Person::players[0]->isIdle() || Person::players[0]->isCrouch() || Person::players[0]->skeleton.free || Person::players[0]->animTarget == getupfrombackanim || Person::players[0]->animTarget == getupfromfrontanim || Person::players[0]->animTarget == sneakanim) && distsq(&coords, &Person::players[0]->coords) < 16) {
+ superruntoggle = 0;
+ }
+ }
+ if (scale < 0.2)
+ superruntoggle = 0;
+ if (animTarget == wolfrunninganim && !superruntoggle) {
+ animTarget = getRun();
+ frameTarget = 0;
+ }
+ }
+ if (weaponactive == -1 && num_weapons > 0) {
+ if (weapons[weaponids[0]].getType() == staff) {
+ weaponactive = 0;
+ }
+ }
+
+ if (onfire) {
+ burnt += multiplier;
+ deathbleeding = 1;
+ if (burnt > .6)
+ burnt = .6;
+ OPENAL_SetVolume(channels[stream_firesound], 256 + 256 * findLength(&velocity) / 3);
+
+ if (animTarget == jumpupanim || animTarget == jumpdownanim || isFlip()) {
+ float gLoc[3];
+ float vel[3];
+ gLoc[0] = coords.x;
+ gLoc[1] = coords.y;
+ gLoc[2] = coords.z;
+ vel[0] = velocity.x;
+ vel[1] = velocity.y;
+ vel[2] = velocity.z;
+
+ if (id == 0) {
+ OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel);
+ OPENAL_SetVolume(channels[whooshsound], 64 * findLength(&velocity) / 5);
+ }
+ }
+ }
+ while (flamedelay < 0 && onfire) {
+ flamedelay += .006;
+ howmany = abs(Random() % (skeleton.joints.size()));
+ if (skeleton.free) {
+ flatvelocity = skeleton.joints[howmany].velocity * scale / 2;
+ flatfacing = skeleton.joints[howmany].position * scale + coords;
+ } else {
+ flatfacing = DoRotation(DoRotation(DoRotation(skeleton.joints[howmany].position, 0, 0, tilt), tilt2, 0, 0), 0, yaw, 0) * scale + coords;
+ flatvelocity = (coords - oldcoords) / multiplier / 2;
+ }
+ Sprite::MakeSprite(flamesprite, flatfacing, flatvelocity, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
+ }
+
+ while (flamedelay < 0 && !onfire && tutoriallevel == 1 && id != 0) {
+ flamedelay += .05;
+ howmany = abs(Random() % (skeleton.joints.size()));
+ if (skeleton.free) {
+ flatvelocity = skeleton.joints[howmany].velocity * scale / 2;
+ flatfacing = skeleton.joints[howmany].position * scale + coords;
+ } else {
+ flatvelocity = (coords - oldcoords) / multiplier / 2;
+ flatfacing = DoRotation(DoRotation(DoRotation(skeleton.joints[howmany].position, 0, 0, tilt), tilt2, 0, 0), 0, yaw, 0) * scale + coords;
+ }
+ Sprite::MakeSprite(breathsprite, flatfacing, flatvelocity, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, .3);
+ }
+
+ if (bleeding > 0) {
+ bleeding -= multiplier * .3;
+ if (bloodtoggle == 2) {
+ skeleton.drawmodel.textureptr.bind();
+ if ((bleeding <= 0) && (detail != 2))
+ DoMipmaps();
+ }
+ }
+
+ if (neckspurtamount > 0) {
+ neckspurtamount -= multiplier;
+ neckspurtdelay -= multiplier * 3;
+ neckspurtparticledelay -= multiplier * 3;
+ if (neckspurtparticledelay < 0 && neckspurtdelay > 2) {
+ spurt = 0;
+ bloodvel = 0;
+ if (skeleton.free) {
+ bloodvel -= DoRotation(skeleton.forward * 10 * scale, ((float)(Random() % 100)) / 40, ((float)(Random() % 100)) / 40, 0);
+ bloodvel += DoRotation(jointVel(head), ((float)(Random() % 100)) / 40, yaw + ((float)(Random() % 100)) / 40, 0) * scale;
+ Sprite::MakeSprite(bloodsprite, (jointPos(neck) + (jointPos(neck) - jointPos(head)) / 5)*scale + coords, bloodvel, 1, 1, 1, .05, .9);
+ } else {
+ bloodvel.z = 5 * neckspurtamount;
+ bloodvel = DoRotation(bloodvel, ((float)(Random() % 100)) / 40, yaw + ((float)(Random() % 100)) / 40, 0) * scale;
+ bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 40, ((float)(Random() % 100)) / 40, 0) * scale;
+ Sprite::MakeSprite(bloodsprite, DoRotation(jointPos(neck) + (jointPos(neck) - jointPos(head)) / 5, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, .9);
+ }
+ neckspurtparticledelay = .05;
+ }
+ if (neckspurtdelay < 0) {
+ neckspurtdelay = 3;
+ }
+ }
+
+ if (deathbleeding > 0 && dead != 2) {
+ if (deathbleeding < 5)
+ bleeddelay -= deathbleeding * multiplier / 4;
+ else
+ bleeddelay -= 5 * multiplier / 4;
+ if (bleeddelay < 0 && bloodtoggle) {
+ bleeddelay = 1;
+ XYZ bloodvel;
+ if (bloodtoggle) {
+ bloodvel = 0;
+ if (skeleton.free) {
+ bloodvel += DoRotation(jointVel(abdomen), ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale;
+ Sprite::MakeSprite(bloodsprite, jointPos(abdomen) * scale + coords, bloodvel, 1, 1, 1, .05, 1);
+ } else {
+ bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0) * scale;
+ Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(abdomen) + jointPos(abdomen)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1);
+ }
+ }
+ }
+ bloodloss += deathbleeding * multiplier * 80;
+ deathbleeding -= multiplier * 1.6;
+ if (deathbleeding < 0)
+ deathbleeding = 0;
+ if (bloodloss > damagetolerance && Animation::animations[animTarget].attack == neutral) {
+ if (weaponactive != -1) {
+ weapons[weaponids[0]].drop(velocity * scale * -.3, velocity * scale);
+ weapons[weaponids[0]].velocity.x += .01;
+ num_weapons--;
+ if (num_weapons) {
+ weaponids[0] = weaponids[num_weapons];
+ if (weaponstuck == num_weapons)
+ weaponstuck = 0;
+ }
+ weaponactive = -1;
+ for (unsigned i = 0; i < Person::players.size(); i++) {
+ Person::players[i]->wentforweapon = 0;
+ }
+
+ if (id == 0) {
+ Game::flash(.5, 0);
+ }
+ }
+
+ if (!dead && creature == wolftype) {
+ award_bonus(0, Wolfbonus);
+ }
+ dead = 2;
+ if (animTarget == knifefollowedanim && !skeleton.free) {
+ for (int i = 0; i < skeleton.joints.size(); i++) {
+ skeleton.joints[i].velocity = 0;
+ skeleton.joints[i].velocity.y = -2;
+ }
+ }
+ if (id != 0 && unconscioustime > .1) {
+ numafterkill++;
+ }
+
+ RagDoll(0);
+ }
+ }
+
+ if (texupdatedelay < 0 && bleeding > 0 && bloodtoggle == 2 && distsq(&viewer, &coords) < 9) {
+ texupdatedelay = .12;
+
+ bloodsize = 5 - realtexdetail;
+
+ startx = 0;
+ starty = 0;
+ startx = bleedy; //abs(Random()%(skeleton.skinsize-bloodsize-1));
+ starty = bleedx; //abs(Random()%(skeleton.skinsize-bloodsize-1));
+ endx = startx + bloodsize;
+ endy = starty + bloodsize;
+
+ if (startx < 0) {
+ startx = 0;
+ bleeding = 0;
+ }
+ if (starty < 0) {
+ starty = 0;
+ bleeding = 0;
+ }
+ if (endx > skeleton.skinsize - 1) {
+ endx = skeleton.skinsize - 1;
+ bleeding = 0;
+ }
+ if (endy > skeleton.skinsize - 1) {
+ endy = skeleton.skinsize - 1;
+ bleeding = 0;
+ }
+ if (endx < startx)
+ endx = startx;
+ if (endy < starty)
+ endy = starty;
+
+ for (i = startx; i < endx; i++) {
+ for (j = starty; j < endy; j++) {
+ if (Random() % 2 == 0) {
+ color = Random() % 85 + 170;
+ if (skeleton.skinText[i * skeleton.skinsize * 3 + j * 3 + 0] > color / 2)
+ skeleton.skinText[i * skeleton.skinsize * 3 + j * 3 + 0] = color / 2;
+ skeleton.skinText[i * skeleton.skinsize * 3 + j * 3 + 1] = 0;
+ skeleton.skinText[i * skeleton.skinsize * 3 + j * 3 + 2] = 0;
+ }
+ }
+ }
+ if (detail > 1) {
+ skeleton.drawmodel.textureptr.bind();
+ DoMipmaps();
+ }
+
+ if (skeleton.free) {
+ bleedx += 4 * direction / realtexdetail;
+ if (detail == 2)
+ bleedy += (abs(Random() % 3) - 1) * 2 / realtexdetail;
+ else
+ bleedy += (abs(Random() % 3) - 1) * 4 / realtexdetail;
+ } else {
+ bleedy -= 4 / realtexdetail;
+ if (detail == 2)
+ bleedx += (abs(Random() % 3) - 1) * 2 / realtexdetail;
+ else
+ bleedx += (abs(Random() % 3) - 1) * 4 / realtexdetail;
+ }
+ }
+
+ if (abs(righthandmorphness - targetrighthandmorphness) < multiplier * 4) {
+ righthandmorphness = targetrighthandmorphness;
+ righthandmorphstart = righthandmorphend;
+ } else if (righthandmorphness > targetrighthandmorphness) {
+ righthandmorphness -= multiplier * 4;
+ } else if (righthandmorphness < targetrighthandmorphness) {
+ righthandmorphness += multiplier * 4;
+ }
+
+ if (abs(lefthandmorphness - targetlefthandmorphness) < multiplier * 4) {
+ lefthandmorphness = targetlefthandmorphness;
+ lefthandmorphstart = lefthandmorphend;
+ } else if (lefthandmorphness > targetlefthandmorphness) {
+ lefthandmorphness -= multiplier * 4;
+ } else if (lefthandmorphness < targetlefthandmorphness) {
+ lefthandmorphness += multiplier * 4;
+ }
+
+ if (creature == rabbittype || targettailmorphness == 5 || targettailmorphness == 0) {
+ if (abs(tailmorphness - targettailmorphness) < multiplier * 10) {
+ tailmorphness = targettailmorphness;
+ tailmorphstart = tailmorphend;
+ } else if (tailmorphness > targettailmorphness) {
+ tailmorphness -= multiplier * 10;
+ } else if (tailmorphness < targettailmorphness) {
+ tailmorphness += multiplier * 10;
+ }
+ }
+
+ if (creature == wolftype) {
+ if (abs(tailmorphness - targettailmorphness) < multiplier * 4) {
+ tailmorphness = targettailmorphness;
+ tailmorphstart = tailmorphend;
+ } else if (tailmorphness > targettailmorphness) {
+ tailmorphness -= multiplier * 2;
+ } else if (tailmorphness < targettailmorphness) {
+ tailmorphness += multiplier * 2;
+ }
+ }
+
+ if (headmorphend == 3 || headmorphstart == 3) {
+ if (abs(headmorphness - targetheadmorphness) < multiplier * 7) {
+ headmorphness = targetheadmorphness;
+ headmorphstart = headmorphend;
+ } else if (headmorphness > targetheadmorphness) {
+ headmorphness -= multiplier * 7;
+ } else if (headmorphness < targetheadmorphness) {
+ headmorphness += multiplier * 7;
+ }
+ } else if (headmorphend == 5 || headmorphstart == 5) {
+ if (abs(headmorphness - targetheadmorphness) < multiplier * 10) {
+ headmorphness = targetheadmorphness;
+ headmorphstart = headmorphend;
+ } else if (headmorphness > targetheadmorphness) {
+ headmorphness -= multiplier * 10;
+ } else if (headmorphness < targetheadmorphness) {
+ headmorphness += multiplier * 10;
+ }
+ } else {
+ if (abs(headmorphness - targetheadmorphness) < multiplier * 4) {
+ headmorphness = targetheadmorphness;
+ headmorphstart = headmorphend;
+ } else if (headmorphness > targetheadmorphness) {
+ headmorphness -= multiplier * 4;
+ } else if (headmorphness < targetheadmorphness) {
+ headmorphness += multiplier * 4;
+ }
+ }
+
+ if (abs(chestmorphness - targetchestmorphness) < multiplier) {
+ chestmorphness = targetchestmorphness;
+ chestmorphstart = chestmorphend;
+ } else if (chestmorphness > targetchestmorphness) {
+ chestmorphness -= multiplier;
+ } else if (chestmorphness < targetchestmorphness) {
+ chestmorphness += multiplier;
+ }
+
+ if (dead != 2 && howactive <= typesleeping) {
+ if (chestmorphstart == 0 && chestmorphend == 0) {
+ chestmorphness = 0;
+ targetchestmorphness = 1;
+ chestmorphend = 3;
+ }
+ if (chestmorphstart != 0 && chestmorphend != 0) {
+ chestmorphness = 0;
+ targetchestmorphness = 1;
+ chestmorphend = 0;
+ if (environment == snowyenvironment) {
+ XYZ footpoint;
+ XYZ footvel;
+ if (skeleton.free) {
+ footvel = skeleton.specialforward[0] * -1;
+ footpoint = ((jointPos(head) + jointPos(neck)) / 2) * scale + coords;
+ } else {
+ footvel = DoRotation(skeleton.specialforward[0], 0, yaw, 0) * -1;
+ footpoint = DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords;
+ }
+ if (animTarget == sleepanim)
+ footvel = DoRotation(footvel, 0, 90, 0);
+ Sprite::MakeSprite(breathsprite, footpoint + footvel * .2, footvel * .4, 1, 1, 1, .4, .3);
+ }
+ }
+
+ if (!dead && howactive < typesleeping) {
+ blinkdelay -= multiplier * 2;
+ if (headmorphstart == 0 && headmorphend == 0 && blinkdelay <= 0) {
+ headmorphness = 0;
+ targetheadmorphness = 1;
+ headmorphend = 3;
+ blinkdelay = (float)(abs(Random() % 40)) / 5;
+ }
+ if (headmorphstart == 3 && headmorphend == 3) {
+ headmorphness = 0;
+ targetheadmorphness = 1;
+ headmorphend = 0;
+ }
+ }
+ if (!dead) {
+ twitchdelay -= multiplier * 1.5;
+ if (animTarget != hurtidleanim) {
+ if (headmorphstart == 0 && headmorphend == 0 && twitchdelay <= 0) {
+ headmorphness = 0;
+ targetheadmorphness = 1;
+ headmorphend = 5;
+ twitchdelay = (float)(abs(Random() % 40)) / 5;
+ }
+ if (headmorphstart == 5 && headmorphend == 5) {
+ headmorphness = 0;
+ targetheadmorphness = 1;
+ headmorphend = 0;
+ }
+ }
+ if ((isIdle() || isCrouch()) && animTarget != hurtidleanim) {
+ twitchdelay3 -= multiplier * 1;
+ if (Random() % 2 == 0) {
+ if (righthandmorphstart == 0 && righthandmorphend == 0 && twitchdelay3 <= 0) {
+ righthandmorphness = 0;
+ targetrighthandmorphness = 1;
+ righthandmorphend = 1;
+ if (Random() % 2 == 0)twitchdelay3 = (float)(abs(Random() % 40)) / 5;
+ }
+ if (righthandmorphstart == 1 && righthandmorphend == 1) {
+ righthandmorphness = 0;
+ targetrighthandmorphness = 1;
+ righthandmorphend = 0;
+ }
+ }
+ if (Random() % 2 == 0) {
+ if (lefthandmorphstart == 0 && lefthandmorphend == 0 && twitchdelay3 <= 0) {
+ lefthandmorphness = 0;
+ targetlefthandmorphness = 1;
+ lefthandmorphend = 1;
+ twitchdelay3 = (float)(abs(Random() % 40)) / 5;
+ }
+ if (lefthandmorphstart == 1 && lefthandmorphend == 1) {
+ lefthandmorphness = 0;
+ targetlefthandmorphness = 1;
+ lefthandmorphend = 0;
+ }
+ }
+ }
+ }
+ if (!dead) {
+ if (creature == rabbittype) {
+ if (howactive < typesleeping)
+ twitchdelay2 -= multiplier * 1.5;
+ else
+ twitchdelay2 -= multiplier * 0.5;
+ if (howactive <= typesleeping) {
+ if (tailmorphstart == 0 && tailmorphend == 0 && twitchdelay2 <= 0) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 1;
+ twitchdelay2 = (float)(abs(Random() % 40)) / 5;
+ }
+ if (tailmorphstart == 1 && tailmorphend == 1) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 2;
+ }
+ if (tailmorphstart == 2 && tailmorphend == 2) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 0;
+ }
+ }
+ }
+ }
+ }
+ if (creature == wolftype) {
+ twitchdelay2 -= multiplier * 1.5;
+ if (tailmorphend != 0)
+ if ((isRun() || animTarget == jumpupanim || animTarget == jumpdownanim || animTarget == backflipanim) && !skeleton.free) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 0;
+ twitchdelay2 = .1;
+ }
+ if (tailmorphend != 5)
+ if (animTarget == flipanim || animTarget == frontflipanim || animTarget == rollanim || skeleton.free) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 5;
+ twitchdelay2 = .1;
+ }
+ if (twitchdelay2 <= 0) {
+ if (((tailmorphstart == 0 && tailmorphend == 0) || (tailmorphstart == 5 && tailmorphend == 5))) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 1;
+ }
+ if (tailmorphstart == 1 && tailmorphend == 1) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 2;
+ }
+ if (tailmorphstart == 2 && tailmorphend == 2) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 3;
+ }
+ if (tailmorphstart == 3 && tailmorphend == 3) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 4;
+ }
+ if (tailmorphstart == 4 && tailmorphend == 4) {
+ tailmorphness = 0;
+ targettailmorphness = 1;
+ tailmorphend = 1;
+ }
+ }
+ }
+
+ if (dead != 1)
+ unconscioustime = 0;
+
+ if (dead == 1 || howactive == typesleeping) {
+ unconscioustime += multiplier;
+ //If unconscious, close eyes and mouth
+ if (righthandmorphend != 0)
+ righthandmorphness = 0;
+ righthandmorphend = 0;
+ targetrighthandmorphness = 1;
+
+ if (lefthandmorphend != 0)
+ lefthandmorphness = 0;
+ lefthandmorphend = 0;
+ targetlefthandmorphness = 1;
+
+ if (headmorphend != 3 && headmorphend != 5)
+ headmorphness = 0;
+ headmorphend = 3;
+ targetheadmorphness = 1;
+ }
+
+
+ if (howactive > typesleeping) {
+ XYZ headpoint;
+ headpoint = coords;
+ if (bloodtoggle && !bled) {
+ terrain.MakeDecal(blooddecalslow, headpoint, .8, .5, 0);
+ }
+ if (bloodtoggle && !bled)
+ for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) {
+ j = terrain.patchobjects[whichpatchx][whichpatchz][l];
+ XYZ point = DoRotation(headpoint - objects.position[j], 0, -objects.yaw[j], 0);
+ float size = .8;
+ float opacity = .6;
+ float yaw = 0;
+ objects.model[j].MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw);
+ }
+ bled = 1;
+ }
+
+ if (dead == 2 || howactive > typesleeping) {
+ //If dead, open mouth and hands
+ if (righthandmorphend != 0)
+ righthandmorphness = 0;
+ righthandmorphend = 0;
+ targetrighthandmorphness = 1;
+
+ if (lefthandmorphend != 0)
+ lefthandmorphness = 0;
+ lefthandmorphend = 0;
+ targetlefthandmorphness = 1;
+
+ if (headmorphend != 2)
+ headmorphness = 0;
+ headmorphend = 2;
+ targetheadmorphness = 1;
+ }
+
+ if (stunned > 0 && !dead && headmorphend != 2) {
+ if (headmorphend != 4)
+ headmorphness = 0;
+ headmorphend = 4;
+ targetheadmorphness = 1;
+ }
+
+ if (damage > damagetolerance && !dead) {
+
+ dead = 1;
+ unconscioustime = 0;
+
+ if (creature == wolftype) {
+ award_bonus(0, Wolfbonus);
+ }
+
+ RagDoll(0);
+
+ if (weaponactive != -1) {
+ weapons[weaponids[0]].drop(velocity * scale * -.3, velocity * scale);
+ weapons[weaponids[0]].velocity.x += .01;
+ num_weapons--;
+ if (num_weapons) {
+ weaponids[0] = weaponids[num_weapons];
+ if (weaponstuck == num_weapons)
+ weaponstuck = 0;
+ }
+ weaponactive = -1;
+ for (unsigned i = 0; i < Person::players.size(); i++) {
+ Person::players[i]->wentforweapon = 0;
+ }
+ }
+
+
+
+ if ((id == 0 || distsq(&coords, &viewer) < 50) && autoslomo) {
+ slomo = 1;
+ slomodelay = .2;
+ }
+
+ damage += 20;
+ }
+
+ if (!dead)
+ damage -= multiplier * 13;
+ if (!dead)
+ permanentdamage -= multiplier * 4;
+ if (isIdle() || isCrouch()) {
+ if (!dead)
+ permanentdamage -= multiplier * 4;
+ }
+ if (damage < 0)
+ damage = 0;
+ if (permanentdamage < 0)
+ permanentdamage = 0;
+ if (superpermanentdamage < 0)
+ superpermanentdamage = 0;
+ if (permanentdamage < superpermanentdamage) {
+ permanentdamage = superpermanentdamage;
+ }
+ if (damage < permanentdamage) {
+ damage = permanentdamage;
+ }
+ if (dead == 1 && damage < damagetolerance) {
+ dead = 0;
+ skeleton.free = 1;
+ damage -= 20;
+ for (int i = 0; i < skeleton.joints.size(); i++) {
+ skeleton.joints[i].velocity = 0;
+ }
+ }
+ if (permanentdamage > damagetolerance && dead != 2) {
+ DoBlood(1, 255);
+
+ if (weaponactive != -1) {
+ weapons[weaponids[0]].drop(velocity * scale * -.3, velocity * scale);
+ weapons[weaponids[0]].velocity.x += .01;
+ num_weapons--;
+ if (num_weapons) {
+ weaponids[0] = weaponids[num_weapons];
+ if (weaponstuck == num_weapons)
+ weaponstuck = 0;
+ }
+ weaponactive = -1;
+ for (unsigned i = 0; i < Person::players.size(); i++) {
+ Person::players[i]->wentforweapon = 0;
+ }
+ }
+
+ bled = 0;
+
+ if (!dead && creature == wolftype) {
+ award_bonus(0, Wolfbonus);
+ }
+
+ if (unconscioustime < .1 && (bonus != spinecrusher || bonustime > 1) && (bonus != FinishedBonus || bonustime > 1) && bloodloss < damagetolerance)
+ award_bonus(id, touchofdeath);
+ if (id != 0 && unconscioustime > .1) {
+ numafterkill++;
+ }
+
+ dead = 2;
+
+ skeleton.free = 1;
+
+ emit_sound_at(breaksound, coords);
+ }
+
+ if (skeleton.free == 1) {
+ if (id == 0)
+ pause_sound(whooshsound);
+
+ if (!dead) {
+ //If knocked over, open hands and close mouth
+ if (righthandmorphend != 0)
+ righthandmorphness = 0;
+ righthandmorphend = 0;
+ targetrighthandmorphness = 1;
+
+ if (lefthandmorphend != 0)
+ lefthandmorphness = 0;
+ lefthandmorphend = 0;
+ targetlefthandmorphness = 1;
+
+ if (headmorphend != 3 && headmorphend != 5 && headmorphstart != 3 && headmorphstart != 5) {
+ if (headmorphend != 0)
+ headmorphness = 0;
+ headmorphend = 0;
+ targetheadmorphness = 1;
+ }
+ }
+
+ skeleton.DoGravity(&scale);
+ float damageamount;
+ damageamount = skeleton.DoConstraints(&coords, &scale) * 5;
+ if (damage > damagetolerance - damageamount && !dead && (bonus != spinecrusher || bonustime > 1) && (bonus != style || bonustime > 1) && (bonus != cannon || bonustime > 1))
+ award_bonus(id, deepimpact);
+ DoDamage(damageamount / ((protectionhigh + protectionhead + protectionlow) / 3));
+
+ average = 0;
+ howmany = 0;
+ for (j = 0; j < skeleton.joints.size(); j++) {
+ average += skeleton.joints[j].position;
+ howmany++;
+ }
+ average /= howmany;
+ coords += average * scale;
+ for (j = 0; j < skeleton.joints.size(); j++) {
+ skeleton.joints[j].position -= average;
+ }
+ average /= multiplier;
+
+ velocity = 0;
+ for (int i = 0; i < skeleton.joints.size(); i++) {
+ velocity += skeleton.joints[i].velocity * scale;
+ }
+ velocity /= skeleton.joints.size();
+
+ if (!isnormal(velocity.x) && velocity.x) {
+ velocity = 0;
+ }
+
+ if (findLength(&average) < 10 && dead && skeleton.free) {
+ skeleton.longdead += (2000 - findLength(&average)) * multiplier + multiplier;
+ if (skeleton.longdead > 2000) {
+ if (skeleton.longdead > 6000) {
+ if (id == 0)
+ pause_sound(whooshsound);
+ skeleton.free = 3;
+ DrawSkeleton();
+ skeleton.free = 2;
+ }
+ if (dead == 2 && bloodloss < damagetolerance) {
+ XYZ headpoint;
+ headpoint = (jointPos(head) + jointPos(neck)) / 2 * scale + coords;
+ DoBlood(1, 255);
+ if (bloodtoggle && !bled) {
+ terrain.MakeDecal(blooddecal, headpoint, .2 * 1.2, .5, 0);
+ }
+ if (bloodtoggle && !bled)
+ for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) {
+ j = terrain.patchobjects[whichpatchx][whichpatchz][l];
+ XYZ point = DoRotation(headpoint - objects.position[j], 0, -objects.yaw[j], 0);
+ float size = .2 * 1.2;
+ float opacity = .6;
+ float yaw = 0;
+ objects.model[j].MakeDecal(blooddecal, &point, &size, &opacity, &yaw);
+ }
+ bled = 1;
+ }
+ if (dead == 2 && bloodloss >= damagetolerance) {
+ XYZ headpoint;
+ headpoint = (jointPos(abdomen) + jointPos(neck)) / 2 * scale + coords;
+ if (bleeding <= 0)
+ DoBlood(1, 255);
+ if (bloodtoggle && !bled) {
+ terrain.MakeDecal(blooddecalslow, headpoint, .8, .5, 0);
+ }
+ if (bloodtoggle && !bled)
+ for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) {
+ j = terrain.patchobjects[whichpatchx][whichpatchz][l];
+ XYZ point = DoRotation(headpoint - objects.position[j], 0, -objects.yaw[j], 0);
+ float size = .8;
+ float opacity = .6;
+ float yaw = 0;
+ objects.model[j].MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw);
+ }
+ bled = 1;
+ }
+ }
+ }
+
+ if (!dead && crouchkeydown && skeleton.freetime > .5 && id == 0 && skeleton.free) {
+ bool canrecover = 1;
+ XYZ startpoint, endpoint, colpoint, colviewer, coltarget;
+ startpoint = coords;
+ endpoint = coords;
+ endpoint.y -= .7;
+ if (terrain.lineTerrain(startpoint, endpoint, &colpoint) != -1)
+ canrecover = 0;
+ if (velocity.y < -30)
+ canrecover = 0;
+ for (i = 0; i < objects.numobjects; i++) {
+ if (objects.type[i] != treeleavestype && objects.type[i] != bushtype && objects.type[i] != firetype) {
+ colviewer = startpoint;
+ coltarget = endpoint;
+ if (objects.model[i].LineCheck(&colviewer, &coltarget, &colpoint, &objects.position[i], &objects.yaw[i]) != -1)
+ canrecover = 0;
+ }
+ }
+ if (canrecover) {
+ skeleton.free = 0;
+ XYZ middle;
+ middle = 0;
+
+ terrainnormal = jointPos(groin) - jointPos(abdomen);
+ if (joint(groin).locked && joint(abdomen).locked) {
+ terrainnormal = jointPos(groin) - jointPos(abdomen);
+ middle = (jointPos(groin) + jointPos(abdomen)) / 2;
+ }
+ if (joint(abdomen).locked && joint(neck).locked) {
+ terrainnormal = jointPos(abdomen) - jointPos(neck);
+ middle = (jointPos(neck) + jointPos(abdomen)) / 2;
+ }
+ if (joint(groin).locked && joint(neck).locked) {
+ terrainnormal = jointPos(groin) - jointPos(neck);
+ middle = (jointPos(groin) + jointPos(neck)) / 2;
+ }
+ Normalise(&terrainnormal);
+
+ targetyaw = -asin(0 - terrainnormal.x);
+ targetyaw *= 360 / 6.28;
+ if (terrainnormal.z < 0)
+ targetyaw = 180 - targetyaw;
+ yaw = targetyaw;
+
+ frameTarget = 0;
+ animTarget = flipanim;
+ crouchtogglekeydown = 1;
+ target = 0;
+ tilt2 = 0;
+ targettilt2 = 0;
+
+ animCurrent = tempanim;
+ frameCurrent = 0;
+ target = 0;
+
+ for (int i = 0; i < skeleton.joints.size(); i++) {
+ tempanimation.frames[0].joints[i].position = skeleton.joints[i].position;
+ tempanimation.frames[0].joints[i].position = DoRotation(tempanimation.frames[0].joints[i].position, 0, -yaw, 0);
+ }
+ }
+ }
+
+ if (findLength(&average) < 10 && !dead && skeleton.free) {
+ skeleton.longdead += (2000 - findLength(&average)) * multiplier + multiplier;
+ if (skeleton.longdead > (damage + 500) * 1.5) {
+ if (id == 0)
+ pause_sound(whooshsound);
+ skeleton.free = 0;
+ velocity = 0;
+ XYZ middle;
+ middle = 0;
+
+ terrainnormal = jointPos(groin) - jointPos(abdomen);
+ if (joint(groin).locked && joint(abdomen).locked) {
+ terrainnormal = jointPos(groin) - jointPos(abdomen);
+ middle = (jointPos(groin) + jointPos(abdomen)) / 2;
+ }
+ if (joint(abdomen).locked && joint(neck).locked) {
+ terrainnormal = jointPos(abdomen) - jointPos(neck);
+ middle = (jointPos(neck) + jointPos(abdomen)) / 2;
+ }
+ if (joint(groin).locked && joint(neck).locked) {
+ terrainnormal = jointPos(groin) - jointPos(neck);
+ middle = (jointPos(groin) + jointPos(neck)) / 2;
+ }
+ Normalise(&terrainnormal);
+
+ targetyaw = -asin(0 - terrainnormal.x);
+ targetyaw *= 360 / 6.28;
+ if (terrainnormal.z < 0)
+ targetyaw = 180 - targetyaw;
+ yaw = targetyaw;
+
+ targettilt2 = asin(terrainnormal.y) * 180 / 3.14 * -1;
+
+
+ if (skeleton.forward.y < 0) {
+ animTarget = getupfrombackanim;
+ frameTarget = 0;
+ targettilt2 = 0;
+ }
+ if (skeleton.forward.y > -.3) {
+ animTarget = getupfromfrontanim;
+ yaw += 180;
+ targetyaw += 180;
+ targettilt2 *= -1;
+ frameTarget = 0;
+ targettilt2 = 0;
+ }
+
+ if ((Random() % 8 == 0 && id != 0 && creature == rabbittype) || (Random() % 2 == 0 && id != 0 && creature == wolftype) || (id == 0 && crouchkeydown && (forwardkeydown || backkeydown || leftkeydown || rightkeydown))) {
+ animTarget = rollanim;
+ targetyaw = lookyaw;
+ if (id == 0) {
+ if (rightkeydown) {
+ targetyaw -= 90;
+ if (forwardkeydown)
+ targetyaw += 45;
+ if (backkeydown)
+ targetyaw -= 45;
+ }
+ if (leftkeydown) {
+ targetyaw += 90;
+ if (forwardkeydown)
+ targetyaw -= 45;
+ if (backkeydown)
+ targetyaw += 45;
+ }
+ if (backkeydown) {
+ if ( !leftkeydown && !rightkeydown)
+ targetyaw += 180;
+ }
+ targetyaw += 180;
+ }
+ }
+
+ if (abs(targettilt2) > 50)
+ targettilt2 = 0;
+ animCurrent = tempanim;
+ frameCurrent = 0;
+ target = 0;
+ tilt2 = targettilt2;
+
+ if (middle.y > 0 && animTarget != rollanim)
+ targetoffset.y = middle.y + 1;
+
+ for (int i = 0; i < skeleton.joints.size(); i++) {
+ tempanimation.frames[0].joints[i].position = skeleton.joints[i].position;
+ tempanimation.frames[0].joints[i].position = DoRotation(tempanimation.frames[0].joints[i].position, 0, -yaw, 0);
+ }
+ }
+ }
+
+ bool hasstaff;
+ hasstaff = 0;
+ if (num_weapons > 0)
+ if (weapons[0].getType() == staff)
+ hasstaff = 1;
+ if (!skeleton.freefall && freefall && ((jumpkeydown && jumpkeydowntime < .2) || (hasstaff && rabbitkickragdoll)) && !dead) {
+ if (velocity.y > -30) {
+ XYZ tempvelocity;
+ tempvelocity = velocity;
+ Normalise(&tempvelocity);
+ targetyaw = -asin(0 - tempvelocity.x);
+ targetyaw *= 360 / 6.28;
+ if (velocity.z < 0)
+ targetyaw = 180 - targetyaw;
+ //targetyaw+=180;
+
+ skeleton.free = 0;
+ if (dotproduct(&skeleton.forward, &tempvelocity) < 0) {
+ animTarget = rollanim;
+ frameTarget = 2;
+ } else {
+ animTarget = backhandspringanim;
+ targetyaw += 180;
+ frameTarget = 6;
+ }
+ target = 0;
+
+ emit_sound_at(movewhooshsound, coords, 128.);
+
+ animCurrent = animTarget;
+ frameCurrent = frameTarget - 1;
+ target = 0;
+
+ velocity = 0;
+
+ yaw = targetyaw;
+ tilt = 0;
+ targettilt = 0;
+ tilt2 = 0;
+ targettilt2 = 0;
+ }
+ }
+ if (skeleton.freefall == 0)
+ freefall = 0;
+
+ }
+
+ if (aitype != passivetype || skeleton.free == 1)
+ if (findLengthfast(&velocity) > .1)
+ for (i = 0; i < objects.numobjects; i++) {
+ if (objects.type[i] == firetype)
+ if (distsqflat(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 12 && distsq(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 49) {
+ if (onfire) {
+ if (!objects.onfire[i]) {
+ emit_sound_at(firestartsound, objects.position[i]);
+ }
+ objects.onfire[i] = 1;
+ }
+ if (!onfire) {
+ if (objects.onfire[i]) {
+ CatchFire();
+ }
+ }
+ }
+ if (objects.type[i] == bushtype)
+ if (distsqflat(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 12 && distsq(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 49) {
+ if (onfire) {
+ if (!objects.onfire[i]) {
+ emit_sound_at(firestartsound, objects.position[i]);
+ }
+ objects.onfire[i] = 1;
+ }
+
+ if (!onfire) {
+ if (objects.onfire[i]) {
+ CatchFire();
+ }
+ }
+ if (objects.messedwith[i] <= 0) {
+ XYZ tempvel;
+ XYZ pos;
+
+ emit_sound_at(bushrustle, coords, 40 * findLength(&velocity));
+
+ if (id == 0) {
+ addEnvSound(coords, 4 * findLength(&velocity));
+ }
+
+ int howmany;
+ if (environment == grassyenvironment)
+ howmany = findLength(&velocity) * 4;
+ if (environment == snowyenvironment)
+ howmany = findLength(&velocity) * 2;
+ if (detail == 2)
+ if (environment != desertenvironment)
+ for (j = 0; j < howmany; j++) {
+ tempvel.x = float(abs(Random() % 100) - 50) / 20;
+ tempvel.y = float(abs(Random() % 100) - 50) / 20;
+ tempvel.z = float(abs(Random() % 100) - 50) / 20;
+ pos = coords;
+ pos.y += 1;
+ pos.x += float(abs(Random() % 100) - 50) / 200;
+ pos.y += float(abs(Random() % 100) - 50) / 200;
+ pos.z += float(abs(Random() % 100) - 50) / 200;
+ Sprite::MakeSprite(splintersprite, pos, tempvel * .5 + velocity * float(abs(Random() % 100)) / 100, 165 / 255 + float(abs(Random() % 100) - 50) / 400, 0, 0, .2 + float(abs(Random() % 100) - 50) / 1300, 1);
+ Sprite::setLastSpriteSpecial(1);
+ }
+ howmany = findLength(&velocity) * 4;
+ if (detail == 2)
+ if (environment == snowyenvironment)
+ for (j = 0; j < howmany; j++) {
+ tempvel.x = float(abs(Random() % 100) - 50) / 20;
+ tempvel.y = float(abs(Random() % 100) - 50) / 20;
+ tempvel.z = float(abs(Random() % 100) - 50) / 20;
+ pos = coords;
+ pos.y += 1;
+ pos.x += float(abs(Random() % 100) - 50) / 200;
+ pos.y += float(abs(Random() % 100) - 50) / 200;
+ pos.z += float(abs(Random() % 100) - 50) / 200;
+ Sprite::MakeSprite(splintersprite, pos, tempvel * .3 + velocity * float(abs(Random() % 100)) / 100 / 2, 1, 1, 1, .1, 1);
+ Sprite::setLastSpriteSpecial(2);
+ }
+ }
+ objects.rotx[i] += velocity.x * multiplier * 6;
+ objects.roty[i] += velocity.z * multiplier * 6;
+ objects.messedwith[i] = .5;
+ }
+ XYZ tempcoord;
+ if (objects.type[i] == treeleavestype && environment != desertenvironment) {
+ if (objects.pitch[i] == 0)
+ tempcoord = coords;
+ else {
+ tempcoord = coords - objects.position[i];
+ tempcoord = DoRotation(tempcoord, 0, -objects.yaw[i], 0);
+ tempcoord = DoRotation(tempcoord, -objects.pitch[i], 0, 0);
+ tempcoord += objects.position[i];
+ }
+ if (distsqflat(&tempcoord, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 8 && distsq(&tempcoord, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 300 && tempcoord.y > objects.position[i].y + 3 * objects.scale[i]) {
+ if (objects.messedwith[i] <= 0) {
+ XYZ tempvel;
+ XYZ pos;
+
+ emit_sound_at(bushrustle, coords, 40 * findLength(&velocity));
+
+ if (id == 0) {
+ addEnvSound(coords, 4 * findLength(&velocity));
+ }
+
+ int howmany;
+ if (environment == grassyenvironment)
+ howmany = findLength(&velocity) * 4;
+ if (environment == snowyenvironment)
+ howmany = findLength(&velocity) * 2;
+ if (detail == 2)
+ if (environment != desertenvironment)
+ for (j = 0; j < howmany; j++) {
+ tempvel.x = float(abs(Random() % 100) - 50) / 20;
+ tempvel.y = float(abs(Random() % 100) - 50) / 20;
+ tempvel.z = float(abs(Random() % 100) - 50) / 20;
+ pos = coords;
+ pos += velocity * .1;
+ pos.y += 1;
+ pos.x += float(abs(Random() % 100) - 50) / 150;
+ pos.y += float(abs(Random() % 100) - 50) / 150;
+ pos.z += float(abs(Random() % 100) - 50) / 150;
+ Sprite::MakeSprite(splintersprite, pos, tempvel * .5 + velocity * float(abs(Random() % 100)) / 100, 165 / 255 + float(abs(Random() % 100) - 50) / 400, 0, 0, .2 + float(abs(Random() % 100) - 50) / 1300, 1);
+ Sprite::setLastSpriteSpecial(1);
+ }
+ howmany = findLength(&velocity) * 4;
+ if (detail == 2)
+ if (environment == snowyenvironment)
+ for (j = 0; j < howmany; j++) {
+ tempvel.x = float(abs(Random() % 100) - 50) / 20;
+ tempvel.y = float(abs(Random() % 100) - 50) / 20;
+ tempvel.z = float(abs(Random() % 100) - 50) / 20;
+ pos = coords;
+ pos += velocity * .1;
+ pos.y += 1;
+ pos.x += float(abs(Random() % 100) - 50) / 150;
+ pos.y += float(abs(Random() % 100) - 50) / 150;
+ pos.z += float(abs(Random() % 100) - 50) / 150;
+ Sprite::MakeSprite(splintersprite, pos, tempvel * .3 + velocity * float(abs(Random() % 100)) / 100 / 2, 1, 1, 1, .1, 1);
+ Sprite::setLastSpriteSpecial(2);
+ }
+ }
+ objects.messedwith[i] = .5;
+ }
+ }
+ }
+
+ if (!skeleton.free) {
+ bool play;
+ play = 0;
+ if ((stunned > 0 || surprised > 0) && Person::players.size() > 2 && aitype != passivetype)
+ play = 1;
+ if (hasvictim)
+ if (aitype != passivetype && victim->skeleton.free && !victim->dead)
+ play = 1;
+ if (tutoriallevel == 1 && id != 0)
+ play = 0;
+ if (play && aitype != playercontrolled) {
+ int whichsound = -1;
+ i = abs(Random() % 4);
+ if (speechdelay <= 0) {
+ if (creature == rabbittype) {
+ if (i == 0)
+ whichsound = rabbitchitter;
+ if (i == 1)
+ whichsound = rabbitchitter2;
+ }
+ if (creature == wolftype) {
+ if (i == 0)
+ whichsound = growlsound;
+ if (i == 1)
+ whichsound = growl2sound;
+ }
+ }
+ speechdelay = .3;
+
+ if (whichsound != -1) {
+ emit_sound_at(whichsound, coords);
+ }
+ }
+
+ if (animTarget == staggerbackhighanim)
+ staggerdelay = 1;
+ if (animTarget == staggerbackhardanim)
+ staggerdelay = 1;
+ staggerdelay -= multiplier;
+ if (animTarget != crouchstabanim && animTarget != swordgroundstabanim && animTarget != staffgroundsmashanim)
+ hasvictim = 1;
+ if (velocity.y < -30 && animTarget == jumpdownanim)
+ RagDoll(0);
+ if (animCurrent != getIdle() && wasIdle() && animTarget != getIdle() && isIdle()) {
+ animTarget = getIdle();
+ frameTarget = 0;
+ target = 0;
+ }
+ weaponmissdelay -= multiplier;
+ highreversaldelay -= multiplier;
+ lowreversaldelay -= multiplier;
+ lastcollide -= multiplier;
+ skiddelay -= multiplier;
+ if (!isnormal(velocity.x) && velocity.x) {
+ velocity = 0;
+ }
+ if (!isnormal(targettilt) && targettilt) {
+ targettilt = 0;
+ }
+ if (!isnormal(targettilt2) && targettilt2) {
+ targettilt2 = 0;
+ }
+ if (!isnormal(targetyaw) && targetyaw) {
+ targetyaw = 0;
+ }
+
+ if (animTarget == bounceidleanim || animTarget == wolfidle || animTarget == walkanim || animTarget == drawrightanim || animTarget == crouchdrawrightanim || animTarget == drawleftanim || animTarget == fightidleanim || animTarget == fightsidestep || animTarget == hanganim || isCrouch() || animTarget == backhandspringanim) {
+ //open hands and close mouth
+ if (righthandmorphend != 0 && righthandmorphness == targetrighthandmorphness) {
+ righthandmorphness = 0;
+ righthandmorphend = 0;
+ targetrighthandmorphness = 1;
+ }
+
+ if (lefthandmorphend != 0 && lefthandmorphness == targetlefthandmorphness) {
+ lefthandmorphness = 0;
+ lefthandmorphend = 0;
+ targetlefthandmorphness = 1;
+ }
+
+ if (headmorphend != 3 && headmorphend != 5 && headmorphstart != 3 && headmorphstart != 5 && headmorphend != 0 && headmorphness == targetheadmorphness) {
+ headmorphness = 0;
+ headmorphend = 0;
+ targetheadmorphness = 1;
+ }
+ }
+
+ if (animTarget == rollanim || animTarget == dodgebackanim || animTarget == removeknifeanim || animTarget == knifefightidleanim || animTarget == swordfightidleanim || animTarget == blockhighleftstrikeanim || animTarget == crouchremoveknifeanim || animTarget == sneakanim || animTarget == sweepanim || animTarget == spinkickreversedanim || animTarget == jumpdownanim || isWallJump() || isFlip() || animTarget == climbanim || isRun() || animTarget == getupfrombackanim || animTarget == getupfromfrontanim) {
+ //open hands and mouth
+ if (righthandmorphend != 0 && righthandmorphness == targetrighthandmorphness) {
+ righthandmorphness = 0;
+ righthandmorphend = 0;
+ targetrighthandmorphness = 1;
+ }
+
+ if (lefthandmorphend != 0 && lefthandmorphness == targetlefthandmorphness) {
+ lefthandmorphness = 0;
+ lefthandmorphend = 0;
+ targetlefthandmorphness = 1;
+ }
+
+ if (headmorphend != 1 && headmorphness == targetheadmorphness) {
+ headmorphness = 0;
+ headmorphend = 1;
+ targetheadmorphness = 1;
+ }
+ }
+
+ if (animTarget == jumpupanim || animTarget == crouchstabanim || animTarget == swordgroundstabanim || animTarget == swordfightidlebothanim || animTarget == blockhighleftanim) {
+ //close hands and mouth
+ if (righthandmorphend != 1 && righthandmorphness == targetrighthandmorphness) {
+ righthandmorphness = 0;
+ righthandmorphend = 1;
+ targetrighthandmorphness = 1;
+ }
+
+ if (lefthandmorphend != 1 && lefthandmorphness == targetlefthandmorphness) {
+ lefthandmorphness = 0;
+ lefthandmorphend = 1;
+ targetlefthandmorphness = 1;
+ }
+
+ if (headmorphend != 0 && headmorphness == targetheadmorphness) {
+ headmorphness = 0;
+ headmorphend = 0;
+ targetheadmorphness = 1;
+ }
+ }
+
+ if (animTarget == spinkickanim || animTarget == staffspinhitreversalanim || animTarget == staffspinhitreversedanim || animTarget == staffhitreversalanim || animTarget == staffhitreversedanim || animTarget == hurtidleanim || animTarget == winduppunchanim || animTarget == swordslashreversalanim || animTarget == swordslashreversedanim || animTarget == knifeslashreversalanim || animTarget == knifeslashreversedanim || animTarget == knifethrowanim || animTarget == knifefollowanim || animTarget == knifefollowedanim || animTarget == killanim || animTarget == dropkickanim || animTarget == upunchanim || animTarget == knifeslashstartanim || animTarget == swordslashanim || animTarget == staffhitanim || animTarget == staffspinhitanim || animTarget == staffgroundsmashanim || animTarget == spinkickreversalanim || animTarget == sweepreversalanim || animTarget == lowkickanim || animTarget == sweepreversedanim || animTarget == rabbitkickreversalanim || animTarget == rabbitkickreversedanim || animTarget == jumpreversalanim || animTarget == jumpreversedanim) {
+ //close hands and yell
+ if (righthandmorphend != 1 && righthandmorphness == targetrighthandmorphness) {
+ righthandmorphness = 0;
+ righthandmorphend = 1;
+ targetrighthandmorphness = 1;
+ }
+
+ if (lefthandmorphend != 1 && lefthandmorphness == targetlefthandmorphness) {
+ lefthandmorphness = 0;
+ lefthandmorphend = 1;
+ targetlefthandmorphness = 1;
+ }
+
+ if (headmorphend != 2 && headmorphness == targetheadmorphness) {
+ headmorphness = 1;
+ headmorphend = 2;
+ targetheadmorphness = 1;
+ }
+ }
+
+ bool behind;
+ behind = 0;
+ if (hasvictim) {
+ if ((victim != this->shared_from_this()) && !victim->dead && (victim->aitype != passivetype) &&
+ (victim->aitype != searchtype) && (aitype != passivetype) &&
+ (aitype != searchtype) && (victim->id < Person::players.size())) {
+ behind = (normaldotproduct(facing, coords - victim->coords) > 0);
+ }
+ }
+
+ if (!dead && animTarget != hurtidleanim)
+ if (behind || animTarget == killanim || animTarget == knifethrowanim || animTarget == knifefollowanim || animTarget == spinkickreversalanim || animTarget == rabbitkickreversedanim || animTarget == jumpreversedanim) {
+ if (headmorphend != 4 || headmorphness == targetheadmorphness) {
+ headmorphend = 4;
+ //headmorphness=1;
+ targetheadmorphness = 1;
+ }
+ }
+
+ if (weaponactive != -1) {
+ if (weapons[weaponids[weaponactive]].getType() != staff) {
+ righthandmorphstart = 1;
+ righthandmorphend = 1;
+ }
+ if (weapons[weaponids[weaponactive]].getType() == staff) {
+ righthandmorphstart = 2;
+ righthandmorphend = 2;
+ }
+ targetrighthandmorphness = 1;
+ }
+
+ terrainnormal = terrain.getNormal(coords.x, coords.z);
+
+ if (Animation::animations[animTarget].attack != reversal) {
+ if (!isnormal(coords.x))
+ coords = oldcoords;
+ oldcoords = coords;
+ }
+
+ flatfacing = 0;
+ flatfacing.z = 1;
+
+ flatfacing = DoRotation(flatfacing, 0, yaw, 0);
+ facing = flatfacing;
+ ReflectVector(&facing, terrainnormal);
+ Normalise(&facing);
+
+ if (isRun() || animTarget == sneakanim || animTarget == rollanim || animTarget == walkanim) {
+ if (onterrain)
+ targettilt2 = -facing.y * 20;
+ else
+ targettilt2 = 0;
+ }
+ onterrain = 0;
+ if (!isRun() && !Animation::animations[animTarget].attack && animTarget != getupfromfrontanim && animTarget != getupfrombackanim && animTarget != sneakanim)
+ targettilt2 = 0;
+ if (animTarget == jumpupanim || animTarget == jumpdownanim || isFlip()) {
+ flatvelocity = velocity;
+ flatvelocity.y = 0;
+ flatvelspeed = findLength(&flatvelocity);
+ targettilt = flatvelspeed * fast_sqrt(abs(velocity.y) * .7) * normaldotproduct(DoRotation(flatfacing, 0, -90, 0), flatvelocity);
+ targettilt2 = flatvelspeed * fast_sqrt(abs(velocity.y) * .7) * normaldotproduct(flatfacing, flatvelocity);
+ if (velocity.y < 0)
+ targettilt2 *= -1;
+ if (velocity.y < 0)
+ targettilt *= -1;
+ if (targettilt > 25)
+ targettilt = 25;
+ if (targettilt < -25)
+ targettilt = -25;
+ }
+
+ if (targettilt2 > 45)
+ targettilt2 = 45;
+ if (targettilt2 < -45)
+ targettilt2 = -45;
+ if (abs(tilt2 - targettilt2) < multiplier * 400)
+ tilt2 = targettilt2;
+ else if (tilt2 > targettilt2) {
+ tilt2 -= multiplier * 400;
+ } else if (tilt2 < targettilt2) {
+ tilt2 += multiplier * 400;
+ }
+ if (!Animation::animations[animTarget].attack && animTarget != getupfrombackanim && animTarget != getupfromfrontanim) {
+ if (tilt2 > 25)
+ tilt2 = 25;
+ if (tilt2 < -25)
+ tilt2 = -25;
+ }
+
+ if (!isnormal(targettilt) && targettilt) {
+ targettilt = 0;
+ }
+ if (!isnormal(targettilt2) && targettilt2) {
+ targettilt2 = 0;
+ }
+
+ //Running velocity
+ if (animTarget == rabbittackleanim) {
+ velocity += facing * multiplier * speed * 700 * scale;
+ velspeed = findLength(&velocity);
+ if (velspeed > speed * 65 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 65 * scale;
+ velocity *= velspeed;
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ velocity = flatfacing * velspeed;
+ }
+ if (animTarget != rabbitrunninganim && animTarget != wolfrunninganim) {
+ if (isRun() || animTarget == rabbitkickanim) {
+ velocity += facing * multiplier * speed * 700 * scale;
+ velspeed = findLength(&velocity);
+ if (velspeed > speed * 45 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 45 * scale;
+ velocity *= velspeed;
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ if (velspeed < speed * 30 * scale)
+ velspeed = speed * 30 * scale;
+ velocity = flatfacing * velspeed;
+ }
+ } else if (isRun()) {
+ velocity += facing * multiplier * speed * 700 * scale;
+ velspeed = findLength(&velocity);
+ if (creature == rabbittype) {
+ if (velspeed > speed * 55 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 55 * scale;
+ velocity *= velspeed;
+ }
+ }
+ if (creature == wolftype) {
+ if (velspeed > speed * 75 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 75 * scale;
+ velocity *= velspeed;
+ }
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ velocity = flatfacing * velspeed;
+ }
+
+ if (animTarget == rollanim && targetFrame().label != 6) {
+ velocity += facing * multiplier * speed * 700 * scale;
+ velspeed = findLength(&velocity);
+ if (velspeed > speed * 45 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 45 * scale;
+ velocity *= velspeed;
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ velocity = flatfacing * velspeed;
+ }
+
+ if (animTarget == sneakanim || animTarget == walkanim) {
+ velocity += facing * multiplier * speed * 700 * scale;
+ velspeed = findLength(&velocity);
+ if (velspeed > speed * 12 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 12 * scale;
+ velocity *= velspeed;
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ velocity = flatfacing * velspeed;
+ }
+
+ if ((animTarget == fightidleanim || animTarget == knifefightidleanim) && (animCurrent == bounceidleanim || animCurrent == hurtidleanim)) {
+ velocity += facing * multiplier * speed * 700 * scale;
+ velspeed = findLength(&velocity);
+ if (velspeed > speed * 2 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 2 * scale;
+ velocity *= velspeed;
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ velocity = flatfacing * velspeed;
+ }
+
+
+ if ((animTarget == bounceidleanim || animCurrent == hurtidleanim) && (animCurrent == fightidleanim || animCurrent == knifefightidleanim)) {
+ velocity -= facing * multiplier * speed * 700 * scale;
+ velspeed = findLength(&velocity);
+ if (velspeed > speed * 2 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 2 * scale;
+ velocity *= velspeed;
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ velocity = flatfacing * velspeed * -1;
+ }
+
+ if (animTarget == fightsidestep) {
+ velocity += DoRotation(facing * multiplier * speed * 700 * scale, 0, -90, 0);
+ velspeed = findLength(&velocity);
+ if (velspeed > speed * 12 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 12 * scale;
+ velocity *= velspeed;
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ velocity = DoRotation(flatfacing * velspeed, 0, -90, 0);
+ }
+
+ if (animTarget == staggerbackhighanim) {
+ coords -= facing * multiplier * speed * 16 * scale;
+ velocity = 0;
+ }
+ if (animTarget == staggerbackhardanim && Animation::animations[staggerbackhardanim].frames[frameTarget].label != 6) {
+ coords -= facing * multiplier * speed * 20 * scale;
+ velocity = 0;
+ }
+
+ if (animTarget == backhandspringanim) {
+ //coords-=facing*multiplier*50*scale;
+ velocity += facing * multiplier * speed * 700 * scale * -1;
+ velspeed = findLength(&velocity);
+ if (velspeed > speed * 50 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 50 * scale;
+ velocity *= velspeed;
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ velocity = flatfacing * velspeed * -1;
+ }
+ if (animTarget == dodgebackanim) {
+ //coords-=facing*multiplier*50*scale;
+ velocity += facing * multiplier * speed * 700 * scale * -1;
+ velspeed = findLength(&velocity);
+ if (velspeed > speed * 60 * scale) {
+ velocity /= velspeed;
+ velspeed = speed * 60 * scale;
+ velocity *= velspeed;
+ }
+ velocity.y += gravity * multiplier * 20;
+ ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
+ velspeed = findLength(&velocity);
+ velocity = flatfacing * velspeed * -1;
+ }
+
+ if (animTarget == jumpupanim || animTarget == jumpdownanim || isFlip()) {
+ velspeed = findLength(&velocity);
+ }
+
+
+ if (animTarget == jumpupanim || animTarget == jumpdownanim || isFlip()) {
+ velocity.y += gravity * multiplier;
+ }
+
+ if (animTarget != climbanim && animTarget != hanganim && !isWallJump())
+ coords += velocity * multiplier;
+
+ if (coords.y < terrain.getHeight(coords.x, coords.z) && (animTarget == jumpdownanim || animTarget == jumpupanim || isFlip())) {
+ if (isFlip() && targetFrame().label == 7)
+ RagDoll(0);
+
+ if (animTarget == jumpupanim) {
+ jumppower = -4;
+ animTarget = getIdle();
+ }
+ target = 0;
+ frameTarget = 0;
+ onterrain = 1;
+
+ if (id == 0) {
+ pause_sound(whooshsound);
+ OPENAL_SetVolume(channels[whooshsound], 0);
+ }
+
+ if (animTarget == jumpdownanim || isFlip()) {
+ if (isFlip())jumppower = -4;
+ animTarget = getLanding();
+ emit_sound_at(landsound, coords, 128.);
+
+ if (id == 0) {
+ addEnvSound(coords);
+ }
+ }
+ }
+
+ if (animTarget != jumpupanim && animTarget != jumpdownanim && !isFlip() && animTarget != climbanim && animTarget != hanganim && !isWallJump())
+ coords.y += gravity * multiplier * 2;
+ if (animTarget != jumpupanim && animTarget != jumpdownanim && !isFlip() && coords.y < terrain.getHeight(coords.x, coords.z)) {
+ coords.y = terrain.getHeight(coords.x, coords.z);
+ onterrain = 1;
+ }
+
+
+ if (isIdle() || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim || animTarget == crouchstabanim || animTarget == swordgroundstabanim || isStop() || animTarget == removeknifeanim || animTarget == crouchremoveknifeanim || isLanding() || isCrouch() || Animation::animations[animTarget].attack || (animTarget == rollanim && targetFrame().label == 6)) {
+ velspeed = findLength(&velocity);
+ velocity.y = 0;
+ if (velspeed < multiplier * 300 * scale) {
+ velocity = 0;
+ } else
+ velocity -= velocity / velspeed * multiplier * 300 * scale;
+ if (velspeed > 5 && (isLanding() || isLandhard())) {
+ skiddingdelay += multiplier;
+ if (skiddelay <= 0) {
+ FootLand(leftfoot, .5);
+ FootLand(rightfoot, .5);
+ skiddelay = .02;
+ }
+ } else
+ skiddingdelay = 0;
+ }
+
+ if (isLandhard()) {
+ velspeed = findLength(&velocity);
+ velocity.y = 0;
+ if (velspeed < multiplier * 600 * scale) {
+ velocity = 0;
+ } else
+ velocity -= velocity / velspeed * multiplier * 600 * scale;
+ velocity = 0;
+ if (velspeed > 5 && (isLanding() || isLandhard())) {
+ skiddingdelay += multiplier;
+ if (skiddelay <= 0) {
+ FootLand(leftfoot, .5);
+ FootLand(rightfoot, .5);
+ skiddelay = .02;
+ }
+ } else
+ skiddingdelay = 0;
+ }
+
+ if (skiddingdelay < 0)
+ skiddingdelay += multiplier;
+ if (skiddingdelay > .02 && !forwardkeydown && !backkeydown && !leftkeydown && !rightkeydown && !jumpkeydown && isLanding() && !landhard) {
+ skiddingdelay = -1;
+ if (!onterrain || environment == grassyenvironment) {
+ emit_sound_at(skidsound, coords, 128 * velspeed / 10);
+ } else {
+ emit_sound_at(snowskidsound, coords, 128 * velspeed / 10);
+ }
+ }
+
+ if (Animation::animations[animTarget].attack == normalattack && animTarget != rabbitkickanim && !victim->skeleton.free) {
+ terrainnormal = victim->coords - coords;
+ Normalise(&terrainnormal);
+ targetyaw = -asin(0 - terrainnormal.x);
+ targetyaw *= 360 / 6.28;
+ if (terrainnormal.z < 0)
+ targetyaw = 180 - targetyaw;
+ targettilt2 = -asin(terrainnormal.y) * 360 / 6.28; //*-70;
+ }
+
+ if (Animation::animations[animTarget].attack == reversal && animTarget != rabbittacklinganim) {
+ targetyaw = victim->targetyaw;
+ }
+ if (animTarget == rabbittacklinganim) {
+ coords = victim->coords;
+ }
+ }
+ skeleton.oldfree = skeleton.free;
+
+ XYZ midterrain;
+ midterrain = 0;
+ midterrain.x = terrain.size * terrain.scale / 2;
+ midterrain.z = terrain.size * terrain.scale / 2;
+ if (distsqflat(&coords, &midterrain) > (terrain.size * terrain.scale / 2 - viewdistance) * (terrain.size * terrain.scale / 2 - viewdistance)) {
+ XYZ tempposit;
+ tempposit = coords - midterrain;
+ tempposit.y = 0;
+ Normalise(&tempposit);
+ tempposit *= (terrain.size * terrain.scale / 2 - viewdistance);
+ coords.x = tempposit.x + midterrain.x;
+ coords.z = tempposit.z + midterrain.z;
+ }