]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Person.cpp
player replaced by Person::players which is a vector of shared_ptr.
[lugaru.git] / Source / Person.cpp
index 72c18625f9816b2595502fc8e18210f681b80dd9..c258e2352d5e89723a5b5805b4cdf2d9d71a00ea 100644 (file)
@@ -83,13 +83,8 @@ extern int indialogue;
 
 extern bool gamestarted;
 
-Person player[maxplayers];
-
-/* convenience functions
- */
-Joint& Person::joint(int bodypart) { return skeleton.joints[skeleton.jointlabels[bodypart]]; }
-XYZ& Person::jointPos(int bodypart) { return joint(bodypart).position; }
-XYZ& Person::jointVel(int bodypart) { return joint(bodypart).velocity; }
+//~ Person player[maxplayers];
+std::vector<std::shared_ptr<Person>> Person::players(1, std::shared_ptr<Person>(new Person()));
 
 /* EFFECT
  *
@@ -101,7 +96,7 @@ void Person::CheckKick()
     if (!(hasvictim
             && (animTarget == rabbitkickanim
                 && victim
-                && victim != this
+                && victim != this->shared_from_this()
                 && frameCurrent >= 2
                 && animCurrent == rabbitkickanim)
             && distsq(&coords, &victim->coords) < 1.2
@@ -151,7 +146,7 @@ void Person::CheckKick()
         victim->oldcoords = victim->coords;
         coords = victim->coords;
         victim->targetyaw = targetyaw;
-        victim->victim = this;
+        victim->victim = this->shared_from_this();
     }
 }
 
@@ -197,7 +192,7 @@ int Person::getIdle()
 {
     if (indialogue != -1 && howactive == typeactive && creature == rabbittype)
         return talkidleanim;
-    if (hasvictim && victim != this/*||(id==0&&attackkeydown)*/)
+    if (hasvictim && (victim != this->shared_from_this())/*||(id==0&&attackkeydown)*/)
         if (/*(id==0&&attackkeydown)||*/(!victim->dead && victim->aitype != passivetype && victim->aitype != searchtype && aitype != passivetype && aitype != searchtype && victim->id < numplayers)) {
             if ((aitype == playercontrolled && stunned <= 0 && weaponactive == -1) || pause) {
                 if (creature == rabbittype)
@@ -510,7 +505,7 @@ void Person::DoBloodBig(float howmuch, int which)
         if (creature == rabbittype)
             for (i = 0; i < 512; i++) {
                 for (j = 0; j < 512; j++) {
-                    if (bloodText[i*512*3 + j*3 + 0] <= which + 4 && bloodText[i*512*3 + j*3 + 0] >= which - 4) {
+                    if (bloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && bloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) {
                         if (i < startx) startx = i;
                         if (j < starty) starty = j;
                         if (i > endx) endx = i;
@@ -521,7 +516,7 @@ void Person::DoBloodBig(float howmuch, int which)
         if (creature == wolftype)
             for (i = 0; i < 512; i++) {
                 for (j = 0; j < 512; j++) {
-                    if (wolfbloodText[i*512*3 + j*3 + 0] <= which + 4 && wolfbloodText[i*512*3 + j*3 + 0] >= which - 4) {
+                    if (wolfbloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && wolfbloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) {
                         if (i < startx) startx = i;
                         if (j < starty) starty = j;
                         if (i > endx) endx = i;
@@ -928,7 +923,7 @@ void Person::Reverse()
 
             victim->weaponactive = -1;
             for (int j = 0; j < numplayers; j++) {
-                player[j].wentforweapon = 0;
+                Person::players[j]->wentforweapon = 0;
             }
         }
 
@@ -958,7 +953,7 @@ void Person::Reverse()
 
             victim->weaponactive = -1;
             for (int j = 0; j < numplayers; j++) {
-                player[j].wentforweapon = 0;
+                Person::players[j]->wentforweapon = 0;
             }
         }
         animTarget = staffspinhitreversedanim;
@@ -987,7 +982,7 @@ void Person::Reverse()
 
             victim->weaponactive = -1;
             for (int j = 0; j < numplayers; j++) {
-                player[j].wentforweapon = 0;
+                Person::players[j]->wentforweapon = 0;
             }
         }
         animTarget = swordslashreversedanim;
@@ -1016,7 +1011,7 @@ void Person::Reverse()
 
             victim->weaponactive = -1;
             for (int j = 0; j < numplayers; j++) {
-                player[j].wentforweapon = 0;
+                Person::players[j]->wentforweapon = 0;
             }
         }
         animTarget = knifeslashreversedanim;
@@ -1034,14 +1029,14 @@ void Person::Reverse()
         victim->coords = coords;
         victim->targetyaw = targetyaw;
         victim->yaw = targetyaw;
-        victim->victim = this;
+        victim->victim = this->shared_from_this();
     }
     if (animTarget == winduppunchanim) {
         animTarget = winduppunchblockedanim;
         victim->animTarget = blockhighleftanim;
         victim->frameTarget = 1;
         victim->target = .5;
-        victim->victim = this;
+        victim->victim = this->shared_from_this();
         victim->targetyaw = targetyaw + 180;
     }
     if (animTarget == wolfslapanim) {
@@ -1049,7 +1044,7 @@ void Person::Reverse()
         victim->animTarget = blockhighleftanim;
         victim->frameTarget = 1;
         victim->target = .5;
-        victim->victim = this;
+        victim->victim = this->shared_from_this();
         victim->targetyaw = targetyaw + 180;
     }
     if ((animTarget == swordslashanim || animTarget == staffhitanim || animTarget == staffspinhitanim) && victim->weaponactive != -1) {
@@ -1059,7 +1054,7 @@ void Person::Reverse()
         victim->animTarget = swordslashparryanim;
         victim->frameTarget = 1;
         victim->target = .5;
-        victim->victim = this;
+        victim->victim = this->shared_from_this();
         victim->targetyaw = targetyaw + 180;
 
         if (abs(Random() % 20) == 0 || weapons[victim->weaponids[victim->weaponactive]].getType() == knife) {
@@ -1099,7 +1094,7 @@ void Person::Reverse()
             }
             victim->weaponactive = -1;
             for (int i = 0; i < numplayers; i++) {
-                player[i].wentforweapon = 0;
+                Person::players[i]->wentforweapon = 0;
             }
         }
 
@@ -1142,7 +1137,7 @@ void Person::Reverse()
             }
             weaponactive = -1;
             for (int i = 0; i < numplayers; i++) {
-                player[i].wentforweapon = 0;
+                Person::players[i]->wentforweapon = 0;
             }
 
 
@@ -1572,7 +1567,7 @@ void Person::RagDoll(bool checkcollision)
                 }
                 weaponactive = -1;
                 for (i = 0; i < numplayers; i++) {
-                    player[i].wentforweapon = 0;
+                    Person::players[i]->wentforweapon = 0;
                 }
             }
         }
@@ -1946,9 +1941,9 @@ void Person::DoAnimations()
                 for (i = 0; i < weapons.size(); i++) {
                     bool willwork = true;
                     if (weapons[i].owner != -1)
-                        if (player[weapons[i].owner].weaponstuck != -1)
-                            if (player[weapons[i].owner].weaponids[player[weapons[i].owner].weaponstuck] == i)
-                                if (player[weapons[i].owner].num_weapons > 1)
+                        if (Person::players[weapons[i].owner]->weaponstuck != -1)
+                            if (Person::players[weapons[i].owner]->weaponids[Person::players[weapons[i].owner]->weaponstuck] == i)
+                                if (Person::players[weapons[i].owner]->num_weapons > 1)
                                     willwork = 0;
                     if ((weapons[i].owner == -1) || (hasvictim && weapons[i].owner == victim->id && victim->skeleton.free))
                         if (willwork && distsqflat(&coords, &weapons[i].position) < 3 && weaponactive == -1) {
@@ -1970,7 +1965,7 @@ void Person::DoAnimations()
                                 weaponactive = 0;
                                 if (weapons[i].owner != -1) {
 
-                                    victim = &player[weapons[i].owner];
+                                    victim = Person::players[weapons[i].owner];
                                     if (victim->num_weapons == 1)
                                         victim->num_weapons = 0;
                                     else
@@ -2009,10 +2004,10 @@ void Person::DoAnimations()
                                             victim->weaponids[0] = victim->weaponids[victim->num_weapons];
                                     }
 
-                                    victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * 6;
-                                    victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity += relative * 6;
-                                    victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity += relative * 6;
-                                    victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity += relative * 6;
+                                    victim->jointVel(abdomen) += relative * 6;
+                                    victim->jointVel(neck) += relative * 6;
+                                    victim->jointVel(rightshoulder) += relative * 6;
+                                    victim->jointVel(leftshoulder) += relative * 6;
                                 }
                                 weapons[i].owner = id;
                                 if (num_weapons > 0) {
@@ -2065,7 +2060,7 @@ void Person::DoAnimations()
             if ((animTarget == rabbitrunninganim || animTarget == wolfrunninganim) && frameTarget == 3 && (jumpkeydown || attackkeydown || id != 0))
                 dojumpattack = 1;
             if (hasvictim)
-                if (distsq(&victim->coords, &/*player[i].*/coords) < 5 && victim->aitype == gethelptype && (attackkeydown) && !victim->skeleton.free && victim->isRun() && victim->runninghowlong >= 1)
+                if (distsq(&victim->coords, &/*Person::players[i]->*/coords) < 5 && victim->aitype == gethelptype && (attackkeydown) && !victim->skeleton.free && victim->isRun() && victim->runninghowlong >= 1)
                     dojumpattack = 1;
             if (!hostile)
                 dojumpattack = 0;
@@ -2086,15 +2081,15 @@ void Person::DoAnimations()
                 targetloc += coords;
                 for (i = 0; i < numplayers; i++) {
                     if (i != id)
-                        if (distsq(&targetloc, &player[i].coords) < closestdist || closestdist == 0) {
-                            closestdist = distsq(&targetloc, &player[i].coords);
+                        if (distsq(&targetloc, &Person::players[i]->coords) < closestdist || closestdist == 0) {
+                            closestdist = distsq(&targetloc, &Person::players[i]->coords);
                             closestid = i;
                         }
                 }
                 if (closestid != -1)
-                    if (closestdist < 5 && !player[closestid].dead && animation[player[closestid].animTarget].height != lowheight && player[closestid].animTarget != backhandspringanim) {
+                    if (closestdist < 5 && !Person::players[closestid]->dead && animation[Person::players[closestid]->animTarget].height != lowheight && Person::players[closestid]->animTarget != backhandspringanim) {
                         hasvictim = 1;
-                        victim = &player[closestid];
+                        victim = Person::players[closestid];
                         coords = victim->coords;
                         animCurrent = rabbittacklinganim;
                         animTarget = rabbittacklinganim;
@@ -2152,7 +2147,7 @@ void Person::DoAnimations()
                         for (i = 0; i < victim->skeleton.num_joints; i++) {
                             victim->skeleton.joints[i].velocity += relative * damagemult * 40;
                         }
-                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200;
+                        victim->jointVel(head) += relative * damagemult * 200;
                         //FootLand(1,2);
                         victim->Puff(head);
                         victim->DoDamage(damagemult * 100 / victim->protectionhead);
@@ -2188,7 +2183,7 @@ void Person::DoAnimations()
                         for (i = 0; i < victim->skeleton.num_joints; i++) {
                             victim->skeleton.joints[i].velocity += relative * damagemult * 20;
                         }
-                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 100;
+                        victim->jointVel(head) += relative * damagemult * 100;
                         //FootLand(1,2);
                         victim->Puff(head);
                         victim->DoDamage(damagemult * 50 / victim->protectionhead);
@@ -2219,7 +2214,7 @@ void Person::DoAnimations()
                         for (i = 0; i < victim->skeleton.num_joints; i++) {
                             victim->skeleton.joints[i].velocity += relative * damagemult * 40;
                         }
-                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200;
+                        victim->jointVel(head) += relative * damagemult * 200;
                         //FootLand(1,2);
                         victim->Puff(head);
                         victim->DoDamage(damagemult * 150 / victim->protectionhead);
@@ -2255,7 +2250,7 @@ void Person::DoAnimations()
                         for (i = 0; i < victim->skeleton.num_joints; i++) {
                             victim->skeleton.joints[i].velocity += relative * damagemult * 40;
                         }
-                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200;
+                        victim->jointVel(head) += relative * damagemult * 200;
                         //FootLand(1,2);
                         victim->Puff(head);
                         victim->DoDamage(damagemult * 150 / victim->protectionhead);
@@ -2285,7 +2280,7 @@ void Person::DoAnimations()
                         for (i = 0; i < victim->skeleton.num_joints; i++) {
                             victim->skeleton.joints[i].velocity += relative * damagemult * 30;
                         }
-                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 100;
+                        victim->jointVel(head) += relative * damagemult * 100;
                         //FootLand(1,2);
                         victim->Puff(head);
                         victim->DoDamage(damagemult * 50 / victim->protectionhead);
@@ -2322,7 +2317,7 @@ void Person::DoAnimations()
                             victim->skeleton.joints[i].realoldposition.y += relative.y * .3;
                         }
                         victim->Puff(abdomen);
-                        victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity.y = relative.y * 400;
+                        victim->jointVel(abdomen).y = relative.y * 400;
                     }
                 }
 
@@ -2347,7 +2342,7 @@ void Person::DoAnimations()
                             slomodelay = .2;
                         }
                         victim->DoDamage(damagemult * 500 / victim->protectionhigh);
-                        victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 300;
+                        victim->jointVel(abdomen) += relative * damagemult * 300;
                     }
                 }
 
@@ -2383,7 +2378,7 @@ void Person::DoAnimations()
 
                         victim->Puff(abdomen);
                         victim->DoDamage(damagemult * 20 / victim->protectionhigh);
-                        victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200;
+                        victim->jointVel(abdomen) += relative * damagemult * 200;
                         staggerdelay = .5;
                         if (!victim->dead)
                             staggerdelay = 1.2;
@@ -2571,7 +2566,7 @@ void Person::DoAnimations()
                                     victim->bled = 0;
                                 }
 
-                                victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 20;
+                                victim->jointVel(abdomen) += relative * damagemult * 20;
                             }
                         }
                     }
@@ -2602,7 +2597,7 @@ void Person::DoAnimations()
                         for (i = 0; i < victim->skeleton.num_joints; i++) {
                             victim->skeleton.joints[i].velocity = relative * 30;
                         }
-                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 150;
+                        victim->jointVel(head) += relative * damagemult * 150;
 
                         victim->frameTarget = 0;
                         victim->animTarget = staggerbackhardanim;
@@ -2649,7 +2644,7 @@ void Person::DoAnimations()
                         for (i = 0; i < victim->skeleton.num_joints; i++) {
                             victim->skeleton.joints[i].velocity = relative * 5;
                         }
-                        victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 400;
+                        victim->jointVel(abdomen) += relative * damagemult * 400;
 
                         victim->frameTarget = 0;
                         victim->animTarget = staggerbackhardanim;
@@ -2701,7 +2696,7 @@ void Person::DoAnimations()
                         escapednum = 0;
                         XYZ aim;
                         weapons[weaponids[0]].owner = -1;
-                        aim = victim->coords + DoRotation(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position, 0, victim->yaw, 0) * victim->scale + victim->velocity * findDistance(&victim->coords, &coords) / 50 - (coords + DoRotation(jointPos(righthand), 0, yaw, 0) * scale);
+                        aim = victim->coords + DoRotation(victim->jointPos(abdomen), 0, victim->yaw, 0) * victim->scale + victim->velocity * findDistance(&victim->coords, &coords) / 50 - (coords + DoRotation(jointPos(righthand), 0, yaw, 0) * scale);
                         Normalise(&aim);
                         /*if(victim->animTarget==jumpupanim||victim->animTarget==jumpdownanim){
                         aim=DoRotation(aim,(float)abs(Random()%15)-7,(float)abs(Random()%15)-7,0);
@@ -2732,7 +2727,7 @@ void Person::DoAnimations()
                             if (tutoriallevel != 1) {
                                 emit_sound_at(knifeslicesound, victim->coords);
                             }
-                            //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
+                            //victim->jointVel(abdomen)+=relative*damagemult*200;
                             if (animation[victim->animTarget].attack && (victim->aitype != playercontrolled || victim->animTarget == knifeslashstartanim) && (victim->creature == rabbittype || victim->deathbleeding <= 0)) {
                                 if (victim->id != 0 || difficulty == 2) {
                                     victim->frameTarget = 0;
@@ -2755,10 +2750,10 @@ void Person::DoAnimations()
                             XYZ footvel, footpoint;
                             footvel = 0;
                             if (skeleton.free) {
-                                footpoint = (victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position + victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position) / 2 * victim->scale + victim->coords;
+                                footpoint = (victim->jointPos(abdomen) + victim->jointPos(neck)) / 2 * victim->scale + victim->coords;
                             }
                             if (!skeleton.free) {
-                                footpoint = DoRotation((victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position + victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords;
+                                footpoint = DoRotation((victim->jointPos(abdomen) + victim->jointPos(neck)) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords;
                             }
                             if (tutoriallevel != 1) {
                                 if (bloodtoggle)
@@ -2789,7 +2784,7 @@ void Person::DoAnimations()
                                 victim->deathbleeding = 1;
                                 emit_sound_at(swordslicesound, victim->coords);
                             }
-                            //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200;
+                            //victim->jointVel(abdomen)+=relative*damagemult*200;
                             if (tutoriallevel != 1) {
                                 victim->frameTarget = 0;
                                 victim->animTarget = staggerbackhardanim;
@@ -2811,10 +2806,10 @@ void Person::DoAnimations()
                                 XYZ footvel, footpoint;
                                 footvel = 0;
                                 if (skeleton.free) {
-                                    footpoint = (victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position + victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position) / 2 * victim->scale + victim->coords;
+                                    footpoint = (victim->jointPos(abdomen) + victim->jointPos(neck)) / 2 * victim->scale + victim->coords;
                                 }
                                 if (!skeleton.free) {
-                                    footpoint = DoRotation((victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position + victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords;
+                                    footpoint = DoRotation((victim->jointPos(abdomen) + victim->jointPos(neck)) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords;
                                 }
                                 if (bloodtoggle)
                                     Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .9, .3);
@@ -2865,7 +2860,7 @@ void Person::DoAnimations()
                             }
                             victim->weaponactive = -1;
                             for (i = 0; i < numplayers; i++) {
-                                player[i].wentforweapon = 0;
+                                Person::players[i]->wentforweapon = 0;
                             }
 
                         }
@@ -2895,8 +2890,8 @@ void Person::DoAnimations()
                         for (i = 0; i < victim->skeleton.num_joints; i++) {
                             victim->skeleton.joints[i].velocity += relative * damagemult * 60;
                         }
-                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 230;
-                        victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity += relative * damagemult * 230;
+                        victim->jointVel(head) += relative * damagemult * 230;
+                        victim->jointVel(neck) += relative * damagemult * 230;
                         //FootLand(1,2);
                         victim->Puff(head);
                         if (tutoriallevel != 1) {
@@ -2928,8 +2923,8 @@ void Person::DoAnimations()
                         for (i = 0; i < victim->skeleton.num_joints; i++) {
                             victim->skeleton.joints[i].velocity += relative * damagemult * 40;
                         }
-                        victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 220;
-                        victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity += relative * damagemult * 220;
+                        victim->jointVel(head) += relative * damagemult * 220;
+                        victim->jointVel(neck) += relative * damagemult * 220;
                         //FootLand(1,2);
                         victim->Puff(head);
                         if (tutoriallevel != 1) {
@@ -2977,14 +2972,14 @@ void Person::DoAnimations()
                                 victim->skeleton.joints[i].velocity = relative * damagemult * 40;
                             }
                             //FootLand(1,2);
-                            victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 40;
+                            victim->jointVel(abdomen) += relative * damagemult * 40;
                         }
                         if (victim->dead) {
                             for (i = 0; i < victim->skeleton.num_joints; i++) {
                                 victim->skeleton.joints[i].velocity = relative * damagemult * abs(Random() % 20);
                             }
                             //FootLand(1,2);
-                            //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*20;
+                            //victim->jointVel(abdomen)+=relative*damagemult*20;
                         }
                         victim->Puff(abdomen);
                         if (tutoriallevel != 1) {
@@ -3018,7 +3013,7 @@ void Person::DoAnimations()
                             for (i = 0; i < victim->skeleton.num_joints; i++) {
                                 victim->skeleton.joints[i].velocity += relative * damagemult * 40;
                             }
-                            victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200;
+                            victim->jointVel(head) += relative * damagemult * 200;
                             if (tutoriallevel != 1) {
                                 emit_sound_at(heavyimpactsound, victim->coords, 128.);
                             }
@@ -3037,7 +3032,7 @@ void Person::DoAnimations()
                             for (i = 0; i < victim->skeleton.num_joints; i++) {
                                 victim->skeleton.joints[i].velocity += relative * damagemult * 10;
                             }
-                            victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200;
+                            victim->jointVel(abdomen) += relative * damagemult * 200;
                             victim->frameTarget = 0;
                             victim->animTarget = staggerbackhighanim;
                             victim->targetyaw = targetyaw + 180;
@@ -3058,7 +3053,9 @@ void Person::DoAnimations()
                 }
 
                 if (animTarget == sweepanim && animation[animTarget].label[frameCurrent] == 5) {
-                    if (victim->animTarget != jumpupanim && distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && victim != this) {
+                    if ((victim->animTarget != jumpupanim) &&
+                        (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3) &&
+                        (victim != this->shared_from_this())) {
                         escapednum = 0;
                         if (id == 0)
                             camerashake += .2;
@@ -3096,7 +3093,7 @@ void Person::DoAnimations()
                                 if (victim->skeleton.joints[i].label == leftfoot || victim->skeleton.joints[i].label == rightfoot || victim->skeleton.joints[i].label == leftankle || victim->skeleton.joints[i].label == rightankle)
                                     victim->skeleton.joints[i].velocity += relative * damagemult * 80;
                             }
-                            victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200;
+                            victim->jointVel(abdomen) += relative * damagemult * 200;
                             victim->frameTarget = 0;
                             victim->animTarget = staggerbackhighanim;
                             victim->targetyaw = targetyaw + 180;
@@ -3139,7 +3136,7 @@ void Person::DoAnimations()
                     for (i = 0; i < victim->skeleton.num_joints; i++) {
                         victim->skeleton.joints[i].velocity += relative * damagemult * 40;
                     }
-                    victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200;
+                    victim->jointVel(abdomen) += relative * damagemult * 200;
                     //FootLand(1,2);
                     victim->Puff(abdomen);
                     victim->DoDamage(damagemult * 150 / victim->protectionhigh);
@@ -3185,7 +3182,7 @@ void Person::DoAnimations()
                     for (i = 0; i < victim->skeleton.num_joints; i++) {
                         victim->skeleton.joints[i].velocity += relative * damagemult * 30;
                     }
-                    victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200;
+                    victim->jointVel(abdomen) += relative * damagemult * 200;
                     //FootLand(1,2);
                     victim->Puff(head);
                     victim->DoDamage(damagemult * 70 / victim->protectionhigh);
@@ -3216,7 +3213,7 @@ void Person::DoAnimations()
                     for (i = 0; i < victim->skeleton.num_joints; i++) {
                         victim->skeleton.joints[i].velocity += relative * damagemult * 30;
                     }
-                    victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200;
+                    victim->jointVel(abdomen) += relative * damagemult * 200;
                     //FootLand(1,2);
                     victim->Puff(head);
                     victim->DoDamage(damagemult * 70 / victim->protectionhigh);
@@ -3234,14 +3231,14 @@ void Person::DoAnimations()
                     for (i = 0; i < victim->skeleton.num_joints; i++) {
                         victim->skeleton.joints[i].velocity += relative * damagemult * 70;
                     }
-                    victim->skeleton.joints[victim->skeleton.jointlabels[lefthand]].velocity *= .1;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[leftwrist]].velocity *= .2;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[leftelbow]].velocity *= .5;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity *= .7;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[righthand]].velocity *= .1;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[rightwrist]].velocity *= .2;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[rightelbow]].velocity *= .5;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity *= .7;
+                    victim->jointVel(lefthand) *= .1;
+                    victim->jointVel(leftwrist) *= .2;
+                    victim->jointVel(leftelbow) *= .5;
+                    victim->jointVel(leftshoulder) *= .7;
+                    victim->jointVel(righthand) *= .1;
+                    victim->jointVel(rightwrist) *= .2;
+                    victim->jointVel(rightelbow) *= .5;
+                    victim->jointVel(rightshoulder) *= .7;
 
                     victim->Puff(abdomen);
                     victim->DoDamage(damagemult * 90 / victim->protectionhigh);
@@ -3286,14 +3283,14 @@ void Person::DoAnimations()
                     for (i = 0; i < victim->skeleton.num_joints; i++) {
                         victim->skeleton.joints[i].velocity += relative * damagemult * 70;
                     }
-                    victim->skeleton.joints[victim->skeleton.jointlabels[lefthand]].velocity *= .1 - 1;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[leftwrist]].velocity *= .2 - 1;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[leftelbow]].velocity *= .5 - 1;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity *= .7 - 1;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[righthand]].velocity *= .1 - 1;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[rightwrist]].velocity *= .2 - 1;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[rightelbow]].velocity *= .5 - 1;
-                    victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity *= .7 - 1;
+                    victim->jointVel(lefthand) *= .1 - 1;
+                    victim->jointVel(leftwrist) *= .2 - 1;
+                    victim->jointVel(leftelbow) *= .5 - 1;
+                    victim->jointVel(leftshoulder) *= .7 - 1;
+                    victim->jointVel(righthand) *= .1 - 1;
+                    victim->jointVel(rightwrist) *= .2 - 1;
+                    victim->jointVel(rightelbow) *= .5 - 1;
+                    victim->jointVel(rightshoulder) *= .7 - 1;
 
                     award_bonus(id, swordreversebonus);
                 }
@@ -3318,7 +3315,7 @@ void Person::DoAnimations()
                     for (i = 0; i < victim->skeleton.num_joints; i++) {
                         victim->skeleton.joints[i].velocity += relative * damagemult * 40;
                     }
-                    victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200;
+                    victim->jointVel(abdomen) += relative * damagemult * 200;
                     //FootLand(1,2);
                     victim->Puff(abdomen);
                     victim->DoDamage(damagemult * 30 / victim->protectionhigh);
@@ -3550,7 +3547,7 @@ void Person::DoAnimations()
                     for (i = 0; i < victim->skeleton.num_joints; i++) {
                         victim->skeleton.joints[i].velocity += relative * damagemult * 20;
                     }
-                    victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200;
+                    victim->jointVel(head) += relative * damagemult * 200;
                     if (victim->damage < victim->damagetolerance - 100)
                         victim->velocity = relative * 200;
                     victim->DoDamage(damagemult * 100 / victim->protectionhead);
@@ -3571,7 +3568,7 @@ void Person::DoAnimations()
                     for (i = 0; i < victim->skeleton.num_joints; i++) {
                         victim->skeleton.joints[i].velocity += relative * damagemult * 20;
                     }
-                    victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200;
+                    victim->jointVel(head) += relative * damagemult * 200;
                 }
 
                 if (hasvictim && (animTarget == spinkickreversalanim || animTarget == sweepreversalanim || animTarget == rabbitkickreversalanim || animTarget == upunchreversalanim || animTarget == jumpreversalanim || animTarget == swordslashreversalanim || animTarget == knifeslashreversalanim || animTarget == rabbittacklereversal || animTarget == wolftacklereversal || animTarget == staffhitreversalanim || animTarget == staffspinhitreversalanim))
@@ -3683,8 +3680,8 @@ void Person::DoAnimations()
                         float distance;
                         if (numplayers > 1)
                             for (i = 0; i < numplayers; i++) {
-                                if (id != i && player[i].coords.y < coords.y && !player[i].skeleton.free) {
-                                    distance = distsq(&player[i].coords, &coords);
+                                if (id != i && Person::players[i]->coords.y < coords.y && !Person::players[i]->skeleton.free) {
+                                    distance = distsq(&Person::players[i]->coords, &coords);
                                     if (closestdist == -1 || distance < closestdist) {
                                         closestdist = distance;
                                         closest = i;
@@ -3692,7 +3689,7 @@ void Person::DoAnimations()
                                 }
                             }
                         if (closestdist > 0 && closest >= 0 && closestdist < 16) {
-                            victim = &player[closest];
+                            victim = Person::players[closest];
                             animTarget = walljumprightkickanim;
                             frameTarget = 0;
                             XYZ rotatetarget = victim->coords - coords;
@@ -3741,8 +3738,8 @@ void Person::DoAnimations()
                         float distance;
                         if (numplayers > 1)
                             for (i = 0; i < numplayers; i++) {
-                                if (id != i && player[i].coords.y < coords.y && !player[i].skeleton.free) {
-                                    distance = distsq(&player[i].coords, &coords);
+                                if (id != i && Person::players[i]->coords.y < coords.y && !Person::players[i]->skeleton.free) {
+                                    distance = distsq(&Person::players[i]->coords, &coords);
                                     if (closestdist == -1 || distance < closestdist) {
                                         closestdist = distance;
                                         closest = i;
@@ -3750,7 +3747,7 @@ void Person::DoAnimations()
                                 }
                             }
                         if (closestdist > 0 && closest >= 0 && closestdist < 16) {
-                            victim = &player[closest];
+                            victim = Person::players[closest];
                             animTarget = walljumpleftkickanim;
                             frameTarget = 0;
                             XYZ rotatetarget = victim->coords - coords;
@@ -4172,7 +4169,7 @@ void Person::DoStuff()
     flamedelay -= multiplier;
     parriedrecently -= multiplier;
     if (!victim) {
-        victim = this;
+        victim = this->shared_from_this();
         hasvictim = 0;
     }
 
@@ -4191,7 +4188,7 @@ void Person::DoStuff()
         superruntoggle = 0;
         if (aitype != passivetype) {
             superruntoggle = 1;
-            if (aitype == attacktypecutoff && (player[0].isIdle() || player[0].isCrouch() || player[0].skeleton.free || player[0].animTarget == getupfrombackanim || player[0].animTarget == getupfromfrontanim || player[0].animTarget == sneakanim) && distsq(&coords, &player[0].coords) < 16) {
+            if (aitype == attacktypecutoff && (Person::players[0]->isIdle() || Person::players[0]->isCrouch() || Person::players[0]->skeleton.free || Person::players[0]->animTarget == getupfrombackanim || Person::players[0]->animTarget == getupfromfrontanim || Person::players[0]->animTarget == sneakanim) && distsq(&coords, &Person::players[0]->coords) < 16) {
                 superruntoggle = 0;
             }
         }
@@ -4343,7 +4340,7 @@ void Person::DoStuff()
                 }
                 weaponactive = -1;
                 for (i = 0; i < numplayers; i++) {
-                    player[i].wentforweapon = 0;
+                    Person::players[i]->wentforweapon = 0;
                 }
 
                 if (id == 0) {
@@ -4769,7 +4766,7 @@ void Person::DoStuff()
             }
             weaponactive = -1;
             for (i = 0; i < numplayers; i++) {
-                player[i].wentforweapon = 0;
+                Person::players[i]->wentforweapon = 0;
             }
         }
 
@@ -4835,7 +4832,7 @@ void Person::DoStuff()
             }
             weaponactive = -1;
             for (i = 0; i < numplayers; i++) {
-                player[i].wentforweapon = 0;
+                Person::players[i]->wentforweapon = 0;
             }
         }
 
@@ -5008,7 +5005,7 @@ void Person::DoStuff()
                 yaw = targetyaw;
 
                 frameTarget = 0;
-                //     frameTarget=2;
+                // frameTarget=2;
                 animTarget = flipanim;
                 crouchtogglekeydown = 1;
                 target = 0;
@@ -5469,7 +5466,9 @@ void Person::DoStuff()
         bool behind;
         behind = 0;
         if (hasvictim) {
-            if (victim != this && !victim->dead && victim->aitype != passivetype && victim->aitype != searchtype && aitype != passivetype && aitype != searchtype && victim->id < numplayers && aitype != passivetype) {
+            if ((victim != this->shared_from_this()) && !victim->dead && (victim->aitype != passivetype) &&
+                (victim->aitype != searchtype) && (aitype != passivetype) &&
+                (aitype != searchtype) && (victim->id < numplayers) && (aitype != passivetype)) {
                 behind = (normaldotproduct(facing, coords - victim->coords) > 0);
             }
         }
@@ -5876,7 +5875,8 @@ void Person::DoStuff()
 /* EFFECT
  * inverse kinematics helper function
  */
-void IKHelper(Person *p, float interp){
+void IKHelper(Person *p, float interp)
+{
     XYZ point, newpoint, change, change2;
     float heightleft, heightright;
 
@@ -5979,9 +5979,9 @@ int Person::DrawSkeleton()
             if (!isSleeping() && !isSitting()) {
                 // TODO: give these meaningful names
                 const bool cond1 = (isIdle() || isCrouch() || isLanding() || isLandhard()
-                        || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim);
+                                    || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim);
                 const bool cond2 = (wasIdle() || wasCrouch() || wasLanding() || wasLandhard()
-                        || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim);
+                                    || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim);
 
                 if (onterrain && (cond1 && cond2) && !skeleton.free) {
                     IKHelper(this, 1);
@@ -6087,21 +6087,21 @@ int Person::DrawSkeleton()
                             glMatrixMode(GL_MODELVIEW);
                             glPushMatrix();
                             if (p1 == abdomen || p2 == abdomen)
-                                glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionbody.x,
-                                             (v0.y * (1-morphness) + v1.y * morphness) * proportionbody.y,
-                                             (v0.z * (1-morphness) + v1.z * morphness) * proportionbody.z);
+                                glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionbody.x,
+                                             (v0.y * (1 - morphness) + v1.y * morphness) * proportionbody.y,
+                                             (v0.z * (1 - morphness) + v1.z * morphness) * proportionbody.z);
                             if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow)
-                                glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionarms.x,
-                                             (v0.y * (1-morphness) + v1.y * morphness) * proportionarms.y,
-                                             (v0.z * (1-morphness) + v1.z * morphness) * proportionarms.z);
+                                glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionarms.x,
+                                             (v0.y * (1 - morphness) + v1.y * morphness) * proportionarms.y,
+                                             (v0.z * (1 - morphness) + v1.z * morphness) * proportionarms.z);
                             if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee)
-                                glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionlegs.x,
-                                             (v0.y * (1-morphness) + v1.y * morphness) * proportionlegs.y,
-                                             (v0.z * (1-morphness) + v1.z * morphness) * proportionlegs.z);
+                                glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionlegs.x,
+                                             (v0.y * (1 - morphness) + v1.y * morphness) * proportionlegs.y,
+                                             (v0.z * (1 - morphness) + v1.z * morphness) * proportionlegs.z);
                             if (p1 == head || p2 == head)
-                                glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionhead.x,
-                                             (v0.y * (1-morphness) + v1.y * morphness) * proportionhead.y,
-                                             (v0.z * (1-morphness) + v1.z * morphness) * proportionhead.z);
+                                glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionhead.x,
+                                             (v0.y * (1 - morphness) + v1.y * morphness) * proportionhead.y,
+                                             (v0.z * (1 - morphness) + v1.z * morphness) * proportionhead.z);
                             glGetFloatv(GL_MODELVIEW_MATRIX, M);
                             //if(!isnormal(M[12])||!isnormal(M[13])||!isnormal(M[14]))test=0;
                             //if(!isnormal(scale))test=1;
@@ -6640,16 +6640,16 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate,
                         intersecting = 1;
                     if (!intersecting)
                         intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
-                                                         &model->vertex[model->Triangles[j].vertex[1]],
-                                                         p1, &radius);
+                                                                &model->vertex[model->Triangles[j].vertex[1]],
+                                                                p1, &radius);
                     if (!intersecting)
                         intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[1]],
-                                                         &model->vertex[model->Triangles[j].vertex[2]],
-                                                         p1, &radius);
+                                                                &model->vertex[model->Triangles[j].vertex[2]],
+                                                                p1, &radius);
                     if (!intersecting)
                         intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
-                                                         &model->vertex[model->Triangles[j].vertex[2]],
-                                                         p1, &radius);
+                                                                &model->vertex[model->Triangles[j].vertex[2]],
+                                                                p1, &radius);
                     end = *p1 - point;
                     if (dotproduct(&model->facenormals[j], &end) > 0 && intersecting) {
                         start = *p1;
@@ -6707,21 +6707,21 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate,
                 XYZ &v1 = model->vertex[model->Triangles[j].vertex[1]];
                 XYZ &v2 = model->vertex[model->Triangles[j].vertex[2]];
                 distance = abs((model->facenormals[j].x * start.x)
-                        + (model->facenormals[j].y * start.y)
-                        + (model->facenormals[j].z * start.z)
-                        - ((model->facenormals[j].x * v0.x)
-                            + (model->facenormals[j].y * v0.y)
-                            + (model->facenormals[j].z * v0.z)));
+                               + (model->facenormals[j].y * start.y)
+                               + (model->facenormals[j].z * start.z)
+                               - ((model->facenormals[j].x * v0.x)
+                                  + (model->facenormals[j].y * v0.y)
+                                  + (model->facenormals[j].z * v0.z)));
                 if (distance < radius * .5) {
                     point = start - model->facenormals[j] * distance;
                     if (PointInTriangle( &point, model->facenormals[j], &v0, &v1, &v2))
                         intersecting = 1;
                     if (!intersecting)
-                        intersecting = sphere_line_intersection(v0.x,v0.y,v0.z, v1.x,v1.y,v1.z, p1->x, p1->y, p1->z, radius / 2);
+                        intersecting = sphere_line_intersection(v0.x, v0.y, v0.z, v1.x, v1.y, v1.z, p1->x, p1->y, p1->z, radius / 2);
                     if (!intersecting)
-                        intersecting = sphere_line_intersection(v1.x,v1.y,v1.z, v2.x,v2.y,v2.z, p1->x, p1->y, p1->z, radius / 2);
+                        intersecting = sphere_line_intersection(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, p1->x, p1->y, p1->z, radius / 2);
                     if (!intersecting)
-                        intersecting = sphere_line_intersection(v0.x,v0.y,v0.z, v2.x,v2.y,v2.z, p1->x, p1->y, p1->z, radius / 2);
+                        intersecting = sphere_line_intersection(v0.x, v0.y, v0.z, v2.x, v2.y, v2.z, p1->x, p1->y, p1->z, radius / 2);
                     end = *p1 - point;
                     if (dotproduct(&model->facenormals[j], &end) > 0 && intersecting) {
                         if ((animTarget == jumpdownanim || animTarget == jumpupanim || isFlip())) {