X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FObjects%2FPerson.cpp;h=3c893260672d34a192e4ec21426b573b9fcf1ea7;hb=8b6e8f3ad7390309795eb35c0959264cb7924402;hp=8181e815d7e792bd6291259213b2247d100c43fd;hpb=ed3662c0852c4312a612b4fc35bd03aba8d13db7;p=lugaru.git diff --git a/Source/Objects/Person.cpp b/Source/Objects/Person.cpp index 8181e81..3c89326 100644 --- a/Source/Objects/Person.cpp +++ b/Source/Objects/Person.cpp @@ -21,11 +21,12 @@ along with Lugaru. If not, see . #include "Objects/Person.hpp" #include "Animation/Animation.hpp" -#include "Audio/openal_wrapper.hpp" #include "Audio/Sounds.hpp" +#include "Audio/openal_wrapper.hpp" #include "Game.hpp" #include "Level/Awards.hpp" #include "Level/Dialog.hpp" +#include "Tutorial.hpp" #include "Utils/Folders.hpp" extern float multiplier; @@ -44,22 +45,19 @@ extern float realtexdetail; extern GLubyte bloodText[512 * 512 * 3]; extern GLubyte wolfbloodText[512 * 512 * 3]; extern int bloodtoggle; -extern Objects objects; extern bool autoslomo; extern float camerashake; extern float woozy; extern float viewdistance; extern float blackout; extern int difficulty; -extern bool decals; +extern bool decalstoggle; extern float fadestart; extern bool freeze; extern bool winfreeze; extern bool showpoints; extern bool immediate; -extern int tutoriallevel; extern float smoketex; -extern int tutorialstage; extern bool reversaltrain; extern bool canattack; extern bool cananger; @@ -69,246 +67,308 @@ extern float hostiletime; extern bool gamestarted; +extern XYZ envsound[30]; +extern float envsoundvol[30]; +extern int numenvsounds; +extern float envsoundlife[30]; + +extern XYZ windvector; + std::vector> Person::players(1, std::shared_ptr(new Person())); -Person::Person() : - whichpatchx(0), - whichpatchz(0), - animCurrent(bounceidleanim), - animTarget(bounceidleanim), - frameCurrent(0), - frameTarget(1), - oldanimCurrent(0), - oldanimTarget(0), - oldframeCurrent(0), - oldframeTarget(0), - howactive(typeactive), - parriedrecently(0), - superruntoggle(false), - lastattack(0), lastattack2(0), lastattack3(0), - currentoffset(), targetoffset(), offset(), - target(0), - transspeed(0), - - realoldcoords(), - oldcoords(), - coords(), - velocity(), - - proportionhead(), - proportionlegs(), - proportionarms(), - proportionbody(), - - unconscioustime(0), - - immobile(false), - - velspeed(0), - targetyaw(0), - targetrot(0), - rot(0), - oldrot(0), - lookyaw(0), - lookpitch(0), - yaw(0), - pitch(0), - lowyaw(0), - tilt(0), - targettilt(0), - tilt2(0), - targettilt2(0), - rabbitkickenabled(false), - - bloodloss(0), - bleeddelay(0), - skiddelay(0), - skiddingdelay(0), - deathbleeding(0), - tempdeltav(0), - - damagetolerance(200), - damage(0), - permanentdamage(0), - superpermanentdamage(0), - lastcollide(0), - dead(0), - - jumppower(5), - onground(false), - - wentforweapon(0), - - calcrot(false), - - facing(), - - bleeding(0), - bleedx(0), bleedy(0), - direction(0), - texupdatedelay(0), - - headyaw(0), headpitch(0), - targetheadyaw(0), targetheadpitch(0), - - onterrain(false), - pause(false), - - grabdelay(0), - - victim(nullptr), - hasvictim(false), - - updatedelay(0), - normalsupdatedelay(0), - - jumpstart(false), - forwardkeydown(false), - forwardstogglekeydown(false), - rightkeydown(false), - leftkeydown(false), - backkeydown(false), - jumpkeydown(false), - jumptogglekeydown(false), - crouchkeydown(false), - crouchtogglekeydown(false), - drawkeydown(false), - drawtogglekeydown(false), - throwkeydown(false), - throwtogglekeydown(false), - attackkeydown(false), - feint(false), - lastfeint(false), - headless(false), - - crouchkeydowntime(0), - jumpkeydowntime(0), - freefall(false), - - turnspeed(0), - - aitype(passivetype), - aiupdatedelay(0), - losupdatedelay(0), - ally(0), - collide(0), - collided(-10), - avoidcollided(0), - loaded(false), - whichdirection(false), - whichdirectiondelay(0), - avoidsomething(false), - avoidwhere(), - blooddimamount(0), - - staggerdelay(0), - blinkdelay(0), - twitchdelay(0), - twitchdelay2(0), - twitchdelay3(0), - lefthandmorphness(0), - righthandmorphness(0), - headmorphness(0), - chestmorphness(0), - tailmorphness(0), - targetlefthandmorphness(0), - targetrighthandmorphness(0), - targetheadmorphness(1), - targetchestmorphness(0), - targettailmorphness(0), - lefthandmorphstart(0), lefthandmorphend(0), - righthandmorphstart(0), righthandmorphend(0), - headmorphstart(0), headmorphend(0), - chestmorphstart(0), chestmorphend(0), - tailmorphstart(0), tailmorphend(0), - - weaponmissdelay(0), - highreversaldelay(0), - lowreversaldelay(0), - - creature(rabbittype), - - id(0), - - skeleton(), - - speed(0), - scale(-1), - power(0), - speedmult(0), - - protectionhead(0), - protectionhigh(0), - protectionlow(0), - armorhead(0), - armorhigh(0), - armorlow(0), - metalhead(false), - metalhigh(false), - metallow(false), - - numclothes(0), - - landhard(false), - bled(false), - spurt(false), - onfire(false), - onfiredelay(0), - burnt(0), - - flamedelay(0), - - playerdetail(0), - - num_weapons(0), - weaponactive(-1), - weaponstuck(-1), - weaponstuckwhere(0), - - numwaypoints(0), - pausetime(0), - - headtarget(), - interestdelay(0), - - finalfinaltarget(), - finaltarget(), - finalpathfindpoint(0), - targetpathfindpoint(0), - lastpathfindpoint(0), - lastpathfindpoint2(0), - lastpathfindpoint3(0), - lastpathfindpoint4(0), - - waypoint(0), - - lastseen(), - lastseentime(0), - lastchecktime(0), - stunned(0), - surprised(0), - runninghowlong(0), - occluded(0), - lastoccluded(0), - laststanding(0), - escapednum(0), - - speechdelay(0), - neckspurtdelay(0), - neckspurtparticledelay(0), - neckspurtamount(0), - - whichskin(0), - rabbitkickragdoll(false), - - tempanimation(), +Person::Person() + : whichpatchx(0) + , whichpatchz(0) + , animCurrent(bounceidleanim) + , animTarget(bounceidleanim) + , frameCurrent(0) + , frameTarget(1) + , oldanimCurrent(0) + , oldanimTarget(0) + , oldframeCurrent(0) + , oldframeTarget(0) + , howactive(typeactive) + , parriedrecently(0) + , superruntoggle(false) + , lastattack(0) + , lastattack2(0) + , lastattack3(0) + , currentoffset() + , targetoffset() + , offset() + , target(0) + , transspeed(0) + , + + realoldcoords() + , oldcoords() + , coords() + , velocity() + , + + proportionhead() + , proportionlegs() + , proportionarms() + , proportionbody() + , + + unconscioustime(0) + , + + immobile(false) + , + + velspeed(0) + , targetyaw(0) + , targetrot(0) + , rot(0) + , oldrot(0) + , lookyaw(0) + , lookpitch(0) + , yaw(0) + , pitch(0) + , lowyaw(0) + , tilt(0) + , targettilt(0) + , tilt2(0) + , targettilt2(0) + , rabbitkickenabled(false) + , + + bloodloss(0) + , bleeddelay(0) + , skiddelay(0) + , skiddingdelay(0) + , deathbleeding(0) + , tempdeltav(0) + , + + damagetolerance(200) + , damage(0) + , permanentdamage(0) + , superpermanentdamage(0) + , lastcollide(0) + , dead(0) + , + + jumppower(5) + , onground(false) + , + + wentforweapon(0) + , + + calcrot(false) + , + + facing() + , + + bleeding(0) + , bleedx(0) + , bleedy(0) + , direction(0) + , texupdatedelay(0) + , + + headyaw(0) + , headpitch(0) + , targetheadyaw(0) + , targetheadpitch(0) + , + + onterrain(false) + , pause(false) + , + + grabdelay(0) + , + + victim(nullptr) + , hasvictim(false) + , + + updatedelay(0) + , normalsupdatedelay(0) + , + + jumpstart(false) + , forwardkeydown(false) + , forwardstogglekeydown(false) + , rightkeydown(false) + , leftkeydown(false) + , backkeydown(false) + , jumpkeydown(false) + , jumptogglekeydown(false) + , crouchkeydown(false) + , crouchtogglekeydown(false) + , drawkeydown(false) + , drawtogglekeydown(false) + , throwkeydown(false) + , throwtogglekeydown(false) + , attackkeydown(false) + , feint(false) + , lastfeint(false) + , headless(false) + , + + crouchkeydowntime(0) + , jumpkeydowntime(0) + , freefall(false) + , + + turnspeed(0) + , + + aitype(passivetype) + , aiupdatedelay(0) + , losupdatedelay(0) + , ally(0) + , collide(0) + , collided(-10) + , avoidcollided(0) + , loaded(false) + , whichdirection(false) + , whichdirectiondelay(0) + , avoidsomething(false) + , avoidwhere() + , blooddimamount(0) + , + + staggerdelay(0) + , blinkdelay(0) + , twitchdelay(0) + , twitchdelay2(0) + , twitchdelay3(0) + , lefthandmorphness(0) + , righthandmorphness(0) + , headmorphness(0) + , chestmorphness(0) + , tailmorphness(0) + , targetlefthandmorphness(0) + , targetrighthandmorphness(0) + , targetheadmorphness(1) + , targetchestmorphness(0) + , targettailmorphness(0) + , lefthandmorphstart(0) + , lefthandmorphend(0) + , righthandmorphstart(0) + , righthandmorphend(0) + , headmorphstart(0) + , headmorphend(0) + , chestmorphstart(0) + , chestmorphend(0) + , tailmorphstart(0) + , tailmorphend(0) + , + + weaponmissdelay(0) + , highreversaldelay(0) + , lowreversaldelay(0) + , + + creature(rabbittype) + , + + id(0) + , + + skeleton() + , + + speed(0) + , scale(-1) + , power(0) + , speedmult(0) + , + + protectionhead(0) + , protectionhigh(0) + , protectionlow(0) + , armorhead(0) + , armorhigh(0) + , armorlow(0) + , metalhead(false) + , metalhigh(false) + , metallow(false) + , + + numclothes(0) + , + + landhard(false) + , bled(false) + , spurt(false) + , onfire(false) + , onfiredelay(0) + , burnt(0) + , + + flamedelay(0) + , + + playerdetail(0) + , + + num_weapons(0) + , weaponactive(-1) + , weaponstuck(-1) + , weaponstuckwhere(0) + , + + numwaypoints(0) + , pausetime(0) + , + + headtarget() + , interestdelay(0) + , + + finalfinaltarget() + , finaltarget() + , finalpathfindpoint(0) + , targetpathfindpoint(0) + , lastpathfindpoint(0) + , lastpathfindpoint2(0) + , lastpathfindpoint3(0) + , lastpathfindpoint4(0) + , + + waypoint(0) + , + + lastseen() + , lastseentime(0) + , lastchecktime(0) + , stunned(0) + , surprised(0) + , runninghowlong(0) + , occluded(0) + , lastoccluded(0) + , laststanding(0) + , escapednum(0) + , + + speechdelay(0) + , neckspurtdelay(0) + , neckspurtparticledelay(0) + , neckspurtamount(0) + , + + whichskin(0) + , rabbitkickragdoll(false) + , + + tempanimation() + , jumpclimb(false) { } /* Read a person in tfile. Throws an error if it’s not valid */ -Person::Person(FILE *tfile, int mapvers, unsigned i) : Person() +Person::Person(FILE* tfile, int mapvers, unsigned i) + : Person() { id = i; funpackf(tfile, "Bi Bi Bf Bf Bf Bi", &whichskin, &creature, &coords.x, &coords.y, &coords.z, &num_weapons); @@ -432,8 +492,7 @@ void Person::skeletonLoad(bool clothes) "Models/Body7.solid", "Models/BodyLow.solid", "Models/Belt.solid", - clothes - ); + clothes); } else { skeleton.Load( "Skeleton/BasicFigureWolf", @@ -448,8 +507,7 @@ void Person::skeletonLoad(bool clothes) "Models/Wolf7.solid", "Models/WolfLow.solid", "Models/Belt.solid", - clothes - ); + clothes); } skeleton.drawmodel.textureptr.load(creatureskin[creature][whichskin], 1, &skeleton.skinText[0], &skeleton.skinsize); @@ -462,14 +520,7 @@ void Person::skeletonLoad(bool clothes) */ void Person::CheckKick() { - if (!(hasvictim - && (animTarget == rabbitkickanim - && victim - && victim != this->shared_from_this() - && frameCurrent >= 2 - && animCurrent == rabbitkickanim) - && distsq(&coords, &victim->coords) < 1.2 - && !victim->skeleton.free)) + if (!(hasvictim && (animTarget == rabbitkickanim && victim && victim != this->shared_from_this() && frameCurrent >= 2 && animCurrent == rabbitkickanim) && distsq(&coords, &victim->coords) < 1.2 && !victim->skeleton.free)) return; if (Animation::animations[victim->animTarget].height != lowheight) { @@ -480,10 +531,10 @@ void Person::CheckKick() victim->spurt = 1; DoBlood(.2, 250); - if (tutoriallevel != 1) + if (!Tutorial::active) emit_sound_at(heavyimpactsound, victim->coords); victim->RagDoll(0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * 120 * damagemult; } victim->Puff(neck); @@ -531,7 +582,7 @@ void Person::CatchFire() XYZ flatfacing, flatvelocity; int howmany; for (int i = 0; i < 10; i++) { - howmany = abs(Random() % (skeleton.joints.size())); + howmany = fabs(Random() % (skeleton.joints.size())); if (skeleton.free) { flatvelocity = skeleton.joints[howmany].velocity; flatfacing = skeleton.joints[howmany].position * scale + coords; @@ -560,10 +611,10 @@ int Person::getIdle() { if (Dialog::inDialog() && (howactive == typeactive) && (creature == rabbittype)) return talkidleanim; - if (hasvictim && (victim != this->shared_from_this())/*||(id==0&&attackkeydown)*/) - if (/*(id==0&&attackkeydown)||*/(!victim->dead && victim->aitype != passivetype && - victim->aitype != searchtype && aitype != passivetype && aitype != searchtype && - victim->id < Person::players.size())) { + if (hasvictim && (victim != this->shared_from_this())) { + if ((!victim->dead && victim->aitype != passivetype && + victim->aitype != searchtype && aitype != passivetype && aitype != searchtype && + victim->id < Person::players.size())) { if ((aitype == playercontrolled && stunned <= 0 && weaponactive == -1) || pause) { if (creature == rabbittype) return fightidleanim; @@ -583,17 +634,27 @@ int Person::getIdle() if (aitype != playercontrolled && stunned <= 0 && creature != wolftype && !pause) return fightsidestep; } + } if ((damage > permanentdamage || damage > damagetolerance * .8 || deathbleeding > 0) && creature != wolftype) return hurtidleanim; - if (howactive == typesitting) return sitanim; - if (howactive == typesittingwall) return sitwallanim; - if (howactive == typesleeping) return sleepanim; - if (howactive == typedead1) return dead1anim; - if (howactive == typedead2) return dead2anim; - if (howactive == typedead3) return dead3anim; - if (howactive == typedead4) return dead4anim; - if (creature == rabbittype) return bounceidleanim; - if (creature == wolftype) return wolfidle; + if (howactive == typesitting) + return sitanim; + if (howactive == typesittingwall) + return sitwallanim; + if (howactive == typesleeping) + return sleepanim; + if (howactive == typedead1) + return dead1anim; + if (howactive == typedead2) + return dead2anim; + if (howactive == typedead3) + return dead3anim; + if (howactive == typedead4) + return dead4anim; + if (creature == rabbittype) + return bounceidleanim; + if (creature == wolftype) + return wolfidle; return 0; } @@ -681,7 +742,7 @@ void Person::DoBlood(float howmuch, int which) // FIXME: should abstract out inputs static int bleedxint, bleedyint; static XYZ bloodvel; - if (bloodtoggle && tutoriallevel != 1) { + if (bloodtoggle && !Tutorial::active) { if (bleeding <= 0 && spurt) { spurt = 0; for (int i = 0; i < 3; i++) { @@ -696,8 +757,8 @@ void Person::DoBlood(float howmuch, int which) bloodvel.z = 10; bloodvel = DoRotation(bloodvel, ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0) * scale; - Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); - Sprite::MakeSprite(bloodflamesprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .3, 1); + Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodflamesprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords, bloodvel, 1, 1, 1, .3, 1); } } if (Random() % 2 == 0) // 50% chance @@ -717,13 +778,13 @@ void Person::DoBlood(float howmuch, int which) if (skeleton.free) { Sprite::MakeSprite(splintersprite, jointPos(head) * scale + coords, bloodvel, 1, 1, 1, .05, 1); } else { - Sprite::MakeSprite(splintersprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(splintersprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords, bloodvel, 1, 1, 1, .05, 1); } Sprite::setLastSpriteSpecial(3); // sets it to teeth } } } - if (decals) { + if (decalstoggle) { // FIXME: manipulating attributes bleeding = howmuch + (float)abs(Random() % 100) / 200 - .25; bleedxint = 0; @@ -744,7 +805,6 @@ void Person::DoBlood(float howmuch, int which) bleedx /= realtexdetail; direction = abs(Random() % 2) * 2 - 1; } - } if (bleeding > 2) bleeding = 2; @@ -761,7 +821,7 @@ void Person::DoBloodBig(float howmuch, int which) if (howmuch && id == 0) blooddimamount = 1; - if (tutoriallevel != 1 || id == 0) + if (!Tutorial::active || id == 0) if (aitype != playercontrolled && howmuch > 0) { // play pain sounds int whichsound = -1; @@ -791,7 +851,7 @@ void Person::DoBloodBig(float howmuch, int which) Game::flash(.5, 0); } - if (bloodtoggle && decals && tutoriallevel != 1) { + if (bloodtoggle && decalstoggle && !Tutorial::active) { if (bleeding <= 0 && spurt) { spurt = 0; for (int i = 0; i < 3; i++) { @@ -807,8 +867,8 @@ void Person::DoBloodBig(float howmuch, int which) bloodvel.z = 10; bloodvel = DoRotation(bloodvel, ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0) * scale; - Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); - Sprite::MakeSprite(bloodflamesprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .3, 1); + Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodflamesprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords, bloodvel, 1, 1, 1, .3, 1); } } } @@ -838,7 +898,6 @@ void Person::DoBloodBig(float howmuch, int which) offsetx = 20; } - int startx = 512; int starty = 512; int endx = 0; @@ -848,10 +907,14 @@ void Person::DoBloodBig(float howmuch, int which) for (i = 0; i < 512; i++) { for (j = 0; j < 512; j++) { if (bloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && bloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) { - if (i < startx) startx = i; - if (j < starty) starty = j; - if (i > endx) endx = i; - if (j > endy) endy = j; + if (i < startx) + startx = i; + if (j < starty) + starty = j; + if (i > endx) + endx = i; + if (j > endy) + endy = j; } } } @@ -859,10 +922,14 @@ void Person::DoBloodBig(float howmuch, int which) for (i = 0; i < 512; i++) { for (j = 0; j < 512; j++) { if (wolfbloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && wolfbloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) { - if (i < startx) startx = i; - if (j < starty) starty = j; - if (i > endx) endx = i; - if (j > endy) endy = j; + if (i < startx) + startx = i; + if (j < starty) + starty = j; + if (i > endx) + endx = i; + if (j > endy) + endy = j; } } } @@ -872,12 +939,18 @@ void Person::DoBloodBig(float howmuch, int which) starty += offsety; endy += offsety; - if (startx < 0) startx = 0; - if (starty < 0) starty = 0; - if (endx > 512 - 1) endx = 512 - 1; - if (endy > 512 - 1) endy = 512 - 1; - if (endx < startx) endx = startx; - if (endy < starty) endy = starty; + if (startx < 0) + startx = 0; + if (starty < 0) + starty = 0; + if (endx > 512 - 1) + endx = 512 - 1; + if (endy > 512 - 1) + endy = 512 - 1; + if (endx < startx) + endx = startx; + if (endy < starty) + endy = starty; startx /= realtexdetail; starty /= realtexdetail; @@ -940,13 +1013,12 @@ void Person::DoBloodBig(float howmuch, int which) if (bleedy > skeleton.skinsize - 1) bleedy = skeleton.skinsize - 1; direction = abs(Random() % 2) * 2 - 1; - } bleeding = howmuch + (float)abs(Random() % 100) / 200 - .25; deathbleeding += bleeding; bloodloss += bleeding * 3; - if (tutoriallevel != 1 && aitype != playercontrolled && bloodloss > damagetolerance * 2 / 3 && bloodloss < damagetolerance && creature == rabbittype) { + if (!Tutorial::active && aitype != playercontrolled && bloodloss > damagetolerance * 2 / 3 && bloodloss < damagetolerance && creature == rabbittype) { if (abs(Random() % 2) == 0) { aitype = gethelptype; lastseentime = 12; @@ -974,7 +1046,7 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) float coordsx, coordsy; float total; - if (bloodtoggle && decals && tutoriallevel != 1) { + if (bloodtoggle && decalstoggle && !Tutorial::active) { where -= coords; if (!skeleton.free) where = DoRotation(where, 0, -yaw, 0); @@ -990,9 +1062,9 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) if (whichtri != -1) { // low level geometry math p0 = colpoint; - p1 = skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[whichtri].vertex[0]]; - p2 = skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[whichtri].vertex[1]]; - p3 = skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[whichtri].vertex[2]]; + p1 = skeleton.drawmodel.getTriangleVertex(whichtri, 0); + p2 = skeleton.drawmodel.getTriangleVertex(whichtri, 1); + p3 = skeleton.drawmodel.getTriangleVertex(whichtri, 2); bary.x = distsq(&p0, &p1); bary.y = distsq(&p0, &p2); @@ -1012,7 +1084,6 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) bary.y /= total; bary.z /= total; - gxx.x = skeleton.drawmodel.Triangles[whichtri].gx[0]; gxx.y = skeleton.drawmodel.Triangles[whichtri].gx[1]; gxx.z = skeleton.drawmodel.Triangles[whichtri].gx[2]; @@ -1037,8 +1108,8 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) bloodvel.z = 10; bloodvel = DoRotation(bloodvel, ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0) * scale; - Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); - Sprite::MakeSprite(bloodflamesprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .3, 1); + Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodflamesprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords, bloodvel, 1, 1, 1, .3, 1); } } } @@ -1058,10 +1129,14 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) for (i = 0; i < 512; i++) { for (j = 0; j < 512; j++) { if (bloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && bloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) { - if (i < startx) startx = i; - if (j < starty) starty = j; - if (i > endx) endx = i; - if (j > endy) endy = j; + if (i < startx) + startx = i; + if (j < starty) + starty = j; + if (i > endx) + endx = i; + if (j > endy) + endy = j; } } } @@ -1069,10 +1144,14 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) for (i = 0; i < 512; i++) { for (j = 0; j < 512; j++) { if (wolfbloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && wolfbloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) { - if (i < startx) startx = i; - if (j < starty) starty = j; - if (i > endx) endx = i; - if (j > endy) endy = j; + if (i < startx) + startx = i; + if (j < starty) + starty = j; + if (i > endx) + endx = i; + if (j > endy) + endy = j; } } } @@ -1081,12 +1160,18 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) starty += offsety; endy += offsety; - if (startx < 0) startx = 0; - if (starty < 0) starty = 0; - if (endx > 512 - 1) endx = 512 - 1; - if (endy > 512 - 1) endy = 512 - 1; - if (endx < startx) endx = startx; - if (endy < starty) endy = starty; + if (startx < 0) + startx = 0; + if (starty < 0) + starty = 0; + if (endx > 512 - 1) + endx = 512 - 1; + if (endy > 512 - 1) + endy = 512 - 1; + if (endx < startx) + endx = startx; + if (endy < starty) + endy = starty; startx /= realtexdetail; starty /= realtexdetail; @@ -1159,7 +1244,7 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) deathbleeding += bleeding; bloodloss += bleeding * 3; - if (tutoriallevel != 1 && aitype != playercontrolled && bloodloss > damagetolerance * 2 / 3 && bloodloss < damagetolerance && creature == rabbittype) { + if (!Tutorial::active && aitype != playercontrolled && bloodloss > damagetolerance * 2 / 3 && bloodloss < damagetolerance && creature == rabbittype) { if (abs(Random() % 2) == 0) { aitype = gethelptype; lastseentime = 12; @@ -1172,25 +1257,15 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) return 1; } - - /* EFFECT * guessing this performs a reversal */ void Person::Reverse() { - if (!((victim->aitype == playercontrolled - || hostiletime > 1 - || staggerdelay <= 0) - && victim->animTarget != jumpupanim - && victim->animTarget != jumpdownanim - && (tutoriallevel != 1 || cananger) - && hostile)) + if (!((victim->aitype == playercontrolled || hostiletime > 1 || staggerdelay <= 0) && victim->animTarget != jumpupanim && victim->animTarget != jumpdownanim && (!Tutorial::active || cananger) && hostile)) return; - if (normaldotproduct (victim->facing, victim->coords - coords) > 0 - && (victim->id != 0 || difficulty >= 2) - && (creature != wolftype || victim->creature == wolftype)) + if (normaldotproduct(victim->facing, victim->coords - coords) > 0 && (victim->id != 0 || difficulty >= 2) && (creature != wolftype || victim->creature == wolftype)) return; if (animTarget == sweepanim) { @@ -1420,8 +1495,6 @@ void Person::Reverse() for (unsigned i = 0; i < Person::players.size(); i++) { Person::players[i]->wentforweapon = 0; } - - } } if (hasvictim) @@ -1487,40 +1560,44 @@ void Person::Reverse() */ void Person::DoDamage(float howmuch) { - // subtract health (temporary?) - if (tutoriallevel != 1) - damage += howmuch / power; // stats? - if (id != 0) - damagedealt += howmuch / power; - if (id == 0) + if (id == 0) { damagetaken += howmuch / power; + } else { + damagedealt += howmuch / power; + } // reset bonuses - if (id == 0 && (bonus == solidhit || bonus == twoxcombo || bonus == threexcombo || bonus == fourxcombo || bonus == megacombo)) + if (id == 0 && (bonus == solidhit || bonus == twoxcombo || bonus == threexcombo || bonus == fourxcombo || bonus == megacombo)) { bonus = 0; + } + // subtract health - if (tutoriallevel != 1) + if (!Tutorial::active) { + damage += howmuch / power; permanentdamage += howmuch / 2 / power; - if (tutoriallevel != 1) superpermanentdamage += howmuch / 4 / power; + } // visual effects if (permanentdamage > damagetolerance / 2 && permanentdamage - howmuch < damagetolerance / 2 && Random() % 2) DoBlood(1, 255); if ((permanentdamage > damagetolerance * .8 && Random() % 2 && !deathbleeding) || spurt) DoBlood(1, 255); spurt = 0; - if (id == 0) + if (id == 0) { camerashake += howmuch / 100; - if (id == 0 && ((howmuch > 50 && damage > damagetolerance / 2))) - blackout = damage / damagetolerance; - if (blackout > 1) - blackout = 1; + if ((howmuch > 50 && damage > damagetolerance / 2)) { + blackout = damage / damagetolerance; + if (blackout > 1) { + blackout = 1; + } + } + } // cancel attack? - if (aitype == passivetype && damage < damagetolerance && ((tutoriallevel != 1 || cananger) && hostile)) + if (aitype == passivetype && damage < damagetolerance && ((!Tutorial::active || cananger) && hostile)) aitype = attacktypecutoff; - if (tutoriallevel != 1 && aitype != playercontrolled && damage < damagetolerance && damage > damagetolerance * 2 / 3 && creature == rabbittype) { + if (!Tutorial::active && aitype != playercontrolled && damage < damagetolerance && damage > damagetolerance * 2 / 3 && creature == rabbittype) { if (abs(Random() % 2) == 0) { aitype = gethelptype; lastseentime = 12; @@ -1532,7 +1609,7 @@ void Person::DoDamage(float howmuch) if (howmuch > damagetolerance * 50 && skeleton.free != 2) { XYZ flatvelocity2; XYZ flatfacing2; - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { if (skeleton.free) { flatvelocity2 = skeleton.joints[i].velocity; flatfacing2 = skeleton.joints[i].position * scale + coords; @@ -1561,7 +1638,7 @@ void Person::DoDamage(float howmuch) } // play sounds - if (tutoriallevel != 1 || id == 0) + if (!Tutorial::active || id == 0) { if (speechdelay <= 0 && !dead && aitype != playercontrolled) { int whichsound = -1; @@ -1585,6 +1662,7 @@ void Person::DoDamage(float howmuch) addEnvSound(coords); } } + } speechdelay = .3; } @@ -1603,8 +1681,10 @@ void Person::DoHead() targetheadyaw = (float)((int)((0 - yaw - targetheadyaw + 180) * 100) % 36000) / 100; targetheadpitch = (float)((int)(targetheadpitch * 100) % 36000) / 100; - while (targetheadyaw > 180)targetheadyaw -= 360; - while (targetheadyaw < -180)targetheadyaw += 360; + while (targetheadyaw > 180) + targetheadyaw -= 360; + while (targetheadyaw < -180) + targetheadyaw += 360; if (targetheadyaw > 160) targetheadpitch = targetheadpitch * -1; @@ -1675,7 +1755,7 @@ void Person::DoHead() skeleton.specialforward[0] = facing; //skeleton.specialforward[0]=DoRotation(facing,0,yaw,0); - for (int i = 0; i < skeleton.muscles.size(); i++) { + for (unsigned i = 0; i < skeleton.muscles.size(); i++) { if (skeleton.muscles[i].visible && (skeleton.muscles[i].parent1->label == head || skeleton.muscles[i].parent2->label == head)) { skeleton.FindRotationMuscle(i, animTarget); } @@ -1689,7 +1769,7 @@ void Person::DoHead() void Person::RagDoll(bool checkcollision) { static XYZ change; - static int l, i, j; + static int i; static float speed; if (!skeleton.free) { if (id == 0) @@ -1713,26 +1793,35 @@ void Person::RagDoll(bool checkcollision) freefall = 1; skeleton.freefall = 1; - if (!isnormal(velocity.x)) velocity.x = 0; - if (!isnormal(velocity.y)) velocity.y = 0; - if (!isnormal(velocity.z)) velocity.z = 0; - if (!isnormal(yaw)) yaw = 0; - if (!isnormal(coords.x)) coords = 0; - if (!isnormal(tilt)) tilt = 0; - if (!isnormal(tilt2)) tilt2 = 0; + if (!isnormal(velocity.x)) + velocity.x = 0; + if (!isnormal(velocity.y)) + velocity.y = 0; + if (!isnormal(velocity.z)) + velocity.z = 0; + if (!isnormal(yaw)) + yaw = 0; + if (!isnormal(coords.x)) + coords = 0; + if (!isnormal(tilt)) + tilt = 0; + if (!isnormal(tilt2)) + tilt2 = 0; - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { skeleton.joints[i].delay = 0; skeleton.joints[i].locked = 0; skeleton.joints[i].position = DoRotation(DoRotation(DoRotation(skeleton.joints[i].position, 0, 0, tilt), tilt2, 0, 0), 0, yaw, 0); - if (!isnormal(skeleton.joints[i].position.x)) skeleton.joints[i].position = DoRotation(skeleton.joints[i].position, 0, yaw, 0); - if (!isnormal(skeleton.joints[i].position.x)) skeleton.joints[i].position = coords; + if (!isnormal(skeleton.joints[i].position.x)) + skeleton.joints[i].position = DoRotation(skeleton.joints[i].position, 0, yaw, 0); + if (!isnormal(skeleton.joints[i].position.x)) + skeleton.joints[i].position = coords; skeleton.joints[i].position.y += .1; skeleton.joints[i].oldposition = skeleton.joints[i].position; skeleton.joints[i].realoldposition = skeleton.joints[i].position * scale + coords; } - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { skeleton.joints[i].velocity = 0; skeleton.joints[i].velchange = 0; } @@ -1753,7 +1842,7 @@ void Person::RagDoll(bool checkcollision) speed *= speedmult; - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { if ((Animation::animations[animCurrent].attack != reversed || animCurrent == swordslashreversedanim) && animCurrent != rabbitkickanim && !isLanding() && !wasLanding() && Animation::animations[animCurrent].height == Animation::animations[animTarget].height) skeleton.joints[i].velocity = velocity / scale + facing * 5 + DoRotation(DoRotation(DoRotation((targetFrame().joints[i].position - currentFrame().joints[i].position) * speed, 0, 0, tilt), tilt2, 0, 0), 0, yaw, 0); else @@ -1762,51 +1851,49 @@ void Person::RagDoll(bool checkcollision) change.y = (float)(Random() % 100) / 100; change.z = (float)(Random() % 100) / 100; skeleton.joints[i].velocity += change; - skeleton.joints[abs(Random() % skeleton.joints.size())].velocity -= change; + skeleton.joints[fabs(Random() % skeleton.joints.size())].velocity -= change; change.x = (float)(Random() % 100) / 100; change.y = (float)(Random() % 100) / 100; change.z = (float)(Random() % 100) / 100; skeleton.joints[i].velchange += change; - skeleton.joints[abs(Random() % skeleton.joints.size())].velchange -= change; + skeleton.joints[fabs(Random() % skeleton.joints.size())].velchange -= change; } if (checkcollision) { - XYZ average; XYZ lowpoint; XYZ colpoint; - int howmany; - average = 0; - howmany = 0; - for (j = 0; j < skeleton.joints.size(); j++) { - average += skeleton.joints[j].position; - howmany++; - } - average /= howmany; - coords += average * scale; - for (j = 0; j < skeleton.joints.size(); j++) { - skeleton.joints[j].position -= average; + if (!skeleton.joints.empty()) { + XYZ average; + average = 0; + for (unsigned j = 0; j < skeleton.joints.size(); j++) { + average += skeleton.joints[j].position; + } + average /= skeleton.joints.size(); + coords += average * scale; + for (unsigned j = 0; j < skeleton.joints.size(); j++) { + skeleton.joints[j].position -= average; + } } whichpatchx = coords.x / (terrain.size / subdivision * terrain.scale); whichpatchz = coords.z / (terrain.size / subdivision * terrain.scale); - if (terrain.patchobjectnum[whichpatchx][whichpatchz]) - for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) { - i = terrain.patchobjects[whichpatchx][whichpatchz][l]; - lowpoint = coords; - lowpoint.y += 1; - if (SphereCheck(&lowpoint, 3, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) { - coords.x = lowpoint.x; - coords.z = lowpoint.z; - } + for (unsigned int l = 0; l < terrain.patchobjects[whichpatchx][whichpatchz].size(); l++) { + i = terrain.patchobjects[whichpatchx][whichpatchz][l]; + lowpoint = coords; + lowpoint.y += 1; + if (SphereCheck(&lowpoint, 3, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw, &Object::objects[i]->model) != -1) { + coords.x = lowpoint.x; + coords.z = lowpoint.z; } + } } yaw = 0; updatedelay = 0; velocity = 0; - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { velocity += skeleton.joints[i].velocity * scale; } velocity /= skeleton.joints.size(); @@ -1836,8 +1923,6 @@ void Person::RagDoll(bool checkcollision) } } - - /* EFFECT */ void Person::FootLand(bodypart whichfoot, float opacity) @@ -1903,7 +1988,7 @@ void Person::Puff(int whichlabel) /* EFFECT * I think I added this in an attempt to clean up code */ -void Person::setAnimation(int animation) +void Person::setTargetAnimation(int animation) { animTarget = animation; frameTarget = 0; @@ -1936,7 +2021,7 @@ void Person::DoAnimations() vel[2] = velocity.z; if (id == 0) { - OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel); + OPENAL_3D_SetAttributes(channels[whooshsound], gLoc); OPENAL_SetVolume(channels[whooshsound], 64 * findLength(&velocity) / 5); } if (((velocity.y < -15) || (crouchkeydown && velocity.y < -8)) && abs(velocity.y) * 4 > fast_sqrt(velocity.x * velocity.x * velocity.z * velocity.z)) @@ -1944,7 +2029,7 @@ void Person::DoAnimations() if (!crouchkeydown && velocity.y >= -15) landhard = 0; } - if ((animCurrent == jumpupanim || animTarget == jumpdownanim)/*&&velocity.y<40*/ && !isFlip() && (!isLanding() && !isLandhard()) && ((crouchkeydown && !crouchtogglekeydown))) { + if ((animCurrent == jumpupanim || animTarget == jumpdownanim) /*&&velocity.y<40*/ && !isFlip() && (!isLanding() && !isLandhard()) && ((crouchkeydown && !crouchtogglekeydown))) { XYZ targfacing; targfacing = 0; targfacing.z = 1; @@ -1976,7 +2061,6 @@ void Person::DoAnimations() crouchtogglekeydown = 1; } - if (Animation::animations[animTarget].attack || animCurrent == getupfrombackanim || animCurrent == getupfromfrontanim) { if (detail) normalsupdatedelay = 0; @@ -2033,9 +2117,9 @@ void Person::DoAnimations() drawtogglekeydown = 1; } //Footstep sounds - if (tutoriallevel != 1 || id == 0) + if (!Tutorial::active || id == 0) if ((targetFrame().label && (targetFrame().label < 5 || targetFrame().label == 8))) { - int whichsound; + int whichsound = -1; if (onterrain) { if (terrain.getOpacity(coords.x, coords.z) < .2) { if (targetFrame().label == 1) @@ -2050,7 +2134,6 @@ void Person::DoAnimations() FootLand(rightfoot, 1); FootLand(leftfoot, 1); } - } if (terrain.getOpacity(coords.x, coords.z) >= .2) { if (targetFrame().label == 1) @@ -2075,32 +2158,38 @@ void Person::DoAnimations() if (r == 2) whichsound = highwhooshsound; } - if (Animation::animations[animTarget].attack == neutral) + if (Animation::animations[animTarget].attack == neutral) { whichsound = movewhooshsound; - } else if (targetFrame().label == 4) + } + } else if (targetFrame().label == 4) { whichsound = knifeswishsound; - if (targetFrame().label == 8 && tutoriallevel != 1) + } + if (targetFrame().label == 8 && !Tutorial::active) { whichsound = landsound2; + } - emit_sound_at(whichsound, coords, 256.); + if (whichsound != -1) { + emit_sound_at(whichsound, coords, 256.); - if (id == 0) - if (whichsound == footstepsound || whichsound == footstepsound2 || whichsound == footstepsound3 || whichsound == footstepsound4) { - if (animTarget == wolfrunninganim || animTarget == rabbitrunninganim) { - addEnvSound(coords, 15); - } else { - addEnvSound(coords, 6); + if (id == 0) { + if (whichsound == footstepsound || whichsound == footstepsound2 || whichsound == footstepsound3 || whichsound == footstepsound4) { + if (animTarget == wolfrunninganim || animTarget == rabbitrunninganim) { + addEnvSound(coords, 15); + } else { + addEnvSound(coords, 6); + } } } - if (targetFrame().label == 3) { - whichsound--; - emit_sound_at(whichsound, coords, 128.); + if (targetFrame().label == 3) { + whichsound--; + emit_sound_at(whichsound, coords, 128.); + } } } //Combat sounds - if (tutoriallevel != 1 || id == 0) + if (!Tutorial::active || id == 0) if (speechdelay <= 0) if (animTarget != crouchstabanim && animTarget != swordgroundstabanim && animTarget != staffgroundsmashanim) if ((targetFrame().label && (targetFrame().label < 5 || targetFrame().label == 8))) { @@ -2109,16 +2198,24 @@ void Person::DoAnimations() if (Animation::animations[animTarget].attack != neutral) { unsigned r = abs(Random() % 4); if (creature == rabbittype) { - if (r == 0) whichsound = rabbitattacksound; - if (r == 1) whichsound = rabbitattack2sound; - if (r == 2) whichsound = rabbitattack3sound; - if (r == 3) whichsound = rabbitattack4sound; + if (r == 0) + whichsound = rabbitattacksound; + if (r == 1) + whichsound = rabbitattack2sound; + if (r == 2) + whichsound = rabbitattack3sound; + if (r == 3) + whichsound = rabbitattack4sound; } if (creature == wolftype) { - if (r == 0) whichsound = barksound; - if (r == 1) whichsound = bark2sound; - if (r == 2) whichsound = bark3sound; - if (r == 3) whichsound = barkgrowlsound; + if (r == 0) + whichsound = barksound; + if (r == 1) + whichsound = bark2sound; + if (r == 2) + whichsound = bark3sound; + if (r == 3) + whichsound = barkgrowlsound; } speechdelay = .3; } @@ -2129,8 +2226,6 @@ void Person::DoAnimations() } } - - if ((!wasLanding() && !wasLandhard()) && animCurrent != getIdle() && (isLanding() || isLandhard())) { FootLand(leftfoot, 1); FootLand(rightfoot, 1); @@ -2194,7 +2289,7 @@ void Person::DoAnimations() victim->skeleton.free = 1; victim->skeleton.broken = 0; - for (int j = 0; j < victim->skeleton.joints.size(); j++) { + for (unsigned j = 0; j < victim->skeleton.joints.size(); j++) { victim->skeleton.joints[j].velchange = 0; victim->skeleton.joints[j].locked = 0; } @@ -2253,7 +2348,6 @@ void Person::DoAnimations() } } - if ((animCurrent == walljumprightkickanim && animTarget == walljumprightkickanim) || (animCurrent == walljumpleftkickanim && animTarget == walljumpleftkickanim)) { XYZ rotatetarget = DoRotation(skeleton.forward, 0, yaw, 0); Normalise(&rotatetarget); @@ -2273,7 +2367,7 @@ void Person::DoAnimations() if ((animTarget == rabbitrunninganim || animTarget == wolfrunninganim) && frameTarget == 3 && (jumpkeydown || attackkeydown || id != 0)) dojumpattack = 1; if (hasvictim) - if (distsq(&victim->coords, &/*Person::players[i]->*/coords) < 5 && victim->aitype == gethelptype && (attackkeydown) && !victim->skeleton.free && victim->isRun() && victim->runninghowlong >= 1) + if (distsq(&victim->coords, &/*Person::players[i]->*/ coords) < 5 && victim->aitype == gethelptype && (attackkeydown) && !victim->skeleton.free && victim->isRun() && victim->runninghowlong >= 1) dojumpattack = 1; if (!hostile) dojumpattack = 0; @@ -2332,7 +2426,7 @@ void Person::DoAnimations() } if ((Animation::animations[animTarget].attack == normalattack || animTarget == walljumprightkickanim || animTarget == walljumpleftkickanim) && (!feint) && (victim->skeleton.free != 2 || animTarget == killanim || animTarget == dropkickanim || animTarget == crouchstabanim || animTarget == swordgroundstabanim || animTarget == staffgroundsmashanim)) { if (animTarget == spinkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { - if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && 3 && Animation::animations[victim->animTarget].height != lowheight) { + if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) { escapednum = 0; if (id == 0) camerashake += .4; @@ -2342,7 +2436,7 @@ void Person::DoAnimations() if (creature == wolftype) DoBloodBig(0, 250); } - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords, 128.); } if (creature == wolftype) { @@ -2356,7 +2450,7 @@ void Person::DoAnimations() relative.y = 0; Normalise(&relative); relative = DoRotation(relative, 0, -90, 0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } victim->jointVel(head) += relative * damagemult * 200; @@ -2368,7 +2462,7 @@ void Person::DoAnimations() } if (animTarget == wolfslapanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { - if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && 3 && Animation::animations[victim->animTarget].height != lowheight) { + if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) { escapednum = 0; if (id == 0) camerashake += .4; @@ -2391,7 +2485,7 @@ void Person::DoAnimations() relative.y -= 1; Normalise(&relative); relative = DoRotation(relative, 0, 90, 0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 20; } victim->jointVel(head) += relative * damagemult * 100; @@ -2407,7 +2501,7 @@ void Person::DoAnimations() camerashake += .4; victim->spurt = 1; DoBlood(.2, 250); - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords, 160.); } if (creature == wolftype) { @@ -2421,7 +2515,7 @@ void Person::DoAnimations() relative.y = 0; Normalise(&relative); relative = DoRotation(relative, 0, -90, 0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } victim->jointVel(head) += relative * damagemult * 200; @@ -2442,7 +2536,7 @@ void Person::DoAnimations() camerashake += .4; victim->spurt = 1; DoBlood(.2, 250); - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords, 160.); } if (creature == wolftype) { @@ -2456,7 +2550,7 @@ void Person::DoAnimations() relative.y = 0; Normalise(&relative); relative = DoRotation(relative, 0, 90, 0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } victim->jointVel(head) += relative * damagemult * 200; @@ -2485,7 +2579,7 @@ void Person::DoAnimations() relative = victim->coords - coords; relative.y = 0; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 30; } victim->jointVel(head) += relative * damagemult * 100; @@ -2506,7 +2600,7 @@ void Person::DoAnimations() victim->skeleton.broken = 0; victim->skeleton.spinny = 1; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velchange = 0; victim->skeleton.joints[i].delay = 0; victim->skeleton.joints[i].locked = 0; @@ -2517,7 +2611,7 @@ void Person::DoAnimations() relative = 0; relative.y = 1; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity.y = relative.y * 10; victim->skeleton.joints[i].position.y += relative.y * .3; victim->skeleton.joints[i].oldposition.y += relative.y * .3; @@ -2533,14 +2627,14 @@ void Person::DoAnimations() escapednum = 0; if (id == 0) camerashake += .4; - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, coords, 128.); } XYZ relative; relative = victim->coords - coords; relative.y = 0; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 90; } victim->Puff(abdomen); @@ -2558,7 +2652,7 @@ void Person::DoAnimations() escapednum = 0; if (id == 0) camerashake += .4; - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(thudsound, coords); } @@ -2567,7 +2661,7 @@ void Person::DoAnimations() victim->skeleton.broken = 0; victim->skeleton.spinny = 1; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velchange = 0; //victim->skeleton.joints[i].delay=0; victim->skeleton.joints[i].locked = 0; @@ -2577,7 +2671,7 @@ void Person::DoAnimations() Normalise(&relative); relative.y += .3; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 20; } if (!victim->dead) @@ -2589,8 +2683,6 @@ void Person::DoAnimations() staggerdelay = .5; if (!victim->dead) staggerdelay = 1.2; - - } } @@ -2663,13 +2755,12 @@ void Person::DoAnimations() victim->skeleton.free = 1; victim->skeleton.broken = 0; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velchange = 0; victim->skeleton.joints[i].locked = 0; //victim->skeleton.joints[i].velocity=0; } emit_sound_at(fleshstabsound, coords, 128); - } if (whichtri != -1 || weapons[weaponids[weaponactive]].bloody) { weapons[weaponids[weaponactive]].blooddrip += 5; @@ -2753,7 +2844,7 @@ void Person::DoAnimations() victim->skeleton.free = 1; victim->skeleton.broken = 0; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velchange = 0; victim->skeleton.joints[i].locked = 0; //victim->skeleton.joints[i].velocity=0; @@ -2791,7 +2882,7 @@ void Person::DoAnimations() victim->spurt = 1; DoBlood(.2, 235); } - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords, 128); } @@ -2800,7 +2891,7 @@ void Person::DoAnimations() relative = victim->coords - coords; relative.y = 0; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity = relative * 30; } victim->jointVel(head) += relative * damagemult * 150; @@ -2819,22 +2910,21 @@ void Person::DoAnimations() } } - if (animTarget == winduppunchanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 2) { escapednum = 0; if (id == 0) camerashake += .4; if (victim->damage <= victim->damagetolerance - 60 && normaldotproduct(victim->facing, victim->coords - coords) < (scale * 5) * (scale * 5) * 0 && Animation::animations[victim->animTarget].height != lowheight) { - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(thudsound, victim->coords); } } else if (victim->damage <= victim->damagetolerance - 60 && normaldotproduct(victim->facing, victim->coords - coords) < (scale * 5) * (scale * 5) * 0 && Animation::animations[victim->animTarget].height == lowheight) { - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(whooshhitsound, victim->coords); } } else { - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords); } } @@ -2847,7 +2937,7 @@ void Person::DoAnimations() Normalise(&relative); relative.y = .3; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity = relative * 5; } victim->jointVel(abdomen) += relative * damagemult * 400; @@ -2914,13 +3004,14 @@ void Person::DoAnimations() if (animTarget == knifeslashstartanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { if (hasvictim) - if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 4.5 &&/*Animation::animations[victim->animTarget].height!=lowheight&&*/victim->animTarget != dodgebackanim && victim->animTarget != rollanim) { + if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 4.5 && /*Animation::animations[victim->animTarget].height!=lowheight&&*/ victim->animTarget != dodgebackanim && victim->animTarget != rollanim) { escapednum = 0; - if (tutoriallevel != 1) + if (!Tutorial::active) { victim->DoBloodBig(1.5 / victim->armorhigh, 225); + } award_bonus(id, Slicebonus); - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(knifeslicesound, victim->coords); } //victim->jointVel(abdomen)+=relative*damagemult*200; @@ -2937,11 +3028,12 @@ void Person::DoAnimations() if (aitype != playercontrolled) weaponmissdelay = .6; - if (tutoriallevel != 1) - if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody) + if (!Tutorial::active) { + if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody) { weapons[weaponids[weaponactive]].bloody = 1; - if (tutoriallevel != 1) + } weapons[weaponids[weaponactive]].blooddrip += 3; + } XYZ footvel, footpoint; footvel = 0; @@ -2950,19 +3042,18 @@ void Person::DoAnimations() } else { footpoint = DoRotation((victim->jointPos(abdomen) + victim->jointPos(neck)) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords; } - if (tutoriallevel != 1) { - if (bloodtoggle) + if (Tutorial::active) { + Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .6, .3); + } else { + if (bloodtoggle) { Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .6, .3); + } footvel = DoRotation(facing, 0, 90, 0) * .8; - //footvel.y-=.3; Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 7, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9); Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 3, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9); Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * 5, 1, 1, 1, .2, 1); Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * 2, 1, 1, 1, .2, 1); } - if (tutoriallevel == 1) { - Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .6, .3); - } victim->DoDamage(damagemult * 0); } } @@ -2971,31 +3062,25 @@ void Person::DoAnimations() if (victim->weaponactive == -1 || normaldotproduct(victim->facing, victim->coords - coords) > 0 || (Random() % 2 == 0)) { award_bonus(id, Slashbonus); escapednum = 0; - if (tutoriallevel != 1) { + if (!Tutorial::active) { if (normaldotproduct(victim->facing, victim->coords - coords) < 0) victim->DoBloodBig(2 / victim->armorhigh, 190); else victim->DoBloodBig(2 / victim->armorhigh, 185); victim->deathbleeding = 1; emit_sound_at(swordslicesound, victim->coords); - } - //victim->jointVel(abdomen)+=relative*damagemult*200; - if (tutoriallevel != 1) { victim->frameTarget = 0; victim->animTarget = staggerbackhardanim; victim->targetyaw = targetyaw + 180; victim->target = 0; - } - - if (tutoriallevel != 1) { - if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody) + if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody) { weapons[weaponids[weaponactive]].bloody = 1; + } weapons[weaponids[weaponactive]].blooddrip += 3; float bloodlossamount; bloodlossamount = 200 + abs((float)(Random() % 40)) - 20; victim->bloodloss += bloodlossamount / victim->armorhigh; - //victim->bloodloss+=100*(6.5-distsq(&coords,&victim->coords)); victim->DoDamage(damagemult * 0); XYZ footvel, footpoint; @@ -3005,8 +3090,9 @@ void Person::DoAnimations() } else { footpoint = DoRotation((victim->jointPos(abdomen) + victim->jointPos(neck)) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords; } - if (bloodtoggle) + if (bloodtoggle) { Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .9, .3); + } footvel = DoRotation(facing, 0, 90, 0) * .8; footvel.y -= .3; Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 7, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9); @@ -3028,7 +3114,6 @@ void Person::DoAnimations() } } - XYZ aim; victim->Puff(righthand); victim->target = 0; @@ -3049,14 +3134,13 @@ void Person::DoAnimations() for (unsigned i = 0; i < Person::players.size(); i++) { Person::players[i]->wentforweapon = 0; } - } } } if (animTarget == staffhitanim && Animation::animations[animTarget].frames[frameCurrent].label == 5 && victim->animTarget != rollanim) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim && victim->animTarget != sweepanim) { - if (tutoriallevel != 1) { + if (!Tutorial::active) { weapons[weaponids[0]].damage += .4 + float(abs(Random() % 100) - 50) / 250; escapednum = 0; if (id == 0) @@ -3074,13 +3158,13 @@ void Person::DoAnimations() relative = DoRotation(relative, 0, 90, 0); relative.y -= 1; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 60; } victim->jointVel(head) += relative * damagemult * 230; victim->jointVel(neck) += relative * damagemult * 230; victim->Puff(head); - if (tutoriallevel != 1) { + if (!Tutorial::active) { victim->DoDamage(damagemult * 120 / victim->protectionhigh); award_bonus(id, solidhit, 30); @@ -3090,7 +3174,7 @@ void Person::DoAnimations() if (animTarget == staffspinhitanim && Animation::animations[animTarget].frames[frameCurrent].label == 5 && victim->animTarget != rollanim) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim && victim->animTarget != sweepanim) { - if (tutoriallevel != 1) { + if (!Tutorial::active) { weapons[weaponids[0]].damage += .6 + float(abs(Random() % 100) - 50) / 250; escapednum = 0; if (id == 0) @@ -3106,13 +3190,13 @@ void Person::DoAnimations() relative.y = 0; Normalise(&relative); relative = DoRotation(relative, 0, -90, 0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } victim->jointVel(head) += relative * damagemult * 220; victim->jointVel(neck) += relative * damagemult * 220; victim->Puff(head); - if (tutoriallevel != 1) { + if (!Tutorial::active) { victim->DoDamage(damagemult * 350 / victim->protectionhead); award_bonus(id, solidhit, 60); @@ -3123,7 +3207,7 @@ void Person::DoAnimations() if (animTarget == staffgroundsmashanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5) { escapednum = 0; - if (tutoriallevel != 1) { + if (!Tutorial::active) { if (!victim->dead) weapons[weaponids[0]].damage += .4 + float(abs(Random() % 100) - 50) / 500; if (id == 0) @@ -3137,7 +3221,7 @@ void Person::DoAnimations() victim->skeleton.free = 1; victim->skeleton.broken = 0; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velchange = 0; victim->skeleton.joints[i].locked = 0; //victim->skeleton.joints[i].velocity=0; @@ -3149,18 +3233,18 @@ void Person::DoAnimations() relative.y = -1; Normalise(&relative); if (!victim->dead) { - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity = relative * damagemult * 40; } victim->jointVel(abdomen) += relative * damagemult * 40; } if (victim->dead) { - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity = relative * damagemult * abs(Random() % 20); } } victim->Puff(abdomen); - if (tutoriallevel != 1) { + if (!Tutorial::active) { victim->DoDamage(damagemult * 100 / victim->protectionhigh); if (!victim->dead) { @@ -3188,11 +3272,11 @@ void Person::DoAnimations() DoBlood(.2, 250); } victim->RagDoll(0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } victim->jointVel(head) += relative * damagemult * 200; - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords, 128.); } victim->Puff(head); @@ -3207,7 +3291,7 @@ void Person::DoAnimations() } else { if (victim->damage >= victim->damagetolerance) victim->RagDoll(0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 10; } victim->jointVel(abdomen) += relative * damagemult * 200; @@ -3215,7 +3299,7 @@ void Person::DoAnimations() victim->animTarget = staggerbackhighanim; victim->targetyaw = targetyaw + 180; victim->target = 0; - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(landsound2, victim->coords, 128.); } victim->Puff(abdomen); @@ -3226,7 +3310,6 @@ void Person::DoAnimations() victim->DoBloodBig(2 / victim->armorhigh, 170); } } - } } @@ -3237,7 +3320,7 @@ void Person::DoAnimations() escapednum = 0; if (id == 0) camerashake += .2; - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(landsound2, victim->coords, 128.); } XYZ relative; @@ -3248,12 +3331,12 @@ void Person::DoAnimations() if (Animation::animations[victim->animTarget].height == middleheight || Animation::animations[victim->animCurrent].height == middleheight || victim->damage >= victim->damagetolerance - 40) { victim->RagDoll(0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 15; } relative = DoRotation(relative, 0, -90, 0); relative.y += .1; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { if (victim->skeleton.joints[i].label == leftfoot || victim->skeleton.joints[i].label == rightfoot || victim->skeleton.joints[i].label == leftankle || victim->skeleton.joints[i].label == rightankle) victim->skeleton.joints[i].velocity = relative * 80; } @@ -3263,11 +3346,11 @@ void Person::DoAnimations() } else { if (victim->damage >= victim->damagetolerance) victim->RagDoll(0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 10; } relative = DoRotation(relative, 0, -90, 0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { if (victim->skeleton.joints[i].label == leftfoot || victim->skeleton.joints[i].label == rightfoot || victim->skeleton.joints[i].label == leftankle || victim->skeleton.joints[i].label == rightankle) victim->skeleton.joints[i].velocity += relative * damagemult * 80; } @@ -3276,7 +3359,7 @@ void Person::DoAnimations() victim->animTarget = staggerbackhighanim; victim->targetyaw = targetyaw + 180; victim->target = 0; - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(landsound2, victim->coords, 128.); } victim->Puff(abdomen); @@ -3284,7 +3367,6 @@ void Person::DoAnimations() } SolidHitBonus(id); - } } } @@ -3297,7 +3379,7 @@ void Person::DoAnimations() victim->spurt = 1; DoBlood(.2, 230); } - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords, 128.); } if (creature == wolftype) { @@ -3310,7 +3392,7 @@ void Person::DoAnimations() relative = victim->coords - oldcoords; relative.y = 0; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } victim->jointVel(abdomen) += relative * damagemult * 200; @@ -3347,7 +3429,7 @@ void Person::DoAnimations() relative = victim->coords - oldcoords; relative.y = 0; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 30; } victim->jointVel(abdomen) += relative * damagemult * 200; @@ -3366,7 +3448,7 @@ void Person::DoAnimations() award_bonus(id, staffreversebonus); - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords, 128.); } victim->RagDoll(0); @@ -3376,7 +3458,7 @@ void Person::DoAnimations() relative = victim->coords - oldcoords; relative.y = 0; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 30; } victim->jointVel(abdomen) += relative * damagemult * 200; @@ -3392,7 +3474,7 @@ void Person::DoAnimations() relative.y = 0; Normalise(&relative); relative.y -= .1; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 70; } victim->jointVel(lefthand) *= .1; @@ -3432,8 +3514,6 @@ void Person::DoAnimations() } } - - if (animTarget == swordslashreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) { escapednum = 0; victim->RagDoll(1); @@ -3442,7 +3522,7 @@ void Person::DoAnimations() relative.y = 0; Normalise(&relative); relative.y -= .1; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 70; } victim->jointVel(lefthand) *= .1 - 1; @@ -3465,7 +3545,7 @@ void Person::DoAnimations() victim->spurt = 1; DoBlood(.2, 230); } - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords, 128.); } victim->RagDoll(0); @@ -3474,7 +3554,7 @@ void Person::DoAnimations() relative.y = 0; Normalise(&relative); relative = DoRotation(relative, 0, -90, 0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } victim->jointVel(abdomen) += relative * damagemult * 200; @@ -3494,7 +3574,7 @@ void Person::DoAnimations() Normalise(&relative); if (victim->id == 0) relative /= 30; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } victim->damage = victim->damagetolerance; @@ -3555,7 +3635,6 @@ void Person::DoAnimations() Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 3, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9); Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * 5, 1, 1, 1, .2, 1); Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * 2, 1, 1, 1, .2, 1); - } victim->bloodloss += 10000; victim->velocity = 0; @@ -3569,12 +3648,12 @@ void Person::DoAnimations() if (hasvictim && (animTarget == knifefollowanim || animTarget == knifesneakattackanim) && Animation::animations[animTarget].frames[frameCurrent].label == 6) { escapednum = 0; victim->velocity = 0; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity = 0; } if (animTarget == knifefollowanim) { victim->RagDoll(0); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity = 0; } } @@ -3627,7 +3706,7 @@ void Person::DoAnimations() if (hasvictim && animTarget == swordsneakattackanim && Animation::animations[animTarget].frames[frameCurrent].label == 6) { escapednum = 0; victim->velocity = 0; - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity = 0; } if (weaponactive != -1) { @@ -3658,7 +3737,7 @@ void Person::DoAnimations() DoBlood(.2, 240); } if (weaponactive == -1) { - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, victim->coords, 128.); } } @@ -3695,7 +3774,7 @@ void Person::DoAnimations() relative = DoRotation(relative, 0, 90, 0); relative.y = .5; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 20; } victim->jointVel(head) += relative * damagemult * 200; @@ -3715,7 +3794,7 @@ void Person::DoAnimations() relative = DoRotation(relative, 0, 90, 0); relative.y = .5; Normalise(&relative); - for (int i = 0; i < victim->skeleton.joints.size(); i++) { + for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 20; } victim->jointVel(head) += relative * damagemult * 200; @@ -3727,9 +3806,8 @@ void Person::DoAnimations() } } - //Animation end - if (frameTarget > Animation::animations[animCurrent].frames.size() - 1) { + if (frameTarget > int(Animation::animations[animCurrent].frames.size()) - 1) { frameTarget = 0; if (wasStop()) { animTarget = getIdle(); @@ -3807,7 +3885,6 @@ void Person::DoAnimations() if (!isnormal(coords.x)) coords = oldcoords; oldcoords = coords; - collided = 0; targetoffset = 0; currentoffset = 0; grabdelay = 1; @@ -4182,23 +4259,23 @@ void Person::DoAnimations() oldrot = 0; targetrot = 0; } - if (frameCurrent >= Animation::animations[animCurrent].frames.size()) { + if (frameCurrent >= int(Animation::animations[animCurrent].frames.size())) { frameCurrent = Animation::animations[animCurrent].frames.size() - 1; } if (animCurrent != oldanimCurrent || animTarget != oldanimTarget || ((frameCurrent != oldframeCurrent || frameTarget != oldframeTarget) && !calcrot)) { //Old rotates - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { skeleton.joints[i].position = currentFrame().joints[i].position; } skeleton.FindForwards(); - for (int i = 0; i < skeleton.muscles.size(); i++) { + for (unsigned i = 0; i < skeleton.muscles.size(); i++) { if (skeleton.muscles[i].visible) { skeleton.FindRotationMuscle(i, animTarget); } } - for (int i = 0; i < skeleton.muscles.size(); i++) { + for (unsigned i = 0; i < skeleton.muscles.size(); i++) { if (skeleton.muscles[i].visible) { if (isnormal((float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100)) skeleton.muscles[i].oldrotate1 = (float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100; @@ -4210,18 +4287,18 @@ void Person::DoAnimations() } //New rotates - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { skeleton.joints[i].position = targetFrame().joints[i].position; } skeleton.FindForwards(); - for (int i = 0; i < skeleton.muscles.size(); i++) { + for (unsigned i = 0; i < skeleton.muscles.size(); i++) { if (skeleton.muscles[i].visible) { skeleton.FindRotationMuscle(i, animTarget); } } - for (int i = 0; i < skeleton.muscles.size(); i++) { + for (unsigned i = 0; i < skeleton.muscles.size(); i++) { if (skeleton.muscles[i].visible) { if (isnormal((float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100)) skeleton.muscles[i].newrotate1 = (float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100; @@ -4229,12 +4306,18 @@ void Person::DoAnimations() skeleton.muscles[i].newrotate2 = (float)((int)(skeleton.muscles[i].rotate2 * 100) % 36000) / 100; if (isnormal((float)((int)(skeleton.muscles[i].rotate3 * 100) % 36000) / 100)) skeleton.muscles[i].newrotate3 = (float)((int)(skeleton.muscles[i].rotate3 * 100) % 36000) / 100; - if (skeleton.muscles[i].newrotate3 > skeleton.muscles[i].oldrotate3 + 180) skeleton.muscles[i].newrotate3 -= 360; - if (skeleton.muscles[i].newrotate3 < skeleton.muscles[i].oldrotate3 - 180) skeleton.muscles[i].newrotate3 += 360; - if (skeleton.muscles[i].newrotate2 > skeleton.muscles[i].oldrotate2 + 180) skeleton.muscles[i].newrotate2 -= 360; - if (skeleton.muscles[i].newrotate2 < skeleton.muscles[i].oldrotate2 - 180) skeleton.muscles[i].newrotate2 += 360; - if (skeleton.muscles[i].newrotate1 > skeleton.muscles[i].oldrotate1 + 180) skeleton.muscles[i].newrotate1 -= 360; - if (skeleton.muscles[i].newrotate1 < skeleton.muscles[i].oldrotate1 - 180) skeleton.muscles[i].newrotate1 += 360; + if (skeleton.muscles[i].newrotate3 > skeleton.muscles[i].oldrotate3 + 180) + skeleton.muscles[i].newrotate3 -= 360; + if (skeleton.muscles[i].newrotate3 < skeleton.muscles[i].oldrotate3 - 180) + skeleton.muscles[i].newrotate3 += 360; + if (skeleton.muscles[i].newrotate2 > skeleton.muscles[i].oldrotate2 + 180) + skeleton.muscles[i].newrotate2 -= 360; + if (skeleton.muscles[i].newrotate2 < skeleton.muscles[i].oldrotate2 - 180) + skeleton.muscles[i].newrotate2 += 360; + if (skeleton.muscles[i].newrotate1 > skeleton.muscles[i].oldrotate1 + 180) + skeleton.muscles[i].newrotate1 -= 360; + if (skeleton.muscles[i].newrotate1 < skeleton.muscles[i].oldrotate1 - 180) + skeleton.muscles[i].newrotate1 += 360; } } } @@ -4244,16 +4327,16 @@ void Person::DoAnimations() oldframeTarget = frameTarget; oldframeCurrent = frameCurrent; - for (int i = 0; i < skeleton.joints.size(); i++) { - skeleton.joints[i].velocity = (currentFrame().joints[i].position * (1 - target) + targetFrame().joints[i].position * (target) - skeleton.joints[i].position) / multiplier; - skeleton.joints[i].position = currentFrame().joints[i].position * (1 - target) + targetFrame().joints[i].position * (target); + for (unsigned i = 0; i < skeleton.joints.size(); i++) { + skeleton.joints[i].velocity = (currentFrame().joints[i].position * (1 - target) + targetFrame().joints[i].position * target - skeleton.joints[i].position) / multiplier; + skeleton.joints[i].position = currentFrame().joints[i].position * (1 - target) + targetFrame().joints[i].position * target; } offset = currentoffset * (1 - target) + targetoffset * target; - for (int i = 0; i < skeleton.muscles.size(); i++) { + for (unsigned i = 0; i < skeleton.muscles.size(); i++) { if (skeleton.muscles[i].visible) { - skeleton.muscles[i].rotate1 = skeleton.muscles[i].oldrotate1 * (1 - target) + skeleton.muscles[i].newrotate1 * (target); - skeleton.muscles[i].rotate2 = skeleton.muscles[i].oldrotate2 * (1 - target) + skeleton.muscles[i].newrotate2 * (target); - skeleton.muscles[i].rotate3 = skeleton.muscles[i].oldrotate3 * (1 - target) + skeleton.muscles[i].newrotate3 * (target); + skeleton.muscles[i].rotate1 = skeleton.muscles[i].oldrotate1 * (1 - target) + skeleton.muscles[i].newrotate1 * target; + skeleton.muscles[i].rotate2 = skeleton.muscles[i].oldrotate2 * (1 - target) + skeleton.muscles[i].newrotate2 * target; + skeleton.muscles[i].rotate3 = skeleton.muscles[i].oldrotate3 * (1 - target) + skeleton.muscles[i].newrotate3 * target; } } } @@ -4280,9 +4363,6 @@ void Person::DoStuff() static XYZ flatfacing; static XYZ flatvelocity; static float flatvelspeed; - static int i, j, l; - static XYZ average; - static int howmany; static int bloodsize; static int startx, starty, endx, endy; static GLubyte color; @@ -4374,14 +4454,14 @@ void Person::DoStuff() vel[2] = velocity.z; if (id == 0) { - OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel); + OPENAL_3D_SetAttributes(channels[whooshsound], gLoc); OPENAL_SetVolume(channels[whooshsound], 64 * findLength(&velocity) / 5); } } } while (flamedelay < 0 && onfire) { flamedelay += .006; - howmany = abs(Random() % (skeleton.joints.size())); + int howmany = fabs(Random() % (skeleton.joints.size())); if (skeleton.free) { flatvelocity = skeleton.joints[howmany].velocity * scale / 2; flatfacing = skeleton.joints[howmany].position * scale + coords; @@ -4392,9 +4472,9 @@ void Person::DoStuff() Sprite::MakeSprite(flamesprite, flatfacing, flatvelocity, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1); } - while (flamedelay < 0 && !onfire && tutoriallevel == 1 && id != 0) { + while (flamedelay < 0 && !onfire && Tutorial::active && id != 0) { flamedelay += .05; - howmany = abs(Random() % (skeleton.joints.size())); + int howmany = fabs(Random() % (skeleton.joints.size())); if (skeleton.free) { flatvelocity = skeleton.joints[howmany].velocity * scale / 2; flatfacing = skeleton.joints[howmany].position * scale + coords; @@ -4424,12 +4504,12 @@ void Person::DoStuff() if (skeleton.free) { bloodvel -= DoRotation(skeleton.forward * 10 * scale, ((float)(Random() % 100)) / 40, ((float)(Random() % 100)) / 40, 0); bloodvel += DoRotation(jointVel(head), ((float)(Random() % 100)) / 40, yaw + ((float)(Random() % 100)) / 40, 0) * scale; - Sprite::MakeSprite(bloodsprite, (jointPos(neck) + (jointPos(neck) - jointPos(head)) / 5)*scale + coords, bloodvel, 1, 1, 1, .05, .9); + Sprite::MakeSprite(bloodsprite, (jointPos(neck) + (jointPos(neck) - jointPos(head)) / 5) * scale + coords, bloodvel, 1, 1, 1, .05, .9); } else { bloodvel.z = 5 * neckspurtamount; bloodvel = DoRotation(bloodvel, ((float)(Random() % 100)) / 40, yaw + ((float)(Random() % 100)) / 40, 0) * scale; bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 40, ((float)(Random() % 100)) / 40, 0) * scale; - Sprite::MakeSprite(bloodsprite, DoRotation(jointPos(neck) + (jointPos(neck) - jointPos(head)) / 5, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, .9); + Sprite::MakeSprite(bloodsprite, DoRotation(jointPos(neck) + (jointPos(neck) - jointPos(head)) / 5, 0, yaw, 0) * scale + coords, bloodvel, 1, 1, 1, .05, .9); } neckspurtparticledelay = .05; } @@ -4453,7 +4533,7 @@ void Person::DoStuff() Sprite::MakeSprite(bloodsprite, jointPos(abdomen) * scale + coords, bloodvel, 1, 1, 1, .05, 1); } else { bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0) * scale; - Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(abdomen) + jointPos(abdomen)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(abdomen) + jointPos(abdomen)) / 2, 0, yaw, 0) * scale + coords, bloodvel, 1, 1, 1, .05, 1); } } } @@ -4486,7 +4566,7 @@ void Person::DoStuff() } dead = 2; if (animTarget == knifefollowedanim && !skeleton.free) { - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { skeleton.joints[i].velocity = 0; skeleton.joints[i].velocity.y = -2; } @@ -4532,8 +4612,8 @@ void Person::DoStuff() if (endy < starty) endy = starty; - for (i = startx; i < endx; i++) { - for (j = starty; j < endy; j++) { + for (int i = startx; i < endx; i++) { + for (int j = starty; j < endy; j++) { if (Random() % 2 == 0) { color = Random() % 85 + 170; if (skeleton.skinText[i * skeleton.skinsize * 3 + j * 3 + 0] > color / 2) @@ -4703,7 +4783,8 @@ void Person::DoStuff() righthandmorphness = 0; targetrighthandmorphness = 1; righthandmorphend = 1; - if (Random() % 2 == 0)twitchdelay3 = (float)(abs(Random() % 40)) / 5; + if (Random() % 2 == 0) + twitchdelay3 = (float)(abs(Random() % 40)) / 5; } if (righthandmorphstart == 1 && righthandmorphend == 1) { righthandmorphness = 0; @@ -4798,8 +4879,9 @@ void Person::DoStuff() } } - if (dead != 1) + if (dead != 1) { unconscioustime = 0; + } if (dead == 1 || howactive == typesleeping) { unconscioustime += multiplier; @@ -4820,22 +4902,20 @@ void Person::DoStuff() targetheadmorphness = 1; } - if (howactive > typesleeping) { XYZ headpoint; headpoint = coords; if (bloodtoggle && !bled) { terrain.MakeDecal(blooddecalslow, headpoint, .8, .5, 0); - } - if (bloodtoggle && !bled) - for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) { - j = terrain.patchobjects[whichpatchx][whichpatchz][l]; - XYZ point = DoRotation(headpoint - objects.position[j], 0, -objects.yaw[j], 0); + for (unsigned int l = 0; l < terrain.patchobjects[whichpatchx][whichpatchz].size(); l++) { + unsigned int j = terrain.patchobjects[whichpatchx][whichpatchz][l]; + XYZ point = DoRotation(headpoint - Object::objects[j]->position, 0, -Object::objects[j]->yaw, 0); float size = .8; float opacity = .6; float yaw = 0; - objects.model[j].MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw); + Object::objects[j]->model.MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw); } + } bled = 1; } @@ -4890,8 +4970,6 @@ void Person::DoStuff() } } - - if ((id == 0 || distsq(&coords, &viewer) < 50) && autoslomo) { slomo = 1; slomodelay = .2; @@ -4900,13 +4978,12 @@ void Person::DoStuff() damage += 20; } - if (!dead) + if (!dead) { damage -= multiplier * 13; - if (!dead) permanentdamage -= multiplier * 4; - if (isIdle() || isCrouch()) { - if (!dead) + if (isIdle() || isCrouch()) { permanentdamage -= multiplier * 4; + } } if (damage < 0) damage = 0; @@ -4924,7 +5001,7 @@ void Person::DoStuff() dead = 0; skeleton.free = 1; damage -= 20; - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { skeleton.joints[i].velocity = 0; } } @@ -4996,21 +5073,22 @@ void Person::DoStuff() award_bonus(id, deepimpact); DoDamage(damageamount / ((protectionhigh + protectionhead + protectionlow) / 3)); + XYZ average; average = 0; - howmany = 0; - for (j = 0; j < skeleton.joints.size(); j++) { - average += skeleton.joints[j].position; - howmany++; - } - average /= howmany; - coords += average * scale; - for (j = 0; j < skeleton.joints.size(); j++) { - skeleton.joints[j].position -= average; + if (!skeleton.joints.empty()) { + for (unsigned j = 0; j < skeleton.joints.size(); j++) { + average += skeleton.joints[j].position; + } + average /= skeleton.joints.size(); + coords += average * scale; + for (unsigned j = 0; j < skeleton.joints.size(); j++) { + skeleton.joints[j].position -= average; + } + average /= multiplier; } - average /= multiplier; velocity = 0; - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { velocity += skeleton.joints[i].velocity * scale; } velocity /= skeleton.joints.size(); @@ -5035,16 +5113,15 @@ void Person::DoStuff() DoBlood(1, 255); if (bloodtoggle && !bled) { terrain.MakeDecal(blooddecal, headpoint, .2 * 1.2, .5, 0); - } - if (bloodtoggle && !bled) - for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) { - j = terrain.patchobjects[whichpatchx][whichpatchz][l]; - XYZ point = DoRotation(headpoint - objects.position[j], 0, -objects.yaw[j], 0); + for (unsigned int l = 0; l < terrain.patchobjects[whichpatchx][whichpatchz].size(); l++) { + unsigned int j = terrain.patchobjects[whichpatchx][whichpatchz][l]; + XYZ point = DoRotation(headpoint - Object::objects[j]->position, 0, -Object::objects[j]->yaw, 0); float size = .2 * 1.2; float opacity = .6; float yaw = 0; - objects.model[j].MakeDecal(blooddecal, &point, &size, &opacity, &yaw); + Object::objects[j]->model.MakeDecal(blooddecal, &point, &size, &opacity, &yaw); } + } bled = 1; } if (dead == 2 && bloodloss >= damagetolerance) { @@ -5054,16 +5131,15 @@ void Person::DoStuff() DoBlood(1, 255); if (bloodtoggle && !bled) { terrain.MakeDecal(blooddecalslow, headpoint, .8, .5, 0); - } - if (bloodtoggle && !bled) - for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) { - j = terrain.patchobjects[whichpatchx][whichpatchz][l]; - XYZ point = DoRotation(headpoint - objects.position[j], 0, -objects.yaw[j], 0); + for (unsigned int l = 0; l < terrain.patchobjects[whichpatchx][whichpatchz].size(); l++) { + unsigned int j = terrain.patchobjects[whichpatchx][whichpatchz][l]; + XYZ point = DoRotation(headpoint - Object::objects[j]->position, 0, -Object::objects[j]->yaw, 0); float size = .8; float opacity = .6; float yaw = 0; - objects.model[j].MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw); + Object::objects[j]->model.MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw); } + } bled = 1; } } @@ -5079,11 +5155,11 @@ void Person::DoStuff() canrecover = 0; if (velocity.y < -30) canrecover = 0; - for (i = 0; i < objects.numobjects; i++) { - if (objects.type[i] != treeleavestype && objects.type[i] != bushtype && objects.type[i] != firetype) { + for (unsigned int i = 0; i < Object::objects.size(); i++) { + if (Object::objects[i]->type != treeleavestype && Object::objects[i]->type != bushtype && Object::objects[i]->type != firetype) { colviewer = startpoint; coltarget = endpoint; - if (objects.model[i].LineCheck(&colviewer, &coltarget, &colpoint, &objects.position[i], &objects.yaw[i]) != -1) + if (Object::objects[i]->model.LineCheck(&colviewer, &coltarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1) canrecover = 0; } } @@ -5124,7 +5200,7 @@ void Person::DoStuff() frameCurrent = 0; target = 0; - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { tempanimation.frames[0].joints[i].position = skeleton.joints[i].position; tempanimation.frames[0].joints[i].position = DoRotation(tempanimation.frames[0].joints[i].position, 0, -yaw, 0); } @@ -5164,7 +5240,6 @@ void Person::DoStuff() targettilt2 = asin(terrainnormal.y) * 180 / 3.14 * -1; - if (skeleton.forward.y < 0) { animTarget = getupfrombackanim; frameTarget = 0; @@ -5198,7 +5273,7 @@ void Person::DoStuff() targetyaw += 45; } if (backkeydown) { - if ( !leftkeydown && !rightkeydown) + if (!leftkeydown && !rightkeydown) targetyaw += 180; } targetyaw += 180; @@ -5215,7 +5290,7 @@ void Person::DoStuff() if (middle.y > 0 && animTarget != rollanim) targetoffset.y = middle.y + 1; - for (int i = 0; i < skeleton.joints.size(); i++) { + for (unsigned i = 0; i < skeleton.joints.size(); i++) { tempanimation.frames[0].joints[i].position = skeleton.joints[i].position; tempanimation.frames[0].joints[i].position = DoRotation(tempanimation.frames[0].joints[i].position, 0, -yaw, 0); } @@ -5266,41 +5341,40 @@ void Person::DoStuff() } if (skeleton.freefall == 0) freefall = 0; - } if (aitype != passivetype || skeleton.free == 1) if (findLengthfast(&velocity) > .1) - for (i = 0; i < objects.numobjects; i++) { - if (objects.type[i] == firetype) - if (distsqflat(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 12 && distsq(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 49) { + for (unsigned int i = 0; i < Object::objects.size(); i++) { + if (Object::objects[i]->type == firetype) + if (distsqflat(&coords, &Object::objects[i]->position) < Object::objects[i]->scale * Object::objects[i]->scale * 12 && distsq(&coords, &Object::objects[i]->position) < Object::objects[i]->scale * Object::objects[i]->scale * 49) { if (onfire) { - if (!objects.onfire[i]) { - emit_sound_at(firestartsound, objects.position[i]); + if (!Object::objects[i]->onfire) { + emit_sound_at(firestartsound, Object::objects[i]->position); } - objects.onfire[i] = 1; + Object::objects[i]->onfire = 1; } if (!onfire) { - if (objects.onfire[i]) { + if (Object::objects[i]->onfire) { CatchFire(); } } } - if (objects.type[i] == bushtype) - if (distsqflat(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 12 && distsq(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 49) { + if (Object::objects[i]->type == bushtype) + if (distsqflat(&coords, &Object::objects[i]->position) < Object::objects[i]->scale * Object::objects[i]->scale * 12 && distsq(&coords, &Object::objects[i]->position) < Object::objects[i]->scale * Object::objects[i]->scale * 49) { if (onfire) { - if (!objects.onfire[i]) { - emit_sound_at(firestartsound, objects.position[i]); + if (!Object::objects[i]->onfire) { + emit_sound_at(firestartsound, Object::objects[i]->position); } - objects.onfire[i] = 1; + Object::objects[i]->onfire = 1; } if (!onfire) { - if (objects.onfire[i]) { + if (Object::objects[i]->onfire) { CatchFire(); } } - if (objects.messedwith[i] <= 0) { + if (Object::objects[i]->messedwith <= 0) { XYZ tempvel; XYZ pos; @@ -5310,14 +5384,14 @@ void Person::DoStuff() addEnvSound(coords, 4 * findLength(&velocity)); } - int howmany; + int howmany = 0; if (environment == grassyenvironment) howmany = findLength(&velocity) * 4; if (environment == snowyenvironment) howmany = findLength(&velocity) * 2; if (detail == 2) if (environment != desertenvironment) - for (j = 0; j < howmany; j++) { + for (int j = 0; j < howmany; j++) { tempvel.x = float(abs(Random() % 100) - 50) / 20; tempvel.y = float(abs(Random() % 100) - 50) / 20; tempvel.z = float(abs(Random() % 100) - 50) / 20; @@ -5332,7 +5406,7 @@ void Person::DoStuff() howmany = findLength(&velocity) * 4; if (detail == 2) if (environment == snowyenvironment) - for (j = 0; j < howmany; j++) { + for (int j = 0; j < howmany; j++) { tempvel.x = float(abs(Random() % 100) - 50) / 20; tempvel.y = float(abs(Random() % 100) - 50) / 20; tempvel.z = float(abs(Random() % 100) - 50) / 20; @@ -5345,22 +5419,22 @@ void Person::DoStuff() Sprite::setLastSpriteSpecial(2); } } - objects.rotx[i] += velocity.x * multiplier * 6; - objects.roty[i] += velocity.z * multiplier * 6; - objects.messedwith[i] = .5; + Object::objects[i]->rotx += velocity.x * multiplier * 6; + Object::objects[i]->roty += velocity.z * multiplier * 6; + Object::objects[i]->messedwith = .5; } XYZ tempcoord; - if (objects.type[i] == treeleavestype && environment != desertenvironment) { - if (objects.pitch[i] == 0) + if (Object::objects[i]->type == treeleavestype && environment != desertenvironment) { + if (Object::objects[i]->pitch == 0) tempcoord = coords; else { - tempcoord = coords - objects.position[i]; - tempcoord = DoRotation(tempcoord, 0, -objects.yaw[i], 0); - tempcoord = DoRotation(tempcoord, -objects.pitch[i], 0, 0); - tempcoord += objects.position[i]; + tempcoord = coords - Object::objects[i]->position; + tempcoord = DoRotation(tempcoord, 0, -Object::objects[i]->yaw, 0); + tempcoord = DoRotation(tempcoord, -Object::objects[i]->pitch, 0, 0); + tempcoord += Object::objects[i]->position; } - if (distsqflat(&tempcoord, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 8 && distsq(&tempcoord, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 300 && tempcoord.y > objects.position[i].y + 3 * objects.scale[i]) { - if (objects.messedwith[i] <= 0) { + if (distsqflat(&tempcoord, &Object::objects[i]->position) < Object::objects[i]->scale * Object::objects[i]->scale * 8 && distsq(&tempcoord, &Object::objects[i]->position) < Object::objects[i]->scale * Object::objects[i]->scale * 300 && tempcoord.y > Object::objects[i]->position.y + 3 * Object::objects[i]->scale) { + if (Object::objects[i]->messedwith <= 0) { XYZ tempvel; XYZ pos; @@ -5370,14 +5444,14 @@ void Person::DoStuff() addEnvSound(coords, 4 * findLength(&velocity)); } - int howmany; + int howmany = 0; if (environment == grassyenvironment) howmany = findLength(&velocity) * 4; if (environment == snowyenvironment) howmany = findLength(&velocity) * 2; if (detail == 2) if (environment != desertenvironment) - for (j = 0; j < howmany; j++) { + for (int j = 0; j < howmany; j++) { tempvel.x = float(abs(Random() % 100) - 50) / 20; tempvel.y = float(abs(Random() % 100) - 50) / 20; tempvel.z = float(abs(Random() % 100) - 50) / 20; @@ -5393,7 +5467,7 @@ void Person::DoStuff() howmany = findLength(&velocity) * 4; if (detail == 2) if (environment == snowyenvironment) - for (j = 0; j < howmany; j++) { + for (int j = 0; j < howmany; j++) { tempvel.x = float(abs(Random() % 100) - 50) / 20; tempvel.y = float(abs(Random() % 100) - 50) / 20; tempvel.z = float(abs(Random() % 100) - 50) / 20; @@ -5407,7 +5481,7 @@ void Person::DoStuff() Sprite::setLastSpriteSpecial(2); } } - objects.messedwith[i] = .5; + Object::objects[i]->messedwith = .5; } } } @@ -5420,12 +5494,12 @@ void Person::DoStuff() if (hasvictim) if (aitype != passivetype && victim->skeleton.free && !victim->dead) play = 1; - if (tutoriallevel == 1 && id != 0) + if (Tutorial::active && id != 0) play = 0; if (play && aitype != playercontrolled) { int whichsound = -1; - i = abs(Random() % 4); if (speechdelay <= 0) { + unsigned int i = abs(Random() % 4); if (creature == rabbittype) { if (i == 0) whichsound = rabbitchitter; @@ -5541,15 +5615,46 @@ void Person::DoStuff() } } - if (animTarget == spinkickanim || animTarget == staffspinhitreversalanim || animTarget == staffspinhitreversedanim || animTarget == staffhitreversalanim || animTarget == staffhitreversedanim || animTarget == hurtidleanim || animTarget == winduppunchanim || animTarget == swordslashreversalanim || animTarget == swordslashreversedanim || animTarget == knifeslashreversalanim || animTarget == knifeslashreversedanim || animTarget == knifethrowanim || animTarget == knifefollowanim || animTarget == knifefollowedanim || animTarget == killanim || animTarget == dropkickanim || animTarget == upunchanim || animTarget == knifeslashstartanim || animTarget == swordslashanim || animTarget == staffhitanim || animTarget == staffspinhitanim || animTarget == staffgroundsmashanim || animTarget == spinkickreversalanim || animTarget == sweepreversalanim || animTarget == lowkickanim || animTarget == sweepreversedanim || animTarget == rabbitkickreversalanim || animTarget == rabbitkickreversedanim || animTarget == jumpreversalanim || animTarget == jumpreversedanim) { + if (animTarget == spinkickanim || + animTarget == staffspinhitreversalanim || + animTarget == staffspinhitreversedanim || + animTarget == staffhitreversalanim || + animTarget == staffhitreversedanim || + animTarget == hurtidleanim || + animTarget == winduppunchanim || + animTarget == swordslashreversalanim || + animTarget == swordslashreversedanim || + animTarget == knifeslashreversalanim || + animTarget == knifeslashreversedanim || + animTarget == knifethrowanim || + animTarget == knifefollowanim || + animTarget == knifefollowedanim || + animTarget == killanim || + animTarget == dropkickanim || + animTarget == upunchanim || + animTarget == knifeslashstartanim || + animTarget == swordslashanim || + animTarget == staffhitanim || + animTarget == staffspinhitanim || + animTarget == staffgroundsmashanim || + animTarget == spinkickreversalanim || + animTarget == sweepreversalanim || + animTarget == lowkickanim || + animTarget == sweepreversedanim || + animTarget == rabbitkickreversalanim || + animTarget == rabbitkickreversedanim || + animTarget == jumpreversalanim || + animTarget == jumpreversedanim) { //close hands and yell - if (righthandmorphend != 1 && righthandmorphness == targetrighthandmorphness) { + if (righthandmorphend != 1 && + righthandmorphness == targetrighthandmorphness) { righthandmorphness = 0; righthandmorphend = 1; targetrighthandmorphness = 1; } - if (lefthandmorphend != 1 && lefthandmorphness == targetlefthandmorphness) { + if (lefthandmorphend != 1 && + lefthandmorphness == targetlefthandmorphness) { lefthandmorphness = 0; lefthandmorphend = 1; targetlefthandmorphness = 1; @@ -5609,7 +5714,8 @@ void Person::DoStuff() ReflectVector(&facing, terrainnormal); Normalise(&facing); - if (isRun() || animTarget == sneakanim || animTarget == rollanim || animTarget == walkanim) { + if (isRun() || + animTarget == sneakanim || animTarget == rollanim || animTarget == walkanim) { if (onterrain) targettilt2 = -facing.y * 20; else @@ -5754,7 +5860,6 @@ void Person::DoStuff() velocity = flatfacing * velspeed; } - if ((animTarget == bounceidleanim || animCurrent == hurtidleanim) && (animCurrent == fightidleanim || animCurrent == knifefightidleanim)) { velocity -= facing * multiplier * speed * 700 * scale; velspeed = findLength(&velocity); @@ -5825,7 +5930,6 @@ void Person::DoStuff() velspeed = findLength(&velocity); } - if (animTarget == jumpupanim || animTarget == jumpdownanim || isFlip()) { velocity.y += gravity * multiplier; } @@ -5851,7 +5955,8 @@ void Person::DoStuff() } if (animTarget == jumpdownanim || isFlip()) { - if (isFlip())jumppower = -4; + if (isFlip()) + jumppower = -4; animTarget = getLanding(); emit_sound_at(landsound, coords, 128.); @@ -5868,14 +5973,14 @@ void Person::DoStuff() onterrain = 1; } - if (isIdle() || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim || animTarget == crouchstabanim || animTarget == swordgroundstabanim || isStop() || animTarget == removeknifeanim || animTarget == crouchremoveknifeanim || isLanding() || isCrouch() || Animation::animations[animTarget].attack || (animTarget == rollanim && targetFrame().label == 6)) { velspeed = findLength(&velocity); velocity.y = 0; if (velspeed < multiplier * 300 * scale) { velocity = 0; - } else + } else { velocity -= velocity / velspeed * multiplier * 300 * scale; + } if (velspeed > 5 && (isLanding() || isLandhard())) { skiddingdelay += multiplier; if (skiddelay <= 0) { @@ -5883,17 +5988,13 @@ void Person::DoStuff() FootLand(rightfoot, .5); skiddelay = .02; } - } else + } else { skiddingdelay = 0; + } } if (isLandhard()) { velspeed = findLength(&velocity); - velocity.y = 0; - if (velspeed < multiplier * 600 * scale) { - velocity = 0; - } else - velocity -= velocity / velspeed * multiplier * 600 * scale; velocity = 0; if (velspeed > 5 && (isLanding() || isLandhard())) { skiddingdelay += multiplier; @@ -5902,8 +6003,9 @@ void Person::DoStuff() FootLand(rightfoot, .5); skiddelay = .02; } - } else + } else { skiddingdelay = 0; + } } if (skiddingdelay < 0) @@ -5951,11 +6053,10 @@ void Person::DoStuff() } } - /* EFFECT * inverse kinematics helper function */ -void IKHelper(Person *p, float interp) +void IKHelper(Person* p, float interp) { XYZ point, change, change2; float heightleft, heightright; @@ -6050,7 +6151,7 @@ int Person::DrawSkeleton() } static XYZ mid; static float M[16]; - static int i, j, k; + static int k; static int weaponattachmuscle; static int weaponrotatemuscle; static XYZ weaponpoint; @@ -6058,10 +6159,8 @@ int Person::DrawSkeleton() if ((dead != 2 || skeleton.free != 2) && updatedelay <= 0) { if (!isSleeping() && !isSitting()) { // TODO: give these meaningful names - const bool cond1 = (isIdle() || isCrouch() || isLanding() || isLandhard() - || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim); - const bool cond2 = (wasIdle() || wasCrouch() || wasLanding() || wasLandhard() - || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim); + const bool cond1 = (isIdle() || isCrouch() || isLanding() || isLandhard() || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim); + const bool cond2 = (wasIdle() || wasCrouch() || wasLanding() || wasLandhard() || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim); if (onterrain && (cond1 && cond2) && !skeleton.free) { IKHelper(this, 1); @@ -6090,19 +6189,19 @@ int Person::DrawSkeleton() if (Animation::animations[animTarget].attack == 3) targetheadyaw += 180; } - for (i = 0; i < skeleton.drawmodel.vertexNum; i++) { + for (int i = 0; i < skeleton.drawmodel.vertexNum; i++) { skeleton.drawmodel.vertex[i] = 0; skeleton.drawmodel.vertex[i].y = 999; } - for (i = 0; i < skeleton.drawmodellow.vertexNum; i++) { + for (int i = 0; i < skeleton.drawmodellow.vertexNum; i++) { skeleton.drawmodellow.vertex[i] = 0; skeleton.drawmodellow.vertex[i].y = 999; } - for (i = 0; i < skeleton.drawmodelclothes.vertexNum; i++) { + for (int i = 0; i < skeleton.drawmodelclothes.vertexNum; i++) { skeleton.drawmodelclothes.vertex[i] = 0; skeleton.drawmodelclothes.vertex[i].y = 999; } - for (int i = 0; i < skeleton.muscles.size(); i++) { + for (unsigned int i = 0; i < skeleton.muscles.size(); i++) { // convenience renames const int p1 = skeleton.muscles[i].parent1->label; const int p2 = skeleton.muscles[i].parent2->label; @@ -6148,7 +6247,6 @@ int Person::DrawSkeleton() if (!skeleton.free) glRotatef(tilt, 0, 0, 1); - glTranslatef(mid.x, mid.y, mid.z); skeleton.muscles[i].lastrotate1 = skeleton.muscles[i].rotate1; @@ -6161,9 +6259,9 @@ int Person::DrawSkeleton() glRotatef(-skeleton.muscles[i].lastrotate3, 0, 1, 0); if (playerdetail || skeleton.free == 3) { - for (j = 0; j < skeleton.muscles[i].vertices.size(); j++) { - XYZ &v0 = skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]]; - XYZ &v1 = skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]]; + for (unsigned j = 0; j < skeleton.muscles[i].vertices.size(); j++) { + XYZ& v0 = skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]]; + XYZ& v1 = skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]]; glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (p1 == abdomen || p2 == abdomen) @@ -6190,8 +6288,8 @@ int Person::DrawSkeleton() } } if (!playerdetail || skeleton.free == 3) { - for (j = 0; j < skeleton.muscles[i].verticeslow.size(); j++) { - XYZ &v0 = skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]]; + for (unsigned j = 0; j < skeleton.muscles[i].verticeslow.size(); j++) { + XYZ& v0 = skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]]; glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (p1 == abdomen || p2 == abdomen) @@ -6240,8 +6338,8 @@ int Person::DrawSkeleton() skeleton.muscles[i].lastrotate3 = skeleton.muscles[i].rotate3; glRotatef(-skeleton.muscles[i].lastrotate3, 0, 1, 0); - for (j = 0; j < skeleton.muscles[i].verticesclothes.size(); j++) { - XYZ &v0 = skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]]; + for (unsigned j = 0; j < skeleton.muscles[i].verticesclothes.size(); j++) { + XYZ& v0 = skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]]; glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (p1 == abdomen || p2 == abdomen) @@ -6313,19 +6411,20 @@ int Person::DrawSkeleton() glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glBegin(GL_POINTS); - if (playerdetail) - for (i = 0; i < skeleton.drawmodel.vertexNum; i++) { - XYZ &v0 = skeleton.drawmodel.vertex[i]; + if (playerdetail) { + for (int i = 0; i < skeleton.drawmodel.vertexNum; i++) { + XYZ& v0 = skeleton.drawmodel.vertex[i]; glVertex3f(v0.x, v0.y, v0.z); } + } glEnd(); glBegin(GL_LINES); - if (playerdetail) - for (i = 0; i < skeleton.drawmodel.TriangleNum; i++) { - XYZ &v0 = skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]]; - XYZ &v1 = skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]]; - XYZ &v2 = skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]]; + if (playerdetail) { + for (unsigned int i = 0; i < skeleton.drawmodel.Triangles.size(); i++) { + const XYZ& v0 = skeleton.drawmodel.getTriangleVertex(i, 0); + const XYZ& v1 = skeleton.drawmodel.getTriangleVertex(i, 1); + const XYZ& v2 = skeleton.drawmodel.getTriangleVertex(i, 2); glVertex3f(v0.x, v0.y, v0.z); glVertex3f(v1.x, v1.y, v1.z); glVertex3f(v1.x, v1.y, v1.z); @@ -6333,6 +6432,7 @@ int Person::DrawSkeleton() glVertex3f(v2.x, v2.y, v2.z); glVertex3f(v0.x, v0.y, v0.z); } + } glEnd(); } @@ -6360,7 +6460,7 @@ int Person::DrawSkeleton() glEnable(GL_LIGHTING); glEnable(GL_BLEND); } - if (tutoriallevel && id != 0) { + if (Tutorial::active && id != 0) { glColor4f(.7, .7, .7, 0.6); glDepthMask(0); glEnable(GL_LIGHTING); @@ -6377,21 +6477,21 @@ int Person::DrawSkeleton() } if (playerdetail) { if (!showpoints) { - if ((tutoriallevel && id != 0)) + if (Tutorial::active && (id != 0)) skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture); else skeleton.drawmodel.draw(); } } if (!playerdetail) { - if ((tutoriallevel && id != 0)) + if (Tutorial::active && (id != 0)) skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture); else skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr); } if (!(Animation::animations[animTarget].attack == normalattack || Animation::animations[animTarget].attack == reversed)) - if (tutoriallevel && id != 0) { + if (Tutorial::active && id != 0) { glPopMatrix(); glMatrixMode(GL_MODELVIEW); glEnable(GL_TEXTURE_2D); @@ -6410,22 +6510,21 @@ int Person::DrawSkeleton() glTranslatef(smoketex * .6, 0, 0); if (playerdetail) { if (!showpoints) { - if ((tutoriallevel && id != 0)) + if (Tutorial::active && (id != 0)) skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture); else skeleton.drawmodel.draw(); } } if (!playerdetail) { - if ((tutoriallevel && id != 0)) + if (Tutorial::active && (id != 0)) skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture); else skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr); } } - - if (tutoriallevel && id != 0) { + if (Tutorial::active && id != 0) { glPopMatrix(); glMatrixMode(GL_MODELVIEW); glEnable(GL_TEXTURE_2D); @@ -6444,15 +6543,15 @@ int Person::DrawSkeleton() if (num_weapons > 0) { for (k = 0; k < num_weapons; k++) { - i = weaponids[k]; + int i = weaponids[k]; if (weaponactive == k) { if (weapons[i].getType() != staff) { - for (j = 0; j < skeleton.muscles.size(); j++) { + for (unsigned j = 0; j < skeleton.muscles.size(); j++) { if ((skeleton.muscles[j].parent1->label == righthand || skeleton.muscles[j].parent2->label == righthand) && skeleton.muscles[j].vertices.size() > 0) { weaponattachmuscle = j; } } - for (j = 0; j < skeleton.muscles.size(); j++) { + for (unsigned j = 0; j < skeleton.muscles.size(); j++) { 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].vertices.size() > 0) { weaponrotatemuscle = j; } @@ -6462,12 +6561,12 @@ int Person::DrawSkeleton() weaponpoint = (jointPos(rightwrist) * .7 + jointPos(righthand) * .3); } if (weapons[i].getType() == staff) { - for (j = 0; j < skeleton.muscles.size(); j++) { + for (unsigned j = 0; j < skeleton.muscles.size(); j++) { if ((skeleton.muscles[j].parent1->label == righthand || skeleton.muscles[j].parent2->label == righthand) && skeleton.muscles[j].vertices.size() > 0) { weaponattachmuscle = j; } } - for (j = 0; j < skeleton.muscles.size(); j++) { + for (unsigned j = 0; j < skeleton.muscles.size(); j++) { 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].vertices.size() > 0) { weaponrotatemuscle = j; } @@ -6491,7 +6590,7 @@ int Person::DrawSkeleton() weaponpoint = jointPos(abdomen) + (jointPos(lefthip) - jointPos(righthip)) * .09 + (jointPos(leftshoulder) - jointPos(rightshoulder)) * .33; if (weapons[i].getType() == staff) weaponpoint = jointPos(abdomen) + (jointPos(lefthip) - jointPos(righthip)) * .09 + (jointPos(leftshoulder) - jointPos(rightshoulder)) * .33; - for (j = 0; j < skeleton.muscles.size(); j++) { + for (unsigned j = 0; j < skeleton.muscles.size(); j++) { 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].vertices.size() > 0) { weaponrotatemuscle = j; } @@ -6502,7 +6601,7 @@ int Person::DrawSkeleton() weaponpoint = jointPos(abdomen) * .5 + jointPos(neck) * .5 - skeleton.forward * .8; else weaponpoint = jointPos(abdomen) * .5 + jointPos(neck) * .5 + skeleton.forward * .8; - for (j = 0; j < skeleton.muscles.size(); j++) { + for (unsigned j = 0; j < skeleton.muscles.size(); j++) { 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].vertices.size() > 0) { weaponrotatemuscle = j; } @@ -6677,12 +6776,10 @@ int Person::DrawSkeleton() return 0; } - /* FUNCTION? */ -int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate, Model *model) +int Person::SphereCheck(XYZ* p1, float radius, XYZ* p, XYZ* move, float* rotate, Model* model) { - static int i, j; static float distance; static float olddistance; static int intersecting; @@ -6700,14 +6797,14 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate, return -1; if (*rotate) *p1 = DoRotation(*p1, 0, -*rotate, 0); - for (i = 0; i < 4; i++) { - for (j = 0; j < model->TriangleNum; j++) { - if (model->facenormals[j].y <= slopethreshold) { + for (int i = 0; i < 4; i++) { + for (unsigned int j = 0; j < model->Triangles.size(); j++) { + if (model->Triangles[j].facenormal.y <= slopethreshold) { intersecting = 0; - 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))); + distance = abs((model->Triangles[j].facenormal.x * p1->x) + (model->Triangles[j].facenormal.y * p1->y) + (model->Triangles[j].facenormal.z * p1->z) - ((model->Triangles[j].facenormal.x * model->vertex[model->Triangles[j].vertex[0]].x) + (model->Triangles[j].facenormal.y * model->vertex[model->Triangles[j].vertex[0]].y) + (model->Triangles[j].facenormal.z * model->vertex[model->Triangles[j].vertex[0]].z))); if (distance < radius) { - point = *p1 - model->facenormals[j] * distance; - 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]])) + point = *p1 - model->Triangles[j].facenormal * distance; + if (PointInTriangle(&point, model->Triangles[j].facenormal, &model->vertex[model->Triangles[j].vertex[0]], &model->vertex[model->Triangles[j].vertex[1]], &model->vertex[model->Triangles[j].vertex[2]])) intersecting = 1; if (!intersecting) intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]], @@ -6722,11 +6819,11 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate, &model->vertex[model->Triangles[j].vertex[2]], p1, &radius); end = *p1 - point; - if (dotproduct(&model->facenormals[j], &end) > 0 && intersecting) { + if (dotproduct(&model->Triangles[j].facenormal, &end) > 0 && intersecting) { start = *p1; end = *p1; end.y -= radius; - 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)) { + 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->Triangles[j].facenormal, &point)) { p1->y = point.y + radius; if ((animTarget == jumpdownanim || isFlip())) { if (isFlip() && (frameTarget < 5 || targetFrame().label == 7 || targetFrame().label == 4)) @@ -6766,23 +6863,18 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate, } } } - for (j = 0; j < model->TriangleNum; j++) { - if (model->facenormals[j].y > slopethreshold) { + for (unsigned int j = 0; j < model->Triangles.size(); j++) { + if (model->Triangles[j].facenormal.y > slopethreshold) { intersecting = 0; start = *p1; start.y -= radius / 4; - XYZ &v0 = model->vertex[model->Triangles[j].vertex[0]]; - XYZ &v1 = model->vertex[model->Triangles[j].vertex[1]]; - XYZ &v2 = model->vertex[model->Triangles[j].vertex[2]]; - distance = abs((model->facenormals[j].x * start.x) - + (model->facenormals[j].y * start.y) - + (model->facenormals[j].z * start.z) - - ((model->facenormals[j].x * v0.x) - + (model->facenormals[j].y * v0.y) - + (model->facenormals[j].z * v0.z))); + XYZ& v0 = model->vertex[model->Triangles[j].vertex[0]]; + XYZ& v1 = model->vertex[model->Triangles[j].vertex[1]]; + XYZ& v2 = model->vertex[model->Triangles[j].vertex[2]]; + distance = abs((model->Triangles[j].facenormal.x * start.x) + (model->Triangles[j].facenormal.y * start.y) + (model->Triangles[j].facenormal.z * start.z) - ((model->Triangles[j].facenormal.x * v0.x) + (model->Triangles[j].facenormal.y * v0.y) + (model->Triangles[j].facenormal.z * v0.z))); if (distance < radius * .5) { - point = start - model->facenormals[j] * distance; - if (PointInTriangle( &point, model->facenormals[j], &v0, &v1, &v2)) + point = start - model->Triangles[j].facenormal * distance; + if (PointInTriangle(&point, model->Triangles[j].facenormal, &v0, &v1, &v2)) intersecting = 1; if (!intersecting) intersecting = sphere_line_intersection(v0.x, v0.y, v0.z, v1.x, v1.y, v1.z, p1->x, p1->y, p1->z, radius / 2); @@ -6791,14 +6883,14 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate, if (!intersecting) intersecting = sphere_line_intersection(v0.x, v0.y, v0.z, v2.x, v2.y, v2.z, p1->x, p1->y, p1->z, radius / 2); end = *p1 - point; - if (dotproduct(&model->facenormals[j], &end) > 0 && intersecting) { + if (dotproduct(&model->Triangles[j].facenormal, &end) > 0 && intersecting) { if ((animTarget == jumpdownanim || animTarget == jumpupanim || isFlip())) { start = velocity; - velocity -= DoRotation(model->facenormals[j], 0, *rotate, 0) * findLength(&velocity) * abs(normaldotproduct(velocity, DoRotation(model->facenormals[j], 0, *rotate, 0))); //(distance-radius*.5)/multiplier; + velocity -= DoRotation(model->Triangles[j].facenormal, 0, *rotate, 0) * findLength(&velocity) * abs(normaldotproduct(velocity, DoRotation(model->Triangles[j].facenormal, 0, *rotate, 0))); //(distance-radius*.5)/multiplier; if (findLengthfast(&start) < findLengthfast(&velocity)) velocity = start; } - *p1 += model->facenormals[j] * (distance - radius * .5); + *p1 += model->Triangles[j].facenormal * (distance - radius * .5); } } if ((distance < olddistance || firstintersecting == -1) && intersecting) { @@ -6818,6 +6910,53 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate, return firstintersecting; } +int findPathDist(int start, int end) +{ + int connected; + int closest; + + unsigned int smallestcount = 1000; + for (char i = 0; i < 50; i++) { + unsigned int count = 0; + int last = start; + int last2 = -1; + int last3 = -1; + int last4 = -1; + while (last != end && count < 30) { + closest = -1; + for (int j = 0; j < Game::numpathpoints; j++) { + if (j != last && j != last2 && j != last3 && j != last4) { + connected = 0; + if (Game::numpathpointconnect[j]) + for (int k = 0; k < Game::numpathpointconnect[j]; k++) { + if (Game::pathpointconnect[j][k] == last) + connected = 1; + } + if (!connected) + if (Game::numpathpointconnect[last]) + for (int k = 0; k < Game::numpathpointconnect[last]; k++) { + if (Game::pathpointconnect[last][k] == j) + connected = 1; + } + if (connected) + if (closest == -1 || Random() % 2 == 0) { + closest = j; + } + } + } + last4 = last3; + last3 = last2; + last2 = last; + last = closest; + count++; + } + if (count < smallestcount) { + smallestcount = count; + } + } + return smallestcount; +} + void Person::takeWeapon(int weaponId) { weaponactive = 0; @@ -6857,13 +6996,19 @@ bool Person::addClothes(const int& clothesId) float tintg = clothestintg[clothesId]; float tintb = clothestintb[clothesId]; - if (tintr > 1) tintr = 1; - if (tintg > 1) tintg = 1; - if (tintb > 1) tintb = 1; + if (tintr > 1) + tintr = 1; + if (tintg > 1) + tintg = 1; + if (tintb > 1) + tintb = 1; - if (tintr < 0) tintr = 0; - if (tintg < 0) tintg = 0; - if (tintb < 0) tintb = 0; + if (tintr < 0) + tintr = 0; + if (tintg < 0) + tintg = 0; + if (tintb < 0) + tintb = 0; int bytesPerPixel = texture.bpp / 8; @@ -6890,3 +7035,976 @@ bool Person::addClothes(const int& clothesId) return 0; } } + +void Person::doAI() +{ + if (aitype != playercontrolled && !Dialog::inDialog()) { + jumpclimb = 0; + //disable movement in editor + if (Game::editorenabled) + stunned = 1; + + pause = 0; + if (distsqflat(&Person::players[0]->coords, &coords) < 30 && + Person::players[0]->coords.y > coords.y + 2 && + !Person::players[0]->onterrain) + pause = 1; + + //pathfinding + if (aitype == pathfindtype) { + if (finalpathfindpoint == -1) { + float closestdistance; + float tempdist; + int closest; + XYZ colpoint; + closest = -1; + closestdistance = -1; + for (int j = 0; j < Game::numpathpoints; j++) { + if (closest == -1 || distsq(&finalfinaltarget, &Game::pathpoint[j]) < closestdistance) { + closestdistance = distsq(&finalfinaltarget, &Game::pathpoint[j]); + closest = j; + finaltarget = Game::pathpoint[j]; + } + } + finalpathfindpoint = closest; + for (int j = 0; j < Game::numpathpoints; j++) { + for (int k = 0; k < Game::numpathpointconnect[j]; k++) { + DistancePointLine(&finalfinaltarget, &Game::pathpoint[j], &Game::pathpoint[Game::pathpointconnect[j][k]], &tempdist, &colpoint); + if (sq(tempdist) < closestdistance) + if (findDistance(&colpoint, &Game::pathpoint[j]) + findDistance(&colpoint, &Game::pathpoint[Game::pathpointconnect[j][k]]) < + findDistance(&Game::pathpoint[j], &Game::pathpoint[Game::pathpointconnect[j][k]]) + .1) { + closestdistance = sq(tempdist); + closest = j; + finaltarget = colpoint; + } + } + } + finalpathfindpoint = closest; + } + if (targetpathfindpoint == -1) { + float closestdistance; + float tempdist; + int closest; + XYZ colpoint; + closest = -1; + closestdistance = -1; + if (lastpathfindpoint == -1) { + for (int j = 0; j < Game::numpathpoints; j++) { + if (j != lastpathfindpoint) + if (closest == -1 || (distsq(&coords, &Game::pathpoint[j]) < closestdistance)) { + closestdistance = distsq(&coords, &Game::pathpoint[j]); + closest = j; + } + } + targetpathfindpoint = closest; + for (int j = 0; j < Game::numpathpoints; j++) + if (j != lastpathfindpoint) + for (int k = 0; k < Game::numpathpointconnect[j]; k++) { + DistancePointLine(&coords, &Game::pathpoint[j], &Game::pathpoint[Game::pathpointconnect[j][k]], &tempdist, &colpoint); + if (sq(tempdist) < closestdistance) { + if (findDistance(&colpoint, &Game::pathpoint[j]) + findDistance(&colpoint, &Game::pathpoint[Game::pathpointconnect[j][k]]) < + findDistance(&Game::pathpoint[j], &Game::pathpoint[Game::pathpointconnect[j][k]]) + .1) { + closestdistance = sq(tempdist); + closest = j; + } + } + } + targetpathfindpoint = closest; + } else { + for (int j = 0; j < Game::numpathpoints; j++) + if (j != lastpathfindpoint && + j != lastpathfindpoint2 && + j != lastpathfindpoint3 && + j != lastpathfindpoint4) { + bool connected = 0; + if (Game::numpathpointconnect[j]) + for (int k = 0; k < Game::numpathpointconnect[j]; k++) + if (Game::pathpointconnect[j][k] == lastpathfindpoint) + connected = 1; + if (!connected) + if (Game::numpathpointconnect[lastpathfindpoint]) + for (int k = 0; k < Game::numpathpointconnect[lastpathfindpoint]; k++) + if (Game::pathpointconnect[lastpathfindpoint][k] == j) + connected = 1; + if (connected) { + tempdist = findPathDist(j, finalpathfindpoint); + if (closest == -1 || tempdist < closestdistance) { + closestdistance = tempdist; + closest = j; + } + } + } + targetpathfindpoint = closest; + } + } + losupdatedelay -= multiplier; + + targetyaw = roughDirectionTo(coords, Game::pathpoint[targetpathfindpoint]); + lookyaw = targetyaw; + + //reached target point + if (distsqflat(&coords, &Game::pathpoint[targetpathfindpoint]) < .6) { + lastpathfindpoint4 = lastpathfindpoint3; + lastpathfindpoint3 = lastpathfindpoint2; + lastpathfindpoint2 = lastpathfindpoint; + lastpathfindpoint = targetpathfindpoint; + if (lastpathfindpoint2 == -1) + lastpathfindpoint2 = lastpathfindpoint; + if (lastpathfindpoint3 == -1) + lastpathfindpoint3 = lastpathfindpoint2; + if (lastpathfindpoint4 == -1) + lastpathfindpoint4 = lastpathfindpoint3; + targetpathfindpoint = -1; + } + if (distsqflat(&coords, &finalfinaltarget) < + distsqflat(&coords, &finaltarget) || + distsqflat(&coords, &finaltarget) < .6 * sq(scale * 5) || + lastpathfindpoint == finalpathfindpoint) { + aitype = passivetype; + } + + forwardkeydown = 1; + leftkeydown = 0; + backkeydown = 0; + rightkeydown = 0; + crouchkeydown = 0; + attackkeydown = 0; + throwkeydown = 0; + + if (avoidcollided > .8 && !jumpkeydown && collided < .8) + targetyaw += 90 * (whichdirection * 2 - 1); + + if (collided < 1 || animTarget != jumpupanim) + jumpkeydown = 0; + if ((collided > .8 && jumppower >= 5)) + jumpkeydown = 1; + + if ((!Tutorial::active || cananger) && + hostile && + !Person::players[0]->dead && + distsq(&coords, &Person::players[0]->coords) < 400 && + occluded < 25) { + if (distsq(&coords, &Person::players[0]->coords) < 12 && + Animation::animations[Person::players[0]->animTarget].height != lowheight && + !Game::editorenabled && + (Person::players[0]->coords.y < coords.y + 5 || Person::players[0]->onterrain)) + aitype = attacktypecutoff; + if (distsq(&coords, &Person::players[0]->coords) < 30 && + Animation::animations[Person::players[0]->animTarget].height == highheight && + !Game::editorenabled) + aitype = attacktypecutoff; + + if (losupdatedelay < 0 && !Game::editorenabled && occluded < 2) { + losupdatedelay = .2; + for (unsigned j = 0; j < Person::players.size(); j++) + if (j == 0 || Person::players[j]->skeleton.free || Person::players[j]->aitype != passivetype) + if (abs(Random() % 2) || Animation::animations[Person::players[j]->animTarget].height != lowheight || j != 0) + if (distsq(&coords, &Person::players[j]->coords) < 400) + if (normaldotproduct(facing, Person::players[j]->coords - coords) > 0) + if (Person::players[j]->coords.y < coords.y + 5 || Person::players[j]->onterrain) + if (!Person::players[j]->isWallJump() && -1 == Object::checkcollide(DoRotation(jointPos(head), 0, yaw, 0) * scale + coords, DoRotation(Person::players[j]->jointPos(head), 0, Person::players[j]->yaw, 0) * Person::players[j]->scale + Person::players[j]->coords) || + (Person::players[j]->animTarget == hanganim && + normaldotproduct(Person::players[j]->facing, coords - Person::players[j]->coords) < 0)) { + aitype = searchtype; + lastchecktime = 12; + lastseen = Person::players[j]->coords; + lastseentime = 12; + } + } + } + if (aitype == attacktypecutoff && Game::musictype != 2) + if (creature != wolftype) { + stunned = .6; + surprised = .6; + } + } + + if (aitype != passivetype && Game::leveltime > .5) + howactive = typeactive; + + if (aitype == passivetype) { + aiupdatedelay -= multiplier; + losupdatedelay -= multiplier; + lastseentime += multiplier; + pausetime -= multiplier; + if (lastseentime > 1) + lastseentime = 1; + + if (aiupdatedelay < 0) { + if (numwaypoints > 1 && howactive == typeactive && pausetime <= 0) { + targetyaw = roughDirectionTo(coords, waypoints[waypoint]); + lookyaw = targetyaw; + aiupdatedelay = .05; + + if (distsqflat(&coords, &waypoints[waypoint]) < 1) { + if (waypointtype[waypoint] == wppause) + pausetime = 4; + waypoint++; + if (waypoint > numwaypoints - 1) + waypoint = 0; + } + } + + if (numwaypoints > 1 && howactive == typeactive && pausetime <= 0) + forwardkeydown = 1; + else + forwardkeydown = 0; + leftkeydown = 0; + backkeydown = 0; + rightkeydown = 0; + crouchkeydown = 0; + attackkeydown = 0; + throwkeydown = 0; + + if (avoidcollided > .8 && !jumpkeydown && collided < .8) { + if (!avoidsomething) + targetyaw += 90 * (whichdirection * 2 - 1); + else { + XYZ leftpos, rightpos; + float leftdist, rightdist; + leftpos = coords + DoRotation(facing, 0, 90, 0); + rightpos = coords - DoRotation(facing, 0, 90, 0); + leftdist = distsq(&leftpos, &avoidwhere); + rightdist = distsq(&rightpos, &avoidwhere); + if (leftdist < rightdist) + targetyaw += 90; + else + targetyaw -= 90; + } + } + } + if (collided < 1 || animTarget != jumpupanim) + jumpkeydown = 0; + if ((collided > .8 && jumppower >= 5)) + jumpkeydown = 1; + + //hearing sounds + if (!Game::editorenabled) { + if (howactive <= typesleeping) + if (numenvsounds > 0 && (!Tutorial::active || cananger) && hostile) + for (int j = 0; j < numenvsounds; j++) { + float vol = howactive == typesleeping ? envsoundvol[j] - 14 : envsoundvol[j]; + if (vol > 0 && distsq(&coords, &envsound[j]) < 2 * (vol + vol * (creature == rabbittype) * 3)) + aitype = attacktypecutoff; + } + + if (aitype != passivetype) { + if (howactive == typesleeping) + setTargetAnimation(getupfromfrontanim); + howactive = typeactive; + } + } + + if (howactive < typesleeping && + ((!Tutorial::active || cananger) && hostile) && + !Person::players[0]->dead && + distsq(&coords, &Person::players[0]->coords) < 400 && + occluded < 25) { + if (distsq(&coords, &Person::players[0]->coords) < 12 && + Animation::animations[Person::players[0]->animTarget].height != lowheight && !Game::editorenabled) + aitype = attacktypecutoff; + if (distsq(&coords, &Person::players[0]->coords) < 30 && + Animation::animations[Person::players[0]->animTarget].height == highheight && !Game::editorenabled) + aitype = attacktypecutoff; + + //wolf smell + if (creature == wolftype) { + XYZ windsmell; + for (unsigned j = 0; j < Person::players.size(); j++) { + if (j == 0 || (Person::players[j]->dead && Person::players[j]->bloodloss > 0)) { + float smelldistance = 50; + if (j == 0 && Person::players[j]->num_weapons > 0) { + if (weapons[Person::players[j]->weaponids[0]].bloody) + smelldistance = 100; + if (Person::players[j]->num_weapons == 2) + if (weapons[Person::players[j]->weaponids[1]].bloody) + smelldistance = 100; + } + if (j != 0) + smelldistance = 100; + windsmell = windvector; + Normalise(&windsmell); + windsmell = windsmell * 2 + Person::players[j]->coords; + if (distsq(&coords, &windsmell) < smelldistance && !Game::editorenabled) + aitype = attacktypecutoff; + } + } + } + + if (howactive < typesleeping && losupdatedelay < 0 && !Game::editorenabled && occluded < 2) { + losupdatedelay = .2; + for (unsigned j = 0; j < Person::players.size(); j++) { + if (j == 0 || Person::players[j]->skeleton.free || Person::players[j]->aitype != passivetype) { + if (abs(Random() % 2) || Animation::animations[Person::players[j]->animTarget].height != lowheight || j != 0) + if (distsq(&coords, &Person::players[j]->coords) < 400) + if (normaldotproduct(facing, Person::players[j]->coords - coords) > 0) + if ((-1 == Object::checkcollide( + DoRotation(jointPos(head), 0, yaw, 0) * + scale + + coords, + DoRotation(Person::players[j]->jointPos(head), 0, Person::players[j]->yaw, 0) * + Person::players[j]->scale + + Person::players[j]->coords) && + !Person::players[j]->isWallJump()) || + (Person::players[j]->animTarget == hanganim && + normaldotproduct(Person::players[j]->facing, coords - Person::players[j]->coords) < 0)) { + lastseentime -= .2; + if (j == 0 && Animation::animations[Person::players[j]->animTarget].height == lowheight) + lastseentime -= .4; + else + lastseentime -= .6; + } + if (lastseentime <= 0) { + aitype = searchtype; + lastchecktime = 12; + lastseen = Person::players[j]->coords; + lastseentime = 12; + } + } + } + } + } + //alerted surprise + if (aitype == attacktypecutoff && Game::musictype != 2) { + if (creature != wolftype) { + stunned = .6; + surprised = .6; + } + if (creature == wolftype) { + stunned = .47; + surprised = .47; + } + numseen++; + } + } + + //search for player + int j; + if (aitype == searchtype) { + aiupdatedelay -= multiplier; + losupdatedelay -= multiplier; + if (!pause) + lastseentime -= multiplier; + lastchecktime -= multiplier; + + if (isRun() && !onground) { + if (coords.y > terrain.getHeight(coords.x, coords.z) + 10) { + XYZ test2 = coords + facing; + test2.y += 5; + XYZ test = coords + facing; + test.y -= 10; + j = Object::checkcollide(test2, test, laststanding); + if (j == -1) + j = Object::checkcollide(test2, test); + if (j == -1) { + velocity = 0; + setTargetAnimation(getStop()); + targetyaw += 180; + stunned = .5; + //aitype=passivetype; + aitype = pathfindtype; + finalfinaltarget = waypoints[waypoint]; + finalpathfindpoint = -1; + targetpathfindpoint = -1; + lastpathfindpoint = -1; + lastpathfindpoint2 = -1; + lastpathfindpoint3 = -1; + lastpathfindpoint4 = -1; + } else + laststanding = j; + } + } + //check out last seen location + if (aiupdatedelay < 0) { + targetyaw = roughDirectionTo(coords, lastseen); + lookyaw = targetyaw; + aiupdatedelay = .05; + forwardkeydown = 1; + + if (distsqflat(&coords, &lastseen) < 1 * sq(scale * 5) || lastchecktime < 0) { + forwardkeydown = 0; + aiupdatedelay = 1; + lastseen.x += (float(Random() % 100) - 50) / 25; + lastseen.z += (float(Random() % 100) - 50) / 25; + lastchecktime = 3; + } + + leftkeydown = 0; + backkeydown = 0; + rightkeydown = 0; + crouchkeydown = 0; + attackkeydown = 0; + throwkeydown = 0; + + if (avoidcollided > .8 && !jumpkeydown && collided < .8) { + if (!avoidsomething) + targetyaw += 90 * (whichdirection * 2 - 1); + else { + XYZ leftpos, rightpos; + float leftdist, rightdist; + leftpos = coords + DoRotation(facing, 0, 90, 0); + rightpos = coords - DoRotation(facing, 0, 90, 0); + leftdist = distsq(&leftpos, &avoidwhere); + rightdist = distsq(&rightpos, &avoidwhere); + if (leftdist < rightdist) + targetyaw += 90; + else + targetyaw -= 90; + } + } + } + if (collided < 1 || animTarget != jumpupanim) + jumpkeydown = 0; + if ((collided > .8 && jumppower >= 5)) + jumpkeydown = 1; + + if (numenvsounds > 0 && ((!Tutorial::active || cananger) && hostile)) + for (int k = 0; k < numenvsounds; k++) { + if (distsq(&coords, &envsound[k]) < 2 * (envsoundvol[k] + envsoundvol[k] * (creature == rabbittype) * 3)) { + aitype = attacktypecutoff; + } + } + + if (!Person::players[0]->dead && + losupdatedelay < 0 && + !Game::editorenabled && + occluded < 2 && + ((!Tutorial::active || cananger) && hostile)) { + losupdatedelay = .2; + if (distsq(&coords, &Person::players[0]->coords) < 4 && Animation::animations[animTarget].height != lowheight) { + aitype = attacktypecutoff; + lastseentime = 1; + } + if (abs(Random() % 2) || Animation::animations[animTarget].height != lowheight) + //TODO: factor out canSeePlayer() + if (distsq(&coords, &Person::players[0]->coords) < 400) + if (normaldotproduct(facing, Person::players[0]->coords - coords) > 0) + if ((Object::checkcollide( + DoRotation(jointPos(head), 0, yaw, 0) * + scale + + coords, + DoRotation(Person::players[0]->jointPos(head), 0, Person::players[0]->yaw, 0) * + Person::players[0]->scale + + Person::players[0]->coords) == -1) || + (Person::players[0]->animTarget == hanganim && normaldotproduct(Person::players[0]->facing, coords - Person::players[0]->coords) < 0)) { + /* //TODO: changed j to 0 on a whim, make sure this is correct + (Person::players[j]->animTarget==hanganim&&normaldotproduct( + Person::players[j]->facing,coords-Person::players[j]->coords)<0) + */ + aitype = attacktypecutoff; + lastseentime = 1; + } + } + //player escaped + if (lastseentime < 0) { + //aitype=passivetype; + numescaped++; + aitype = pathfindtype; + finalfinaltarget = waypoints[waypoint]; + finalpathfindpoint = -1; + targetpathfindpoint = -1; + lastpathfindpoint = -1; + lastpathfindpoint2 = -1; + lastpathfindpoint3 = -1; + lastpathfindpoint4 = -1; + } + } + + if (aitype != gethelptype) + runninghowlong = 0; + + //get help from buddies + if (aitype == gethelptype) { + runninghowlong += multiplier; + aiupdatedelay -= multiplier; + + if (aiupdatedelay < 0 || ally == 0) { + aiupdatedelay = .2; + + //find closest ally + //TODO: factor out closest search somehow + if (!ally) { + int closest = -1; + float closestdist = -1; + for (unsigned k = 0; k < Person::players.size(); k++) { + if ((k != id) && (k != 0) && !Person::players[k]->dead && + (Person::players[k]->howactive < typedead1) && + !Person::players[k]->skeleton.free && + (Person::players[k]->aitype == passivetype)) { + float distance = distsq(&coords, &Person::players[k]->coords); + if (closestdist == -1 || distance < closestdist) { + closestdist = distance; + closest = k; + } + closest = k; + } + } + if (closest != -1) { + ally = closest; + } else { + ally = 0; + } + lastseen = Person::players[0]->coords; + lastseentime = 12; + } + + lastchecktime = 12; + + XYZ facing = coords; + XYZ flatfacing = Person::players[ally]->coords; + facing.y += jointPos(head).y * scale; + flatfacing.y += Person::players[ally]->jointPos(head).y * Person::players[ally]->scale; + if (-1 != Object::checkcollide(facing, flatfacing)) + lastseentime -= .1; + + //no available ally, run back to player + if (ally <= 0 || + Person::players[ally]->skeleton.free || + Person::players[ally]->aitype != passivetype || + lastseentime <= 0) { + aitype = searchtype; + lastseentime = 12; + } + + //seek out ally + if (ally > 0) { + targetyaw = roughDirectionTo(coords, Person::players[ally]->coords); + lookyaw = targetyaw; + aiupdatedelay = .05; + forwardkeydown = 1; + + if (distsqflat(&coords, &Person::players[ally]->coords) < 3) { + aitype = searchtype; + lastseentime = 12; + Person::players[ally]->aitype = searchtype; + if (Person::players[ally]->lastseentime < lastseentime) { + Person::players[ally]->lastseen = lastseen; + Person::players[ally]->lastseentime = lastseentime; + Person::players[ally]->lastchecktime = lastchecktime; + } + } + + if (avoidcollided > .8 && !jumpkeydown && collided < .8) { + if (!avoidsomething) + targetyaw += 90 * (whichdirection * 2 - 1); + else { + XYZ leftpos, rightpos; + float leftdist, rightdist; + leftpos = coords + DoRotation(facing, 0, 90, 0); + rightpos = coords - DoRotation(facing, 0, 90, 0); + leftdist = distsq(&leftpos, &avoidwhere); + rightdist = distsq(&rightpos, &avoidwhere); + if (leftdist < rightdist) + targetyaw += 90; + else + targetyaw -= 90; + } + } + } + + leftkeydown = 0; + backkeydown = 0; + rightkeydown = 0; + crouchkeydown = 0; + attackkeydown = 0; + } + if (collided < 1 || animTarget != jumpupanim) + jumpkeydown = 0; + if (collided > .8 && jumppower >= 5) + jumpkeydown = 1; + } + + //retreiving a weapon on the ground + if (aitype == getweapontype) { + aiupdatedelay -= multiplier; + lastchecktime -= multiplier; + + if (aiupdatedelay < 0) { + aiupdatedelay = .2; + + //ALLY IS WEPON + if (ally < 0) { + int closest = -1; + float closestdist = -1; + for (unsigned k = 0; k < weapons.size(); k++) + if (weapons[k].owner == -1) { + float distance = distsq(&coords, &weapons[k].position); + if (closestdist == -1 || distance < closestdist) { + closestdist = distance; + closest = k; + } + closest = k; + } + if (closest != -1) + ally = closest; + else + ally = -1; + } + + lastseentime = 12; + + if (!Person::players[0]->dead && ((!Tutorial::active || cananger) && hostile)) + if (ally < 0 || weaponactive != -1 || lastchecktime <= 0) { + aitype = attacktypecutoff; + lastseentime = 1; + } + if (!Person::players[0]->dead) + if (ally >= 0) { + if (weapons[ally].owner != -1 || + distsq(&coords, &weapons[ally].position) > 16) { + aitype = attacktypecutoff; + lastseentime = 1; + } + //TODO: factor these out as moveToward() + targetyaw = roughDirectionTo(coords, weapons[ally].position); + lookyaw = targetyaw; + aiupdatedelay = .05; + forwardkeydown = 1; + + if (avoidcollided > .8 && !jumpkeydown && collided < .8) { + if (!avoidsomething) + targetyaw += 90 * (whichdirection * 2 - 1); + else { + XYZ leftpos, rightpos; + float leftdist, rightdist; + leftpos = coords + DoRotation(facing, 0, 90, 0); + rightpos = coords - DoRotation(facing, 0, 90, 0); + leftdist = distsq(&leftpos, &avoidwhere); + rightdist = distsq(&rightpos, &avoidwhere); + if (leftdist < rightdist) + targetyaw += 90; + else + targetyaw -= 90; + } + } + } + + leftkeydown = 0; + backkeydown = 0; + rightkeydown = 0; + attackkeydown = 0; + throwkeydown = 1; + crouchkeydown = 0; + if (animTarget != crouchremoveknifeanim && + animTarget != removeknifeanim) + throwtogglekeydown = 0; + drawkeydown = 0; + } + if (collided < 1 || animTarget != jumpupanim) + jumpkeydown = 0; + if ((collided > .8 && jumppower >= 5)) + jumpkeydown = 1; + } + + if (aitype == attacktypecutoff) { + aiupdatedelay -= multiplier; + //dodge or reverse rabbit kicks, knife throws, flips + if (damage < damagetolerance * 2 / 3) + if ((Person::players[0]->animTarget == rabbitkickanim || + Person::players[0]->animTarget == knifethrowanim || + (Person::players[0]->isFlip() && + normaldotproduct(Person::players[0]->facing, Person::players[0]->coords - coords) < 0)) && + !Person::players[0]->skeleton.free && + (aiupdatedelay < .1)) { + attackkeydown = 0; + if (isIdle()) + crouchkeydown = 1; + if (Person::players[0]->animTarget != rabbitkickanim && Person::players[0]->weaponactive != -1) { + if (weapons[Person::players[0]->weaponids[0]].getType() == knife) { + if (isIdle() || isCrouch() || isRun() || isFlip()) { + if (abs(Random() % 2) == 0) { + setTargetAnimation(backhandspringanim); + } else { + setTargetAnimation(rollanim); + } + targetyaw += 90 * (abs(Random() % 2) * 2 - 1); + wentforweapon = 0; + } + if (animTarget == jumpupanim || animTarget == jumpdownanim) { + setTargetAnimation(flipanim); + } + } + } + forwardkeydown = 0; + aiupdatedelay = .02; + } + //get confused by flips + if (Person::players[0]->isFlip() && + !Person::players[0]->skeleton.free && + Person::players[0]->animTarget != walljumprightkickanim && + Person::players[0]->animTarget != walljumpleftkickanim) { + if (distsq(&Person::players[0]->coords, &coords) < 25) + if ((1 - damage / damagetolerance) > .5) + stunned = 1; + } + //go for weapon on the ground + if (wentforweapon < 3) + for (unsigned k = 0; k < weapons.size(); k++) + if (creature != wolftype) + if (num_weapons == 0 && + weapons[k].owner == -1 && + weapons[k].velocity.x == 0 && + weapons[k].velocity.z == 0 && + weapons[k].velocity.y == 0) { + if (distsq(&coords, &weapons[k].position) < 16) { + wentforweapon++; + lastchecktime = 6; + aitype = getweapontype; + ally = -1; + } + } + //dodge/reverse walljump kicks + if (damage < damagetolerance / 2) + if (Animation::animations[animTarget].height != highheight) + if (damage < damagetolerance * .5 && + ((Person::players[0]->animTarget == walljumprightkickanim || + Person::players[0]->animTarget == walljumpleftkickanim) && + ((aiupdatedelay < .15 && + difficulty == 2) || + (aiupdatedelay < .08 && + difficulty != 2)))) { + crouchkeydown = 1; + } + //walked off a ledge (?) + if (isRun() && !onground) + if (coords.y > terrain.getHeight(coords.x, coords.z) + 10) { + XYZ test2 = coords + facing; + test2.y += 5; + XYZ test = coords + facing; + test.y -= 10; + j = Object::checkcollide(test2, test, laststanding); + if (j == -1) + j = Object::checkcollide(test2, test); + if (j == -1) { + velocity = 0; + setTargetAnimation(getStop()); + targetyaw += 180; + stunned = .5; + aitype = pathfindtype; + finalfinaltarget = waypoints[waypoint]; + finalpathfindpoint = -1; + targetpathfindpoint = -1; + lastpathfindpoint = -1; + lastpathfindpoint2 = -1; + lastpathfindpoint3 = -1; + lastpathfindpoint4 = -1; + } else + laststanding = j; + } + //lose sight of player in the air (?) + if (Person::players[0]->coords.y > coords.y + 5 && + Animation::animations[Person::players[0]->animTarget].height != highheight && + !Person::players[0]->onterrain) { + aitype = pathfindtype; + finalfinaltarget = waypoints[waypoint]; + finalpathfindpoint = -1; + targetpathfindpoint = -1; + lastpathfindpoint = -1; + lastpathfindpoint2 = -1; + lastpathfindpoint3 = -1; + lastpathfindpoint4 = -1; + } + //it's time to think (?) + if (aiupdatedelay < 0 && + !Animation::animations[animTarget].attack && + animTarget != staggerbackhighanim && + animTarget != staggerbackhardanim && + animTarget != backhandspringanim && + animTarget != dodgebackanim) { + //draw weapon + if (weaponactive == -1 && num_weapons > 0) + drawkeydown = Random() % 2; + else + drawkeydown = 0; + rabbitkickenabled = Random() % 2; + //chase player + XYZ rotatetarget = Person::players[0]->coords + Person::players[0]->velocity; + XYZ targetpoint = Person::players[0]->coords; + if (distsq(&Person::players[0]->coords, &coords) < + distsq(&rotatetarget, &coords)) + targetpoint += Person::players[0]->velocity * + findDistance(&Person::players[0]->coords, &coords) / findLength(&velocity); + targetyaw = roughDirectionTo(coords, targetpoint); + lookyaw = targetyaw; + aiupdatedelay = .2 + fabs((float)(Random() % 100) / 1000); + + if (distsq(&coords, &Person::players[0]->coords) > 5 && (Person::players[0]->weaponactive == -1 || weaponactive != -1)) + forwardkeydown = 1; + else if ((distsq(&coords, &Person::players[0]->coords) > 16 || + distsq(&coords, &Person::players[0]->coords) < 9) && + Person::players[0]->weaponactive != -1) + forwardkeydown = 1; + else if (Random() % 6 == 0 || (creature == wolftype && Random() % 3 == 0)) + forwardkeydown = 1; + else + forwardkeydown = 0; + //chill out around the corpse + if (Person::players[0]->dead) { + forwardkeydown = 0; + if (Random() % 10 == 0) + forwardkeydown = 1; + if (Random() % 100 == 0) { + aitype = pathfindtype; + finalfinaltarget = waypoints[waypoint]; + finalpathfindpoint = -1; + targetpathfindpoint = -1; + lastpathfindpoint = -1; + lastpathfindpoint2 = -1; + lastpathfindpoint3 = -1; + lastpathfindpoint4 = -1; + } + } + leftkeydown = 0; + backkeydown = 0; + rightkeydown = 0; + crouchkeydown = 0; + throwkeydown = 0; + + if (avoidcollided > .8 && !jumpkeydown && collided < .8) + targetyaw += 90 * (whichdirection * 2 - 1); + //attack!!! + if (Random() % 2 == 0 || weaponactive != -1 || creature == wolftype) + attackkeydown = 1; + else + attackkeydown = 0; + if (isRun() && Random() % 6 && distsq(&coords, &Person::players[0]->coords) > 7) + attackkeydown = 0; + + //TODO: wat + if (aitype != playercontrolled && + (isIdle() || + isCrouch() || + isRun())) { + int target = -2; + for (unsigned j = 0; j < Person::players.size(); j++) + if (j != id && !Person::players[j]->skeleton.free && + Person::players[j]->hasvictim && + (Tutorial::active && reversaltrain || + Random() % 2 == 0 && difficulty == 2 || + Random() % 4 == 0 && difficulty == 1 || + Random() % 8 == 0 && difficulty == 0 || + Person::players[j]->lastattack2 == Person::players[j]->animTarget && + Person::players[j]->lastattack3 == Person::players[j]->animTarget && + (Random() % 2 == 0 || difficulty == 2) || + (isIdle() || isRun()) && + Person::players[j]->weaponactive != -1 || + Person::players[j]->animTarget == swordslashanim && + weaponactive != -1 || + Person::players[j]->animTarget == staffhitanim || + Person::players[j]->animTarget == staffspinhitanim)) + if (distsq(&Person::players[j]->coords, &Person::players[j]->victim->coords) < 4 && + Person::players[j]->victim == Person::players[id] && + (Person::players[j]->animTarget == sweepanim || + Person::players[j]->animTarget == spinkickanim || + Person::players[j]->animTarget == staffhitanim || + Person::players[j]->animTarget == staffspinhitanim || + Person::players[j]->animTarget == winduppunchanim || + Person::players[j]->animTarget == upunchanim || + Person::players[j]->animTarget == wolfslapanim || + Person::players[j]->animTarget == knifeslashstartanim || + Person::players[j]->animTarget == swordslashanim && + (distsq(&Person::players[j]->coords, &coords) < 2 || + weaponactive != -1))) { + if (target >= 0) { + target = -1; + } else { + target = j; + } + } + if (target >= 0) + Person::players[target]->Reverse(); + } + + if (collided < 1) + jumpkeydown = 0; + if (collided > .8 && jumppower >= 5 || + distsq(&coords, &Person::players[0]->coords) > 400 && + onterrain && + creature == rabbittype) + jumpkeydown = 1; + //TODO: why are we controlling the human? + if (normaldotproduct(facing, Person::players[0]->coords - coords) > 0) + Person::players[0]->jumpkeydown = 0; + if (Person::players[0]->animTarget == jumpdownanim && + distsq(&Person::players[0]->coords, &coords) < 40) + crouchkeydown = 1; + if (jumpkeydown) + attackkeydown = 0; + + if (Tutorial::active) + if (!canattack) + attackkeydown = 0; + + XYZ facing = coords; + XYZ flatfacing = Person::players[0]->coords; + facing.y += jointPos(head).y * scale; + flatfacing.y += Person::players[0]->jointPos(head).y * Person::players[0]->scale; + if (occluded >= 2) + if (-1 != Object::checkcollide(facing, flatfacing)) { + if (!pause) + lastseentime -= .2; + if (lastseentime <= 0 && + (creature != wolftype || + weaponstuck == -1)) { + aitype = searchtype; + lastchecktime = 12; + lastseen = Person::players[0]->coords; + lastseentime = 12; + } + } else + lastseentime = 1; + } + } + if (Animation::animations[Person::players[0]->animTarget].height == highheight && + (aitype == attacktypecutoff || + aitype == searchtype)) + if (Person::players[0]->coords.y > terrain.getHeight(Person::players[0]->coords.x, Person::players[0]->coords.z) + 10) { + XYZ test = Person::players[0]->coords; + test.y -= 40; + if (-1 == Object::checkcollide(Person::players[0]->coords, test)) + stunned = 1; + } + //stunned + if (aitype == passivetype && !(numwaypoints > 1) || + stunned > 0 || + pause && damage > superpermanentdamage) { + if (pause) + lastseentime = 1; + targetyaw = yaw; + forwardkeydown = 0; + leftkeydown = 0; + backkeydown = 0; + rightkeydown = 0; + jumpkeydown = 0; + attackkeydown = 0; + crouchkeydown = 0; + throwkeydown = 0; + } + + XYZ facing; + facing = 0; + facing.z = -1; + + XYZ flatfacing = DoRotation(facing, 0, yaw + 180, 0); + facing = flatfacing; + + if (aitype == attacktypecutoff) { + targetheadyaw = 180 - roughDirectionTo(coords, Person::players[0]->coords); + targetheadpitch = pitchTo(coords, Person::players[0]->coords); + } else if (howactive >= typesleeping) { + targetheadyaw = targetyaw; + targetheadpitch = 0; + } else { + if (interestdelay <= 0) { + interestdelay = .7 + (float)(abs(Random() % 100)) / 100; + headtarget = coords; + headtarget.x += (float)(abs(Random() % 200) - 100) / 100; + headtarget.z += (float)(abs(Random() % 200) - 100) / 100; + headtarget.y += (float)(abs(Random() % 200) - 100) / 300; + headtarget += facing * 1.5; + } + targetheadyaw = 180 - roughDirectionTo(coords, headtarget); + targetheadpitch = pitchTo(coords, headtarget); + } + } +}