X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;ds=sidebyside;f=Source%2FObjects%2FPerson.cpp;h=9dd5e269cbb04fab7f72d725b2457a35eb42a373;hb=30f342b219632ea3e777388a9530340baf4d7aac;hp=c1eb88dfa28505e5faa17c702c513e4ce83cd310;hpb=b84825978803615f45a9f128232e62431042aec0;p=lugaru.git
diff --git a/Source/Objects/Person.cpp b/Source/Objects/Person.cpp
index c1eb88d..9dd5e26 100644
--- a/Source/Objects/Person.cpp
+++ b/Source/Objects/Person.cpp
@@ -18,16 +18,16 @@ You should have received a copy of the GNU General Public License
along with Lugaru. If not, see .
*/
-/**> HEADER FILES <**/
-#include "Animation/Animation.h"
-#include "Audio/openal_wrapper.h"
-#include "Audio/Sounds.h"
-#include "Level/Awards.h"
-#include "Level/Dialog.h"
-#include "Objects/Person.h"
-#include "Utils/Folders.h"
+#include "Objects/Person.hpp"
-#include "Game.h"
+#include "Animation/Animation.hpp"
+#include "Audio/openal_wrapper.hpp"
+#include "Audio/Sounds.hpp"
+#include "Game.hpp"
+#include "Level/Awards.hpp"
+#include "Level/Dialog.hpp"
+#include "Utils/Folders.hpp"
+#include "Tutorial.hpp"
extern float multiplier;
extern Terrain terrain;
@@ -45,7 +45,6 @@ extern float realtexdetail;
extern GLubyte bloodText[512 * 512 * 3];
extern GLubyte wolfbloodText[512 * 512 * 3];
extern int bloodtoggle;
-extern Objects objects;
extern bool autoslomo;
extern float camerashake;
extern float woozy;
@@ -58,9 +57,7 @@ extern bool freeze;
extern bool winfreeze;
extern bool showpoints;
extern bool immediate;
-extern int tutoriallevel;
extern float smoketex;
-extern int tutorialstage;
extern bool reversaltrain;
extern bool canattack;
extern bool cananger;
@@ -70,6 +67,13 @@ extern float hostiletime;
extern bool gamestarted;
+extern XYZ envsound[30];
+extern float envsoundvol[30];
+extern int numenvsounds;
+extern float envsoundlife[30];
+
+extern XYZ windvector;
+
std::vector> Person::players(1, std::shared_ptr(new Person()));
Person::Person() :
@@ -481,10 +485,10 @@ void Person::CheckKick()
victim->spurt = 1;
DoBlood(.2, 250);
- if (tutoriallevel != 1)
+ if (!Tutorial::active)
emit_sound_at(heavyimpactsound, victim->coords);
victim->RagDoll(0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * 120 * damagemult;
}
victim->Puff(neck);
@@ -532,7 +536,7 @@ void Person::CatchFire()
XYZ flatfacing, flatvelocity;
int howmany;
for (int i = 0; i < 10; i++) {
- howmany = abs(Random() % (skeleton.joints.size()));
+ howmany = fabs(Random() % (skeleton.joints.size()));
if (skeleton.free) {
flatvelocity = skeleton.joints[howmany].velocity;
flatfacing = skeleton.joints[howmany].position * scale + coords;
@@ -682,7 +686,7 @@ void Person::DoBlood(float howmuch, int which)
// FIXME: should abstract out inputs
static int bleedxint, bleedyint;
static XYZ bloodvel;
- if (bloodtoggle && tutoriallevel != 1) {
+ if (bloodtoggle && !Tutorial::active) {
if (bleeding <= 0 && spurt) {
spurt = 0;
for (int i = 0; i < 3; i++) {
@@ -762,7 +766,7 @@ void Person::DoBloodBig(float howmuch, int which)
if (howmuch && id == 0)
blooddimamount = 1;
- if (tutoriallevel != 1 || id == 0)
+ if (!Tutorial::active || id == 0)
if (aitype != playercontrolled && howmuch > 0) {
// play pain sounds
int whichsound = -1;
@@ -792,7 +796,7 @@ void Person::DoBloodBig(float howmuch, int which)
Game::flash(.5, 0);
}
- if (bloodtoggle && decals && tutoriallevel != 1) {
+ if (bloodtoggle && decals && !Tutorial::active) {
if (bleeding <= 0 && spurt) {
spurt = 0;
for (int i = 0; i < 3; i++) {
@@ -947,7 +951,7 @@ void Person::DoBloodBig(float howmuch, int which)
deathbleeding += bleeding;
bloodloss += bleeding * 3;
- if (tutoriallevel != 1 && aitype != playercontrolled && bloodloss > damagetolerance * 2 / 3 && bloodloss < damagetolerance && creature == rabbittype) {
+ if (!Tutorial::active && aitype != playercontrolled && bloodloss > damagetolerance * 2 / 3 && bloodloss < damagetolerance && creature == rabbittype) {
if (abs(Random() % 2) == 0) {
aitype = gethelptype;
lastseentime = 12;
@@ -975,7 +979,7 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where)
float coordsx, coordsy;
float total;
- if (bloodtoggle && decals && tutoriallevel != 1) {
+ if (bloodtoggle && decals && !Tutorial::active) {
where -= coords;
if (!skeleton.free)
where = DoRotation(where, 0, -yaw, 0);
@@ -1160,7 +1164,7 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where)
deathbleeding += bleeding;
bloodloss += bleeding * 3;
- if (tutoriallevel != 1 && aitype != playercontrolled && bloodloss > damagetolerance * 2 / 3 && bloodloss < damagetolerance && creature == rabbittype) {
+ if (!Tutorial::active && aitype != playercontrolled && bloodloss > damagetolerance * 2 / 3 && bloodloss < damagetolerance && creature == rabbittype) {
if (abs(Random() % 2) == 0) {
aitype = gethelptype;
lastseentime = 12;
@@ -1185,7 +1189,7 @@ void Person::Reverse()
|| staggerdelay <= 0)
&& victim->animTarget != jumpupanim
&& victim->animTarget != jumpdownanim
- && (tutoriallevel != 1 || cananger)
+ && (!Tutorial::active || cananger)
&& hostile))
return;
@@ -1488,40 +1492,44 @@ void Person::Reverse()
*/
void Person::DoDamage(float howmuch)
{
- // subtract health (temporary?)
- if (tutoriallevel != 1)
- damage += howmuch / power;
// stats?
- if (id != 0)
- damagedealt += howmuch / power;
- if (id == 0)
+ if (id == 0) {
damagetaken += howmuch / power;
+ } else {
+ damagedealt += howmuch / power;
+ }
// reset bonuses
- if (id == 0 && (bonus == solidhit || bonus == twoxcombo || bonus == threexcombo || bonus == fourxcombo || bonus == megacombo))
+ if (id == 0 && (bonus == solidhit || bonus == twoxcombo || bonus == threexcombo || bonus == fourxcombo || bonus == megacombo)) {
bonus = 0;
+ }
+
// subtract health
- if (tutoriallevel != 1)
+ if (!Tutorial::active) {
+ damage += howmuch / power;
permanentdamage += howmuch / 2 / power;
- if (tutoriallevel != 1)
superpermanentdamage += howmuch / 4 / power;
+ }
// visual effects
if (permanentdamage > damagetolerance / 2 && permanentdamage - howmuch < damagetolerance / 2 && Random() % 2)
DoBlood(1, 255);
if ((permanentdamage > damagetolerance * .8 && Random() % 2 && !deathbleeding) || spurt)
DoBlood(1, 255);
spurt = 0;
- if (id == 0)
+ if (id == 0) {
camerashake += howmuch / 100;
- if (id == 0 && ((howmuch > 50 && damage > damagetolerance / 2)))
- blackout = damage / damagetolerance;
- if (blackout > 1)
- blackout = 1;
+ if ((howmuch > 50 && damage > damagetolerance / 2)) {
+ blackout = damage / damagetolerance;
+ if (blackout > 1) {
+ blackout = 1;
+ }
+ }
+ }
// cancel attack?
- if (aitype == passivetype && damage < damagetolerance && ((tutoriallevel != 1 || cananger) && hostile))
+ if (aitype == passivetype && damage < damagetolerance && ((!Tutorial::active || cananger) && hostile))
aitype = attacktypecutoff;
- if (tutoriallevel != 1 && aitype != playercontrolled && damage < damagetolerance && damage > damagetolerance * 2 / 3 && creature == rabbittype) {
+ if (!Tutorial::active && aitype != playercontrolled && damage < damagetolerance && damage > damagetolerance * 2 / 3 && creature == rabbittype) {
if (abs(Random() % 2) == 0) {
aitype = gethelptype;
lastseentime = 12;
@@ -1533,7 +1541,7 @@ void Person::DoDamage(float howmuch)
if (howmuch > damagetolerance * 50 && skeleton.free != 2) {
XYZ flatvelocity2;
XYZ flatfacing2;
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
if (skeleton.free) {
flatvelocity2 = skeleton.joints[i].velocity;
flatfacing2 = skeleton.joints[i].position * scale + coords;
@@ -1562,7 +1570,7 @@ void Person::DoDamage(float howmuch)
}
// play sounds
- if (tutoriallevel != 1 || id == 0)
+ if (!Tutorial::active || id == 0) {
if (speechdelay <= 0 && !dead && aitype != playercontrolled) {
int whichsound = -1;
@@ -1586,6 +1594,7 @@ void Person::DoDamage(float howmuch)
addEnvSound(coords);
}
}
+ }
speechdelay = .3;
}
@@ -1676,7 +1685,7 @@ void Person::DoHead()
skeleton.specialforward[0] = facing;
//skeleton.specialforward[0]=DoRotation(facing,0,yaw,0);
- for (int i = 0; i < skeleton.muscles.size(); i++) {
+ for (unsigned i = 0; i < skeleton.muscles.size(); i++) {
if (skeleton.muscles[i].visible && (skeleton.muscles[i].parent1->label == head || skeleton.muscles[i].parent2->label == head)) {
skeleton.FindRotationMuscle(i, animTarget);
}
@@ -1690,7 +1699,7 @@ void Person::DoHead()
void Person::RagDoll(bool checkcollision)
{
static XYZ change;
- static int l, i, j;
+ static int l, i;
static float speed;
if (!skeleton.free) {
if (id == 0)
@@ -1722,7 +1731,7 @@ void Person::RagDoll(bool checkcollision)
if (!isnormal(tilt)) tilt = 0;
if (!isnormal(tilt2)) tilt2 = 0;
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
skeleton.joints[i].delay = 0;
skeleton.joints[i].locked = 0;
skeleton.joints[i].position = DoRotation(DoRotation(DoRotation(skeleton.joints[i].position, 0, 0, tilt), tilt2, 0, 0), 0, yaw, 0);
@@ -1733,7 +1742,7 @@ void Person::RagDoll(bool checkcollision)
skeleton.joints[i].realoldposition = skeleton.joints[i].position * scale + coords;
}
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
skeleton.joints[i].velocity = 0;
skeleton.joints[i].velchange = 0;
}
@@ -1754,7 +1763,7 @@ void Person::RagDoll(bool checkcollision)
speed *= speedmult;
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
if ((Animation::animations[animCurrent].attack != reversed || animCurrent == swordslashreversedanim) && animCurrent != rabbitkickanim && !isLanding() && !wasLanding() && Animation::animations[animCurrent].height == Animation::animations[animTarget].height)
skeleton.joints[i].velocity = velocity / scale + facing * 5 + DoRotation(DoRotation(DoRotation((targetFrame().joints[i].position - currentFrame().joints[i].position) * speed, 0, 0, tilt), tilt2, 0, 0), 0, yaw, 0);
else
@@ -1763,30 +1772,29 @@ void Person::RagDoll(bool checkcollision)
change.y = (float)(Random() % 100) / 100;
change.z = (float)(Random() % 100) / 100;
skeleton.joints[i].velocity += change;
- skeleton.joints[abs(Random() % skeleton.joints.size())].velocity -= change;
+ skeleton.joints[fabs(Random() % skeleton.joints.size())].velocity -= change;
change.x = (float)(Random() % 100) / 100;
change.y = (float)(Random() % 100) / 100;
change.z = (float)(Random() % 100) / 100;
skeleton.joints[i].velchange += change;
- skeleton.joints[abs(Random() % skeleton.joints.size())].velchange -= change;
+ skeleton.joints[fabs(Random() % skeleton.joints.size())].velchange -= change;
}
if (checkcollision) {
- XYZ average;
XYZ lowpoint;
XYZ colpoint;
- int howmany;
- average = 0;
- howmany = 0;
- for (j = 0; j < skeleton.joints.size(); j++) {
- average += skeleton.joints[j].position;
- howmany++;
- }
- average /= howmany;
- coords += average * scale;
- for (j = 0; j < skeleton.joints.size(); j++) {
- skeleton.joints[j].position -= average;
+ if (!skeleton.joints.empty()) {
+ XYZ average;
+ average = 0;
+ for (unsigned j = 0; j < skeleton.joints.size(); j++) {
+ average += skeleton.joints[j].position;
+ }
+ average /= skeleton.joints.size();
+ coords += average * scale;
+ for (unsigned j = 0; j < skeleton.joints.size(); j++) {
+ skeleton.joints[j].position -= average;
+ }
}
whichpatchx = coords.x / (terrain.size / subdivision * terrain.scale);
@@ -1796,7 +1804,7 @@ void Person::RagDoll(bool checkcollision)
i = terrain.patchobjects[whichpatchx][whichpatchz][l];
lowpoint = coords;
lowpoint.y += 1;
- if (SphereCheck(&lowpoint, 3, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) {
+ 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;
}
@@ -1807,7 +1815,7 @@ void Person::RagDoll(bool checkcollision)
updatedelay = 0;
velocity = 0;
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
velocity += skeleton.joints[i].velocity * scale;
}
velocity /= skeleton.joints.size();
@@ -2034,9 +2042,9 @@ void Person::DoAnimations()
drawtogglekeydown = 1;
}
//Footstep sounds
- if (tutoriallevel != 1 || id == 0)
+ if (!Tutorial::active || id == 0)
if ((targetFrame().label && (targetFrame().label < 5 || targetFrame().label == 8))) {
- int whichsound;
+ int whichsound = -1;
if (onterrain) {
if (terrain.getOpacity(coords.x, coords.z) < .2) {
if (targetFrame().label == 1)
@@ -2076,32 +2084,38 @@ void Person::DoAnimations()
if (r == 2)
whichsound = highwhooshsound;
}
- if (Animation::animations[animTarget].attack == neutral)
+ if (Animation::animations[animTarget].attack == neutral) {
whichsound = movewhooshsound;
- } else if (targetFrame().label == 4)
+ }
+ } else if (targetFrame().label == 4) {
whichsound = knifeswishsound;
- if (targetFrame().label == 8 && tutoriallevel != 1)
+ }
+ if (targetFrame().label == 8 && !Tutorial::active) {
whichsound = landsound2;
+ }
- emit_sound_at(whichsound, coords, 256.);
+ if (whichsound != -1) {
+ emit_sound_at(whichsound, coords, 256.);
- if (id == 0)
- if (whichsound == footstepsound || whichsound == footstepsound2 || whichsound == footstepsound3 || whichsound == footstepsound4) {
- if (animTarget == wolfrunninganim || animTarget == rabbitrunninganim) {
- addEnvSound(coords, 15);
- } else {
- addEnvSound(coords, 6);
+ if (id == 0) {
+ if (whichsound == footstepsound || whichsound == footstepsound2 || whichsound == footstepsound3 || whichsound == footstepsound4) {
+ if (animTarget == wolfrunninganim || animTarget == rabbitrunninganim) {
+ addEnvSound(coords, 15);
+ } else {
+ addEnvSound(coords, 6);
+ }
}
}
- if (targetFrame().label == 3) {
- whichsound--;
- emit_sound_at(whichsound, coords, 128.);
+ if (targetFrame().label == 3) {
+ whichsound--;
+ emit_sound_at(whichsound, coords, 128.);
+ }
}
}
//Combat sounds
- if (tutoriallevel != 1 || id == 0)
+ if (!Tutorial::active || id == 0)
if (speechdelay <= 0)
if (animTarget != crouchstabanim && animTarget != swordgroundstabanim && animTarget != staffgroundsmashanim)
if ((targetFrame().label && (targetFrame().label < 5 || targetFrame().label == 8))) {
@@ -2195,7 +2209,7 @@ void Person::DoAnimations()
victim->skeleton.free = 1;
victim->skeleton.broken = 0;
- for (int j = 0; j < victim->skeleton.joints.size(); j++) {
+ for (unsigned j = 0; j < victim->skeleton.joints.size(); j++) {
victim->skeleton.joints[j].velchange = 0;
victim->skeleton.joints[j].locked = 0;
}
@@ -2333,7 +2347,7 @@ void Person::DoAnimations()
}
if ((Animation::animations[animTarget].attack == normalattack || animTarget == walljumprightkickanim || animTarget == walljumpleftkickanim) && (!feint) && (victim->skeleton.free != 2 || animTarget == killanim || animTarget == dropkickanim || animTarget == crouchstabanim || animTarget == swordgroundstabanim || animTarget == staffgroundsmashanim)) {
if (animTarget == spinkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
- if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && 3 && Animation::animations[victim->animTarget].height != lowheight) {
+ if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) {
escapednum = 0;
if (id == 0)
camerashake += .4;
@@ -2343,7 +2357,7 @@ void Person::DoAnimations()
if (creature == wolftype)
DoBloodBig(0, 250);
}
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 128.);
}
if (creature == wolftype) {
@@ -2357,7 +2371,7 @@ void Person::DoAnimations()
relative.y = 0;
Normalise(&relative);
relative = DoRotation(relative, 0, -90, 0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(head) += relative * damagemult * 200;
@@ -2369,7 +2383,7 @@ void Person::DoAnimations()
}
if (animTarget == wolfslapanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
- if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && 3 && Animation::animations[victim->animTarget].height != lowheight) {
+ if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) {
escapednum = 0;
if (id == 0)
camerashake += .4;
@@ -2392,7 +2406,7 @@ void Person::DoAnimations()
relative.y -= 1;
Normalise(&relative);
relative = DoRotation(relative, 0, 90, 0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 20;
}
victim->jointVel(head) += relative * damagemult * 100;
@@ -2408,7 +2422,7 @@ void Person::DoAnimations()
camerashake += .4;
victim->spurt = 1;
DoBlood(.2, 250);
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 160.);
}
if (creature == wolftype) {
@@ -2422,7 +2436,7 @@ void Person::DoAnimations()
relative.y = 0;
Normalise(&relative);
relative = DoRotation(relative, 0, -90, 0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(head) += relative * damagemult * 200;
@@ -2443,7 +2457,7 @@ void Person::DoAnimations()
camerashake += .4;
victim->spurt = 1;
DoBlood(.2, 250);
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 160.);
}
if (creature == wolftype) {
@@ -2457,7 +2471,7 @@ void Person::DoAnimations()
relative.y = 0;
Normalise(&relative);
relative = DoRotation(relative, 0, 90, 0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(head) += relative * damagemult * 200;
@@ -2486,7 +2500,7 @@ void Person::DoAnimations()
relative = victim->coords - coords;
relative.y = 0;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 30;
}
victim->jointVel(head) += relative * damagemult * 100;
@@ -2507,7 +2521,7 @@ void Person::DoAnimations()
victim->skeleton.broken = 0;
victim->skeleton.spinny = 1;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velchange = 0;
victim->skeleton.joints[i].delay = 0;
victim->skeleton.joints[i].locked = 0;
@@ -2518,7 +2532,7 @@ void Person::DoAnimations()
relative = 0;
relative.y = 1;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity.y = relative.y * 10;
victim->skeleton.joints[i].position.y += relative.y * .3;
victim->skeleton.joints[i].oldposition.y += relative.y * .3;
@@ -2534,14 +2548,14 @@ void Person::DoAnimations()
escapednum = 0;
if (id == 0)
camerashake += .4;
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, coords, 128.);
}
XYZ relative;
relative = victim->coords - coords;
relative.y = 0;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 90;
}
victim->Puff(abdomen);
@@ -2559,7 +2573,7 @@ void Person::DoAnimations()
escapednum = 0;
if (id == 0)
camerashake += .4;
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(thudsound, coords);
}
@@ -2568,7 +2582,7 @@ void Person::DoAnimations()
victim->skeleton.broken = 0;
victim->skeleton.spinny = 1;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velchange = 0;
//victim->skeleton.joints[i].delay=0;
victim->skeleton.joints[i].locked = 0;
@@ -2578,7 +2592,7 @@ void Person::DoAnimations()
Normalise(&relative);
relative.y += .3;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 20;
}
if (!victim->dead)
@@ -2664,7 +2678,7 @@ void Person::DoAnimations()
victim->skeleton.free = 1;
victim->skeleton.broken = 0;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velchange = 0;
victim->skeleton.joints[i].locked = 0;
//victim->skeleton.joints[i].velocity=0;
@@ -2754,7 +2768,7 @@ void Person::DoAnimations()
victim->skeleton.free = 1;
victim->skeleton.broken = 0;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velchange = 0;
victim->skeleton.joints[i].locked = 0;
//victim->skeleton.joints[i].velocity=0;
@@ -2792,7 +2806,7 @@ void Person::DoAnimations()
victim->spurt = 1;
DoBlood(.2, 235);
}
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 128);
}
@@ -2801,7 +2815,7 @@ void Person::DoAnimations()
relative = victim->coords - coords;
relative.y = 0;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity = relative * 30;
}
victim->jointVel(head) += relative * damagemult * 150;
@@ -2827,15 +2841,15 @@ void Person::DoAnimations()
if (id == 0)
camerashake += .4;
if (victim->damage <= victim->damagetolerance - 60 && normaldotproduct(victim->facing, victim->coords - coords) < (scale * 5) * (scale * 5) * 0 && Animation::animations[victim->animTarget].height != lowheight) {
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(thudsound, victim->coords);
}
} else if (victim->damage <= victim->damagetolerance - 60 && normaldotproduct(victim->facing, victim->coords - coords) < (scale * 5) * (scale * 5) * 0 && Animation::animations[victim->animTarget].height == lowheight) {
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(whooshhitsound, victim->coords);
}
} else {
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords);
}
}
@@ -2848,7 +2862,7 @@ void Person::DoAnimations()
Normalise(&relative);
relative.y = .3;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity = relative * 5;
}
victim->jointVel(abdomen) += relative * damagemult * 400;
@@ -2917,11 +2931,12 @@ void Person::DoAnimations()
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) {
escapednum = 0;
- if (tutoriallevel != 1)
+ if (!Tutorial::active) {
victim->DoBloodBig(1.5 / victim->armorhigh, 225);
+ }
award_bonus(id, Slicebonus);
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(knifeslicesound, victim->coords);
}
//victim->jointVel(abdomen)+=relative*damagemult*200;
@@ -2938,11 +2953,12 @@ void Person::DoAnimations()
if (aitype != playercontrolled)
weaponmissdelay = .6;
- if (tutoriallevel != 1)
- if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody)
+ if (!Tutorial::active) {
+ if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody) {
weapons[weaponids[weaponactive]].bloody = 1;
- if (tutoriallevel != 1)
+ }
weapons[weaponids[weaponactive]].blooddrip += 3;
+ }
XYZ footvel, footpoint;
footvel = 0;
@@ -2951,19 +2967,18 @@ void Person::DoAnimations()
} else {
footpoint = DoRotation((victim->jointPos(abdomen) + victim->jointPos(neck)) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords;
}
- if (tutoriallevel != 1) {
- if (bloodtoggle)
+ if (Tutorial::active) {
+ Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .6, .3);
+ } else {
+ if (bloodtoggle) {
Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .6, .3);
+ }
footvel = DoRotation(facing, 0, 90, 0) * .8;
- //footvel.y-=.3;
Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 7, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9);
Sprite::MakeSprite(bloodsprite, footpoint, DoRotation(footvel * 3, (float)(Random() % 20), (float)(Random() % 20), 0), 1, 1, 1, .05, .9);
Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * 5, 1, 1, 1, .2, 1);
Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * 2, 1, 1, 1, .2, 1);
}
- if (tutoriallevel == 1) {
- Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .6, .3);
- }
victim->DoDamage(damagemult * 0);
}
}
@@ -2972,31 +2987,25 @@ void Person::DoAnimations()
if (victim->weaponactive == -1 || normaldotproduct(victim->facing, victim->coords - coords) > 0 || (Random() % 2 == 0)) {
award_bonus(id, Slashbonus);
escapednum = 0;
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
if (normaldotproduct(victim->facing, victim->coords - coords) < 0)
victim->DoBloodBig(2 / victim->armorhigh, 190);
else
victim->DoBloodBig(2 / victim->armorhigh, 185);
victim->deathbleeding = 1;
emit_sound_at(swordslicesound, victim->coords);
- }
- //victim->jointVel(abdomen)+=relative*damagemult*200;
- if (tutoriallevel != 1) {
victim->frameTarget = 0;
victim->animTarget = staggerbackhardanim;
victim->targetyaw = targetyaw + 180;
victim->target = 0;
- }
-
- if (tutoriallevel != 1) {
- if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody)
+ if (bloodtoggle && !weapons[weaponids[weaponactive]].bloody) {
weapons[weaponids[weaponactive]].bloody = 1;
+ }
weapons[weaponids[weaponactive]].blooddrip += 3;
float bloodlossamount;
bloodlossamount = 200 + abs((float)(Random() % 40)) - 20;
victim->bloodloss += bloodlossamount / victim->armorhigh;
- //victim->bloodloss+=100*(6.5-distsq(&coords,&victim->coords));
victim->DoDamage(damagemult * 0);
XYZ footvel, footpoint;
@@ -3006,8 +3015,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);
@@ -3057,7 +3067,7 @@ void Person::DoAnimations()
if (animTarget == staffhitanim && Animation::animations[animTarget].frames[frameCurrent].label == 5 && victim->animTarget != rollanim) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim && victim->animTarget != sweepanim) {
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
weapons[weaponids[0]].damage += .4 + float(abs(Random() % 100) - 50) / 250;
escapednum = 0;
if (id == 0)
@@ -3075,13 +3085,13 @@ void Person::DoAnimations()
relative = DoRotation(relative, 0, 90, 0);
relative.y -= 1;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 60;
}
victim->jointVel(head) += relative * damagemult * 230;
victim->jointVel(neck) += relative * damagemult * 230;
victim->Puff(head);
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
victim->DoDamage(damagemult * 120 / victim->protectionhigh);
award_bonus(id, solidhit, 30);
@@ -3091,7 +3101,7 @@ void Person::DoAnimations()
if (animTarget == staffspinhitanim && Animation::animations[animTarget].frames[frameCurrent].label == 5 && victim->animTarget != rollanim) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim && victim->animTarget != sweepanim) {
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
weapons[weaponids[0]].damage += .6 + float(abs(Random() % 100) - 50) / 250;
escapednum = 0;
if (id == 0)
@@ -3107,13 +3117,13 @@ void Person::DoAnimations()
relative.y = 0;
Normalise(&relative);
relative = DoRotation(relative, 0, -90, 0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(head) += relative * damagemult * 220;
victim->jointVel(neck) += relative * damagemult * 220;
victim->Puff(head);
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
victim->DoDamage(damagemult * 350 / victim->protectionhead);
award_bonus(id, solidhit, 60);
@@ -3124,7 +3134,7 @@ void Person::DoAnimations()
if (animTarget == staffgroundsmashanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) {
if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5) {
escapednum = 0;
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
if (!victim->dead)
weapons[weaponids[0]].damage += .4 + float(abs(Random() % 100) - 50) / 500;
if (id == 0)
@@ -3138,7 +3148,7 @@ void Person::DoAnimations()
victim->skeleton.free = 1;
victim->skeleton.broken = 0;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velchange = 0;
victim->skeleton.joints[i].locked = 0;
//victim->skeleton.joints[i].velocity=0;
@@ -3150,18 +3160,18 @@ void Person::DoAnimations()
relative.y = -1;
Normalise(&relative);
if (!victim->dead) {
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity = relative * damagemult * 40;
}
victim->jointVel(abdomen) += relative * damagemult * 40;
}
if (victim->dead) {
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity = relative * damagemult * abs(Random() % 20);
}
}
victim->Puff(abdomen);
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
victim->DoDamage(damagemult * 100 / victim->protectionhigh);
if (!victim->dead) {
@@ -3189,11 +3199,11 @@ void Person::DoAnimations()
DoBlood(.2, 250);
}
victim->RagDoll(0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(head) += relative * damagemult * 200;
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 128.);
}
victim->Puff(head);
@@ -3208,7 +3218,7 @@ void Person::DoAnimations()
} else {
if (victim->damage >= victim->damagetolerance)
victim->RagDoll(0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 10;
}
victim->jointVel(abdomen) += relative * damagemult * 200;
@@ -3216,7 +3226,7 @@ void Person::DoAnimations()
victim->animTarget = staggerbackhighanim;
victim->targetyaw = targetyaw + 180;
victim->target = 0;
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(landsound2, victim->coords, 128.);
}
victim->Puff(abdomen);
@@ -3238,7 +3248,7 @@ void Person::DoAnimations()
escapednum = 0;
if (id == 0)
camerashake += .2;
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(landsound2, victim->coords, 128.);
}
XYZ relative;
@@ -3249,12 +3259,12 @@ void Person::DoAnimations()
if (Animation::animations[victim->animTarget].height == middleheight || Animation::animations[victim->animCurrent].height == middleheight || victim->damage >= victim->damagetolerance - 40) {
victim->RagDoll(0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 15;
}
relative = DoRotation(relative, 0, -90, 0);
relative.y += .1;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
if (victim->skeleton.joints[i].label == leftfoot || victim->skeleton.joints[i].label == rightfoot || victim->skeleton.joints[i].label == leftankle || victim->skeleton.joints[i].label == rightankle)
victim->skeleton.joints[i].velocity = relative * 80;
}
@@ -3264,11 +3274,11 @@ void Person::DoAnimations()
} else {
if (victim->damage >= victim->damagetolerance)
victim->RagDoll(0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 10;
}
relative = DoRotation(relative, 0, -90, 0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
if (victim->skeleton.joints[i].label == leftfoot || victim->skeleton.joints[i].label == rightfoot || victim->skeleton.joints[i].label == leftankle || victim->skeleton.joints[i].label == rightankle)
victim->skeleton.joints[i].velocity += relative * damagemult * 80;
}
@@ -3277,7 +3287,7 @@ void Person::DoAnimations()
victim->animTarget = staggerbackhighanim;
victim->targetyaw = targetyaw + 180;
victim->target = 0;
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(landsound2, victim->coords, 128.);
}
victim->Puff(abdomen);
@@ -3298,7 +3308,7 @@ void Person::DoAnimations()
victim->spurt = 1;
DoBlood(.2, 230);
}
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 128.);
}
if (creature == wolftype) {
@@ -3311,7 +3321,7 @@ void Person::DoAnimations()
relative = victim->coords - oldcoords;
relative.y = 0;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(abdomen) += relative * damagemult * 200;
@@ -3348,7 +3358,7 @@ void Person::DoAnimations()
relative = victim->coords - oldcoords;
relative.y = 0;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 30;
}
victim->jointVel(abdomen) += relative * damagemult * 200;
@@ -3367,7 +3377,7 @@ void Person::DoAnimations()
award_bonus(id, staffreversebonus);
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 128.);
}
victim->RagDoll(0);
@@ -3377,7 +3387,7 @@ void Person::DoAnimations()
relative = victim->coords - oldcoords;
relative.y = 0;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 30;
}
victim->jointVel(abdomen) += relative * damagemult * 200;
@@ -3393,7 +3403,7 @@ void Person::DoAnimations()
relative.y = 0;
Normalise(&relative);
relative.y -= .1;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 70;
}
victim->jointVel(lefthand) *= .1;
@@ -3443,7 +3453,7 @@ void Person::DoAnimations()
relative.y = 0;
Normalise(&relative);
relative.y -= .1;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 70;
}
victim->jointVel(lefthand) *= .1 - 1;
@@ -3466,7 +3476,7 @@ void Person::DoAnimations()
victim->spurt = 1;
DoBlood(.2, 230);
}
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 128.);
}
victim->RagDoll(0);
@@ -3475,7 +3485,7 @@ void Person::DoAnimations()
relative.y = 0;
Normalise(&relative);
relative = DoRotation(relative, 0, -90, 0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(abdomen) += relative * damagemult * 200;
@@ -3495,7 +3505,7 @@ void Person::DoAnimations()
Normalise(&relative);
if (victim->id == 0)
relative /= 30;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->damage = victim->damagetolerance;
@@ -3570,12 +3580,12 @@ void Person::DoAnimations()
if (hasvictim && (animTarget == knifefollowanim || animTarget == knifesneakattackanim) && Animation::animations[animTarget].frames[frameCurrent].label == 6) {
escapednum = 0;
victim->velocity = 0;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity = 0;
}
if (animTarget == knifefollowanim) {
victim->RagDoll(0);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity = 0;
}
}
@@ -3628,7 +3638,7 @@ void Person::DoAnimations()
if (hasvictim && animTarget == swordsneakattackanim && Animation::animations[animTarget].frames[frameCurrent].label == 6) {
escapednum = 0;
victim->velocity = 0;
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity = 0;
}
if (weaponactive != -1) {
@@ -3659,7 +3669,7 @@ void Person::DoAnimations()
DoBlood(.2, 240);
}
if (weaponactive == -1) {
- if (tutoriallevel != 1) {
+ if (!Tutorial::active) {
emit_sound_at(heavyimpactsound, victim->coords, 128.);
}
}
@@ -3696,7 +3706,7 @@ void Person::DoAnimations()
relative = DoRotation(relative, 0, 90, 0);
relative.y = .5;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 20;
}
victim->jointVel(head) += relative * damagemult * 200;
@@ -3716,7 +3726,7 @@ void Person::DoAnimations()
relative = DoRotation(relative, 0, 90, 0);
relative.y = .5;
Normalise(&relative);
- for (int i = 0; i < victim->skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 20;
}
victim->jointVel(head) += relative * damagemult * 200;
@@ -3730,7 +3740,7 @@ void Person::DoAnimations()
//Animation end
- if (frameTarget > Animation::animations[animCurrent].frames.size() - 1) {
+ if (frameTarget > int(Animation::animations[animCurrent].frames.size()) - 1) {
frameTarget = 0;
if (wasStop()) {
animTarget = getIdle();
@@ -3808,7 +3818,6 @@ void Person::DoAnimations()
if (!isnormal(coords.x))
coords = oldcoords;
oldcoords = coords;
- collided = 0;
targetoffset = 0;
currentoffset = 0;
grabdelay = 1;
@@ -4183,23 +4192,23 @@ void Person::DoAnimations()
oldrot = 0;
targetrot = 0;
}
- if (frameCurrent >= Animation::animations[animCurrent].frames.size()) {
+ if (frameCurrent >= int(Animation::animations[animCurrent].frames.size())) {
frameCurrent = Animation::animations[animCurrent].frames.size() - 1;
}
if (animCurrent != oldanimCurrent || animTarget != oldanimTarget || ((frameCurrent != oldframeCurrent || frameTarget != oldframeTarget) && !calcrot)) {
//Old rotates
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
skeleton.joints[i].position = currentFrame().joints[i].position;
}
skeleton.FindForwards();
- for (int i = 0; i < skeleton.muscles.size(); i++) {
+ for (unsigned i = 0; i < skeleton.muscles.size(); i++) {
if (skeleton.muscles[i].visible) {
skeleton.FindRotationMuscle(i, animTarget);
}
}
- for (int i = 0; i < skeleton.muscles.size(); i++) {
+ for (unsigned i = 0; i < skeleton.muscles.size(); i++) {
if (skeleton.muscles[i].visible) {
if (isnormal((float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100))
skeleton.muscles[i].oldrotate1 = (float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100;
@@ -4211,18 +4220,18 @@ void Person::DoAnimations()
}
//New rotates
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
skeleton.joints[i].position = targetFrame().joints[i].position;
}
skeleton.FindForwards();
- for (int i = 0; i < skeleton.muscles.size(); i++) {
+ for (unsigned i = 0; i < skeleton.muscles.size(); i++) {
if (skeleton.muscles[i].visible) {
skeleton.FindRotationMuscle(i, animTarget);
}
}
- for (int i = 0; i < skeleton.muscles.size(); i++) {
+ for (unsigned i = 0; i < skeleton.muscles.size(); i++) {
if (skeleton.muscles[i].visible) {
if (isnormal((float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100))
skeleton.muscles[i].newrotate1 = (float)((int)(skeleton.muscles[i].rotate1 * 100) % 36000) / 100;
@@ -4245,12 +4254,12 @@ void Person::DoAnimations()
oldframeTarget = frameTarget;
oldframeCurrent = frameCurrent;
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
skeleton.joints[i].velocity = (currentFrame().joints[i].position * (1 - target) + targetFrame().joints[i].position * (target) - skeleton.joints[i].position) / multiplier;
skeleton.joints[i].position = currentFrame().joints[i].position * (1 - target) + targetFrame().joints[i].position * (target);
}
offset = currentoffset * (1 - target) + targetoffset * target;
- for (int i = 0; i < skeleton.muscles.size(); i++) {
+ for (unsigned i = 0; i < skeleton.muscles.size(); i++) {
if (skeleton.muscles[i].visible) {
skeleton.muscles[i].rotate1 = skeleton.muscles[i].oldrotate1 * (1 - target) + skeleton.muscles[i].newrotate1 * (target);
skeleton.muscles[i].rotate2 = skeleton.muscles[i].oldrotate2 * (1 - target) + skeleton.muscles[i].newrotate2 * (target);
@@ -4281,9 +4290,7 @@ void Person::DoStuff()
static XYZ flatfacing;
static XYZ flatvelocity;
static float flatvelspeed;
- static int i, j, l;
- static XYZ average;
- static int howmany;
+ static int i, l;
static int bloodsize;
static int startx, starty, endx, endy;
static GLubyte color;
@@ -4382,7 +4389,7 @@ void Person::DoStuff()
}
while (flamedelay < 0 && onfire) {
flamedelay += .006;
- howmany = abs(Random() % (skeleton.joints.size()));
+ int howmany = fabs(Random() % (skeleton.joints.size()));
if (skeleton.free) {
flatvelocity = skeleton.joints[howmany].velocity * scale / 2;
flatfacing = skeleton.joints[howmany].position * scale + coords;
@@ -4393,9 +4400,9 @@ void Person::DoStuff()
Sprite::MakeSprite(flamesprite, flatfacing, flatvelocity, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
}
- while (flamedelay < 0 && !onfire && tutoriallevel == 1 && id != 0) {
+ while (flamedelay < 0 && !onfire && Tutorial::active && id != 0) {
flamedelay += .05;
- howmany = abs(Random() % (skeleton.joints.size()));
+ int howmany = fabs(Random() % (skeleton.joints.size()));
if (skeleton.free) {
flatvelocity = skeleton.joints[howmany].velocity * scale / 2;
flatfacing = skeleton.joints[howmany].position * scale + coords;
@@ -4487,7 +4494,7 @@ void Person::DoStuff()
}
dead = 2;
if (animTarget == knifefollowedanim && !skeleton.free) {
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
skeleton.joints[i].velocity = 0;
skeleton.joints[i].velocity.y = -2;
}
@@ -4534,7 +4541,7 @@ void Person::DoStuff()
endy = starty;
for (i = startx; i < endx; i++) {
- for (j = starty; j < endy; j++) {
+ 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)
@@ -4830,12 +4837,12 @@ void Person::DoStuff()
}
if (bloodtoggle && !bled)
for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) {
- j = terrain.patchobjects[whichpatchx][whichpatchz][l];
- XYZ point = DoRotation(headpoint - objects.position[j], 0, -objects.yaw[j], 0);
+ int j = terrain.patchobjects[whichpatchx][whichpatchz][l];
+ XYZ point = DoRotation(headpoint - Object::objects[j]->position, 0, -Object::objects[j]->yaw, 0);
float size = .8;
float opacity = .6;
float yaw = 0;
- objects.model[j].MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw);
+ Object::objects[j]->model.MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw);
}
bled = 1;
}
@@ -4925,7 +4932,7 @@ void Person::DoStuff()
dead = 0;
skeleton.free = 1;
damage -= 20;
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
skeleton.joints[i].velocity = 0;
}
}
@@ -4997,21 +5004,22 @@ void Person::DoStuff()
award_bonus(id, deepimpact);
DoDamage(damageamount / ((protectionhigh + protectionhead + protectionlow) / 3));
+ XYZ average;
average = 0;
- howmany = 0;
- for (j = 0; j < skeleton.joints.size(); j++) {
- average += skeleton.joints[j].position;
- howmany++;
- }
- average /= howmany;
- coords += average * scale;
- for (j = 0; j < skeleton.joints.size(); j++) {
- skeleton.joints[j].position -= average;
+ if (!skeleton.joints.empty()) {
+ for (unsigned j = 0; j < skeleton.joints.size(); j++) {
+ average += skeleton.joints[j].position;
+ }
+ average /= skeleton.joints.size();
+ coords += average * scale;
+ for (unsigned j = 0; j < skeleton.joints.size(); j++) {
+ skeleton.joints[j].position -= average;
+ }
+ average /= multiplier;
}
- average /= multiplier;
velocity = 0;
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
velocity += skeleton.joints[i].velocity * scale;
}
velocity /= skeleton.joints.size();
@@ -5039,12 +5047,12 @@ void Person::DoStuff()
}
if (bloodtoggle && !bled)
for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) {
- j = terrain.patchobjects[whichpatchx][whichpatchz][l];
- XYZ point = DoRotation(headpoint - objects.position[j], 0, -objects.yaw[j], 0);
+ int j = terrain.patchobjects[whichpatchx][whichpatchz][l];
+ XYZ point = DoRotation(headpoint - Object::objects[j]->position, 0, -Object::objects[j]->yaw, 0);
float size = .2 * 1.2;
float opacity = .6;
float yaw = 0;
- objects.model[j].MakeDecal(blooddecal, &point, &size, &opacity, &yaw);
+ Object::objects[j]->model.MakeDecal(blooddecal, &point, &size, &opacity, &yaw);
}
bled = 1;
}
@@ -5058,12 +5066,12 @@ void Person::DoStuff()
}
if (bloodtoggle && !bled)
for (l = 0; l < terrain.patchobjectnum[whichpatchx][whichpatchz]; l++) {
- j = terrain.patchobjects[whichpatchx][whichpatchz][l];
- XYZ point = DoRotation(headpoint - objects.position[j], 0, -objects.yaw[j], 0);
+ int j = terrain.patchobjects[whichpatchx][whichpatchz][l];
+ XYZ point = DoRotation(headpoint - Object::objects[j]->position, 0, -Object::objects[j]->yaw, 0);
float size = .8;
float opacity = .6;
float yaw = 0;
- objects.model[j].MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw);
+ Object::objects[j]->model.MakeDecal(blooddecalslow, &point, &size, &opacity, &yaw);
}
bled = 1;
}
@@ -5080,11 +5088,11 @@ void Person::DoStuff()
canrecover = 0;
if (velocity.y < -30)
canrecover = 0;
- for (i = 0; i < objects.numobjects; i++) {
- if (objects.type[i] != treeleavestype && objects.type[i] != bushtype && objects.type[i] != firetype) {
+ for (i = 0; i < Object::objects.size(); i++) {
+ if (Object::objects[i]->type != treeleavestype && Object::objects[i]->type != bushtype && Object::objects[i]->type != firetype) {
colviewer = startpoint;
coltarget = endpoint;
- if (objects.model[i].LineCheck(&colviewer, &coltarget, &colpoint, &objects.position[i], &objects.yaw[i]) != -1)
+ if (Object::objects[i]->model.LineCheck(&colviewer, &coltarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1)
canrecover = 0;
}
}
@@ -5125,7 +5133,7 @@ void Person::DoStuff()
frameCurrent = 0;
target = 0;
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
tempanimation.frames[0].joints[i].position = skeleton.joints[i].position;
tempanimation.frames[0].joints[i].position = DoRotation(tempanimation.frames[0].joints[i].position, 0, -yaw, 0);
}
@@ -5216,7 +5224,7 @@ void Person::DoStuff()
if (middle.y > 0 && animTarget != rollanim)
targetoffset.y = middle.y + 1;
- for (int i = 0; i < skeleton.joints.size(); i++) {
+ for (unsigned i = 0; i < skeleton.joints.size(); i++) {
tempanimation.frames[0].joints[i].position = skeleton.joints[i].position;
tempanimation.frames[0].joints[i].position = DoRotation(tempanimation.frames[0].joints[i].position, 0, -yaw, 0);
}
@@ -5272,36 +5280,36 @@ void Person::DoStuff()
if (aitype != passivetype || skeleton.free == 1)
if (findLengthfast(&velocity) > .1)
- for (i = 0; i < objects.numobjects; i++) {
- if (objects.type[i] == firetype)
- if (distsqflat(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 12 && distsq(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 49) {
+ for (i = 0; i < Object::objects.size(); i++) {
+ if (Object::objects[i]->type == firetype)
+ if (distsqflat(&coords, &Object::objects[i]->position) < Object::objects[i]->scale*Object::objects[i]->scale * 12 && distsq(&coords, &Object::objects[i]->position) < Object::objects[i]->scale*Object::objects[i]->scale * 49) {
if (onfire) {
- if (!objects.onfire[i]) {
- emit_sound_at(firestartsound, objects.position[i]);
+ if (!Object::objects[i]->onfire) {
+ emit_sound_at(firestartsound, Object::objects[i]->position);
}
- objects.onfire[i] = 1;
+ Object::objects[i]->onfire = 1;
}
if (!onfire) {
- if (objects.onfire[i]) {
+ if (Object::objects[i]->onfire) {
CatchFire();
}
}
}
- if (objects.type[i] == bushtype)
- if (distsqflat(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 12 && distsq(&coords, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 49) {
+ if (Object::objects[i]->type == bushtype)
+ if (distsqflat(&coords, &Object::objects[i]->position) < Object::objects[i]->scale*Object::objects[i]->scale * 12 && distsq(&coords, &Object::objects[i]->position) < Object::objects[i]->scale*Object::objects[i]->scale * 49) {
if (onfire) {
- if (!objects.onfire[i]) {
- emit_sound_at(firestartsound, objects.position[i]);
+ if (!Object::objects[i]->onfire) {
+ emit_sound_at(firestartsound, Object::objects[i]->position);
}
- objects.onfire[i] = 1;
+ Object::objects[i]->onfire = 1;
}
if (!onfire) {
- if (objects.onfire[i]) {
+ if (Object::objects[i]->onfire) {
CatchFire();
}
}
- if (objects.messedwith[i] <= 0) {
+ if (Object::objects[i]->messedwith <= 0) {
XYZ tempvel;
XYZ pos;
@@ -5311,14 +5319,14 @@ void Person::DoStuff()
addEnvSound(coords, 4 * findLength(&velocity));
}
- int howmany;
+ int howmany = 0;
if (environment == grassyenvironment)
howmany = findLength(&velocity) * 4;
if (environment == snowyenvironment)
howmany = findLength(&velocity) * 2;
if (detail == 2)
if (environment != desertenvironment)
- for (j = 0; j < howmany; j++) {
+ for (int j = 0; j < howmany; j++) {
tempvel.x = float(abs(Random() % 100) - 50) / 20;
tempvel.y = float(abs(Random() % 100) - 50) / 20;
tempvel.z = float(abs(Random() % 100) - 50) / 20;
@@ -5333,7 +5341,7 @@ void Person::DoStuff()
howmany = findLength(&velocity) * 4;
if (detail == 2)
if (environment == snowyenvironment)
- for (j = 0; j < howmany; j++) {
+ for (int j = 0; j < howmany; j++) {
tempvel.x = float(abs(Random() % 100) - 50) / 20;
tempvel.y = float(abs(Random() % 100) - 50) / 20;
tempvel.z = float(abs(Random() % 100) - 50) / 20;
@@ -5346,22 +5354,22 @@ void Person::DoStuff()
Sprite::setLastSpriteSpecial(2);
}
}
- objects.rotx[i] += velocity.x * multiplier * 6;
- objects.roty[i] += velocity.z * multiplier * 6;
- objects.messedwith[i] = .5;
+ Object::objects[i]->rotx += velocity.x * multiplier * 6;
+ Object::objects[i]->roty += velocity.z * multiplier * 6;
+ Object::objects[i]->messedwith = .5;
}
XYZ tempcoord;
- if (objects.type[i] == treeleavestype && environment != desertenvironment) {
- if (objects.pitch[i] == 0)
+ if (Object::objects[i]->type == treeleavestype && environment != desertenvironment) {
+ if (Object::objects[i]->pitch == 0)
tempcoord = coords;
else {
- tempcoord = coords - objects.position[i];
- tempcoord = DoRotation(tempcoord, 0, -objects.yaw[i], 0);
- tempcoord = DoRotation(tempcoord, -objects.pitch[i], 0, 0);
- tempcoord += objects.position[i];
+ tempcoord = coords - Object::objects[i]->position;
+ tempcoord = DoRotation(tempcoord, 0, -Object::objects[i]->yaw, 0);
+ tempcoord = DoRotation(tempcoord, -Object::objects[i]->pitch, 0, 0);
+ tempcoord += Object::objects[i]->position;
}
- if (distsqflat(&tempcoord, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 8 && distsq(&tempcoord, &objects.position[i]) < objects.scale[i]*objects.scale[i] * 300 && tempcoord.y > objects.position[i].y + 3 * objects.scale[i]) {
- if (objects.messedwith[i] <= 0) {
+ if (distsqflat(&tempcoord, &Object::objects[i]->position) < Object::objects[i]->scale*Object::objects[i]->scale * 8 && distsq(&tempcoord, &Object::objects[i]->position) < Object::objects[i]->scale*Object::objects[i]->scale * 300 && tempcoord.y > Object::objects[i]->position.y + 3 * Object::objects[i]->scale) {
+ if (Object::objects[i]->messedwith <= 0) {
XYZ tempvel;
XYZ pos;
@@ -5371,14 +5379,14 @@ void Person::DoStuff()
addEnvSound(coords, 4 * findLength(&velocity));
}
- int howmany;
+ int howmany = 0;
if (environment == grassyenvironment)
howmany = findLength(&velocity) * 4;
if (environment == snowyenvironment)
howmany = findLength(&velocity) * 2;
if (detail == 2)
if (environment != desertenvironment)
- for (j = 0; j < howmany; j++) {
+ for (int j = 0; j < howmany; j++) {
tempvel.x = float(abs(Random() % 100) - 50) / 20;
tempvel.y = float(abs(Random() % 100) - 50) / 20;
tempvel.z = float(abs(Random() % 100) - 50) / 20;
@@ -5394,7 +5402,7 @@ void Person::DoStuff()
howmany = findLength(&velocity) * 4;
if (detail == 2)
if (environment == snowyenvironment)
- for (j = 0; j < howmany; j++) {
+ for (int j = 0; j < howmany; j++) {
tempvel.x = float(abs(Random() % 100) - 50) / 20;
tempvel.y = float(abs(Random() % 100) - 50) / 20;
tempvel.z = float(abs(Random() % 100) - 50) / 20;
@@ -5408,7 +5416,7 @@ void Person::DoStuff()
Sprite::setLastSpriteSpecial(2);
}
}
- objects.messedwith[i] = .5;
+ Object::objects[i]->messedwith = .5;
}
}
}
@@ -5421,7 +5429,7 @@ void Person::DoStuff()
if (hasvictim)
if (aitype != passivetype && victim->skeleton.free && !victim->dead)
play = 1;
- if (tutoriallevel == 1 && id != 0)
+ if (Tutorial::active && id != 0)
play = 0;
if (play && aitype != playercontrolled) {
int whichsound = -1;
@@ -6051,7 +6059,7 @@ int Person::DrawSkeleton()
}
static XYZ mid;
static float M[16];
- static int i, j, k;
+ static int i, k;
static int weaponattachmuscle;
static int weaponrotatemuscle;
static XYZ weaponpoint;
@@ -6103,7 +6111,7 @@ int Person::DrawSkeleton()
skeleton.drawmodelclothes.vertex[i] = 0;
skeleton.drawmodelclothes.vertex[i].y = 999;
}
- for (int i = 0; i < skeleton.muscles.size(); i++) {
+ for (unsigned 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;
@@ -6162,7 +6170,7 @@ int Person::DrawSkeleton()
glRotatef(-skeleton.muscles[i].lastrotate3, 0, 1, 0);
if (playerdetail || skeleton.free == 3) {
- for (j = 0; j < skeleton.muscles[i].vertices.size(); j++) {
+ for (unsigned j = 0; j < skeleton.muscles[i].vertices.size(); j++) {
XYZ &v0 = skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]];
XYZ &v1 = skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]];
glMatrixMode(GL_MODELVIEW);
@@ -6191,7 +6199,7 @@ int Person::DrawSkeleton()
}
}
if (!playerdetail || skeleton.free == 3) {
- for (j = 0; j < skeleton.muscles[i].verticeslow.size(); j++) {
+ for (unsigned j = 0; j < skeleton.muscles[i].verticeslow.size(); j++) {
XYZ &v0 = skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]];
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
@@ -6241,7 +6249,7 @@ int Person::DrawSkeleton()
skeleton.muscles[i].lastrotate3 = skeleton.muscles[i].rotate3;
glRotatef(-skeleton.muscles[i].lastrotate3, 0, 1, 0);
- for (j = 0; j < skeleton.muscles[i].verticesclothes.size(); j++) {
+ for (unsigned j = 0; j < skeleton.muscles[i].verticesclothes.size(); j++) {
XYZ &v0 = skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]];
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
@@ -6361,7 +6369,7 @@ int Person::DrawSkeleton()
glEnable(GL_LIGHTING);
glEnable(GL_BLEND);
}
- if (tutoriallevel && id != 0) {
+ if (Tutorial::active && id != 0) {
glColor4f(.7, .7, .7, 0.6);
glDepthMask(0);
glEnable(GL_LIGHTING);
@@ -6378,21 +6386,21 @@ int Person::DrawSkeleton()
}
if (playerdetail) {
if (!showpoints) {
- if ((tutoriallevel && id != 0))
+ if (Tutorial::active && (id != 0))
skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture);
else
skeleton.drawmodel.draw();
}
}
if (!playerdetail) {
- if ((tutoriallevel && id != 0))
+ if (Tutorial::active && (id != 0))
skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture);
else
skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr);
}
if (!(Animation::animations[animTarget].attack == normalattack || Animation::animations[animTarget].attack == reversed))
- if (tutoriallevel && id != 0) {
+ if (Tutorial::active && id != 0) {
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
@@ -6411,14 +6419,14 @@ int Person::DrawSkeleton()
glTranslatef(smoketex * .6, 0, 0);
if (playerdetail) {
if (!showpoints) {
- if ((tutoriallevel && id != 0))
+ if (Tutorial::active && (id != 0))
skeleton.drawmodel.drawdifftex(Sprite::cloudimpacttexture);
else
skeleton.drawmodel.draw();
}
}
if (!playerdetail) {
- if ((tutoriallevel && id != 0))
+ if (Tutorial::active && (id != 0))
skeleton.drawmodellow.drawdifftex(Sprite::cloudimpacttexture);
else
skeleton.drawmodellow.drawdifftex(skeleton.drawmodel.textureptr);
@@ -6426,7 +6434,7 @@ int Person::DrawSkeleton()
}
- if (tutoriallevel && id != 0) {
+ if (Tutorial::active && id != 0) {
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
@@ -6448,12 +6456,12 @@ int Person::DrawSkeleton()
i = weaponids[k];
if (weaponactive == k) {
if (weapons[i].getType() != staff) {
- for (j = 0; j < skeleton.muscles.size(); j++) {
+ for (unsigned j = 0; j < skeleton.muscles.size(); j++) {
if ((skeleton.muscles[j].parent1->label == righthand || skeleton.muscles[j].parent2->label == righthand) && skeleton.muscles[j].vertices.size() > 0) {
weaponattachmuscle = j;
}
}
- for (j = 0; j < skeleton.muscles.size(); j++) {
+ for (unsigned j = 0; j < skeleton.muscles.size(); j++) {
if ((skeleton.muscles[j].parent1->label == rightwrist || skeleton.muscles[j].parent2->label == rightwrist) && (skeleton.muscles[j].parent1->label != righthand && skeleton.muscles[j].parent2->label != righthand) && skeleton.muscles[j].vertices.size() > 0) {
weaponrotatemuscle = j;
}
@@ -6463,12 +6471,12 @@ int Person::DrawSkeleton()
weaponpoint = (jointPos(rightwrist) * .7 + jointPos(righthand) * .3);
}
if (weapons[i].getType() == staff) {
- for (j = 0; j < skeleton.muscles.size(); j++) {
+ for (unsigned j = 0; j < skeleton.muscles.size(); j++) {
if ((skeleton.muscles[j].parent1->label == righthand || skeleton.muscles[j].parent2->label == righthand) && skeleton.muscles[j].vertices.size() > 0) {
weaponattachmuscle = j;
}
}
- for (j = 0; j < skeleton.muscles.size(); j++) {
+ for (unsigned j = 0; j < skeleton.muscles.size(); j++) {
if ((skeleton.muscles[j].parent1->label == rightelbow || skeleton.muscles[j].parent2->label == rightelbow) && (skeleton.muscles[j].parent1->label != rightshoulder && skeleton.muscles[j].parent2->label != rightshoulder) && skeleton.muscles[j].vertices.size() > 0) {
weaponrotatemuscle = j;
}
@@ -6492,7 +6500,7 @@ int Person::DrawSkeleton()
weaponpoint = jointPos(abdomen) + (jointPos(lefthip) - jointPos(righthip)) * .09 + (jointPos(leftshoulder) - jointPos(rightshoulder)) * .33;
if (weapons[i].getType() == staff)
weaponpoint = jointPos(abdomen) + (jointPos(lefthip) - jointPos(righthip)) * .09 + (jointPos(leftshoulder) - jointPos(rightshoulder)) * .33;
- for (j = 0; j < skeleton.muscles.size(); j++) {
+ for (unsigned j = 0; j < skeleton.muscles.size(); j++) {
if ((skeleton.muscles[j].parent1->label == abdomen || skeleton.muscles[j].parent2->label == abdomen) && (skeleton.muscles[j].parent1->label == neck || skeleton.muscles[j].parent2->label == neck) && skeleton.muscles[j].vertices.size() > 0) {
weaponrotatemuscle = j;
}
@@ -6503,7 +6511,7 @@ int Person::DrawSkeleton()
weaponpoint = jointPos(abdomen) * .5 + jointPos(neck) * .5 - skeleton.forward * .8;
else
weaponpoint = jointPos(abdomen) * .5 + jointPos(neck) * .5 + skeleton.forward * .8;
- for (j = 0; j < skeleton.muscles.size(); j++) {
+ for (unsigned j = 0; j < skeleton.muscles.size(); j++) {
if ((skeleton.muscles[j].parent1->label == abdomen || skeleton.muscles[j].parent2->label == abdomen) && (skeleton.muscles[j].parent1->label == neck || skeleton.muscles[j].parent2->label == neck) && skeleton.muscles[j].vertices.size() > 0) {
weaponrotatemuscle = j;
}
@@ -6819,6 +6827,51 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate,
return firstintersecting;
}
+int findPathDist(int start, int end)
+{
+ int smallestcount, count, connected;
+ int last, last2, last3, last4;
+ int closest;
+
+ smallestcount = 1000;
+ for (int i = 0; i < 50; i++) {
+ count = 0;
+ last = start;
+ last2 = -1;
+ last3 = -1;
+ 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;
@@ -6891,3 +6944,983 @@ bool Person::addClothes(const int& clothesId)
return 0;
}
}
+
+void Person::doAI()
+{
+ if (aitype != playercontrolled && !Dialog::inDialog()) {
+ jumpclimb = 0;
+ //disable movement in editor
+ if (Game::editorenabled)
+ stunned = 1;
+
+ pause = 0;
+ if (distsqflat(&Person::players[0]->coords, &coords) < 30 &&
+ Person::players[0]->coords.y > coords.y + 2 &&
+ !Person::players[0]->onterrain)
+ pause = 1;
+
+ //pathfinding
+ if (aitype == pathfindtype) {
+ if (finalpathfindpoint == -1) {
+ float closestdistance;
+ float tempdist;
+ int closest;
+ XYZ colpoint;
+ closest = -1;
+ closestdistance = -1;
+ for (int j = 0; j < Game::numpathpoints; j++) {
+ if (closest == -1 || distsq(&finalfinaltarget, &Game::pathpoint[j]) < closestdistance) {
+ closestdistance = distsq(&finalfinaltarget, &Game::pathpoint[j]);
+ closest = j;
+ finaltarget = Game::pathpoint[j];
+ }
+ }
+ finalpathfindpoint = closest;
+ for (int j = 0; j < Game::numpathpoints; j++) {
+ for (int k = 0; k < Game::numpathpointconnect[j]; k++) {
+ DistancePointLine(&finalfinaltarget, &Game::pathpoint[j], &Game::pathpoint[Game::pathpointconnect[j][k]], &tempdist, &colpoint);
+ if (sq(tempdist) < closestdistance)
+ if (findDistance(&colpoint, &Game::pathpoint[j]) + findDistance(&colpoint, &Game::pathpoint[Game::pathpointconnect[j][k]]) <
+ findDistance(&Game::pathpoint[j], &Game::pathpoint[Game::pathpointconnect[j][k]]) + .1) {
+ closestdistance = sq(tempdist);
+ closest = j;
+ finaltarget = colpoint;
+ }
+ }
+ }
+ finalpathfindpoint = closest;
+
+ }
+ if (targetpathfindpoint == -1) {
+ float closestdistance;
+ float tempdist;
+ int closest;
+ XYZ colpoint;
+ closest = -1;
+ closestdistance = -1;
+ if (lastpathfindpoint == -1) {
+ for (int j = 0; j < Game::numpathpoints; j++) {
+ if (j != lastpathfindpoint)
+ if (closest == -1 || (distsq(&coords, &Game::pathpoint[j]) < closestdistance)) {
+ closestdistance = distsq(&coords, &Game::pathpoint[j]);
+ closest = j;
+ }
+ }
+ targetpathfindpoint = closest;
+ for (int j = 0; j < Game::numpathpoints; j++)
+ if (j != lastpathfindpoint)
+ for (int k = 0; k < Game::numpathpointconnect[j]; k++) {
+ DistancePointLine(&coords, &Game::pathpoint[j], &Game::pathpoint[Game::pathpointconnect[j][k]], &tempdist, &colpoint );
+ if (sq(tempdist) < closestdistance) {
+ if (findDistance(&colpoint, &Game::pathpoint[j]) + findDistance(&colpoint, &Game::pathpoint[Game::pathpointconnect[j][k]]) <
+ findDistance(&Game::pathpoint[j], &Game::pathpoint[Game::pathpointconnect[j][k]]) + .1) {
+ closestdistance = sq(tempdist);
+ closest = j;
+ }
+ }
+ }
+ targetpathfindpoint = closest;
+ } else {
+ for (int j = 0; j < Game::numpathpoints; j++)
+ if (j != lastpathfindpoint &&
+ j != lastpathfindpoint2 &&
+ j != lastpathfindpoint3 &&
+ j != lastpathfindpoint4) {
+ bool connected = 0;
+ if (Game::numpathpointconnect[j])
+ for (int k = 0; k < Game::numpathpointconnect[j]; k++)
+ if (Game::pathpointconnect[j][k] == lastpathfindpoint)
+ connected = 1;
+ if (!connected)
+ if (Game::numpathpointconnect[lastpathfindpoint])
+ for (int k = 0; k < Game::numpathpointconnect[lastpathfindpoint]; k++)
+ if (Game::pathpointconnect[lastpathfindpoint][k] == j)
+ connected = 1;
+ if (connected) {
+ tempdist = findPathDist(j, finalpathfindpoint);
+ if (closest == -1 || tempdist < closestdistance) {
+ closestdistance = tempdist;
+ closest = j;
+ }
+ }
+ }
+ targetpathfindpoint = closest;
+ }
+ }
+ losupdatedelay -= multiplier;
+
+ targetyaw = roughDirectionTo(coords, Game::pathpoint[targetpathfindpoint]);
+ lookyaw = targetyaw;
+
+ //reached target point
+ if (distsqflat(&coords, &Game::pathpoint[targetpathfindpoint]) < .6) {
+ lastpathfindpoint4 = lastpathfindpoint3;
+ lastpathfindpoint3 = lastpathfindpoint2;
+ lastpathfindpoint2 = lastpathfindpoint;
+ lastpathfindpoint = targetpathfindpoint;
+ if (lastpathfindpoint2 == -1)
+ lastpathfindpoint2 = lastpathfindpoint;
+ if (lastpathfindpoint3 == -1)
+ lastpathfindpoint3 = lastpathfindpoint2;
+ if (lastpathfindpoint4 == -1)
+ lastpathfindpoint4 = lastpathfindpoint3;
+ targetpathfindpoint = -1;
+ }
+ if ( distsqflat(&coords, &finalfinaltarget) <
+ distsqflat(&coords, &finaltarget) ||
+ distsqflat(&coords, &finaltarget) < .6 * sq(scale * 5) ||
+ lastpathfindpoint == finalpathfindpoint) {
+ aitype = passivetype;
+ }
+
+ forwardkeydown = 1;
+ leftkeydown = 0;
+ backkeydown = 0;
+ rightkeydown = 0;
+ crouchkeydown = 0;
+ attackkeydown = 0;
+ throwkeydown = 0;
+
+ if (avoidcollided > .8 && !jumpkeydown && collided < .8)
+ targetyaw += 90 * (whichdirection * 2 - 1);
+
+ if (collided < 1 || animTarget != jumpupanim)
+ jumpkeydown = 0;
+ if ((collided > .8 && jumppower >= 5))
+ jumpkeydown = 1;
+
+ if ((!Tutorial::active || cananger) &&
+ hostile &&
+ !Person::players[0]->dead &&
+ distsq(&coords, &Person::players[0]->coords) < 400 &&
+ occluded < 25) {
+ if (distsq(&coords, &Person::players[0]->coords) < 12 &&
+ Animation::animations[Person::players[0]->animTarget].height != lowheight &&
+ !Game::editorenabled &&
+ (Person::players[0]->coords.y < coords.y + 5 || Person::players[0]->onterrain))
+ aitype = attacktypecutoff;
+ if (distsq(&coords, &Person::players[0]->coords) < 30 &&
+ Animation::animations[Person::players[0]->animTarget].height == highheight &&
+ !Game::editorenabled)
+ aitype = attacktypecutoff;
+
+ if (losupdatedelay < 0 && !Game::editorenabled && occluded < 2) {
+ losupdatedelay = .2;
+ for (unsigned j = 0; j < Person::players.size(); j++)
+ if (j == 0 || Person::players[j]->skeleton.free || Person::players[j]->aitype != passivetype)
+ if (abs(Random() % 2) || Animation::animations[Person::players[j]->animTarget].height != lowheight || j != 0)
+ if (distsq(&coords, &Person::players[j]->coords) < 400)
+ if (normaldotproduct(facing, Person::players[j]->coords - coords) > 0)
+ if (Person::players[j]->coords.y < coords.y + 5 || Person::players[j]->onterrain)
+ if (!Person::players[j]->isWallJump() && -1 == Object::checkcollide(
+ DoRotation(jointPos(head), 0, yaw, 0)
+ *scale + coords,
+ DoRotation(Person::players[j]->jointPos(head), 0, Person::players[j]->yaw, 0)
+ *Person::players[j]->scale + Person::players[j]->coords) ||
+ (Person::players[j]->animTarget == hanganim &&
+ normaldotproduct(Person::players[j]->facing, coords - Person::players[j]->coords) < 0)) {
+ aitype = searchtype;
+ lastchecktime = 12;
+ lastseen = Person::players[j]->coords;
+ lastseentime = 12;
+ }
+ }
+ }
+ if (aitype == attacktypecutoff && Game::musictype != 2)
+ if (creature != wolftype) {
+ stunned = .6;
+ surprised = .6;
+ }
+ }
+
+ if (aitype != passivetype && Game::leveltime > .5)
+ howactive = typeactive;
+
+ if (aitype == passivetype) {
+ aiupdatedelay -= multiplier;
+ losupdatedelay -= multiplier;
+ lastseentime += multiplier;
+ pausetime -= multiplier;
+ if (lastseentime > 1)
+ lastseentime = 1;
+
+ if (aiupdatedelay < 0) {
+ if (numwaypoints > 1 && howactive == typeactive && pausetime <= 0) {
+ targetyaw = roughDirectionTo(coords, waypoints[waypoint]);
+ lookyaw = targetyaw;
+ aiupdatedelay = .05;
+
+ if (distsqflat(&coords, &waypoints[waypoint]) < 1) {
+ if (waypointtype[waypoint] == wppause)
+ pausetime = 4;
+ waypoint++;
+ if (waypoint > numwaypoints - 1)
+ waypoint = 0;
+
+ }
+ }
+
+ if (numwaypoints > 1 && howactive == typeactive && pausetime <= 0)
+ forwardkeydown = 1;
+ else
+ forwardkeydown = 0;
+ leftkeydown = 0;
+ backkeydown = 0;
+ rightkeydown = 0;
+ crouchkeydown = 0;
+ attackkeydown = 0;
+ throwkeydown = 0;
+
+ if (avoidcollided > .8 && !jumpkeydown && collided < .8) {
+ if (!avoidsomething)
+ targetyaw += 90 * (whichdirection * 2 - 1);
+ else {
+ XYZ leftpos, rightpos;
+ float leftdist, rightdist;
+ leftpos = coords + DoRotation(facing, 0, 90, 0);
+ rightpos = coords - DoRotation(facing, 0, 90, 0);
+ leftdist = distsq(&leftpos, &avoidwhere);
+ rightdist = distsq(&rightpos, &avoidwhere);
+ if (leftdist < rightdist)
+ targetyaw += 90;
+ else
+ targetyaw -= 90;
+ }
+ }
+ }
+ if (collided < 1 || animTarget != jumpupanim)
+ jumpkeydown = 0;
+ if ((collided > .8 && jumppower >= 5))
+ jumpkeydown = 1;
+
+
+ //hearing sounds
+ if (!Game::editorenabled) {
+ if (howactive <= typesleeping)
+ if (numenvsounds > 0 && (!Tutorial::active || cananger) && hostile)
+ for (int j = 0; j < numenvsounds; j++) {
+ float vol = howactive == typesleeping ? envsoundvol[j] - 14 : envsoundvol[j];
+ if (vol > 0 && distsq(&coords, &envsound[j]) <
+ 2 * (vol + vol * (creature == rabbittype) * 3))
+ aitype = attacktypecutoff;
+ }
+
+ if (aitype != passivetype) {
+ if (howactive == typesleeping)
+ setAnimation(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;
+ setAnimation(getStop());
+ targetyaw += 180;
+ stunned = .5;
+ //aitype=passivetype;
+ aitype = pathfindtype;
+ finalfinaltarget = waypoints[waypoint];
+ finalpathfindpoint = -1;
+ targetpathfindpoint = -1;
+ lastpathfindpoint = -1;
+ lastpathfindpoint2 = -1;
+ lastpathfindpoint3 = -1;
+ lastpathfindpoint4 = -1;
+ } else
+ laststanding = j;
+ }
+ }
+ //check out last seen location
+ if (aiupdatedelay < 0) {
+ targetyaw = roughDirectionTo(coords, lastseen);
+ lookyaw = targetyaw;
+ aiupdatedelay = .05;
+ forwardkeydown = 1;
+
+ if (distsqflat(&coords, &lastseen) < 1 * sq(scale * 5) || lastchecktime < 0) {
+ forwardkeydown = 0;
+ aiupdatedelay = 1;
+ lastseen.x += (float(Random() % 100) - 50) / 25;
+ lastseen.z += (float(Random() % 100) - 50) / 25;
+ lastchecktime = 3;
+ }
+
+ leftkeydown = 0;
+ backkeydown = 0;
+ rightkeydown = 0;
+ crouchkeydown = 0;
+ attackkeydown = 0;
+ throwkeydown = 0;
+
+ if (avoidcollided > .8 && !jumpkeydown && collided < .8) {
+ if (!avoidsomething)
+ targetyaw += 90 * (whichdirection * 2 - 1);
+ else {
+ XYZ leftpos, rightpos;
+ float leftdist, rightdist;
+ leftpos = coords + DoRotation(facing, 0, 90, 0);
+ rightpos = coords - DoRotation(facing, 0, 90, 0);
+ leftdist = distsq(&leftpos, &avoidwhere);
+ rightdist = distsq(&rightpos, &avoidwhere);
+ if (leftdist < rightdist)
+ targetyaw += 90;
+ else
+ targetyaw -= 90;
+ }
+ }
+ }
+ if (collided < 1 || animTarget != jumpupanim)
+ jumpkeydown = 0;
+ if ((collided > .8 && jumppower >= 5))
+ jumpkeydown = 1;
+
+ if (numenvsounds > 0 && ((!Tutorial::active || cananger) && hostile))
+ for (int k = 0; k < numenvsounds; k++) {
+ if (distsq(&coords, &envsound[k]) < 2 * (envsoundvol[k] + envsoundvol[k] * (creature == rabbittype) * 3)) {
+ aitype = attacktypecutoff;
+ }
+ }
+
+ if (!Person::players[0]->dead &&
+ losupdatedelay < 0 &&
+ !Game::editorenabled &&
+ occluded < 2 &&
+ ((!Tutorial::active || cananger) && hostile)) {
+ losupdatedelay = .2;
+ if (distsq(&coords, &Person::players[0]->coords) < 4 && Animation::animations[animTarget].height != lowheight) {
+ aitype = attacktypecutoff;
+ lastseentime = 1;
+ }
+ if (abs(Random() % 2) || Animation::animations[animTarget].height != lowheight)
+ //TODO: factor out canSeePlayer()
+ if (distsq(&coords, &Person::players[0]->coords) < 400)
+ if (normaldotproduct(facing, Person::players[0]->coords - coords) > 0)
+ if ((Object::checkcollide(
+ DoRotation(jointPos(head), 0, yaw, 0)*
+ scale + coords,
+ DoRotation(Person::players[0]->jointPos(head), 0, Person::players[0]->yaw, 0)*
+ Person::players[0]->scale + Person::players[0]->coords) == -1) ||
+ (Person::players[0]->animTarget == hanganim && normaldotproduct(
+ Person::players[0]->facing, coords - Person::players[0]->coords) < 0)) {
+ /* //TODO: changed j to 0 on a whim, make sure this is correct
+ (Person::players[j]->animTarget==hanganim&&normaldotproduct(
+ Person::players[j]->facing,coords-Person::players[j]->coords)<0)
+ */
+ aitype = attacktypecutoff;
+ lastseentime = 1;
+ }
+ }
+ //player escaped
+ if (lastseentime < 0) {
+ //aitype=passivetype;
+ numescaped++;
+ aitype = pathfindtype;
+ finalfinaltarget = waypoints[waypoint];
+ finalpathfindpoint = -1;
+ targetpathfindpoint = -1;
+ lastpathfindpoint = -1;
+ lastpathfindpoint2 = -1;
+ lastpathfindpoint3 = -1;
+ lastpathfindpoint4 = -1;
+ }
+ }
+
+ if (aitype != gethelptype)
+ runninghowlong = 0;
+
+ //get help from buddies
+ if (aitype == gethelptype) {
+ runninghowlong += multiplier;
+ aiupdatedelay -= multiplier;
+
+ if (aiupdatedelay < 0 || ally == 0) {
+ aiupdatedelay = .2;
+
+ //find closest ally
+ //TODO: factor out closest search somehow
+ if (!ally) {
+ int closest = -1;
+ float closestdist = -1;
+ for (unsigned k = 0; k < Person::players.size(); k++) {
+ if ((k != id) && (k != 0) && !Person::players[k]->dead &&
+ (Person::players[k]->howactive < typedead1) &&
+ !Person::players[k]->skeleton.free &&
+ (Person::players[k]->aitype == passivetype)) {
+ float distance = distsq(&coords, &Person::players[k]->coords);
+ if (closestdist == -1 || distance < closestdist) {
+ closestdist = distance;
+ closest = k;
+ }
+ closest = k;
+ }
+ }
+ if (closest != -1) {
+ ally = closest;
+ } else {
+ ally = 0;
+ }
+ lastseen = Person::players[0]->coords;
+ lastseentime = 12;
+ }
+
+
+ lastchecktime = 12;
+
+ XYZ facing = coords;
+ XYZ flatfacing = Person::players[ally]->coords;
+ facing.y += jointPos(head).y * scale;
+ flatfacing.y += Person::players[ally]->jointPos(head).y * Person::players[ally]->scale;
+ if (-1 != Object::checkcollide(facing, flatfacing))
+ lastseentime -= .1;
+
+ //no available ally, run back to player
+ if (ally <= 0 ||
+ Person::players[ally]->skeleton.free ||
+ Person::players[ally]->aitype != passivetype ||
+ lastseentime <= 0) {
+ aitype = searchtype;
+ lastseentime = 12;
+ }
+
+ //seek out ally
+ if (ally > 0) {
+ targetyaw = roughDirectionTo(coords, Person::players[ally]->coords);
+ lookyaw = targetyaw;
+ aiupdatedelay = .05;
+ forwardkeydown = 1;
+
+ if (distsqflat(&coords, &Person::players[ally]->coords) < 3) {
+ aitype = searchtype;
+ lastseentime = 12;
+ Person::players[ally]->aitype = searchtype;
+ if (Person::players[ally]->lastseentime < lastseentime) {
+ Person::players[ally]->lastseen = lastseen;
+ Person::players[ally]->lastseentime = lastseentime;
+ Person::players[ally]->lastchecktime = lastchecktime;
+ }
+ }
+
+ if (avoidcollided > .8 && !jumpkeydown && collided < .8) {
+ if (!avoidsomething)
+ targetyaw += 90 * (whichdirection * 2 - 1);
+ else {
+ XYZ leftpos, rightpos;
+ float leftdist, rightdist;
+ leftpos = coords + DoRotation(facing, 0, 90, 0);
+ rightpos = coords - DoRotation(facing, 0, 90, 0);
+ leftdist = distsq(&leftpos, &avoidwhere);
+ rightdist = distsq(&rightpos, &avoidwhere);
+ if (leftdist < rightdist)
+ targetyaw += 90;
+ else
+ targetyaw -= 90;
+ }
+ }
+ }
+
+ leftkeydown = 0;
+ backkeydown = 0;
+ rightkeydown = 0;
+ crouchkeydown = 0;
+ attackkeydown = 0;
+ }
+ if (collided < 1 || animTarget != jumpupanim)
+ jumpkeydown = 0;
+ if (collided > .8 && jumppower >= 5)
+ jumpkeydown = 1;
+ }
+
+ //retreiving a weapon on the ground
+ if (aitype == getweapontype) {
+ aiupdatedelay -= multiplier;
+ lastchecktime -= multiplier;
+
+ if (aiupdatedelay < 0) {
+ aiupdatedelay = .2;
+
+ //ALLY IS WEPON
+ if (ally < 0) {
+ int closest = -1;
+ float closestdist = -1;
+ for (unsigned k = 0; k < weapons.size(); k++)
+ if (weapons[k].owner == -1) {
+ float distance = distsq(&coords, &weapons[k].position);
+ if (closestdist == -1 || distance < closestdist) {
+ closestdist = distance;
+ closest = k;
+ }
+ closest = k;
+ }
+ if (closest != -1)
+ ally = closest;
+ else
+ ally = -1;
+ }
+
+ lastseentime = 12;
+
+ if (!Person::players[0]->dead && ((!Tutorial::active || cananger) && hostile))
+ if (ally < 0 || weaponactive != -1 || lastchecktime <= 0) {
+ aitype = attacktypecutoff;
+ lastseentime = 1;
+ }
+ if (!Person::players[0]->dead)
+ if (ally >= 0) {
+ if (weapons[ally].owner != -1 ||
+ distsq(&coords, &weapons[ally].position) > 16) {
+ aitype = attacktypecutoff;
+ lastseentime = 1;
+ }
+ //TODO: factor these out as moveToward()
+ targetyaw = roughDirectionTo(coords, weapons[ally].position);
+ lookyaw = targetyaw;
+ aiupdatedelay = .05;
+ forwardkeydown = 1;
+
+
+ if (avoidcollided > .8 && !jumpkeydown && collided < .8) {
+ if (!avoidsomething)
+ targetyaw += 90 * (whichdirection * 2 - 1);
+ else {
+ XYZ leftpos, rightpos;
+ float leftdist, rightdist;
+ leftpos = coords + DoRotation(facing, 0, 90, 0);
+ rightpos = coords - DoRotation(facing, 0, 90, 0);
+ leftdist = distsq(&leftpos, &avoidwhere);
+ rightdist = distsq(&rightpos, &avoidwhere);
+ if (leftdist < rightdist)
+ targetyaw += 90;
+ else
+ targetyaw -= 90;
+ }
+ }
+ }
+
+ leftkeydown = 0;
+ backkeydown = 0;
+ rightkeydown = 0;
+ attackkeydown = 0;
+ throwkeydown = 1;
+ crouchkeydown = 0;
+ if (animTarget != crouchremoveknifeanim &&
+ animTarget != removeknifeanim)
+ throwtogglekeydown = 0;
+ drawkeydown = 0;
+ }
+ if (collided < 1 || animTarget != jumpupanim)
+ jumpkeydown = 0;
+ if ((collided > .8 && jumppower >= 5))
+ jumpkeydown = 1;
+ }
+
+ if (aitype == attacktypecutoff) {
+ aiupdatedelay -= multiplier;
+ //dodge or reverse rabbit kicks, knife throws, flips
+ if (damage < damagetolerance * 2 / 3)
+ if ((Person::players[0]->animTarget == rabbitkickanim ||
+ Person::players[0]->animTarget == knifethrowanim ||
+ (Person::players[0]->isFlip() &&
+ normaldotproduct(Person::players[0]->facing, Person::players[0]->coords - coords) < 0)) &&
+ !Person::players[0]->skeleton.free &&
+ (aiupdatedelay < .1)) {
+ attackkeydown = 0;
+ if (isIdle())
+ crouchkeydown = 1;
+ if (Person::players[0]->animTarget != rabbitkickanim && Person::players[0]->weaponactive != -1) {
+ if (weapons[Person::players[0]->weaponids[0]].getType() == knife) {
+ if (isIdle() || isCrouch() || isRun() || isFlip()) {
+ if (abs(Random() % 2) == 0)
+ setAnimation(backhandspringanim);
+ else
+ setAnimation(rollanim);
+ targetyaw += 90 * (abs(Random() % 2) * 2 - 1);
+ wentforweapon = 0;
+ }
+ if (animTarget == jumpupanim || animTarget == jumpdownanim)
+ setAnimation(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;
+ setAnimation(getStop());
+ targetyaw += 180;
+ stunned = .5;
+ aitype = pathfindtype;
+ finalfinaltarget = waypoints[waypoint];
+ finalpathfindpoint = -1;
+ targetpathfindpoint = -1;
+ lastpathfindpoint = -1;
+ lastpathfindpoint2 = -1;
+ lastpathfindpoint3 = -1;
+ lastpathfindpoint4 = -1;
+ } else
+ laststanding = j;
+ }
+ //lose sight of player in the air (?)
+ if (Person::players[0]->coords.y > coords.y + 5 &&
+ Animation::animations[Person::players[0]->animTarget].height != highheight &&
+ !Person::players[0]->onterrain) {
+ aitype = pathfindtype;
+ finalfinaltarget = waypoints[waypoint];
+ finalpathfindpoint = -1;
+ targetpathfindpoint = -1;
+ lastpathfindpoint = -1;
+ lastpathfindpoint2 = -1;
+ lastpathfindpoint3 = -1;
+ lastpathfindpoint4 = -1;
+ }
+ //it's time to think (?)
+ if (aiupdatedelay < 0 &&
+ !Animation::animations[animTarget].attack &&
+ animTarget != staggerbackhighanim &&
+ animTarget != staggerbackhardanim &&
+ animTarget != backhandspringanim &&
+ animTarget != dodgebackanim) {
+ //draw weapon
+ if (weaponactive == -1 && num_weapons > 0)
+ drawkeydown = Random() % 2;
+ else
+ drawkeydown = 0;
+ rabbitkickenabled = Random() % 2;
+ //chase player
+ XYZ rotatetarget = Person::players[0]->coords + Person::players[0]->velocity;
+ XYZ targetpoint = Person::players[0]->coords;
+ if (distsq(&Person::players[0]->coords, &coords) <
+ distsq(&rotatetarget, &coords))
+ targetpoint += Person::players[0]->velocity *
+ findDistance(&Person::players[0]->coords, &coords) / findLength(&velocity);
+ targetyaw = roughDirectionTo(coords, targetpoint);
+ lookyaw = targetyaw;
+ aiupdatedelay = .2 + fabs((float)(Random() % 100) / 1000);
+
+ if (distsq(&coords, &Person::players[0]->coords) > 5 && (Person::players[0]->weaponactive == -1 || weaponactive != -1))
+ forwardkeydown = 1;
+ else if ((distsq(&coords, &Person::players[0]->coords) > 16 ||
+ distsq(&coords, &Person::players[0]->coords) < 9) &&
+ Person::players[0]->weaponactive != -1)
+ forwardkeydown = 1;
+ else if (Random() % 6 == 0 || (creature == wolftype && Random() % 3 == 0))
+ forwardkeydown = 1;
+ else
+ forwardkeydown = 0;
+ //chill out around the corpse
+ if (Person::players[0]->dead) {
+ forwardkeydown = 0;
+ if (Random() % 10 == 0)
+ forwardkeydown = 1;
+ if (Random() % 100 == 0) {
+ aitype = pathfindtype;
+ finalfinaltarget = waypoints[waypoint];
+ finalpathfindpoint = -1;
+ targetpathfindpoint = -1;
+ lastpathfindpoint = -1;
+ lastpathfindpoint2 = -1;
+ lastpathfindpoint3 = -1;
+ lastpathfindpoint4 = -1;
+ }
+ }
+ leftkeydown = 0;
+ backkeydown = 0;
+ rightkeydown = 0;
+ crouchkeydown = 0;
+ throwkeydown = 0;
+
+ if (avoidcollided > .8 && !jumpkeydown && collided < .8)
+ targetyaw += 90 * (whichdirection * 2 - 1);
+ //attack!!!
+ if (Random() % 2 == 0 || weaponactive != -1 || creature == wolftype)
+ attackkeydown = 1;
+ else
+ attackkeydown = 0;
+ if (isRun() && Random() % 6 && distsq(&coords, &Person::players[0]->coords) > 7)
+ attackkeydown = 0;
+
+ //TODO: wat
+ if (aitype != playercontrolled &&
+ (isIdle() ||
+ isCrouch() ||
+ isRun())) {
+ int target = -2;
+ for (unsigned j = 0; j < Person::players.size(); j++)
+ if (j != id && !Person::players[j]->skeleton.free &&
+ Person::players[j]->hasvictim &&
+ (Tutorial::active && reversaltrain ||
+ Random() % 2 == 0 && difficulty == 2 ||
+ Random() % 4 == 0 && difficulty == 1 ||
+ Random() % 8 == 0 && difficulty == 0 ||
+ Person::players[j]->lastattack2 == Person::players[j]->animTarget &&
+ Person::players[j]->lastattack3 == Person::players[j]->animTarget &&
+ (Random() % 2 == 0 || difficulty == 2) ||
+ (isIdle() || isRun()) &&
+ Person::players[j]->weaponactive != -1 ||
+ Person::players[j]->animTarget == swordslashanim &&
+ weaponactive != -1 ||
+ Person::players[j]->animTarget == staffhitanim ||
+ Person::players[j]->animTarget == staffspinhitanim))
+ if (distsq(&Person::players[j]->coords, &Person::players[j]->victim->coords) < 4 &&
+ Person::players[j]->victim == Person::players[id] &&
+ (Person::players[j]->animTarget == sweepanim ||
+ Person::players[j]->animTarget == spinkickanim ||
+ Person::players[j]->animTarget == staffhitanim ||
+ Person::players[j]->animTarget == staffspinhitanim ||
+ Person::players[j]->animTarget == winduppunchanim ||
+ Person::players[j]->animTarget == upunchanim ||
+ Person::players[j]->animTarget == wolfslapanim ||
+ Person::players[j]->animTarget == knifeslashstartanim ||
+ Person::players[j]->animTarget == swordslashanim &&
+ (distsq(&Person::players[j]->coords, &coords) < 2 ||
+ weaponactive != -1))) {
+ if (target >= 0) {
+ target = -1;
+ } else {
+ target = j;
+ }
+ }
+ if (target >= 0)
+ Person::players[target]->Reverse();
+ }
+
+ if (collided < 1)
+ jumpkeydown = 0;
+ if (collided > .8 && jumppower >= 5 ||
+ distsq(&coords, &Person::players[0]->coords) > 400 &&
+ onterrain &&
+ creature == rabbittype)
+ jumpkeydown = 1;
+ //TODO: why are we controlling the human?
+ if (normaldotproduct(facing, Person::players[0]->coords - coords) > 0)
+ Person::players[0]->jumpkeydown = 0;
+ if (Person::players[0]->animTarget == jumpdownanim &&
+ distsq(&Person::players[0]->coords, &coords) < 40)
+ crouchkeydown = 1;
+ if (jumpkeydown)
+ attackkeydown = 0;
+
+ if (Tutorial::active)
+ if (!canattack)
+ attackkeydown = 0;
+
+
+ XYZ facing = coords;
+ XYZ flatfacing = Person::players[0]->coords;
+ facing.y += jointPos(head).y * scale;
+ flatfacing.y += Person::players[0]->jointPos(head).y * Person::players[0]->scale;
+ if (occluded >= 2)
+ if (-1 != Object::checkcollide(facing, flatfacing)) {
+ if (!pause)
+ lastseentime -= .2;
+ if (lastseentime <= 0 &&
+ (creature != wolftype ||
+ weaponstuck == -1)) {
+ aitype = searchtype;
+ lastchecktime = 12;
+ lastseen = Person::players[0]->coords;
+ lastseentime = 12;
+ }
+ } else
+ lastseentime = 1;
+ }
+ }
+ if (Animation::animations[Person::players[0]->animTarget].height == highheight &&
+ (aitype == attacktypecutoff ||
+ aitype == searchtype))
+ if (Person::players[0]->coords.y > terrain.getHeight(Person::players[0]->coords.x, Person::players[0]->coords.z) + 10) {
+ XYZ test = Person::players[0]->coords;
+ test.y -= 40;
+ if (-1 == Object::checkcollide(Person::players[0]->coords, test))
+ stunned = 1;
+ }
+ //stunned
+ if (aitype == passivetype && !(numwaypoints > 1) ||
+ stunned > 0 ||
+ pause && damage > superpermanentdamage) {
+ if (pause)
+ lastseentime = 1;
+ targetyaw = yaw;
+ forwardkeydown = 0;
+ leftkeydown = 0;
+ backkeydown = 0;
+ rightkeydown = 0;
+ jumpkeydown = 0;
+ attackkeydown = 0;
+ crouchkeydown = 0;
+ throwkeydown = 0;
+ }
+
+
+ XYZ facing;
+ facing = 0;
+ facing.z = -1;
+
+ XYZ flatfacing = DoRotation(facing, 0, yaw + 180, 0);
+ facing = flatfacing;
+
+ if (aitype == attacktypecutoff) {
+ targetheadyaw = 180 - roughDirectionTo(coords, Person::players[0]->coords);
+ targetheadpitch = pitchTo(coords, Person::players[0]->coords);
+ } else if (howactive >= typesleeping) {
+ targetheadyaw = targetyaw;
+ targetheadpitch = 0;
+ } else {
+ if (interestdelay <= 0) {
+ interestdelay = .7 + (float)(abs(Random() % 100)) / 100;
+ headtarget = coords;
+ headtarget.x += (float)(abs(Random() % 200) - 100) / 100;
+ headtarget.z += (float)(abs(Random() % 200) - 100) / 100;
+ headtarget.y += (float)(abs(Random() % 200) - 100) / 300;
+ headtarget += facing * 1.5;
+ }
+ targetheadyaw = 180 - roughDirectionTo(coords, headtarget);
+ targetheadpitch = pitchTo(coords, headtarget);
+ }
+ }
+}