X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FPerson.cpp;h=eff58676f4b7f312c3115522526edf926f97a5f5;hb=0e68eb62170f14f5b2aa89864e437fc2287e7565;hp=72c18625f9816b2595502fc8e18210f681b80dd9;hpb=b17ec650f79ea8efbfda00ae93bd82434fcea686;p=lugaru.git diff --git a/Source/Person.cpp b/Source/Person.cpp index 72c1862..eff5867 100644 --- a/Source/Person.cpp +++ b/Source/Person.cpp @@ -83,13 +83,7 @@ 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; } +std::vector> Person::players(1, std::shared_ptr(new Person())); /* EFFECT * @@ -101,7 +95,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 +145,7 @@ void Person::CheckKick() victim->oldcoords = victim->coords; coords = victim->coords; victim->targetyaw = targetyaw; - victim->victim = this; + victim->victim = this->shared_from_this(); } } @@ -197,8 +191,10 @@ int Person::getIdle() { if (indialogue != -1 && howactive == typeactive && creature == rabbittype) return talkidleanim; - if (hasvictim && victim != this/*||(id==0&&attackkeydown)*/) - if (/*(id==0&&attackkeydown)||*/(!victim->dead && victim->aitype != passivetype && victim->aitype != searchtype && aitype != passivetype && aitype != searchtype && victim->id < numplayers)) { + if (hasvictim && (victim != this->shared_from_this())/*||(id==0&&attackkeydown)*/) + if (/*(id==0&&attackkeydown)||*/(!victim->dead && victim->aitype != passivetype && + victim->aitype != searchtype && aitype != passivetype && aitype != searchtype && + victim->id < Person::players.size())) { if ((aitype == playercontrolled && stunned <= 0 && weaponactive == -1) || pause) { if (creature == rabbittype) return fightidleanim; @@ -510,7 +506,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 +517,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; @@ -927,8 +923,8 @@ void Person::Reverse() } victim->weaponactive = -1; - for (int j = 0; j < numplayers; j++) { - player[j].wentforweapon = 0; + for (int j = 0; j < Person::players.size(); j++) { + Person::players[j]->wentforweapon = 0; } } @@ -957,8 +953,8 @@ void Person::Reverse() } victim->weaponactive = -1; - for (int j = 0; j < numplayers; j++) { - player[j].wentforweapon = 0; + for (int j = 0; j < Person::players.size(); j++) { + Person::players[j]->wentforweapon = 0; } } animTarget = staffspinhitreversedanim; @@ -986,8 +982,8 @@ void Person::Reverse() } victim->weaponactive = -1; - for (int j = 0; j < numplayers; j++) { - player[j].wentforweapon = 0; + for (int j = 0; j < Person::players.size(); j++) { + Person::players[j]->wentforweapon = 0; } } animTarget = swordslashreversedanim; @@ -1015,8 +1011,8 @@ void Person::Reverse() } victim->weaponactive = -1; - for (int j = 0; j < numplayers; j++) { - player[j].wentforweapon = 0; + for (int j = 0; j < Person::players.size(); j++) { + Person::players[j]->wentforweapon = 0; } } animTarget = knifeslashreversedanim; @@ -1034,14 +1030,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 +1045,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 +1055,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) { @@ -1098,8 +1094,8 @@ void Person::Reverse() victim->weaponstuck = 0; } victim->weaponactive = -1; - for (int i = 0; i < numplayers; i++) { - player[i].wentforweapon = 0; + for (int i = 0; i < Person::players.size(); i++) { + Person::players[i]->wentforweapon = 0; } } @@ -1141,8 +1137,8 @@ void Person::Reverse() weaponstuck = 0; } weaponactive = -1; - for (int i = 0; i < numplayers; i++) { - player[i].wentforweapon = 0; + for (int i = 0; i < Person::players.size(); i++) { + Person::players[i]->wentforweapon = 0; } @@ -1571,8 +1567,8 @@ void Person::RagDoll(bool checkcollision) weaponstuck = 0; } weaponactive = -1; - for (i = 0; i < numplayers; i++) { - player[i].wentforweapon = 0; + for (i = 0; i < Person::players.size(); i++) { + Person::players[i]->wentforweapon = 0; } } } @@ -1946,9 +1942,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 +1966,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 +2005,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 +2061,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; @@ -2084,17 +2080,17 @@ void Person::DoAnimations() targetloc = velocity; Normalise(&targetloc); targetloc += coords; - for (i = 0; i < numplayers; i++) { + for (i = 0; i < Person::players.size(); 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 +2148,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 +2184,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 +2215,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 +2251,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 +2281,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 +2318,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 +2343,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 +2379,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 +2567,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 +2598,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 +2645,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 +2697,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 +2728,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 +2751,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 +2785,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 +2807,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); @@ -2864,8 +2860,8 @@ void Person::DoAnimations() victim->weaponstuck = 0; } victim->weaponactive = -1; - for (i = 0; i < numplayers; i++) { - player[i].wentforweapon = 0; + for (i = 0; i < Person::players.size(); i++) { + Person::players[i]->wentforweapon = 0; } } @@ -2895,8 +2891,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 +2924,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 +2973,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 +3014,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 +3033,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 +3054,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 +3094,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 +3137,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 +3183,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 +3214,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 +3232,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 +3284,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 +3316,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 +3548,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 +3569,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)) @@ -3681,10 +3679,10 @@ void Person::DoAnimations() int closest = -1; float closestdist = -1; 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 (Person::players.size() > 1) + for (i = 0; i < Person::players.size(); i++) { + if (id != i && Person::players[i]->coords.y < coords.y && !Person::players[i]->skeleton.free) { + distance = distsq(&Person::players[i]->coords, &coords); if (closestdist == -1 || distance < closestdist) { closestdist = distance; closest = i; @@ -3692,7 +3690,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; @@ -3739,10 +3737,10 @@ void Person::DoAnimations() int closest = -1; float closestdist = -1; 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 (Person::players.size() > 1) + for (i = 0; i < Person::players.size(); i++) { + if (id != i && Person::players[i]->coords.y < coords.y && !Person::players[i]->skeleton.free) { + distance = distsq(&Person::players[i]->coords, &coords); if (closestdist == -1 || distance < closestdist) { closestdist = distance; closest = i; @@ -3750,7 +3748,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 +4170,7 @@ void Person::DoStuff() flamedelay -= multiplier; parriedrecently -= multiplier; if (!victim) { - victim = this; + victim = this->shared_from_this(); hasvictim = 0; } @@ -4191,7 +4189,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; } } @@ -4342,8 +4340,8 @@ void Person::DoStuff() weaponstuck = 0; } weaponactive = -1; - for (i = 0; i < numplayers; i++) { - player[i].wentforweapon = 0; + for (i = 0; i < Person::players.size(); i++) { + Person::players[i]->wentforweapon = 0; } if (id == 0) { @@ -4768,8 +4766,8 @@ void Person::DoStuff() weaponstuck = 0; } weaponactive = -1; - for (i = 0; i < numplayers; i++) { - player[i].wentforweapon = 0; + for (i = 0; i < Person::players.size(); i++) { + Person::players[i]->wentforweapon = 0; } } @@ -4834,8 +4832,8 @@ void Person::DoStuff() weaponstuck = 0; } weaponactive = -1; - for (i = 0; i < numplayers; i++) { - player[i].wentforweapon = 0; + for (i = 0; i < Person::players.size(); i++) { + Person::players[i]->wentforweapon = 0; } } @@ -5008,7 +5006,7 @@ void Person::DoStuff() yaw = targetyaw; frameTarget = 0; - // frameTarget=2; + // frameTarget=2; animTarget = flipanim; crouchtogglekeydown = 1; target = 0; @@ -5319,7 +5317,7 @@ void Person::DoStuff() if (!skeleton.free) { bool play; play = 0; - if ((stunned > 0 || surprised > 0) && numplayers > 2 && aitype != passivetype) + if ((stunned > 0 || surprised > 0) && Person::players.size() > 2 && aitype != passivetype) play = 1; if (hasvictim) if (aitype != passivetype && victim->skeleton.free && !victim->dead) @@ -5469,7 +5467,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 < Person::players.size()) && (aitype != passivetype)) { behind = (normaldotproduct(facing, coords - victim->coords) > 0); } } @@ -5876,7 +5876,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 +5980,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 +6088,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 +6641,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 +6708,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())) {