2 Copyright (C) 2003, 2010 - Wolfire Games
4 This file is part of Lugaru.
6 Lugaru is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 See the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 /**> HEADER FILES <**/
24 #include "openal_wrapper.h"
25 #include "Animation.h"
30 extern float multiplier;
31 extern int channels[100];
32 extern Terrain terrain;
34 extern int environment;
36 extern FRUSTUM frustum;
38 extern float realmultiplier;
40 extern float slomodelay;
41 extern bool cellophane;
42 extern float texdetail;
43 extern float realtexdetail;
44 extern GLubyte bloodText[512*512*3];
45 extern GLubyte wolfbloodText[512*512*3];
46 extern int bloodtoggle;
47 extern Objects objects;
49 extern bool autoslomo;
50 extern float camerashake;
52 extern float terraindetail;
53 extern float viewdistance;
54 extern float blackout;
55 extern int difficulty;
57 extern float fadestart;
59 extern bool winfreeze;
60 extern float flashamount,flashr,flashg,flashb;
61 extern int flashdelay;
62 extern bool showpoints;
63 extern bool immediate;
65 extern bool tilt2weird;
66 extern bool tiltweird;
68 extern bool proportionweird;
69 extern bool vertexweird[6];
70 extern GLubyte texturearray[512*512*3];
71 extern XYZ envsound[30];
72 extern float envsoundvol[30];
73 extern float envsoundlife[30];
74 extern int numenvsounds;
75 extern int tutoriallevel;
76 extern float smoketex;
77 extern int tutorialstage;
78 extern bool reversaltrain;
79 extern bool canattack;
81 extern float damagedealt;
83 extern float hostiletime;
85 extern int indialogue;
87 extern bool gamestarted;
89 extern "C" void PlaySoundEx(int channel, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
90 extern "C" void PlayStreamEx(int chan, OPENAL_STREAM *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
92 void Person::CheckKick(){
96 float damagemult=1*power;
97 if(creature==wolftype)damagemult=2.5*power;
101 if(targetanimation==rabbitkickanim&&victim&&victim!=this&¤tframe>=2&¤tanimation==rabbitkickanim){
102 if(findDistancefast(&coords,&victim->coords)<1.2){
103 if(!victim->skeleton.free){
105 Normalise(&relative);
106 relative=coords+relative*1;
107 if(animation[victim->targetanimation].height!=lowheight){
111 emit_sound_at(heavyimpactsound, victim->coords);
115 Normalise(&relative);
116 for(i=0;i<victim->skeleton.num_joints;i++){
117 victim->skeleton.joints[i].velocity+=relative*120*damagemult;
120 victim->DoDamage(100*damagemult/victim->protectionhigh);
121 if(id==0)camerashake+=.4;
125 targetanimation=backflipanim;
130 if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
132 award_bonus(id, cannon);
134 else if (victim->isCrouch()){
135 targetanimation=rabbitkickreversedanim;
136 currentanimation=rabbitkickreversedanim;
137 victim->currentanimation=rabbitkickreversalanim;
138 victim->targetanimation=rabbitkickreversalanim;
144 victim->oldcoords=victim->coords;
145 coords=victim->coords;
146 victim->targetrotation=targetrotation;
154 void Person::CatchFire(){
155 XYZ flatfacing,flatvelocity;
157 for(int i=0;i<10;i++){
158 howmany=abs(Random()%(skeleton.num_joints));
159 if(!skeleton.free)flatvelocity=velocity;
160 if(skeleton.free)flatvelocity=skeleton.joints[howmany].velocity;
161 if(!skeleton.free)flatfacing=DoRotation(DoRotation(DoRotation(skeleton.joints[howmany].position,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords;
162 if(skeleton.free)flatfacing=skeleton.joints[howmany].position*scale+coords;
163 Sprite::MakeSprite(flamesprite, flatfacing,flatvelocity, 1,1,1, 2, 1);
168 emit_sound_at(firestartsound, coords);
170 emit_stream_at(stream_firesound, coords);
177 int Person::getIdle(){
178 if(indialogue!=-1&&howactive==typeactive&&creature==rabbittype)return talkidleanim;
179 if(hasvictim&&victim!=this/*||(id==0&&attackkeydown)*/)if(/*(id==0&&attackkeydown)||*/(!victim->dead&&victim->aitype!=passivetype&&victim->aitype!=searchtype&&aitype!=passivetype&&aitype!=searchtype&&victim->id<numplayers)){
180 if((aitype==playercontrolled&&stunned<=0&&weaponactive==-1)||pause){
181 if(creature==rabbittype)return fightidleanim;
182 if(creature==wolftype)return wolfidle;
184 if(aitype==playercontrolled&&stunned<=0&&weaponactive!=-1){
185 if(weapons.type[weaponids[weaponactive]]==knife)return knifefightidleanim;
186 if(weapons.type[weaponids[weaponactive]]==sword&&victim->weaponactive!=-1)return swordfightidlebothanim;
187 if(weapons.type[weaponids[weaponactive]]==sword)return swordfightidleanim;
188 if(weapons.type[weaponids[weaponactive]]==staff)return swordfightidleanim;
190 if(aitype!=playercontrolled&&stunned<=0&&creature!=wolftype&&!pause)return fightsidestep;
192 if((damage>permanentdamage||damage>damagetolerance*.8||deathbleeding>0)&&creature!=wolftype)return hurtidleanim;
193 if(howactive==typesitting)return sitanim;
194 if(howactive==typesittingwall)return sitwallanim;
195 if(howactive==typesleeping)return sleepanim;
196 if(howactive==typedead1)return dead1anim;
197 if(howactive==typedead2)return dead2anim;
198 if(howactive==typedead3)return dead3anim;
199 if(howactive==typedead4)return dead4anim;
200 if(creature==rabbittype)return bounceidleanim;
201 if(creature==wolftype)return wolfidle;
205 int Person::getCrouch(){
206 if(creature==rabbittype)return crouchanim;
207 if(creature==wolftype)return wolfcrouchanim;
211 int Person::getRun(){
212 if(creature==rabbittype&&(!superruntoggle||weaponactive!=-1))return runanim;
213 if(creature==wolftype&&(!superruntoggle))return wolfrunanim;
215 if(creature==rabbittype&&(superruntoggle&&weaponactive==-1))return rabbitrunninganim;
216 if(creature==wolftype&&(superruntoggle))return wolfrunninganim;
220 int Person::getStop(){
221 if(creature==rabbittype)return stopanim;
222 if(creature==wolftype)return wolfstopanim;
226 int Person::getLanding(){
227 if(creature==rabbittype)return landanim;
228 if(creature==wolftype)return wolflandanim;
232 int Person::getLandhard(){
233 if(creature==rabbittype)return landhardanim;
234 if(creature==wolftype)return wolflandhardanim;
239 bool Person::isWallJump(){
240 if(targetanimation==walljumpfrontanim||targetanimation==walljumpbackanim||targetanimation==walljumpleftanim||targetanimation==walljumprightanim)return 1;
245 SolidHitBonus(int playerid)
247 if (bonustime < 1.5 && bonus >= solidhit && bonus <= megacombo)
248 award_bonus(playerid, bonus == megacombo ? bonus : bonus + 1);
250 award_bonus(playerid, solidhit);
253 void Person::DoBlood(float howmuch,int which){
254 static int bleedxint,bleedyint;
256 //if(howmuch&&id==0)blooddimamount=1;
257 if(bloodtoggle&&tutoriallevel!=1){
258 if(bleeding<=0&&spurt){
260 for(int i=0;i<3;i++){
264 bloodvel=DoRotation(bloodvel,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
267 bloodvel-=DoRotation(skeleton.forward*10*scale,((float)(Random()%100))/4,((float)(Random()%100))/4,0);
269 if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
270 if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
272 Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
273 Sprite::MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .3, 1);
276 Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
277 Sprite::MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .3, 1);
281 for(int i=0;i<3;i++){
285 bloodvel-=DoRotation(skeleton.forward*10*scale,((float)(Random()%100))/4,((float)(Random()%100))/4,0);
286 bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
289 bloodvel=DoRotation(bloodvel,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
290 bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
294 Sprite::MakeSprite(splintersprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
296 Sprite::MakeSprite(splintersprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
298 Sprite::setLastSpriteSpecial(3);
303 bleeding=howmuch+(float)abs(Random()%100)/200-.25;
306 int texdetailint=realtexdetail;
307 if(creature==rabbittype)
308 while(bloodText[bleedxint*512*3+bleedyint*3+0]>which+4||bloodText[bleedxint*512*3+bleedyint*3+0]<which-4||bleedxint<10||bleedyint<10||bleedxint>500||bleedyint>500){
309 bleedxint=abs(Random()%512);
310 bleedyint=abs(Random()%512);
312 if(creature==wolftype)
313 while(wolfbloodText[bleedxint*512*3+bleedyint*3+0]>which+4||wolfbloodText[bleedxint*512*3+bleedyint*3+0]<which-4||bleedxint<10||bleedyint<10||bleedxint>500||bleedyint>500){
314 bleedxint=abs(Random()%512);
315 bleedyint=abs(Random()%512);
319 bleedy/=realtexdetail;
320 bleedx/=realtexdetail;
321 direction=abs(Random()%2)*2-1;
325 if(bleeding>2)bleeding=2;
328 void Person::DoBloodBig(float howmuch,int which){
329 static int bleedxint,bleedyint,i,j;
331 if(howmuch&&id==0)blooddimamount=1;
333 if(tutoriallevel!=1||id==0)
334 if(aitype!=playercontrolled&&howmuch>0){
337 if(creature==wolftype){
338 int i=abs(Random()%2);
339 if(i==0)whichsound=snarlsound;
340 if(i==1)whichsound=snarl2sound;
341 envsound[numenvsounds]=coords;
342 envsoundvol[numenvsounds]=16;
343 envsoundlife[numenvsounds]=.4;
346 if(creature==rabbittype){
347 int i=abs(Random()%2);
348 if(i==0)whichsound=rabbitpainsound;
349 if(i==1&&howmuch>=2)whichsound=rabbitpain1sound;
350 envsound[numenvsounds]=coords;
351 envsoundvol[numenvsounds]=16;
352 envsoundlife[numenvsounds]=.4;
354 //if(i==2)whichsound=rabbitpain2sound;
358 emit_sound_at(whichsound, coords);
361 if(id==0&&howmuch>0){
369 if(bloodtoggle&&decals&&tutoriallevel!=1){
370 if(bleeding<=0&&spurt){
372 for(int i=0;i<3;i++){
376 bloodvel=DoRotation(bloodvel,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
379 bloodvel-=DoRotation(skeleton.forward*10*scale,((float)(Random()%100))/4,((float)(Random()%100))/4,0);
381 if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
382 if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
384 Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
385 Sprite::MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .3, 1);
388 Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
389 Sprite::MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .3, 1);
393 int offsetx=0,offsety=0;
396 offsetx=abs(Random()%60);
398 if(which==190||which==185){
400 offsetx=abs(Random()%100)-20;
410 if(which==220||which==215){
411 //offsety=Random()%20;
413 //offsetx=abs(Random()%80);
422 if(creature==rabbittype)
425 if(bloodText[i*512*3+j*3+0]<=which+4&&bloodText[i*512*3+j*3+0]>=which-4){
426 if(i<startx)startx=i;
427 if(j<starty)starty=j;
433 if(creature==wolftype)
436 if(wolfbloodText[i*512*3+j*3+0]<=which+4&&wolfbloodText[i*512*3+j*3+0]>=which-4){
437 if(i<startx)startx=i;
438 if(j<starty)starty=j;
450 if(startx<0)startx=0;
451 if(starty<0)starty=0;
452 if(endx>512-1)endx=512-1;
453 if(endy>512-1)endy=512-1;
454 if(endx<startx)endx=startx;
455 if(endy<starty)endy=starty;
457 startx/=realtexdetail;
458 starty/=realtexdetail;
462 int texdetailint=realtexdetail;
464 if(creature==rabbittype)
465 for(i=startx;i<endx;i++){
466 for(j=starty;j<endy;j++){
467 if(bloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]<=which+4&&bloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]>=which-4){
468 color=Random()%85+170;
469 where=i*skeleton.skinsize*3+j*3;
470 if(skeleton.skinText[where+0]>color/2)skeleton.skinText[where+0]=color/2;
471 skeleton.skinText[where+1]=0;
472 skeleton.skinText[where+2]=0;
476 if(creature==wolftype)
477 for(i=startx;i<endx;i++){
478 for(j=starty;j<endy;j++){
479 if(wolfbloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]<=which+4&&wolfbloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]>=which-4){
480 color=Random()%85+170;
481 where=i*skeleton.skinsize*3+j*3;
482 if(skeleton.skinText[where+0]>color/2)skeleton.skinText[where+0]=color/2;
483 skeleton.skinText[where+1]=0;
484 skeleton.skinText[where+2]=0;
488 glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
489 if(detail!=2||osx)DoMipmaps(5,0,0,skeleton.skinsize,skeleton.skinsize);
490 else DoMipmaps(0,startx/realtexdetail,endx/realtexdetail,starty/realtexdetail,endy/realtexdetail);
494 if(creature==rabbittype)
495 while(bloodText[bleedxint*512*3+bleedyint*3+0]>which+4||bloodText[bleedxint*512*3+bleedyint*3+0]<which-4||bleedxint<10||bleedyint<10||bleedxint>500||bleedyint>500){
496 bleedxint=abs(Random()%512);
497 bleedyint=abs(Random()%512);
499 if(creature==wolftype)
500 while(wolfbloodText[bleedxint*512*3+bleedyint*3+0]>which+4||wolfbloodText[bleedxint*512*3+bleedyint*3+0]<which-4||bleedxint<10||bleedyint<10||bleedxint>500||bleedyint>500){
501 bleedxint=abs(Random()%512);
502 bleedyint=abs(Random()%512);
504 bleedy=bleedxint+offsetx;
505 bleedx=bleedyint+offsety;
506 bleedy/=realtexdetail;
507 bleedx/=realtexdetail;
508 if(bleedx<0)bleedx=0;
509 if(bleedy<0)bleedy=0;
510 if(bleedx>skeleton.skinsize-1)bleedx=skeleton.skinsize-1;
511 if(bleedy>skeleton.skinsize-1)bleedy=skeleton.skinsize-1;
512 direction=abs(Random()%2)*2-1;
515 bleeding=howmuch+(float)abs(Random()%100)/200-.25;
516 deathbleeding+=bleeding;
517 bloodloss+=bleeding*3;
519 if(tutoriallevel!=1&&aitype!=playercontrolled&&bloodloss>damagetolerance*2/3&&bloodloss<damagetolerance&&creature==rabbittype){
520 if(abs(Random()%2)==0){aitype=gethelptype;
523 else aitype=attacktypecutoff;
526 if(bleeding>2)bleeding=2;
529 bool Person::DoBloodBigWhere(float howmuch,int which, XYZ where){
530 static int bleedxint,bleedyint,i,j;
532 static XYZ startpoint,endpoint,colpoint,movepoint;
533 static float rotationpoint;
535 static XYZ p1,p2,p3,p0;
539 float coordsx,coordsy;
542 if(bloodtoggle&&decals&&tutoriallevel!=1){
544 if(!skeleton.free)where=DoRotation(where,0,-rotation,0);
552 whichtri=skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &colpoint, &movepoint, &rotationpoint);
555 p1=skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[whichtri].vertex[0]];
556 p2=skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[whichtri].vertex[1]];
557 p3=skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[whichtri].vertex[2]];
559 CrossProduct(p2-p1,p3-p1,&N);
560 CrossProduct(p0-p1,p3-p1,&temp);
561 s = dotproduct(&temp,&N)/findLength(&N);
562 CrossProduct(p2-p1,p1-p0,&temp);
563 t = dotproduct(&temp,&N)/findLength(&N);
566 bary.x=findDistancefast(&p0,&p1);
567 bary.y=findDistancefast(&p0,&p2);
568 bary.z=findDistancefast(&p0,&p3);
570 total=bary.x+bary.y+bary.z;
579 total=bary.x+bary.y+bary.z;
585 gxx.x=skeleton.drawmodel.Triangles[whichtri].gx[0];
586 gxx.y=skeleton.drawmodel.Triangles[whichtri].gx[1];
587 gxx.z=skeleton.drawmodel.Triangles[whichtri].gx[2];
588 gyy.x=skeleton.drawmodel.Triangles[whichtri].gy[0];
589 gyy.y=skeleton.drawmodel.Triangles[whichtri].gy[1];
590 gyy.z=skeleton.drawmodel.Triangles[whichtri].gy[2];
591 coordsx=skeleton.drawmodel.Triangles[whichtri].gx[0]*bary.x+skeleton.drawmodel.Triangles[whichtri].gx[1]*bary.y+skeleton.drawmodel.Triangles[whichtri].gx[2]*bary.z;
592 coordsy=skeleton.drawmodel.Triangles[whichtri].gy[0]*bary.x+skeleton.drawmodel.Triangles[whichtri].gy[1]*bary.y+skeleton.drawmodel.Triangles[whichtri].gy[2]*bary.z;
594 //coordsx=skeleton.drawmodel.Triangles[whichtri].gx[1];
595 //coordsy=skeleton.drawmodel.Triangles[whichtri].gy[1];
597 if(bleeding<=0&&spurt){
599 for(int i=0;i<3;i++){
603 bloodvel=DoRotation(bloodvel,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
606 bloodvel-=DoRotation(skeleton.forward*10*scale,((float)(Random()%100))/4,((float)(Random()%100))/4,0);
608 if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
609 if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
611 Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
612 Sprite::MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position*scale+coords,bloodvel, 1,1,1, .3, 1);
615 Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
616 Sprite::MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .3, 1);
620 int offsetx=0,offsety=0;
623 offsetx=abs(Random()%120);
625 if(which==220||which==215){
627 offsetx=abs(Random()%80);
630 offsetx=(1+coordsy)*512-291;
631 offsety=coordsx*512-437;
638 if(creature==rabbittype)
641 if(bloodText[i*512*3+j*3+0]<=which+4&&bloodText[i*512*3+j*3+0]>=which-4){
642 if(i<startx)startx=i;
643 if(j<starty)starty=j;
649 if(creature==wolftype)
652 if(wolfbloodText[i*512*3+j*3+0]<=which+4&&wolfbloodText[i*512*3+j*3+0]>=which-4){
653 if(i<startx)startx=i;
654 if(j<starty)starty=j;
665 if(startx<0)startx=0;
666 if(starty<0)starty=0;
667 if(endx>512-1)endx=512-1;
668 if(endy>512-1)endy=512-1;
669 if(endx<startx)endx=startx;
670 if(endy<starty)endy=starty;
672 startx/=realtexdetail;
673 starty/=realtexdetail;
677 int texdetailint=realtexdetail;
679 if(creature==rabbittype)
680 for(i=startx;i<endx;i++){
681 for(j=starty;j<endy;j++){
682 if(bloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]<=which+4&&bloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]>=which-4){
683 color=Random()%85+170;
684 where=i*skeleton.skinsize*3+j*3;
685 if(skeleton.skinText[where+0]>color/2)skeleton.skinText[where+0]=color/2;
686 skeleton.skinText[where+1]=0;
687 skeleton.skinText[where+2]=0;
689 else if(bloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]<=160+4&&bloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]>=160-4){
690 color=Random()%85+170;
691 where=i*skeleton.skinsize*3+j*3;
692 if(skeleton.skinText[where+0]>color/2)skeleton.skinText[where+0]=color/2;
693 skeleton.skinText[where+1]=0;
694 skeleton.skinText[where+2]=0;
698 if(creature==wolftype)
699 for(i=startx;i<endx;i++){
700 for(j=starty;j<endy;j++){
701 if(wolfbloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]<=which+4&&wolfbloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]>=which-4){
702 color=Random()%85+170;
703 where=i*skeleton.skinsize*3+j*3;
704 if(skeleton.skinText[where+0]>color/2)skeleton.skinText[where+0]=color/2;
705 skeleton.skinText[where+1]=0;
706 skeleton.skinText[where+2]=0;
708 else if(wolfbloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]<=160+4&&wolfbloodText[(i*texdetailint-offsetx)*512*3+(j*texdetailint-offsety)*3+0]>=160-4){
709 color=Random()%85+170;
710 where=i*skeleton.skinsize*3+j*3;
711 if(skeleton.skinText[where+0]>color/2)skeleton.skinText[where+0]=color/2;
712 skeleton.skinText[where+1]=0;
713 skeleton.skinText[where+2]=0;
717 glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
718 if(detail!=2||osx)DoMipmaps(5,0,0,skeleton.skinsize,skeleton.skinsize);
719 else DoMipmaps(0,startx/realtexdetail,endx/realtexdetail,starty/realtexdetail,endy/realtexdetail);
721 bleedy=(1+coordsy)*512;
723 bleedy/=realtexdetail;
724 bleedx/=realtexdetail;
725 if(bleedx<0)bleedx=0;
726 if(bleedy<0)bleedy=0;
727 if(bleedx>skeleton.skinsize-1)bleedx=skeleton.skinsize-1;
728 if(bleedy>skeleton.skinsize-1)bleedy=skeleton.skinsize-1;
729 direction=abs(Random()%2)*2-1;
731 if(whichtri==-1)return 0;
733 bleeding=howmuch+(float)abs(Random()%100)/200-.25;
734 deathbleeding+=bleeding;
735 bloodloss+=bleeding*3;
737 if(tutoriallevel!=1&&aitype!=playercontrolled&&bloodloss>damagetolerance*2/3&&bloodloss<damagetolerance&&creature==rabbittype){
738 if(abs(Random()%2)==0){aitype=gethelptype;
741 else aitype=attacktypecutoff;
744 if(bleeding>2)bleeding=2;
749 void Person::DoMipmaps(int howmanylevels,float startx, float endx, float starty, float endy){
752 static int bytesPerPixel=3;
753 static int newsize,totalsize,rowsize,bigstep,smallstep,sum;
754 static int newstartx,newstarty,newendx,newendy;
755 static int newnewstartx,newnewstarty,newnewendx,newnewendy;
757 static float sizemult;
759 for(i=0;i<skeleton.skinsize*skeleton.skinsize*bytesPerPixel;i++){
760 texture[i]=skeleton.skinText[i];
763 if((!osx||howmanylevels)){
765 if(startx<0)startx=0;
766 if(starty<0)starty=0;
767 if(endx>skeleton.skinsize-1)endx=skeleton.skinsize-1;
768 if(endy>skeleton.skinsize-1)endy=skeleton.skinsize-1;
769 if((endx>startx&&endy>starty)||howmanylevels){
776 for(i=startx;i<endx;i++){
777 for(j=starty;j<endy;j++){
778 texturearray[(i-newstartx)*(newendy-newstarty)*3+(j-newstarty)*3+0]=skeleton.skinText[i*skeleton.skinsize*3+j*3+0];
779 texturearray[(i-newstartx)*(newendy-newstarty)*3+(j-newstarty)*3+1]=skeleton.skinText[i*skeleton.skinsize*3+j*3+1];
780 texturearray[(i-newstartx)*(newendy-newstarty)*3+(j-newstarty)*3+2]=skeleton.skinText[i*skeleton.skinsize*3+j*3+2];
784 glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
787 if(!osx)glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,GL_TRUE);
788 glTexSubImage2D(GL_TEXTURE_2D,0,starty,startx,endy-starty,endx-startx,GL_RGB,GL_UNSIGNED_BYTE,texturearray);
789 if(!osx)glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,GL_FALSE);
792 newsize=skeleton.skinsize;
795 gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGB, skeleton.skinsize, skeleton.skinsize, GL_RGB, GL_UNSIGNED_BYTE, &skeleton.skinText[0] );
797 /*for(j=1;j<=howmanylevels;j++){
798 if(j==1)texpointer=&skeleton.skinText[0];
799 else texpointer=&texture[0];
801 totalsize=int( newsize*newsize*bytesPerPixel);
802 rowsize=int( newsize*bytesPerPixel );
803 bigstep=bytesPerPixel*newsize*2;
804 smallstep=bytesPerPixel*2;
810 glTexSubImage2D(GL_TEXTURE_2D,j,0,0,newsize/2,newsize/2,GL_RGB,GL_UNSIGNED_BYTE,texture);
817 void Person::Reverse(){
818 if(victim->aitype==playercontrolled||hostiletime>1)
819 if(victim->targetanimation!=jumpupanim&&victim->targetanimation!=jumpdownanim&&((tutoriallevel!=1||cananger)&&hostile)){
820 if(normaldotproduct(victim->facing,victim->coords-coords)>0&&!(victim->id==0&&difficulty<2)&&(creature!=wolftype||victim->creature==wolftype))return;
821 if(victim->aitype!=playercontrolled&&staggerdelay>0)return;
822 if(targetanimation==sweepanim){
823 targetanimation=sweepreversedanim;
824 currentanimation=sweepreversedanim;
825 victim->currentanimation=sweepreversalanim;
826 victim->targetanimation=sweepreversalanim;
828 if(targetanimation==spinkickanim){
829 targetanimation=spinkickreversedanim;
830 currentanimation=spinkickreversedanim;
831 victim->currentanimation=spinkickreversalanim;
832 victim->targetanimation=spinkickreversalanim;
834 if(targetanimation==upunchanim||targetanimation==rabbittacklinganim){
835 if(targetanimation==rabbittacklinganim){
838 victim->currentframe=6;
839 victim->targetframe=7;
841 targetanimation=upunchreversedanim;
842 currentanimation=upunchreversedanim;
843 victim->currentanimation=upunchreversalanim;
844 victim->targetanimation=upunchreversalanim;
846 if(targetanimation==staffhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
847 if(victim->weaponactive!=-1){
848 victim->throwtogglekeydown=1;
849 weapons.owner[victim->weaponids[0]]=-1;
850 weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
851 if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
852 weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
853 weapons.missed[victim->weaponids[0]]=1;
854 weapons.freetime[victim->weaponids[0]]=0;
855 weapons.firstfree[victim->weaponids[0]]=1;
856 weapons.physics[victim->weaponids[0]]=1;
857 victim->num_weapons--;
858 if(victim->num_weapons){
859 victim->weaponids[0]=victim->weaponids[victim->num_weapons];
860 if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
863 victim->weaponactive=-1;
864 for(int j=0;j<numplayers;j++){
865 player[j].wentforweapon=0;
869 targetanimation=staffhitreversedanim;
870 currentanimation=staffhitreversedanim;
871 victim->currentanimation=staffhitreversalanim;
872 victim->targetanimation=staffhitreversalanim;
874 if(targetanimation==staffspinhitanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%2==0)){
875 if(victim->weaponactive!=-1){
876 victim->throwtogglekeydown=1;
877 weapons.owner[victim->weaponids[0]]=-1;
878 weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
879 if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
880 weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
881 weapons.missed[victim->weaponids[0]]=1;
882 weapons.freetime[victim->weaponids[0]]=0;
883 weapons.firstfree[victim->weaponids[0]]=1;
884 weapons.physics[victim->weaponids[0]]=1;
885 victim->num_weapons--;
886 if(victim->num_weapons){
887 victim->weaponids[0]=victim->weaponids[victim->num_weapons];
888 if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
891 victim->weaponactive=-1;
892 for(int j=0;j<numplayers;j++){
893 player[j].wentforweapon=0;
896 targetanimation=staffspinhitreversedanim;
897 currentanimation=staffspinhitreversedanim;
898 victim->currentanimation=staffspinhitreversalanim;
899 victim->targetanimation=staffspinhitreversalanim;
901 if(targetanimation==swordslashanim&&findDistancefast(&victim->coords,&coords)<2&&((victim->id==0&&victim->crouchkeydown)||Random()%4==0)){
902 if(victim->weaponactive!=-1){
903 victim->throwtogglekeydown=1;
904 weapons.owner[victim->weaponids[0]]=-1;
905 weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
906 if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
907 weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
908 weapons.missed[victim->weaponids[0]]=1;
909 weapons.freetime[victim->weaponids[0]]=0;
910 weapons.firstfree[victim->weaponids[0]]=1;
911 weapons.physics[victim->weaponids[0]]=1;
912 victim->num_weapons--;
913 if(victim->num_weapons){
914 victim->weaponids[0]=victim->weaponids[victim->num_weapons];
915 if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
918 victim->weaponactive=-1;
919 for(int j=0;j<numplayers;j++){
920 player[j].wentforweapon=0;
923 targetanimation=swordslashreversedanim;
924 currentanimation=swordslashreversedanim;
925 victim->currentanimation=swordslashreversalanim;
926 victim->targetanimation=swordslashreversalanim;
928 if(targetanimation==knifeslashstartanim&&findDistancefast(&victim->coords,&coords)<2&&(victim->id==0||Random()%4==0)){
929 if(victim->weaponactive!=-1){
930 victim->throwtogglekeydown=1;
931 weapons.owner[victim->weaponids[0]]=-1;
932 weapons.velocity[victim->weaponids[0]]=victim->velocity*.2;
933 if(weapons.velocity[victim->weaponids[0]].x==0)weapons.velocity[victim->weaponids[0]].x=.1;
934 weapons.tipvelocity[victim->weaponids[0]]=weapons.velocity[victim->weaponids[0]];
935 weapons.missed[victim->weaponids[0]]=1;
936 weapons.freetime[victim->weaponids[0]]=0;
937 weapons.firstfree[victim->weaponids[0]]=1;
938 weapons.physics[victim->weaponids[0]]=1;
939 victim->num_weapons--;
940 if(victim->num_weapons){
941 victim->weaponids[0]=victim->weaponids[victim->num_weapons];
942 if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
945 victim->weaponactive=-1;
946 for(int j=0;j<numplayers;j++){
947 player[j].wentforweapon=0;
950 targetanimation=knifeslashreversedanim;
951 currentanimation=knifeslashreversedanim;
952 victim->currentanimation=knifeslashreversalanim;
953 victim->targetanimation=knifeslashreversalanim;
955 if(targetanimation!=knifeslashstartanim&&targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim&&targetanimation!=winduppunchanim&&targetanimation!=wolfslapanim&&targetanimation!=swordslashanim&&targetanimation!=swordslashanim){
956 victim->targettilt2=targettilt2;
957 victim->currentframe=currentframe;
958 victim->targetframe=targetframe;
959 victim->target=target;
961 victim->oldcoords=victim->coords;
962 victim->coords=coords;
963 victim->targetrotation=targetrotation;
964 victim->rotation=targetrotation;
967 if(targetanimation==winduppunchanim){
968 targetanimation=winduppunchblockedanim;
969 victim->targetanimation=blockhighleftanim;
970 victim->targetframe=1;
973 victim->targetrotation=targetrotation+180;
975 if(targetanimation==wolfslapanim){
976 targetanimation=winduppunchblockedanim;
977 victim->targetanimation=blockhighleftanim;
978 victim->targetframe=1;
981 victim->targetrotation=targetrotation+180;
983 if((targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim)&&victim->weaponactive!=-1){
984 targetanimation=swordslashparriedanim;
986 victim->parriedrecently=0;
987 victim->targetanimation=swordslashparryanim;
988 victim->targetframe=1;
991 victim->targetrotation=targetrotation+180;
993 if(abs(Random()%20)==0||weapons.type[victim->weaponids[victim->weaponactive]]==knife){
994 if(victim->weaponactive!=-1){
995 if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
996 if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
997 if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
998 emit_sound_at(swordstaffsound, victim->coords);
1001 emit_sound_at(metalhitsound, victim->coords);
1005 victim->Puff(righthand);
1007 victim->targetframe=0;
1008 victim->targetanimation=staggerbackhighanim;
1009 victim->targetrotation=targetrotation+180;
1011 weapons.owner[victim->weaponids[0]]=-1;
1012 aim=DoRotation(facing,0,90,0)*21;
1014 weapons.velocity[victim->weaponids[0]]=aim*-.2;
1015 weapons.tipvelocity[victim->weaponids[0]]=aim;
1016 weapons.missed[victim->weaponids[0]]=1;
1017 weapons.hitsomething[victim->weaponids[0]]=0;
1018 weapons.freetime[victim->weaponids[0]]=0;
1019 weapons.firstfree[victim->weaponids[0]]=1;
1020 weapons.physics[victim->weaponids[0]]=1;
1021 victim->num_weapons--;
1022 if(victim->num_weapons){
1023 victim->weaponids[0]=victim->weaponids[num_weapons];
1024 if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
1026 victim->weaponactive=-1;
1027 for(int i=0;i<numplayers;i++){
1028 player[i].wentforweapon=0;
1035 /*PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
1036 OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
1037 OPENAL_SetVolume(channels[metalhitsound], 512);
1038 OPENAL_SetPaused(channels[metalhitsound], false);*/
1041 if(abs(Random()%20)==0){
1042 if(weaponactive!=-1){
1043 if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
1044 if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
1045 if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
1047 emit_sound_at(swordstaffsound, coords);
1050 emit_sound_at(metalhitsound, coords);
1058 targetanimation=staggerbackhighanim;
1059 targetrotation=targetrotation+180;
1061 weapons.owner[weaponids[0]]=-1;
1062 aim=DoRotation(facing,0,90,0)*21;
1064 weapons.velocity[weaponids[0]]=aim*-.2;
1065 weapons.tipvelocity[weaponids[0]]=aim;
1066 weapons.hitsomething[weaponids[0]]=0;
1067 weapons.missed[weaponids[0]]=1;
1068 weapons.freetime[weaponids[0]]=0;
1069 weapons.firstfree[weaponids[0]]=1;
1070 weapons.physics[weaponids[0]]=1;
1073 weaponids[0]=weaponids[num_weapons];
1074 if(weaponstuck==num_weapons)weaponstuck=0;
1077 for(int i=0;i<numplayers;i++){
1078 player[i].wentforweapon=0;
1082 /*PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
1083 OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
1084 OPENAL_SetVolume(channels[metalhitsound], 512);
1085 OPENAL_SetPaused(channels[metalhitsound], false);*/
1089 if(targetanimation==knifeslashstartanim||targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim){
1090 if((targetanimation!=staffhitanim&&targetanimation!=staffspinhitanim)||findDistancefast(&coords,&victim->coords)>.2){
1091 //victim->targetanimation=sweepanim;
1092 victim->targetanimation=dodgebackanim;
1093 victim->targetframe=0;
1095 //victim->velocity=0;
1098 rotatetarget=coords-victim->coords;
1099 Normalise(&rotatetarget);
1100 victim->targetrotation=-asin(0-rotatetarget.x);
1101 victim->targetrotation*=360/6.28;
1102 if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
1104 victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
1106 victim->lastattack3=victim->lastattack2;
1107 victim->lastattack2=victim->lastattack;
1108 victim->lastattack=victim->targetanimation;
1112 victim->targetanimation=sweepanim;
1113 victim->targetframe=0;
1117 rotatetarget=coords-victim->coords;
1118 Normalise(&rotatetarget);
1119 victim->targetrotation=-asin(0-rotatetarget.x);
1120 victim->targetrotation*=360/6.28;
1121 if(rotatetarget.z<0)victim->targetrotation=180-victim->targetrotation;
1123 victim->targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70;
1125 victim->lastattack3=victim->lastattack2;
1126 victim->lastattack2=victim->lastattack;
1127 victim->lastattack=victim->targetanimation;
1134 if(aitype!=playercontrolled)feint=0;
1135 if(aitype!=playercontrolled&&Random()%3==0&&escapednum<2&&difficulty==2)feint=1;
1136 if(aitype!=playercontrolled&&Random()%5==0&&escapednum<2&&difficulty==1)feint=1;
1137 if(aitype!=playercontrolled&&Random()%10==0&&escapednum<2&&difficulty==0)feint=1;
1139 if(victim->id==0&&animation[victim->targetanimation].attack==reversal)numreversals++;
1143 void Person::DoDamage(float howmuch){
1144 if(tutoriallevel!=1)damage+=howmuch/power;
1145 if(id!=0)damagedealt+=howmuch/power;
1146 if(id==0)damagetaken+=howmuch/power;
1148 if(id==0&&(bonus==solidhit||bonus==twoxcombo||bonus==threexcombo||bonus==fourxcombo||bonus==megacombo))bonus=0;
1149 if(tutoriallevel!=1)permanentdamage+=howmuch/2/power;
1150 if(tutoriallevel!=1)superpermanentdamage+=howmuch/4/power;
1151 if(permanentdamage>damagetolerance/2&&permanentdamage-howmuch<damagetolerance/2&&Random()%2)DoBlood(1,255);
1152 if((permanentdamage>damagetolerance*.8&&Random()%2&&!deathbleeding)||spurt)DoBlood(1,255);
1154 if(id==0)camerashake+=howmuch/100;
1155 if(id==0&&((howmuch>50&&damage>damagetolerance/2)))blackout=damage/damagetolerance;
1156 if(blackout>1)blackout=1;
1158 if(aitype==passivetype&&damage<damagetolerance&&((tutoriallevel!=1||cananger)&&hostile))aitype=attacktypecutoff;
1159 if(tutoriallevel!=1&&aitype!=playercontrolled&&damage<damagetolerance&&damage>damagetolerance*2/3&&creature==rabbittype){
1160 if(abs(Random()%2)==0){aitype=gethelptype;
1163 else aitype=attacktypecutoff;
1167 if(howmuch>damagetolerance*50&&skeleton.free!=2){
1170 for(int i=0;i<skeleton.num_joints; i++){
1171 if(!skeleton.free)flatvelocity2=velocity;
1172 if(skeleton.free)flatvelocity2=skeleton.joints[i].velocity;
1173 if(!skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(skeleton.joints[i].position,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords;
1174 if(skeleton.free)flatfacing2=skeleton.joints[i].position*scale+coords;
1175 flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
1176 flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
1177 flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
1178 Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, 3, 1);
1179 Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2, 1,1,1, .4, 1);
1180 Sprite::MakeSprite(cloudsprite, flatfacing2,flatvelocity2*0, .6,0,0, 1, .5);
1183 emit_sound_at(splattersound, coords);
1192 if(!dead&&creature==wolftype){
1193 award_bonus(0, Wolfbonus);
1199 if(tutoriallevel!=1||id==0)
1200 if(speechdelay<=0&&!dead&&aitype!=playercontrolled){
1203 if(creature==wolftype){
1204 int i=abs(Random()%2);
1205 if(i==0)whichsound=snarlsound;
1206 if(i==1)whichsound=snarl2sound;
1207 envsound[numenvsounds]=coords;
1208 envsoundvol[numenvsounds]=16;
1209 envsoundlife[numenvsounds]=.4;
1212 if(creature==rabbittype){
1213 int i=abs(Random()%2);
1214 if(i==0)whichsound=rabbitpainsound;
1215 if(i==1&&damage>damagetolerance)whichsound=rabbitpain1sound;
1216 envsound[numenvsounds]=coords;
1217 envsoundvol[numenvsounds]=16;
1218 envsoundlife[numenvsounds]=.4;
1220 //if(i==2)whichsound=rabbitpain2sound;
1224 emit_sound_at(whichsound, coords);
1229 //if(permanentdamage>=damagetolerance&&howmuch<50)permanentdamage=damagetolerance-1;
1230 //if(damage>=damagetolerance&&howmuch<30&&!dead)damage=damagetolerance-1;
1233 void Person::DoHead(){
1234 static XYZ rotatearound;
1236 static float lookspeed=500;
1238 if(!freeze&&!winfreeze){
1241 targetheadrotation=(float)((int)((0-rotation-targetheadrotation+180)*100)%36000)/100;
1242 targetheadrotation2=(float)((int)(targetheadrotation2*100)%36000)/100;
1244 while(targetheadrotation>180)targetheadrotation-=360;
1245 while(targetheadrotation<-180)targetheadrotation+=360;
1247 if(targetheadrotation>160)targetheadrotation2=targetheadrotation2*-1;
1248 if(targetheadrotation<-160)targetheadrotation2=targetheadrotation2*-1;
1249 if(targetheadrotation>160)targetheadrotation=targetheadrotation-180;
1250 if(targetheadrotation<-160)targetheadrotation=targetheadrotation+180;
1252 if(targetheadrotation2>120)targetheadrotation2=120;
1253 if(targetheadrotation2<-120)targetheadrotation2=-120;
1254 if(targetheadrotation>120)targetheadrotation=120;
1255 if(targetheadrotation<-120)targetheadrotation=-120;
1257 if(!isIdle())targetheadrotation2=0;
1259 if(targetheadrotation>80)targetheadrotation=80;
1260 if(targetheadrotation<-80)targetheadrotation=-80;
1261 if(targetheadrotation2>50)targetheadrotation2=50;
1262 if(targetheadrotation2<-50)targetheadrotation2=-50;
1265 if(abs(headrotation-targetheadrotation)<multiplier*lookspeed)headrotation=targetheadrotation;
1266 else if(headrotation>targetheadrotation){
1267 headrotation-=multiplier*lookspeed;
1269 else if(headrotation<targetheadrotation){
1270 headrotation+=multiplier*lookspeed;
1273 if(abs(headrotation2-targetheadrotation2)<multiplier*lookspeed/2)headrotation2=targetheadrotation2;
1274 else if(headrotation2>targetheadrotation2){
1275 headrotation2-=multiplier*lookspeed/2;
1277 else if(headrotation2<targetheadrotation2){
1278 headrotation2+=multiplier*lookspeed/2;
1281 rotatearound=skeleton.joints[skeleton.jointlabels[neck]].position;
1282 skeleton.joints[skeleton.jointlabels[head]].position=rotatearound+DoRotation(skeleton.joints[skeleton.jointlabels[head]].position-rotatearound,headrotation2,0,0);
1286 if(targetanimation!=bounceidleanim&&targetanimation!=fightidleanim&&targetanimation!=wolfidle&&targetanimation!=knifefightidleanim&&targetanimation!=drawrightanim&&targetanimation!=drawleftanim&&targetanimation!=walkanim){
1287 facing=DoRotation(facing,headrotation2*.4,0,0);
1288 facing=DoRotation(facing,0,headrotation*.4,0);
1291 if(targetanimation==bounceidleanim||targetanimation==fightidleanim||targetanimation==wolfidle||targetanimation==knifefightidleanim||targetanimation==drawrightanim||targetanimation==drawleftanim){
1292 facing=DoRotation(facing,headrotation2*.8,0,0);
1293 facing=DoRotation(facing,0,headrotation*.8,0);
1296 if(targetanimation==walkanim){
1297 facing=DoRotation(facing,headrotation2*.6,0,0);
1298 facing=DoRotation(facing,0,headrotation*.6,0);
1301 skeleton.specialforward[0]=facing;
1302 //skeleton.specialforward[0]=DoRotation(facing,0,rotation,0);
1304 for(i=0;i<skeleton.num_muscles;i++){
1305 if(skeleton.muscles[i].visible&&(skeleton.muscles[i].parent1->label==head||skeleton.muscles[i].parent2->label==head))
1307 skeleton.FindRotationMuscle(i,targetanimation);
1313 void Person::RagDoll(bool checkcollision){
1318 if(id==0)numfalls++;
1319 if(id==0&&isFlip())numflipfail++;
1325 facing=DoRotation(facing,0,rotation,0);
1327 skeleton.freetime=0;
1329 skeleton.longdead=0;
1335 skeleton.freefall=1;
1337 if(!isnormal(velocity.x))velocity.x=0;
1338 if(!isnormal(velocity.y))velocity.y=0;
1339 if(!isnormal(velocity.z))velocity.z=0;
1340 if(!isnormal(rotation))rotation=0;
1341 if(!isnormal(coords.x))coords=0;
1342 if(!isnormal(tilt))tilt=0;
1343 if(!isnormal(tilt2))tilt2=0;
1345 for(i=0;i<skeleton.num_joints;i++){
1346 skeleton.joints[i].delay=0;
1347 skeleton.joints[i].locked=0;
1348 skeleton.joints[i].position=DoRotation(DoRotation(DoRotation(skeleton.joints[i].position,0,0,tilt),tilt2,0,0),0,rotation,0);
1349 if(!isnormal(skeleton.joints[i].position.x))skeleton.joints[i].position=DoRotation(skeleton.joints[i].position,0,rotation,0);
1350 if(!isnormal(skeleton.joints[i].position.x))skeleton.joints[i].position=skeleton.joints[i].position;
1351 if(!isnormal(skeleton.joints[i].position.x))skeleton.joints[i].position=coords;
1352 skeleton.joints[i].position.y+=.1;
1353 skeleton.joints[i].oldposition=skeleton.joints[i].position;
1354 skeleton.joints[i].realoldposition=skeleton.joints[i].position*scale+coords;
1357 for(i=0;i<skeleton.num_joints;i++){
1358 skeleton.joints[i].velocity=0;
1359 skeleton.joints[i].velchange=0;
1361 skeleton.DoConstraints(&coords,&scale);
1362 if(animation[currentanimation].height==lowheight||animation[targetanimation].height==lowheight)
1364 skeleton.DoConstraints(&coords,&scale);
1365 skeleton.DoConstraints(&coords,&scale);
1366 skeleton.DoConstraints(&coords,&scale);
1367 skeleton.DoConstraints(&coords,&scale);
1370 speed=animation[targetanimation].speed[targetframe]*2;
1371 if(animation[currentanimation].speed[currentframe]>animation[targetanimation].speed[targetframe]){
1372 speed=animation[currentanimation].speed[currentframe]*2;
1374 if(transspeed)speed=transspeed*2;
1378 for(i=0;i<skeleton.num_joints;i++){
1379 if((animation[currentanimation].attack!=reversed||currentanimation==swordslashreversedanim)&¤tanimation!=rabbitkickanim&&!isLanding()&&!wasLanding()&&animation[currentanimation].height==animation[targetanimation].height)skeleton.joints[i].velocity=velocity/scale+facing*5+DoRotation(DoRotation(DoRotation((animation[targetanimation].position[i][targetframe]-animation[currentanimation].position[i][currentframe])*speed,0,0,tilt),tilt2,0,0),0,rotation,0);
1380 else skeleton.joints[i].velocity=velocity/scale+facing*5;
1381 change.x=(float)(Random()%100)/100;
1382 change.y=(float)(Random()%100)/100;
1383 change.z=(float)(Random()%100)/100;
1384 skeleton.joints[i].velocity+=change;
1385 skeleton.joints[abs(Random()%skeleton.num_joints)].velocity-=change;
1387 change.x=(float)(Random()%100)/100;
1388 change.y=(float)(Random()%100)/100;
1389 change.z=(float)(Random()%100)/100;
1390 skeleton.joints[i].velchange+=change;
1391 skeleton.joints[abs(Random()%skeleton.num_joints)].velchange-=change;
1401 for(j=0;j<skeleton.num_joints;j++){
1402 average+=skeleton.joints[j].position;
1406 coords+=average*scale;
1407 for(j=0;j<skeleton.num_joints;j++){
1408 skeleton.joints[j].position-=average;
1411 whichpatchx=coords.x/(terrain.size/subdivision*terrain.scale*terraindetail);
1412 whichpatchz=coords.z/(terrain.size/subdivision*terrain.scale*terraindetail);
1413 if(terrain.patchobjectnum[whichpatchx][whichpatchz])
1414 for(l=0;l<terrain.patchobjectnum[whichpatchx][whichpatchz];l++){
1415 i=terrain.patchobjects[whichpatchx][whichpatchz][l];
1418 if(SphereCheck(&lowpoint, 3, &colpoint, &objects.position[i], &objects.rotation[i], &objects.model[i])!=-1){
1419 coords.x=lowpoint.x;
1420 coords.z=lowpoint.z;
1429 for(i=0;i<skeleton.num_joints;i++){
1430 velocity+=skeleton.joints[i].velocity*scale;
1432 velocity/=skeleton.num_joints;
1435 if(weaponactive!=-1&&targetanimation!=rabbitkickanim&&num_weapons>0){
1436 weapons.owner[weaponids[0]]=-1;
1437 weapons.hitsomething[weaponids[0]]=0;
1438 weapons.velocity[weaponids[0]]=skeleton.joints[skeleton.jointlabels[righthand]].velocity*scale*-.3;
1439 weapons.velocity[weaponids[0]].x+=.01;
1440 weapons.tipvelocity[weaponids[0]]=skeleton.joints[skeleton.jointlabels[righthand]].velocity*scale;
1441 weapons.missed[weaponids[0]]=1;
1442 weapons.freetime[weaponids[0]]=0;
1443 weapons.firstfree[weaponids[0]]=1;
1444 weapons.physics[weaponids[0]]=1;
1447 weaponids[0]=weaponids[num_weapons];
1448 if(weaponstuck==num_weapons)weaponstuck=0;
1451 for(i=0;i<numplayers;i++){
1452 player[i].wentforweapon=0;
1457 targetanimation=bounceidleanim;
1458 currentanimation=bounceidleanim;
1466 void Person::FootLand(int which, float opacity){
1467 static XYZ terrainlight;
1468 static XYZ footvel,footpoint;
1469 if(opacity>=1||skiddelay<=0)
1473 if(which==0)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
1474 if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
1475 //footpoint.y=coords.y;
1476 if(findDistancefast(&footpoint,&viewer))Sprite::MakeSprite(cloudsprite, footpoint,footvel, 1,1,1, .5, .2*opacity);
1478 else if(environment==snowyenvironment&&onterrain&&terrain.getOpacity(coords.x,coords.z)<.2){
1480 if(footvel.y<.8)footvel.y=.8;
1481 if(which==0)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
1482 if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
1483 footpoint.y=terrain.getHeight(footpoint.x,footpoint.z);
1484 terrainlight=terrain.getLighting(footpoint.x,footpoint.z);
1485 if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)Sprite::MakeSprite(cloudsprite, footpoint,footvel*.6, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7*opacity);
1486 if(opacity>=1||detail==2)if(detail==2)if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)terrain.MakeDecal(footprintdecal,footpoint,.2,1*opacity,rotation);
1488 else if(environment==grassyenvironment&&onterrain&&terrain.getOpacity(coords.x,coords.z)<.2){
1490 if(footvel.y<.8)footvel.y=.8;
1491 if(which==0)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
1492 if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
1493 footpoint.y=terrain.getHeight(footpoint.x,footpoint.z);
1494 terrainlight=terrain.getLighting(footpoint.x,footpoint.z);
1495 if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)Sprite::MakeSprite(cloudsprite, footpoint,footvel*.6, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5*opacity);
1497 else if(environment==desertenvironment&&onterrain&&terrain.getOpacity(coords.x,coords.z)<.2){
1499 if(footvel.y<.8)footvel.y=.8;
1500 if(which==0)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
1501 if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
1502 footpoint.y=terrain.getHeight(footpoint.x,footpoint.z);
1503 terrainlight=terrain.getLighting(footpoint.x,footpoint.z);
1504 if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)Sprite::MakeSprite(cloudsprite, footpoint,footvel*.6, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7*opacity);
1505 if(opacity>=1||detail==2)if(detail==2)if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)terrain.MakeDecal(footprintdecal,footpoint,.2,.25*opacity,rotation);
1507 else if(isLanding()||targetanimation==jumpupanim||isLandhard())
1510 if(footvel.y<.8)footvel.y=.8;
1511 if(which==0)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
1512 if(which==1)footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
1513 //footpoint.y=coords.y;
1514 if(findDistancefast(&footpoint,&viewer)<viewdistance*viewdistance/4)Sprite::MakeSprite(cloudsprite, footpoint,footvel*.6, 1,1,1, .5, .2*opacity);
1518 void Person::Puff(int whichlabel){
1519 static XYZ footvel,footpoint;
1522 footpoint=DoRotation(skeleton.joints[skeleton.jointlabels[whichlabel]].position,0,rotation,0)*scale+coords;
1523 Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .9, .3);
1527 void Person::DoAnimations(){
1530 static float oldtarget;
1532 if(isIdle()&¤tanimation!=getIdle())normalsupdatedelay=0;
1534 if(targetanimation==tempanim||currentanimation==tempanim){
1535 animation[tempanim]=tempanimation;
1537 if(targetanimation==jumpupanim||targetanimation==jumpdownanim||isFlip()){
1548 OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel);
1549 OPENAL_SetVolume(channels[whooshsound], 64*findLength(&velocity)/5);
1551 if(((velocity.y<-15)||(crouchkeydown&&velocity.y<-8))&&abs(velocity.y)*4>fast_sqrt(velocity.x*velocity.x*velocity.z*velocity.z))landhard=1;
1552 if(!crouchkeydown&&velocity.y>=-15)landhard=0;
1554 if((currentanimation==jumpupanim||targetanimation==jumpdownanim)/*&&velocity.y<40*/&&!isFlip()&&(!isLanding()&&!isLandhard())&&((crouchkeydown&&!crouchtogglekeydown))){
1559 targfacing=DoRotation(targfacing,0,targetrotation,0);
1561 if(normaldotproduct(targfacing,velocity)>=-.3)targetanimation=flipanim;
1562 else targetanimation=backflipanim;
1563 crouchtogglekeydown=1;
1567 if(id==0)numflipped++;
1570 if(animation[targetanimation].attack!=reversed)feint=0;
1571 if(!crouchkeydown||(isLanding()||isLandhard())||(wasLanding()||wasLandhard())){
1572 crouchtogglekeydown=0;
1573 if(aitype==playercontrolled)feint=0;
1577 if(!crouchtogglekeydown&&animation[targetanimation].attack==reversed&&aitype==playercontrolled&&(escapednum<2||reversaltrain))feint=1;
1578 if(!isFlip())crouchtogglekeydown=1;
1582 if(animation[targetanimation].attack||currentanimation==getupfrombackanim||currentanimation==getupfromfrontanim){
1583 if(detail)normalsupdatedelay=0;
1587 if(targetanimation==rollanim&&targetframe==3&&onfire){
1589 emit_sound_at(fireendsound, coords);
1590 OPENAL_SetPaused(channels[stream_firesound], true);
1594 if(targetanimation==rabbittacklinganim&&targetframe==1){
1595 //if(victim->aitype==attacktypecutoff&&Random()%2==0&&victim->stunned<=0&&animation[victim->targetanimation].attack==neutral&&victim->id!=0)Reverse();
1596 if(victim->aitype==attacktypecutoff&&victim->stunned<=0&&victim->surprised<=0&&victim->id!=0)Reverse();
1597 if(targetanimation==rabbittacklinganim&&targetframe==1&&!victim->isCrouch()&&victim->targetanimation!=backhandspringanim){
1598 if(normaldotproduct(victim->facing,facing)>0)victim->targetanimation=rabbittackledbackanim;
1599 else victim->targetanimation=rabbittackledfrontanim;
1600 victim->targetframe=2;
1602 victim->rotation=rotation;
1603 victim->targetrotation=rotation;
1604 if(victim->aitype==gethelptype)victim->DoDamage(victim->damagetolerance-victim->damage);
1605 //victim->DoDamage(30);
1606 if(creature==wolftype){
1608 emit_sound_at(clawslicesound, victim->coords);
1610 victim->DoBloodBig(1/victim->armorhead,210);
1612 award_bonus(id, TackleBonus,
1613 victim->aitype == gethelptype ? 50 : 0);
1617 if(!drawtogglekeydown&&drawkeydown&&(weaponactive==-1||num_weapons==1)&&(animation[targetanimation].label[targetframe]||(targetanimation!=currentanimation&¤tanimation==rollanim))&&num_weapons>0&&creature!=wolftype){
1618 if(weapons.type[weaponids[0]]==knife){
1619 if(weaponactive==-1)weaponactive=0;
1620 else if(weaponactive==0)weaponactive=-1;
1622 if(weaponactive==-1){
1623 emit_sound_at(knifesheathesound, coords);
1625 if(weaponactive!=-1){
1626 emit_sound_at(knifedrawsound, coords, 128);
1629 drawtogglekeydown=1;
1632 if(tutoriallevel!=1||id==0)
1633 if((animation[targetanimation].label[targetframe]&&(animation[targetanimation].label[targetframe]<5||animation[targetanimation].label[targetframe]==8))/*||(targetanimation==rollanim&&targetframe==animation[rollanim].numframes-1)*/){
1644 if(terrain.getOpacity(coords.x,coords.z)<.2){
1645 if(animation[targetanimation].label[targetframe]==1)whichsound=footstepsound;
1646 else whichsound=footstepsound2;
1647 if(animation[targetanimation].label[targetframe]==1)FootLand(0,1);
1648 if(animation[targetanimation].label[targetframe]==2)FootLand(1,1);
1649 if(animation[targetanimation].label[targetframe]==3&&isRun()){
1655 if(terrain.getOpacity(coords.x,coords.z)>=.2){
1656 if(animation[targetanimation].label[targetframe]==1)whichsound=footstepsound3;
1657 else whichsound=footstepsound4;
1661 if(animation[targetanimation].label[targetframe]==1)whichsound=footstepsound3;
1662 else whichsound=footstepsound4;
1664 if(animation[targetanimation].label[targetframe]==4&&(weaponactive==-1||(targetanimation!=knifeslashstartanim&&targetanimation!=knifethrowanim&&targetanimation!=crouchstabanim&&targetanimation!=swordgroundstabanim&&targetanimation!=knifefollowanim))){
1665 if(animation[targetanimation].attack!=neutral){
1667 if(i==0)whichsound=lowwhooshsound;
1668 if(i==1)whichsound=midwhooshsound;
1669 if(i==2)whichsound=highwhooshsound;
1671 if(animation[targetanimation].attack==neutral)whichsound=movewhooshsound;
1673 else if(animation[targetanimation].label[targetframe]==4)whichsound=knifeswishsound;
1674 if(animation[targetanimation].label[targetframe]==8&&tutoriallevel!=1)whichsound=landsound2;
1676 PlaySoundEx( whichsound, samp[whichsound], NULL, true);
1677 OPENAL_3D_SetAttributes(channels[whichsound], gLoc, vel);
1678 if(whichsound!=knifeswishsound)OPENAL_SetVolume(channels[whichsound], 128);
1679 if(whichsound!=knifeswishsound&&(targetanimation==staffhitanim||targetanimation==staffgroundsmashanim||targetanimation==staffspinhitanim))OPENAL_SetVolume(channels[whichsound], 256);
1680 if(whichsound==knifeswishsound)OPENAL_SetVolume(channels[whichsound], 512);
1681 OPENAL_SetPaused(channels[whichsound], false);
1684 if(whichsound==footstepsound||whichsound==footstepsound2||whichsound==footstepsound3||whichsound==footstepsound4){
1685 envsound[numenvsounds]=coords;
1686 if(targetanimation==wolfrunninganim||targetanimation==rabbitrunninganim)envsoundvol[numenvsounds]=15;
1687 else envsoundvol[numenvsounds]=6;
1688 envsoundlife[numenvsounds]=.4;
1692 if(animation[targetanimation].label[targetframe]==3){
1694 emit_sound_at(whichsound, coords, 128.);
1699 if(tutoriallevel!=1||id==0)
1701 if(targetanimation!=crouchstabanim&&targetanimation!=swordgroundstabanim&&targetanimation!=staffgroundsmashanim)
1702 if((animation[targetanimation].label[targetframe]&&(animation[targetanimation].label[targetframe]<5||animation[targetanimation].label[targetframe]==8))/*||(targetanimation==rollanim&&targetframe==animation[rollanim].numframes-1)*/){
1704 if(animation[targetanimation].label[targetframe]==4&&aitype!=playercontrolled){
1705 if(animation[targetanimation].attack!=neutral){
1707 if(creature==rabbittype){
1708 if(i==0)whichsound=rabbitattacksound;
1709 if(i==1)whichsound=rabbitattack2sound;
1710 if(i==2)whichsound=rabbitattack3sound;
1711 if(i==3)whichsound=rabbitattack4sound;
1713 if(creature==wolftype){
1714 if(i==0)whichsound=barksound;
1715 if(i==1)whichsound=bark2sound;
1716 if(i==2)whichsound=bark3sound;
1717 if(i==3)whichsound=barkgrowlsound;
1721 //if(animation[targetanimation].attack==neutral)whichsound=movewhooshsound;
1723 //else if(animation[targetanimation].label[targetframe]==4)whichsound=knifeswishsound;
1724 //if(animation[targetanimation].label[targetframe]==8)whichsound=landsound2;
1727 emit_sound_at(whichsound, coords);
1733 if((!wasLanding()&&!wasLandhard())&¤tanimation!=getIdle()&&(isLanding()||isLandhard())){
1739 currentoffset=targetoffset;
1740 targetframe=currentframe;
1741 currentanimation=targetanimation;
1744 if(targetanimation==removeknifeanim&&animation[targetanimation].label[currentframe]==5){
1745 for(i=0;i<weapons.numweapons;i++){
1746 if(/*weapons.velocity[i].x==0&&weapons.velocity[i].y==0&&weapons.velocity[i].z==0&&*/weapons.owner[i]==-1)
1747 if(findDistancefastflat(&coords,&weapons.position[i])<4&&weaponactive==-1){
1748 if(findDistancefast(&coords,&weapons.position[i])>=1){
1749 if(weapons.type[i]!=staff){
1750 emit_sound_at(knifedrawsound, coords, 128.);
1754 weapons.owner[i]=id;
1756 weaponids[num_weapons]=weaponids[0];
1765 static bool willwork;
1766 if(targetanimation==crouchremoveknifeanim&&animation[targetanimation].label[currentframe]==5){
1767 for(i=0;i<weapons.numweapons;i++){
1769 if(weapons.owner[i]!=-1)
1770 if(player[weapons.owner[i]].weaponstuck!=-1)
1771 if(player[weapons.owner[i]].weaponids[player[weapons.owner[i]].weaponstuck]==i)
1772 if(player[weapons.owner[i]].num_weapons>1)willwork=0;
1773 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))
1774 if(willwork&&findDistancefastflat(&coords,&weapons.position[i])<3&&weaponactive==-1){
1775 if(findDistancefast(&coords,&weapons.position[i])<1||hasvictim){
1777 if(weapons.owner[i]!=-1)
1778 if(victim->weaponstuck!=-1){
1779 if(victim->weaponids[victim->weaponstuck]==i){
1784 if(weapons.type[i]!=staff){
1785 emit_sound_at(knifedrawsound, coords, 128.);
1789 emit_sound_at(fleshstabremovesound, coords, 128.);
1792 if(weapons.owner[i]!=-1){
1794 victim=&player[weapons.owner[i]];
1795 if(victim->num_weapons==1)victim->num_weapons=0;
1796 else victim->num_weapons=1;
1798 //victim->weaponactive=-1;
1799 victim->skeleton.longdead=0;
1800 victim->skeleton.free=1;
1801 victim->skeleton.broken=0;
1803 for(int j=0;j<victim->skeleton.num_joints;j++){
1804 victim->skeleton.joints[j].velchange=0;
1805 victim->skeleton.joints[j].locked=0;
1811 Normalise(&relative);
1812 XYZ footvel,footpoint;
1814 footpoint=weapons.position[i];
1815 if(victim->weaponstuck!=-1){
1816 if(victim->weaponids[victim->weaponstuck]==i){
1817 if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
1818 weapons.bloody[i]=2;
1819 weapons.blooddrip[i]=5;
1820 victim->weaponstuck=-1;
1823 if(victim->num_weapons>0){
1824 if(victim->weaponstuck!=0&&victim->weaponstuck!=-1)victim->weaponstuck=0;
1825 if(victim->weaponids[0]==i)
1826 victim->weaponids[0]=victim->weaponids[victim->num_weapons];
1829 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*6;
1830 victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity+=relative*6;
1831 victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity+=relative*6;
1832 victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity+=relative*6;
1834 weapons.owner[i]=id;
1836 weaponids[num_weapons]=weaponids[0];
1845 if(currentanimation==drawleftanim&&animation[targetanimation].label[currentframe]==5){
1846 if(weaponactive==-1)weaponactive=0;
1847 else if(weaponactive==0){
1851 buffer=weaponids[0];
1852 weaponids[0]=weaponids[1];
1853 weaponids[1]=buffer;
1856 if(weaponactive==-1){
1857 emit_sound_at(knifesheathesound, coords, 128.);
1859 if(weaponactive!=-1){
1860 emit_sound_at(knifedrawsound, coords, 128.);
1865 if((currentanimation==walljumprightkickanim&&targetanimation==walljumprightkickanim)||(currentanimation==walljumpleftkickanim&&targetanimation==walljumpleftkickanim)){
1866 XYZ rotatetarget=DoRotation(skeleton.forward,0,rotation,0);
1867 Normalise(&rotatetarget);
1868 targetrotation=-asin(0-rotatetarget.x);
1869 targetrotation*=360/6.28;
1870 if(rotatetarget.z<0)targetrotation=180-targetrotation;
1872 if(targetanimation==walljumprightkickanim)targetrotation+=40;
1873 if(targetanimation==walljumpleftkickanim)targetrotation-=40;
1878 if((targetanimation==rabbitrunninganim||targetanimation==wolfrunninganim)&&targetframe==3&&(jumpkeydown||attackkeydown||id!=0))dojumpattack=1;
1880 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;
1882 if((targetanimation==rabbitrunninganim||targetanimation==wolfrunninganim)&&id==0){
1883 targetanimation=rabbittackleanim;
1885 emit_sound_at(jumpsound, coords);
1894 Normalise(&targetloc);
1896 for(i=0;i<numplayers;i++){
1898 if(findDistancefast(&targetloc,&player[i].coords)<closestdist||closestdist==0){
1899 closestdist=findDistancefast(&targetloc,&player[i].coords);
1904 if(closestdist<5&&!player[closestid].dead&&animation[player[closestid].targetanimation].height!=lowheight&&player[closestid].targetanimation!=backhandspringanim){
1906 victim=&player[closestid];
1907 coords=victim->coords;
1908 currentanimation=rabbittacklinganim;
1909 targetanimation=rabbittacklinganim;
1913 if(coords.z!=victim->coords.z||coords.x!=victim->coords.x){
1914 rotatetarget=coords-victim->coords;
1915 Normalise(&rotatetarget);
1916 targetrotation=-asin(0-rotatetarget.x);
1917 targetrotation*=360/6.28;
1918 if(rotatetarget.z<0)targetrotation=180-targetrotation;
1920 if(targetanimation!=rabbitrunninganim){
1921 emit_sound_at(jumpsound, coords, 128.);
1927 float damagemult=1*power;
1928 if(creature==wolftype)damagemult=2.5*power;
1929 if(hasvictim){damagemult/=victim->damagetolerance/200;}
1930 //if(onfire)damagemult=3;
1931 if((animation[targetanimation].attack==normalattack||targetanimation==walljumprightkickanim||targetanimation==walljumpleftkickanim)&&(!feint)&&(victim->skeleton.free!=2||targetanimation==killanim||targetanimation==dropkickanim||targetanimation==crouchstabanim||targetanimation==swordgroundstabanim||targetanimation==staffgroundsmashanim)){
1932 if(targetanimation==spinkickanim&&animation[targetanimation].label[currentframe]==5){
1933 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&3&&animation[victim->targetanimation].height!=lowheight){
1935 if(id==0)camerashake+=.4;
1936 if(Random()%2||creature==wolftype){
1939 if(creature==wolftype)DoBloodBig(0,250);
1941 if(tutoriallevel!=1){
1942 emit_sound_at(heavyimpactsound, victim->coords, 128.);
1944 if(creature==wolftype){
1945 emit_sound_at(clawslicesound, victim->coords, 128.);
1947 victim->DoBloodBig(2/victim->armorhead,175);
1951 relative=victim->coords-coords;
1953 Normalise(&relative);
1954 relative=DoRotation(relative,0,-90,0);
1955 for(i=0;i<victim->skeleton.num_joints;i++){
1956 victim->skeleton.joints[i].velocity+=relative*damagemult*40;
1958 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
1961 victim->DoDamage(damagemult*100/victim->protectionhead);
1967 if(targetanimation==wolfslapanim&&animation[targetanimation].label[currentframe]==5){
1968 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&3&&animation[victim->targetanimation].height!=lowheight){
1970 if(id==0)camerashake+=.4;
1971 if(Random()%2||creature==wolftype){
1973 if(creature==wolftype)DoBloodBig(0,235);
1975 emit_sound_at(whooshhitsound, victim->coords);
1976 if(creature==wolftype){
1977 emit_sound_at(clawslicesound, victim->coords, 128.);
1979 victim->DoBloodBig(2,175);
1983 relative=victim->coords-coords;
1985 Normalise(&relative);
1987 Normalise(&relative);
1988 relative=DoRotation(relative,0,90,0);
1989 for(i=0;i<victim->skeleton.num_joints;i++){
1990 victim->skeleton.joints[i].velocity+=relative*damagemult*20;
1992 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*100;
1995 victim->DoDamage(damagemult*50/victim->protectionhead);
1999 if(targetanimation==walljumprightkickanim&&animation[targetanimation].label[currentframe]==5){
2000 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&animation[victim->targetanimation].height!=lowheight){
2002 if(id==0)camerashake+=.4;
2005 if(tutoriallevel!=1){
2006 emit_sound_at(heavyimpactsound, victim->coords, 160.);
2008 if(creature==wolftype){
2009 emit_sound_at(clawslicesound, victim->coords, 128.);
2011 victim->DoBloodBig(2/victim->armorhead,175);
2017 Normalise(&relative);
2018 relative=DoRotation(relative,0,-90,0);
2019 for(i=0;i<victim->skeleton.num_joints;i++){
2020 victim->skeleton.joints[i].velocity+=relative*damagemult*40;
2022 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
2025 victim->DoDamage(damagemult*150/victim->protectionhead);
2027 if(victim->damage>victim->damagetolerance)
2028 award_bonus(id, style);
2034 if(targetanimation==walljumpleftkickanim&&animation[targetanimation].label[currentframe]==5){
2035 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&animation[victim->targetanimation].height!=lowheight){
2037 if(id==0)camerashake+=.4;
2040 if(tutoriallevel!=1){
2041 emit_sound_at(heavyimpactsound, victim->coords, 160.);
2043 if(creature==wolftype){
2044 emit_sound_at(clawslicesound, victim->coords, 128.);
2046 victim->DoBloodBig(2/victim->armorhead,175);
2052 Normalise(&relative);
2053 relative=DoRotation(relative,0,90,0);
2054 for(i=0;i<victim->skeleton.num_joints;i++){
2055 victim->skeleton.joints[i].velocity+=relative*damagemult*40;
2057 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
2060 victim->DoDamage(damagemult*150/victim->protectionhead);
2062 if(victim->damage>victim->damagetolerance)
2063 award_bonus(id, style);
2069 if(targetanimation==blockhighleftstrikeanim&&animation[targetanimation].label[currentframe]==5){
2070 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&animation[victim->targetanimation].height!=lowheight){
2072 if(id==0)camerashake+=.4;
2077 emit_sound_at(whooshhitsound, victim->coords);
2080 relative=victim->coords-coords;
2082 Normalise(&relative);
2083 for(i=0;i<victim->skeleton.num_joints;i++){
2084 victim->skeleton.joints[i].velocity+=relative*damagemult*30;
2086 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*100;
2089 victim->DoDamage(damagemult*50/victim->protectionhead);
2093 if(targetanimation==killanim&&animation[targetanimation].label[currentframe]==8){
2094 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&victim->dead){
2096 if(id==0)camerashake+=.2;
2097 emit_sound_at(whooshhitsound, victim->coords, 128.);
2099 victim->skeleton.longdead=0;
2100 victim->skeleton.free=1;
2101 victim->skeleton.broken=0;
2102 victim->skeleton.spinny=1;
2104 for(i=0;i<victim->skeleton.num_joints;i++){
2105 victim->skeleton.joints[i].velchange=0;
2106 victim->skeleton.joints[i].delay=0;
2107 victim->skeleton.joints[i].locked=0;
2108 //victim->skeleton.joints[i].velocity=0;
2114 Normalise(&relative);
2115 for(i=0;i<victim->skeleton.num_joints;i++){
2116 victim->skeleton.joints[i].velocity.y=relative.y*10;
2117 victim->skeleton.joints[i].position.y+=relative.y*.3;
2118 victim->skeleton.joints[i].oldposition.y+=relative.y*.3;
2119 victim->skeleton.joints[i].realoldposition.y+=relative.y*.3;
2121 victim->Puff(abdomen);
2122 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity.y=relative.y*400;
2126 if(targetanimation==killanim&&animation[targetanimation].label[currentframe]==5){
2127 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9&&victim->dead){
2129 if(id==0)camerashake+=.4;
2130 if(tutoriallevel!=1){
2131 emit_sound_at(heavyimpactsound, coords, 128.);
2134 relative=victim->coords-coords;
2136 Normalise(&relative);
2137 for(i=0;i<victim->skeleton.num_joints;i++){
2138 victim->skeleton.joints[i].velocity+=relative*damagemult*90;
2140 victim->Puff(abdomen);
2141 if(victim->dead!=2&&victim->permanentdamage>victim->damagetolerance-250&&autoslomo){
2145 victim->DoDamage(damagemult*500/victim->protectionhigh);
2146 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*300;
2150 if(targetanimation==dropkickanim&&animation[targetanimation].label[currentframe]==7){
2151 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*9&&victim->skeleton.free){
2153 if(id==0)camerashake+=.4;
2154 if(tutoriallevel!=1){
2155 emit_sound_at(thudsound, coords);
2158 victim->skeleton.longdead=0;
2159 victim->skeleton.free=1;
2160 victim->skeleton.broken=0;
2161 victim->skeleton.spinny=1;
2163 for(i=0;i<victim->skeleton.num_joints;i++){
2164 victim->skeleton.joints[i].velchange=0;
2165 //victim->skeleton.joints[i].delay=0;
2166 victim->skeleton.joints[i].locked=0;
2169 relative=victim->coords-coords;
2170 Normalise(&relative);
2172 Normalise(&relative);
2173 for(i=0;i<victim->skeleton.num_joints;i++){
2174 victim->skeleton.joints[i].velocity+=relative*damagemult*20;
2179 victim->Puff(abdomen);
2180 victim->DoDamage(damagemult*20/victim->protectionhigh);
2181 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
2183 if(!victim->dead)staggerdelay=1.2;
2189 if((targetanimation==crouchstabanim||targetanimation==swordgroundstabanim)&&animation[targetanimation].label[currentframe]==5){
2190 //if(id==0)camerashake+=.4;
2193 if(!victim->skeleton.free)hasvictim=0;
2196 terrain.MakeDecal(blooddecalfast,(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2),.08,.6,Random()%360);
2197 emit_sound_at(knifesheathesound, coords, 128.);
2200 if(victim&&hasvictim){
2201 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3){
2203 XYZ where,startpoint,endpoint,movepoint,colpoint;
2204 float rotationpoint;
2206 if(weapons.type[weaponids[weaponactive]]==knife){
2207 where=(weapons.tippoint[weaponids[weaponactive]]*.6+weapons.position[weaponids[weaponactive]]*.4);
2208 where-=victim->coords;
2209 if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
2216 if(weapons.type[weaponids[weaponactive]]==sword){
2217 where=weapons.position[weaponids[weaponactive]];
2218 where-=victim->coords;
2219 if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
2221 where=weapons.tippoint[weaponids[weaponactive]];
2222 where-=victim->coords;
2223 if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
2226 if(weapons.type[weaponids[weaponactive]]==staff){
2227 where=weapons.position[weaponids[weaponactive]];
2228 where-=victim->coords;
2229 if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
2231 where=weapons.tippoint[weaponids[weaponactive]];
2232 where-=victim->coords;
2233 if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
2238 whichtri=victim->skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &colpoint, &movepoint, &rotationpoint);
2241 if(victim->dead!=2){
2242 victim->DoDamage(abs((victim->damagetolerance-victim->permanentdamage)*2));
2244 award_bonus(id, FinishedBonus);
2246 if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
2248 victim->skeleton.longdead=0;
2249 victim->skeleton.free=1;
2250 victim->skeleton.broken=0;
2252 for(i=0;i<victim->skeleton.num_joints;i++){
2253 victim->skeleton.joints[i].velchange=0;
2254 victim->skeleton.joints[i].locked=0;
2255 //victim->skeleton.joints[i].velocity=0;
2257 emit_sound_at(fleshstabsound, coords, 128);
2260 if(whichtri!=-1||weapons.bloody[weaponids[weaponactive]]){
2261 weapons.blooddrip[weaponids[weaponactive]]+=5;
2262 weapons.blooddripdelay[weaponids[weaponactive]]=0;
2266 emit_sound_at(knifesheathesound, coords, 128.);
2272 if((targetanimation==crouchstabanim||targetanimation==swordgroundstabanim)&&animation[targetanimation].label[currentframe]==6){
2274 emit_sound_at(knifedrawsound, coords, 128);
2277 if(victim&&hasvictim){
2278 XYZ footvel,footpoint;
2280 emit_sound_at(fleshstabremovesound, coords, 128.);
2283 footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
2285 if(weapons.type[weaponids[weaponactive]]==sword){
2286 XYZ where,startpoint,endpoint,movepoint;
2287 float rotationpoint;
2290 where=weapons.position[weaponids[weaponactive]];
2291 where-=victim->coords;
2292 if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
2294 where=weapons.tippoint[weaponids[weaponactive]];
2295 where-=victim->coords;
2296 if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
2301 whichtri=victim->skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &footpoint, &movepoint, &rotationpoint);
2302 footpoint+=victim->coords;
2305 footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
2308 if(weapons.type[weaponids[weaponactive]]==staff){
2309 XYZ where,startpoint,endpoint,movepoint;
2310 float rotationpoint;
2313 where=weapons.position[weaponids[weaponactive]];
2314 where-=victim->coords;
2315 if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
2317 where=weapons.tippoint[weaponids[weaponactive]];
2318 where-=victim->coords;
2319 if(!victim->skeleton.free)where=DoRotation(where,0,-victim->rotation,0);
2324 whichtri=victim->skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &footpoint, &movepoint, &rotationpoint);
2325 footpoint+=victim->coords;
2328 footpoint=(weapons.tippoint[weaponids[weaponactive]]*.8+weapons.position[weaponids[weaponactive]]*.2);
2331 hasvictim=victim->DoBloodBigWhere(2,220,footpoint);
2333 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3){
2334 victim->skeleton.longdead=0;
2335 victim->skeleton.free=1;
2336 victim->skeleton.broken=0;
2338 for(i=0;i<victim->skeleton.num_joints;i++){
2339 victim->skeleton.joints[i].velchange=0;
2340 victim->skeleton.joints[i].locked=0;
2341 //victim->skeleton.joints[i].velocity=0;
2347 Normalise(&relative);
2348 //victim->Puff(abdomen);
2349 if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
2351 if(victim->bloodloss<victim->damagetolerance){
2352 victim->bloodloss+=1000;
2356 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*20;
2360 if(!hasvictim&&onterrain){
2361 weapons.bloody[weaponids[weaponactive]]=0;
2362 weapons.blooddrip[weaponids[weaponactive]]=0;
2366 if(targetanimation==upunchanim&&animation[targetanimation].label[currentframe]==5){
2367 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3){
2369 if(id==0)camerashake+=.4;
2374 if(tutoriallevel!=1){
2375 emit_sound_at(heavyimpactsound, victim->coords, 128);
2380 relative=victim->coords-coords;
2382 Normalise(&relative);
2383 for(i=0;i<victim->skeleton.num_joints;i++){
2384 victim->skeleton.joints[i].velocity=relative*30;
2386 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*150;
2388 victim->targetframe=0;
2389 victim->targetanimation=staggerbackhardanim;
2390 victim->targetrotation=targetrotation+180;
2395 victim->Puff(abdomen);
2396 victim->DoDamage(damagemult*60/victim->protectionhigh);
2403 if(targetanimation==winduppunchanim&&animation[targetanimation].label[currentframe]==5){
2404 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*2){
2406 if(id==0)camerashake+=.4;
2407 if(victim->damage<=victim->damagetolerance-60&&normaldotproduct(victim->facing,victim->coords-coords)<(scale*5)*(scale*5)*0&&animation[victim->targetanimation].height!=lowheight){
2408 if(tutoriallevel!=1){
2409 emit_sound_at(thudsound, victim->coords);
2412 else if(victim->damage<=victim->damagetolerance-60&&normaldotproduct(victim->facing,victim->coords-coords)<(scale*5)*(scale*5)*0&&animation[victim->targetanimation].height==lowheight){
2413 if(tutoriallevel!=1){
2414 emit_sound_at(whooshhitsound, victim->coords);
2418 if(tutoriallevel!=1){
2419 emit_sound_at(heavyimpactsound, victim->coords);
2423 if(victim->damage>victim->damagetolerance-60||normaldotproduct(victim->facing,victim->coords-coords)>0||animation[victim->targetanimation].height==lowheight)
2426 relative=victim->coords-coords;
2428 Normalise(&relative);
2430 Normalise(&relative);
2431 for(i=0;i<victim->skeleton.num_joints;i++){
2432 victim->skeleton.joints[i].velocity=relative*5;
2434 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*400;
2436 victim->targetframe=0;
2437 victim->targetanimation=staggerbackhardanim;
2438 victim->targetrotation=targetrotation+180;
2442 victim->Puff(abdomen);
2443 victim->DoDamage(damagemult*60/victim->protectionhigh);
2449 if(targetanimation==blockhighleftanim&&animation[targetanimation].label[currentframe]==5){
2450 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*4){
2451 if(victim->id==0)camerashake+=.4;
2452 emit_sound_at(landsound2, victim->coords);
2458 if(targetanimation==swordslashparryanim&&animation[targetanimation].label[currentframe]==5){
2459 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*4){
2460 if(victim->id==0)camerashake+=.4;
2462 if(weaponactive!=-1){
2463 if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
2464 if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
2465 if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
2467 emit_sound_at(swordstaffsound, victim->coords);
2470 emit_sound_at(metalhitsound, victim->coords);
2478 if(targetanimation==knifethrowanim&&animation[targetanimation].label[currentframe]==5){
2479 if(weaponactive!=-1){
2482 weapons.owner[weaponids[0]]=-1;
2483 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);
2485 /*if(victim->targetanimation==jumpupanim||victim->targetanimation==jumpdownanim){
2486 aim=DoRotation(aim,(float)abs(Random()%15)-7,(float)abs(Random()%15)-7,0);
2488 weapons.velocity[weaponids[0]]=aim*50;
2489 weapons.tipvelocity[weaponids[0]]=aim*50;
2490 weapons.missed[weaponids[0]]=0;
2491 weapons.hitsomething[weaponids[0]]=0;
2492 weapons.freetime[weaponids[0]]=0;
2493 weapons.firstfree[weaponids[0]]=1;
2494 weapons.physics[weaponids[0]]=0;
2497 weaponids[0]=weaponids[num_weapons];
2503 if(targetanimation==knifeslashstartanim&&animation[targetanimation].label[currentframe]==5){
2505 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*4.5&&/*animation[victim->targetanimation].height!=lowheight&&*/victim->targetanimation!=dodgebackanim&&victim->targetanimation!=rollanim){
2507 if(tutoriallevel!=1)victim->DoBloodBig(1.5/victim->armorhigh,225);
2509 award_bonus(id, Slicebonus);
2510 if(tutoriallevel!=1){
2511 emit_sound_at(knifeslicesound, victim->coords);
2513 //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
2514 if(animation[victim->targetanimation].attack&&(victim->aitype!=playercontrolled||victim->targetanimation==knifeslashstartanim)&&(victim->creature==rabbittype||victim->deathbleeding<=0)){
2515 if(victim->id != 0 || difficulty==2){
2516 victim->targetframe=0;
2517 victim->targetanimation=staggerbackhardanim;
2518 victim->targetrotation=targetrotation+180;
2522 victim->lowreversaldelay=0;
2523 victim->highreversaldelay=0;
2524 if(aitype!=playercontrolled)weaponmissdelay=.6;
2526 if(tutoriallevel!=1)if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
2527 if(tutoriallevel!=1)weapons.blooddrip[weaponids[weaponactive]]+=3;
2529 XYZ footvel,footpoint;
2532 footpoint=(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2*victim->scale+victim->coords;
2535 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;
2537 if(tutoriallevel!=1){
2538 if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .6, .3);
2539 footvel=DoRotation(facing,0,90,0)*.8;
2541 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
2542 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
2543 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .2, 1);
2544 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .2, 1);
2546 if(tutoriallevel==1){
2547 Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .6, .3);
2549 victim->DoDamage(damagemult*0);
2552 if(targetanimation==swordslashanim&&animation[targetanimation].label[currentframe]==5&&victim->targetanimation!=rollanim){
2553 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5&&victim->targetanimation!=dodgebackanim){
2554 if(victim->weaponactive==-1||normaldotproduct(victim->facing,victim->coords-coords)>0||(Random()%2==0)){
2555 award_bonus(id, Slashbonus);
2557 if(tutoriallevel!=1){
2558 if(normaldotproduct(victim->facing,victim->coords-coords)<0)victim->DoBloodBig(2/victim->armorhigh,190);
2559 else victim->DoBloodBig(2/victim->armorhigh,185);
2560 victim->deathbleeding=1;
2561 emit_sound_at(swordslicesound, victim->coords);
2563 //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
2564 if(tutoriallevel!=1){
2565 victim->targetframe=0;
2566 victim->targetanimation=staggerbackhardanim;
2567 victim->targetrotation=targetrotation+180;
2571 if(tutoriallevel!=1){
2572 if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
2573 weapons.blooddrip[weaponids[weaponactive]]+=3;
2575 float bloodlossamount;
2576 bloodlossamount=200+abs((float)(Random()%40))-20;
2577 victim->bloodloss+=bloodlossamount/victim->armorhigh;
2578 //victim->bloodloss+=100*(6.5-findDistancefast(&coords,&victim->coords));
2579 victim->DoDamage(damagemult*0);
2581 XYZ footvel,footpoint;
2584 footpoint=(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position+victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position)/2*victim->scale+victim->coords;
2587 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;
2589 if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
2590 footvel=DoRotation(facing,0,90,0)*.8;
2592 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
2593 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
2594 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
2595 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
2599 if(victim->weaponactive!=-1){
2600 if(weapons.type[victim->weaponids[0]]==staff||weapons.type[weaponids[0]]==staff){
2601 if(weapons.type[victim->weaponids[0]]==staff)weapons.damage[victim->weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
2602 if(weapons.type[weaponids[0]]==staff)weapons.damage[weaponids[0]]+=.2+float(abs(Random()%100)-50)/250;
2604 emit_sound_at(swordstaffsound, victim->coords);
2607 emit_sound_at(metalhitsound, victim->coords);
2613 victim->Puff(righthand);
2615 victim->targetframe=0;
2616 victim->targetanimation=staggerbackhighanim;
2617 victim->targetrotation=targetrotation+180;
2619 weapons.owner[victim->weaponids[0]]=-1;
2620 aim=DoRotation(facing,0,90,0)*21;
2622 weapons.velocity[victim->weaponids[0]]=aim*-.2;
2623 weapons.tipvelocity[victim->weaponids[0]]=aim;
2624 weapons.missed[victim->weaponids[0]]=1;
2625 weapons.hitsomething[weaponids[0]]=0;
2626 weapons.freetime[victim->weaponids[0]]=0;
2627 weapons.firstfree[victim->weaponids[0]]=1;
2628 weapons.physics[victim->weaponids[0]]=1;
2629 victim->num_weapons--;
2630 if(victim->num_weapons){
2631 victim->weaponids[0]=victim->weaponids[num_weapons];
2632 if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
2634 victim->weaponactive=-1;
2635 for(i=0;i<numplayers;i++){
2636 player[i].wentforweapon=0;
2639 /*PlaySoundEx( metalhitsound, samp[metalhitsound], NULL, true);
2640 OPENAL_3D_SetAttributes(channels[metalhitsound], gLoc, vel);
2641 OPENAL_SetVolume(channels[metalhitsound], 512);
2642 OPENAL_SetPaused(channels[metalhitsound], false);*/
2648 if(targetanimation==staffhitanim&&animation[targetanimation].label[currentframe]==5&&victim->targetanimation!=rollanim){
2649 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5&&victim->targetanimation!=dodgebackanim&&victim->targetanimation!=sweepanim){
2650 if(tutoriallevel!=1){
2651 weapons.damage[weaponids[0]]+=.4+float(abs(Random()%100)-50)/250;
2653 if(id==0)camerashake+=.4;
2654 if(Random()%2||creature==wolftype){
2657 emit_sound_at(staffheadsound, victim->coords);
2661 relative=victim->coords-coords;
2663 Normalise(&relative);
2664 relative=DoRotation(relative,0,90,0);
2666 Normalise(&relative);
2667 for(i=0;i<victim->skeleton.num_joints;i++){
2668 victim->skeleton.joints[i].velocity+=relative*damagemult*60;
2670 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*230;
2671 victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity+=relative*damagemult*230;
2674 if(tutoriallevel!=1){
2675 victim->DoDamage(damagemult*120/victim->protectionhigh);
2677 award_bonus(id, solidhit, 30);
2682 if(targetanimation==staffspinhitanim&&animation[targetanimation].label[currentframe]==5&&victim->targetanimation!=rollanim){
2683 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5&&victim->targetanimation!=dodgebackanim&&victim->targetanimation!=sweepanim){
2684 if(tutoriallevel!=1){
2685 weapons.damage[weaponids[0]]+=.6+float(abs(Random()%100)-50)/250;
2687 if(id==0)camerashake+=.4;
2688 if(Random()%2||creature==wolftype){
2691 emit_sound_at(staffheadsound, victim->coords);
2695 relative=victim->coords-coords;
2697 Normalise(&relative);
2698 relative=DoRotation(relative,0,-90,0);
2699 for(i=0;i<victim->skeleton.num_joints;i++){
2700 victim->skeleton.joints[i].velocity+=relative*damagemult*40;
2702 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*220;
2703 victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity+=relative*damagemult*220;
2706 if(tutoriallevel!=1){victim->DoDamage(damagemult*350/victim->protectionhead);
2708 award_bonus(id, solidhit, 60);
2713 if(targetanimation==staffgroundsmashanim&&animation[targetanimation].label[currentframe]==5){
2714 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*6.5){
2716 if(tutoriallevel!=1){
2717 if(!victim->dead)weapons.damage[weaponids[0]]+=.4+float(abs(Random()%100)-50)/500;
2718 if(id==0)camerashake+=.4;
2719 if(Random()%2||creature==wolftype){
2722 emit_sound_at(staffbodysound, victim->coords);
2724 victim->skeleton.longdead=0;
2725 victim->skeleton.free=1;
2726 victim->skeleton.broken=0;
2728 for(i=0;i<victim->skeleton.num_joints;i++){
2729 victim->skeleton.joints[i].velchange=0;
2730 victim->skeleton.joints[i].locked=0;
2731 //victim->skeleton.joints[i].velocity=0;
2737 /*relative=victim->coords-coords;
2739 Normalise(&relative);
2740 relative=DoRotation(relative,0,90,0);*/
2742 Normalise(&relative);
2744 for(i=0;i<victim->skeleton.num_joints;i++){
2745 victim->skeleton.joints[i].velocity=relative*damagemult*40;
2748 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*40;
2751 for(i=0;i<victim->skeleton.num_joints;i++){
2752 victim->skeleton.joints[i].velocity=relative*damagemult*abs(Random()%20);
2755 //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*20;
2757 victim->Puff(abdomen);
2758 if(tutoriallevel!=1){victim->DoDamage(damagemult*100/victim->protectionhigh);
2761 award_bonus(id, solidhit, 40);
2767 if(targetanimation==lowkickanim&&animation[targetanimation].label[currentframe]==5){
2768 if(findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&animation[victim->targetanimation].height!=highheight){
2770 if(id==0)camerashake+=.4;
2772 relative=victim->coords-coords;
2774 Normalise(&relative);
2778 if(animation[victim->targetanimation].height==lowheight){
2784 for(i=0;i<victim->skeleton.num_joints;i++){
2785 victim->skeleton.joints[i].velocity+=relative*damagemult*40;
2787 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
2788 if(tutoriallevel!=1){
2789 emit_sound_at(heavyimpactsound, victim->coords, 128.);
2792 victim->DoDamage(damagemult*100/victim->protectionhead);
2793 if(victim->howactive==typesleeping)victim->DoDamage(damagemult*150/victim->protectionhead);
2794 if(creature==wolftype){
2795 emit_sound_at(clawslicesound, victim->coords, 128.);
2797 victim->DoBloodBig(2/victim->armorhead,175);
2801 if(victim->damage>=victim->damagetolerance)victim->RagDoll(0);
2802 for(i=0;i<victim->skeleton.num_joints;i++){
2803 victim->skeleton.joints[i].velocity+=relative*damagemult*10;
2805 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
2806 victim->targetframe=0;
2807 victim->targetanimation=staggerbackhighanim;
2808 victim->targetrotation=targetrotation+180;
2810 if(tutoriallevel!=1){
2811 emit_sound_at(landsound2, victim->coords, 128.);
2813 victim->Puff(abdomen);
2814 victim->DoDamage(damagemult*30/victim->protectionhigh);
2815 if(creature==wolftype){
2816 emit_sound_at(clawslicesound, victim->coords, 128.);
2818 victim->DoBloodBig(2/victim->armorhigh,170);
2825 if(targetanimation==sweepanim&&animation[targetanimation].label[currentframe]==5){
2826 if(victim->targetanimation!=jumpupanim&&findDistancefast(&coords,&victim->coords)<(scale*5)*(scale*5)*3&&victim!=this){
2828 if(id==0)camerashake+=.2;
2829 if(tutoriallevel!=1){
2830 emit_sound_at(landsound2, victim->coords, 128.);
2833 relative=victim->coords-coords;
2835 Normalise(&relative);
2837 if(animation[victim->targetanimation].height==middleheight||animation[victim->currentanimation].height==middleheight||victim->damage>=victim->damagetolerance-40){
2840 for(i=0;i<victim->skeleton.num_joints;i++){
2841 victim->skeleton.joints[i].velocity+=relative*damagemult*15;
2843 relative=DoRotation(relative,0,-90,0);
2845 for(i=0;i<victim->skeleton.num_joints;i++){
2846 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)
2847 victim->skeleton.joints[i].velocity=relative*80;
2849 victim->Puff(rightankle);
2850 victim->Puff(leftankle);
2851 victim->DoDamage(damagemult*40/victim->protectionlow);
2854 if(victim->damage>=victim->damagetolerance)victim->RagDoll(0);
2855 for(i=0;i<victim->skeleton.num_joints;i++){
2856 victim->skeleton.joints[i].velocity+=relative*damagemult*10;
2858 relative=DoRotation(relative,0,-90,0);
2859 for(i=0;i<victim->skeleton.num_joints;i++){
2860 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)
2861 victim->skeleton.joints[i].velocity+=relative*damagemult*80;
2863 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
2864 victim->targetframe=0;
2865 victim->targetanimation=staggerbackhighanim;
2866 victim->targetrotation=targetrotation+180;
2868 if(tutoriallevel!=1){
2869 emit_sound_at(landsound2, victim->coords, 128.);
2871 victim->Puff(abdomen);
2872 victim->DoDamage(damagemult*30/victim->protectionlow);
2880 if(animation[targetanimation].attack==reversal&&(!victim->feint||(victim->lastattack==victim->lastattack2&&victim->lastattack2==victim->lastattack3&&Random()%2)||targetanimation==knifefollowanim)){
2881 if(targetanimation==spinkickreversalanim&&animation[targetanimation].label[currentframe]==7){
2883 if(id==0)camerashake+=.4;
2888 if(tutoriallevel!=1){
2889 emit_sound_at(heavyimpactsound, victim->coords, 128.);
2891 if(creature==wolftype){
2892 emit_sound_at(clawslicesound, victim->coords, 128);
2894 victim->DoBloodBig(2/victim->armorhigh,170);
2898 relative=victim->coords-oldcoords;
2900 Normalise(&relative);
2901 //relative=DoRotation(relative,0,-90,0);
2902 for(i=0;i<victim->skeleton.num_joints;i++){
2903 victim->skeleton.joints[i].velocity+=relative*damagemult*40;
2905 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
2907 victim->Puff(abdomen);
2908 victim->DoDamage(damagemult*150/victim->protectionhigh);
2910 award_bonus(id, Reversal);
2913 if((targetanimation==swordslashreversalanim||targetanimation==knifeslashreversalanim||targetanimation==staffhitreversalanim||targetanimation==staffspinhitreversalanim)&&animation[targetanimation].label[currentframe]==5){
2914 if(victim->weaponactive!=-1&&victim->num_weapons>0){
2915 if(weapons.owner[victim->weaponids[victim->weaponactive]]==victim->id){
2916 weapons.owner[victim->weaponids[victim->weaponactive]]=id;
2919 weaponids[num_weapons]=weaponids[victim->weaponactive];
2922 weaponids[0]=victim->weaponids[victim->weaponactive];
2923 victim->num_weapons--;
2924 if(victim->num_weapons>0){
2925 victim->weaponids[victim->weaponactive]=victim->weaponids[victim->num_weapons];
2926 //if(victim->weaponstuck==victim->num_weapons)victim->weaponstuck=0;
2928 victim->weaponactive=-1;
2933 if(targetanimation==staffhitreversalanim&&animation[targetanimation].label[currentframe]==5){
2935 if(id==0)camerashake+=.4;
2940 emit_sound_at(whooshhitsound, victim->coords, 128.);
2943 relative=victim->coords-oldcoords;
2945 Normalise(&relative);
2946 //relative=DoRotation(relative,0,-90,0);
2947 for(i=0;i<victim->skeleton.num_joints;i++){
2948 victim->skeleton.joints[i].velocity+=relative*damagemult*30;
2950 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
2953 victim->DoDamage(damagemult*70/victim->protectionhigh);
2956 if(targetanimation==staffspinhitreversalanim&&animation[targetanimation].label[currentframe]==7){
2958 if(id==0)camerashake+=.4;
2964 award_bonus(id, staffreversebonus);
2966 if(tutoriallevel!=1){
2967 emit_sound_at(heavyimpactsound, victim->coords, 128.);
2970 award_bonus(id, staffreversebonus); // Huh, again?
2973 relative=victim->coords-oldcoords;
2975 Normalise(&relative);
2976 //relative=DoRotation(relative,0,-90,0);
2977 for(i=0;i<victim->skeleton.num_joints;i++){
2978 victim->skeleton.joints[i].velocity+=relative*damagemult*30;
2980 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
2983 victim->DoDamage(damagemult*70/victim->protectionhigh);
2986 if(targetanimation==upunchreversalanim&&animation[targetanimation].label[currentframe]==7){
2992 Normalise(&relative);
2995 for(i=0;i<victim->skeleton.num_joints;i++){
2996 victim->skeleton.joints[i].velocity+=relative*damagemult*70;
2998 victim->skeleton.joints[victim->skeleton.jointlabels[lefthand]].velocity*=.1;
2999 victim->skeleton.joints[victim->skeleton.jointlabels[leftwrist]].velocity*=.2;
3000 victim->skeleton.joints[victim->skeleton.jointlabels[leftelbow]].velocity*=.5;
3001 victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity*=.7;
3002 victim->skeleton.joints[victim->skeleton.jointlabels[righthand]].velocity*=.1;
3003 victim->skeleton.joints[victim->skeleton.jointlabels[rightwrist]].velocity*=.2;
3004 victim->skeleton.joints[victim->skeleton.jointlabels[rightelbow]].velocity*=.5;
3005 victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity*=.7;
3007 victim->Puff(abdomen);
3008 victim->DoDamage(damagemult*90/victim->protectionhigh);
3010 award_bonus(id, Reversal);
3014 if(weaponactive!=-1||creature==wolftype)doslice=1;
3015 if(creature==rabbittype&&weaponactive!=-1)if(weapons.type[weaponids[0]]==staff)doslice=0;
3017 if(weaponactive!=-1){
3018 victim->DoBloodBig(2/victim->armorhigh,225);
3019 emit_sound_at(knifeslicesound, victim->coords);
3020 if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
3021 weapons.blooddrip[weaponids[weaponactive]]+=3;
3023 if(weaponactive==-1&&creature==wolftype){;
3024 emit_sound_at(clawslicesound, victim->coords, 128.);
3026 victim->DoBloodBig(2/victim->armorhigh,175);
3033 if(targetanimation==swordslashreversalanim&&animation[targetanimation].label[currentframe]==7){
3039 Normalise(&relative);
3042 for(i=0;i<victim->skeleton.num_joints;i++){
3043 victim->skeleton.joints[i].velocity+=relative*damagemult*70;
3045 victim->skeleton.joints[victim->skeleton.jointlabels[lefthand]].velocity*=.1-1;
3046 victim->skeleton.joints[victim->skeleton.jointlabels[leftwrist]].velocity*=.2-1;
3047 victim->skeleton.joints[victim->skeleton.jointlabels[leftelbow]].velocity*=.5-1;
3048 victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity*=.7-1;
3049 victim->skeleton.joints[victim->skeleton.jointlabels[righthand]].velocity*=.1-1;
3050 victim->skeleton.joints[victim->skeleton.jointlabels[rightwrist]].velocity*=.2-1;
3051 victim->skeleton.joints[victim->skeleton.jointlabels[rightelbow]].velocity*=.5-1;
3052 victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity*=.7-1;
3054 award_bonus(id, swordreversebonus);
3057 if(hasvictim&&targetanimation==knifeslashreversalanim&&animation[targetanimation].label[currentframe]==7){
3059 if(id==0)camerashake+=.4;
3064 if(tutoriallevel!=1){
3065 emit_sound_at(heavyimpactsound, victim->coords, 128.);
3069 relative=victim->coords-oldcoords;
3071 Normalise(&relative);
3072 relative=DoRotation(relative,0,-90,0);
3073 for(i=0;i<victim->skeleton.num_joints;i++){
3074 victim->skeleton.joints[i].velocity+=relative*damagemult*40;
3076 victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
3078 victim->Puff(abdomen);
3079 victim->DoDamage(damagemult*30/victim->protectionhigh);
3081 award_bonus(id, Reversal);
3084 if(hasvictim&&targetanimation==sneakattackanim&&animation[targetanimation].label[currentframe]==7){
3087 victim->skeleton.spinny=0;
3091 Normalise(&relative);
3092 if(victim->id==0)relative/=30;
3093 for(i=0;i<victim->skeleton.num_joints;i++){
3094 victim->skeleton.joints[i].velocity+=relative*damagemult*40;
3096 //victim->DoDamage(1000);
3097 victim->damage=victim->damagetolerance;
3098 victim->permanentdamage=victim->damagetolerance-1;
3101 if(weaponactive!=-1||creature==wolftype)doslice=1;
3102 if(creature==rabbittype&&weaponactive!=-1)if(weapons.type[weaponids[0]]==staff)doslice=0;
3104 if(weaponactive!=-1){
3105 victim->DoBloodBig(200,225);
3106 emit_sound_at(knifeslicesound, victim->coords);
3107 if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
3108 weapons.blooddrip[weaponids[weaponactive]]+=5;
3111 if(creature==wolftype&&weaponactive==-1){
3112 emit_sound_at(clawslicesound, victim->coords, 128.);
3114 victim->DoBloodBig(2,175);
3117 award_bonus(id, spinecrusher);
3120 if(hasvictim&&(targetanimation==knifefollowanim||targetanimation==knifesneakattackanim)&&animation[targetanimation].label[currentframe]==5){
3121 if(weaponactive!=-1&&victim->bloodloss<victim->damagetolerance){
3123 if(targetanimation==knifefollowanim)victim->DoBloodBig(200,210);
3124 if(targetanimation==knifesneakattackanim){
3125 /*victim->DoBloodBig(200,195);
3130 bloodvel=DoRotation(bloodvel,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
3131 Sprite::MakeSprite(bloodsprite, DoRotation(skeleton.joints[skeleton.jointlabels[neck]].position,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
3133 XYZ footvel,footpoint;
3135 footpoint=weapons.tippoint[weaponids[0]];
3136 if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
3137 footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]]);
3138 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3139 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3140 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
3141 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
3142 victim->DoBloodBig(200,195);
3143 award_bonus(id, tracheotomy);
3145 if(targetanimation==knifefollowanim){
3146 award_bonus(id, Stabbonus);
3147 XYZ footvel,footpoint;
3149 footpoint=weapons.tippoint[weaponids[0]];
3150 if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
3151 footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
3152 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3153 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3154 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .2, 1);
3155 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .2, 1);
3158 victim->bloodloss+=10000;
3160 emit_sound_at(fleshstabsound, victim->coords);
3161 if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
3162 weapons.blooddrip[weaponids[weaponactive]]+=5;
3166 if(hasvictim&&(targetanimation==knifefollowanim||targetanimation==knifesneakattackanim)&&animation[targetanimation].label[currentframe]==6){
3169 for(i=0;i<victim->skeleton.num_joints;i++){
3170 victim->skeleton.joints[i].velocity=0;
3172 if(targetanimation==knifefollowanim){
3174 for(i=0;i<victim->skeleton.num_joints;i++){
3175 victim->skeleton.joints[i].velocity=0;
3178 if(weaponactive!=-1&&animation[victim->targetanimation].attack!=reversal){
3179 emit_sound_at(fleshstabremovesound, victim->coords);
3180 if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
3181 weapons.blooddrip[weaponids[weaponactive]]+=5;
3183 XYZ footvel,footpoint;
3185 footpoint=weapons.tippoint[weaponids[0]];
3186 if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
3187 footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
3188 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3189 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3190 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
3191 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
3195 if(hasvictim&&(targetanimation==swordsneakattackanim)&&animation[targetanimation].label[currentframe]==5){
3196 if(weaponactive!=-1&&victim->bloodloss<victim->damagetolerance){
3197 award_bonus(id, backstab);
3201 XYZ footvel,footpoint;
3203 footpoint=(weapons.tippoint[weaponids[0]]+weapons.position[weaponids[0]])/2;
3204 if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
3205 footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]]);
3206 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3207 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3208 Sprite::MakeSprite(bloodflamesprite, footpoint,DoRotation(footvel*5,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .3, 1);
3209 Sprite::MakeSprite(bloodflamesprite, footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .3, 1);
3210 victim->DoBloodBig(200,180);
3211 victim->DoBloodBig(200,215);
3212 victim->bloodloss+=10000;
3214 emit_sound_at(fleshstabsound, victim->coords);
3215 if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
3216 weapons.blooddrip[weaponids[weaponactive]]+=5;
3220 if(hasvictim&&targetanimation==swordsneakattackanim&&animation[targetanimation].label[currentframe]==6){
3223 for(i=0;i<victim->skeleton.num_joints;i++){
3224 victim->skeleton.joints[i].velocity=0;
3226 if(weaponactive!=-1){
3227 emit_sound_at(fleshstabremovesound, victim->coords);
3228 if(bloodtoggle)weapons.bloody[weaponids[weaponactive]]=2;
3229 weapons.blooddrip[weaponids[weaponactive]]+=5;
3231 XYZ footvel,footpoint;
3233 footpoint=weapons.tippoint[weaponids[0]];
3234 if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .9, .3);
3235 footvel=(weapons.tippoint[weaponids[0]]-weapons.position[weaponids[0]])*-1;
3236 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*7,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3237 Sprite::MakeSprite(bloodsprite,footpoint,DoRotation(footvel*3,(float)(Random()%20),(float)(Random()%20),0), 1,1,1, .05, .9);
3238 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*5, 1,1,1, .3, 1);
3239 Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*2, 1,1,1, .3, 1);
3243 if(targetanimation==sweepreversalanim&&animation[targetanimation].label[currentframe]==7){
3245 if(id==0)camerashake+=.4;
3250 if(weaponactive==-1){
3251 if(tutoriallevel!=1){
3252 emit_sound_at(heavyimpactsound, victim->coords, 128.);
3257 if(weaponactive!=-1||creature==wolftype)doslice=1;
3258 if(creature==rabbittype&&weaponactive!=-1)if(weapons.type[weaponids[0]]==staff)doslice=0;
3260 if(weaponactive!=-1){
3261 victim->DoBloodBig(2/victim->armorhead,225);
3262 emit_sound_at(knifeslicesound, victim->coords);
3263 if(bloodtoggle&&!weapons.bloody[weaponids[weaponactive]])weapons.bloody[weaponids[weaponactive]]=1;
3264 weapons.blooddrip[weaponids[weaponactive]]+=3;
3266 if(weaponactive==-1&&creature==wolftype){
3267 emit_sound_at(clawslicesound, victim->coords, 128.);
3269 victim->DoBloodBig(2/victim->armorhead,175);
3273 award_bonus(id, Reversal);
3278 //relative=victim->coords-oldcoords;
3281 Normalise(&relative);
3282 relative=DoRotation(relative,0,90,0);
3284 Normalise(&relative);
3285 for(i=0;i<victim->skeleton.num_joints;i++){
3286 victim->skeleton.joints[i].velocity+=relative*damagemult*20;
3288 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
3289 if(victim->damage<victim->damagetolerance-100)victim->velocity=relative*200;
3290 victim->DoDamage(damagemult*100/victim->protectionhead);
3294 if(targetanimation==sweepreversalanim&&((animation[targetanimation].label[currentframe]==9&&victim->damage<victim->damagetolerance)||(animation[targetanimation].label[currentframe]==7&&victim->damage>victim->damagetolerance))){
3298 //relative=victim->coords-oldcoords;
3301 Normalise(&relative);
3302 relative=DoRotation(relative,0,90,0);
3304 Normalise(&relative);
3305 for(i=0;i<victim->skeleton.num_joints;i++){
3306 victim->skeleton.joints[i].velocity+=relative*damagemult*20;
3308 victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity+=relative*damagemult*200;
3311 if(hasvictim&&(targetanimation==spinkickreversalanim||targetanimation==sweepreversalanim||targetanimation==rabbitkickreversalanim||targetanimation==upunchreversalanim||targetanimation==jumpreversalanim||targetanimation==swordslashreversalanim||targetanimation==knifeslashreversalanim||targetanimation==rabbittacklereversal||targetanimation==wolftacklereversal||targetanimation==staffhitreversalanim||targetanimation==staffspinhitreversalanim))
3312 if(victim->damage>victim->damagetolerance&&bonus!=reverseko){
3313 award_bonus(id, reverseko);
3319 if(targetframe>animation[currentanimation].numframes-1){
3322 targetanimation=getIdle();
3326 if(currentanimation==rabbittackleanim||currentanimation==rabbittacklinganim){
3327 targetanimation=rollanim;
3329 emit_sound_at(movewhooshsound, coords, 128.);
3331 if(currentanimation==staggerbackhighanim){
3332 targetanimation=getIdle();
3334 if(currentanimation==staggerbackhardanim){
3335 targetanimation=getIdle();
3337 if(currentanimation==removeknifeanim){
3338 targetanimation=getIdle();
3340 if(currentanimation==crouchremoveknifeanim){
3341 targetanimation=getCrouch();
3343 if(currentanimation==backhandspringanim){
3344 targetanimation=getIdle();
3346 if(currentanimation==dodgebackanim){
3347 targetanimation=getIdle();
3349 if(currentanimation==drawleftanim){
3350 targetanimation=getIdle();
3352 if(currentanimation==drawrightanim||currentanimation==crouchdrawrightanim){
3353 targetanimation=getIdle();
3354 if(currentanimation==crouchdrawrightanim){
3355 targetanimation=getCrouch();
3357 if(weaponactive==-1)weaponactive=0;
3358 else if(weaponactive==0){
3362 buffer=weaponids[0];
3363 weaponids[0]=weaponids[1];
3364 weaponids[1]=buffer;
3368 if(weaponactive==-1){
3369 emit_sound_at(knifesheathesound, coords, 128.);
3371 if(weaponactive!=-1){
3372 emit_sound_at(knifedrawsound, coords, 128.);
3375 if(currentanimation==rollanim){
3376 targetanimation=getCrouch();
3381 if(targetanimation==walljumprightkickanim){
3384 if(targetanimation==walljumpleftkickanim){
3387 targetanimation=jumpdownanim;
3389 if(currentanimation==climbanim){
3390 targetanimation=getCrouch();
3393 if(!isnormal(coords.x))
3404 if(targetanimation==rabbitkickreversalanim){
3405 targetanimation=getCrouch();
3408 if(targetanimation==jumpreversalanim){
3409 targetanimation=getCrouch();
3412 if(targetanimation==walljumprightanim||targetanimation==walljumpbackanim||targetanimation==walljumpfrontanim){
3413 if(attackkeydown&&targetanimation!=walljumpfrontanim){
3415 float closestdist=-1;
3418 for(i=0;i<numplayers;i++){
3419 if(id!=i&&player[i].coords.y<coords.y&&!player[i].skeleton.free){
3420 distance=findDistancefast(&player[i].coords,&coords);
3421 if(closestdist==-1||distance<closestdist){
3422 closestdist=distance;
3427 if(closestdist>0&&closest>=0&&closestdist<16){
3428 victim=&player[closest];
3429 targetanimation=walljumprightkickanim;
3431 XYZ rotatetarget=victim->coords-coords;
3432 Normalise(&rotatetarget);
3433 rotation=-asin(0-rotatetarget.x);
3435 if(rotatetarget.z<0)rotation=180-rotation;
3436 targettilt2=-asin(rotatetarget.y)*360/6.28;
3437 velocity=(victim->coords-coords)*4;
3442 if(targetanimation==walljumpbackanim){
3443 targetanimation=backflipanim;
3447 if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
3449 if(targetanimation==walljumprightanim){
3450 targetanimation=rightflipanim;
3454 velocity=DoRotation(facing,0,30,0)*-8;
3457 if(targetanimation==walljumpfrontanim){
3458 targetanimation=frontflipanim;
3460 //targetrotation-=180;
3465 if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
3467 if(targetanimation==walljumpleftanim){
3470 float closestdist=-1;
3473 for(i=0;i<numplayers;i++){
3474 if(id!=i&&player[i].coords.y<coords.y&&!player[i].skeleton.free){
3475 distance=findDistancefast(&player[i].coords,&coords);
3476 if(closestdist==-1||distance<closestdist){
3477 closestdist=distance;
3482 if(closestdist>0&&closest>=0&&closestdist<16){
3483 victim=&player[closest];
3484 targetanimation=walljumpleftkickanim;
3486 XYZ rotatetarget=victim->coords-coords;
3487 Normalise(&rotatetarget);
3488 rotation=-asin(0-rotatetarget.x);
3490 if(rotatetarget.z<0)rotation=180-rotation;
3491 targettilt2=-asin(rotatetarget.y)*360/6.28;
3492 velocity=(victim->coords-coords)*4;
3497 if(targetanimation!=walljumpleftkickanim){
3498 targetanimation=leftflipanim;
3502 velocity=DoRotation(facing,0,-30,0)*-8;
3505 if(id==0)OPENAL_SetPaused(channels[whooshsound], false);
3507 if(targetanimation==sneakattackanim){
3508 float ycoords=oldcoords.y;
3509 currentanimation=getCrouch();
3510 targetanimation=getCrouch();
3513 targetrotation+=180;
3518 targetheadrotation+=180;
3520 if(onterrain)coords.y=terrain.getHeight(coords.x,coords.z);
3524 if(targetanimation==knifesneakattackanim||targetanimation==swordsneakattackanim){
3525 float ycoords=oldcoords.y;
3526 targetanimation=getIdle();
3528 if(onterrain)coords.y=terrain.getHeight(coords.x,coords.z);
3532 if(currentanimation==knifefollowanim){
3533 targetanimation=getIdle();
3536 if(animation[targetanimation].attack==reversal&¤tanimation!=sneakattackanim&¤tanimation!=knifesneakattackanim&¤tanimation!=swordsneakattackanim&¤tanimation!=knifefollowanim){
3537 float ycoords=oldcoords.y;
3538 targetanimation=getStop();
3539 targetrotation+=180;
3544 targetheadrotation+=180;
3545 if(!isnormal(coords.x))
3547 if(currentanimation==spinkickreversalanim||currentanimation==swordslashreversalanim)
3548 oldcoords=coords+facing*.5;
3549 else if(currentanimation==sweepreversalanim)
3550 oldcoords=coords+facing*1.1;
3551 else if(currentanimation==upunchreversalanim){
3552 oldcoords=coords+facing*1.5;
3553 targetrotation+=180;
3555 targetheadrotation+=180;
3559 else if(currentanimation==knifeslashreversalanim){
3560 oldcoords=coords+facing*.5;
3563 targetheadrotation+=90;
3567 else if(currentanimation==staffspinhitreversalanim){
3568 targetrotation+=180;
3570 targetheadrotation+=180;
3574 if(onterrain)oldcoords.y=terrain.getHeight(oldcoords.x,oldcoords.z);
3575 else oldcoords.y=ycoords;
3576 currentoffset=coords-oldcoords;
3582 if(currentanimation==knifesneakattackedanim||currentanimation==swordsneakattackedanim){
3587 if(animation[targetanimation].attack==reversed){
3589 if(targetanimation==sweepreversedanim)targetrotation+=90;
3590 targetanimation=backhandspringanim;
3592 emit_sound_at(landsound, coords, 128);
3594 if(currentanimation==upunchreversedanim||currentanimation==swordslashreversedanim){
3595 targetanimation=rollanim;
3598 coords+=(DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)+DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0))/2*scale;
3599 coords.y=oldcoords.y;
3601 if(currentanimation==knifeslashreversedanim){
3602 targetanimation=rollanim;
3607 coords+=(DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)+DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0))/2*scale;
3608 coords.y=oldcoords.y;
3612 targetanimation=jumpdownanim;
3614 if(wasLanding())targetanimation=getIdle();
3615 if(wasLandhard())targetanimation=getIdle();
3616 if(currentanimation==spinkickanim||currentanimation==getupfrombackanim||currentanimation==getupfromfrontanim||currentanimation==lowkickanim){
3617 targetanimation=getIdle();
3619 coords+=(DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)+DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0))/2*scale;
3620 coords.y=oldcoords.y;
3621 //coords+=DoRotation(animation[currentanimation].offset,0,rotation,0)*scale;
3622 targetoffset.y=coords.y;
3623 if(onterrain)targetoffset.y=terrain.getHeight(coords.x,coords.z);
3624 currentoffset=DoRotation(animation[currentanimation].offset*-1,0,rotation,0)*scale;
3625 currentoffset.y-=(coords.y-targetoffset.y);
3626 coords.y=targetoffset.y;
3628 normalsupdatedelay=0;
3630 if(currentanimation==upunchanim){
3631 targetanimation=getStop();
3632 normalsupdatedelay=0;
3635 if(currentanimation==rabbitkickanim&&targetanimation!=backflipanim){
3636 targetrotation=rotation;
3639 if(num_weapons>0)if(weapons.type[0]==staff)hasstaff=1;
3640 if(!hasstaff)DoDamage(35);
3643 rabbitkickragdoll=1;
3645 if(currentanimation==rabbitkickreversedanim){
3652 SolidHitBonus(!id); // FIXME: tricky id
3656 targetanimation=rollanim;
3658 if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
3662 if(currentanimation==rabbittackledbackanim||currentanimation==rabbittackledfrontanim){
3668 if(currentanimation==jumpreversedanim){
3675 SolidHitBonus(!id); // FIXME: tricky id
3679 targetanimation=rollanim;
3681 if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
3686 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){
3687 targetanimation=getupfromfrontanim;
3690 else if(animation[currentanimation].attack==normalattack){
3691 targetanimation=getIdle();
3694 if(currentanimation==blockhighleftanim&&aitype!=playercontrolled){
3695 targetanimation=blockhighleftstrikeanim;
3697 if(currentanimation==knifeslashstartanim||currentanimation==knifethrowanim||currentanimation==swordslashanim||currentanimation==staffhitanim||currentanimation==staffgroundsmashanim||currentanimation==staffspinhitanim){
3698 targetanimation=getIdle();
3701 if(currentanimation==spinkickanim&&victim->skeleton.free){
3702 if(creature==rabbittype)targetanimation=fightidleanim;
3707 if(isIdle()&&!wasIdle())normalsupdatedelay=0;
3709 if(currentanimation==jumpupanim&&velocity.y<0&&!isFlip()){
3710 targetanimation=jumpdownanim;
3715 if(!transspeed&&animation[targetanimation].attack!=2&&animation[targetanimation].attack!=3){
3716 if(!isRun()||!wasRun()){
3717 if(animation[targetanimation].speed[targetframe]>animation[currentanimation].speed[currentframe])
3718 target+=multiplier*animation[targetanimation].speed[targetframe]*speed*2;
3719 if(animation[targetanimation].speed[targetframe]<=animation[currentanimation].speed[currentframe])
3720 target+=multiplier*animation[currentanimation].speed[currentframe]*speed*2;
3722 if(isRun()&&wasRun()){
3725 if(tempspeed<10*speedmult)tempspeed=10*speedmult;
3726 target+=multiplier*animation[targetanimation].speed[currentframe]*speed*1.7*tempspeed/(speed*45*scale);
3729 else if(transspeed)target+=multiplier*transspeed*speed*2;
3731 if(!isRun()||!wasRun()){
3732 if(animation[targetanimation].speed[targetframe]>animation[currentanimation].speed[currentframe])
3733 target+=multiplier*animation[targetanimation].speed[targetframe]*2;
3734 if(animation[targetanimation].speed[targetframe]<=animation[currentanimation].speed[currentframe])
3735 target+=multiplier*animation[currentanimation].speed[currentframe]*2;
3739 if(currentanimation!=targetanimation)target=(target+oldtarget)/2;
3741 if(target>1){currentframe=targetframe; target=1;}
3743 rot=targetrot*target;
3744 rotation+=rot-oldrot;
3750 if(currentanimation!=oldcurrentanimation||targetanimation!=oldtargetanimation||((currentframe!=oldcurrentframe||targetframe!=oldtargetframe)&&!calcrot)){
3752 for(i=0;i<skeleton.num_joints;i++){
3753 skeleton.joints[i].position=animation[currentanimation].position[i][currentframe];
3756 skeleton.FindForwards();
3758 for(i=0;i<skeleton.num_muscles;i++){
3759 if(skeleton.muscles[i].visible)
3761 skeleton.FindRotationMuscle(i,targetanimation);
3764 for(i=0;i<skeleton.num_muscles;i++){
3765 if(skeleton.muscles[i].visible)
3767 if(isnormal((float)((int)(skeleton.muscles[i].rotate1*100)%36000)/100))skeleton.muscles[i].oldrotate1=(float)((int)(skeleton.muscles[i].rotate1*100)%36000)/100;
3768 if(isnormal((float)((int)(skeleton.muscles[i].rotate2*100)%36000)/100))skeleton.muscles[i].oldrotate2=(float)((int)(skeleton.muscles[i].rotate2*100)%36000)/100;
3769 if(isnormal((float)((int)(skeleton.muscles[i].rotate3*100)%36000)/100))skeleton.muscles[i].oldrotate3=(float)((int)(skeleton.muscles[i].rotate3*100)%36000)/100;
3774 for(i=0;i<skeleton.num_joints;i++){
3775 skeleton.joints[i].position=animation[targetanimation].position[i][targetframe];
3778 skeleton.FindForwards();
3780 for(i=0;i<skeleton.num_muscles;i++){
3781 if(skeleton.muscles[i].visible)
3783 skeleton.FindRotationMuscle(i,targetanimation);
3786 for(i=0;i<skeleton.num_muscles;i++){
3787 if(skeleton.muscles[i].visible)
3789 if(isnormal((float)((int)(skeleton.muscles[i].rotate1*100)%36000)/100))skeleton.muscles[i].newrotate1=(float)((int)(skeleton.muscles[i].rotate1*100)%36000)/100;
3790 if(isnormal((float)((int)(skeleton.muscles[i].rotate2*100)%36000)/100))skeleton.muscles[i].newrotate2=(float)((int)(skeleton.muscles[i].rotate2*100)%36000)/100;
3791 if(isnormal((float)((int)(skeleton.muscles[i].rotate3*100)%36000)/100))skeleton.muscles[i].newrotate3=(float)((int)(skeleton.muscles[i].rotate3*100)%36000)/100;
3792 if(skeleton.muscles[i].newrotate3>skeleton.muscles[i].oldrotate3+180)skeleton.muscles[i].newrotate3-=360;
3793 if(skeleton.muscles[i].newrotate3<skeleton.muscles[i].oldrotate3-180)skeleton.muscles[i].newrotate3+=360;
3794 if(skeleton.muscles[i].newrotate2>skeleton.muscles[i].oldrotate2+180)skeleton.muscles[i].newrotate2-=360;
3795 if(skeleton.muscles[i].newrotate2<skeleton.muscles[i].oldrotate2-180)skeleton.muscles[i].newrotate2+=360;
3796 if(skeleton.muscles[i].newrotate1>skeleton.muscles[i].oldrotate1+180)skeleton.muscles[i].newrotate1-=360;
3797 if(skeleton.muscles[i].newrotate1<skeleton.muscles[i].oldrotate1-180)skeleton.muscles[i].newrotate1+=360;
3801 if(currentframe>=animation[currentanimation].numframes)currentframe=animation[currentanimation].numframes-1;
3803 oldcurrentanimation=currentanimation;
3804 oldtargetanimation=targetanimation;
3805 oldtargetframe=targetframe;
3806 oldcurrentframe=currentframe;
3808 for(i=0;i<skeleton.num_joints;i++){
3809 skeleton.joints[i].velocity=(animation[currentanimation].position[i][currentframe]*(1-target)+animation[targetanimation].position[i][targetframe]*(target)-skeleton.joints[i].position)/multiplier;
3810 skeleton.joints[i].position=animation[currentanimation].position[i][currentframe]*(1-target)+animation[targetanimation].position[i][targetframe]*(target);
3812 offset=currentoffset*(1-target)+targetoffset*target;
3813 for(i=0;i<skeleton.num_muscles;i++){
3814 if(skeleton.muscles[i].visible)
3816 skeleton.muscles[i].rotate1=skeleton.muscles[i].oldrotate1*(1-target)+skeleton.muscles[i].newrotate1*(target);
3817 skeleton.muscles[i].rotate2=skeleton.muscles[i].oldrotate2*(1-target)+skeleton.muscles[i].newrotate2*(target);
3818 skeleton.muscles[i].rotate3=skeleton.muscles[i].oldrotate3*(1-target)+skeleton.muscles[i].newrotate3*(target);
3823 if(isLanding()&&landhard){
3824 if(id==0)camerashake+=.4;
3825 targetanimation=getLandhard();
3832 //skeleton.DoConstraints();
3835 void Person::DoStuff(){
3836 static XYZ terrainnormal;
3837 static XYZ flatfacing;
3838 static XYZ flatvelocity;
3839 static float flatvelspeed;
3843 static int bloodsize;
3844 static int startx,starty,endx,endy;
3845 static int texdetailint;
3846 static GLubyte color;
3847 static XYZ bloodvel;
3849 onfiredelay-=multiplier;
3850 if(onfiredelay<0&&onfire)
3858 crouchkeydowntime+=multiplier;
3859 if(!crouchkeydown)crouchkeydowntime=0;
3860 jumpkeydowntime+=multiplier;
3861 if(!jumpkeydown&&skeleton.free)jumpkeydowntime=0;
3863 if(hostile||damage>0||bloodloss>0)immobile=0;
3865 if(isIdle()||isRun())targetoffset=0;
3867 if(num_weapons==1&&weaponactive!=-1)weaponstuck=-1;
3869 if(id==0)blooddimamount-=multiplier*.3;
3870 speechdelay-=multiplier;
3871 texupdatedelay-=multiplier;
3872 interestdelay-=multiplier;
3873 flamedelay-=multiplier;
3874 parriedrecently-=multiplier;
3880 if(id==0)speed=1.1*speedmult;
3881 else speed=1.0*speedmult;
3882 if(!skeleton.free)rabbitkickragdoll=0;
3886 if(id!=0&&(creature==rabbittype||difficulty!=2))superruntoggle=0;
3887 if(id!=0&&creature==wolftype&&difficulty==2){
3889 if(aitype!=passivetype){
3891 if(aitype==attacktypecutoff&&(player[0].isIdle()||player[0].isCrouch()||player[0].skeleton.free||player[0].targetanimation==getupfrombackanim||player[0].targetanimation==getupfromfrontanim||player[0].targetanimation==sneakanim)&&findDistancefast(&coords,&player[0].coords)<16){
3895 if(scale<0.2)superruntoggle=0;
3896 if(targetanimation==wolfrunninganim&&!superruntoggle){
3897 targetanimation=getRun();
3901 if(weaponactive==-1&&num_weapons>0){
3902 if(weapons.type[weaponids[0]]==staff){
3909 /*if(aitype!=playercontrolled)*///deathbleeding=5;
3910 /*if(aitype!=playercontrolled)*/
3912 if(burnt>.6)burnt=.6;
3913 OPENAL_SetVolume(channels[stream_firesound], 256+256*findLength(&velocity)/3);
3915 if(targetanimation==jumpupanim||targetanimation==jumpdownanim||isFlip()){
3926 OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel);
3927 OPENAL_SetVolume(channels[whooshsound], 64*findLength(&velocity)/5);
3931 while(flamedelay<0&&onfire){
3933 howmany=abs(Random()%(skeleton.num_joints));
3934 if(!skeleton.free)flatvelocity=(coords-oldcoords)/multiplier/2;//velocity/2;
3935 if(skeleton.free)flatvelocity=skeleton.joints[howmany].velocity*scale/2;
3936 if(!skeleton.free)flatfacing=DoRotation(DoRotation(DoRotation(skeleton.joints[howmany].position,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords;
3937 if(skeleton.free)flatfacing=skeleton.joints[howmany].position*scale+coords;
3938 Sprite::MakeSprite(flamesprite, flatfacing,flatvelocity, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
3941 while(flamedelay<0&&!onfire&&tutoriallevel==1&&id!=0){
3943 howmany=abs(Random()%(skeleton.num_joints));
3944 if(!skeleton.free)flatvelocity=(coords-oldcoords)/multiplier/2;//velocity/2;
3945 if(skeleton.free)flatvelocity=skeleton.joints[howmany].velocity*scale/2;
3946 if(!skeleton.free)flatfacing=DoRotation(DoRotation(DoRotation(skeleton.joints[howmany].position,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords;
3947 if(skeleton.free)flatfacing=skeleton.joints[howmany].position*scale+coords;
3948 Sprite::MakeSprite(breathsprite, flatfacing,flatvelocity, 1,1,1, .6+(float)abs(Random()%100)/200-.25, .3);
3952 bleeding-=multiplier*.3;
3954 glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
3955 if(bleeding<=0&&(detail!=2||osx))DoMipmaps(5,0,0,skeleton.skinsize,skeleton.skinsize);
3959 if(neckspurtamount>0){
3960 neckspurtamount-=multiplier;
3961 neckspurtdelay-=multiplier*3;
3962 neckspurtparticledelay-=multiplier*3;
3963 if(neckspurtparticledelay<0&&neckspurtdelay>2){
3967 bloodvel.z=5*neckspurtamount;
3968 bloodvel=DoRotation(bloodvel,((float)(Random()%100))/40,rotation+((float)(Random()%100))/40,0)*scale;
3971 bloodvel-=DoRotation(skeleton.forward*10*scale,((float)(Random()%100))/40,((float)(Random()%100))/40,0);
3973 if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity,((float)(Random()%100))/40,rotation+((float)(Random()%100))/40,0)*scale;
3974 if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/40,((float)(Random()%100))/40,0)*scale;
3975 if(skeleton.free)Sprite::MakeSprite(bloodsprite, (skeleton.joints[skeleton.jointlabels[neck]].position+(skeleton.joints[skeleton.jointlabels[neck]].position-skeleton.joints[skeleton.jointlabels[head]].position)/5)*scale+coords,bloodvel, 1,1,1, .05, .9);
3976 if(!skeleton.free)Sprite::MakeSprite(bloodsprite, DoRotation(skeleton.joints[skeleton.jointlabels[neck]].position+(skeleton.joints[skeleton.jointlabels[neck]].position-skeleton.joints[skeleton.jointlabels[head]].position)/5,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, .9);
3977 neckspurtparticledelay=.05;
3979 if(neckspurtdelay<0){
3984 if(deathbleeding>0&&dead!=2){
3985 if(deathbleeding<5)bleeddelay-=deathbleeding*multiplier/4;
3986 else bleeddelay-=5*multiplier/4;
3987 if(bleeddelay<0&&bloodtoggle){
3992 if(skeleton.free)bloodvel+=DoRotation(skeleton.joints[skeleton.jointlabels[abdomen]].velocity,((float)(Random()%100))/4,rotation+((float)(Random()%100))/4,0)*scale;
3993 if(!skeleton.free)bloodvel+=DoRotation(velocity,((float)(Random()%100))/4,((float)(Random()%100))/4,0)*scale;
3994 if(skeleton.free)Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[abdomen]].position*scale+coords,bloodvel, 1,1,1, .05, 1);
3995 if(!skeleton.free)Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[abdomen]].position+skeleton.joints[skeleton.jointlabels[abdomen]].position)/2,0,rotation,0)*scale+coords,bloodvel, 1,1,1, .05, 1);
3998 bloodloss+=deathbleeding*multiplier*80;
3999 deathbleeding-=multiplier*1.6;
4000 //if(id==0)deathbleeding-=multiplier*.2;
4001 if(deathbleeding<0)deathbleeding=0;
4002 if(bloodloss>damagetolerance&&animation[targetanimation].attack==neutral){
4003 if(weaponactive!=-1){
4004 weapons.owner[weaponids[0]]=-1;
4005 weapons.velocity[weaponids[0]]=velocity*scale*-.3;
4006 weapons.velocity[weaponids[0]].x+=.01;
4007 weapons.tipvelocity[weaponids[0]]=velocity*scale;
4008 weapons.missed[weaponids[0]]=1;
4009 weapons.hitsomething[weaponids[0]]=0;
4010 weapons.freetime[weaponids[0]]=0;
4011 weapons.firstfree[weaponids[0]]=1;
4012 weapons.physics[weaponids[0]]=1;
4015 weaponids[0]=weaponids[num_weapons];
4016 if(weaponstuck==num_weapons)weaponstuck=0;
4019 for(i=0;i<numplayers;i++){
4020 player[i].wentforweapon=0;
4032 if(!dead&&creature==wolftype){
4033 award_bonus(0, Wolfbonus);
4036 if(targetanimation==knifefollowedanim&&!skeleton.free){
4037 for(i=0;i<skeleton.num_joints;i++){
4038 skeleton.joints[i].velocity=0;
4039 skeleton.joints[i].velocity.y=-2;
4042 if(id!=0&&unconscioustime>.1){
4050 if(texupdatedelay<0&&bleeding>0&&bloodtoggle==2&&findDistancefast(&viewer,&coords)<9){
4053 bloodsize=5-realtexdetail;
4057 texdetailint=realtexdetail;
4058 startx=bleedy;//abs(Random()%(skeleton.skinsize-bloodsize-1));
4059 starty=bleedx;//abs(Random()%(skeleton.skinsize-bloodsize-1));
4060 endx=startx+bloodsize;
4061 endy=starty+bloodsize;
4063 if(startx<0){startx=0;bleeding=0;}
4064 if(starty<0){starty=0;bleeding=0;}
4065 if(endx>skeleton.skinsize-1){endx=skeleton.skinsize-1;bleeding=0;}
4066 if(endy>skeleton.skinsize-1){endy=skeleton.skinsize-1;bleeding=0;}
4067 if(endx<startx)endx=startx;
4068 if(endy<starty)endy=starty;
4070 for(i=startx;i<endx;i++){
4071 for(j=starty;j<endy;j++){
4073 color=Random()%85+170;
4074 if(skeleton.skinText[i*skeleton.skinsize*3+j*3+0]>color/2)skeleton.skinText[i*skeleton.skinsize*3+j*3+0]=color/2;
4075 skeleton.skinText[i*skeleton.skinsize*3+j*3+1]=0;
4076 skeleton.skinText[i*skeleton.skinsize*3+j*3+2]=0;
4081 glBindTexture(GL_TEXTURE_2D,skeleton.drawmodel.textureptr);
4082 DoMipmaps(0,startx,endx,starty,endy);
4086 bleedy-=4/realtexdetail;
4087 if(detail==2)bleedx+=(abs(Random()%3)-1)*2/realtexdetail;
4088 else bleedx+=(abs(Random()%3)-1)*4/realtexdetail;
4091 bleedx+=4*direction/realtexdetail;
4092 if(detail==2)bleedy+=(abs(Random()%3)-1)*2/realtexdetail;
4093 else bleedy+=(abs(Random()%3)-1)*4/realtexdetail;
4097 if(abs(righthandmorphness-targetrighthandmorphness)<multiplier*4){
4098 righthandmorphness=targetrighthandmorphness;
4099 righthandmorphstart=righthandmorphend;
4101 else if(righthandmorphness>targetrighthandmorphness){
4102 righthandmorphness-=multiplier*4;
4104 else if(righthandmorphness<targetrighthandmorphness){
4105 righthandmorphness+=multiplier*4;
4108 if(abs(lefthandmorphness-targetlefthandmorphness)<multiplier*4){
4109 lefthandmorphness=targetlefthandmorphness;
4110 lefthandmorphstart=lefthandmorphend;
4112 else if(lefthandmorphness>targetlefthandmorphness){
4113 lefthandmorphness-=multiplier*4;
4115 else if(lefthandmorphness<targetlefthandmorphness){
4116 lefthandmorphness+=multiplier*4;
4119 if(creature==rabbittype||targettailmorphness==5||targettailmorphness==0){
4120 if(abs(tailmorphness-targettailmorphness)<multiplier*10){
4121 tailmorphness=targettailmorphness;
4122 tailmorphstart=tailmorphend;
4124 else if(tailmorphness>targettailmorphness){
4125 tailmorphness-=multiplier*10;
4127 else if(tailmorphness<targettailmorphness){
4128 tailmorphness+=multiplier*10;
4132 if(creature==wolftype){
4133 if(abs(tailmorphness-targettailmorphness)<multiplier*4){
4134 tailmorphness=targettailmorphness;
4135 tailmorphstart=tailmorphend;
4137 else if(tailmorphness>targettailmorphness){
4138 tailmorphness-=multiplier*2;
4140 else if(tailmorphness<targettailmorphness){
4141 tailmorphness+=multiplier*2;
4145 if(headmorphend==3||headmorphstart==3){
4146 if(abs(headmorphness-targetheadmorphness)<multiplier*7){
4147 headmorphness=targetheadmorphness;
4148 headmorphstart=headmorphend;
4150 else if(headmorphness>targetheadmorphness){
4151 headmorphness-=multiplier*7;
4153 else if(headmorphness<targetheadmorphness){
4154 headmorphness+=multiplier*7;
4157 else if(headmorphend==5||headmorphstart==5){
4158 if(abs(headmorphness-targetheadmorphness)<multiplier*10){
4159 headmorphness=targetheadmorphness;
4160 headmorphstart=headmorphend;
4162 else if(headmorphness>targetheadmorphness){
4163 headmorphness-=multiplier*10;
4165 else if(headmorphness<targetheadmorphness){
4166 headmorphness+=multiplier*10;
4170 if(abs(headmorphness-targetheadmorphness)<multiplier*4){
4171 headmorphness=targetheadmorphness;
4172 headmorphstart=headmorphend;
4174 else if(headmorphness>targetheadmorphness){
4175 headmorphness-=multiplier*4;
4177 else if(headmorphness<targetheadmorphness){
4178 headmorphness+=multiplier*4;
4182 if(abs(chestmorphness-targetchestmorphness)<multiplier){
4183 chestmorphness=targetchestmorphness;
4184 chestmorphstart=chestmorphend;
4186 else if(chestmorphness>targetchestmorphness){
4187 chestmorphness-=multiplier;
4189 else if(chestmorphness<targetchestmorphness){
4190 chestmorphness+=multiplier;
4193 if(dead!=2&&howactive<=typesleeping){
4194 if(chestmorphstart==0&&chestmorphend==0){
4196 targetchestmorphness=1;
4199 if(chestmorphstart!=0&&chestmorphend!=0){
4201 targetchestmorphness=1;
4203 if(environment==snowyenvironment){
4206 if(!skeleton.free)footvel=DoRotation(skeleton.specialforward[0],0,rotation,0)*-1;
4207 if(skeleton.free)footvel=skeleton.specialforward[0]*-1;
4208 if(!skeleton.free)footpoint=DoRotation((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2,0,rotation,0)*scale+coords;
4209 if(skeleton.free)footpoint=((skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2)*scale+coords;
4210 if(targetanimation==sleepanim)footvel=DoRotation(footvel,0,90,0);
4211 Sprite::MakeSprite(breathsprite, footpoint+footvel*.2,footvel*.4, 1,1,1, .4, .3);
4215 if(!dead&&howactive<typesleeping){
4216 blinkdelay-=multiplier*2;
4217 if(headmorphstart==0&&headmorphend==0&&blinkdelay<=0){
4219 targetheadmorphness=1;
4221 blinkdelay=(float)(abs(Random()%40))/5;
4223 if(headmorphstart==3&&headmorphend==3){
4225 targetheadmorphness=1;
4230 twitchdelay-=multiplier*1.5;
4231 if(targetanimation!=hurtidleanim){
4232 if(headmorphstart==0&&headmorphend==0&&twitchdelay<=0){
4234 targetheadmorphness=1;
4236 twitchdelay=(float)(abs(Random()%40))/5;
4238 if(headmorphstart==5&&headmorphend==5){
4240 targetheadmorphness=1;
4244 if((isIdle()||isCrouch())&&targetanimation!=hurtidleanim){
4245 twitchdelay3-=multiplier*1;
4247 if(righthandmorphstart==0&&righthandmorphend==0&&twitchdelay3<=0){
4248 righthandmorphness=0;
4249 targetrighthandmorphness=1;
4250 righthandmorphend=1;
4251 if(Random()%2==0)twitchdelay3=(float)(abs(Random()%40))/5;
4253 if(righthandmorphstart==1&&righthandmorphend==1){
4254 righthandmorphness=0;
4255 targetrighthandmorphness=1;
4256 righthandmorphend=0;
4260 if(lefthandmorphstart==0&&lefthandmorphend==0&&twitchdelay3<=0){
4261 lefthandmorphness=0;
4262 targetlefthandmorphness=1;
4264 twitchdelay3=(float)(abs(Random()%40))/5;
4266 if(lefthandmorphstart==1&&lefthandmorphend==1){
4267 lefthandmorphness=0;
4268 targetlefthandmorphness=1;
4275 if(creature==rabbittype){
4276 if(howactive<typesleeping)twitchdelay2-=multiplier*1.5;
4277 else twitchdelay2-=multiplier*0.5;
4278 if(howactive<=typesleeping){
4279 if(tailmorphstart==0&&tailmorphend==0&&twitchdelay2<=0){
4281 targettailmorphness=1;
4283 twitchdelay2=(float)(abs(Random()%40))/5;
4285 if(tailmorphstart==1&&tailmorphend==1){
4287 targettailmorphness=1;
4290 if(tailmorphstart==2&&tailmorphend==2){
4292 targettailmorphness=1;
4299 if(creature==wolftype){
4300 twitchdelay2-=multiplier*1.5;
4302 if((isRun()||targetanimation==jumpupanim||targetanimation==jumpdownanim||targetanimation==backflipanim)&&!skeleton.free){
4304 targettailmorphness=1;
4309 if(targetanimation==flipanim||targetanimation==frontflipanim||targetanimation==rollanim||skeleton.free){
4311 targettailmorphness=1;
4315 if(twitchdelay2<=0){
4316 if(((tailmorphstart==0&&tailmorphend==0)||(tailmorphstart==5&&tailmorphend==5))){
4318 targettailmorphness=1;
4321 if(tailmorphstart==1&&tailmorphend==1){
4323 targettailmorphness=1;
4326 if(tailmorphstart==2&&tailmorphend==2){
4328 targettailmorphness=1;
4331 if(tailmorphstart==3&&tailmorphend==3){
4333 targettailmorphness=1;
4336 if(tailmorphstart==4&&tailmorphend==4){
4338 targettailmorphness=1;
4344 if(dead!=1)unconscioustime=0;
4346 if(dead==1||howactive==typesleeping){
4347 unconscioustime+=multiplier;
4348 //If unconscious, close eyes and mouth
4349 if(righthandmorphend!=0)righthandmorphness=0;
4350 righthandmorphend=0;
4351 targetrighthandmorphness=1;
4353 if(lefthandmorphend!=0)lefthandmorphness=0;
4355 targetlefthandmorphness=1;
4357 if(headmorphend!=3&&headmorphend!=5)headmorphness=0;
4359 targetheadmorphness=1;
4363 if(howactive>typesleeping){
4366 if(bloodtoggle&&!bled){
4367 terrain.MakeDecal(blooddecalslow,headpoint,.8,.5,0);
4369 if(bloodtoggle&&!bled)
4370 for(l=0;l<terrain.patchobjectnum[whichpatchx][whichpatchz];l++){
4371 j=terrain.patchobjects[whichpatchx][whichpatchz][l];
4372 XYZ point=DoRotation(headpoint-objects.position[j],0,-objects.rotation[j],0);
4376 objects.model[j].MakeDecal(blooddecalslow,&point,&size,&opacity,&rotation);
4381 if(dead==2||howactive>typesleeping){
4382 //If dead, open mouth and hands
4383 if(righthandmorphend!=0)righthandmorphness=0;
4384 righthandmorphend=0;
4385 targetrighthandmorphness=1;
4387 if(lefthandmorphend!=0)lefthandmorphness=0;
4389 targetlefthandmorphness=1;
4391 if(headmorphend!=2)headmorphness=0;
4393 targetheadmorphness=1;
4396 if(stunned>0&&!dead&&headmorphend!=2){
4397 if(headmorphend!=4)headmorphness=0;
4399 targetheadmorphness=1;
4402 if(damage>damagetolerance&&!dead){
4407 if(creature==wolftype){
4408 award_bonus(0, Wolfbonus);
4413 if(weaponactive!=-1){
4414 weapons.owner[weaponids[0]]=-1;
4415 weapons.velocity[weaponids[0]]=velocity*scale*-.3;
4416 weapons.velocity[weaponids[0]].x+=.01;
4417 weapons.tipvelocity[weaponids[0]]=velocity*scale;
4418 weapons.missed[weaponids[0]]=1;
4419 weapons.hitsomething[weaponids[0]]=0;
4420 weapons.freetime[weaponids[0]]=0;
4421 weapons.firstfree[weaponids[0]]=1;
4422 weapons.physics[weaponids[0]]=1;
4425 weaponids[0]=weaponids[num_weapons];
4426 if(weaponstuck==num_weapons)weaponstuck=0;
4429 for(i=0;i<numplayers;i++){
4430 player[i].wentforweapon=0;
4436 if((id==0||findDistancefast(&coords,&viewer)<50)&&autoslomo){
4444 //if(dead)damage-=multiplier/4;
4445 if(!dead)damage-=multiplier*13;
4446 //if(!dead&&deathbleeding<=0&&id==0)bloodloss-=multiplier*4;
4447 if(!dead)permanentdamage-=multiplier*4;
4448 if(isIdle()||isCrouch()){
4449 if(!dead)permanentdamage-=multiplier*4;
4450 //if(!dead&&deathbleeding<=0&&id==0)bloodloss-=multiplier*4;
4452 if(damage<0)damage=0;
4453 if(permanentdamage<0)permanentdamage=0;
4454 if(superpermanentdamage<0)superpermanentdamage=0;
4455 if(permanentdamage<superpermanentdamage){
4456 permanentdamage=superpermanentdamage;
4458 if(damage<permanentdamage){
4459 damage=permanentdamage;
4461 if(dead==1&&damage<damagetolerance){
4465 for(i=0;i<skeleton.num_joints;i++){
4466 skeleton.joints[i].velocity=0;
4469 if(permanentdamage>damagetolerance&&dead!=2){
4472 if(weaponactive!=-1){
4473 weapons.owner[weaponids[0]]=-1;
4474 weapons.velocity[weaponids[0]]=velocity*scale*-.3;
4475 weapons.velocity[weaponids[0]].x+=.01;
4476 weapons.tipvelocity[weaponids[0]]=velocity*scale;
4477 weapons.missed[weaponids[0]]=1;
4478 weapons.hitsomething[weaponids[0]]=0;
4479 weapons.freetime[weaponids[0]]=0;
4480 weapons.firstfree[weaponids[0]]=1;
4481 weapons.physics[weaponids[0]]=1;
4484 weaponids[0]=weaponids[num_weapons];
4485 if(weaponstuck==num_weapons)weaponstuck=0;
4488 for(i=0;i<numplayers;i++){
4489 player[i].wentforweapon=0;
4495 if(!dead&&creature==wolftype){
4496 award_bonus(0, Wolfbonus);
4499 if(unconscioustime<.1&&(bonus!=spinecrusher||bonustime>1)&&(bonus!=FinishedBonus||bonustime>1)&&bloodloss<damagetolerance)
4500 award_bonus(id, touchofdeath);
4501 if(id!=0&&unconscioustime>.1){
4509 emit_sound_at(breaksound, coords);
4510 /*if(id==0||findDistancefast(&coords,&viewer)<50){
4516 if(skeleton.free==1){
4517 if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
4520 //If knocked over, open hands and close mouth
4521 if(righthandmorphend!=0)righthandmorphness=0;
4522 righthandmorphend=0;
4523 targetrighthandmorphness=1;
4525 if(lefthandmorphend!=0)lefthandmorphness=0;
4527 targetlefthandmorphness=1;
4529 if(headmorphend!=3&&headmorphend!=5&&headmorphstart!=3&&headmorphstart!=5){
4530 if(headmorphend!=0)headmorphness=0;
4532 targetheadmorphness=1;
4536 skeleton.DoGravity(&scale);
4538 damageamount=skeleton.DoConstraints(&coords,&scale)*5;
4539 if(damage>damagetolerance-damageamount&&!dead&&(bonus!=spinecrusher||bonustime>1)&&(bonus!=style||bonustime>1)&&(bonus!=cannon||bonustime>1))
4540 award_bonus(id, deepimpact);
4541 DoDamage(damageamount/((protectionhigh+protectionhead+protectionlow)/3));
4545 for(j=0;j<skeleton.num_joints;j++){
4546 average+=skeleton.joints[j].position;
4550 coords+=average*scale;
4551 for(j=0;j<skeleton.num_joints;j++){
4552 skeleton.joints[j].position-=average;
4554 average/=multiplier;
4556 //velocity=skeleton.joints[skeleton.jointlabels[groin]].velocity*scale;
4558 for(i=0;i<skeleton.num_joints;i++){
4559 velocity+=skeleton.joints[i].velocity*scale;
4561 velocity/=skeleton.num_joints;
4563 if(!isnormal(velocity.x)&&velocity.x){
4576 if(findLength(&average)<10&&dead&&skeleton.free){
4577 skeleton.longdead+=(2000-findLength(&average))*multiplier+multiplier;
4578 if(skeleton.longdead>2000){
4579 if(skeleton.longdead>6000){
4580 if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
4585 if(dead==2&&bloodloss<damagetolerance){
4587 headpoint=(skeleton.joints[skeleton.jointlabels[head]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2*scale+coords;
4589 if(bloodtoggle&&!bled){
4590 terrain.MakeDecal(blooddecal,headpoint,.2*1.2,.5,0);
4592 if(bloodtoggle&&!bled)
4593 for(l=0;l<terrain.patchobjectnum[whichpatchx][whichpatchz];l++){
4594 j=terrain.patchobjects[whichpatchx][whichpatchz][l];
4595 XYZ point=DoRotation(headpoint-objects.position[j],0,-objects.rotation[j],0);
4599 objects.model[j].MakeDecal(blooddecal,&point,&size,&opacity,&rotation);
4603 if(dead==2&&bloodloss>=damagetolerance){
4605 headpoint=(skeleton.joints[skeleton.jointlabels[abdomen]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2*scale+coords;
4606 if(bleeding<=0)DoBlood(1,255);
4607 if(bloodtoggle&&!bled){
4608 terrain.MakeDecal(blooddecalslow,headpoint,.8,.5,0);
4610 if(bloodtoggle&&!bled)
4611 for(l=0;l<terrain.patchobjectnum[whichpatchx][whichpatchz];l++){
4612 j=terrain.patchobjects[whichpatchx][whichpatchz][l];
4613 XYZ point=DoRotation(headpoint-objects.position[j],0,-objects.rotation[j],0);
4617 objects.model[j].MakeDecal(blooddecalslow,&point,&size,&opacity,&rotation);
4624 if(!dead&&crouchkeydown&&skeleton.freetime>.5&&id==0&&skeleton.free){
4626 XYZ startpoint,endpoint,colpoint,colviewer,coltarget;
4630 if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)canrecover=0;
4631 if(velocity.y<-30)canrecover=0;
4632 for(i=0;i<objects.numobjects;i++){
4633 if(objects.type[i]!=treeleavestype&&objects.type[i]!=bushtype&&objects.type[i]!=firetype){
4634 colviewer=startpoint;
4636 if(objects.model[i].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[i],&objects.rotation[i])!=-1)canrecover=0;
4644 terrainnormal=skeleton.joints[skeleton.jointlabels[groin]].position-skeleton.joints[skeleton.jointlabels[abdomen]].position;
4645 if(skeleton.joints[skeleton.jointlabels[groin]].locked&&skeleton.joints[skeleton.jointlabels[abdomen]].locked){
4646 terrainnormal=skeleton.joints[skeleton.jointlabels[groin]].position-skeleton.joints[skeleton.jointlabels[abdomen]].position;
4647 middle=(skeleton.joints[skeleton.jointlabels[groin]].position+skeleton.joints[skeleton.jointlabels[abdomen]].position)/2;
4649 if(skeleton.joints[skeleton.jointlabels[abdomen]].locked&&skeleton.joints[skeleton.jointlabels[neck]].locked){
4650 terrainnormal=skeleton.joints[skeleton.jointlabels[abdomen]].position-skeleton.joints[skeleton.jointlabels[neck]].position;
4651 middle=(skeleton.joints[skeleton.jointlabels[neck]].position+skeleton.joints[skeleton.jointlabels[abdomen]].position)/2;
4653 if(skeleton.joints[skeleton.jointlabels[groin]].locked&&skeleton.joints[skeleton.jointlabels[neck]].locked){
4654 terrainnormal=skeleton.joints[skeleton.jointlabels[groin]].position-skeleton.joints[skeleton.jointlabels[neck]].position;
4655 middle=(skeleton.joints[skeleton.jointlabels[groin]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2;
4657 Normalise(&terrainnormal);
4659 targetrotation=-asin(0-terrainnormal.x);
4660 targetrotation*=360/6.28;
4661 if(terrainnormal.z<0)targetrotation=180-targetrotation;
4662 rotation=targetrotation;
4666 targetanimation=flipanim;
4667 crouchtogglekeydown=1;
4672 currentanimation=tempanim;
4675 //tilt2=targettilt2;
4677 //if(middle.y>0)targetoffset.y=middle.y+1;
4679 for(i=0;i<skeleton.num_joints;i++){
4680 tempanimation.position[i][0]=skeleton.joints[i].position;
4681 tempanimation.position[i][0]=DoRotation(tempanimation.position[i][0],0,-rotation,0);
4686 if(findLength(&average)<10&&!dead&&skeleton.free){
4687 skeleton.longdead+=(2000-findLength(&average))*multiplier+multiplier;
4688 if(skeleton.longdead>(damage+500)*1.5){
4689 if(id==0)OPENAL_SetPaused(channels[whooshsound], true);
4695 terrainnormal=skeleton.joints[skeleton.jointlabels[groin]].position-skeleton.joints[skeleton.jointlabels[abdomen]].position;
4696 if(skeleton.joints[skeleton.jointlabels[groin]].locked&&skeleton.joints[skeleton.jointlabels[abdomen]].locked){
4697 terrainnormal=skeleton.joints[skeleton.jointlabels[groin]].position-skeleton.joints[skeleton.jointlabels[abdomen]].position;
4698 middle=(skeleton.joints[skeleton.jointlabels[groin]].position+skeleton.joints[skeleton.jointlabels[abdomen]].position)/2;
4700 if(skeleton.joints[skeleton.jointlabels[abdomen]].locked&&skeleton.joints[skeleton.jointlabels[neck]].locked){
4701 terrainnormal=skeleton.joints[skeleton.jointlabels[abdomen]].position-skeleton.joints[skeleton.jointlabels[neck]].position;
4702 middle=(skeleton.joints[skeleton.jointlabels[neck]].position+skeleton.joints[skeleton.jointlabels[abdomen]].position)/2;
4704 if(skeleton.joints[skeleton.jointlabels[groin]].locked&&skeleton.joints[skeleton.jointlabels[neck]].locked){
4705 terrainnormal=skeleton.joints[skeleton.jointlabels[groin]].position-skeleton.joints[skeleton.jointlabels[neck]].position;
4706 middle=(skeleton.joints[skeleton.jointlabels[groin]].position+skeleton.joints[skeleton.jointlabels[neck]].position)/2;
4708 Normalise(&terrainnormal);
4710 targetrotation=-asin(0-terrainnormal.x);
4711 targetrotation*=360/6.28;
4712 if(terrainnormal.z<0)targetrotation=180-targetrotation;
4713 rotation=targetrotation;
4716 terrainnormal=terrain.getNormal(coords.x,coords.z);
4717 targettilt2=asin(terrainnormal.y)*180/3.14*-1;
4721 /*XYZ otherterrainnormal;
4722 otherterrainnormal=terrain.getNormal(coords.x,coords.y);
4723 otherterrainnormal.y=fast_sqrt(otherterrainnormal.x*otherterrainnormal.x+otherterrainnormal.z*otherterrainnormal.z)*-1;
4724 if(abs(terrainnormal.y)<abs(otherterrainnormal.y))terrainnormal.y=fast_sqrt(otherterrainnormal.x*otherterrainnormal.x+otherterrainnormal.z*otherterrainnormal.z)*-1;
4725 targettilt2=asin(otherterrainnormal.y)*180/3.14;
4728 targettilt2=asin(terrainnormal.y)*180/3.14*-1;
4732 if(skeleton.forward.y<0){
4733 targetanimation=getupfrombackanim;
4737 if(skeleton.forward.y>-.3){
4738 targetanimation=getupfromfrontanim;
4740 targetrotation+=180;
4746 if((Random()%8==0&&id!=0&&creature==rabbittype)||(Random()%2==0&&id!=0&&creature==wolftype)||(id==0&&crouchkeydown&&(forwardkeydown||backkeydown||leftkeydown||rightkeydown))){
4747 targetanimation=rollanim;
4748 targetrotation=lookrotation;
4752 if(forwardkeydown)targetrotation+=45;
4753 if(backkeydown)targetrotation-=45;
4757 if(forwardkeydown)targetrotation-=45;
4758 if(backkeydown)targetrotation+=45;
4761 if ( !leftkeydown&&!rightkeydown)
4762 targetrotation+=180;
4764 targetrotation+=180;
4768 if(abs(targettilt2)>50)targettilt2=0;
4769 currentanimation=tempanim;
4774 if(middle.y>0&&targetanimation!=rollanim)targetoffset.y=middle.y+1;
4776 for(i=0;i<skeleton.num_joints;i++){
4777 tempanimation.position[i][0]=skeleton.joints[i].position;
4778 tempanimation.position[i][0]=DoRotation(tempanimation.position[i][0],0,-rotation,0);
4785 if(num_weapons>0)if(weapons.type[0]==staff)hasstaff=1;
4786 if(!skeleton.freefall&&freefall&&((jumpkeydown&&jumpkeydowntime<.2)||(hasstaff&&rabbitkickragdoll))&&!dead){
4789 tempvelocity=velocity;
4790 Normalise(&tempvelocity);
4791 targetrotation=-asin(0-tempvelocity.x);
4792 targetrotation*=360/6.28;
4793 if(velocity.z<0)targetrotation=180-targetrotation;
4794 //targetrotation+=180;
4797 if(dotproduct(&skeleton.forward,&tempvelocity)<0){
4798 targetanimation=rollanim;
4802 targetanimation=backhandspringanim;
4803 targetrotation+=180;
4808 emit_sound_at(movewhooshsound, coords, 128.);
4810 currentanimation=targetanimation;
4811 currentframe=targetframe-1;
4816 rotation=targetrotation;
4823 if(skeleton.freefall==0)freefall=0;
4825 if(!isnormal(velocity.x)&&velocity.x){
4830 if(aitype!=passivetype||skeleton.free==1)
4831 if(findLengthfast(&velocity)>.1)
4832 for(i=0;i<objects.numobjects;i++){
4833 if(objects.type[i]==firetype)
4834 if(findDistancefastflat(&coords,&objects.position[i])<objects.scale[i]*objects.scale[i]*12&&findDistancefast(&coords,&objects.position[i])<objects.scale[i]*objects.scale[i]*49){
4836 if(!objects.onfire[i]){
4837 emit_sound_at(firestartsound, objects.position[i]);
4839 objects.onfire[i]=1;
4842 if(objects.onfire[i]){
4847 if(objects.type[i]==bushtype)
4848 if(findDistancefastflat(&coords,&objects.position[i])<objects.scale[i]*objects.scale[i]*12&&findDistancefast(&coords,&objects.position[i])<objects.scale[i]*objects.scale[i]*49){
4850 if(!objects.onfire[i]){
4851 emit_sound_at(firestartsound, objects.position[i]);
4853 objects.onfire[i]=1;
4857 if(objects.onfire[i]){
4861 if(objects.messedwith[i]<=0){
4865 emit_sound_at(bushrustle, coords, 40*findLength(&velocity));
4868 envsound[numenvsounds]=coords;
4869 envsoundvol[numenvsounds]=4*findLength(&velocity);
4870 envsoundlife[numenvsounds]=.4;
4875 if(environment==grassyenvironment)howmany=findLength(&velocity)*4;
4876 if(environment==snowyenvironment)howmany=findLength(&velocity)*2;
4878 if(environment!=desertenvironment)
4879 for(j=0;j<howmany;j++){
4880 tempvel.x=float(abs(Random()%100)-50)/20;
4881 tempvel.y=float(abs(Random()%100)-50)/20;
4882 tempvel.z=float(abs(Random()%100)-50)/20;
4885 pos.x+=float(abs(Random()%100)-50)/200;
4886 pos.y+=float(abs(Random()%100)-50)/200;
4887 pos.z+=float(abs(Random()%100)-50)/200;
4888 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);
4889 Sprite::setLastSpriteSpecial(1);
4891 howmany=findLength(&velocity)*4;
4893 if(environment==snowyenvironment)
4894 for(j=0;j<howmany;j++){
4895 tempvel.x=float(abs(Random()%100)-50)/20;
4896 tempvel.y=float(abs(Random()%100)-50)/20;
4897 tempvel.z=float(abs(Random()%100)-50)/20;
4900 pos.x+=float(abs(Random()%100)-50)/200;
4901 pos.y+=float(abs(Random()%100)-50)/200;
4902 pos.z+=float(abs(Random()%100)-50)/200;
4903 Sprite::MakeSprite(splintersprite, pos,tempvel*.3+velocity*float(abs(Random()%100))/100/2, 1,1,1, .1, 1);
4904 Sprite::setLastSpriteSpecial(2);
4907 objects.rotx[i]+=velocity.x*multiplier*6;
4908 objects.roty[i]+=velocity.z*multiplier*6;
4909 objects.messedwith[i]=.5;
4912 if(objects.type[i]==treeleavestype&&environment!=desertenvironment){
4913 if(objects.rotation2[i]==0)tempcoord=coords;
4915 tempcoord=coords-objects.position[i];
4916 tempcoord=DoRotation(tempcoord,0,-objects.rotation[i],0);
4917 tempcoord=DoRotation(tempcoord,-objects.rotation2[i],0,0);
4918 tempcoord+=objects.position[i];
4920 if(findDistancefastflat(&tempcoord,&objects.position[i])<objects.scale[i]*objects.scale[i]*8&&findDistancefast(&tempcoord,&objects.position[i])<objects.scale[i]*objects.scale[i]*300&&tempcoord.y>objects.position[i].y+3*objects.scale[i]){
4921 if(objects.messedwith[i]<=0){
4925 emit_sound_at(bushrustle, coords, 40*findLength(&velocity));
4928 envsound[numenvsounds]=coords;
4929 envsoundvol[numenvsounds]=4*findLength(&velocity);
4930 envsoundlife[numenvsounds]=.4;
4935 if(environment==grassyenvironment)howmany=findLength(&velocity)*4;
4936 if(environment==snowyenvironment)howmany=findLength(&velocity)*2;
4938 if(environment!=desertenvironment)
4939 for(j=0;j<howmany;j++){
4940 tempvel.x=float(abs(Random()%100)-50)/20;
4941 tempvel.y=float(abs(Random()%100)-50)/20;
4942 tempvel.z=float(abs(Random()%100)-50)/20;
4946 pos.x+=float(abs(Random()%100)-50)/150;
4947 pos.y+=float(abs(Random()%100)-50)/150;
4948 pos.z+=float(abs(Random()%100)-50)/150;
4949 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);
4950 Sprite::setLastSpriteSpecial(1);
4952 howmany=findLength(&velocity)*4;
4954 if(environment==snowyenvironment)
4955 for(j=0;j<howmany;j++){
4956 tempvel.x=float(abs(Random()%100)-50)/20;
4957 tempvel.y=float(abs(Random()%100)-50)/20;
4958 tempvel.z=float(abs(Random()%100)-50)/20;
4962 pos.x+=float(abs(Random()%100)-50)/150;
4963 pos.y+=float(abs(Random()%100)-50)/150;
4964 pos.z+=float(abs(Random()%100)-50)/150;
4965 Sprite::MakeSprite(splintersprite, pos,tempvel*.3+velocity*float(abs(Random()%100))/100/2, 1,1,1, .1, 1);
4966 Sprite::setLastSpriteSpecial(2);
4969 objects.messedwith[i]=.5;
4977 if((stunned>0||surprised>0)&&numplayers>2&&aitype!=passivetype)play=1;
4979 if(aitype!=passivetype&&victim->skeleton.free&&!victim->dead)play=1;
4980 if(tutoriallevel==1&&id!=0)play=0;
4981 if(play&&aitype!=playercontrolled){
4985 if(creature==rabbittype){
4986 if(i==0)whichsound=rabbitchitter;
4987 if(i==1)whichsound=rabbitchitter2;
4989 if(creature==wolftype){
4990 if(i==0)whichsound=growlsound;
4991 if(i==1)whichsound=growl2sound;
4997 emit_sound_at(whichsound, coords);
5001 if(targetanimation==staggerbackhighanim)staggerdelay=1;
5002 if(targetanimation==staggerbackhardanim)staggerdelay=1;
5003 staggerdelay-=multiplier;
5004 if(targetanimation!=crouchstabanim&&targetanimation!=swordgroundstabanim&&targetanimation!=staffgroundsmashanim)hasvictim=1;
5005 if(velocity.y<-30&&targetanimation==jumpdownanim)RagDoll(0);
5006 if(currentanimation!=getIdle()&&wasIdle()&&targetanimation!=getIdle()&&isIdle()){
5007 targetanimation=getIdle();
5011 weaponmissdelay-=multiplier;
5012 highreversaldelay-=multiplier;
5013 lowreversaldelay-=multiplier;
5014 lastcollide-=multiplier;
5015 skiddelay-=multiplier;
5016 if(!isnormal(velocity.x)&&velocity.x){
5019 if(!isnormal(targettilt)&&targettilt){
5022 if(!isnormal(targettilt2)&&targettilt2){
5025 if(!isnormal(targetrotation)&&targetrotation){
5029 if(targetanimation==bounceidleanim||targetanimation==wolfidle||targetanimation==walkanim||targetanimation==drawrightanim||targetanimation==crouchdrawrightanim||targetanimation==drawleftanim||targetanimation==fightidleanim||targetanimation==fightsidestep||targetanimation==hanganim||isCrouch()||targetanimation==backhandspringanim){
5030 //open hands and close mouth
5031 if(righthandmorphend!=0&&righthandmorphness==targetrighthandmorphness){
5032 righthandmorphness=0;
5033 righthandmorphend=0;
5034 targetrighthandmorphness=1;
5037 if(lefthandmorphend!=0&&lefthandmorphness==targetlefthandmorphness){
5038 lefthandmorphness=0;
5040 targetlefthandmorphness=1;
5043 if(headmorphend!=3&&headmorphend!=5&&headmorphstart!=3&&headmorphstart!=5&&headmorphend!=0&&headmorphness==targetheadmorphness){
5046 targetheadmorphness=1;
5050 if(targetanimation==rollanim||targetanimation==dodgebackanim||targetanimation==removeknifeanim||targetanimation==knifefightidleanim||targetanimation==swordfightidleanim||targetanimation==blockhighleftstrikeanim||targetanimation==crouchremoveknifeanim||targetanimation==sneakanim||targetanimation==sweepanim||targetanimation==spinkickreversedanim||targetanimation==jumpdownanim||isWallJump()||isFlip()||targetanimation==climbanim||isRun()||targetanimation==getupfrombackanim||targetanimation==getupfromfrontanim){
5051 //open hands and mouth
5052 if(righthandmorphend!=0&&righthandmorphness==targetrighthandmorphness){
5053 righthandmorphness=0;
5054 righthandmorphend=0;
5055 targetrighthandmorphness=1;
5058 if(lefthandmorphend!=0&&lefthandmorphness==targetlefthandmorphness){
5059 lefthandmorphness=0;
5061 targetlefthandmorphness=1;
5064 if(headmorphend!=1&&headmorphness==targetheadmorphness){
5067 targetheadmorphness=1;
5071 if(targetanimation==jumpupanim||targetanimation==crouchstabanim||targetanimation==swordgroundstabanim||targetanimation==swordfightidlebothanim||targetanimation==blockhighleftanim||targetanimation==blockhighleftanim){
5072 //close hands and mouth
5073 if(righthandmorphend!=1&&righthandmorphness==targetrighthandmorphness){
5074 righthandmorphness=0;
5075 righthandmorphend=1;
5076 targetrighthandmorphness=1;
5079 if(lefthandmorphend!=1&&lefthandmorphness==targetlefthandmorphness){
5080 lefthandmorphness=0;
5082 targetlefthandmorphness=1;
5085 if(headmorphend!=0&&headmorphness==targetheadmorphness){
5088 targetheadmorphness=1;
5092 if(targetanimation==spinkickanim||targetanimation==staffspinhitreversalanim||targetanimation==staffspinhitreversedanim||targetanimation==staffhitreversalanim||targetanimation==staffhitreversedanim||targetanimation==hurtidleanim||targetanimation==winduppunchanim||targetanimation==swordslashreversalanim||targetanimation==swordslashreversedanim||targetanimation==knifeslashreversalanim||targetanimation==knifeslashreversedanim||targetanimation==knifethrowanim||targetanimation==knifefollowanim||targetanimation==knifefollowedanim||targetanimation==killanim||targetanimation==dropkickanim||targetanimation==upunchanim||targetanimation==knifeslashstartanim||targetanimation==swordslashanim||targetanimation==staffhitanim||targetanimation==staffspinhitanim||targetanimation==staffgroundsmashanim||targetanimation==spinkickreversalanim||targetanimation==sweepreversalanim||targetanimation==lowkickanim||targetanimation==sweepreversedanim||targetanimation==rabbitkickreversalanim||targetanimation==rabbitkickreversedanim||targetanimation==jumpreversalanim||targetanimation==jumpreversedanim){
5093 //close hands and yell
5094 if(righthandmorphend!=1&&righthandmorphness==targetrighthandmorphness){
5095 righthandmorphness=0;
5096 righthandmorphend=1;
5097 targetrighthandmorphness=1;
5100 if(lefthandmorphend!=1&&lefthandmorphness==targetlefthandmorphness){
5101 lefthandmorphness=0;
5103 targetlefthandmorphness=1;
5106 if(headmorphend!=2&&headmorphness==targetheadmorphness){
5109 targetheadmorphness=1;
5113 if(speechdelay>.25){
5114 if(headmorphend!=2)headmorphness=0;
5116 targetheadmorphness=1;
5122 if(victim!=this&&!victim->dead&&victim->aitype!=passivetype&&victim->aitype!=searchtype&&aitype!=passivetype&&aitype!=searchtype&&victim->id<numplayers&&aitype!=passivetype){
5123 behind=(normaldotproduct(facing,coords-victim->coords)>0);
5127 if(!dead&&targetanimation!=hurtidleanim)
5128 if(behind||targetanimation==killanim||targetanimation==knifethrowanim||targetanimation==knifefollowanim||targetanimation==spinkickreversalanim||targetanimation==rabbitkickreversedanim||targetanimation==jumpreversedanim){
5129 if(headmorphend!=4||headmorphness==targetheadmorphness){
5132 targetheadmorphness=1;
5136 if(weaponactive!=-1){
5137 if(weapons.type[weaponids[weaponactive]]!=staff){
5138 righthandmorphstart=1;
5139 righthandmorphend=1;
5141 if(weapons.type[weaponids[weaponactive]]==staff){
5142 righthandmorphstart=2;
5143 righthandmorphend=2;
5145 targetrighthandmorphness=1;
5148 terrainnormal=terrain.getNormal(coords.x,coords.z);
5150 if(animation[targetanimation].attack!=reversal){
5151 if(!isnormal(coords.x))
5159 flatfacing=DoRotation(flatfacing,0,rotation,0);
5161 ReflectVector(&facing,terrainnormal);
5164 if(isRun()||targetanimation==sneakanim||targetanimation==rollanim||targetanimation==walkanim){
5165 if(onterrain)targettilt2=-facing.y*20;
5169 if(!isRun()&&!animation[targetanimation].attack&&targetanimation!=getupfromfrontanim&&targetanimation!=getupfrombackanim&&targetanimation!=sneakanim)targettilt2=0;
5170 if(targetanimation==jumpupanim||targetanimation==jumpdownanim||isFlip()){
5171 flatvelocity=velocity;
5173 flatvelspeed=findLength(&flatvelocity);
5174 targettilt=flatvelspeed*fast_sqrt(abs(velocity.y)*.7)*normaldotproduct(DoRotation(flatfacing,0,-90,0),flatvelocity);
5175 targettilt2=flatvelspeed*fast_sqrt(abs(velocity.y)*.7)*normaldotproduct(flatfacing,flatvelocity);
5176 if(velocity.y<0)targettilt2*=-1;
5177 if(velocity.y<0)targettilt*=-1;
5178 if(targettilt>25)targettilt=25;
5179 if(targettilt<-25)targettilt=-25;
5182 if(targettilt2>45)targettilt2=45;
5183 if(targettilt2<-45)targettilt2=-45;
5184 if(abs(tilt2-targettilt2)<multiplier*400)tilt2=targettilt2;
5185 else if(tilt2>targettilt2){
5186 tilt2-=multiplier*400;
5188 else if(tilt2<targettilt2){
5189 tilt2+=multiplier*400;
5191 if(!animation[targetanimation].attack&&targetanimation!=getupfrombackanim&&targetanimation!=getupfromfrontanim){
5192 if(tilt2>25)tilt2=25;
5193 if(tilt2<-25)tilt2=-25;
5196 if(!isnormal(targettilt)&&targettilt){
5199 if(!isnormal(targettilt2)&&targettilt2){
5204 //if(!creature==wolftype||targetanimation==rabbitkickanim)
5205 if(targetanimation==rabbittackleanim){
5206 velocity+=facing*multiplier*speed*700*scale;
5207 velspeed=findLength(&velocity);
5208 if(velspeed>speed*65*scale){
5210 velspeed=speed*65*scale;
5213 velocity.y+=gravity*multiplier*20;
5214 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5215 velspeed=findLength(&velocity);
5216 velocity=flatfacing*velspeed;
5218 if(targetanimation!=rabbitrunninganim&&targetanimation!=wolfrunninganim){
5219 if(isRun()||targetanimation==rabbitkickanim){
5220 velocity+=facing*multiplier*speed*700*scale;
5221 velspeed=findLength(&velocity);
5222 if(velspeed>speed*45*scale){
5224 velspeed=speed*45*scale;
5227 velocity.y+=gravity*multiplier*20;
5228 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5229 velspeed=findLength(&velocity);
5230 if(velspeed<speed*30*scale)velspeed=speed*30*scale;
5231 velocity=flatfacing*velspeed;
5235 velocity+=facing*multiplier*speed*700*scale;
5236 velspeed=findLength(&velocity);
5237 if(creature==rabbittype){
5238 if(velspeed>speed*55*scale){
5240 velspeed=speed*55*scale;
5244 if(creature==wolftype){
5245 if(velspeed>speed*75*scale){
5247 velspeed=speed*75*scale;
5251 velocity.y+=gravity*multiplier*20;
5252 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5253 velspeed=findLength(&velocity);
5254 velocity=flatfacing*velspeed;
5257 if(targetanimation==rollanim&&animation[targetanimation].label[targetframe]!=6){
5258 velocity+=facing*multiplier*speed*700*scale;
5259 velspeed=findLength(&velocity);
5260 if(velspeed>speed*45*scale){
5262 velspeed=speed*45*scale;
5265 velocity.y+=gravity*multiplier*20;
5266 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5267 velspeed=findLength(&velocity);
5268 velocity=flatfacing*velspeed;
5272 /*if(currentanimation==rollanim&&(isCrouch()||isIdle())){
5273 velocity+=facing*multiplier*speed*700*scale;
5274 velspeed=findLength(&velocity);
5275 if(velspeed>speed*25*scale){
5277 velspeed=speed*25*scale;
5280 velocity.y+=gravity*multiplier*20;
5281 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5282 velspeed=findLength(&velocity);
5283 velocity=flatfacing*velspeed;
5286 if(targetanimation==sneakanim||targetanimation==walkanim){
5287 velocity+=facing*multiplier*speed*700*scale;
5288 velspeed=findLength(&velocity);
5289 if(velspeed>speed*12*scale){
5291 velspeed=speed*12*scale;
5294 velocity.y+=gravity*multiplier*20;
5295 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5296 velspeed=findLength(&velocity);
5297 velocity=flatfacing*velspeed;
5300 if((targetanimation==fightidleanim||targetanimation==knifefightidleanim)&&(currentanimation==bounceidleanim||currentanimation==hurtidleanim)){
5301 velocity+=facing*multiplier*speed*700*scale;
5302 velspeed=findLength(&velocity);
5303 if(velspeed>speed*2*scale){
5305 velspeed=speed*2*scale;
5308 velocity.y+=gravity*multiplier*20;
5309 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5310 velspeed=findLength(&velocity);
5311 velocity=flatfacing*velspeed;
5315 if((targetanimation==bounceidleanim||currentanimation==hurtidleanim)&&(currentanimation==fightidleanim||currentanimation==knifefightidleanim)){
5316 velocity-=facing*multiplier*speed*700*scale;
5317 velspeed=findLength(&velocity);
5318 if(velspeed>speed*2*scale){
5320 velspeed=speed*2*scale;
5323 velocity.y+=gravity*multiplier*20;
5324 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5325 velspeed=findLength(&velocity);
5326 velocity=flatfacing*velspeed*-1;
5329 if(targetanimation==fightsidestep){
5330 velocity+=DoRotation(facing*multiplier*speed*700*scale,0,-90,0);
5331 velspeed=findLength(&velocity);
5332 if(velspeed>speed*12*scale){
5334 velspeed=speed*12*scale;
5337 velocity.y+=gravity*multiplier*20;
5338 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5339 velspeed=findLength(&velocity);
5340 velocity=DoRotation(flatfacing*velspeed,0,-90,0);
5343 if(targetanimation==staggerbackhighanim){
5344 coords-=facing*multiplier*speed*16*scale;
5347 if(targetanimation==staggerbackhardanim&&animation[staggerbackhardanim].label[targetframe]!=6){
5348 coords-=facing*multiplier*speed*20*scale;
5352 if(targetanimation==backhandspringanim){
5353 //coords-=facing*multiplier*50*scale;
5354 velocity+=facing*multiplier*speed*700*scale*-1;
5355 velspeed=findLength(&velocity);
5356 if(velspeed>speed*50*scale){
5358 velspeed=speed*50*scale;
5361 velocity.y+=gravity*multiplier*20;
5362 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5363 velspeed=findLength(&velocity);
5364 velocity=flatfacing*velspeed*-1;
5366 if(targetanimation==dodgebackanim){
5367 //coords-=facing*multiplier*50*scale;
5368 velocity+=facing*multiplier*speed*700*scale*-1;
5369 velspeed=findLength(&velocity);
5370 if(velspeed>speed*60*scale){
5372 velspeed=speed*60*scale;
5375 velocity.y+=gravity*multiplier*20;
5376 ReflectVector(&velocity,terrain.getNormal(coords.x,coords.z));
5377 velspeed=findLength(&velocity);
5378 velocity=flatfacing*velspeed*-1;
5381 if(targetanimation==jumpupanim||targetanimation==jumpdownanim||isFlip()){
5382 velspeed=findLength(&velocity);
5386 if(targetanimation==jumpupanim||targetanimation==jumpdownanim||isFlip()){
5387 velocity.y+=gravity*multiplier;
5390 if(targetanimation!=climbanim&&targetanimation!=hanganim&&!isWallJump())coords+=velocity*multiplier;
5392 if(coords.y<terrain.getHeight(coords.x,coords.z)&&(targetanimation==jumpdownanim||targetanimation==jumpupanim||isFlip())){
5393 if(isFlip()&&animation[targetanimation].label[targetframe]==7)RagDoll(0);
5395 if(targetanimation==jumpupanim){jumppower=-4;targetanimation=getIdle();}
5401 OPENAL_SetPaused(channels[whooshsound], true);
5402 OPENAL_SetVolume(channels[whooshsound], 0);
5405 if(targetanimation==jumpdownanim||isFlip()){
5406 if(isFlip())jumppower=-4;
5407 targetanimation=getLanding();
5408 emit_sound_at(landsound, coords, 128.);
5411 envsound[numenvsounds]=coords;
5412 envsoundvol[numenvsounds]=16;
5413 envsoundlife[numenvsounds]=.4;
5419 if(targetanimation!=jumpupanim&&targetanimation!=jumpdownanim&&!isFlip()&&targetanimation!=climbanim&&targetanimation!=hanganim&&!isWallJump())coords.y+=gravity*multiplier*2;
5420 if(targetanimation!=jumpupanim&&targetanimation!=jumpdownanim&&!isFlip()&&coords.y<terrain.getHeight(coords.x,coords.z)){
5421 coords.y=terrain.getHeight(coords.x,coords.z);
5426 if(isIdle()||targetanimation==drawrightanim||targetanimation==drawleftanim||targetanimation==crouchdrawrightanim||targetanimation==crouchstabanim||targetanimation==swordgroundstabanim||isStop()||targetanimation==removeknifeanim||targetanimation==crouchremoveknifeanim||isLanding()||isCrouch()||animation[targetanimation].attack||(targetanimation==rollanim&&animation[targetanimation].label[targetframe]==6)){
5427 velspeed=findLength(&velocity);
5429 if(velspeed<multiplier*300*scale){
5431 } else velocity-=velocity/velspeed*multiplier*300*scale;
5432 if(velspeed>5&&(isLanding()||isLandhard())){
5433 skiddingdelay+=multiplier;
5440 else skiddingdelay=0;
5444 velspeed=findLength(&velocity);
5446 if(velspeed<multiplier*600*scale){
5448 } else velocity-=velocity/velspeed*multiplier*600*scale;
5450 if(velspeed>5&&(isLanding()||isLandhard())){
5451 skiddingdelay+=multiplier;
5458 else skiddingdelay=0;
5461 if(skiddingdelay<0)skiddingdelay+=multiplier;
5462 if(skiddingdelay>.02&&!forwardkeydown&&!backkeydown&&!leftkeydown&&!rightkeydown&&!jumpkeydown&&isLanding()&&!landhard){
5464 if(!onterrain||environment==grassyenvironment){
5465 emit_sound_at(skidsound, coords, 128*velspeed/10);
5468 emit_sound_at(snowskidsound, coords, 128*velspeed/10);
5472 if(animation[targetanimation].attack==normalattack&&targetanimation!=rabbitkickanim&&!victim->skeleton.free){
5473 terrainnormal=victim->coords-coords;
5474 Normalise(&terrainnormal);
5475 targetrotation=-asin(0-terrainnormal.x);
5476 targetrotation*=360/6.28;
5477 if(terrainnormal.z<0)targetrotation=180-targetrotation;
5478 targettilt2=-asin(terrainnormal.y)*360/6.28;//*-70;
5481 if(animation[targetanimation].attack==reversal&&targetanimation!=rabbittacklinganim){
5482 targetrotation=victim->targetrotation;
5484 if(targetanimation==rabbittacklinganim){
5485 coords=victim->coords;
5488 skeleton.oldfree=skeleton.free;
5492 midterrain.x=terrain.size*terrain.scale/2;
5493 midterrain.z=terrain.size*terrain.scale/2;
5494 if(findDistancefastflat(&coords,&midterrain)>(terrain.size*terrain.scale/2-viewdistance)*(terrain.size*terrain.scale/2-viewdistance)){
5496 tempposit=coords-midterrain;
5498 Normalise(&tempposit);
5499 tempposit*=(terrain.size*terrain.scale/2-viewdistance);
5500 coords.x=tempposit.x+midterrain.x;
5501 coords.z=tempposit.z+midterrain.z;
5505 int Person::DrawSkeleton(){
5506 int oldplayerdetail;
5507 if((frustum.SphereInFrustum(coords.x,coords.y+scale*3,coords.z,scale*8)&&findDistancefast(&viewer,&coords)<viewdistance*viewdistance)||skeleton.free==3){
5508 if(onterrain&&(isIdle()||isCrouch()||wasIdle()||wasCrouch())&&!skeleton.free){
5518 glAlphaFunc(GL_GREATER, 0.0001);
5520 float terrainheight;
5522 if(!isnormal(rotation))rotation=0;
5523 if(!isnormal(tilt))tilt=0;
5524 if(!isnormal(tilt2))tilt2=0;
5525 oldplayerdetail=playerdetail;
5527 if(findDistancefast(&viewer,&coords)<viewdistance*viewdistance/32&&detail==2){
5530 if(findDistancefast(&viewer,&coords)<viewdistance*viewdistance/128&&detail==1){
5533 if(findDistancefast(&viewer,&coords)<viewdistance*viewdistance/256&&(detail!=1&&detail!=2)){
5538 if(playerdetail!=oldplayerdetail) {
5540 normalsupdatedelay=0;
5542 static float updatedelaychange;
5543 static float morphness;
5544 static float framemult;
5546 skeleton.FindForwards();
5547 if(howactive==typesittingwall){
5548 skeleton.specialforward[1]=0;
5549 skeleton.specialforward[1].z=1;
5555 static int weaponattachmuscle;
5556 static int weaponrotatemuscle,weaponrotatemuscle2;
5557 static XYZ weaponpoint;
5558 static int start,endthing;
5559 if((dead!=2||skeleton.free!=2)&&updatedelay<=0){
5560 if(!isSleeping()&&!isSitting()){
5561 if(onterrain&&((isIdle()||isCrouch()||isLanding()||isLandhard()||targetanimation==drawrightanim||targetanimation==drawleftanim||targetanimation==crouchdrawrightanim)&&(wasIdle()||wasCrouch()||wasLanding()||wasLandhard()||currentanimation==drawrightanim||currentanimation==drawleftanim||currentanimation==crouchdrawrightanim))&&!skeleton.free){
5562 XYZ point,newpoint,change,change2;
5563 point=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
5564 heightleft=terrain.getHeight(point.x,point.z)+.04;
5566 change=skeleton.joints[skeleton.jointlabels[leftankle]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5567 change2=skeleton.joints[skeleton.jointlabels[leftknee]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5568 skeleton.joints[skeleton.jointlabels[leftfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0);
5569 skeleton.joints[skeleton.jointlabels[leftankle]].position=skeleton.joints[skeleton.jointlabels[leftfoot]].position+change;
5570 skeleton.joints[skeleton.jointlabels[leftknee]].position=(skeleton.joints[skeleton.jointlabels[leftfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[leftknee]].position)/2;
5572 point=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
5573 heightright=terrain.getHeight(point.x,point.z)+.04;
5574 point.y=heightright;
5575 change=skeleton.joints[skeleton.jointlabels[rightankle]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5576 change2=skeleton.joints[skeleton.jointlabels[rightknee]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5577 skeleton.joints[skeleton.jointlabels[rightfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0);
5578 skeleton.joints[skeleton.jointlabels[rightankle]].position=skeleton.joints[skeleton.jointlabels[rightfoot]].position+change;
5579 skeleton.joints[skeleton.jointlabels[rightknee]].position=(skeleton.joints[skeleton.jointlabels[rightfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[rightknee]].position)/2;
5580 skeleton.DoConstraints(&coords,&scale);
5582 if(creature==wolftype){
5583 point=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
5584 heightleft=terrain.getHeight(point.x,point.z)+.04;
5586 change=skeleton.joints[skeleton.jointlabels[leftankle]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5587 change2=skeleton.joints[skeleton.jointlabels[leftknee]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5588 skeleton.joints[skeleton.jointlabels[leftfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0);
5589 skeleton.joints[skeleton.jointlabels[leftankle]].position=skeleton.joints[skeleton.jointlabels[leftfoot]].position+change;
5590 skeleton.joints[skeleton.jointlabels[leftknee]].position=(skeleton.joints[skeleton.jointlabels[leftfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[leftknee]].position)/2;
5592 point=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
5593 heightright=terrain.getHeight(point.x,point.z)+.04;
5594 point.y=heightright;
5595 change=skeleton.joints[skeleton.jointlabels[rightankle]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5596 change2=skeleton.joints[skeleton.jointlabels[rightknee]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5597 skeleton.joints[skeleton.jointlabels[rightfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0);
5598 skeleton.joints[skeleton.jointlabels[rightankle]].position=skeleton.joints[skeleton.jointlabels[rightfoot]].position+change;
5599 skeleton.joints[skeleton.jointlabels[rightknee]].position=(skeleton.joints[skeleton.jointlabels[rightfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[rightknee]].position)/2;
5600 skeleton.DoConstraints(&coords,&scale);
5603 if(onterrain&&((isIdle()||isCrouch()||isLanding()||isLandhard()||targetanimation==drawrightanim||targetanimation==drawleftanim||targetanimation==crouchdrawrightanim)&&!(wasIdle()||wasCrouch()||wasLanding()||wasLandhard()||currentanimation==drawrightanim||currentanimation==drawleftanim||currentanimation==crouchdrawrightanim))&&!skeleton.free){
5604 XYZ point,newpoint,change,change2;
5605 point=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
5606 heightleft=terrain.getHeight(point.x,point.z)+.04;
5608 change=skeleton.joints[skeleton.jointlabels[leftankle]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5609 change2=skeleton.joints[skeleton.jointlabels[leftknee]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5610 skeleton.joints[skeleton.jointlabels[leftfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0)*target+skeleton.joints[skeleton.jointlabels[leftfoot]].position*(1-target);
5611 skeleton.joints[skeleton.jointlabels[leftankle]].position=skeleton.joints[skeleton.jointlabels[leftfoot]].position+change;
5612 skeleton.joints[skeleton.jointlabels[leftknee]].position=(skeleton.joints[skeleton.jointlabels[leftfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[leftknee]].position)/2;
5614 point=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
5615 heightright=terrain.getHeight(point.x,point.z)+.04;
5616 point.y=heightright;
5617 change=skeleton.joints[skeleton.jointlabels[rightankle]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5618 change2=skeleton.joints[skeleton.jointlabels[rightknee]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5619 skeleton.joints[skeleton.jointlabels[rightfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0)*target+skeleton.joints[skeleton.jointlabels[rightfoot]].position*(1-target);
5620 skeleton.joints[skeleton.jointlabels[rightankle]].position=skeleton.joints[skeleton.jointlabels[rightfoot]].position+change;
5621 skeleton.joints[skeleton.jointlabels[rightknee]].position=(skeleton.joints[skeleton.jointlabels[rightfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[rightknee]].position)/2;
5622 skeleton.DoConstraints(&coords,&scale);
5624 if(creature==wolftype){
5625 point=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
5626 heightleft=terrain.getHeight(point.x,point.z)+.04;
5628 change=skeleton.joints[skeleton.jointlabels[leftankle]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5629 change2=skeleton.joints[skeleton.jointlabels[leftknee]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5630 skeleton.joints[skeleton.jointlabels[leftfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0)*target+skeleton.joints[skeleton.jointlabels[leftfoot]].position*(1-target);
5631 skeleton.joints[skeleton.jointlabels[leftankle]].position=skeleton.joints[skeleton.jointlabels[leftfoot]].position+change;
5632 skeleton.joints[skeleton.jointlabels[leftknee]].position=(skeleton.joints[skeleton.jointlabels[leftfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[leftknee]].position)/2;
5634 point=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
5635 heightright=terrain.getHeight(point.x,point.z)+.04;
5636 point.y=heightright;
5637 change=skeleton.joints[skeleton.jointlabels[rightankle]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5638 change2=skeleton.joints[skeleton.jointlabels[rightknee]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5639 skeleton.joints[skeleton.jointlabels[rightfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0)*target+skeleton.joints[skeleton.jointlabels[rightfoot]].position*(1-target);
5640 skeleton.joints[skeleton.jointlabels[rightankle]].position=skeleton.joints[skeleton.jointlabels[rightfoot]].position+change;
5641 skeleton.joints[skeleton.jointlabels[rightknee]].position=(skeleton.joints[skeleton.jointlabels[rightfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[rightknee]].position)/2;
5642 skeleton.DoConstraints(&coords,&scale);
5646 if(onterrain&&(!(isIdle()||isCrouch()||isLanding()||isLandhard()||targetanimation==drawrightanim||targetanimation==drawleftanim||targetanimation==crouchdrawrightanim)&&(wasIdle()||wasCrouch()||wasLanding()||wasLandhard()||currentanimation==drawrightanim||currentanimation==drawleftanim||currentanimation==crouchdrawrightanim))&&!skeleton.free){
5647 XYZ point,newpoint,change,change2;
5648 point=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
5649 heightleft=terrain.getHeight(point.x,point.z)+.04;
5651 change=skeleton.joints[skeleton.jointlabels[leftankle]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5652 change2=skeleton.joints[skeleton.jointlabels[leftknee]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5653 skeleton.joints[skeleton.jointlabels[leftfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0)*(1-target)+skeleton.joints[skeleton.jointlabels[leftfoot]].position*target;
5654 skeleton.joints[skeleton.jointlabels[leftankle]].position=skeleton.joints[skeleton.jointlabels[leftfoot]].position+change;
5655 skeleton.joints[skeleton.jointlabels[leftknee]].position=(skeleton.joints[skeleton.jointlabels[leftfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[leftknee]].position)/2;
5657 point=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
5658 heightright=terrain.getHeight(point.x,point.z)+.04;
5659 point.y=heightright;
5660 change=skeleton.joints[skeleton.jointlabels[rightankle]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5661 change2=skeleton.joints[skeleton.jointlabels[rightknee]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5662 skeleton.joints[skeleton.jointlabels[rightfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0)*(1-target)+skeleton.joints[skeleton.jointlabels[rightfoot]].position*target;
5663 skeleton.joints[skeleton.jointlabels[rightankle]].position=skeleton.joints[skeleton.jointlabels[rightfoot]].position+change;
5664 skeleton.joints[skeleton.jointlabels[rightknee]].position=(skeleton.joints[skeleton.jointlabels[rightfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[rightknee]].position)/2;
5665 skeleton.DoConstraints(&coords,&scale);
5667 if(creature==wolftype){
5668 point=DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position,0,rotation,0)*scale+coords;
5669 heightleft=terrain.getHeight(point.x,point.z)+.04;
5671 change=skeleton.joints[skeleton.jointlabels[leftankle]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5672 change2=skeleton.joints[skeleton.jointlabels[leftknee]].position-skeleton.joints[skeleton.jointlabels[leftfoot]].position;
5673 skeleton.joints[skeleton.jointlabels[leftfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0)*(1-target)+skeleton.joints[skeleton.jointlabels[leftfoot]].position*target;
5674 skeleton.joints[skeleton.jointlabels[leftankle]].position=skeleton.joints[skeleton.jointlabels[leftfoot]].position+change;
5675 skeleton.joints[skeleton.jointlabels[leftknee]].position=(skeleton.joints[skeleton.jointlabels[leftfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[leftknee]].position)/2;
5677 point=DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position,0,rotation,0)*scale+coords;
5678 heightright=terrain.getHeight(point.x,point.z)+.04;
5679 point.y=heightright;
5680 change=skeleton.joints[skeleton.jointlabels[rightankle]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5681 change2=skeleton.joints[skeleton.jointlabels[rightknee]].position-skeleton.joints[skeleton.jointlabels[rightfoot]].position;
5682 skeleton.joints[skeleton.jointlabels[rightfoot]].position=DoRotation((point-coords)/scale,0,-rotation,0)*(1-target)+skeleton.joints[skeleton.jointlabels[rightfoot]].position*target;
5683 skeleton.joints[skeleton.jointlabels[rightankle]].position=skeleton.joints[skeleton.jointlabels[rightfoot]].position+change;
5684 skeleton.joints[skeleton.jointlabels[rightknee]].position=(skeleton.joints[skeleton.jointlabels[rightfoot]].position+change2)/2+(skeleton.joints[skeleton.jointlabels[rightknee]].position)/2;
5685 skeleton.DoConstraints(&coords,&scale);
5689 if(!skeleton.free&&(!animation[targetanimation].attack&&targetanimation!=getupfrombackanim&&((targetanimation!=rollanim&&!isFlip())||animation[targetanimation].label[targetframe]==6)&&targetanimation!=getupfromfrontanim&&targetanimation!=wolfrunninganim&&targetanimation!=rabbitrunninganim&&targetanimation!=backhandspringanim&&targetanimation!=walljumpfrontanim&&targetanimation!=hurtidleanim&&!isLandhard()&&!isSleeping()))
5692 targetheadrotation=-targetrotation;
5693 targetheadrotation2=0;
5694 if(animation[targetanimation].attack==3)targetheadrotation+=180;
5696 for(i=0;i<skeleton.drawmodel.vertexNum;i++){
5697 skeleton.drawmodel.vertex[i]=0;
5698 skeleton.drawmodel.vertex[i].y=999;
5700 for(i=0;i<skeleton.drawmodellow.vertexNum;i++){
5701 skeleton.drawmodellow.vertex[i]=0;
5702 skeleton.drawmodellow.vertex[i].y=999;
5704 for(i=0;i<skeleton.drawmodelclothes.vertexNum;i++){
5705 skeleton.drawmodelclothes.vertex[i]=0;
5706 skeleton.drawmodelclothes.vertex[i].y=999;
5708 for(i=0;i<skeleton.num_muscles;i++){
5709 if((skeleton.muscles[i].numvertices>0&&playerdetail)||(skeleton.muscles[i].numverticeslow>0&&!playerdetail)){
5713 if(skeleton.muscles[i].parent1->label==righthand||skeleton.muscles[i].parent2->label==righthand){
5714 morphness=righthandmorphness;
5715 start=righthandmorphstart;
5716 endthing=righthandmorphend;
5718 if(skeleton.muscles[i].parent1->label==lefthand||skeleton.muscles[i].parent2->label==lefthand){
5719 morphness=lefthandmorphness;
5720 start=lefthandmorphstart;
5721 endthing=lefthandmorphend;
5723 if(skeleton.muscles[i].parent1->label==head||skeleton.muscles[i].parent2->label==head){
5724 morphness=headmorphness;
5725 start=headmorphstart;
5726 endthing=headmorphend;
5728 if((skeleton.muscles[i].parent1->label==neck&&skeleton.muscles[i].parent2->label==abdomen)||(skeleton.muscles[i].parent2->label==neck&&skeleton.muscles[i].parent1->label==abdomen)){
5729 morphness=chestmorphness;
5730 start=chestmorphstart;
5731 endthing=chestmorphend;
5733 if((skeleton.muscles[i].parent1->label==groin&&skeleton.muscles[i].parent2->label==abdomen)||(skeleton.muscles[i].parent2->label==groin&&skeleton.muscles[i].parent1->label==abdomen)){
5734 morphness=tailmorphness;
5735 start=tailmorphstart;
5736 endthing=tailmorphend;
5738 if(calcrot)skeleton.FindRotationMuscle(i,targetanimation);
5739 mid=(skeleton.muscles[i].parent1->position+skeleton.muscles[i].parent2->position)/2;
5740 glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
5743 if(!skeleton.free)glRotatef(tilt2,1,0,0);
5744 if(!skeleton.free)glRotatef(tilt,0,0,1);
5747 glTranslatef(mid.x,mid.y,mid.z);
5749 skeleton.muscles[i].lastrotate1=skeleton.muscles[i].rotate1;
5750 glRotatef(-skeleton.muscles[i].lastrotate1+90,0,1,0);
5752 skeleton.muscles[i].lastrotate2=skeleton.muscles[i].rotate2;
5753 glRotatef(-skeleton.muscles[i].lastrotate2+90,0,0,1);
5755 skeleton.muscles[i].lastrotate3=skeleton.muscles[i].rotate3;
5756 glRotatef(-skeleton.muscles[i].lastrotate3,0,1,0);
5758 if(!isnormal(proportionbody.x)||!isnormal(proportionbody.y)||!isnormal(proportionbody.z)){
5762 if(!isnormal(proportionarms.x)||!isnormal(proportionarms.y)||!isnormal(proportionarms.z)){
5766 if(!isnormal(proportionhead.x)||!isnormal(proportionhead.y)||!isnormal(proportionhead.z)){
5770 if(!isnormal(proportionlegs.x)||!isnormal(proportionlegs.y)||!isnormal(proportionlegs.z)){
5775 if(playerdetail||skeleton.free==3)
5777 for(j=0;j<skeleton.muscles[i].numvertices;j++)
5779 /*if(!isnormal(skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x))vertexweird[0]=1;
5780 if(!isnormal(skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y))vertexweird[1]=1;
5781 if(!isnormal(skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z))vertexweird[2]=1;
5782 if(!isnormal(skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x))vertexweird[3]=1;
5783 if(!isnormal(skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y))vertexweird[4]=1;
5784 if(!isnormal(skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z))vertexweird[5]=1;
5785 if(skeleton.muscles[i].vertices[j]<skeleton.model[start].vertexNum&&skeleton.muscles[i].vertices[j]>=0){*/
5786 glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
5788 if(skeleton.muscles[i].parent1->label==abdomen||skeleton.muscles[i].parent2->label==abdomen)
5789 glTranslatef((skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x*morphness)*proportionbody.x,
5790 (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y*morphness)*proportionbody.y,
5791 (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z*morphness)*proportionbody.z);
5792 if(skeleton.muscles[i].parent1->label==lefthand||skeleton.muscles[i].parent1->label==righthand||skeleton.muscles[i].parent1->label==leftwrist||skeleton.muscles[i].parent1->label==rightwrist||skeleton.muscles[i].parent1->label==leftelbow||skeleton.muscles[i].parent1->label==rightelbow||skeleton.muscles[i].parent2->label==leftelbow||skeleton.muscles[i].parent2->label==rightelbow)
5793 glTranslatef((skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x*morphness)*proportionarms.x,
5794 (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y*morphness)*proportionarms.y,
5795 (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z*morphness)*proportionarms.z);
5796 if(skeleton.muscles[i].parent1->label==leftfoot||skeleton.muscles[i].parent1->label==rightfoot||skeleton.muscles[i].parent1->label==leftankle||skeleton.muscles[i].parent1->label==rightankle||skeleton.muscles[i].parent1->label==leftknee||skeleton.muscles[i].parent1->label==rightknee||skeleton.muscles[i].parent2->label==leftknee||skeleton.muscles[i].parent2->label==rightknee)
5797 glTranslatef((skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x*morphness)*proportionlegs.x,
5798 (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y*morphness)*proportionlegs.y,
5799 (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z*morphness)*proportionlegs.z);
5800 if(skeleton.muscles[i].parent1->label==head||skeleton.muscles[i].parent2->label==head)
5801 glTranslatef((skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x*morphness)*proportionhead.x,
5802 (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y*morphness)*proportionhead.y,
5803 (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z*(1-morphness)+skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z*morphness)*proportionhead.z);
5804 glGetFloatv(GL_MODELVIEW_MATRIX,M);
5805 //if(!isnormal(M[12])||!isnormal(M[13])||!isnormal(M[14]))test=0;
5806 //if(!isnormal(scale))test=1;
5807 skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].x=M[12]*scale;
5808 skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].y=M[13]*scale;
5809 skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].z=M[14]*scale;
5814 if(!playerdetail||skeleton.free==3)
5816 for(j=0;j<skeleton.muscles[i].numverticeslow;j++)
5818 glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
5820 if(skeleton.muscles[i].parent1->label==abdomen||skeleton.muscles[i].parent2->label==abdomen)
5821 glTranslatef((skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].x)*proportionbody.x,
5822 (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].y)*proportionbody.y,
5823 (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].z)*proportionbody.z);
5824 if(skeleton.muscles[i].parent1->label==lefthand||skeleton.muscles[i].parent1->label==righthand||skeleton.muscles[i].parent1->label==leftwrist||skeleton.muscles[i].parent1->label==rightwrist||skeleton.muscles[i].parent1->label==leftelbow||skeleton.muscles[i].parent1->label==rightelbow||skeleton.muscles[i].parent2->label==leftelbow||skeleton.muscles[i].parent2->label==rightelbow)
5825 glTranslatef((skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].x)*proportionarms.x,
5826 (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].y)*proportionarms.y,
5827 (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].z)*proportionarms.z);
5828 if(skeleton.muscles[i].parent1->label==leftfoot||skeleton.muscles[i].parent1->label==rightfoot||skeleton.muscles[i].parent1->label==leftankle||skeleton.muscles[i].parent1->label==rightankle||skeleton.muscles[i].parent1->label==leftknee||skeleton.muscles[i].parent1->label==rightknee||skeleton.muscles[i].parent2->label==leftknee||skeleton.muscles[i].parent2->label==rightknee)
5829 glTranslatef((skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].x)*proportionlegs.x,
5830 (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].y)*proportionlegs.y,
5831 (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].z)*proportionlegs.z);
5832 if(skeleton.muscles[i].parent1->label==head||skeleton.muscles[i].parent2->label==head)
5833 glTranslatef((skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].x)*proportionhead.x,
5834 (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].y)*proportionhead.y,
5835 (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].z)*proportionhead.z);
5837 glGetFloatv(GL_MODELVIEW_MATRIX,M);
5838 skeleton.drawmodellow.vertex[skeleton.muscles[i].verticeslow[j]].x=M[12]*scale;
5839 skeleton.drawmodellow.vertex[skeleton.muscles[i].verticeslow[j]].y=M[13]*scale;
5840 skeleton.drawmodellow.vertex[skeleton.muscles[i].verticeslow[j]].z=M[14]*scale;
5846 if(skeleton.clothes&&skeleton.muscles[i].numverticesclothes>0){
5847 mid=(skeleton.muscles[i].parent1->position+skeleton.muscles[i].parent2->position)/2;
5849 glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
5852 if(!skeleton.free)glRotatef(tilt2,1,0,0);
5853 if(!skeleton.free)glRotatef(tilt,0,0,1);
5854 glTranslatef(mid.x,mid.y,mid.z);
5855 skeleton.muscles[i].lastrotate1=skeleton.muscles[i].rotate1;
5856 glRotatef(-skeleton.muscles[i].lastrotate1+90,0,1,0);
5858 skeleton.muscles[i].lastrotate2=skeleton.muscles[i].rotate2;
5859 glRotatef(-skeleton.muscles[i].lastrotate2+90,0,0,1);
5861 skeleton.muscles[i].lastrotate3=skeleton.muscles[i].rotate3;
5862 glRotatef(-skeleton.muscles[i].lastrotate3,0,1,0);
5864 for(j=0;j<skeleton.muscles[i].numverticesclothes;j++){
5865 glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
5867 if(skeleton.muscles[i].parent1->label==abdomen||skeleton.muscles[i].parent2->label==abdomen)
5868 glTranslatef((skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x)*proportionbody.x,
5869 (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y)*proportionbody.y,
5870 (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].z)*proportionbody.z);
5871 if(skeleton.muscles[i].parent1->label==lefthand||skeleton.muscles[i].parent1->label==righthand||skeleton.muscles[i].parent1->label==leftwrist||skeleton.muscles[i].parent1->label==rightwrist||skeleton.muscles[i].parent1->label==leftelbow||skeleton.muscles[i].parent1->label==rightelbow||skeleton.muscles[i].parent2->label==leftelbow||skeleton.muscles[i].parent2->label==rightelbow)
5872 glTranslatef((skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x)*proportionarms.x,
5873 (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y)*proportionarms.y,
5874 (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].z)*proportionarms.z);
5875 if(skeleton.muscles[i].parent1->label==leftfoot||skeleton.muscles[i].parent1->label==rightfoot||skeleton.muscles[i].parent1->label==leftankle||skeleton.muscles[i].parent1->label==rightankle||skeleton.muscles[i].parent1->label==leftknee||skeleton.muscles[i].parent1->label==rightknee||skeleton.muscles[i].parent2->label==leftknee||skeleton.muscles[i].parent2->label==rightknee)
5876 glTranslatef((skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x)*proportionlegs.x,
5877 (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y)*proportionlegs.y,
5878 (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].z)*proportionlegs.z);
5879 if(skeleton.muscles[i].parent1->label==head||skeleton.muscles[i].parent2->label==head)
5880 glTranslatef((skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x)*proportionhead.x,
5881 (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y)*proportionhead.y,
5882 (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].z)*proportionhead.z);
5883 glGetFloatv(GL_MODELVIEW_MATRIX,M);
5884 skeleton.drawmodelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x=M[12]*scale;
5885 skeleton.drawmodelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y=M[13]*scale;
5886 skeleton.drawmodelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].z=M[14]*scale;
5891 updatedelay=1+(float)(Random()%100)/1000;
5893 if(skeleton.free!=2&&(skeleton.free==1||skeleton.free==3||id==0||(normalsupdatedelay<=0)||targetanimation==getupfromfrontanim||targetanimation==getupfrombackanim||currentanimation==getupfromfrontanim||currentanimation==getupfrombackanim)){
5894 normalsupdatedelay=1;
5895 if(playerdetail||skeleton.free==3)skeleton.drawmodel.CalculateNormals(0);
5896 if(!playerdetail||skeleton.free==3)skeleton.drawmodellow.CalculateNormals(0);
5897 if(skeleton.clothes)skeleton.drawmodelclothes.CalculateNormals(0);
5901 if(playerdetail||skeleton.free==3)skeleton.drawmodel.UpdateVertexArrayNoTexNoNorm();
5902 if(!playerdetail||skeleton.free==3)skeleton.drawmodellow.UpdateVertexArrayNoTexNoNorm();
5903 if(skeleton.clothes){
5904 skeleton.drawmodelclothes.UpdateVertexArrayNoTexNoNorm();
5909 updatedelaychange=-framemult*4*(45-findDistance(&viewer,&coords)*1);
5910 if(updatedelaychange>-realmultiplier*30)updatedelaychange=-realmultiplier*30;
5911 if(updatedelaychange>-framemult*4)updatedelaychange=-framemult*4;
5912 if(skeleton.free==1)updatedelaychange*=6;
5913 if(id==0)updatedelaychange*=8;
5914 updatedelay+=updatedelaychange;
5916 glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
5918 if(!skeleton.free)glTranslatef(coords.x,coords.y-.02,coords.z);
5919 if(skeleton.free)glTranslatef(coords.x,coords.y-.02,coords.z);
5920 if(!skeleton.free)glTranslatef(offset.x*scale,offset.y*scale,offset.z*scale);
5921 if(!skeleton.free)glRotatef(rotation,0,1,0);
5924 glColor4f(.4,1,.4,1);
5925 glDisable(GL_LIGHTING);
5926 glDisable(GL_TEXTURE_2D);
5929 for(i=0;i<skeleton.drawmodel.vertexNum;i++){
5930 glVertex3f(skeleton.drawmodel.vertex[i].x,skeleton.drawmodel.vertex[i].y,skeleton.drawmodel.vertex[i].z);
5936 for(i=0;i<skeleton.drawmodel.TriangleNum;i++){
5937 glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].x,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].y,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].z);
5938 glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].x,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].y,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].z);
5939 glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].x,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].y,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].z);
5940 glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].x,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].y,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].z);
5941 glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].x,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].y,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].z);
5942 glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].x,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].y,skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].z);
5948 terrainlight=terrain.getLighting(coords.x,coords.z);
5949 distance=findDistancefast(&viewer,&coords);
5950 distance=(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance;
5951 if(distance>1)distance=1;
5953 terrainheight=(coords.y-terrain.getHeight(coords.x,coords.z))/3+1;
5954 if(terrainheight<1)terrainheight=1;
5955 if(terrainheight>1.7)terrainheight=1.7;
5958 glColor4f((1-(1-terrainlight.x)/terrainheight)-burnt,(1-(1-terrainlight.y)/terrainheight)-burnt,(1-(1-terrainlight.z)/terrainheight)-burnt,distance);
5959 glDisable(GL_BLEND);
5960 glAlphaFunc(GL_GREATER, 0.0001);
5961 glEnable(GL_TEXTURE_2D);
5963 glDisable(GL_TEXTURE_2D);
5964 glColor4f(.7,.35,0,.5);
5966 glEnable(GL_LIGHTING);
5969 if(tutoriallevel&&id!=0){
5970 //glDisable(GL_TEXTURE_2D);
5971 glColor4f(.7,.7,.7,0.6);
5973 glEnable(GL_LIGHTING);
5975 if(canattack&&cananger)
5976 if(animation[targetanimation].attack==normalattack||animation[targetanimation].attack==reversed){
5977 glDisable(GL_TEXTURE_2D);
5978 glColor4f(1,0,0,0.8);
5980 glMatrixMode(GL_TEXTURE);
5982 glTranslatef(0,-smoketex,0);
5983 glTranslatef(-smoketex,0,0);
5987 if((tutoriallevel&&id!=0))skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture);
5988 else skeleton.drawmodel.draw();
5992 if((tutoriallevel&&id!=0))skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture);
5993 else skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr);
5996 if(!(animation[targetanimation].attack==normalattack||animation[targetanimation].attack==reversed))
5997 if(tutoriallevel&&id!=0){
5999 glMatrixMode(GL_MODELVIEW);
6000 glEnable(GL_TEXTURE_2D);
6001 glColor4f(.7,.7,.7,0.6);
6003 glEnable(GL_LIGHTING);
6005 if(canattack&&cananger)
6006 if(animation[targetanimation].attack==normalattack||animation[targetanimation].attack==reversed){
6007 glDisable(GL_TEXTURE_2D);
6008 glColor4f(1,0,0,0.8);
6010 glMatrixMode(GL_TEXTURE);
6012 glTranslatef(0,-smoketex*.6,0);
6013 glTranslatef(smoketex*.6,0,0);
6016 if((tutoriallevel&&id!=0))skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture);
6017 else skeleton.drawmodel.draw();
6021 if((tutoriallevel&&id!=0))skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture);
6022 else skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr);
6027 if(tutoriallevel&&id!=0){
6029 glMatrixMode(GL_MODELVIEW);
6030 glEnable(GL_TEXTURE_2D);
6032 if(skeleton.clothes){
6035 if(!immediate)skeleton.drawmodelclothes.draw();
6036 if(immediate)skeleton.drawmodelclothes.drawimmediate();
6043 for(k=0;k<num_weapons;k++){
6045 if(weaponactive==k){
6046 if(weapons.type[i]!=staff){
6047 for(j=0;j<skeleton.num_muscles;j++){
6048 if((skeleton.muscles[j].parent1->label==righthand||skeleton.muscles[j].parent2->label==righthand)&&skeleton.muscles[j].numvertices>0){
6049 weaponattachmuscle=j;
6052 for(j=0;j<skeleton.num_muscles;j++){
6053 if((skeleton.muscles[j].parent1->label==rightwrist||skeleton.muscles[j].parent2->label==rightwrist)&&(skeleton.muscles[j].parent1->label!=righthand&&skeleton.muscles[j].parent2->label!=righthand)&&skeleton.muscles[j].numvertices>0){
6054 weaponrotatemuscle=j;
6057 weaponpoint=(skeleton.muscles[weaponattachmuscle].parent1->position+skeleton.muscles[weaponattachmuscle].parent2->position)/2;
6058 if(creature==wolftype)weaponpoint=(skeleton.joints[skeleton.jointlabels[rightwrist]].position*.7+skeleton.joints[skeleton.jointlabels[righthand]].position*.3);
6060 if(weapons.type[i]==staff){
6061 for(j=0;j<skeleton.num_muscles;j++){
6062 if((skeleton.muscles[j].parent1->label==righthand||skeleton.muscles[j].parent2->label==righthand)&&skeleton.muscles[j].numvertices>0){
6063 weaponattachmuscle=j;
6066 for(j=0;j<skeleton.num_muscles;j++){
6067 if((skeleton.muscles[j].parent1->label==rightelbow||skeleton.muscles[j].parent2->label==rightelbow)&&(skeleton.muscles[j].parent1->label!=rightshoulder&&skeleton.muscles[j].parent2->label!=rightshoulder)&&skeleton.muscles[j].numvertices>0){
6068 weaponrotatemuscle=j;
6071 //weaponpoint=skeleton.joints[skeleton.jointlabels[rightwrist]].position;
6072 weaponpoint=(skeleton.muscles[weaponattachmuscle].parent1->position+skeleton.muscles[weaponattachmuscle].parent2->position)/2;
6073 //weaponpoint+=skeleton.specialforward[1]*.1+(skeleton.joints[skeleton.jointlabels[rightwrist]].position-skeleton.joints[skeleton.jointlabels[rightelbow]].position);
6074 XYZ tempnormthing,vec1,vec2;
6075 vec1=(skeleton.joints[skeleton.jointlabels[rightwrist]].position-skeleton.joints[skeleton.jointlabels[rightelbow]].position);
6076 vec2=(skeleton.joints[skeleton.jointlabels[rightwrist]].position-skeleton.joints[skeleton.jointlabels[rightshoulder]].position);
6077 CrossProduct(&vec1,&vec2,&tempnormthing);
6078 Normalise(&tempnormthing);
6079 if(targetanimation!=staffhitanim&¤tanimation!=staffhitanim&&targetanimation!=staffgroundsmashanim&¤tanimation!=staffgroundsmashanim&&targetanimation!=staffspinhitanim&¤tanimation!=staffspinhitanim)weaponpoint+=tempnormthing*.1-skeleton.specialforward[1]*.3+(skeleton.joints[skeleton.jointlabels[rightwrist]].position-skeleton.joints[skeleton.jointlabels[rightelbow]].position);
6080 /*if(targetanimation==staffhitanim||currentanimation==staffhitanim){
6082 weaptargnorm=DoRotation(weapons.tippoint[i]-weapons.position[i],0,-rotation,0);
6083 //weaptargnorm=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
6084 Normalise(&weaptargnorm);
6085 weaponpoint-=weaptargnorm*2;
6089 if(weaponactive!=k&&weaponstuck!=k){
6090 if(weapons.type[i]==knife)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[righthip]].position-skeleton.joints[skeleton.jointlabels[lefthip]].position)*.1+(skeleton.joints[skeleton.jointlabels[rightshoulder]].position-skeleton.joints[skeleton.jointlabels[leftshoulder]].position)*.35;
6091 if(weapons.type[i]==sword)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[lefthip]].position-skeleton.joints[skeleton.jointlabels[righthip]].position)*.09+(skeleton.joints[skeleton.jointlabels[leftshoulder]].position-skeleton.joints[skeleton.jointlabels[rightshoulder]].position)*.33;
6092 if(weapons.type[i]==staff)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position+(skeleton.joints[skeleton.jointlabels[lefthip]].position-skeleton.joints[skeleton.jointlabels[righthip]].position)*.09+(skeleton.joints[skeleton.jointlabels[leftshoulder]].position-skeleton.joints[skeleton.jointlabels[rightshoulder]].position)*.33;
6093 for(j=0;j<skeleton.num_muscles;j++){
6094 if((skeleton.muscles[j].parent1->label==abdomen||skeleton.muscles[j].parent2->label==abdomen)&&(skeleton.muscles[j].parent1->label==neck||skeleton.muscles[j].parent2->label==neck)&&skeleton.muscles[j].numvertices>0){
6095 weaponrotatemuscle=j;
6100 if(weaponstuckwhere==0)weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position*.5+skeleton.joints[skeleton.jointlabels[neck]].position*.5-skeleton.forward*.8;
6101 else weaponpoint=skeleton.joints[skeleton.jointlabels[abdomen]].position*.5+skeleton.joints[skeleton.jointlabels[neck]].position*.5+skeleton.forward*.8;
6102 for(j=0;j<skeleton.num_muscles;j++){
6103 if((skeleton.muscles[j].parent1->label==abdomen||skeleton.muscles[j].parent2->label==abdomen)&&(skeleton.muscles[j].parent1->label==neck||skeleton.muscles[j].parent2->label==neck)&&skeleton.muscles[j].numvertices>0){
6104 weaponrotatemuscle=j;
6109 weapons.position[i]=DoRotation(DoRotation(DoRotation(weaponpoint,0,0,tilt),tilt2,0,0),0,rotation,0)*scale+coords+currentoffset*(1-target)*scale+targetoffset*target*scale;
6110 weapons.bigrotation[i]=rotation;
6111 weapons.bigtilt[i]=tilt;
6112 weapons.bigtilt2[i]=tilt2;
6115 weapons.position[i]=weaponpoint*scale+coords;
6116 weapons.bigrotation[i]=0;
6117 weapons.bigtilt[i]=0;
6118 weapons.bigtilt2[i]=0;
6120 weapons.rotation1[i]=skeleton.muscles[weaponrotatemuscle].lastrotate1;
6121 weapons.rotation2[i]=skeleton.muscles[weaponrotatemuscle].lastrotate2;
6122 weapons.rotation3[i]=skeleton.muscles[weaponrotatemuscle].lastrotate3;
6123 if(weaponactive==k){
6124 if(weapons.type[i]==knife){
6125 weapons.smallrotation[i]=180;
6126 weapons.smallrotation2[i]=0;
6127 if(isCrouch()||wasCrouch()){
6128 weapons.smallrotation2[i]=20;
6130 if(targetanimation==hurtidleanim){
6131 weapons.smallrotation2[i]=50;
6133 if((currentanimation==crouchstabanim&&targetanimation==crouchstabanim)||(currentanimation==backhandspringanim&&targetanimation==backhandspringanim)){
6134 XYZ temppoint1,temppoint2,tempforward;
6137 temppoint1=skeleton.joints[skeleton.jointlabels[righthand]].position;
6138 temppoint2=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
6139 distance=findDistance(&temppoint1,&temppoint2);
6140 weapons.rotation2[i]=asin((temppoint1.y-temppoint2.y)/distance);
6141 weapons.rotation2[i]*=360/6.28;
6144 weapons.rotation1[i]=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
6145 weapons.rotation1[i]*=360/6.28;
6146 weapons.rotation3[i]=0;
6147 weapons.smallrotation[i]=-90;
6148 weapons.smallrotation2[i]=0;
6149 if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
6151 if((currentanimation==knifeslashreversalanim&&targetanimation==knifeslashreversalanim)||(currentanimation==knifeslashreversedanim&&targetanimation==knifeslashreversedanim)){
6152 XYZ temppoint1,temppoint2,tempforward;
6155 temppoint1=skeleton.joints[skeleton.jointlabels[righthand]].position;
6156 temppoint2=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
6157 distance=findDistance(&temppoint1,&temppoint2);
6158 weapons.rotation2[i]=asin((temppoint1.y-temppoint2.y)/distance);
6159 weapons.rotation2[i]*=360/6.28;
6162 weapons.rotation1[i]=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
6163 weapons.rotation1[i]*=360/6.28;
6164 weapons.rotation3[i]=0;
6165 weapons.smallrotation[i]=90;
6166 weapons.smallrotation2[i]=0;
6167 if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
6169 if(targetanimation==knifethrowanim){
6170 weapons.smallrotation[i]=90;
6171 //weapons.smallrotation2[i]=-90;
6172 weapons.smallrotation2[i]=0;
6173 weapons.rotation1[i]=0;
6174 weapons.rotation2[i]=0;
6175 weapons.rotation3[i]=0;
6177 if(targetanimation==knifesneakattackanim&&targetframe<5){
6178 weapons.smallrotation[i]=-90;
6179 weapons.rotation1[i]=0;
6180 weapons.rotation2[i]=0;
6181 weapons.rotation3[i]=0;
6184 if(weapons.type[i]==sword){
6185 weapons.smallrotation[i]=0;
6186 weapons.smallrotation2[i]=0;
6187 if(targetanimation==knifethrowanim){
6188 weapons.smallrotation[i]=-90;
6189 weapons.smallrotation2[i]=0;
6190 weapons.rotation1[i]=0;
6191 weapons.rotation2[i]=0;
6192 weapons.rotation3[i]=0;
6194 if((targetanimation==swordgroundstabanim&¤tanimation==swordgroundstabanim)||(targetanimation==swordsneakattackanim&¤tanimation==swordsneakattackanim)||(targetanimation==swordslashparryanim&¤tanimation==swordslashparryanim)||(targetanimation==swordslashparriedanim&¤tanimation==swordslashparriedanim)||(targetanimation==swordslashreversalanim&¤tanimation==swordslashreversalanim)||(targetanimation==swordslashreversedanim&¤tanimation==swordslashreversedanim)||(targetanimation==knifeslashreversalanim&¤tanimation==knifeslashreversalanim)||(targetanimation==knifeslashreversedanim&¤tanimation==knifeslashreversedanim)||(targetanimation==swordslashanim&¤tanimation==swordslashanim)||(targetanimation==drawleftanim&¤tanimation==drawleftanim)||(currentanimation==backhandspringanim&&targetanimation==backhandspringanim)){
6195 XYZ temppoint1,temppoint2,tempforward;
6198 temppoint1=animation[currentanimation].position[skeleton.jointlabels[righthand]][currentframe]*(1-target)+animation[targetanimation].position[skeleton.jointlabels[righthand]][targetframe]*(target); //skeleton.joints[skeleton.jointlabels[righthand]].position;
6199 temppoint2=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
6200 distance=findDistance(&temppoint1,&temppoint2);
6201 weapons.rotation2[i]=asin((temppoint1.y-temppoint2.y)/distance);
6202 weapons.rotation2[i]*=360/6.28;
6205 weapons.rotation1[i]=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
6206 weapons.rotation1[i]*=360/6.28;
6207 weapons.rotation3[i]=0;
6208 weapons.smallrotation[i]=90;
6209 weapons.smallrotation2[i]=0;
6210 if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
6213 if(weapons.type[i]==staff){
6214 weapons.smallrotation[i]=100;
6215 weapons.smallrotation2[i]=0;
6216 if((targetanimation==staffhitanim&¤tanimation==staffhitanim)||(targetanimation==staffhitreversedanim&¤tanimation==staffhitreversedanim)||(targetanimation==staffspinhitreversedanim&¤tanimation==staffspinhitreversedanim)||(targetanimation==staffgroundsmashanim&¤tanimation==staffgroundsmashanim)||(targetanimation==staffspinhitanim&¤tanimation==staffspinhitanim)){
6217 XYZ temppoint1,temppoint2,tempforward;
6220 temppoint1=animation[currentanimation].position[skeleton.jointlabels[righthand]][currentframe]*(1-target)+animation[targetanimation].position[skeleton.jointlabels[righthand]][targetframe]*(target); //skeleton.joints[skeleton.jointlabels[righthand]].position;
6221 temppoint2=animation[currentanimation].weapontarget[currentframe]*(1-target)+animation[targetanimation].weapontarget[targetframe]*(target);
6222 distance=findDistance(&temppoint1,&temppoint2);
6223 weapons.rotation2[i]=asin((temppoint1.y-temppoint2.y)/distance);
6224 weapons.rotation2[i]*=360/6.28;
6227 weapons.rotation1[i]=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
6228 weapons.rotation1[i]*=360/6.28;
6229 weapons.rotation3[i]=0;
6230 weapons.smallrotation[i]=90;
6231 weapons.smallrotation2[i]=0;
6232 if(temppoint1.x>temppoint2.x)weapons.rotation1[i]=360-weapons.rotation1[i];
6236 if(weaponactive!=k&&weaponstuck!=k){
6237 if(weapons.type[i]==knife){
6238 weapons.smallrotation[i]=-70;
6239 weapons.smallrotation2[i]=10;
6241 if(weapons.type[i]==sword){
6242 weapons.smallrotation[i]=-100;
6243 weapons.smallrotation2[i]=-8;
6245 if(weapons.type[i]==staff){
6246 weapons.smallrotation[i]=-100;
6247 weapons.smallrotation2[i]=-8;
6251 if(weaponstuckwhere==0)weapons.smallrotation[i]=180;
6252 else weapons.smallrotation[i]=0;
6253 weapons.smallrotation2[i]=10;
6260 if(skeleton.free)calcrot=1;
6261 if(animation[targetanimation].attack||isRun()||targetanimation==staggerbackhardanim||isFlip()||targetanimation==climbanim||targetanimation==sneakanim||targetanimation==rollanim||targetanimation==walkanim||targetanimation==backhandspringanim||isFlip()||isWallJump())calcrot=1;
6262 if(currentanimation!=targetanimation)calcrot=1;
6263 //if(id==0)calcrot=1;
6264 if(skeleton.free==2)calcrot=0;
6270 int Person::SphereCheck(XYZ *p1,float radius, XYZ *p, XYZ *move, float *rotate, Model *model)
6273 static float distance;
6274 static float olddistance;
6275 static int intersecting;
6276 static int firstintersecting;
6279 static XYZ start,end;
6280 static float slopethreshold=-.4;
6282 firstintersecting=-1;
6286 if(findDistancefast(p1,&model->boundingspherecenter)>radius*radius+model->boundingsphereradius*model->boundingsphereradius)return -1;
6287 if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
6289 for (j=0;j<model->TriangleNum;j++){
6290 if(model->facenormals[j].y<=slopethreshold){
6292 distance=abs((model->facenormals[j].x*p1->x)+(model->facenormals[j].y*p1->y)+(model->facenormals[j].z*p1->z)-((model->facenormals[j].x*model->vertex[model->Triangles[j].vertex[0]].x)+(model->facenormals[j].y*model->vertex[model->Triangles[j].vertex[0]].y)+(model->facenormals[j].z*model->vertex[model->Triangles[j].vertex[0]].z)));
6293 if(distance<radius){
6294 point=*p1-model->facenormals[j]*distance;
6295 if(PointInTriangle( &point, model->facenormals[j], &model->vertex[model->Triangles[j].vertex[0]], &model->vertex[model->Triangles[j].vertex[1]], &model->vertex[model->Triangles[j].vertex[2]]))intersecting=1;
6296 if(!intersecting)intersecting=sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
6297 &model->vertex[model->Triangles[j].vertex[1]],
6299 if(!intersecting)intersecting=sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[1]],
6300 &model->vertex[model->Triangles[j].vertex[2]],
6302 if(!intersecting)intersecting=sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
6303 &model->vertex[model->Triangles[j].vertex[2]],
6306 if(dotproduct(&model->facenormals[j],&end)>0&&intersecting){
6310 if(LineFacetd(&start,&end,&model->vertex[model->Triangles[j].vertex[0]],&model->vertex[model->Triangles[j].vertex[1]],&model->vertex[model->Triangles[j].vertex[2]],&model->facenormals[j],&point)){
6311 p1->y=point.y+radius;
6312 if((targetanimation==jumpdownanim||isFlip())){
6313 if(isFlip()&&(targetframe<5||animation[targetanimation].label[targetframe]==7||animation[targetanimation].label[targetframe]==4))RagDoll(0);
6315 if(targetanimation==jumpupanim){jumppower=-4;targetanimation=getIdle();}
6321 OPENAL_SetPaused(channels[whooshsound], true);
6322 OPENAL_SetVolume(channels[whooshsound], 0);
6325 if((targetanimation==jumpdownanim||isFlip())&&!wasLanding()&&!wasLandhard()){
6326 if(isFlip())jumppower=-4;
6327 targetanimation=getLanding();
6328 emit_sound_at(landsound, coords, 128.);
6331 envsound[numenvsounds]=coords;
6332 envsoundvol[numenvsounds]=16;
6333 envsoundlife[numenvsounds]=.4;
6341 if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j; *p=point;}
6344 for (j=0;j<model->TriangleNum;j++){
6345 if(model->facenormals[j].y>slopethreshold){
6349 distance=abs((model->facenormals[j].x*start.x)+(model->facenormals[j].y*start.y)+(model->facenormals[j].z*start.z)-((model->facenormals[j].x*model->vertex[model->Triangles[j].vertex[0]].x)+(model->facenormals[j].y*model->vertex[model->Triangles[j].vertex[0]].y)+(model->facenormals[j].z*model->vertex[model->Triangles[j].vertex[0]].z)));
6350 if(distance<radius*.5){
6351 point=start-model->facenormals[j]*distance;
6352 if(PointInTriangle( &point, model->facenormals[j], &model->vertex[model->Triangles[j].vertex[0]], &model->vertex[model->Triangles[j].vertex[1]], &model->vertex[model->Triangles[j].vertex[2]]))intersecting=1;
6353 if(!intersecting)intersecting=sphere_line_intersection(model->vertex[model->Triangles[j].vertex[0]].x,model->vertex[model->Triangles[j].vertex[0]].y,model->vertex[model->Triangles[j].vertex[0]].z,
6354 model->vertex[model->Triangles[j].vertex[1]].x,model->vertex[model->Triangles[j].vertex[1]].y,model->vertex[model->Triangles[j].vertex[1]].z,
6355 p1->x, p1->y, p1->z, radius/2);
6356 if(!intersecting)intersecting=sphere_line_intersection(model->vertex[model->Triangles[j].vertex[1]].x,model->vertex[model->Triangles[j].vertex[1]].y,model->vertex[model->Triangles[j].vertex[1]].z,
6357 model->vertex[model->Triangles[j].vertex[2]].x,model->vertex[model->Triangles[j].vertex[2]].y,model->vertex[model->Triangles[j].vertex[2]].z,
6358 p1->x, p1->y, p1->z, radius/2);
6359 if(!intersecting)intersecting=sphere_line_intersection(model->vertex[model->Triangles[j].vertex[0]].x,model->vertex[model->Triangles[j].vertex[0]].y,model->vertex[model->Triangles[j].vertex[0]].z,
6360 model->vertex[model->Triangles[j].vertex[2]].x,model->vertex[model->Triangles[j].vertex[2]].y,model->vertex[model->Triangles[j].vertex[2]].z,
6361 p1->x, p1->y, p1->z, radius/2);
6363 if(dotproduct(&model->facenormals[j],&end)>0&&intersecting){
6364 if((targetanimation==jumpdownanim||targetanimation==jumpupanim||isFlip())){
6366 velocity-=DoRotation(model->facenormals[j],0,*rotate,0)*findLength(&velocity)*abs(normaldotproduct(velocity,DoRotation(model->facenormals[j],0,*rotate,0)));//(distance-radius*.5)/multiplier;
6367 if(findLengthfast(&start)<findLengthfast(&velocity))velocity=start;
6369 *p1+=model->facenormals[j]*(distance-radius*.5);
6372 if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j; *p=point;}
6376 if(*rotate)*p=DoRotation(*p,0,*rotate,0);
6378 if(*rotate)*p1=DoRotation(*p1,0,*rotate,0);
6380 return firstintersecting;
6390 currentanimation = 0;
6391 targetanimation = 0;
6392 oldcurrentframe = 0;
6394 oldcurrentanimation = 0;
6395 oldtargetanimation = 0;
6399 parriedrecently = 0;
6403 lastattack = 0,lastattack2 = 0,lastattack3 = 0;
6405 currentoffset = 0,targetoffset = 0,offset = 0;
6423 unconscioustime = 0;
6441 rabbitkickenabled = 0;
6450 damagetolerance = 0;
6452 permanentdamage = 0;
6453 superpermanentdamage = 0; lastcollide = 0;
6473 headrotation = 0,headrotation2 = 0;
6474 targetheadrotation = 0,targetheadrotation2 = 0;
6485 normalsupdatedelay = 0;
6490 forwardstogglekeydown = 0;
6495 jumptogglekeydown = 0;
6497 crouchtogglekeydown = 0;
6499 drawtogglekeydown = 0;
6501 throwtogglekeydown = 0;
6507 crouchkeydowntime = 0;
6508 jumpkeydowntime = 0;
6525 whichdirectiondelay = 0;
6526 avoidsomething = 0; avoidwhere = 0;
6534 lefthandmorphness = 0;
6535 righthandmorphness = 0;
6539 targetlefthandmorphness = 0;
6540 targetrighthandmorphness = 0;
6541 targetheadmorphness = 0;
6542 targetchestmorphness = 0;
6543 targettailmorphness = 0;
6544 lefthandmorphstart = 0,lefthandmorphend = 0;
6545 righthandmorphstart = 0,righthandmorphend = 0;
6546 headmorphstart = 0,headmorphend = 0;
6547 chestmorphstart = 0,chestmorphend = 0;
6548 tailmorphstart = 0,tailmorphend = 0;
6550 weaponmissdelay = 0;
6551 highreversaldelay = 0;
6552 lowreversaldelay = 0;
6559 //Skeleton skeleton;
6578 memset(clothes, 0, sizeof(clothes));
6579 memset(clothestintr, 0, sizeof(clothestintr));
6580 memset(clothestintg, 0, sizeof(clothestintg));
6581 memset(clothestintb, 0, sizeof(clothestintb));
6587 onfiredelay = 0; burnt = 0;
6591 updatestuffdelay = 0;
6597 memset(weaponids, 0, sizeof(weaponids));
6601 weaponstuckwhere = 0;
6606 memset(waypoints, 0, sizeof(waypoints));
6607 memset(waypointtype, 0, sizeof(waypointtype));
6610 hastempwaypoint = 0;
6616 finalfinaltarget = 0;
6618 finalpathfindpoint = 0;
6619 targetpathfindpoint = 0;
6620 lastpathfindpoint = 0;
6621 lastpathfindpoint2 = 0;
6622 lastpathfindpoint3 = 0;
6623 lastpathfindpoint4 = 0;
6634 runninghowlong = 0; lastoccluded = 0;
6640 neckspurtparticledelay = 0;
6641 neckspurtamount = 0;
6644 rabbitkickragdoll = 0;
6649 //Animation tempanimation;