X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;ds=sidebyside;f=Source%2FObjects%2FPerson.cpp;h=01b9f903e98631d2f568c20b96b98ce20003d47c;hb=bb302fb1d9936b1ab630a800698ab7b867472a7d;hp=9969e61194413125dd5b4fbaec5d5fe40af5aca5;hpb=d177a567280631cd91a677debafada8cef7e0413;p=lugaru.git
diff --git a/Source/Objects/Person.cpp b/Source/Objects/Person.cpp
index 9969e61..01b9f90 100644
--- a/Source/Objects/Person.cpp
+++ b/Source/Objects/Person.cpp
@@ -1,6 +1,6 @@
/*
Copyright (C) 2003, 2010 - Wolfire Games
-Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
+Copyright (C) 2010-2017 - Lugaru contributors (see AUTHORS file)
This file is part of Lugaru.
@@ -21,13 +21,13 @@ 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 "Utils/Folders.hpp"
#include "Tutorial.hpp"
+#include "Utils/Folders.hpp"
extern float multiplier;
extern Terrain terrain;
@@ -42,8 +42,6 @@ extern float slomodelay;
extern bool cellophane;
extern float texdetail;
extern float realtexdetail;
-extern GLubyte bloodText[512 * 512 * 3];
-extern GLubyte wolfbloodText[512 * 512 * 3];
extern int bloodtoggle;
extern bool autoslomo;
extern float camerashake;
@@ -51,7 +49,7 @@ 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;
@@ -67,246 +65,292 @@ extern float hostiletime;
extern bool gamestarted;
-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(),
-
- jumpclimb(false)
+extern XYZ envsound[30];
+extern float envsoundvol[30];
+extern int numenvsounds;
+extern float envsoundlife[30];
+
+extern XYZ windvector;
+
+std::vector> Person::players;
+
+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()
+
+ , 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(0)
+ , 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("Tempanim", lowheight, neutral)
+
+ , jumpclimb(false)
{
+ damagetolerance = PersonType::types[creature].defaultDamageTolerance;
+ setProportions(1, 1, 1, 1);
}
/* 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);
@@ -364,93 +408,85 @@ Person::Person(FILE *tfile, int mapvers, unsigned i) : Person()
funpackf(tfile, "Bf Bf Bf", &metalhead, &metalhigh, &metallow);
funpackf(tfile, "Bf Bf", &power, &speedmult);
- float headprop, legprop, armprop, bodyprop;
-
if (mapvers >= 4) {
- funpackf(tfile, "Bf Bf Bf Bf", &headprop, &bodyprop, &armprop, &legprop);
+ funpackf(tfile, "Bf Bf Bf Bf", &proportions[0], &proportions[1], &proportions[2], &proportions[3]);
} else {
- headprop = 1;
- bodyprop = 1;
- armprop = 1;
- legprop = 1;
- }
-
- if (creature == wolftype) {
- proportionhead = 1.1 * headprop;
- proportionbody = 1.1 * bodyprop;
- proportionarms = 1.1 * armprop;
- proportionlegs = 1.1 * legprop;
- } else if (creature == rabbittype) {
- proportionhead = 1.2 * headprop;
- proportionbody = 1.05 * bodyprop;
- proportionarms = 1.00 * armprop;
- proportionlegs = 1.1 * legprop;
- proportionlegs.y = 1.05 * legprop;
+ setProportions(1, 1, 1, 1);
}
funpackf(tfile, "Bi", &numclothes);
for (int k = 0; k < numclothes; k++) {
int templength;
funpackf(tfile, "Bi", &templength);
- for (int l = 0; l < templength; l++)
+ for (int l = 0; l < templength; l++) {
funpackf(tfile, "Bb", &clothes[k][l]);
+ }
clothes[k][templength] = '\0';
funpackf(tfile, "Bf Bf Bf", &clothestintr[k], &clothestintg[k], &clothestintb[k]);
}
loaded = true;
+ damagetolerance = PersonType::types[creature].defaultDamageTolerance;
+
if (scale < 0) {
- if (creature == wolftype) {
- scale = .23;
- damagetolerance = 300;
- } else {
- scale = .2;
- }
+ scale = PersonType::types[creature].defaultScale;
}
oldcoords = coords;
realoldcoords = coords;
}
-void Person::skeletonLoad(bool clothes)
+void Person::changeCreatureType(person_type type)
+{
+ creature = type;
+ whichskin = 0;
+ skeletonLoad();
+ scale = PersonType::types[creature].defaultScale;
+ damagetolerance = PersonType::types[creature].defaultDamageTolerance;
+}
+
+void Person::skeletonLoad()
{
skeleton.id = id;
- if (creature != wolftype) {
- skeleton.Load(
- "Skeleton/BasicFigure",
- "Skeleton/BasicFigureLow",
- "Skeleton/RabbitBelt",
- "Models/Body.solid",
- "Models/Body2.solid",
- "Models/Body3.solid",
- "Models/Body4.solid",
- "Models/Body5.solid",
- "Models/Body6.solid",
- "Models/Body7.solid",
- "Models/BodyLow.solid",
- "Models/Belt.solid",
- clothes
- );
- } else {
- skeleton.Load(
- "Skeleton/BasicFigureWolf",
- "Skeleton/BasicFigureWolfLow",
- "Skeleton/RabbitBelt",
- "Models/Wolf.solid",
- "Models/Wolf2.solid",
- "Models/Wolf3.solid",
- "Models/Wolf4.solid",
- "Models/Wolf5.solid",
- "Models/Wolf6.solid",
- "Models/Wolf7.solid",
- "Models/WolfLow.solid",
- "Models/Belt.solid",
- clothes
- );
- }
-
- skeleton.drawmodel.textureptr.load(creatureskin[creature][whichskin], 1, &skeleton.skinText[0], &skeleton.skinsize);
+ skeleton.Load(
+ PersonType::types[creature].figureFileName,
+ PersonType::types[creature].lowFigureFileName,
+ PersonType::types[creature].clothesFileName,
+ PersonType::types[creature].modelFileNames[0],
+ PersonType::types[creature].modelFileNames[1],
+ PersonType::types[creature].modelFileNames[2],
+ PersonType::types[creature].modelFileNames[3],
+ PersonType::types[creature].modelFileNames[4],
+ PersonType::types[creature].modelFileNames[5],
+ PersonType::types[creature].modelFileNames[6],
+ PersonType::types[creature].lowModelFileName,
+ PersonType::types[creature].modelClothesFileName,
+ PersonType::types[creature].clothes);
+
+ skeleton.drawmodel.textureptr.load(PersonType::types[creature].skins[whichskin], 1, &skeleton.skinText[0], &skeleton.skinsize);
+}
+
+void Person::setProportions(float head, float body, float arms, float legs)
+{
+ proportions[0] = head;
+ proportions[1] = body;
+ proportions[2] = arms;
+ proportions[3] = legs;
+}
+
+float Person::getProportion(int part) const
+{
+ return proportions[part];
+}
+
+XYZ Person::getProportionXYZ(int part) const
+{
+ XYZ prop = PersonType::types[creature].proportions[part] * proportions[part];
+ if (cellophane) {
+ prop.z = 0;
+ }
+ return prop;
}
/* EFFECT
@@ -460,34 +496,30 @@ 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) {
- float damagemult = (creature == wolftype ? 2.5 : 1.) * power * power;
+ float damagemult = PersonType::types[creature].power * power * power;
XYZ relative = velocity;
relative.y = 0;
Normalise(&relative);
victim->spurt = 1;
DoBlood(.2, 250);
- if (!Tutorial::active)
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords);
+ }
victim->RagDoll(0);
for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * 120 * damagemult;
}
victim->Puff(neck);
victim->DoDamage(100 * damagemult / victim->protectionhigh);
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
target = 0;
frameCurrent = 3;
@@ -496,8 +528,9 @@ void Person::CheckKick()
velocity = facing * -10;
velocity.y = 5;
skeleton.free = 0;
- if (id == 0)
+ if (id == 0) {
resume_stream(whooshsound);
+ }
award_bonus(id, cannon);
} else if (victim->isCrouch()) {
@@ -520,8 +553,8 @@ void Person::CheckKick()
/* EFFECT
*
* USES:
- * GameTick/doPlayerCollisions - spread fire between players
- * GameTick/doDevKeys - press f to ignite
+ * GameTick::doPlayerCollisions - spread fire between players
+ * GameTick::ProcessDevKeys - press f to ignite
* Person::DoStuff - spread fire from lit campfires and bushes
*/
void Person::CatchFire()
@@ -556,43 +589,60 @@ void Person::CatchFire()
*/
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 (Dialog::inDialog() && (howactive == typeactive) && PersonType::types[creature].hasAnimTalkIdle()) {
+ return PersonType::types[creature].animTalkIdle;
+ }
+ 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;
- if (creature == wolftype)
- return wolfidle;
+ return PersonType::types[creature].animFightIdle;
}
if (aitype == playercontrolled && stunned <= 0 && weaponactive != -1) {
- if (weapons[weaponids[weaponactive]].getType() == knife)
+ if (weapons[weaponids[weaponactive]].getType() == knife) {
return knifefightidleanim;
- if (weapons[weaponids[weaponactive]].getType() == sword && victim->weaponactive != -1)
+ }
+ if (weapons[weaponids[weaponactive]].getType() == sword && victim->weaponactive != -1) {
return swordfightidlebothanim;
- if (weapons[weaponids[weaponactive]].getType() == sword)
+ }
+ if (weapons[weaponids[weaponactive]].getType() == sword) {
return swordfightidleanim;
- if (weapons[weaponids[weaponactive]].getType() == staff)
+ }
+ if (weapons[weaponids[weaponactive]].getType() == staff) {
return swordfightidleanim;
+ }
}
- if (aitype != playercontrolled && stunned <= 0 && creature != wolftype && !pause)
+ if (aitype != playercontrolled && stunned <= 0 && creature != wolftype && !pause) {
return fightsidestep;
+ }
}
- if ((damage > permanentdamage || damage > damagetolerance * .8 || deathbleeding > 0) && creature != wolftype)
+ }
+ 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;
- return 0;
+ }
+ 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;
+ }
+ return PersonType::types[creature].animBounceIdle;
}
/* FUNCTION
@@ -600,11 +650,7 @@ int Person::getIdle()
*/
int Person::getCrouch()
{
- if (creature == rabbittype)
- return crouchanim;
- if (creature == wolftype)
- return wolfcrouchanim;
- return 0;
+ return PersonType::types[creature].animCrouch;
}
/* FUNCTION
@@ -612,49 +658,32 @@ int Person::getCrouch()
*/
int Person::getRun()
{
- if (creature == rabbittype && (!superruntoggle || weaponactive != -1))
- return runanim;
- if (creature == wolftype && (!superruntoggle))
- return wolfrunanim;
-
- if (creature == rabbittype && (superruntoggle && weaponactive == -1))
- return rabbitrunninganim;
- if (creature == wolftype && (superruntoggle))
- return wolfrunninganim;
- return 0;
+ if (superruntoggle && (weaponactive == -1)) {
+ return PersonType::types[creature].animRunning;
+ } else {
+ return PersonType::types[creature].animRun;
+ }
}
/* FUNCTION
*/
int Person::getStop()
{
- if (creature == rabbittype)
- return stopanim;
- if (creature == wolftype)
- return wolfstopanim;
- return 0;
+ return PersonType::types[creature].animStop;
}
/* FUNCTION
*/
int Person::getLanding()
{
- if (creature == rabbittype)
- return landanim;
- if (creature == wolftype)
- return wolflandanim;
- return 0;
+ return PersonType::types[creature].animLanding;
}
/* FUNCTION
*/
int Person::getLandhard()
{
- if (creature == rabbittype)
- return landhardanim;
- if (creature == wolftype)
- return wolflandhardanim;
- return 0;
+ return PersonType::types[creature].animLandingHard;
}
/* EFFECT
@@ -665,10 +694,11 @@ int Person::getLandhard()
static void
SolidHitBonus(int playerid)
{
- if (bonustime < 1.5 && bonus >= solidhit && bonus <= megacombo)
+ if (bonustime < 1.5 && bonus >= solidhit && bonus <= megacombo) {
award_bonus(playerid, bonus == megacombo ? bonus : bonus + 1);
- else
+ } else {
award_bonus(playerid, solidhit);
+ }
}
/* EFFECT
@@ -694,11 +724,11 @@ 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
+ if (Random() % 2 == 0) { // 50% chance
for (int i = 0; i < 3; i++) {
if (Random() % 2 != 0) {
// emit teeth particles
@@ -715,37 +745,32 @@ 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;
bleedyint = 0;
- if (creature == rabbittype)
- while (bloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] > which + 4 || bloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] < which - 4 || bleedxint < 10 || bleedyint < 10 || bleedxint > 500 || bleedyint > 500) {
- bleedxint = abs(Random() % 512);
- bleedyint = abs(Random() % 512);
- }
- if (creature == wolftype)
- while (wolfbloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] > which + 4 || wolfbloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] < which - 4 || bleedxint < 10 || bleedyint < 10 || bleedxint > 500 || bleedyint > 500) {
- bleedxint = abs(Random() % 512);
- bleedyint = abs(Random() % 512);
- }
+ while (PersonType::types[creature].bloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] > which + 4 || PersonType::types[creature].bloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] < which - 4 || bleedxint < 10 || bleedyint < 10 || bleedxint > 500 || bleedyint > 500) {
+ bleedxint = abs(Random() % 512);
+ bleedyint = abs(Random() % 512);
+ }
bleedy = bleedxint;
bleedx = bleedyint;
bleedy /= realtexdetail;
bleedx /= realtexdetail;
direction = abs(Random() % 2) * 2 - 1;
}
-
}
- if (bleeding > 2)
+ if (bleeding > 2) {
bleeding = 2;
+ }
}
/* EFFECT
@@ -756,27 +781,32 @@ void Person::DoBloodBig(float howmuch, int which)
{
static int bleedxint, bleedyint, i, j;
static XYZ bloodvel;
- if (howmuch && id == 0)
+ if (howmuch && id == 0) {
blooddimamount = 1;
+ }
- if (!Tutorial::active || id == 0)
+ if (!Tutorial::active || id == 0) {
if (aitype != playercontrolled && howmuch > 0) {
// play pain sounds
int whichsound = -1;
if (creature == wolftype) {
int i = abs(Random() % 2);
- if (i == 0)
+ if (i == 0) {
whichsound = snarlsound;
- if (i == 1)
+ }
+ if (i == 1) {
whichsound = snarl2sound;
+ }
}
if (creature == rabbittype) {
int i = abs(Random() % 2);
- if (i == 0)
+ if (i == 0) {
whichsound = rabbitpainsound;
- if (i == 1 && howmuch >= 2)
+ }
+ if (i == 1 && howmuch >= 2) {
whichsound = rabbitpain1sound;
+ }
}
if (whichsound != -1) {
@@ -784,12 +814,13 @@ void Person::DoBloodBig(float howmuch, int which)
addEnvSound(coords);
}
}
+ }
if (id == 0 && howmuch > 0) {
Game::flash(.5, 0);
}
- if (bloodtoggle && decals && !Tutorial::active) {
+ if (bloodtoggle && decalstoggle && !Tutorial::active) {
if (bleeding <= 0 && spurt) {
spurt = 0;
for (int i = 0; i < 3; i++) {
@@ -805,8 +836,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);
}
}
}
@@ -836,46 +867,53 @@ void Person::DoBloodBig(float howmuch, int which)
offsetx = 20;
}
-
int startx = 512;
int starty = 512;
int endx = 0;
int endy = 0;
GLubyte color;
- if (creature == rabbittype)
- 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;
+ for (i = 0; i < 512; i++) {
+ for (j = 0; j < 512; j++) {
+ if (PersonType::types[creature].bloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && PersonType::types[creature].bloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) {
+ if (i < startx) {
+ startx = i;
}
- }
- }
- if (creature == wolftype)
- 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 (j < starty) {
+ starty = j;
+ }
+ if (i > endx) {
+ endx = i;
+ }
+ if (j > endy) {
+ endy = j;
}
}
}
+ }
startx += offsetx;
endx += offsetx;
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;
@@ -884,61 +922,45 @@ void Person::DoBloodBig(float howmuch, int which)
int texdetailint = realtexdetail;
int where;
- if (creature == rabbittype)
- for (i = startx; i < endx; i++) {
- for (j = starty; j < endy; j++) {
- if (bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] <= which + 4 && bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] >= which - 4) {
- color = Random() % 85 + 170;
- where = i * skeleton.skinsize * 3 + j * 3;
- if (skeleton.skinText[where + 0] > color / 2)
- skeleton.skinText[where + 0] = color / 2;
- skeleton.skinText[where + 1] = 0;
- skeleton.skinText[where + 2] = 0;
- }
- }
- }
- if (creature == wolftype)
- for (i = startx; i < endx; i++) {
- for (j = starty; j < endy; j++) {
- if (wolfbloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] <= which + 4 && wolfbloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] >= which - 4) {
- color = Random() % 85 + 170;
- where = i * skeleton.skinsize * 3 + j * 3;
- if (skeleton.skinText[where + 0] > color / 2)
- skeleton.skinText[where + 0] = color / 2;
- skeleton.skinText[where + 1] = 0;
- skeleton.skinText[where + 2] = 0;
+ for (i = startx; i < endx; i++) {
+ for (j = starty; j < endy; j++) {
+ if (PersonType::types[creature].bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] <= which + 4 && PersonType::types[creature].bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] >= which - 4) {
+ color = Random() % 85 + 170;
+ where = i * skeleton.skinsize * 3 + j * 3;
+ if (skeleton.skinText[where + 0] > color / 2) {
+ skeleton.skinText[where + 0] = color / 2;
}
+ skeleton.skinText[where + 1] = 0;
+ skeleton.skinText[where + 2] = 0;
}
}
+ }
skeleton.drawmodel.textureptr.bind();
DoMipmaps();
bleedxint = 0;
bleedyint = 0;
- if (creature == rabbittype)
- while (bloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] > which + 4 || bloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] < which - 4 || bleedxint < 10 || bleedyint < 10 || bleedxint > 500 || bleedyint > 500) {
- bleedxint = abs(Random() % 512);
- bleedyint = abs(Random() % 512);
- }
- if (creature == wolftype)
- while (wolfbloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] > which + 4 || wolfbloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] < which - 4 || bleedxint < 10 || bleedyint < 10 || bleedxint > 500 || bleedyint > 500) {
- bleedxint = abs(Random() % 512);
- bleedyint = abs(Random() % 512);
- }
+ while (PersonType::types[creature].bloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] > which + 4 || PersonType::types[creature].bloodText[bleedxint * 512 * 3 + bleedyint * 3 + 0] < which - 4 || bleedxint < 10 || bleedyint < 10 || bleedxint > 500 || bleedyint > 500) {
+ bleedxint = abs(Random() % 512);
+ bleedyint = abs(Random() % 512);
+ }
bleedy = bleedxint + offsetx;
bleedx = bleedyint + offsety;
bleedy /= realtexdetail;
bleedx /= realtexdetail;
- if (bleedx < 0)
+ if (bleedx < 0) {
bleedx = 0;
- if (bleedy < 0)
+ }
+ if (bleedy < 0) {
bleedy = 0;
- if (bleedx > skeleton.skinsize - 1)
+ }
+ if (bleedx > skeleton.skinsize - 1) {
bleedx = skeleton.skinsize - 1;
- if (bleedy > skeleton.skinsize - 1)
+ }
+ 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;
@@ -948,12 +970,14 @@ void Person::DoBloodBig(float howmuch, int which)
if (abs(Random() % 2) == 0) {
aitype = gethelptype;
lastseentime = 12;
- } else
+ } else {
aitype = attacktypecutoff;
+ }
ally = 0;
}
- if (bleeding > 2)
+ if (bleeding > 2) {
bleeding = 2;
+ }
}
/* EFFECT
@@ -972,10 +996,11 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where)
float coordsx, coordsy;
float total;
- if (bloodtoggle && decals && !Tutorial::active) {
+ if (bloodtoggle && decalstoggle && !Tutorial::active) {
where -= coords;
- if (!skeleton.free)
+ if (!skeleton.free) {
where = DoRotation(where, 0, -yaw, 0);
+ }
//where=scale;
startpoint = where;
startpoint.y += 100;
@@ -988,9 +1013,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);
@@ -1010,7 +1035,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];
@@ -1035,8 +1059,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);
}
}
}
@@ -1052,39 +1076,47 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where)
int endx = 0;
int endy = 0;
GLubyte color;
- if (creature == rabbittype)
- 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;
+ for (i = 0; i < 512; i++) {
+ for (j = 0; j < 512; j++) {
+ if (PersonType::types[creature].bloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && PersonType::types[creature].bloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) {
+ if (i < startx) {
+ startx = i;
}
- }
- }
- if (creature == wolftype)
- 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 (j < starty) {
+ starty = j;
+ }
+ if (i > endx) {
+ endx = i;
+ }
+ if (j > endy) {
+ endy = j;
}
}
}
+ }
startx += offsetx;
endx += offsetx;
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;
@@ -1093,46 +1125,27 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where)
int texdetailint = realtexdetail;
int where;
- if (creature == rabbittype)
- for (i = startx; i < endx; i++) {
- for (j = starty; j < endy; j++) {
- if (bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] <= which + 4 && bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] >= which - 4) {
- color = Random() % 85 + 170;
- where = i * skeleton.skinsize * 3 + j * 3;
- if (skeleton.skinText[where + 0] > color / 2)
- skeleton.skinText[where + 0] = color / 2;
- skeleton.skinText[where + 1] = 0;
- skeleton.skinText[where + 2] = 0;
- } else if (bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] <= 160 + 4 && bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] >= 160 - 4) {
- color = Random() % 85 + 170;
- where = i * skeleton.skinsize * 3 + j * 3;
- if (skeleton.skinText[where + 0] > color / 2)
- skeleton.skinText[where + 0] = color / 2;
- skeleton.skinText[where + 1] = 0;
- skeleton.skinText[where + 2] = 0;
- }
- }
- }
- if (creature == wolftype)
- for (i = startx; i < endx; i++) {
- for (j = starty; j < endy; j++) {
- if (wolfbloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] <= which + 4 && wolfbloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] >= which - 4) {
- color = Random() % 85 + 170;
- where = i * skeleton.skinsize * 3 + j * 3;
- if (skeleton.skinText[where + 0] > color / 2)
- skeleton.skinText[where + 0] = color / 2;
- skeleton.skinText[where + 1] = 0;
- skeleton.skinText[where + 2] = 0;
- } else if (wolfbloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] <= 160 + 4 && wolfbloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] >= 160 - 4) {
- color = Random() % 85 + 170;
- where = i * skeleton.skinsize * 3 + j * 3;
- if (skeleton.skinText[where + 0] > color / 2)
- skeleton.skinText[where + 0] = color / 2;
- skeleton.skinText[where + 1] = 0;
- skeleton.skinText[where + 2] = 0;
+ for (i = startx; i < endx; i++) {
+ for (j = starty; j < endy; j++) {
+ if (PersonType::types[creature].bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] <= which + 4 && PersonType::types[creature].bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] >= which - 4) {
+ color = Random() % 85 + 170;
+ where = i * skeleton.skinsize * 3 + j * 3;
+ if (skeleton.skinText[where + 0] > color / 2) {
+ skeleton.skinText[where + 0] = color / 2;
+ }
+ skeleton.skinText[where + 1] = 0;
+ skeleton.skinText[where + 2] = 0;
+ } else if (PersonType::types[creature].bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] <= 160 + 4 && PersonType::types[creature].bloodText[(i * texdetailint - offsetx) * 512 * 3 + (j * texdetailint - offsety) * 3 + 0] >= 160 - 4) {
+ color = Random() % 85 + 170;
+ where = i * skeleton.skinsize * 3 + j * 3;
+ if (skeleton.skinText[where + 0] > color / 2) {
+ skeleton.skinText[where + 0] = color / 2;
}
+ skeleton.skinText[where + 1] = 0;
+ skeleton.skinText[where + 2] = 0;
}
}
+ }
skeleton.drawmodel.textureptr.bind();
DoMipmaps();
@@ -1140,18 +1153,23 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where)
bleedx = coordsx * 512;
bleedy /= realtexdetail;
bleedx /= realtexdetail;
- if (bleedx < 0)
+ if (bleedx < 0) {
bleedx = 0;
- if (bleedy < 0)
+ }
+ if (bleedy < 0) {
bleedy = 0;
- if (bleedx > skeleton.skinsize - 1)
+ }
+ if (bleedx > skeleton.skinsize - 1) {
bleedx = skeleton.skinsize - 1;
- if (bleedy > skeleton.skinsize - 1)
+ }
+ if (bleedy > skeleton.skinsize - 1) {
bleedy = skeleton.skinsize - 1;
+ }
direction = abs(Random() % 2) * 2 - 1;
}
- if (whichtri == -1)
+ if (whichtri == -1) {
return 0;
+ }
}
bleeding = howmuch + (float)abs(Random() % 100) / 200 - .25;
deathbleeding += bleeding;
@@ -1161,35 +1179,29 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where)
if (abs(Random() % 2) == 0) {
aitype = gethelptype;
lastseentime = 12;
- } else
+ } else {
aitype = attacktypecutoff;
+ }
ally = 0;
}
- if (bleeding > 2)
+ if (bleeding > 2) {
bleeding = 2;
+ }
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
- && (!Tutorial::active || 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) {
animTarget = sweepreversedanim;
@@ -1219,14 +1231,16 @@ void Person::Reverse()
if (victim->weaponactive != -1) {
victim->throwtogglekeydown = 1;
XYZ tempVelocity = victim->velocity * .2;
- if (tempVelocity.x == 0)
+ if (tempVelocity.x == 0) {
tempVelocity.x = .1;
+ }
weapons[victim->weaponids[0]].drop(tempVelocity, tempVelocity, false);
victim->num_weapons--;
if (victim->num_weapons) {
victim->weaponids[0] = victim->weaponids[victim->num_weapons];
- if (victim->weaponstuck == victim->num_weapons)
+ if (victim->weaponstuck == victim->num_weapons) {
victim->weaponstuck = 0;
+ }
}
victim->weaponactive = -1;
@@ -1244,14 +1258,16 @@ void Person::Reverse()
if (victim->weaponactive != -1) {
victim->throwtogglekeydown = 1;
XYZ tempVelocity = victim->velocity * .2;
- if (tempVelocity.x == 0)
+ if (tempVelocity.x == 0) {
tempVelocity.x = .1;
+ }
weapons[victim->weaponids[0]].drop(tempVelocity, tempVelocity, false);
victim->num_weapons--;
if (victim->num_weapons) {
victim->weaponids[0] = victim->weaponids[victim->num_weapons];
- if (victim->weaponstuck == victim->num_weapons)
+ if (victim->weaponstuck == victim->num_weapons) {
victim->weaponstuck = 0;
+ }
}
victim->weaponactive = -1;
@@ -1268,14 +1284,16 @@ void Person::Reverse()
if (victim->weaponactive != -1) {
victim->throwtogglekeydown = 1;
XYZ tempVelocity = victim->velocity * .2;
- if (tempVelocity.x == 0)
+ if (tempVelocity.x == 0) {
tempVelocity.x = .1;
+ }
weapons[victim->weaponids[0]].drop(tempVelocity, tempVelocity, false);
victim->num_weapons--;
if (victim->num_weapons) {
victim->weaponids[0] = victim->weaponids[victim->num_weapons];
- if (victim->weaponstuck == victim->num_weapons)
+ if (victim->weaponstuck == victim->num_weapons) {
victim->weaponstuck = 0;
+ }
}
victim->weaponactive = -1;
@@ -1292,14 +1310,16 @@ void Person::Reverse()
if (victim->weaponactive != -1) {
victim->throwtogglekeydown = 1;
XYZ tempVelocity = victim->velocity * .2;
- if (tempVelocity.x == 0)
+ if (tempVelocity.x == 0) {
tempVelocity.x = .1;
+ }
weapons[victim->weaponids[0]].drop(tempVelocity, tempVelocity, false);
victim->num_weapons--;
if (victim->num_weapons) {
victim->weaponids[0] = victim->weaponids[victim->num_weapons];
- if (victim->weaponstuck == victim->num_weapons)
+ if (victim->weaponstuck == victim->num_weapons) {
victim->weaponstuck = 0;
+ }
}
victim->weaponactive = -1;
@@ -1353,10 +1373,12 @@ void Person::Reverse()
if (abs(Random() % 20) == 0 || weapons[victim->weaponids[victim->weaponactive]].getType() == knife) {
if (victim->weaponactive != -1) {
if (weapons[victim->weaponids[0]].getType() == staff || weapons[weaponids[0]].getType() == staff) {
- if (weapons[victim->weaponids[0]].getType() == staff)
+ if (weapons[victim->weaponids[0]].getType() == staff) {
weapons[victim->weaponids[0]].damage += .2 + float(abs(Random() % 100) - 50) / 250;
- if (weapons[weaponids[0]].getType() == staff)
+ }
+ if (weapons[weaponids[0]].getType() == staff) {
weapons[weaponids[0]].damage += .2 + float(abs(Random() % 100) - 50) / 250;
+ }
emit_sound_at(swordstaffsound, victim->coords);
} else {
emit_sound_at(metalhitsound, victim->coords);
@@ -1375,8 +1397,9 @@ void Person::Reverse()
victim->num_weapons--;
if (victim->num_weapons) {
victim->weaponids[0] = victim->weaponids[num_weapons];
- if (victim->weaponstuck == victim->num_weapons)
+ if (victim->weaponstuck == victim->num_weapons) {
victim->weaponstuck = 0;
+ }
}
victim->weaponactive = -1;
for (unsigned i = 0; i < Person::players.size(); i++) {
@@ -1387,10 +1410,12 @@ void Person::Reverse()
if (abs(Random() % 20) == 0) {
if (weaponactive != -1) {
if (weapons[victim->weaponids[0]].getType() == staff || weapons[weaponids[0]].getType() == staff) {
- if (weapons[victim->weaponids[0]].getType() == staff)
+ if (weapons[victim->weaponids[0]].getType() == staff) {
weapons[victim->weaponids[0]].damage += .2 + float(abs(Random() % 100) - 50) / 250;
- if (weapons[weaponids[0]].getType() == staff)
+ }
+ if (weapons[weaponids[0]].getType() == staff) {
weapons[weaponids[0]].damage += .2 + float(abs(Random() % 100) - 50) / 250;
+ }
emit_sound_at(swordstaffsound, coords);
} else {
@@ -1411,18 +1436,17 @@ void Person::Reverse()
num_weapons--;
if (num_weapons) {
weaponids[0] = weaponids[num_weapons];
- if (weaponstuck == num_weapons)
+ if (weaponstuck == num_weapons) {
weaponstuck = 0;
+ }
}
weaponactive = -1;
for (unsigned i = 0; i < Person::players.size(); i++) {
Person::players[i]->wentforweapon = 0;
}
-
-
}
}
- if (hasvictim)
+ if (hasvictim) {
if (animTarget == knifeslashstartanim || animTarget == swordslashanim || animTarget == staffhitanim || animTarget == staffspinhitanim) {
if ((animTarget != staffhitanim && animTarget != staffspinhitanim) || distsq(&coords, &victim->coords) > .2) {
victim->animTarget = dodgebackanim;
@@ -1434,8 +1458,9 @@ void Person::Reverse()
Normalise(&rotatetarget);
victim->targetyaw = -asin(0 - rotatetarget.x);
victim->targetyaw *= 360 / 6.28;
- if (rotatetarget.z < 0)
+ if (rotatetarget.z < 0) {
victim->targetyaw = 180 - victim->targetyaw;
+ }
victim->targettilt2 = -asin(rotatetarget.y) * 360 / 6.28; //*-70;
@@ -1452,8 +1477,9 @@ void Person::Reverse()
Normalise(&rotatetarget);
victim->targetyaw = -asin(0 - rotatetarget.x);
victim->targetyaw *= 360 / 6.28;
- if (rotatetarget.z < 0)
+ if (rotatetarget.z < 0) {
victim->targetyaw = 180 - victim->targetyaw;
+ }
victim->targettilt2 = -asin(rotatetarget.y) * 360 / 6.28; //*-70;
@@ -1462,6 +1488,7 @@ void Person::Reverse()
victim->lastattack = victim->animTarget;
}
}
+ }
velocity = 0;
victim->velocity = 0;
@@ -1476,8 +1503,9 @@ void Person::Reverse()
}
}
- if (victim->id == 0 && Animation::animations[victim->animTarget].attack == reversal)
+ if (victim->id == 0 && Animation::animations[victim->animTarget].attack == reversal) {
numreversals++;
+ }
}
/* EFFECT
@@ -1485,45 +1513,53 @@ void Person::Reverse()
*/
void Person::DoDamage(float howmuch)
{
- // subtract health (temporary?)
- if (!Tutorial::active)
- 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 (!Tutorial::active)
+ if (!Tutorial::active) {
+ damage += howmuch / power;
permanentdamage += howmuch / 2 / power;
- if (!Tutorial::active)
superpermanentdamage += howmuch / 4 / power;
+ }
// visual effects
- if (permanentdamage > damagetolerance / 2 && permanentdamage - howmuch < damagetolerance / 2 && Random() % 2)
+ if (permanentdamage > damagetolerance / 2 && permanentdamage - howmuch < damagetolerance / 2 && Random() % 2) {
DoBlood(1, 255);
- if ((permanentdamage > damagetolerance * .8 && Random() % 2 && !deathbleeding) || spurt)
+ }
+ 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 && ((!Tutorial::active || cananger) && hostile))
+ if (aitype == passivetype && damage < damagetolerance && ((!Tutorial::active || cananger) && hostile)) {
aitype = attacktypecutoff;
+ }
if (!Tutorial::active && aitype != playercontrolled && damage < damagetolerance && damage > damagetolerance * 2 / 3 && creature == rabbittype) {
if (abs(Random() % 2) == 0) {
aitype = gethelptype;
lastseentime = 12;
- } else
+ } else {
aitype = attacktypecutoff;
+ }
ally = 0;
}
@@ -1559,23 +1595,27 @@ void Person::DoDamage(float howmuch)
}
// play sounds
- if (!Tutorial::active || id == 0)
+ if (!Tutorial::active || id == 0) {
if (speechdelay <= 0 && !dead && aitype != playercontrolled) {
int whichsound = -1;
if (creature == wolftype) {
int i = abs(Random() % 2);
- if (i == 0)
+ if (i == 0) {
whichsound = snarlsound;
- if (i == 1)
+ }
+ if (i == 1) {
whichsound = snarl2sound;
+ }
}
if (creature == rabbittype) {
int i = abs(Random() % 2);
- if (i == 0)
+ if (i == 0) {
whichsound = rabbitpainsound;
- if (i == 1 && damage > damagetolerance)
+ }
+ if (i == 1 && damage > damagetolerance) {
whichsound = rabbitpain1sound;
+ }
}
if (whichsound != -1) {
@@ -1583,6 +1623,7 @@ void Person::DoDamage(float howmuch)
addEnvSound(coords);
}
}
+ }
speechdelay = .3;
}
@@ -1601,51 +1642,68 @@ 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)
+ if (targetheadyaw > 160) {
targetheadpitch = targetheadpitch * -1;
- if (targetheadyaw < -160)
+ }
+ if (targetheadyaw < -160) {
targetheadpitch = targetheadpitch * -1;
- if (targetheadyaw > 160)
+ }
+ if (targetheadyaw > 160) {
targetheadyaw = targetheadyaw - 180;
- if (targetheadyaw < -160)
+ }
+ if (targetheadyaw < -160) {
targetheadyaw = targetheadyaw + 180;
+ }
- if (targetheadpitch > 120)
+ if (targetheadpitch > 120) {
targetheadpitch = 120;
- if (targetheadpitch < -120)
+ }
+ if (targetheadpitch < -120) {
targetheadpitch = -120;
- if (targetheadyaw > 120)
+ }
+ if (targetheadyaw > 120) {
targetheadyaw = 120;
- if (targetheadyaw < -120)
+ }
+ if (targetheadyaw < -120) {
targetheadyaw = -120;
+ }
- if (!isIdle())
+ if (!isIdle()) {
targetheadpitch = 0;
+ }
if (isIdle()) {
- if (targetheadyaw > 80)
+ if (targetheadyaw > 80) {
targetheadyaw = 80;
- if (targetheadyaw < -80)
+ }
+ if (targetheadyaw < -80) {
targetheadyaw = -80;
- if (targetheadpitch > 50)
+ }
+ if (targetheadpitch > 50) {
targetheadpitch = 50;
- if (targetheadpitch < -50)
+ }
+ if (targetheadpitch < -50) {
targetheadpitch = -50;
+ }
}
- if (abs(headyaw - targetheadyaw) < multiplier * lookspeed)
+ if (abs(headyaw - targetheadyaw) < multiplier * lookspeed) {
headyaw = targetheadyaw;
- else if (headyaw > targetheadyaw) {
+ } else if (headyaw > targetheadyaw) {
headyaw -= multiplier * lookspeed;
} else if (headyaw < targetheadyaw) {
headyaw += multiplier * lookspeed;
}
- if (abs(headpitch - targetheadpitch) < multiplier * lookspeed / 2)
+ if (abs(headpitch - targetheadpitch) < multiplier * lookspeed / 2) {
headpitch = targetheadpitch;
- else if (headpitch > targetheadpitch) {
+ } else if (headpitch > targetheadpitch) {
headpitch -= multiplier * lookspeed / 2;
} else if (headpitch < targetheadpitch) {
headpitch += multiplier * lookspeed / 2;
@@ -1687,13 +1745,15 @@ void Person::DoHead()
void Person::RagDoll(bool checkcollision)
{
static XYZ change;
- static int l, i;
+ static int i;
static float speed;
if (!skeleton.free) {
- if (id == 0)
+ if (id == 0) {
numfalls++;
- if (id == 0 && isFlip())
+ }
+ if (id == 0 && isFlip()) {
numflipfail++;
+ }
escapednum = 0;
@@ -1711,20 +1771,38 @@ 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 (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;
@@ -1746,16 +1824,18 @@ void Person::RagDoll(bool checkcollision)
if (currentFrame().speed > targetFrame().speed) {
speed = currentFrame().speed * 2;
}
- if (transspeed)
+ if (transspeed) {
speed = transspeed * 2;
+ }
speed *= speedmult;
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)
+ 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
+ } else {
skeleton.joints[i].velocity = velocity / scale + facing * 5;
+ }
change.x = (float)(Random() % 100) / 100;
change.y = (float)(Random() % 100) / 100;
change.z = (float)(Random() % 100) / 100;
@@ -1787,16 +1867,15 @@ void Person::RagDoll(bool checkcollision)
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, &Object::objects[i]->position, &Object::objects[i]->yaw, &Object::objects[i]->model) != -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;
@@ -1816,8 +1895,9 @@ void Person::RagDoll(bool checkcollision)
num_weapons--;
if (num_weapons) {
weaponids[0] = weaponids[num_weapons];
- if (weaponstuck == num_weapons)
+ if (weaponstuck == num_weapons) {
weaponstuck = 0;
+ }
}
weaponactive = -1;
for (unsigned i = 0; i < Person::players.size(); i++) {
@@ -1833,8 +1913,6 @@ void Person::RagDoll(bool checkcollision)
}
}
-
-
/* EFFECT
*/
void Person::FootLand(bodypart whichfoot, float opacity)
@@ -1849,12 +1927,14 @@ void Person::FootLand(bodypart whichfoot, float opacity)
if (opacity > 1) {
footvel = 0;
footpoint = DoRotation(jointPos(whichfoot), 0, yaw, 0) * scale + coords;
- if (distsq(&footpoint, &viewer))
+ if (distsq(&footpoint, &viewer)) {
Sprite::MakeSprite(cloudsprite, footpoint, footvel, 1, 1, 1, .5, .2 * opacity);
+ }
} else if (onterrain && terrain.getOpacity(coords.x, coords.z) < .2) {
footvel = velocity / 5;
- if (footvel.y < .8)
+ if (footvel.y < .8) {
footvel.y = .8;
+ }
footpoint = DoRotation(jointPos(whichfoot), 0, yaw, 0) * scale + coords;
footpoint.y = terrain.getHeight(footpoint.x, footpoint.z);
terrainlight = terrain.getLighting(footpoint.x, footpoint.z);
@@ -1875,8 +1955,9 @@ void Person::FootLand(bodypart whichfoot, float opacity)
}
} else if (isLanding() || (animTarget == jumpupanim) || isLandhard()) {
footvel = velocity / 5;
- if (footvel.y < .8)
+ if (footvel.y < .8) {
footvel.y = .8;
+ }
footpoint = DoRotation(jointPos(whichfoot), 0, yaw, 0) * scale + coords;
if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4) {
Sprite::MakeSprite(cloudsprite, footpoint, footvel * .6, 1, 1, 1, .5, .2 * opacity);
@@ -1900,7 +1981,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;
@@ -1916,67 +1997,72 @@ void Person::DoAnimations()
if (!skeleton.free) {
static float oldtarget;
- if (isIdle() && animCurrent != getIdle())
+ if (isIdle() && animCurrent != getIdle()) {
normalsupdatedelay = 0;
+ }
if (animTarget == tempanim || animCurrent == tempanim) {
Animation::animations[tempanim] = tempanimation;
}
if (animTarget == jumpupanim || animTarget == jumpdownanim || isFlip()) {
float gLoc[3];
- float vel[3];
gLoc[0] = coords.x;
gLoc[1] = coords.y;
gLoc[2] = coords.z;
- vel[0] = velocity.x;
- vel[1] = velocity.y;
- vel[2] = velocity.z;
if (id == 0) {
- OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel);
+ OPENAL_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))
+ if (((velocity.y < -15) || (crouchkeydown && velocity.y < -8)) && abs(velocity.y) * 4 > fast_sqrt(velocity.x * velocity.x * velocity.z * velocity.z)) {
landhard = 1;
- if (!crouchkeydown && velocity.y >= -15)
+ }
+ 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;
targfacing = DoRotation(targfacing, 0, targetyaw, 0);
- if (normaldotproduct(targfacing, velocity) >= -.3)
+ if (normaldotproduct(targfacing, velocity) >= -.3) {
animTarget = flipanim;
- else
+ } else {
animTarget = backflipanim;
+ }
crouchtogglekeydown = 1;
frameTarget = 0;
target = 0;
- if (id == 0)
+ if (id == 0) {
numflipped++;
+ }
}
- if (Animation::animations[animTarget].attack != reversed)
+ if (Animation::animations[animTarget].attack != reversed) {
feint = 0;
+ }
if (!crouchkeydown || (isLanding() || isLandhard()) || (wasLanding() || wasLandhard())) {
crouchtogglekeydown = 0;
- if (aitype == playercontrolled)
+ if (aitype == playercontrolled) {
feint = 0;
+ }
} else {
- if (!crouchtogglekeydown && Animation::animations[animTarget].attack == reversed && aitype == playercontrolled && (escapednum < 2 || reversaltrain))
+ if (!crouchtogglekeydown && Animation::animations[animTarget].attack == reversed && aitype == playercontrolled && (escapednum < 2 || reversaltrain)) {
feint = 1;
- if (!isFlip())
+ }
+ if (!isFlip()) {
crouchtogglekeydown = 1;
+ }
}
-
if (Animation::animations[animTarget].attack || animCurrent == getupfrombackanim || animCurrent == getupfromfrontanim) {
- if (detail)
+ if (detail) {
normalsupdatedelay = 0;
+ }
}
if (target >= 1) {
@@ -1988,21 +2074,23 @@ void Person::DoAnimations()
}
if (animTarget == rabbittacklinganim && frameTarget == 1) {
- if (victim->aitype == attacktypecutoff && victim->stunned <= 0 && victim->surprised <= 0 && victim->id != 0)
+ if (victim->aitype == attacktypecutoff && victim->stunned <= 0 && victim->surprised <= 0 && victim->id != 0) {
Reverse();
+ }
if (animTarget == rabbittacklinganim && frameTarget == 1 && !victim->isCrouch() && victim->animTarget != backhandspringanim) {
- if (normaldotproduct(victim->facing, facing) > 0)
+ if (normaldotproduct(victim->facing, facing) > 0) {
victim->animTarget = rabbittackledbackanim;
- else
+ } else {
victim->animTarget = rabbittackledfrontanim;
+ }
victim->frameTarget = 2;
victim->target = 0;
victim->yaw = yaw;
victim->targetyaw = yaw;
- if (victim->aitype == gethelptype)
+ if (victim->aitype == gethelptype) {
victim->DoDamage(victim->damagetolerance - victim->damage);
- //victim->DoDamage(30);
- if (creature == wolftype) {
+ }
+ if (PersonType::types[creature].hasClaws) {
DoBloodBig(0, 255);
emit_sound_at(clawslicesound, victim->coords);
victim->spurt = 1;
@@ -2015,10 +2103,11 @@ void Person::DoAnimations()
if (!drawtogglekeydown && drawkeydown && (weaponactive == -1 || num_weapons == 1) && (targetFrame().label || (animTarget != animCurrent && animCurrent == rollanim)) && num_weapons > 0 && creature != wolftype) {
if (weapons[weaponids[0]].getType() == knife) {
- if (weaponactive == -1)
+ if (weaponactive == -1) {
weaponactive = 0;
- else if (weaponactive == 0)
+ } else if (weaponactive == 0) {
weaponactive = -1;
+ }
if (weaponactive == -1) {
emit_sound_at(knifesheathesound, coords);
@@ -2030,47 +2119,54 @@ void Person::DoAnimations()
drawtogglekeydown = 1;
}
//Footstep sounds
- if (!Tutorial::active || id == 0)
+ if (!Tutorial::active || id == 0) {
if ((targetFrame().label && (targetFrame().label < 5 || targetFrame().label == 8))) {
int whichsound = -1;
if (onterrain) {
if (terrain.getOpacity(coords.x, coords.z) < .2) {
- if (targetFrame().label == 1)
+ if (targetFrame().label == 1) {
whichsound = footstepsound;
- else
+ } else {
whichsound = footstepsound2;
- if (targetFrame().label == 1)
+ }
+ if (targetFrame().label == 1) {
FootLand(leftfoot, 1);
- if (targetFrame().label == 2)
+ }
+ if (targetFrame().label == 2) {
FootLand(rightfoot, 1);
+ }
if (targetFrame().label == 3 && isRun()) {
FootLand(rightfoot, 1);
FootLand(leftfoot, 1);
}
-
}
if (terrain.getOpacity(coords.x, coords.z) >= .2) {
- if (targetFrame().label == 1)
+ if (targetFrame().label == 1) {
whichsound = footstepsound3;
- else
+ } else {
whichsound = footstepsound4;
+ }
}
}
if (!onterrain) {
- if (targetFrame().label == 1)
+ if (targetFrame().label == 1) {
whichsound = footstepsound3;
- else
+ } else {
whichsound = footstepsound4;
+ }
}
if (targetFrame().label == 4 && (weaponactive == -1 || (animTarget != knifeslashstartanim && animTarget != knifethrowanim && animTarget != crouchstabanim && animTarget != swordgroundstabanim && animTarget != knifefollowanim))) {
if (Animation::animations[animTarget].attack != neutral) {
unsigned r = abs(Random() % 3);
- if (r == 0)
+ if (r == 0) {
whichsound = lowwhooshsound;
- if (r == 1)
+ }
+ if (r == 1) {
whichsound = midwhooshsound;
- if (r == 2)
+ }
+ if (r == 2) {
whichsound = highwhooshsound;
+ }
}
if (Animation::animations[animTarget].attack == neutral) {
whichsound = movewhooshsound;
@@ -2101,28 +2197,18 @@ void Person::DoAnimations()
}
}
}
+ }
//Combat sounds
- if (!Tutorial::active || id == 0)
- if (speechdelay <= 0)
- if (animTarget != crouchstabanim && animTarget != swordgroundstabanim && animTarget != staffgroundsmashanim)
+ if (!Tutorial::active || id == 0) {
+ if (speechdelay <= 0) {
+ if (animTarget != crouchstabanim && animTarget != swordgroundstabanim && animTarget != staffgroundsmashanim) {
if ((targetFrame().label && (targetFrame().label < 5 || targetFrame().label == 8))) {
int whichsound = -1;
if (targetFrame().label == 4 && aitype != playercontrolled) {
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 (creature == wolftype) {
- if (r == 0) whichsound = barksound;
- if (r == 1) whichsound = bark2sound;
- if (r == 2) whichsound = bark3sound;
- if (r == 3) whichsound = barkgrowlsound;
- }
+ whichsound = PersonType::types[creature].soundsAttack[r];
speechdelay = .3;
}
}
@@ -2131,8 +2217,9 @@ void Person::DoAnimations()
emit_sound_at(whichsound, coords);
}
}
-
-
+ }
+ }
+ }
if ((!wasLanding() && !wasLandhard()) && animCurrent != getIdle() && (isLanding() || isLandhard())) {
FootLand(leftfoot, 1);
@@ -2145,9 +2232,9 @@ void Person::DoAnimations()
animCurrent = animTarget;
frameTarget++;
- if (animTarget == removeknifeanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == removeknifeanim && currentFrame().label == 5) {
for (unsigned i = 0; i < weapons.size(); i++) {
- if (weapons[i].owner == -1)
+ if (weapons[i].owner == -1) {
if (distsqflat(&coords, &weapons[i].position) < 4 && weaponactive == -1) {
if (distsq(&coords, &weapons[i].position) >= 1) {
if (weapons[i].getType() != staff) {
@@ -2157,27 +2244,33 @@ void Person::DoAnimations()
takeWeapon(i);
}
}
+ }
}
}
- if (animTarget == crouchremoveknifeanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == crouchremoveknifeanim && currentFrame().label == 5) {
for (unsigned i = 0; i < weapons.size(); i++) {
bool willwork = true;
- if (weapons[i].owner != -1)
- if (Person::players[weapons[i].owner]->weaponstuck != -1)
- if (Person::players[weapons[i].owner]->weaponids[Person::players[weapons[i].owner]->weaponstuck] == int(i))
- if (Person::players[weapons[i].owner]->num_weapons > 1)
+ if (weapons[i].owner != -1) {
+ if (Person::players[weapons[i].owner]->weaponstuck != -1) {
+ if (Person::players[weapons[i].owner]->weaponids[Person::players[weapons[i].owner]->weaponstuck] == int(i)) {
+ if (Person::players[weapons[i].owner]->num_weapons > 1) {
willwork = 0;
- if ((weapons[i].owner == -1) || (hasvictim && (weapons[i].owner == int(victim->id)) && victim->skeleton.free))
+ }
+ }
+ }
+ }
+ if ((weapons[i].owner == -1) || (hasvictim && (weapons[i].owner == int(victim->id)) && victim->skeleton.free)) {
if (willwork && distsqflat(&coords, &weapons[i].position) < 3 && weaponactive == -1) {
if (distsq(&coords, &weapons[i].position) < 1 || hasvictim) {
bool fleshstuck = false;
- if (weapons[i].owner != -1)
+ if (weapons[i].owner != -1) {
if (victim->weaponstuck != -1) {
if (victim->weaponids[victim->weaponstuck] == int(i)) {
fleshstuck = true;
}
}
+ }
if (fleshstuck) {
emit_sound_at(fleshstabremovesound, coords, 128.);
} else {
@@ -2187,10 +2280,11 @@ void Person::DoAnimations()
}
if (weapons[i].owner != -1) {
victim = Person::players[weapons[i].owner];
- if (victim->num_weapons == 1)
+ if (victim->num_weapons == 1) {
victim->num_weapons = 0;
- else
+ } else {
victim->num_weapons = 1;
+ }
//victim->weaponactive=-1;
victim->skeleton.longdead = 0;
@@ -2211,18 +2305,21 @@ void Person::DoAnimations()
footpoint = weapons[i].position;
if (victim->weaponstuck != -1) {
if (victim->weaponids[victim->weaponstuck] == int(i)) {
- if (bloodtoggle)
+ if (bloodtoggle) {
Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .8, .3);
+ }
weapons[i].bloody = 2;
weapons[i].blooddrip = 5;
victim->weaponstuck = -1;
}
}
if (victim->num_weapons > 0) {
- if (victim->weaponstuck != 0 && victim->weaponstuck != -1)
+ if (victim->weaponstuck != 0 && victim->weaponstuck != -1) {
victim->weaponstuck = 0;
- if (victim->weaponids[0] == int(i))
+ }
+ if (victim->weaponids[0] == int(i)) {
victim->weaponids[0] = victim->weaponids[victim->num_weapons];
+ }
}
victim->jointVel(abdomen) += relative * 6;
@@ -2233,13 +2330,14 @@ void Person::DoAnimations()
takeWeapon(i);
}
}
+ }
}
}
- if (animCurrent == drawleftanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
- if (weaponactive == -1)
+ if (animCurrent == drawleftanim && currentFrame().label == 5) {
+ if (weaponactive == -1) {
weaponactive = 0;
- else if (weaponactive == 0) {
+ } else if (weaponactive == 0) {
weaponactive = -1;
if (num_weapons == 2) {
int buffer;
@@ -2256,30 +2354,36 @@ void Person::DoAnimations()
}
}
-
if ((animCurrent == walljumprightkickanim && animTarget == walljumprightkickanim) || (animCurrent == walljumpleftkickanim && animTarget == walljumpleftkickanim)) {
XYZ rotatetarget = DoRotation(skeleton.forward, 0, yaw, 0);
Normalise(&rotatetarget);
targetyaw = -asin(0 - rotatetarget.x);
targetyaw *= 360 / 6.28;
- if (rotatetarget.z < 0)
+ if (rotatetarget.z < 0) {
targetyaw = 180 - targetyaw;
+ }
- if (animTarget == walljumprightkickanim)
+ if (animTarget == walljumprightkickanim) {
targetyaw += 40;
- if (animTarget == walljumpleftkickanim)
+ }
+ if (animTarget == walljumpleftkickanim) {
targetyaw -= 40;
+ }
}
bool dojumpattack;
dojumpattack = 0;
- if ((animTarget == rabbitrunninganim || animTarget == wolfrunninganim) && frameTarget == 3 && (jumpkeydown || attackkeydown || id != 0))
+ 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 (hasvictim) {
+ 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)
+ }
+ }
+ if (!hostile) {
dojumpattack = 0;
+ }
if (dojumpattack) {
if ((animTarget == rabbitrunninganim || animTarget == wolfrunninganim) && id == 0) {
animTarget = rabbittackleanim;
@@ -2296,13 +2400,14 @@ void Person::DoAnimations()
Normalise(&targetloc);
targetloc += coords;
for (unsigned i = 0; i < Person::players.size(); i++) {
- if (i != id)
+ if (i != id) {
if (distsq(&targetloc, &Person::players[i]->coords) < closestdist || closestdist == 0) {
closestdist = distsq(&targetloc, &Person::players[i]->coords);
closestid = i;
}
+ }
}
- if (closestid != -1)
+ if (closestid != -1) {
if (closestdist < 5 && !Person::players[closestid]->dead && Animation::animations[Person::players[closestid]->animTarget].height != lowheight && Person::players[closestid]->animTarget != backhandspringanim) {
hasvictim = 1;
victim = Person::players[closestid];
@@ -2317,38 +2422,40 @@ void Person::DoAnimations()
Normalise(&rotatetarget);
targetyaw = -asin(0 - rotatetarget.x);
targetyaw *= 360 / 6.28;
- if (rotatetarget.z < 0)
+ if (rotatetarget.z < 0) {
targetyaw = 180 - targetyaw;
+ }
}
if (animTarget != rabbitrunninganim) {
emit_sound_at(jumpsound, coords, 128.);
}
}
+ }
}
//Move impacts
- float damagemult = 1 * power;
- if (creature == wolftype)
- damagemult = 2.5 * power;
+ float damagemult = PersonType::types[creature].power * power;
if (hasvictim) {
damagemult /= victim->damagetolerance / 200;
}
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 (animCurrent == spinkickanim && currentFrame().label == 5) {
+ if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
- if (Random() % 2 || creature == wolftype) {
+ }
+ if (Random() % 2 || PersonType::types[creature].hasClaws) {
victim->spurt = 1;
DoBlood(.2, 250);
- if (creature == wolftype)
+ if (PersonType::types[creature].hasClaws) {
DoBloodBig(0, 250);
+ }
}
if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 128.);
}
- if (creature == wolftype) {
+ if (PersonType::types[creature].hasClaws) {
emit_sound_at(clawslicesound, victim->coords, 128.);
victim->spurt = 1;
victim->DoBloodBig(2 / victim->armorhead, 175);
@@ -2370,18 +2477,20 @@ 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 (animCurrent == wolfslapanim && currentFrame().label == 5) {
+ if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
- if (Random() % 2 || creature == wolftype) {
+ }
+ if (Random() % 2 || PersonType::types[creature].hasClaws) {
victim->spurt = 1;
- if (creature == wolftype)
+ if (PersonType::types[creature].hasClaws) {
DoBloodBig(0, 235);
+ }
}
emit_sound_at(whooshhitsound, victim->coords);
- if (creature == wolftype) {
+ if (PersonType::types[creature].hasClaws) {
emit_sound_at(clawslicesound, victim->coords, 128.);
victim->spurt = 1;
victim->DoBloodBig(2, 175);
@@ -2403,17 +2512,18 @@ void Person::DoAnimations()
}
}
- if (animTarget == walljumprightkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == walljumprightkickanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
victim->spurt = 1;
DoBlood(.2, 250);
if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 160.);
}
- if (creature == wolftype) {
+ if (PersonType::types[creature].hasClaws) {
emit_sound_at(clawslicesound, victim->coords, 128.);
victim->spurt = 1;
victim->DoBloodBig(2 / victim->armorhead, 175);
@@ -2431,24 +2541,26 @@ void Person::DoAnimations()
victim->Puff(head);
victim->DoDamage(damagemult * 150 / victim->protectionhead);
- if (victim->damage > victim->damagetolerance)
+ if (victim->damage > victim->damagetolerance) {
award_bonus(id, style);
- else
+ } else {
SolidHitBonus(id);
+ }
}
}
- if (animTarget == walljumpleftkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == walljumpleftkickanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
victim->spurt = 1;
DoBlood(.2, 250);
if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 160.);
}
- if (creature == wolftype) {
+ if (PersonType::types[creature].hasClaws) {
emit_sound_at(clawslicesound, victim->coords, 128.);
victim->spurt = 1;
victim->DoBloodBig(2 / victim->armorhead, 175);
@@ -2466,18 +2578,20 @@ void Person::DoAnimations()
victim->Puff(head);
victim->DoDamage(damagemult * 150 / victim->protectionhead);
- if (victim->damage > victim->damagetolerance)
+ if (victim->damage > victim->damagetolerance) {
award_bonus(id, style);
- else
+ } else {
SolidHitBonus(id);
+ }
}
}
- if (animTarget == blockhighleftstrikeanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == blockhighleftstrikeanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
if (Random() % 2) {
victim->spurt = 1;
DoBlood(.2, 235);
@@ -2497,11 +2611,12 @@ void Person::DoAnimations()
}
}
- if (animTarget == killanim && Animation::animations[animTarget].frames[frameCurrent].label == 8) {
+ if (animCurrent == killanim && currentFrame().label == 8) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && victim->dead) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .2;
+ }
emit_sound_at(whooshhitsound, victim->coords, 128.);
victim->skeleton.longdead = 0;
@@ -2531,11 +2646,12 @@ void Person::DoAnimations()
}
}
- if (animTarget == killanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == killanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 9 && victim->dead) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, coords, 128.);
}
@@ -2556,11 +2672,12 @@ void Person::DoAnimations()
}
}
- if (animTarget == dropkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) {
+ if (animCurrent == dropkickanim && currentFrame().label == 7) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 9 && victim->skeleton.free) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
if (!Tutorial::active) {
emit_sound_at(thudsound, coords);
}
@@ -2583,25 +2700,27 @@ void Person::DoAnimations()
for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 20;
}
- if (!victim->dead)
+ if (!victim->dead) {
SolidHitBonus(id);
+ }
victim->Puff(abdomen);
victim->DoDamage(damagemult * 20 / victim->protectionhigh);
victim->jointVel(abdomen) += relative * damagemult * 200;
staggerdelay = .5;
- if (!victim->dead)
+ if (!victim->dead) {
staggerdelay = 1.2;
-
-
+ }
}
}
- if ((animTarget == crouchstabanim || animTarget == swordgroundstabanim) && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if ((animCurrent == crouchstabanim || animCurrent == swordgroundstabanim) && currentFrame().label == 5) {
- if (hasvictim)
- if (!victim->skeleton.free)
+ if (hasvictim) {
+ if (!victim->skeleton.free) {
hasvictim = 0;
+ }
+ }
if (!hasvictim) {
terrain.MakeDecal(blooddecalfast, (weapons[weaponids[weaponactive]].tippoint * .8 + weapons[weaponids[weaponactive]].position * .2), .08, .6, Random() % 360);
@@ -2617,8 +2736,9 @@ void Person::DoAnimations()
if (weapons[weaponids[weaponactive]].getType() == knife) {
where = (weapons[weaponids[weaponactive]].tippoint * .6 + weapons[weaponids[weaponactive]].position * .4);
where -= victim->coords;
- if (!victim->skeleton.free)
+ if (!victim->skeleton.free) {
where = DoRotation(where, 0, -victim->yaw, 0);
+ }
//where=scale;
startpoint = where;
startpoint.y += 100;
@@ -2628,25 +2748,29 @@ void Person::DoAnimations()
if (weapons[weaponids[weaponactive]].getType() == sword) {
where = weapons[weaponids[weaponactive]].position;
where -= victim->coords;
- if (!victim->skeleton.free)
+ if (!victim->skeleton.free) {
where = DoRotation(where, 0, -victim->yaw, 0);
+ }
startpoint = where;
where = weapons[weaponids[weaponactive]].tippoint;
where -= victim->coords;
- if (!victim->skeleton.free)
+ if (!victim->skeleton.free) {
where = DoRotation(where, 0, -victim->yaw, 0);
+ }
endpoint = where;
}
if (weapons[weaponids[weaponactive]].getType() == staff) {
where = weapons[weaponids[weaponactive]].position;
where -= victim->coords;
- if (!victim->skeleton.free)
+ if (!victim->skeleton.free) {
where = DoRotation(where, 0, -victim->yaw, 0);
+ }
startpoint = where;
where = weapons[weaponids[weaponactive]].tippoint;
where -= victim->coords;
- if (!victim->skeleton.free)
+ if (!victim->skeleton.free) {
where = DoRotation(where, 0, -victim->yaw, 0);
+ }
endpoint = where;
}
movepoint = 0;
@@ -2656,11 +2780,13 @@ void Person::DoAnimations()
if (whichtri != -1) {
if (victim->dead != 2) {
victim->DoDamage(abs((victim->damagetolerance - victim->permanentdamage) * 2));
- if (!victim->dead)
+ if (!victim->dead) {
award_bonus(id, FinishedBonus);
+ }
}
- if (bloodtoggle)
+ if (bloodtoggle) {
weapons[weaponids[weaponactive]].bloody = 2;
+ }
victim->skeleton.longdead = 0;
victim->skeleton.free = 1;
@@ -2672,7 +2798,6 @@ void Person::DoAnimations()
//victim->skeleton.joints[i].velocity=0;
}
emit_sound_at(fleshstabsound, coords, 128);
-
}
if (whichtri != -1 || weapons[weaponids[weaponactive]].bloody) {
weapons[weaponids[weaponactive]].blooddrip += 5;
@@ -2686,7 +2811,7 @@ void Person::DoAnimations()
}
}
- if ((animTarget == crouchstabanim || animTarget == swordgroundstabanim) && Animation::animations[animTarget].frames[frameCurrent].label == 6) {
+ if ((animCurrent == crouchstabanim || animCurrent == swordgroundstabanim) && currentFrame().label == 6) {
if (!hasvictim) {
emit_sound_at(knifedrawsound, coords, 128);
}
@@ -2706,13 +2831,15 @@ void Person::DoAnimations()
where = weapons[weaponids[weaponactive]].position;
where -= victim->coords;
- if (!victim->skeleton.free)
+ if (!victim->skeleton.free) {
where = DoRotation(where, 0, -victim->yaw, 0);
+ }
startpoint = where;
where = weapons[weaponids[weaponactive]].tippoint;
where -= victim->coords;
- if (!victim->skeleton.free)
+ if (!victim->skeleton.free) {
where = DoRotation(where, 0, -victim->yaw, 0);
+ }
endpoint = where;
movepoint = 0;
@@ -2731,13 +2858,15 @@ void Person::DoAnimations()
where = weapons[weaponids[weaponactive]].position;
where -= victim->coords;
- if (!victim->skeleton.free)
+ if (!victim->skeleton.free) {
where = DoRotation(where, 0, -victim->yaw, 0);
+ }
startpoint = where;
where = weapons[weaponids[weaponactive]].tippoint;
where -= victim->coords;
- if (!victim->skeleton.free)
+ if (!victim->skeleton.free) {
where = DoRotation(where, 0, -victim->yaw, 0);
+ }
endpoint = where;
movepoint = 0;
@@ -2767,8 +2896,9 @@ void Person::DoAnimations()
relative.y = 10;
Normalise(&relative);
//victim->Puff(abdomen);
- if (bloodtoggle)
+ if (bloodtoggle) {
Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .8, .3);
+ }
if (victim->bloodloss < victim->damagetolerance) {
victim->bloodloss += 1000;
@@ -2785,11 +2915,12 @@ void Person::DoAnimations()
}
}
- if (animTarget == upunchanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == upunchanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
if (Random() % 2) {
victim->spurt = 1;
DoBlood(.2, 235);
@@ -2822,12 +2953,12 @@ void Person::DoAnimations()
}
}
-
- if (animTarget == winduppunchanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == winduppunchanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 2) {
escapednum = 0;
- if (id == 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 (!Tutorial::active) {
emit_sound_at(thudsound, victim->coords);
@@ -2842,8 +2973,9 @@ void Person::DoAnimations()
}
}
- if (victim->damage > victim->damagetolerance - 60 || normaldotproduct(victim->facing, victim->coords - coords) > 0 || Animation::animations[victim->animTarget].height == lowheight)
+ if (victim->damage > victim->damagetolerance - 60 || normaldotproduct(victim->facing, victim->coords - coords) > 0 || Animation::animations[victim->animTarget].height == lowheight) {
victim->RagDoll(0);
+ }
XYZ relative;
relative = victim->coords - coords;
relative.y = 0;
@@ -2868,27 +3000,31 @@ void Person::DoAnimations()
}
}
- if (animTarget == blockhighleftanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == blockhighleftanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 4) {
- if (victim->id == 0)
+ if (victim->id == 0) {
camerashake += .4;
+ }
emit_sound_at(landsound2, victim->coords);
Puff(righthand);
}
}
- if (animTarget == swordslashparryanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == swordslashparryanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 4) {
- if (victim->id == 0)
+ if (victim->id == 0) {
camerashake += .4;
+ }
if (weaponactive != -1) {
if (weapons[victim->weaponids[0]].getType() == staff || weapons[weaponids[0]].getType() == staff) {
- if (weapons[victim->weaponids[0]].getType() == staff)
+ if (weapons[victim->weaponids[0]].getType() == staff) {
weapons[victim->weaponids[0]].damage += .2 + float(abs(Random() % 100) - 50) / 250;
- if (weapons[weaponids[0]].getType() == staff)
+ }
+ if (weapons[weaponids[0]].getType() == staff) {
weapons[weaponids[0]].damage += .2 + float(abs(Random() % 100) - 50) / 250;
+ }
emit_sound_at(swordstaffsound, victim->coords);
} else {
@@ -2900,7 +3036,7 @@ void Person::DoAnimations()
}
}
- if (animTarget == knifethrowanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == knifethrowanim && currentFrame().label == 5) {
if (weaponactive != -1) {
escapednum = 0;
XYZ aim;
@@ -2915,12 +3051,13 @@ 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 (animCurrent == knifeslashstartanim && currentFrame().label == 5) {
+ if (hasvictim) {
+ if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 4.5 && victim->animTarget != dodgebackanim && victim->animTarget != rollanim) {
escapednum = 0;
- if (!Tutorial::active)
+ if (!Tutorial::active) {
victim->DoBloodBig(1.5 / victim->armorhigh, 225);
+ }
award_bonus(id, Slicebonus);
if (!Tutorial::active) {
@@ -2937,14 +3074,16 @@ void Person::DoAnimations()
}
victim->lowreversaldelay = 0;
victim->highreversaldelay = 0;
- if (aitype != playercontrolled)
+ if (aitype != playercontrolled) {
weaponmissdelay = .6;
+ }
- if (!Tutorial::active)
- if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody)
+ if (!Tutorial::active) {
+ if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody) {
weapons[weaponids[weaponactive]].bloody = 1;
- if (!Tutorial::active)
+ }
weapons[weaponids[weaponactive]].blooddrip += 3;
+ }
XYZ footvel, footpoint;
footvel = 0;
@@ -2953,52 +3092,47 @@ void Person::DoAnimations()
} else {
footpoint = DoRotation((victim->jointPos(abdomen) + victim->jointPos(neck)) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords;
}
- if (!Tutorial::active) {
- 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 (Tutorial::active) {
- Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .6, .3);
- }
victim->DoDamage(damagemult * 0);
}
+ }
}
- if (animTarget == swordslashanim && Animation::animations[animTarget].frames[frameCurrent].label == 5 && victim->animTarget != rollanim) {
+ if (animCurrent == swordslashanim && currentFrame().label == 5 && victim->animTarget != rollanim) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim) {
if (victim->weaponactive == -1 || normaldotproduct(victim->facing, victim->coords - coords) > 0 || (Random() % 2 == 0)) {
award_bonus(id, Slashbonus);
escapednum = 0;
if (!Tutorial::active) {
- if (normaldotproduct(victim->facing, victim->coords - coords) < 0)
+ if (normaldotproduct(victim->facing, victim->coords - coords) < 0) {
victim->DoBloodBig(2 / victim->armorhigh, 190);
- else
+ } else {
victim->DoBloodBig(2 / victim->armorhigh, 185);
+ }
victim->deathbleeding = 1;
emit_sound_at(swordslicesound, victim->coords);
- }
- //victim->jointVel(abdomen)+=relative*damagemult*200;
- if (!Tutorial::active) {
victim->frameTarget = 0;
victim->animTarget = staggerbackhardanim;
victim->targetyaw = targetyaw + 180;
victim->target = 0;
- }
-
- if (!Tutorial::active) {
- 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;
@@ -3008,8 +3142,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);
@@ -3020,10 +3155,12 @@ void Person::DoAnimations()
} else {
if (victim->weaponactive != -1) {
if (weapons[victim->weaponids[0]].getType() == staff || weapons[weaponids[0]].getType() == staff) {
- if (weapons[victim->weaponids[0]].getType() == staff)
+ if (weapons[victim->weaponids[0]].getType() == staff) {
weapons[victim->weaponids[0]].damage += .2 + float(abs(Random() % 100) - 50) / 250;
- if (weapons[weaponids[0]].getType() == staff)
+ }
+ if (weapons[weaponids[0]].getType() == staff) {
weapons[weaponids[0]].damage += .2 + float(abs(Random() % 100) - 50) / 250;
+ }
emit_sound_at(swordstaffsound, victim->coords);
} else {
@@ -3031,7 +3168,6 @@ void Person::DoAnimations()
}
}
-
XYZ aim;
victim->Puff(righthand);
victim->target = 0;
@@ -3045,26 +3181,27 @@ void Person::DoAnimations()
victim->num_weapons--;
if (victim->num_weapons) {
victim->weaponids[0] = victim->weaponids[num_weapons];
- if (victim->weaponstuck == victim->num_weapons)
+ if (victim->weaponstuck == victim->num_weapons) {
victim->weaponstuck = 0;
+ }
}
victim->weaponactive = -1;
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 (animCurrent == staffhitanim && currentFrame().label == 5 && victim->animTarget != rollanim) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim && victim->animTarget != sweepanim) {
if (!Tutorial::active) {
weapons[weaponids[0]].damage += .4 + float(abs(Random() % 100) - 50) / 250;
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
- if (Random() % 2 || creature == wolftype) {
+ }
+ if (Random() % 2 || PersonType::types[creature].hasClaws) {
victim->spurt = 1;
}
emit_sound_at(staffheadsound, victim->coords);
@@ -3091,14 +3228,15 @@ void Person::DoAnimations()
}
}
- if (animTarget == staffspinhitanim && Animation::animations[animTarget].frames[frameCurrent].label == 5 && victim->animTarget != rollanim) {
+ if (animCurrent == staffspinhitanim && currentFrame().label == 5 && victim->animTarget != rollanim) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim && victim->animTarget != sweepanim) {
if (!Tutorial::active) {
weapons[weaponids[0]].damage += .6 + float(abs(Random() % 100) - 50) / 250;
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
- if (Random() % 2 || creature == wolftype) {
+ }
+ if (Random() % 2 || PersonType::types[creature].hasClaws) {
victim->spurt = 1;
}
emit_sound_at(staffheadsound, victim->coords);
@@ -3123,15 +3261,17 @@ void Person::DoAnimations()
}
}
- if (animTarget == staffgroundsmashanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == staffgroundsmashanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5) {
escapednum = 0;
if (!Tutorial::active) {
- if (!victim->dead)
+ if (!victim->dead) {
weapons[weaponids[0]].damage += .4 + float(abs(Random() % 100) - 50) / 500;
- if (id == 0)
+ }
+ if (id == 0) {
camerashake += .4;
- if (Random() % 2 || creature == wolftype) {
+ }
+ if (Random() % 2 || PersonType::types[creature].hasClaws) {
victim->spurt = 1;
}
emit_sound_at(staffbodysound, victim->coords);
@@ -3173,11 +3313,12 @@ void Person::DoAnimations()
}
}
- if (animTarget == lowkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == lowkickanim && currentFrame().label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != highheight) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
XYZ relative;
relative = victim->coords - coords;
relative.y = 0;
@@ -3200,16 +3341,18 @@ void Person::DoAnimations()
}
victim->Puff(head);
victim->DoDamage(damagemult * 100 / victim->protectionhead);
- if (victim->howactive == typesleeping)
+ if (victim->howactive == typesleeping) {
victim->DoDamage(damagemult * 150 / victim->protectionhead);
- if (creature == wolftype) {
+ }
+ if (PersonType::types[creature].hasClaws) {
emit_sound_at(clawslicesound, victim->coords, 128.);
victim->spurt = 1;
victim->DoBloodBig(2 / victim->armorhead, 175);
}
} else {
- if (victim->damage >= victim->damagetolerance)
+ if (victim->damage >= victim->damagetolerance) {
victim->RagDoll(0);
+ }
for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 10;
}
@@ -3223,23 +3366,23 @@ void Person::DoAnimations()
}
victim->Puff(abdomen);
victim->DoDamage(damagemult * 30 / victim->protectionhigh);
- if (creature == wolftype) {
+ if (PersonType::types[creature].hasClaws) {
emit_sound_at(clawslicesound, victim->coords, 128.);
victim->spurt = 1;
victim->DoBloodBig(2 / victim->armorhigh, 170);
}
}
-
}
}
- if (animTarget == sweepanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == sweepanim && currentFrame().label == 5) {
if ((victim->animTarget != jumpupanim) &&
(distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3) &&
(victim != this->shared_from_this())) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .2;
+ }
if (!Tutorial::active) {
emit_sound_at(landsound2, victim->coords, 128.);
}
@@ -3257,22 +3400,25 @@ void Person::DoAnimations()
relative = DoRotation(relative, 0, -90, 0);
relative.y += .1;
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)
+ if (victim->skeleton.joints[i].label == leftfoot || victim->skeleton.joints[i].label == rightfoot || victim->skeleton.joints[i].label == leftankle || victim->skeleton.joints[i].label == rightankle) {
victim->skeleton.joints[i].velocity = relative * 80;
+ }
}
victim->Puff(rightankle);
victim->Puff(leftankle);
victim->DoDamage(damagemult * 40 / victim->protectionlow);
} else {
- if (victim->damage >= victim->damagetolerance)
+ if (victim->damage >= victim->damagetolerance) {
victim->RagDoll(0);
+ }
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 (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)
+ if (victim->skeleton.joints[i].label == leftfoot || victim->skeleton.joints[i].label == rightfoot || victim->skeleton.joints[i].label == leftankle || victim->skeleton.joints[i].label == rightankle) {
victim->skeleton.joints[i].velocity += relative * damagemult * 80;
+ }
}
victim->jointVel(abdomen) += relative * damagemult * 200;
victim->frameTarget = 0;
@@ -3287,15 +3433,15 @@ void Person::DoAnimations()
}
SolidHitBonus(id);
-
}
}
}
if (Animation::animations[animTarget].attack == reversal && (!victim->feint || (victim->lastattack == victim->lastattack2 && victim->lastattack2 == victim->lastattack3 && Random() % 2) || animTarget == knifefollowanim)) {
- if (animTarget == spinkickreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) {
+ if (animCurrent == spinkickreversalanim && currentFrame().label == 7) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
if (Random() % 2) {
victim->spurt = 1;
DoBlood(.2, 230);
@@ -3303,7 +3449,7 @@ void Person::DoAnimations()
if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 128.);
}
- if (creature == wolftype) {
+ if (PersonType::types[creature].hasClaws) {
emit_sound_at(clawslicesound, victim->coords, 128);
victim->spurt = 1;
victim->DoBloodBig(2 / victim->armorhigh, 170);
@@ -3336,10 +3482,11 @@ void Person::DoAnimations()
}
}
- if (animTarget == staffhitreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (animCurrent == staffhitreversalanim && currentFrame().label == 5) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
if (Random() % 2) {
victim->spurt = 1;
DoBlood(.2, 230);
@@ -3358,10 +3505,11 @@ void Person::DoAnimations()
victim->DoDamage(damagemult * 70 / victim->protectionhigh);
}
- if (animTarget == staffspinhitreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) {
+ if (animCurrent == staffspinhitreversalanim && currentFrame().label == 7) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
if (Random() % 2) {
victim->spurt = 1;
DoBlood(.2, 230);
@@ -3387,7 +3535,7 @@ void Person::DoAnimations()
victim->DoDamage(damagemult * 70 / victim->protectionhigh);
}
- if (animTarget == upunchreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) {
+ if (animCurrent == upunchreversalanim && currentFrame().label == 7) {
escapednum = 0;
victim->RagDoll(1);
XYZ relative;
@@ -3413,31 +3561,28 @@ void Person::DoAnimations()
award_bonus(id, Reversal);
bool doslice;
- doslice = 0;
- if (weaponactive != -1 || creature == wolftype)
- doslice = 1;
- if (creature == rabbittype && weaponactive != -1)
- if (weapons[weaponids[0]].getType() == staff)
- doslice = 0;
+ if (weaponactive == -1) {
+ doslice = PersonType::types[creature].hasClaws;
+ } else {
+ doslice = (weapons[weaponids[0]].getType() != staff);
+ }
if (doslice) {
- if (weaponactive != -1) {
+ if (weaponactive == -1) {
+ emit_sound_at(clawslicesound, victim->coords, 128.);
+ victim->spurt = 1;
+ victim->DoBloodBig(2 / victim->armorhigh, 175);
+ } else {
victim->DoBloodBig(2 / victim->armorhigh, 225);
emit_sound_at(knifeslicesound, victim->coords);
- if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody)
+ if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody) {
weapons[weaponids[weaponactive]].bloody = 1;
+ }
weapons[weaponids[weaponactive]].blooddrip += 3;
}
- if (weaponactive == -1 && creature == wolftype) {
- emit_sound_at(clawslicesound, victim->coords, 128.);
- victim->spurt = 1;
- victim->DoBloodBig(2 / victim->armorhigh, 175);
- }
}
}
-
-
- if (animTarget == swordslashreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) {
+ if (animCurrent == swordslashreversalanim && currentFrame().label == 7) {
escapednum = 0;
victim->RagDoll(1);
XYZ relative;
@@ -3460,10 +3605,11 @@ void Person::DoAnimations()
award_bonus(id, swordreversebonus);
}
- if (hasvictim && animTarget == knifeslashreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) {
+ if (hasvictim && animCurrent == knifeslashreversalanim && currentFrame().label == 7) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
if (Random() % 2) {
victim->spurt = 1;
DoBlood(.2, 230);
@@ -3487,7 +3633,7 @@ void Person::DoAnimations()
award_bonus(id, Reversal);
}
- if (hasvictim && animTarget == sneakattackanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) {
+ if (hasvictim && animCurrent == sneakattackanim && currentFrame().label == 7) {
escapednum = 0;
victim->RagDoll(0);
victim->skeleton.spinny = 0;
@@ -3495,49 +3641,50 @@ void Person::DoAnimations()
relative = facing * -1;
relative.y = -3;
Normalise(&relative);
- if (victim->id == 0)
+ if (victim->id == 0) {
relative /= 30;
+ }
for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->damage = victim->damagetolerance;
victim->permanentdamage = victim->damagetolerance - 1;
bool doslice;
- doslice = 0;
- if (weaponactive != -1 || creature == wolftype)
- doslice = 1;
- if (creature == rabbittype && weaponactive != -1)
- if (weapons[weaponids[0]].getType() == staff)
- doslice = 0;
+ if (weaponactive == -1) {
+ doslice = PersonType::types[creature].hasClaws;
+ } else {
+ doslice = (weapons[weaponids[0]].getType() != staff);
+ }
if (doslice) {
- if (weaponactive != -1) {
+ if (weaponactive == -1) {
+ emit_sound_at(clawslicesound, victim->coords, 128.);
+ victim->spurt = 1;
+ victim->DoBloodBig(2, 175);
+ } else {
victim->DoBloodBig(200, 225);
emit_sound_at(knifeslicesound, victim->coords);
- if (bloodtoggle)
+ if (bloodtoggle) {
weapons[weaponids[weaponactive]].bloody = 2;
+ }
weapons[weaponids[weaponactive]].blooddrip += 5;
}
-
- if (creature == wolftype && weaponactive == -1) {
- emit_sound_at(clawslicesound, victim->coords, 128.);
- victim->spurt = 1;
- victim->DoBloodBig(2, 175);
- }
}
award_bonus(id, spinecrusher);
}
- if (hasvictim && (animTarget == knifefollowanim || animTarget == knifesneakattackanim) && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (hasvictim && (animCurrent == knifefollowanim || animCurrent == knifesneakattackanim) && currentFrame().label == 5) {
if (weaponactive != -1 && victim->bloodloss < victim->damagetolerance) {
escapednum = 0;
- if (animTarget == knifefollowanim)
+ if (animTarget == knifefollowanim) {
victim->DoBloodBig(200, 210);
+ }
if (animTarget == knifesneakattackanim) {
XYZ footvel, footpoint;
footvel = 0;
footpoint = weapons[weaponids[0]].tippoint;
- if (bloodtoggle)
+ if (bloodtoggle) {
Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .9, .3);
+ }
footvel = (weapons[weaponids[0]].tippoint - weapons[weaponids[0]].position);
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);
@@ -3551,25 +3698,26 @@ void Person::DoAnimations()
XYZ footvel, footpoint;
footvel = 0;
footpoint = weapons[weaponids[0]].tippoint;
- if (bloodtoggle)
+ if (bloodtoggle) {
Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .9, .3);
+ }
footvel = (weapons[weaponids[0]].tippoint - weapons[weaponids[0]].position) * -1;
Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 7, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9);
Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 3, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9);
Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * 5, 1, 1, 1, .2, 1);
Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * 2, 1, 1, 1, .2, 1);
-
}
victim->bloodloss += 10000;
victim->velocity = 0;
emit_sound_at(fleshstabsound, victim->coords);
- if (bloodtoggle)
+ if (bloodtoggle) {
weapons[weaponids[weaponactive]].bloody = 2;
+ }
weapons[weaponids[weaponactive]].blooddrip += 5;
}
}
- if (hasvictim && (animTarget == knifefollowanim || animTarget == knifesneakattackanim) && Animation::animations[animTarget].frames[frameCurrent].label == 6) {
+ if (hasvictim && (animCurrent == knifefollowanim || animCurrent == knifesneakattackanim) && currentFrame().label == 6) {
escapednum = 0;
victim->velocity = 0;
for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
@@ -3583,15 +3731,17 @@ void Person::DoAnimations()
}
if (weaponactive != -1 && Animation::animations[victim->animTarget].attack != reversal) {
emit_sound_at(fleshstabremovesound, victim->coords);
- if (bloodtoggle)
+ if (bloodtoggle) {
weapons[weaponids[weaponactive]].bloody = 2;
+ }
weapons[weaponids[weaponactive]].blooddrip += 5;
XYZ footvel, footpoint;
footvel = 0;
footpoint = weapons[weaponids[0]].tippoint;
- if (bloodtoggle)
+ if (bloodtoggle) {
Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .9, .3);
+ }
footvel = (weapons[weaponids[0]].tippoint - weapons[weaponids[0]].position) * -1;
Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 7, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9);
Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 3, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9);
@@ -3600,7 +3750,7 @@ void Person::DoAnimations()
}
}
- if (hasvictim && (animTarget == swordsneakattackanim) && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
+ if (hasvictim && (animCurrent == swordsneakattackanim) && currentFrame().label == 5) {
if (weaponactive != -1 && victim->bloodloss < victim->damagetolerance) {
award_bonus(id, backstab);
@@ -3609,8 +3759,9 @@ void Person::DoAnimations()
XYZ footvel, footpoint;
footvel = 0;
footpoint = (weapons[weaponids[0]].tippoint + weapons[weaponids[0]].position) / 2;
- if (bloodtoggle)
+ if (bloodtoggle) {
Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .9, .3);
+ }
footvel = (weapons[weaponids[0]].tippoint - weapons[weaponids[0]].position);
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);
@@ -3621,13 +3772,14 @@ void Person::DoAnimations()
victim->bloodloss += 10000;
victim->velocity = 0;
emit_sound_at(fleshstabsound, victim->coords);
- if (bloodtoggle)
+ if (bloodtoggle) {
weapons[weaponids[weaponactive]].bloody = 2;
+ }
weapons[weaponids[weaponactive]].blooddrip += 5;
}
}
- if (hasvictim && animTarget == swordsneakattackanim && Animation::animations[animTarget].frames[frameCurrent].label == 6) {
+ if (hasvictim && animCurrent == swordsneakattackanim && currentFrame().label == 6) {
escapednum = 0;
victim->velocity = 0;
for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
@@ -3635,15 +3787,17 @@ void Person::DoAnimations()
}
if (weaponactive != -1) {
emit_sound_at(fleshstabremovesound, victim->coords);
- if (bloodtoggle)
+ if (bloodtoggle) {
weapons[weaponids[weaponactive]].bloody = 2;
+ }
weapons[weaponids[weaponactive]].blooddrip += 5;
XYZ footvel, footpoint;
footvel = 0;
footpoint = weapons[weaponids[0]].tippoint;
- if (bloodtoggle)
+ if (bloodtoggle) {
Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .9, .3);
+ }
footvel = (weapons[weaponids[0]].tippoint - weapons[weaponids[0]].position) * -1;
Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 7, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9);
Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 3, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9);
@@ -3652,10 +3806,11 @@ void Person::DoAnimations()
}
}
- if (animTarget == sweepreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) {
+ if (animCurrent == sweepreversalanim && currentFrame().label == 7) {
escapednum = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
if (Random() % 2) {
victim->spurt = 1;
DoBlood(.2, 240);
@@ -3666,25 +3821,24 @@ void Person::DoAnimations()
}
}
bool doslice;
- doslice = 0;
- if (weaponactive != -1 || creature == wolftype)
- doslice = 1;
- if (creature == rabbittype && weaponactive != -1)
- if (weapons[weaponids[0]].getType() == staff)
- doslice = 0;
+ if (weaponactive == -1) {
+ doslice = PersonType::types[creature].hasClaws;
+ } else {
+ doslice = (weapons[weaponids[0]].getType() != staff);
+ }
if (doslice) {
- if (weaponactive != -1) {
+ if (weaponactive == -1) {
+ emit_sound_at(clawslicesound, victim->coords, 128.);
+ victim->spurt = 1;
+ victim->DoBloodBig(2 / victim->armorhead, 175);
+ } else {
victim->DoBloodBig(2 / victim->armorhead, 225);
emit_sound_at(knifeslicesound, victim->coords);
- if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody)
+ if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody) {
weapons[weaponids[weaponactive]].bloody = 1;
+ }
weapons[weaponids[weaponactive]].blooddrip += 3;
}
- if (weaponactive == -1 && creature == wolftype) {
- emit_sound_at(clawslicesound, victim->coords, 128.);
- victim->spurt = 1;
- victim->DoBloodBig(2 / victim->armorhead, 175);
- }
}
award_bonus(id, Reversal);
@@ -3702,13 +3856,14 @@ void Person::DoAnimations()
victim->skeleton.joints[i].velocity += relative * damagemult * 20;
}
victim->jointVel(head) += relative * damagemult * 200;
- if (victim->damage < victim->damagetolerance - 100)
+ if (victim->damage < victim->damagetolerance - 100) {
victim->velocity = relative * 200;
+ }
victim->DoDamage(damagemult * 100 / victim->protectionhead);
victim->velocity = 0;
}
- if (animTarget == sweepreversalanim && ((Animation::animations[animTarget].frames[frameCurrent].label == 9 && victim->damage < victim->damagetolerance) || (Animation::animations[animTarget].frames[frameCurrent].label == 7 && victim->damage > victim->damagetolerance))) {
+ if (animCurrent == sweepreversalanim && ((currentFrame().label == 9 && victim->damage < victim->damagetolerance) || (currentFrame().label == 7 && victim->damage > victim->damagetolerance))) {
escapednum = 0;
victim->RagDoll(0);
XYZ relative;
@@ -3724,15 +3879,15 @@ void Person::DoAnimations()
victim->jointVel(head) += relative * damagemult * 200;
}
- if (hasvictim && (animTarget == spinkickreversalanim || animTarget == sweepreversalanim || animTarget == rabbitkickreversalanim || animTarget == upunchreversalanim || animTarget == jumpreversalanim || animTarget == swordslashreversalanim || animTarget == knifeslashreversalanim || animTarget == rabbittacklereversal || animTarget == wolftacklereversal || animTarget == staffhitreversalanim || animTarget == staffspinhitreversalanim))
+ if (hasvictim && (animTarget == spinkickreversalanim || animTarget == sweepreversalanim || animTarget == rabbitkickreversalanim || animTarget == upunchreversalanim || animTarget == jumpreversalanim || animTarget == swordslashreversalanim || animTarget == knifeslashreversalanim || animTarget == rabbittacklereversal || animTarget == wolftacklereversal || animTarget == staffhitreversalanim || animTarget == staffspinhitreversalanim)) {
if (victim->damage > victim->damagetolerance && bonus != reverseko) {
award_bonus(id, reverseko);
}
+ }
}
-
//Animation end
- if (frameTarget > int(Animation::animations[animCurrent].frames.size()) - 1) {
+ if (frameTarget >= int(Animation::animations[animCurrent].frames.size())) {
frameTarget = 0;
if (wasStop()) {
animTarget = getIdle();
@@ -3770,9 +3925,9 @@ void Person::DoAnimations()
if (animCurrent == crouchdrawrightanim) {
animTarget = getCrouch();
}
- if (weaponactive == -1)
+ if (weaponactive == -1) {
weaponactive = 0;
- else if (weaponactive == 0) {
+ } else if (weaponactive == 0) {
weaponactive = -1;
if (num_weapons == 2) {
int buffer;
@@ -3807,10 +3962,10 @@ void Person::DoAnimations()
animTarget = getCrouch();
frameTarget = 1;
coords += facing * .1;
- if (!isnormal(coords.x))
+ if (!isnormal(coords.x)) {
coords = oldcoords;
+ }
oldcoords = coords;
- collided = 0;
targetoffset = 0;
currentoffset = 0;
grabdelay = 1;
@@ -3831,7 +3986,7 @@ void Person::DoAnimations()
int closest = -1;
float closestdist = -1;
float distance;
- if (Person::players.size() > 1)
+ if (Person::players.size() > 1) {
for (unsigned i = 0; i < Person::players.size(); i++) {
if (id != i && Person::players[i]->coords.y < coords.y && !Person::players[i]->skeleton.free) {
distance = distsq(&Person::players[i]->coords, &coords);
@@ -3841,6 +3996,7 @@ void Person::DoAnimations()
}
}
}
+ }
if (closestdist > 0 && closest >= 0 && closestdist < 16) {
victim = Person::players[closest];
animTarget = walljumprightkickanim;
@@ -3849,8 +4005,9 @@ void Person::DoAnimations()
Normalise(&rotatetarget);
yaw = -asin(0 - rotatetarget.x);
yaw *= 360 / 6.28;
- if (rotatetarget.z < 0)
+ if (rotatetarget.z < 0) {
yaw = 180 - yaw;
+ }
targettilt2 = -asin(rotatetarget.y) * 360 / 6.28;
velocity = (victim->coords - coords) * 4;
velocity.y += 2;
@@ -3862,8 +4019,9 @@ void Person::DoAnimations()
frameTarget = 3;
velocity = facing * -8;
velocity.y = 4;
- if (id == 0)
+ if (id == 0) {
resume_stream(whooshsound);
+ }
}
if (animTarget == walljumprightanim) {
animTarget = rightflipanim;
@@ -3881,15 +4039,16 @@ void Person::DoAnimations()
velocity = facing * 8;
velocity.y = 4;
}
- if (id == 0)
+ if (id == 0) {
resume_stream(whooshsound);
+ }
}
if (animTarget == walljumpleftanim) {
if (attackkeydown) {
int closest = -1;
float closestdist = -1;
float distance;
- if (Person::players.size() > 1)
+ if (Person::players.size() > 1) {
for (unsigned i = 0; i < Person::players.size(); i++) {
if (id != i && Person::players[i]->coords.y < coords.y && !Person::players[i]->skeleton.free) {
distance = distsq(&Person::players[i]->coords, &coords);
@@ -3899,6 +4058,7 @@ void Person::DoAnimations()
}
}
}
+ }
if (closestdist > 0 && closest >= 0 && closestdist < 16) {
victim = Person::players[closest];
animTarget = walljumpleftkickanim;
@@ -3907,8 +4067,9 @@ void Person::DoAnimations()
Normalise(&rotatetarget);
yaw = -asin(0 - rotatetarget.x);
yaw *= 360 / 6.28;
- if (rotatetarget.z < 0)
+ if (rotatetarget.z < 0) {
yaw = 180 - yaw;
+ }
targettilt2 = -asin(rotatetarget.y) * 360 / 6.28;
velocity = (victim->coords - coords) * 4;
velocity.y += 2;
@@ -3923,8 +4084,9 @@ void Person::DoAnimations()
velocity = DoRotation(facing, 0, -30, 0) * -8;
velocity.y = 4;
}
- if (id == 0)
+ if (id == 0) {
resume_stream(whooshsound);
+ }
}
if (animTarget == sneakattackanim) {
animCurrent = getCrouch();
@@ -3938,16 +4100,18 @@ void Person::DoAnimations()
transspeed = 1000000;
targetheadyaw += 180;
coords -= facing * .7;
- if (onterrain)
+ if (onterrain) {
coords.y = terrain.getHeight(coords.x, coords.z);
+ }
lastfeint = 0;
}
if (animTarget == knifesneakattackanim || animTarget == swordsneakattackanim) {
animTarget = getIdle();
frameTarget = 0;
- if (onterrain)
+ if (onterrain) {
coords.y = terrain.getHeight(coords.x, coords.z);
+ }
lastfeint = 0;
}
@@ -3964,13 +4128,14 @@ void Person::DoAnimations()
tilt2 *= -1;
transspeed = 1000000;
targetheadyaw += 180;
- if (!isnormal(coords.x))
+ if (!isnormal(coords.x)) {
coords = oldcoords;
- if (animCurrent == spinkickreversalanim || animCurrent == swordslashreversalanim)
+ }
+ if (animCurrent == spinkickreversalanim || animCurrent == swordslashreversalanim) {
oldcoords = coords + facing * .5;
- else if (animCurrent == sweepreversalanim)
+ } else if (animCurrent == sweepreversalanim) {
oldcoords = coords + facing * 1.1;
- else if (animCurrent == upunchreversalanim) {
+ } else if (animCurrent == upunchreversalanim) {
oldcoords = coords + facing * 1.5;
targetyaw += 180;
yaw += 180;
@@ -3991,10 +4156,11 @@ void Person::DoAnimations()
targettilt2 = 0;
tilt2 = 0;
}
- if (onterrain)
+ if (onterrain) {
oldcoords.y = terrain.getHeight(oldcoords.x, oldcoords.z);
- else
+ } else {
oldcoords.y = ycoords;
+ }
currentoffset = coords - oldcoords;
targetoffset = 0;
coords = oldcoords;
@@ -4008,8 +4174,9 @@ void Person::DoAnimations()
}
if (Animation::animations[animTarget].attack == reversed) {
escapednum++;
- if (animTarget == sweepreversedanim)
+ if (animTarget == sweepreversedanim) {
targetyaw += 90;
+ }
animTarget = backhandspringanim;
frameTarget = 2;
emit_sound_at(landsound, coords, 128);
@@ -4034,10 +4201,12 @@ void Person::DoAnimations()
if (wasFlip()) {
animTarget = jumpdownanim;
}
- if (wasLanding())
+ if (wasLanding()) {
animTarget = getIdle();
- if (wasLandhard())
+ }
+ if (wasLandhard()) {
animTarget = getIdle();
+ }
if (animCurrent == spinkickanim || animCurrent == getupfrombackanim || animCurrent == getupfromfrontanim || animCurrent == lowkickanim) {
animTarget = getIdle();
oldcoords = coords;
@@ -4045,8 +4214,9 @@ void Person::DoAnimations()
coords.y = oldcoords.y;
//coords+=DoRotation(Animation::animations[animCurrent].offset,0,yaw,0)*scale;
targetoffset.y = coords.y;
- if (onterrain)
+ if (onterrain) {
targetoffset.y = terrain.getHeight(coords.x, coords.z);
+ }
currentoffset = DoRotation(Animation::animations[animCurrent].offset * -1, 0, yaw, 0) * scale;
currentoffset.y -= (coords.y - targetoffset.y);
coords.y = targetoffset.y;
@@ -4062,11 +4232,14 @@ void Person::DoAnimations()
targetyaw = yaw;
bool hasstaff;
hasstaff = 0;
- if (num_weapons > 0)
- if (weapons[0].getType() == staff)
+ if (num_weapons > 0) {
+ if (weapons[0].getType() == staff) {
hasstaff = 1;
- if (!hasstaff)
+ }
+ }
+ if (!hasstaff) {
DoDamage(35);
+ }
RagDoll(0);
lastfeint = 0;
rabbitkickragdoll = 1;
@@ -4084,8 +4257,9 @@ void Person::DoAnimations()
escapednum++;
animTarget = rollanim;
coords += facing;
- if (id == 0)
+ if (id == 0) {
pause_sound(whooshsound);
+ }
}
lastfeint = 0;
}
@@ -4108,8 +4282,9 @@ void Person::DoAnimations()
escapednum++;
animTarget = rollanim;
coords += facing * 2;
- if (id == 0)
+ if (id == 0) {
pause_sound(whooshsound);
+ }
}
lastfeint = 0;
}
@@ -4129,14 +4304,16 @@ void Person::DoAnimations()
lastfeint = 0;
}
if (animCurrent == spinkickanim && victim->skeleton.free) {
- if (creature == rabbittype)
+ if (creature == rabbittype) {
animTarget = fightidleanim;
+ }
}
}
target = 0;
- if (isIdle() && !wasIdle())
+ if (isIdle() && !wasIdle()) {
normalsupdatedelay = 0;
+ }
if (animCurrent == jumpupanim && velocity.y < 0 && !isFlip()) {
animTarget = jumpdownanim;
@@ -4146,37 +4323,48 @@ void Person::DoAnimations()
oldtarget = target;
if (!transspeed && Animation::animations[animTarget].attack != 2 && Animation::animations[animTarget].attack != 3) {
if (!isRun() || !wasRun()) {
- if (targetFrame().speed > currentFrame().speed)
+ if (targetFrame().speed > currentFrame().speed) {
target += multiplier * targetFrame().speed * speed * 2;
- if (targetFrame().speed <= currentFrame().speed)
+ }
+ if (targetFrame().speed <= currentFrame().speed) {
target += multiplier * currentFrame().speed * speed * 2;
+ }
}
if (isRun() && wasRun()) {
float tempspeed;
tempspeed = velspeed;
- if (tempspeed < 10 * speedmult)
+ if (tempspeed < 10 * speedmult) {
tempspeed = 10 * speedmult;
+ }
/* FIXME - mixed of target and current here, is that intended? */
target += multiplier * Animation::animations[animTarget].frames[frameCurrent].speed * speed * 1.7 * tempspeed / (speed * 45 * scale);
}
- } else if (transspeed)
+ } else if (transspeed) {
target += multiplier * transspeed * speed * 2;
- else {
+ } else {
if (!isRun() || !wasRun()) {
- if (targetFrame().speed > currentFrame().speed)
+ if (targetFrame().speed > currentFrame().speed) {
target += multiplier * targetFrame().speed * 2;
- if (targetFrame().speed <= currentFrame().speed)
+ }
+ if (targetFrame().speed <= currentFrame().speed) {
target += multiplier * currentFrame().speed * 2;
+ }
}
}
- if (animCurrent != animTarget)
+ if (animCurrent != animTarget) {
target = (target + oldtarget) / 2;
+ }
if (target > 1) {
frameCurrent = frameTarget;
target = 1;
}
+
+ if (frameCurrent >= int(Animation::animations[animCurrent].frames.size())) {
+ frameCurrent = Animation::animations[animCurrent].frames.size() - 1;
+ }
+
oldrot = rot;
rot = targetrot * target;
yaw += rot - oldrot;
@@ -4185,9 +4373,7 @@ void Person::DoAnimations()
oldrot = 0;
targetrot = 0;
}
- 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 (unsigned i = 0; i < skeleton.joints.size(); i++) {
@@ -4203,12 +4389,15 @@ void Person::DoAnimations()
}
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))
+ if (isnormal((float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100)) {
skeleton.muscles[i].oldrotate1 = (float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100;
- if (isnormal((float)((int)(skeleton.muscles[i].rotate2 * 100) % 36000) / 100))
+ }
+ if (isnormal((float)((int)(skeleton.muscles[i].rotate2 * 100) % 36000) / 100)) {
skeleton.muscles[i].oldrotate2 = (float)((int)(skeleton.muscles[i].rotate2 * 100) % 36000) / 100;
- if (isnormal((float)((int)(skeleton.muscles[i].rotate3 * 100) % 36000) / 100))
+ }
+ if (isnormal((float)((int)(skeleton.muscles[i].rotate3 * 100) % 36000) / 100)) {
skeleton.muscles[i].oldrotate3 = (float)((int)(skeleton.muscles[i].rotate3 * 100) % 36000) / 100;
+ }
}
}
@@ -4226,18 +4415,33 @@ void Person::DoAnimations()
}
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))
+ if (isnormal((float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100)) {
skeleton.muscles[i].newrotate1 = (float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100;
- if (isnormal((float)((int)(skeleton.muscles[i].rotate2 * 100) % 36000) / 100))
+ }
+ if (isnormal((float)((int)(skeleton.muscles[i].rotate2 * 100) % 36000) / 100)) {
skeleton.muscles[i].newrotate2 = (float)((int)(skeleton.muscles[i].rotate2 * 100) % 36000) / 100;
- if (isnormal((float)((int)(skeleton.muscles[i].rotate3 * 100) % 36000) / 100))
+ }
+ 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;
+ }
}
}
}
@@ -4248,22 +4452,23 @@ void Person::DoAnimations()
oldframeCurrent = frameCurrent;
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);
+ 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 (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;
}
}
}
if (isLanding() && landhard) {
- if (id == 0)
+ if (id == 0) {
camerashake += .4;
+ }
animTarget = getLandhard();
frameTarget = 0;
target = 0;
@@ -4283,7 +4488,6 @@ void Person::DoStuff()
static XYZ flatfacing;
static XYZ flatvelocity;
static float flatvelspeed;
- static int i, l;
static int bloodsize;
static int startx, starty, endx, endy;
static GLubyte color;
@@ -4298,23 +4502,29 @@ void Person::DoStuff()
}
crouchkeydowntime += multiplier;
- if (!crouchkeydown)
+ if (!crouchkeydown) {
crouchkeydowntime = 0;
+ }
jumpkeydowntime += multiplier;
- if (!jumpkeydown && skeleton.free)
+ if (!jumpkeydown && skeleton.free) {
jumpkeydowntime = 0;
+ }
- if (hostile || damage > 0 || bloodloss > 0)
+ if (hostile || damage > 0 || bloodloss > 0) {
immobile = 0;
+ }
- if (isIdle() || isRun())
+ if (isIdle() || isRun()) {
targetoffset = 0;
+ }
- if (num_weapons == 1 && weaponactive != -1)
+ if (num_weapons == 1 && weaponactive != -1) {
weaponstuck = -1;
+ }
- if (id == 0)
+ if (id == 0) {
blooddimamount -= multiplier * .3;
+ }
speechdelay -= multiplier;
texupdatedelay -= multiplier;
interestdelay -= multiplier;
@@ -4325,17 +4535,20 @@ void Person::DoStuff()
hasvictim = 0;
}
- if (id == 0)
+ if (id == 0) {
speed = 1.1 * speedmult;
- else
+ } else {
speed = 1.0 * speedmult;
- if (!skeleton.free)
+ }
+ if (!skeleton.free) {
rabbitkickragdoll = 0;
+ }
speed *= speedmult;
- if (id != 0 && (creature == rabbittype || difficulty != 2))
+ if (id != 0 && (creature == rabbittype || difficulty != 2)) {
superruntoggle = 0;
+ }
if (id != 0 && creature == wolftype && difficulty == 2) {
superruntoggle = 0;
if (aitype != passivetype) {
@@ -4344,8 +4557,9 @@ void Person::DoStuff()
superruntoggle = 0;
}
}
- if (scale < 0.2)
+ if (scale < 0.2) {
superruntoggle = 0;
+ }
if (animTarget == wolfrunninganim && !superruntoggle) {
animTarget = getRun();
frameTarget = 0;
@@ -4360,22 +4574,19 @@ void Person::DoStuff()
if (onfire) {
burnt += multiplier;
deathbleeding = 1;
- if (burnt > .6)
+ if (burnt > .6) {
burnt = .6;
+ }
OPENAL_SetVolume(channels[stream_firesound], 256 + 256 * findLength(&velocity) / 3);
if (animTarget == jumpupanim || animTarget == jumpdownanim || isFlip()) {
float gLoc[3];
- float vel[3];
gLoc[0] = coords.x;
gLoc[1] = coords.y;
gLoc[2] = coords.z;
- vel[0] = velocity.x;
- vel[1] = velocity.y;
- vel[2] = velocity.z;
if (id == 0) {
- OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel);
+ OPENAL_3D_SetAttributes(channels[whooshsound], gLoc);
OPENAL_SetVolume(channels[whooshsound], 64 * findLength(&velocity) / 5);
}
}
@@ -4410,8 +4621,9 @@ void Person::DoStuff()
bleeding -= multiplier * .3;
if (bloodtoggle == 2) {
skeleton.drawmodel.textureptr.bind();
- if ((bleeding <= 0) && (detail != 2))
+ if ((bleeding <= 0) && (detail != 2)) {
DoMipmaps();
+ }
}
}
@@ -4425,12 +4637,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;
}
@@ -4440,10 +4652,11 @@ void Person::DoStuff()
}
if (deathbleeding > 0 && dead != 2) {
- if (deathbleeding < 5)
+ if (deathbleeding < 5) {
bleeddelay -= deathbleeding * multiplier / 4;
- else
+ } else {
bleeddelay -= 5 * multiplier / 4;
+ }
if (bleeddelay < 0 && bloodtoggle) {
bleeddelay = 1;
XYZ bloodvel;
@@ -4454,14 +4667,15 @@ 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);
}
}
}
bloodloss += deathbleeding * multiplier * 80;
deathbleeding -= multiplier * 1.6;
- if (deathbleeding < 0)
+ if (deathbleeding < 0) {
deathbleeding = 0;
+ }
if (bloodloss > damagetolerance && Animation::animations[animTarget].attack == neutral) {
if (weaponactive != -1) {
weapons[weaponids[0]].drop(velocity * scale * -.3, velocity * scale);
@@ -4469,8 +4683,9 @@ void Person::DoStuff()
num_weapons--;
if (num_weapons) {
weaponids[0] = weaponids[num_weapons];
- if (weaponstuck == num_weapons)
+ if (weaponstuck == num_weapons) {
weaponstuck = 0;
+ }
}
weaponactive = -1;
for (unsigned i = 0; i < Person::players.size(); i++) {
@@ -4528,17 +4743,20 @@ void Person::DoStuff()
endy = skeleton.skinsize - 1;
bleeding = 0;
}
- if (endx < startx)
+ if (endx < startx) {
endx = startx;
- if (endy < starty)
+ }
+ if (endy < starty) {
endy = starty;
+ }
- for (i = startx; i < endx; i++) {
+ 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)
+ if (skeleton.skinText[i * skeleton.skinsize * 3 + j * 3 + 0] > color / 2) {
skeleton.skinText[i * skeleton.skinsize * 3 + j * 3 + 0] = color / 2;
+ }
skeleton.skinText[i * skeleton.skinsize * 3 + j * 3 + 1] = 0;
skeleton.skinText[i * skeleton.skinsize * 3 + j * 3 + 2] = 0;
}
@@ -4551,16 +4769,18 @@ void Person::DoStuff()
if (skeleton.free) {
bleedx += 4 * direction / realtexdetail;
- if (detail == 2)
+ if (detail == 2) {
bleedy += (abs(Random() % 3) - 1) * 2 / realtexdetail;
- else
+ } else {
bleedy += (abs(Random() % 3) - 1) * 4 / realtexdetail;
+ }
} else {
bleedy -= 4 / realtexdetail;
- if (detail == 2)
+ if (detail == 2) {
bleedx += (abs(Random() % 3) - 1) * 2 / realtexdetail;
- else
+ } else {
bleedx += (abs(Random() % 3) - 1) * 4 / realtexdetail;
+ }
}
}
@@ -4662,8 +4882,9 @@ void Person::DoStuff()
footvel = DoRotation(skeleton.specialforward[0], 0, yaw, 0) * -1;
footpoint = DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords;
}
- if (animTarget == sleepanim)
+ if (animTarget == sleepanim) {
footvel = DoRotation(footvel, 0, 90, 0);
+ }
Sprite::MakeSprite(breathsprite, footpoint + footvel * .2, footvel * .4, 1, 1, 1, .4, .3);
}
}
@@ -4704,7 +4925,9 @@ 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;
@@ -4729,10 +4952,11 @@ void Person::DoStuff()
}
if (!dead) {
if (creature == rabbittype) {
- if (howactive < typesleeping)
+ if (howactive < typesleeping) {
twitchdelay2 -= multiplier * 1.5;
- else
+ } else {
twitchdelay2 -= multiplier * 0.5;
+ }
if (howactive <= typesleeping) {
if (tailmorphstart == 0 && tailmorphend == 0 && twitchdelay2 <= 0) {
tailmorphness = 0;
@@ -4756,20 +4980,22 @@ void Person::DoStuff()
}
if (creature == wolftype) {
twitchdelay2 -= multiplier * 1.5;
- if (tailmorphend != 0)
+ if (tailmorphend != 0) {
if ((isRun() || animTarget == jumpupanim || animTarget == jumpdownanim || animTarget == backflipanim) && !skeleton.free) {
tailmorphness = 0;
targettailmorphness = 1;
tailmorphend = 0;
twitchdelay2 = .1;
}
- if (tailmorphend != 5)
+ }
+ if (tailmorphend != 5) {
if (animTarget == flipanim || animTarget == frontflipanim || animTarget == rollanim || skeleton.free) {
tailmorphness = 0;
targettailmorphness = 1;
tailmorphend = 5;
twitchdelay2 = .1;
}
+ }
if (twitchdelay2 <= 0) {
if (((tailmorphstart == 0 && tailmorphend == 0) || (tailmorphstart == 5 && tailmorphend == 5))) {
tailmorphness = 0;
@@ -4799,68 +5025,74 @@ void Person::DoStuff()
}
}
- if (dead != 1)
+ if (dead != 1) {
unconscioustime = 0;
+ }
if (dead == 1 || howactive == typesleeping) {
unconscioustime += multiplier;
//If unconscious, close eyes and mouth
- if (righthandmorphend != 0)
+ if (righthandmorphend != 0) {
righthandmorphness = 0;
+ }
righthandmorphend = 0;
targetrighthandmorphness = 1;
- if (lefthandmorphend != 0)
+ if (lefthandmorphend != 0) {
lefthandmorphness = 0;
+ }
lefthandmorphend = 0;
targetlefthandmorphness = 1;
- if (headmorphend != 3 && headmorphend != 5)
+ if (headmorphend != 3 && headmorphend != 5) {
headmorphness = 0;
+ }
headmorphend = 3;
targetheadmorphness = 1;
}
-
if (howactive > typesleeping) {
XYZ headpoint;
headpoint = coords;
if (bloodtoggle && !bled) {
terrain.MakeDecal(blooddecalslow, headpoint, .8, .5, 0);
- }
- if (bloodtoggle && !bled)
- for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) {
- int j = terrain.patchobjects[whichpatchx][whichpatchz][l];
+ 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;
Object::objects[j]->model.MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw);
}
+ }
bled = 1;
}
if (dead == 2 || howactive > typesleeping) {
//If dead, open mouth and hands
- if (righthandmorphend != 0)
+ if (righthandmorphend != 0) {
righthandmorphness = 0;
+ }
righthandmorphend = 0;
targetrighthandmorphness = 1;
- if (lefthandmorphend != 0)
+ if (lefthandmorphend != 0) {
lefthandmorphness = 0;
+ }
lefthandmorphend = 0;
targetlefthandmorphness = 1;
- if (headmorphend != 2)
+ if (headmorphend != 2) {
headmorphness = 0;
+ }
headmorphend = 2;
targetheadmorphness = 1;
}
if (stunned > 0 && !dead && headmorphend != 2) {
- if (headmorphend != 4)
+ if (headmorphend != 4) {
headmorphness = 0;
+ }
headmorphend = 4;
targetheadmorphness = 1;
}
@@ -4882,8 +5114,9 @@ void Person::DoStuff()
num_weapons--;
if (num_weapons) {
weaponids[0] = weaponids[num_weapons];
- if (weaponstuck == num_weapons)
+ if (weaponstuck == num_weapons) {
weaponstuck = 0;
+ }
}
weaponactive = -1;
for (unsigned i = 0; i < Person::players.size(); i++) {
@@ -4891,8 +5124,6 @@ void Person::DoStuff()
}
}
-
-
if ((id == 0 || distsq(&coords, &viewer) < 50) && autoslomo) {
slomo = 1;
slomodelay = .2;
@@ -4901,20 +5132,22 @@ 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)
+ if (damage < 0) {
damage = 0;
- if (permanentdamage < 0)
+ }
+ if (permanentdamage < 0) {
permanentdamage = 0;
- if (superpermanentdamage < 0)
+ }
+ if (superpermanentdamage < 0) {
superpermanentdamage = 0;
+ }
if (permanentdamage < superpermanentdamage) {
permanentdamage = superpermanentdamage;
}
@@ -4938,8 +5171,9 @@ void Person::DoStuff()
num_weapons--;
if (num_weapons) {
weaponids[0] = weaponids[num_weapons];
- if (weaponstuck == num_weapons)
+ if (weaponstuck == num_weapons) {
weaponstuck = 0;
+ }
}
weaponactive = -1;
for (unsigned i = 0; i < Person::players.size(); i++) {
@@ -4953,8 +5187,9 @@ void Person::DoStuff()
award_bonus(0, Wolfbonus);
}
- if (unconscioustime < .1 && (bonus != spinecrusher || bonustime > 1) && (bonus != FinishedBonus || bonustime > 1) && bloodloss < damagetolerance)
+ if (unconscioustime < .1 && (bonus != spinecrusher || bonustime > 1) && (bonus != FinishedBonus || bonustime > 1) && bloodloss < damagetolerance) {
award_bonus(id, touchofdeath);
+ }
if (id != 0 && unconscioustime > .1) {
numafterkill++;
}
@@ -4967,24 +5202,28 @@ void Person::DoStuff()
}
if (skeleton.free == 1) {
- if (id == 0)
+ if (id == 0) {
pause_sound(whooshsound);
+ }
if (!dead) {
//If knocked over, open hands and close mouth
- if (righthandmorphend != 0)
+ if (righthandmorphend != 0) {
righthandmorphness = 0;
+ }
righthandmorphend = 0;
targetrighthandmorphness = 1;
- if (lefthandmorphend != 0)
+ if (lefthandmorphend != 0) {
lefthandmorphness = 0;
+ }
lefthandmorphend = 0;
targetlefthandmorphness = 1;
if (headmorphend != 3 && headmorphend != 5 && headmorphstart != 3 && headmorphstart != 5) {
- if (headmorphend != 0)
+ if (headmorphend != 0) {
headmorphness = 0;
+ }
headmorphend = 0;
targetheadmorphness = 1;
}
@@ -4993,8 +5232,9 @@ void Person::DoStuff()
skeleton.DoGravity(&scale);
float damageamount;
damageamount = skeleton.DoConstraints(&coords, &scale) * 5;
- if (damage > damagetolerance - damageamount && !dead && (bonus != spinecrusher || bonustime > 1) && (bonus != style || bonustime > 1) && (bonus != cannon || bonustime > 1))
+ if (damage > damagetolerance - damageamount && !dead && (bonus != spinecrusher || bonustime > 1) && (bonus != style || bonustime > 1) && (bonus != cannon || bonustime > 1)) {
award_bonus(id, deepimpact);
+ }
DoDamage(damageamount / ((protectionhigh + protectionhead + protectionlow) / 3));
XYZ average;
@@ -5025,8 +5265,9 @@ void Person::DoStuff()
skeleton.longdead += (2000 - findLength(&average)) * multiplier + multiplier;
if (skeleton.longdead > 2000) {
if (skeleton.longdead > 6000) {
- if (id == 0)
+ if (id == 0) {
pause_sound(whooshsound);
+ }
skeleton.free = 3;
DrawSkeleton();
skeleton.free = 2;
@@ -5037,35 +5278,34 @@ 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++) {
- int j = terrain.patchobjects[whichpatchx][whichpatchz][l];
+ 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;
Object::objects[j]->model.MakeDecal(blooddecal, &point, &size, &opacity, &yaw);
}
+ }
bled = 1;
}
if (dead == 2 && bloodloss >= damagetolerance) {
XYZ headpoint;
headpoint = (jointPos(abdomen) + jointPos(neck)) / 2 * scale + coords;
- if (bleeding <= 0)
+ if (bleeding <= 0) {
DoBlood(1, 255);
+ }
if (bloodtoggle && !bled) {
terrain.MakeDecal(blooddecalslow, headpoint, .8, .5, 0);
- }
- if (bloodtoggle && !bled)
- for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) {
- int j = terrain.patchobjects[whichpatchx][whichpatchz][l];
+ 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;
Object::objects[j]->model.MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw);
}
+ }
bled = 1;
}
}
@@ -5077,16 +5317,19 @@ void Person::DoStuff()
startpoint = coords;
endpoint = coords;
endpoint.y -= .7;
- if (terrain.lineTerrain(startpoint, endpoint, &colpoint) != -1)
+ if (terrain.lineTerrain(startpoint, endpoint, &colpoint) != -1) {
canrecover = 0;
- if (velocity.y < -30)
+ }
+ if (velocity.y < -30) {
canrecover = 0;
- for (i = 0; i < Object::objects.size(); i++) {
+ }
+ 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 (Object::objects[i]->model.LineCheck(&colviewer, &coltarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1)
+ if (Object::objects[i]->model.LineCheck(&colviewer, &coltarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1) {
canrecover = 0;
+ }
}
}
if (canrecover) {
@@ -5111,8 +5354,9 @@ void Person::DoStuff()
targetyaw = -asin(0 - terrainnormal.x);
targetyaw *= 360 / 6.28;
- if (terrainnormal.z < 0)
+ if (terrainnormal.z < 0) {
targetyaw = 180 - targetyaw;
+ }
yaw = targetyaw;
frameTarget = 0;
@@ -5136,8 +5380,9 @@ void Person::DoStuff()
if (findLength(&average) < 10 && !dead && skeleton.free) {
skeleton.longdead += (2000 - findLength(&average)) * multiplier + multiplier;
if (skeleton.longdead > (damage + 500) * 1.5) {
- if (id == 0)
+ if (id == 0) {
pause_sound(whooshsound);
+ }
skeleton.free = 0;
velocity = 0;
XYZ middle;
@@ -5160,13 +5405,13 @@ void Person::DoStuff()
targetyaw = -asin(0 - terrainnormal.x);
targetyaw *= 360 / 6.28;
- if (terrainnormal.z < 0)
+ if (terrainnormal.z < 0) {
targetyaw = 180 - targetyaw;
+ }
yaw = targetyaw;
targettilt2 = asin(terrainnormal.y) * 180 / 3.14 * -1;
-
if (skeleton.forward.y < 0) {
animTarget = getupfrombackanim;
frameTarget = 0;
@@ -5187,35 +5432,42 @@ void Person::DoStuff()
if (id == 0) {
if (rightkeydown) {
targetyaw -= 90;
- if (forwardkeydown)
+ if (forwardkeydown) {
targetyaw += 45;
- if (backkeydown)
+ }
+ if (backkeydown) {
targetyaw -= 45;
+ }
}
if (leftkeydown) {
targetyaw += 90;
- if (forwardkeydown)
+ if (forwardkeydown) {
targetyaw -= 45;
- if (backkeydown)
+ }
+ if (backkeydown) {
targetyaw += 45;
+ }
}
if (backkeydown) {
- if ( !leftkeydown && !rightkeydown)
+ if (!leftkeydown && !rightkeydown) {
targetyaw += 180;
+ }
}
targetyaw += 180;
}
}
- if (abs(targettilt2) > 50)
+ if (abs(targettilt2) > 50) {
targettilt2 = 0;
+ }
animCurrent = tempanim;
frameCurrent = 0;
target = 0;
tilt2 = targettilt2;
- if (middle.y > 0 && animTarget != rollanim)
+ if (middle.y > 0 && animTarget != rollanim) {
targetoffset.y = middle.y + 1;
+ }
for (unsigned i = 0; i < skeleton.joints.size(); i++) {
tempanimation.frames[0].joints[i].position = skeleton.joints[i].position;
@@ -5226,9 +5478,11 @@ void Person::DoStuff()
bool hasstaff;
hasstaff = 0;
- if (num_weapons > 0)
- if (weapons[0].getType() == staff)
+ if (num_weapons > 0) {
+ if (weapons[0].getType() == staff) {
hasstaff = 1;
+ }
+ }
if (!skeleton.freefall && freefall && ((jumpkeydown && jumpkeydowntime < .2) || (hasstaff && rabbitkickragdoll)) && !dead) {
if (velocity.y > -30) {
XYZ tempvelocity;
@@ -5236,8 +5490,9 @@ void Person::DoStuff()
Normalise(&tempvelocity);
targetyaw = -asin(0 - tempvelocity.x);
targetyaw *= 360 / 6.28;
- if (velocity.z < 0)
+ if (velocity.z < 0) {
targetyaw = 180 - targetyaw;
+ }
//targetyaw+=180;
skeleton.free = 0;
@@ -5266,16 +5521,16 @@ void Person::DoStuff()
targettilt2 = 0;
}
}
- if (skeleton.freefall == 0)
+ if (skeleton.freefall == 0) {
freefall = 0;
-
+ }
}
- if (aitype != passivetype || skeleton.free == 1)
- if (findLengthfast(&velocity) > .1)
- for (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 (aitype != passivetype || skeleton.free == 1) {
+ if (findLengthfast(&velocity) > .1) {
+ 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 (!Object::objects[i]->onfire) {
emit_sound_at(firestartsound, Object::objects[i]->position);
@@ -5288,8 +5543,9 @@ void Person::DoStuff()
}
}
}
- 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 (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 (!Object::objects[i]->onfire) {
emit_sound_at(firestartsound, Object::objects[i]->position);
@@ -5313,12 +5569,14 @@ void Person::DoStuff()
}
int howmany = 0;
- if (environment == grassyenvironment)
+ if (environment == grassyenvironment) {
howmany = findLength(&velocity) * 4;
- if (environment == snowyenvironment)
+ }
+ if (environment == snowyenvironment) {
howmany = findLength(&velocity) * 2;
- if (detail == 2)
- if (environment != desertenvironment)
+ }
+ if (detail == 2) {
+ if (environment != desertenvironment) {
for (int j = 0; j < howmany; j++) {
tempvel.x = float(abs(Random() % 100) - 50) / 20;
tempvel.y = float(abs(Random() % 100) - 50) / 20;
@@ -5331,9 +5589,11 @@ void Person::DoStuff()
Sprite::MakeSprite(splintersprite, pos, tempvel * .5 + velocity * float(abs(Random() % 100)) / 100, 165 / 255 + float(abs(Random() % 100) - 50) / 400, 0, 0, .2 + float(abs(Random() % 100) - 50) / 1300, 1);
Sprite::setLastSpriteSpecial(1);
}
+ }
+ }
howmany = findLength(&velocity) * 4;
- if (detail == 2)
- if (environment == snowyenvironment)
+ if (detail == 2) {
+ if (environment == snowyenvironment) {
for (int j = 0; j < howmany; j++) {
tempvel.x = float(abs(Random() % 100) - 50) / 20;
tempvel.y = float(abs(Random() % 100) - 50) / 20;
@@ -5346,22 +5606,25 @@ void Person::DoStuff()
Sprite::MakeSprite(splintersprite, pos, tempvel * .3 + velocity * float(abs(Random() % 100)) / 100 / 2, 1, 1, 1, .1, 1);
Sprite::setLastSpriteSpecial(2);
}
+ }
+ }
}
Object::objects[i]->rotx += velocity.x * multiplier * 6;
Object::objects[i]->roty += velocity.z * multiplier * 6;
Object::objects[i]->messedwith = .5;
}
+ }
XYZ tempcoord;
if (Object::objects[i]->type == treeleavestype && environment != desertenvironment) {
- if (Object::objects[i]->pitch == 0)
+ if (Object::objects[i]->pitch == 0) {
tempcoord = coords;
- else {
+ } else {
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, &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 (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;
@@ -5373,12 +5636,14 @@ void Person::DoStuff()
}
int howmany = 0;
- if (environment == grassyenvironment)
+ if (environment == grassyenvironment) {
howmany = findLength(&velocity) * 4;
- if (environment == snowyenvironment)
+ }
+ if (environment == snowyenvironment) {
howmany = findLength(&velocity) * 2;
- if (detail == 2)
- if (environment != desertenvironment)
+ }
+ if (detail == 2) {
+ if (environment != desertenvironment) {
for (int j = 0; j < howmany; j++) {
tempvel.x = float(abs(Random() % 100) - 50) / 20;
tempvel.y = float(abs(Random() % 100) - 50) / 20;
@@ -5392,9 +5657,11 @@ void Person::DoStuff()
Sprite::MakeSprite(splintersprite, pos, tempvel * .5 + velocity * float(abs(Random() % 100)) / 100, 165 / 255 + float(abs(Random() % 100) - 50) / 400, 0, 0, .2 + float(abs(Random() % 100) - 50) / 1300, 1);
Sprite::setLastSpriteSpecial(1);
}
+ }
+ }
howmany = findLength(&velocity) * 4;
- if (detail == 2)
- if (environment == snowyenvironment)
+ if (detail == 2) {
+ if (environment == snowyenvironment) {
for (int j = 0; j < howmany; j++) {
tempvel.x = float(abs(Random() % 100) - 50) / 20;
tempvel.y = float(abs(Random() % 100) - 50) / 20;
@@ -5408,37 +5675,36 @@ void Person::DoStuff()
Sprite::MakeSprite(splintersprite, pos, tempvel * .3 + velocity * float(abs(Random() % 100)) / 100 / 2, 1, 1, 1, .1, 1);
Sprite::setLastSpriteSpecial(2);
}
+ }
+ }
}
Object::objects[i]->messedwith = .5;
}
}
}
+ }
+ }
if (!skeleton.free) {
bool play;
play = 0;
- if ((stunned > 0 || surprised > 0) && Person::players.size() > 2 && aitype != passivetype)
+ if ((stunned > 0 || surprised > 0) && Person::players.size() > 2 && aitype != passivetype) {
play = 1;
- if (hasvictim)
- if (aitype != passivetype && victim->skeleton.free && !victim->dead)
+ }
+ if (hasvictim) {
+ if (aitype != passivetype && victim->skeleton.free && !victim->dead) {
play = 1;
- if (Tutorial::active && id != 0)
+ }
+ }
+ if (Tutorial::active && id != 0) {
play = 0;
+ }
if (play && aitype != playercontrolled) {
int whichsound = -1;
- i = abs(Random() % 4);
if (speechdelay <= 0) {
- if (creature == rabbittype) {
- if (i == 0)
- whichsound = rabbitchitter;
- if (i == 1)
- whichsound = rabbitchitter2;
- }
- if (creature == wolftype) {
- if (i == 0)
- whichsound = growlsound;
- if (i == 1)
- whichsound = growl2sound;
+ unsigned int i = abs(Random() % 4);
+ if (i < 2) {
+ whichsound = PersonType::types[creature].soundsTalk[i];
}
}
speechdelay = .3;
@@ -5448,15 +5714,19 @@ void Person::DoStuff()
}
}
- if (animTarget == staggerbackhighanim)
+ if (animTarget == staggerbackhighanim) {
staggerdelay = 1;
- if (animTarget == staggerbackhardanim)
+ }
+ if (animTarget == staggerbackhardanim) {
staggerdelay = 1;
+ }
staggerdelay -= multiplier;
- if (animTarget != crouchstabanim && animTarget != swordgroundstabanim && animTarget != staffgroundsmashanim)
+ if (animTarget != crouchstabanim && animTarget != swordgroundstabanim && animTarget != staffgroundsmashanim) {
hasvictim = 1;
- if (velocity.y < -30 && animTarget == jumpdownanim)
+ }
+ if (velocity.y < -30 && animTarget == jumpdownanim) {
RagDoll(0);
+ }
if (animCurrent != getIdle() && wasIdle() && animTarget != getIdle() && isIdle()) {
animTarget = getIdle();
frameTarget = 0;
@@ -5543,15 +5813,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;
@@ -5574,7 +5875,7 @@ void Person::DoStuff()
}
}
- if (!dead && animTarget != hurtidleanim)
+ if (!dead && animTarget != hurtidleanim) {
if (behind || animTarget == killanim || animTarget == knifethrowanim || animTarget == knifefollowanim || animTarget == spinkickreversalanim || animTarget == rabbitkickreversedanim || animTarget == jumpreversedanim) {
if (headmorphend != 4 || headmorphness == targetheadmorphness) {
headmorphend = 4;
@@ -5582,6 +5883,7 @@ void Person::DoStuff()
targetheadmorphness = 1;
}
}
+ }
if (weaponactive != -1) {
if (weapons[weaponids[weaponactive]].getType() != staff) {
@@ -5598,8 +5900,9 @@ void Person::DoStuff()
terrainnormal = terrain.getNormal(coords.x, coords.z);
if (Animation::animations[animTarget].attack != reversal) {
- if (!isnormal(coords.x))
+ if (!isnormal(coords.x)) {
coords = oldcoords;
+ }
oldcoords = coords;
}
@@ -5611,47 +5914,58 @@ void Person::DoStuff()
ReflectVector(&facing, terrainnormal);
Normalise(&facing);
- if (isRun() || animTarget == sneakanim || animTarget == rollanim || animTarget == walkanim) {
- if (onterrain)
+ if (isRun() ||
+ animTarget == sneakanim || animTarget == rollanim || animTarget == walkanim) {
+ if (onterrain) {
targettilt2 = -facing.y * 20;
- else
+ } else {
targettilt2 = 0;
+ }
}
onterrain = 0;
- if (!isRun() && !Animation::animations[animTarget].attack && animTarget != getupfromfrontanim && animTarget != getupfrombackanim && animTarget != sneakanim)
+ if (!isRun() && !Animation::animations[animTarget].attack && animTarget != getupfromfrontanim && animTarget != getupfrombackanim && animTarget != sneakanim) {
targettilt2 = 0;
+ }
if (animTarget == jumpupanim || animTarget == jumpdownanim || isFlip()) {
flatvelocity = velocity;
flatvelocity.y = 0;
flatvelspeed = findLength(&flatvelocity);
targettilt = flatvelspeed * fast_sqrt(abs(velocity.y) * .7) * normaldotproduct(DoRotation(flatfacing, 0, -90, 0), flatvelocity);
targettilt2 = flatvelspeed * fast_sqrt(abs(velocity.y) * .7) * normaldotproduct(flatfacing, flatvelocity);
- if (velocity.y < 0)
+ if (velocity.y < 0) {
targettilt2 *= -1;
- if (velocity.y < 0)
+ }
+ if (velocity.y < 0) {
targettilt *= -1;
- if (targettilt > 25)
+ }
+ if (targettilt > 25) {
targettilt = 25;
- if (targettilt < -25)
+ }
+ if (targettilt < -25) {
targettilt = -25;
+ }
}
- if (targettilt2 > 45)
+ if (targettilt2 > 45) {
targettilt2 = 45;
- if (targettilt2 < -45)
+ }
+ if (targettilt2 < -45) {
targettilt2 = -45;
- if (abs(tilt2 - targettilt2) < multiplier * 400)
+ }
+ if (abs(tilt2 - targettilt2) < multiplier * 400) {
tilt2 = targettilt2;
- else if (tilt2 > targettilt2) {
+ } else if (tilt2 > targettilt2) {
tilt2 -= multiplier * 400;
} else if (tilt2 < targettilt2) {
tilt2 += multiplier * 400;
}
if (!Animation::animations[animTarget].attack && animTarget != getupfrombackanim && animTarget != getupfromfrontanim) {
- if (tilt2 > 25)
+ if (tilt2 > 25) {
tilt2 = 25;
- if (tilt2 < -25)
+ }
+ if (tilt2 < -25) {
tilt2 = -25;
+ }
}
if (!isnormal(targettilt) && targettilt) {
@@ -5687,8 +6001,9 @@ void Person::DoStuff()
velocity.y += gravity * multiplier * 20;
ReflectVector(&velocity, terrain.getNormal(coords.x, coords.z));
velspeed = findLength(&velocity);
- if (velspeed < speed * 30 * scale)
+ if (velspeed < speed * 30 * scale) {
velspeed = speed * 30 * scale;
+ }
velocity = flatfacing * velspeed;
}
} else if (isRun()) {
@@ -5756,7 +6071,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);
@@ -5827,17 +6141,18 @@ void Person::DoStuff()
velspeed = findLength(&velocity);
}
-
if (animTarget == jumpupanim || animTarget == jumpdownanim || isFlip()) {
velocity.y += gravity * multiplier;
}
- if (animTarget != climbanim && animTarget != hanganim && !isWallJump())
+ if (animTarget != climbanim && animTarget != hanganim && !isWallJump()) {
coords += velocity * multiplier;
+ }
if (coords.y < terrain.getHeight(coords.x, coords.z) && (animTarget == jumpdownanim || animTarget == jumpupanim || isFlip())) {
- if (isFlip() && targetFrame().label == 7)
+ if (isFlip() && targetFrame().label == 7) {
RagDoll(0);
+ }
if (animTarget == jumpupanim) {
jumppower = -4;
@@ -5853,7 +6168,9 @@ void Person::DoStuff()
}
if (animTarget == jumpdownanim || isFlip()) {
- if (isFlip())jumppower = -4;
+ if (isFlip()) {
+ jumppower = -4;
+ }
animTarget = getLanding();
emit_sound_at(landsound, coords, 128.);
@@ -5863,21 +6180,22 @@ void Person::DoStuff()
}
}
- if (animTarget != jumpupanim && animTarget != jumpdownanim && !isFlip() && animTarget != climbanim && animTarget != hanganim && !isWallJump())
+ if (animTarget != jumpupanim && animTarget != jumpdownanim && !isFlip() && animTarget != climbanim && animTarget != hanganim && !isWallJump()) {
coords.y += gravity * multiplier * 2;
+ }
if (animTarget != jumpupanim && animTarget != jumpdownanim && !isFlip() && coords.y < terrain.getHeight(coords.x, coords.z)) {
coords.y = terrain.getHeight(coords.x, coords.z);
onterrain = 1;
}
-
if (isIdle() || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim || animTarget == crouchstabanim || animTarget == swordgroundstabanim || isStop() || animTarget == removeknifeanim || animTarget == crouchremoveknifeanim || isLanding() || isCrouch() || Animation::animations[animTarget].attack || (animTarget == rollanim && targetFrame().label == 6)) {
velspeed = findLength(&velocity);
velocity.y = 0;
if (velspeed < multiplier * 300 * scale) {
velocity = 0;
- } else
+ } else {
velocity -= velocity / velspeed * multiplier * 300 * scale;
+ }
if (velspeed > 5 && (isLanding() || isLandhard())) {
skiddingdelay += multiplier;
if (skiddelay <= 0) {
@@ -5885,17 +6203,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;
@@ -5904,12 +6218,14 @@ void Person::DoStuff()
FootLand(rightfoot, .5);
skiddelay = .02;
}
- } else
+ } else {
skiddingdelay = 0;
+ }
}
- if (skiddingdelay < 0)
+ if (skiddingdelay < 0) {
skiddingdelay += multiplier;
+ }
if (skiddingdelay > .02 && !forwardkeydown && !backkeydown && !leftkeydown && !rightkeydown && !jumpkeydown && isLanding() && !landhard) {
skiddingdelay = -1;
if (!onterrain || environment == grassyenvironment) {
@@ -5924,8 +6240,9 @@ void Person::DoStuff()
Normalise(&terrainnormal);
targetyaw = -asin(0 - terrainnormal.x);
targetyaw *= 360 / 6.28;
- if (terrainnormal.z < 0)
+ if (terrainnormal.z < 0) {
targetyaw = 180 - targetyaw;
+ }
targettilt2 = -asin(terrainnormal.y) * 360 / 6.28; //*-70;
}
@@ -5953,11 +6270,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;
@@ -6017,12 +6333,15 @@ int Person::DrawSkeleton()
XYZ terrainlight;
float terrainheight;
float distance;
- if (!isnormal(yaw))
+ if (!isnormal(yaw)) {
yaw = 0;
- if (!isnormal(tilt))
+ }
+ if (!isnormal(tilt)) {
tilt = 0;
- if (!isnormal(tilt2))
+ }
+ if (!isnormal(tilt2)) {
tilt2 = 0;
+ }
oldplayerdetail = playerdetail;
playerdetail = 0;
if (distsq(&viewer, &coords) < viewdistance * viewdistance / 32 && detail == 2) {
@@ -6034,8 +6353,9 @@ int Person::DrawSkeleton()
if (distsq(&viewer, &coords) < viewdistance * viewdistance / 256 && (detail != 1 && detail != 2)) {
playerdetail = 1;
}
- if (id == 0)
+ if (id == 0) {
playerdetail = 1;
+ }
if (playerdetail != oldplayerdetail) {
updatedelay = 0;
normalsupdatedelay = 0;
@@ -6052,7 +6372,7 @@ int Person::DrawSkeleton()
}
static XYZ mid;
static float M[16];
- static int i, k;
+ static int k;
static int weaponattachmuscle;
static int weaponrotatemuscle;
static XYZ weaponpoint;
@@ -6060,51 +6380,53 @@ 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);
- if (creature == wolftype)
+ if (creature == wolftype) {
IKHelper(this, 1);
+ }
}
if (onterrain && (cond1 && !cond2) && !skeleton.free) {
IKHelper(this, target);
- if (creature == wolftype)
+ if (creature == wolftype) {
IKHelper(this, target);
+ }
}
if (onterrain && (!cond1 && cond2) && !skeleton.free) {
IKHelper(this, 1 - target);
- if (creature == wolftype)
+ if (creature == wolftype) {
IKHelper(this, 1 - target);
+ }
}
}
- if (!skeleton.free && (!Animation::animations[animTarget].attack && animTarget != getupfrombackanim && ((animTarget != rollanim && !isFlip()) || targetFrame().label == 6) && animTarget != getupfromfrontanim && animTarget != wolfrunninganim && animTarget != rabbitrunninganim && animTarget != backhandspringanim && animTarget != walljumpfrontanim && animTarget != hurtidleanim && !isLandhard() && !isSleeping()))
+ if (!skeleton.free && (!Animation::animations[animTarget].attack && animTarget != getupfrombackanim && ((animTarget != rollanim && !isFlip()) || targetFrame().label == 6) && animTarget != getupfromfrontanim && animTarget != wolfrunninganim && animTarget != rabbitrunninganim && animTarget != backhandspringanim && animTarget != walljumpfrontanim && animTarget != hurtidleanim && !isLandhard() && !isSleeping())) {
DoHead();
- else {
+ } else {
targetheadyaw = -targetyaw;
targetheadpitch = 0;
- if (Animation::animations[animTarget].attack == 3)
+ 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 (unsigned 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;
@@ -6139,17 +6461,19 @@ int Person::DrawSkeleton()
start = tailmorphstart;
endthing = tailmorphend;
}
- if (calcrot)
+ if (calcrot) {
skeleton.FindRotationMuscle(i, animTarget);
+ }
mid = (skeleton.muscles[i].parent1->position + skeleton.muscles[i].parent2->position) / 2;
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
- if (!skeleton.free)
+ if (!skeleton.free) {
glRotatef(tilt2, 1, 0, 0);
- if (!skeleton.free)
+ }
+ if (!skeleton.free) {
glRotatef(tilt, 0, 0, 1);
-
+ }
glTranslatef(mid.x, mid.y, mid.z);
@@ -6164,26 +6488,30 @@ int Person::DrawSkeleton()
if (playerdetail || skeleton.free == 3) {
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]];
+ 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)
- glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionbody.x,
- (v0.y * (1 - morphness) + v1.y * morphness) * proportionbody.y,
- (v0.z * (1 - morphness) + v1.z * morphness) * proportionbody.z);
- if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow)
- glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionarms.x,
- (v0.y * (1 - morphness) + v1.y * morphness) * proportionarms.y,
- (v0.z * (1 - morphness) + v1.z * morphness) * proportionarms.z);
- if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee)
- glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionlegs.x,
- (v0.y * (1 - morphness) + v1.y * morphness) * proportionlegs.y,
- (v0.z * (1 - morphness) + v1.z * morphness) * proportionlegs.z);
- if (p1 == head || p2 == head)
- glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionhead.x,
- (v0.y * (1 - morphness) + v1.y * morphness) * proportionhead.y,
- (v0.z * (1 - morphness) + v1.z * morphness) * proportionhead.z);
+ if (p1 == abdomen || p2 == abdomen) {
+ glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportionXYZ(1).x,
+ (v0.y * (1 - morphness) + v1.y * morphness) * getProportionXYZ(1).y,
+ (v0.z * (1 - morphness) + v1.z * morphness) * getProportionXYZ(1).z);
+ }
+ if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) {
+ glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportionXYZ(2).x,
+ (v0.y * (1 - morphness) + v1.y * morphness) * getProportionXYZ(2).y,
+ (v0.z * (1 - morphness) + v1.z * morphness) * getProportionXYZ(2).z);
+ }
+ if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) {
+ glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportionXYZ(3).x,
+ (v0.y * (1 - morphness) + v1.y * morphness) * getProportionXYZ(3).y,
+ (v0.z * (1 - morphness) + v1.z * morphness) * getProportionXYZ(3).z);
+ }
+ if (p1 == head || p2 == head) {
+ glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportionXYZ(0).x,
+ (v0.y * (1 - morphness) + v1.y * morphness) * getProportionXYZ(0).y,
+ (v0.z * (1 - morphness) + v1.z * morphness) * getProportionXYZ(0).z);
+ }
glGetFloatv(GL_MODELVIEW_MATRIX, M);
skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].x = M[12] * scale;
skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].y = M[13] * scale;
@@ -6193,25 +6521,29 @@ int Person::DrawSkeleton()
}
if (!playerdetail || skeleton.free == 3) {
for (unsigned j = 0; j < skeleton.muscles[i].verticeslow.size(); j++) {
- XYZ &v0 = skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]];
+ XYZ& v0 = skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]];
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
- if (p1 == abdomen || p2 == abdomen)
- glTranslatef(v0.x * proportionbody.x,
- v0.y * proportionbody.y,
- v0.z * proportionbody.z);
- if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow)
- glTranslatef(v0.x * proportionarms.x,
- v0.y * proportionarms.y,
- v0.z * proportionarms.z);
- if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee)
- glTranslatef(v0.x * proportionlegs.x,
- v0.y * proportionlegs.y,
- v0.z * proportionlegs.z);
- if (p1 == head || p2 == head)
- glTranslatef(v0.x * proportionhead.x,
- v0.y * proportionhead.y,
- v0.z * proportionhead.z);
+ if (p1 == abdomen || p2 == abdomen) {
+ glTranslatef(v0.x * getProportionXYZ(1).x,
+ v0.y * getProportionXYZ(1).y,
+ v0.z * getProportionXYZ(1).z);
+ }
+ if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) {
+ glTranslatef(v0.x * getProportionXYZ(2).x,
+ v0.y * getProportionXYZ(2).y,
+ v0.z * getProportionXYZ(2).z);
+ }
+ if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) {
+ glTranslatef(v0.x * getProportionXYZ(3).x,
+ v0.y * getProportionXYZ(3).y,
+ v0.z * getProportionXYZ(3).z);
+ }
+ if (p1 == head || p2 == head) {
+ glTranslatef(v0.x * getProportionXYZ(0).x,
+ v0.y * getProportionXYZ(0).y,
+ v0.z * getProportionXYZ(0).z);
+ }
glGetFloatv(GL_MODELVIEW_MATRIX, M);
skeleton.drawmodellow.vertex[skeleton.muscles[i].verticeslow[j]].x = M[12] * scale;
@@ -6228,10 +6560,12 @@ int Person::DrawSkeleton()
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
- if (!skeleton.free)
+ if (!skeleton.free) {
glRotatef(tilt2, 1, 0, 0);
- if (!skeleton.free)
+ }
+ if (!skeleton.free) {
glRotatef(tilt, 0, 0, 1);
+ }
glTranslatef(mid.x, mid.y, mid.z);
skeleton.muscles[i].lastrotate1 = skeleton.muscles[i].rotate1;
glRotatef(-skeleton.muscles[i].lastrotate1 + 90, 0, 1, 0);
@@ -6243,25 +6577,29 @@ int Person::DrawSkeleton()
glRotatef(-skeleton.muscles[i].lastrotate3, 0, 1, 0);
for (unsigned j = 0; j < skeleton.muscles[i].verticesclothes.size(); j++) {
- XYZ &v0 = skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]];
+ XYZ& v0 = skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]];
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
- if (p1 == abdomen || p2 == abdomen)
- glTranslatef(v0.x * proportionbody.x,
- v0.y * proportionbody.y,
- v0.z * proportionbody.z);
- if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow)
- glTranslatef(v0.x * proportionarms.x,
- v0.y * proportionarms.y,
- v0.z * proportionarms.z);
- if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee)
- glTranslatef(v0.x * proportionlegs.x,
- v0.y * proportionlegs.y,
- v0.z * proportionlegs.z);
- if (p1 == head || p2 == head)
- glTranslatef(v0.x * proportionhead.x,
- v0.y * proportionhead.y,
- v0.z * proportionhead.z);
+ if (p1 == abdomen || p2 == abdomen) {
+ glTranslatef(v0.x * getProportionXYZ(1).x,
+ v0.y * getProportionXYZ(1).y,
+ v0.z * getProportionXYZ(1).z);
+ }
+ if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) {
+ glTranslatef(v0.x * getProportionXYZ(2).x,
+ v0.y * getProportionXYZ(2).y,
+ v0.z * getProportionXYZ(2).z);
+ }
+ if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) {
+ glTranslatef(v0.x * getProportionXYZ(3).x,
+ v0.y * getProportionXYZ(3).y,
+ v0.z * getProportionXYZ(3).z);
+ }
+ if (p1 == head || p2 == head) {
+ glTranslatef(v0.x * getProportionXYZ(0).x,
+ v0.y * getProportionXYZ(0).y,
+ v0.z * getProportionXYZ(0).z);
+ }
glGetFloatv(GL_MODELVIEW_MATRIX, M);
skeleton.drawmodelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x = M[12] * scale;
skeleton.drawmodelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y = M[13] * scale;
@@ -6274,17 +6612,22 @@ int Person::DrawSkeleton()
}
if (skeleton.free != 2 && (skeleton.free == 1 || skeleton.free == 3 || id == 0 || (normalsupdatedelay <= 0) || animTarget == getupfromfrontanim || animTarget == getupfrombackanim || animCurrent == getupfromfrontanim || animCurrent == getupfrombackanim)) {
normalsupdatedelay = 1;
- if (playerdetail || skeleton.free == 3)
+ if (playerdetail || skeleton.free == 3) {
skeleton.drawmodel.CalculateNormals(0);
- if (!playerdetail || skeleton.free == 3)
+ }
+ if (!playerdetail || skeleton.free == 3) {
skeleton.drawmodellow.CalculateNormals(0);
- if (skeleton.clothes)
+ }
+ if (skeleton.clothes) {
skeleton.drawmodelclothes.CalculateNormals(0);
+ }
} else {
- if (playerdetail || skeleton.free == 3)
+ if (playerdetail || skeleton.free == 3) {
skeleton.drawmodel.UpdateVertexArrayNoTexNoNorm();
- if (!playerdetail || skeleton.free == 3)
+ }
+ if (!playerdetail || skeleton.free == 3) {
skeleton.drawmodellow.UpdateVertexArrayNoTexNoNorm();
+ }
if (skeleton.clothes) {
skeleton.drawmodelclothes.UpdateVertexArrayNoTexNoNorm();
}
@@ -6292,14 +6635,18 @@ int Person::DrawSkeleton()
}
framemult = .01;
updatedelaychange = -framemult * 4 * (45 - findDistance(&viewer, &coords) * 1);
- if (updatedelaychange > -realmultiplier * 30)
+ if (updatedelaychange > -realmultiplier * 30) {
updatedelaychange = -realmultiplier * 30;
- if (updatedelaychange > -framemult * 4)
+ }
+ if (updatedelaychange > -framemult * 4) {
updatedelaychange = -framemult * 4;
- if (skeleton.free == 1)
+ }
+ if (skeleton.free == 1) {
updatedelaychange *= 6;
- if (id == 0)
+ }
+ if (id == 0) {
updatedelaychange *= 8;
+ }
updatedelay += updatedelaychange;
glMatrixMode(GL_MODELVIEW);
@@ -6315,19 +6662,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);
@@ -6335,6 +6683,7 @@ int Person::DrawSkeleton()
glVertex3f(v2.x, v2.y, v2.z);
glVertex3f(v0.x, v0.y, v0.z);
}
+ }
glEnd();
}
@@ -6342,14 +6691,17 @@ int Person::DrawSkeleton()
terrainlight = terrain.getLighting(coords.x, coords.z);
distance = distsq(&viewer, &coords);
distance = (viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance;
- if (distance > 1)
+ if (distance > 1) {
distance = 1;
+ }
if (distance > 0) {
terrainheight = (coords.y - terrain.getHeight(coords.x, coords.z)) / 3 + 1;
- if (terrainheight < 1)
+ if (terrainheight < 1) {
terrainheight = 1;
- if (terrainheight > 1.7)
+ }
+ if (terrainheight > 1.7) {
terrainheight = 1.7;
+ }
glColor4f((1 - (1 - terrainlight.x) / terrainheight) - burnt, (1 - (1 - terrainlight.y) / terrainheight) - burnt, (1 - (1 - terrainlight.z) / terrainheight) - burnt, distance);
glDisable(GL_BLEND);
@@ -6367,11 +6719,12 @@ int Person::DrawSkeleton()
glDepthMask(0);
glEnable(GL_LIGHTING);
glEnable(GL_BLEND);
- if (canattack && cananger)
+ if (canattack && cananger) {
if (Animation::animations[animTarget].attack == normalattack || Animation::animations[animTarget].attack == reversed) {
glDisable(GL_TEXTURE_2D);
glColor4f(1, 0, 0, 0.8);
}
+ }
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glTranslatef(0, -smoketex, 0);
@@ -6379,20 +6732,22 @@ int Person::DrawSkeleton()
}
if (playerdetail) {
if (!showpoints) {
- if (Tutorial::active && (id != 0))
+ if (Tutorial::active && (id != 0)) {
skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture);
- else
+ } else {
skeleton.drawmodel.draw();
+ }
}
}
if (!playerdetail) {
- if (Tutorial::active && (id != 0))
+ if (Tutorial::active && (id != 0)) {
skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture);
- else
+ } else {
skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr);
+ }
}
- if (!(Animation::animations[animTarget].attack == normalattack || Animation::animations[animTarget].attack == reversed))
+ if (!(Animation::animations[animTarget].attack == normalattack || Animation::animations[animTarget].attack == reversed)) {
if (Tutorial::active && id != 0) {
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
@@ -6401,31 +6756,34 @@ int Person::DrawSkeleton()
glDepthMask(0);
glEnable(GL_LIGHTING);
glEnable(GL_BLEND);
- if (canattack && cananger)
+ if (canattack && cananger) {
if (Animation::animations[animTarget].attack == normalattack || Animation::animations[animTarget].attack == reversed) {
glDisable(GL_TEXTURE_2D);
glColor4f(1, 0, 0, 0.8);
}
+ }
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glTranslatef(0, -smoketex * .6, 0);
glTranslatef(smoketex * .6, 0, 0);
if (playerdetail) {
if (!showpoints) {
- if (Tutorial::active && (id != 0))
+ if (Tutorial::active && (id != 0)) {
skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture);
- else
+ } else {
skeleton.drawmodel.draw();
+ }
}
}
if (!playerdetail) {
- if (Tutorial::active && (id != 0))
+ if (Tutorial::active && (id != 0)) {
skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture);
- else
+ } else {
skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr);
+ }
}
}
-
+ }
if (Tutorial::active && id != 0) {
glPopMatrix();
@@ -6435,10 +6793,12 @@ int Person::DrawSkeleton()
if (skeleton.clothes) {
glDepthMask(0);
glEnable(GL_BLEND);
- if (!immediate)
+ if (!immediate) {
skeleton.drawmodelclothes.draw();
- if (immediate)
+ }
+ if (immediate) {
skeleton.drawmodelclothes.drawimmediate();
+ }
glDepthMask(1);
}
}
@@ -6446,7 +6806,7 @@ 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 (unsigned j = 0; j < skeleton.muscles.size(); j++) {
@@ -6460,8 +6820,9 @@ int Person::DrawSkeleton()
}
}
weaponpoint = (skeleton.muscles[weaponattachmuscle].parent1->position + skeleton.muscles[weaponattachmuscle].parent2->position) / 2;
- if (creature == wolftype)
+ if (creature == wolftype) {
weaponpoint = (jointPos(rightwrist) * .7 + jointPos(righthand) * .3);
+ }
}
if (weapons[i].getType() == staff) {
for (unsigned j = 0; j < skeleton.muscles.size(); j++) {
@@ -6482,17 +6843,21 @@ int Person::DrawSkeleton()
vec2 = (jointPos(rightwrist) - jointPos(rightshoulder));
CrossProduct(&vec1, &vec2, &tempnormthing);
Normalise(&tempnormthing);
- if (animTarget != staffhitanim && animCurrent != staffhitanim && animTarget != staffgroundsmashanim && animCurrent != staffgroundsmashanim && animTarget != staffspinhitanim && animCurrent != staffspinhitanim)
+ if (animTarget != staffhitanim && animCurrent != staffhitanim && animTarget != staffgroundsmashanim && animCurrent != staffgroundsmashanim && animTarget != staffspinhitanim && animCurrent != staffspinhitanim) {
weaponpoint += tempnormthing * .1 - skeleton.specialforward[1] * .3 + (jointPos(rightwrist) - jointPos(rightelbow));
+ }
}
}
if (weaponactive != k && weaponstuck != k) {
- if (weapons[i].getType() == knife)
+ if (weapons[i].getType() == knife) {
weaponpoint = jointPos(abdomen) + (jointPos(righthip) - jointPos(lefthip)) * .1 + (jointPos(rightshoulder) - jointPos(leftshoulder)) * .35;
- if (weapons[i].getType() == sword)
+ }
+ if (weapons[i].getType() == sword) {
weaponpoint = jointPos(abdomen) + (jointPos(lefthip) - jointPos(righthip)) * .09 + (jointPos(leftshoulder) - jointPos(rightshoulder)) * .33;
- if (weapons[i].getType() == staff)
+ }
+ if (weapons[i].getType() == staff) {
weaponpoint = jointPos(abdomen) + (jointPos(lefthip) - jointPos(righthip)) * .09 + (jointPos(leftshoulder) - jointPos(rightshoulder)) * .33;
+ }
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;
@@ -6500,10 +6865,11 @@ int Person::DrawSkeleton()
}
}
if (weaponstuck == k) {
- if (weaponstuckwhere == 0)
+ if (weaponstuckwhere == 0) {
weaponpoint = jointPos(abdomen) * .5 + jointPos(neck) * .5 - skeleton.forward * .8;
- else
+ } else {
weaponpoint = jointPos(abdomen) * .5 + jointPos(neck) * .5 + skeleton.forward * .8;
+ }
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;
@@ -6550,8 +6916,9 @@ int Person::DrawSkeleton()
weapons[i].rotation3 = 0;
weapons[i].smallrotation = -90;
weapons[i].smallrotation2 = 0;
- if (temppoint1.x > temppoint2.x)
+ if (temppoint1.x > temppoint2.x) {
weapons[i].rotation1 = 360 - weapons[i].rotation1;
+ }
}
if ((animCurrent == knifeslashreversalanim && animTarget == knifeslashreversalanim) || (animCurrent == knifeslashreversedanim && animTarget == knifeslashreversedanim)) {
XYZ temppoint1, temppoint2;
@@ -6569,8 +6936,9 @@ int Person::DrawSkeleton()
weapons[i].rotation3 = 0;
weapons[i].smallrotation = 90;
weapons[i].smallrotation2 = 0;
- if (temppoint1.x > temppoint2.x)
+ if (temppoint1.x > temppoint2.x) {
weapons[i].rotation1 = 360 - weapons[i].rotation1;
+ }
}
if (animTarget == knifethrowanim) {
weapons[i].smallrotation = 90;
@@ -6613,8 +6981,9 @@ int Person::DrawSkeleton()
weapons[i].rotation3 = 0;
weapons[i].smallrotation = 90;
weapons[i].smallrotation2 = 0;
- if (temppoint1.x > temppoint2.x)
+ if (temppoint1.x > temppoint2.x) {
weapons[i].rotation1 = 360 - weapons[i].rotation1;
+ }
}
}
if (weapons[i].getType() == staff) {
@@ -6636,8 +7005,9 @@ int Person::DrawSkeleton()
weapons[i].rotation3 = 0;
weapons[i].smallrotation = 90;
weapons[i].smallrotation2 = 0;
- if (temppoint1.x > temppoint2.x)
+ if (temppoint1.x > temppoint2.x) {
weapons[i].rotation1 = 360 - weapons[i].rotation1;
+ }
}
}
}
@@ -6656,10 +7026,11 @@ int Person::DrawSkeleton()
}
}
if (weaponstuck == k) {
- if (weaponstuckwhere == 0)
+ if (weaponstuckwhere == 0) {
weapons[i].smallrotation = 180;
- else
+ } else {
weapons[i].smallrotation = 0;
+ }
weapons[i].smallrotation2 = 10;
}
}
@@ -6667,24 +7038,26 @@ int Person::DrawSkeleton()
}
calcrot = 0;
- if (skeleton.free)
+ if (skeleton.free) {
calcrot = 1;
- if (Animation::animations[animTarget].attack || isRun() || animTarget == staggerbackhardanim || isFlip() || animTarget == climbanim || animTarget == sneakanim || animTarget == rollanim || animTarget == walkanim || animTarget == backhandspringanim || isWallJump())
+ }
+ if (Animation::animations[animTarget].attack || isRun() || animTarget == staggerbackhardanim || isFlip() || animTarget == climbanim || animTarget == sneakanim || animTarget == rollanim || animTarget == walkanim || animTarget == backhandspringanim || isWallJump()) {
calcrot = 1;
- if (animCurrent != animTarget)
+ }
+ if (animCurrent != animTarget) {
calcrot = 1;
- if (skeleton.free == 2)
+ }
+ if (skeleton.free == 2) {
calcrot = 0;
+ }
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;
@@ -6698,41 +7071,48 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate,
oldp1 = *p1;
*p1 = *p1 - *move;
- if (distsq(p1, &model->boundingspherecenter) > radius * radius + model->boundingsphereradius * model->boundingsphereradius)
+ if (distsq(p1, &model->boundingspherecenter) > radius * radius + model->boundingsphereradius * model->boundingsphereradius) {
return -1;
- if (*rotate)
+ }
+ 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)
+ }
+ if (!intersecting) {
intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
&model->vertex[model->Triangles[j].vertex[1]],
p1, &radius);
- if (!intersecting)
+ }
+ if (!intersecting) {
intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[1]],
&model->vertex[model->Triangles[j].vertex[2]],
p1, &radius);
- if (!intersecting)
+ }
+ if (!intersecting) {
intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
&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))
+ if (isFlip() && (frameTarget < 5 || targetFrame().label == 7 || targetFrame().label == 4)) {
RagDoll(0);
+ }
if (animTarget == jumpupanim) {
jumppower = -4;
@@ -6748,8 +7128,9 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate,
}
if ((animTarget == jumpdownanim || isFlip()) && !wasLanding() && !wasLandhard()) {
- if (isFlip())
+ if (isFlip()) {
jumppower = -4;
+ }
animTarget = getLanding();
emit_sound_at(landsound, coords, 128.);
@@ -6768,39 +7149,39 @@ 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)
+ }
+ 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);
- if (!intersecting)
+ }
+ if (!intersecting) {
intersecting = sphere_line_intersection(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, p1->x, p1->y, p1->z, radius / 2);
- if (!intersecting)
+ }
+ 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;
- if (findLengthfast(&start) < findLengthfast(&velocity))
+ 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) {
@@ -6811,15 +7192,70 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate,
}
}
}
- if (*rotate)
+ if (*rotate) {
*p = DoRotation(*p, 0, *rotate, 0);
+ }
*p = *p + *move;
- if (*rotate)
+ if (*rotate) {
*p1 = DoRotation(*p1, 0, *rotate, 0);
+ }
*p1 += *move;
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;
@@ -6859,30 +7295,46 @@ 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;
int tempnum = 0;
alphanum = 255;
for (int i = 0; i < (int)(texture.sizeY * texture.sizeX * bytesPerPixel); i++) {
- if (bytesPerPixel == 3)
+ if (bytesPerPixel == 3) {
alphanum = 255;
- else if ((i + 1) % 4 == 0)
+ } else if ((i + 1) % 4 == 0) {
alphanum = texture.data[i];
+ }
if ((i + 1) % 4 || bytesPerPixel == 3) {
- if ((i % 4) == 0)
+ if ((i % 4) == 0) {
texture.data[i] *= tintr;
- if ((i % 4) == 1)
+ }
+ if ((i % 4) == 1) {
texture.data[i] *= tintg;
- if ((i % 4) == 2)
+ }
+ if ((i % 4) == 2) {
texture.data[i] *= tintb;
+ }
array[tempnum] = (float)array[tempnum] * (1 - alphanum / 255) + (float)texture.data[i] * (alphanum / 255);
tempnum++;
}
@@ -6892,3 +7344,1085 @@ 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 = 0.0f;
+ 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 = 0.0f;
+ 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;
+ }
+ }
+ }
+ 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;
+ }
+ }
+ }
+ 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;
+ float vellength = findLength(&velocity);
+ if (vellength != 0 &&
+ distsq(&Person::players[0]->coords, &coords) < distsq(&rotatetarget, &coords)) {
+ targetpoint += Person::players[0]->velocity *
+ findDistance(&Person::players[0]->coords, &coords) / vellength;
+ }
+ 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);
+ }
+ }
+}