X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FObjects%2FPerson.cpp;h=7a16709f30a2deffd852bec219fdc7c16b56cfd8;hb=b35798eb8ef5e05a4574bbf1115c31a504496616;hp=817ee03734268e777c76543571c2faa279e51c0b;hpb=3bc5ee099a4322252ae9afd564335b60856a0054;p=lugaru.git diff --git a/Source/Objects/Person.cpp b/Source/Objects/Person.cpp index 817ee03..7a16709 100644 --- a/Source/Objects/Person.cpp +++ b/Source/Objects/Person.cpp @@ -73,110 +73,6 @@ extern float envsoundlife[30]; extern XYZ windvector; std::vector> Person::players(1, std::shared_ptr(new Person())); -std::vector PersonType::types; - -PersonType::PersonType() -{ - animTalkIdle = tempanim; -} - -bool PersonType::hasAnimTalkIdle() -{ - return (animTalkIdle != tempanim); -} - -void PersonType::Load() -{ - types.resize(2); - - /* Wolf */ - types[wolftype].proportions[0] = 1.1; - types[wolftype].proportions[1] = 1.1; - types[wolftype].proportions[2] = 1.1; - types[wolftype].proportions[3] = 1.1; - - types[wolftype].animRun = wolfrunanim; - types[wolftype].animRunning = wolfrunninganim; - types[wolftype].animCrouch = wolfcrouchanim; - types[wolftype].animStop = wolfstopanim; - types[wolftype].animLanding = wolflandanim; - types[wolftype].animLandingHard = wolflandhardanim; - types[wolftype].animFightIdle = wolfidle; - types[wolftype].animBounceIdle = wolfidle; - - types[wolftype].soundsAttack[0] = barksound; - types[wolftype].soundsAttack[1] = bark2sound; - types[wolftype].soundsAttack[2] = bark3sound; - types[wolftype].soundsAttack[3] = barkgrowlsound; - types[wolftype].soundsTalk[0] = growlsound; - types[wolftype].soundsTalk[1] = growl2sound; - - types[wolftype].figureFileName = "Skeleton/BasicFigureWolf"; - types[wolftype].lowFigureFileName = "Skeleton/BasicFigureWolfLow"; - types[wolftype].clothesFileName = "Skeleton/RabbitBelt"; - types[wolftype].modelFileNames[0] = "Models/Wolf.solid"; - types[wolftype].modelFileNames[1] = "Models/Wolf2.solid"; - types[wolftype].modelFileNames[2] = "Models/Wolf3.solid"; - types[wolftype].modelFileNames[3] = "Models/Wolf4.solid"; - types[wolftype].modelFileNames[4] = "Models/Wolf5.solid"; - types[wolftype].modelFileNames[5] = "Models/Wolf6.solid"; - types[wolftype].modelFileNames[6] = "Models/Wolf7.solid"; - types[wolftype].lowModelFileName = "Models/WolfLow.solid"; - types[wolftype].modelClothesFileName = "Models/Belt.solid"; - - types[wolftype].skins.resize(3); - types[wolftype].skins[0] = "Textures/Wolf.jpg"; - types[wolftype].skins[1] = "Textures/DarkWolf.jpg"; - types[wolftype].skins[2] = "Textures/SnowWolf.jpg"; - - /* Rabbit */ - types[rabbittype].proportions[0] = 1.2; - types[rabbittype].proportions[1] = 1.05; - types[rabbittype].proportions[2] = 1; - types[rabbittype].proportions[3] = 1.1; - types[rabbittype].proportions[3].y = 1.05; - - types[rabbittype].animRun = runanim; - types[rabbittype].animRunning = rabbitrunninganim; - types[rabbittype].animCrouch = crouchanim; - types[rabbittype].animStop = stopanim; - types[rabbittype].animLanding = landanim; - types[rabbittype].animLandingHard = landhardanim; - types[rabbittype].animFightIdle = fightidleanim; - types[rabbittype].animBounceIdle = bounceidleanim; - - types[rabbittype].soundsAttack[0] = rabbitattacksound; - types[rabbittype].soundsAttack[1] = rabbitattack2sound; - types[rabbittype].soundsAttack[2] = rabbitattack3sound; - types[rabbittype].soundsAttack[3] = rabbitattack4sound; - types[rabbittype].soundsTalk[0] = rabbitchitter; - types[rabbittype].soundsTalk[1] = rabbitchitter2; - - types[rabbittype].figureFileName = "Skeleton/BasicFigure"; - types[rabbittype].lowFigureFileName = "Skeleton/BasicFigureLow"; - types[rabbittype].clothesFileName = "Skeleton/RabbitBelt"; - types[rabbittype].modelFileNames[0] = "Models/Body.solid"; - types[rabbittype].modelFileNames[1] = "Models/Body2.solid"; - types[rabbittype].modelFileNames[2] = "Models/Body3.solid"; - types[rabbittype].modelFileNames[3] = "Models/Body4.solid"; - types[rabbittype].modelFileNames[4] = "Models/Body5.solid"; - types[rabbittype].modelFileNames[5] = "Models/Body6.solid"; - types[rabbittype].modelFileNames[6] = "Models/Body7.solid"; - types[rabbittype].lowModelFileName = "Models/BodyLow.solid"; - types[rabbittype].modelClothesFileName = "Models/Belt.solid"; - - types[rabbittype].skins.resize(10); - types[rabbittype].skins[0] = "Textures/Fur3.jpg"; - types[rabbittype].skins[1] = "Textures/Fur.jpg"; - types[rabbittype].skins[2] = "Textures/Fur2.jpg"; - types[rabbittype].skins[3] = "Textures/Lynx.jpg"; - types[rabbittype].skins[4] = "Textures/Otter.jpg"; - types[rabbittype].skins[5] = "Textures/Opal.jpg"; - types[rabbittype].skins[6] = "Textures/Sable.jpg"; - types[rabbittype].skins[7] = "Textures/Chocolate.jpg"; - types[rabbittype].skins[8] = "Textures/BW2.jpg"; - types[rabbittype].skins[9] = "Textures/WB2.jpg"; -} Person::Person() : whichpatchx(0) @@ -539,10 +435,13 @@ Person::Person(FILE* tfile, int mapvers, unsigned i) loaded = true; + if (creature == wolftype) { + damagetolerance = 300; + } + if (scale < 0) { if (creature == wolftype) { scale = .23; - damagetolerance = 300; } else { scale = .2; } @@ -581,7 +480,12 @@ void Person::setProportions(float head, float body, float arms, float legs) proportions[3] = legs; } -XYZ Person::getProportion(int part) const +float Person::getProportion(int part) const +{ + return proportions[part]; +} + +XYZ Person::getProportionXYZ(int part) const { XYZ prop = PersonType::types[creature].proportions[part] * proportions[part]; if (cellophane) { @@ -602,7 +506,7 @@ void Person::CheckKick() } if (Animation::animations[victim->animTarget].height != lowheight) { - float damagemult = (creature == wolftype ? 2.5 : 1.) * power * power; + float damagemult = PersonType::types[creature].power * power * power; XYZ relative = velocity; relative.y = 0; Normalise(&relative); @@ -2334,7 +2238,7 @@ void Person::DoAnimations() animCurrent = animTarget; frameTarget++; - if (animTarget == removeknifeanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == removeknifeanim && currentFrame().label == 5) { for (unsigned i = 0; i < weapons.size(); i++) { if (weapons[i].owner == -1) { if (distsqflat(&coords, &weapons[i].position) < 4 && weaponactive == -1) { @@ -2350,7 +2254,7 @@ void Person::DoAnimations() } } - if (animTarget == crouchremoveknifeanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == crouchremoveknifeanim && currentFrame().label == 5) { for (unsigned i = 0; i < weapons.size(); i++) { bool willwork = true; if (weapons[i].owner != -1) { @@ -2436,7 +2340,7 @@ void Person::DoAnimations() } } - if (animCurrent == drawleftanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == drawleftanim && currentFrame().label == 5) { if (weaponactive == -1) { weaponactive = 0; } else if (weaponactive == 0) { @@ -2536,15 +2440,12 @@ void Person::DoAnimations() } //Move impacts - float damagemult = 1 * power; - if (creature == wolftype) { - damagemult = 2.5 * power; - } + float damagemult = PersonType::types[creature].power * power; if (hasvictim) { damagemult /= victim->damagetolerance / 200; } if ((Animation::animations[animTarget].attack == normalattack || animTarget == walljumprightkickanim || animTarget == walljumpleftkickanim) && (!feint) && (victim->skeleton.free != 2 || animTarget == killanim || animTarget == dropkickanim || animTarget == crouchstabanim || animTarget == swordgroundstabanim || animTarget == staffgroundsmashanim)) { - if (animTarget == spinkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == spinkickanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) { escapednum = 0; if (id == 0) { @@ -2582,7 +2483,7 @@ void Person::DoAnimations() } } - if (animTarget == wolfslapanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == wolfslapanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) { escapednum = 0; if (id == 0) { @@ -2617,7 +2518,7 @@ void Person::DoAnimations() } } - if (animTarget == walljumprightkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == walljumprightkickanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) { escapednum = 0; if (id == 0) { @@ -2654,7 +2555,7 @@ void Person::DoAnimations() } } - if (animTarget == walljumpleftkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == walljumpleftkickanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) { escapednum = 0; if (id == 0) { @@ -2691,7 +2592,7 @@ void Person::DoAnimations() } } - if (animTarget == blockhighleftstrikeanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == blockhighleftstrikeanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != lowheight) { escapednum = 0; if (id == 0) { @@ -2716,7 +2617,7 @@ void Person::DoAnimations() } } - if (animTarget == killanim && Animation::animations[animTarget].frames[frameCurrent].label == 8) { + if (animCurrent == killanim && currentFrame().label == 8) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && victim->dead) { escapednum = 0; if (id == 0) { @@ -2751,7 +2652,7 @@ void Person::DoAnimations() } } - if (animTarget == killanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == killanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 9 && victim->dead) { escapednum = 0; if (id == 0) { @@ -2777,7 +2678,7 @@ void Person::DoAnimations() } } - if (animTarget == dropkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) { + if (animCurrent == dropkickanim && currentFrame().label == 7) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 9 && victim->skeleton.free) { escapednum = 0; if (id == 0) { @@ -2819,7 +2720,7 @@ void Person::DoAnimations() } } - if ((animTarget == crouchstabanim || animTarget == swordgroundstabanim) && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if ((animCurrent == crouchstabanim || animCurrent == swordgroundstabanim) && currentFrame().label == 5) { if (hasvictim) { if (!victim->skeleton.free) { @@ -2916,7 +2817,7 @@ void Person::DoAnimations() } } - if ((animTarget == crouchstabanim || animTarget == swordgroundstabanim) && Animation::animations[animTarget].frames[frameCurrent].label == 6) { + if ((animCurrent == crouchstabanim || animCurrent == swordgroundstabanim) && currentFrame().label == 6) { if (!hasvictim) { emit_sound_at(knifedrawsound, coords, 128); } @@ -3020,7 +2921,7 @@ void Person::DoAnimations() } } - if (animTarget == upunchanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == upunchanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3) { escapednum = 0; if (id == 0) { @@ -3058,7 +2959,7 @@ void Person::DoAnimations() } } - if (animTarget == winduppunchanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == winduppunchanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 2) { escapednum = 0; if (id == 0) { @@ -3105,7 +3006,7 @@ void Person::DoAnimations() } } - if (animTarget == blockhighleftanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == blockhighleftanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 4) { if (victim->id == 0) { camerashake += .4; @@ -3116,7 +3017,7 @@ void Person::DoAnimations() } } - if (animTarget == swordslashparryanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == swordslashparryanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 4) { if (victim->id == 0) { camerashake += .4; @@ -3141,7 +3042,7 @@ void Person::DoAnimations() } } - if (animTarget == knifethrowanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == knifethrowanim && currentFrame().label == 5) { if (weaponactive != -1) { escapednum = 0; XYZ aim; @@ -3156,9 +3057,9 @@ void Person::DoAnimations() } } - if (animTarget == knifeslashstartanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == knifeslashstartanim && currentFrame().label == 5) { if (hasvictim) { - if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 4.5 && /*Animation::animations[victim->animTarget].height!=lowheight&&*/ victim->animTarget != dodgebackanim && victim->animTarget != rollanim) { + if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 4.5 && victim->animTarget != dodgebackanim && victim->animTarget != rollanim) { escapednum = 0; if (!Tutorial::active) { victim->DoBloodBig(1.5 / victim->armorhigh, 225); @@ -3213,7 +3114,7 @@ void Person::DoAnimations() } } } - if (animTarget == swordslashanim && Animation::animations[animTarget].frames[frameCurrent].label == 5 && victim->animTarget != rollanim) { + if (animCurrent == swordslashanim && currentFrame().label == 5 && victim->animTarget != rollanim) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim) { if (victim->weaponactive == -1 || normaldotproduct(victim->facing, victim->coords - coords) > 0 || (Random() % 2 == 0)) { award_bonus(id, Slashbonus); @@ -3298,7 +3199,7 @@ void Person::DoAnimations() } } - if (animTarget == staffhitanim && Animation::animations[animTarget].frames[frameCurrent].label == 5 && victim->animTarget != rollanim) { + if (animCurrent == staffhitanim && currentFrame().label == 5 && victim->animTarget != rollanim) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim && victim->animTarget != sweepanim) { if (!Tutorial::active) { weapons[weaponids[0]].damage += .4 + float(abs(Random() % 100) - 50) / 250; @@ -3333,7 +3234,7 @@ void Person::DoAnimations() } } - if (animTarget == staffspinhitanim && Animation::animations[animTarget].frames[frameCurrent].label == 5 && victim->animTarget != rollanim) { + if (animCurrent == staffspinhitanim && currentFrame().label == 5 && victim->animTarget != rollanim) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5 && victim->animTarget != dodgebackanim && victim->animTarget != sweepanim) { if (!Tutorial::active) { weapons[weaponids[0]].damage += .6 + float(abs(Random() % 100) - 50) / 250; @@ -3366,7 +3267,7 @@ void Person::DoAnimations() } } - if (animTarget == staffgroundsmashanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == staffgroundsmashanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 6.5) { escapednum = 0; if (!Tutorial::active) { @@ -3418,7 +3319,7 @@ void Person::DoAnimations() } } - if (animTarget == lowkickanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == lowkickanim && currentFrame().label == 5) { if (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3 && Animation::animations[victim->animTarget].height != highheight) { escapednum = 0; if (id == 0) { @@ -3480,7 +3381,7 @@ void Person::DoAnimations() } } - if (animTarget == sweepanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == sweepanim && currentFrame().label == 5) { if ((victim->animTarget != jumpupanim) && (distsq(&coords, &victim->coords) < (scale * 5) * (scale * 5) * 3) && (victim != this->shared_from_this())) { @@ -3542,7 +3443,7 @@ void Person::DoAnimations() } } if (Animation::animations[animTarget].attack == reversal && (!victim->feint || (victim->lastattack == victim->lastattack2 && victim->lastattack2 == victim->lastattack3 && Random() % 2) || animTarget == knifefollowanim)) { - if (animTarget == spinkickreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) { + if (animCurrent == spinkickreversalanim && currentFrame().label == 7) { escapednum = 0; if (id == 0) { camerashake += .4; @@ -3587,7 +3488,7 @@ void Person::DoAnimations() } } - if (animTarget == staffhitreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (animCurrent == staffhitreversalanim && currentFrame().label == 5) { escapednum = 0; if (id == 0) { camerashake += .4; @@ -3610,7 +3511,7 @@ void Person::DoAnimations() victim->DoDamage(damagemult * 70 / victim->protectionhigh); } - if (animTarget == staffspinhitreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) { + if (animCurrent == staffspinhitreversalanim && currentFrame().label == 7) { escapednum = 0; if (id == 0) { camerashake += .4; @@ -3640,7 +3541,7 @@ void Person::DoAnimations() victim->DoDamage(damagemult * 70 / victim->protectionhigh); } - if (animTarget == upunchreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) { + if (animCurrent == upunchreversalanim && currentFrame().label == 7) { escapednum = 0; victim->RagDoll(1); XYZ relative; @@ -3692,7 +3593,7 @@ void Person::DoAnimations() } } - if (animTarget == swordslashreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) { + if (animCurrent == swordslashreversalanim && currentFrame().label == 7) { escapednum = 0; victim->RagDoll(1); XYZ relative; @@ -3715,7 +3616,7 @@ void Person::DoAnimations() award_bonus(id, swordreversebonus); } - if (hasvictim && animTarget == knifeslashreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) { + if (hasvictim && animCurrent == knifeslashreversalanim && currentFrame().label == 7) { escapednum = 0; if (id == 0) { camerashake += .4; @@ -3743,7 +3644,7 @@ void Person::DoAnimations() award_bonus(id, Reversal); } - if (hasvictim && animTarget == sneakattackanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) { + if (hasvictim && animCurrent == sneakattackanim && currentFrame().label == 7) { escapednum = 0; victim->RagDoll(0); victim->skeleton.spinny = 0; @@ -3788,7 +3689,7 @@ void Person::DoAnimations() award_bonus(id, spinecrusher); } - if (hasvictim && (animTarget == knifefollowanim || animTarget == knifesneakattackanim) && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (hasvictim && (animCurrent == knifefollowanim || animCurrent == knifesneakattackanim) && currentFrame().label == 5) { if (weaponactive != -1 && victim->bloodloss < victim->damagetolerance) { escapednum = 0; if (animTarget == knifefollowanim) { @@ -3833,7 +3734,7 @@ void Person::DoAnimations() } } - if (hasvictim && (animTarget == knifefollowanim || animTarget == knifesneakattackanim) && Animation::animations[animTarget].frames[frameCurrent].label == 6) { + if (hasvictim && (animCurrent == knifefollowanim || animCurrent == knifesneakattackanim) && currentFrame().label == 6) { escapednum = 0; victim->velocity = 0; for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { @@ -3866,7 +3767,7 @@ void Person::DoAnimations() } } - if (hasvictim && (animTarget == swordsneakattackanim) && Animation::animations[animTarget].frames[frameCurrent].label == 5) { + if (hasvictim && (animCurrent == swordsneakattackanim) && currentFrame().label == 5) { if (weaponactive != -1 && victim->bloodloss < victim->damagetolerance) { award_bonus(id, backstab); @@ -3895,7 +3796,7 @@ void Person::DoAnimations() } } - if (hasvictim && animTarget == swordsneakattackanim && Animation::animations[animTarget].frames[frameCurrent].label == 6) { + if (hasvictim && animCurrent == swordsneakattackanim && currentFrame().label == 6) { escapednum = 0; victim->velocity = 0; for (unsigned i = 0; i < victim->skeleton.joints.size(); i++) { @@ -3922,7 +3823,7 @@ void Person::DoAnimations() } } - if (animTarget == sweepreversalanim && Animation::animations[animTarget].frames[frameCurrent].label == 7) { + if (animCurrent == sweepreversalanim && currentFrame().label == 7) { escapednum = 0; if (id == 0) { camerashake += .4; @@ -3984,7 +3885,7 @@ void Person::DoAnimations() victim->velocity = 0; } - if (animTarget == sweepreversalanim && ((Animation::animations[animTarget].frames[frameCurrent].label == 9 && victim->damage < victim->damagetolerance) || (Animation::animations[animTarget].frames[frameCurrent].label == 7 && victim->damage > victim->damagetolerance))) { + if (animCurrent == sweepreversalanim && ((currentFrame().label == 9 && victim->damage < victim->damagetolerance) || (currentFrame().label == 7 && victim->damage > victim->damagetolerance))) { escapednum = 0; victim->RagDoll(0); XYZ relative; @@ -4008,7 +3909,7 @@ void Person::DoAnimations() } //Animation end - if (frameTarget > int(Animation::animations[animCurrent].frames.size()) - 1) { + if (frameTarget >= int(Animation::animations[animCurrent].frames.size())) { frameTarget = 0; if (wasStop()) { animTarget = getIdle(); @@ -4481,6 +4382,11 @@ void Person::DoAnimations() frameCurrent = frameTarget; target = 1; } + + if (frameCurrent >= int(Animation::animations[animCurrent].frames.size())) { + frameCurrent = Animation::animations[animCurrent].frames.size() - 1; + } + oldrot = rot; rot = targetrot * target; yaw += rot - oldrot; @@ -4489,9 +4395,7 @@ void Person::DoAnimations() oldrot = 0; targetrot = 0; } - if (frameCurrent >= int(Animation::animations[animCurrent].frames.size())) { - frameCurrent = Animation::animations[animCurrent].frames.size() - 1; - } + if (animCurrent != oldanimCurrent || animTarget != oldanimTarget || ((frameCurrent != oldframeCurrent || frameTarget != oldframeTarget) && !calcrot)) { //Old rotates for (unsigned i = 0; i < skeleton.joints.size(); i++) { @@ -6611,24 +6515,24 @@ int Person::DrawSkeleton() glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (p1 == abdomen || p2 == abdomen) { - glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportion(1).x, - (v0.y * (1 - morphness) + v1.y * morphness) * getProportion(1).y, - (v0.z * (1 - morphness) + v1.z * morphness) * getProportion(1).z); + glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportionXYZ(1).x, + (v0.y * (1 - morphness) + v1.y * morphness) * getProportionXYZ(1).y, + (v0.z * (1 - morphness) + v1.z * morphness) * getProportionXYZ(1).z); } if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) { - glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportion(2).x, - (v0.y * (1 - morphness) + v1.y * morphness) * getProportion(2).y, - (v0.z * (1 - morphness) + v1.z * morphness) * getProportion(2).z); + glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportionXYZ(2).x, + (v0.y * (1 - morphness) + v1.y * morphness) * getProportionXYZ(2).y, + (v0.z * (1 - morphness) + v1.z * morphness) * getProportionXYZ(2).z); } if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) { - glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportion(3).x, - (v0.y * (1 - morphness) + v1.y * morphness) * getProportion(3).y, - (v0.z * (1 - morphness) + v1.z * morphness) * getProportion(3).z); + glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportionXYZ(3).x, + (v0.y * (1 - morphness) + v1.y * morphness) * getProportionXYZ(3).y, + (v0.z * (1 - morphness) + v1.z * morphness) * getProportionXYZ(3).z); } if (p1 == head || p2 == head) { - glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportion(0).x, - (v0.y * (1 - morphness) + v1.y * morphness) * getProportion(0).y, - (v0.z * (1 - morphness) + v1.z * morphness) * getProportion(0).z); + glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * getProportionXYZ(0).x, + (v0.y * (1 - morphness) + v1.y * morphness) * getProportionXYZ(0).y, + (v0.z * (1 - morphness) + v1.z * morphness) * getProportionXYZ(0).z); } glGetFloatv(GL_MODELVIEW_MATRIX, M); skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].x = M[12] * scale; @@ -6643,24 +6547,24 @@ int Person::DrawSkeleton() glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (p1 == abdomen || p2 == abdomen) { - glTranslatef(v0.x * getProportion(1).x, - v0.y * getProportion(1).y, - v0.z * getProportion(1).z); + glTranslatef(v0.x * getProportionXYZ(1).x, + v0.y * getProportionXYZ(1).y, + v0.z * getProportionXYZ(1).z); } if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) { - glTranslatef(v0.x * getProportion(2).x, - v0.y * getProportion(2).y, - v0.z * getProportion(2).z); + glTranslatef(v0.x * getProportionXYZ(2).x, + v0.y * getProportionXYZ(2).y, + v0.z * getProportionXYZ(2).z); } if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) { - glTranslatef(v0.x * getProportion(3).x, - v0.y * getProportion(3).y, - v0.z * getProportion(3).z); + glTranslatef(v0.x * getProportionXYZ(3).x, + v0.y * getProportionXYZ(3).y, + v0.z * getProportionXYZ(3).z); } if (p1 == head || p2 == head) { - glTranslatef(v0.x * getProportion(0).x, - v0.y * getProportion(0).y, - v0.z * getProportion(0).z); + glTranslatef(v0.x * getProportionXYZ(0).x, + v0.y * getProportionXYZ(0).y, + v0.z * getProportionXYZ(0).z); } glGetFloatv(GL_MODELVIEW_MATRIX, M); @@ -6699,24 +6603,24 @@ int Person::DrawSkeleton() glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (p1 == abdomen || p2 == abdomen) { - glTranslatef(v0.x * getProportion(1).x, - v0.y * getProportion(1).y, - v0.z * getProportion(1).z); + glTranslatef(v0.x * getProportionXYZ(1).x, + v0.y * getProportionXYZ(1).y, + v0.z * getProportionXYZ(1).z); } if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) { - glTranslatef(v0.x * getProportion(2).x, - v0.y * getProportion(2).y, - v0.z * getProportion(2).z); + glTranslatef(v0.x * getProportionXYZ(2).x, + v0.y * getProportionXYZ(2).y, + v0.z * getProportionXYZ(2).z); } if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) { - glTranslatef(v0.x * getProportion(3).x, - v0.y * getProportion(3).y, - v0.z * getProportion(3).z); + glTranslatef(v0.x * getProportionXYZ(3).x, + v0.y * getProportionXYZ(3).y, + v0.z * getProportionXYZ(3).z); } if (p1 == head || p2 == head) { - glTranslatef(v0.x * getProportion(0).x, - v0.y * getProportion(0).y, - v0.z * getProportion(0).z); + glTranslatef(v0.x * getProportionXYZ(0).x, + v0.y * getProportionXYZ(0).y, + v0.z * getProportionXYZ(0).z); } glGetFloatv(GL_MODELVIEW_MATRIX, M); skeleton.drawmodelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x = M[12] * scale;