X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FObjects%2FPerson.cpp;h=0d4fa9a2cf9b1868427f4cd0484128fe15ed9839;hb=ce14053e72f4d03078e8d5e8b22721feafb0bd20;hp=891646ab830aef23d6852817c6e843ec3cb970ab;hpb=4da2d867e24687b29e1f812980664ee1493ad416;p=lugaru.git diff --git a/Source/Objects/Person.cpp b/Source/Objects/Person.cpp index 891646a..0d4fa9a 100644 --- a/Source/Objects/Person.cpp +++ b/Source/Objects/Person.cpp @@ -1,6 +1,6 @@ /* Copyright (C) 2003, 2010 - Wolfire Games -Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file) +Copyright (C) 2010-2017 - Lugaru contributors (see AUTHORS file) This file is part of Lugaru. @@ -75,6 +75,79 @@ extern float envsoundlife[30]; extern XYZ windvector; std::vector> Person::players(1, std::shared_ptr(new Person())); +std::vector PersonType::types; + +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].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"; + + /* 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].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"; +} Person::Person() : whichpatchx(0) @@ -104,21 +177,12 @@ Person::Person() , oldcoords() , coords() , velocity() - , - proportionhead() - , proportionlegs() - , proportionarms() - , proportionbody() - , - - unconscioustime(0) - , + , unconscioustime(0) - immobile(false) - , + , immobile(false) - velspeed(0) + , velspeed(0) , targetyaw(0) , targetrot(0) , rot(0) @@ -364,6 +428,7 @@ Person::Person() jumpclimb(false) { + setProportions(1, 1, 1, 1); } /* Read a person in tfile. Throws an error if it’s not valid */ @@ -426,28 +491,10 @@ Person::Person(FILE* tfile, int mapvers, unsigned i) funpackf(tfile, "Bf Bf Bf", &metalhead, &metalhigh, &metallow); funpackf(tfile, "Bf Bf", &power, &speedmult); - float headprop, legprop, armprop, bodyprop; - if (mapvers >= 4) { - funpackf(tfile, "Bf Bf Bf Bf", &headprop, &bodyprop, &armprop, &legprop); + funpackf(tfile, "Bf Bf Bf Bf", &proportions[0], &proportions[1], &proportions[2], &proportions[3]); } else { - headprop = 1; - bodyprop = 1; - armprop = 1; - legprop = 1; - } - - if (creature == wolftype) { - proportionhead = 1.1 * headprop; - proportionbody = 1.1 * bodyprop; - proportionarms = 1.1 * armprop; - proportionlegs = 1.1 * legprop; - } else if (creature == rabbittype) { - proportionhead = 1.2 * headprop; - proportionbody = 1.05 * bodyprop; - proportionarms = 1.00 * armprop; - proportionlegs = 1.1 * legprop; - proportionlegs.y = 1.05 * legprop; + setProportions(1, 1, 1, 1); } funpackf(tfile, "Bi", &numclothes); @@ -479,41 +526,41 @@ Person::Person(FILE* tfile, int mapvers, unsigned i) void Person::skeletonLoad(bool clothes) { skeleton.id = id; - if (creature != wolftype) { - skeleton.Load( - "Skeleton/BasicFigure", - "Skeleton/BasicFigureLow", - "Skeleton/RabbitBelt", - "Models/Body.solid", - "Models/Body2.solid", - "Models/Body3.solid", - "Models/Body4.solid", - "Models/Body5.solid", - "Models/Body6.solid", - "Models/Body7.solid", - "Models/BodyLow.solid", - "Models/Belt.solid", - clothes); - } else { - skeleton.Load( - "Skeleton/BasicFigureWolf", - "Skeleton/BasicFigureWolfLow", - "Skeleton/RabbitBelt", - "Models/Wolf.solid", - "Models/Wolf2.solid", - "Models/Wolf3.solid", - "Models/Wolf4.solid", - "Models/Wolf5.solid", - "Models/Wolf6.solid", - "Models/Wolf7.solid", - "Models/WolfLow.solid", - "Models/Belt.solid", - clothes); - } + skeleton.Load( + PersonType::types[creature].figureFileName, + PersonType::types[creature].lowFigureFileName, + PersonType::types[creature].clothesFileName, + PersonType::types[creature].modelFileNames[0], + PersonType::types[creature].modelFileNames[1], + PersonType::types[creature].modelFileNames[2], + PersonType::types[creature].modelFileNames[3], + PersonType::types[creature].modelFileNames[4], + PersonType::types[creature].modelFileNames[5], + PersonType::types[creature].modelFileNames[6], + PersonType::types[creature].lowModelFileName, + PersonType::types[creature].modelClothesFileName, + clothes); skeleton.drawmodel.textureptr.load(creatureskin[creature][whichskin], 1, &skeleton.skinText[0], &skeleton.skinsize); } +void Person::setProportions(float head, float body, float arms, float legs) +{ + proportions[0] = head; + proportions[1] = body; + proportions[2] = arms; + proportions[3] = legs; +} + +XYZ Person::getProportion(int part) const +{ + XYZ prop = PersonType::types[creature].proportions[part] * proportions[part]; + if (cellophane) { + prop.z = 0; + } + return prop; +} + /* EFFECT * * USES: @@ -578,8 +625,8 @@ void Person::CheckKick() /* EFFECT * * USES: - * GameTick/doPlayerCollisions - spread fire between players - * GameTick/doDevKeys - press f to ignite + * GameTick::doPlayerCollisions - spread fire between players + * GameTick::ProcessDevKeys - press f to ignite * Person::DoStuff - spread fire from lit campfires and bushes */ void Person::CatchFire() @@ -686,13 +733,7 @@ int Person::getIdle() */ int Person::getCrouch() { - if (creature == rabbittype) { - return crouchanim; - } - if (creature == wolftype) { - return wolfcrouchanim; - } - return 0; + return PersonType::types[creature].animCrouch; } /* FUNCTION @@ -700,59 +741,32 @@ int Person::getCrouch() */ int Person::getRun() { - if (creature == rabbittype && (!superruntoggle || weaponactive != -1)) { - return runanim; - } - if (creature == wolftype && (!superruntoggle)) { - return wolfrunanim; - } - - if (creature == rabbittype && (superruntoggle && weaponactive == -1)) { - return rabbitrunninganim; - } - if (creature == wolftype && (superruntoggle)) { - return wolfrunninganim; + if (superruntoggle && (weaponactive == -1)) { + return PersonType::types[creature].animRunning; + } else { + return PersonType::types[creature].animRun; } - return 0; } /* FUNCTION */ int Person::getStop() { - if (creature == rabbittype) { - return stopanim; - } - if (creature == wolftype) { - return wolfstopanim; - } - return 0; + return PersonType::types[creature].animStop; } /* FUNCTION */ int Person::getLanding() { - if (creature == rabbittype) { - return landanim; - } - if (creature == wolftype) { - return wolflandanim; - } - return 0; + return PersonType::types[creature].animLanding; } /* FUNCTION */ int Person::getLandhard() { - if (creature == rabbittype) { - return landhardanim; - } - if (creature == wolftype) { - return wolflandhardanim; - } - return 0; + return PersonType::types[creature].animLandingHard; } /* EFFECT @@ -2380,34 +2394,7 @@ void Person::DoAnimations() if (targetFrame().label == 4 && aitype != playercontrolled) { if (Animation::animations[animTarget].attack != neutral) { unsigned r = abs(Random() % 4); - if (creature == rabbittype) { - if (r == 0) { - whichsound = rabbitattacksound; - } - if (r == 1) { - whichsound = rabbitattack2sound; - } - if (r == 2) { - whichsound = rabbitattack3sound; - } - if (r == 3) { - whichsound = rabbitattack4sound; - } - } - if (creature == wolftype) { - if (r == 0) { - whichsound = barksound; - } - if (r == 1) { - whichsound = bark2sound; - } - if (r == 2) { - whichsound = bark3sound; - } - if (r == 3) { - whichsound = barkgrowlsound; - } - } + whichsound = PersonType::types[creature].soundsAttack[r]; speechdelay = .3; } } @@ -5918,21 +5905,8 @@ void Person::DoStuff() int whichsound = -1; if (speechdelay <= 0) { unsigned int i = abs(Random() % 4); - if (creature == rabbittype) { - if (i == 0) { - whichsound = rabbitchitter; - } - if (i == 1) { - whichsound = rabbitchitter2; - } - } - if (creature == wolftype) { - if (i == 0) { - whichsound = growlsound; - } - if (i == 1) { - whichsound = growl2sound; - } + if (i < 2) { + whichsound = PersonType::types[creature].soundsTalk[i]; } } speechdelay = .3; @@ -6721,24 +6695,24 @@ 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) * getProportion(1).x, + (v0.y * (1 - morphness) + v1.y * morphness) * getProportion(1).y, + (v0.z * (1 - morphness) + v1.z * morphness) * getProportion(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) * 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) * getProportion(2).x, + (v0.y * (1 - morphness) + v1.y * morphness) * getProportion(2).y, + (v0.z * (1 - morphness) + v1.z * morphness) * getProportion(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) * 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) * getProportion(3).x, + (v0.y * (1 - morphness) + v1.y * morphness) * getProportion(3).y, + (v0.z * (1 - morphness) + v1.z * morphness) * getProportion(3).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) * getProportion(0).x, + (v0.y * (1 - morphness) + v1.y * morphness) * getProportion(0).y, + (v0.z * (1 - morphness) + v1.z * morphness) * getProportion(0).z); } glGetFloatv(GL_MODELVIEW_MATRIX, M); skeleton.drawmodel.vertex[skeleton.muscles[i].vertices[j]].x = M[12] * scale; @@ -6753,24 +6727,24 @@ int Person::DrawSkeleton() glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (p1 == abdomen || p2 == abdomen) { - glTranslatef(v0.x * proportionbody.x, - v0.y * proportionbody.y, - v0.z * proportionbody.z); + glTranslatef(v0.x * getProportion(1).x, + v0.y * getProportion(1).y, + v0.z * getProportion(1).z); } if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) { - glTranslatef(v0.x * proportionarms.x, - v0.y * proportionarms.y, - v0.z * proportionarms.z); + glTranslatef(v0.x * getProportion(2).x, + v0.y * getProportion(2).y, + v0.z * getProportion(2).z); } if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) { - glTranslatef(v0.x * proportionlegs.x, - v0.y * proportionlegs.y, - v0.z * proportionlegs.z); + glTranslatef(v0.x * getProportion(3).x, + v0.y * getProportion(3).y, + v0.z * getProportion(3).z); } if (p1 == head || p2 == head) { - glTranslatef(v0.x * proportionhead.x, - v0.y * proportionhead.y, - v0.z * proportionhead.z); + glTranslatef(v0.x * getProportion(0).x, + v0.y * getProportion(0).y, + v0.z * getProportion(0).z); } glGetFloatv(GL_MODELVIEW_MATRIX, M); @@ -6809,24 +6783,24 @@ int Person::DrawSkeleton() glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (p1 == abdomen || p2 == abdomen) { - glTranslatef(v0.x * proportionbody.x, - v0.y * proportionbody.y, - v0.z * proportionbody.z); + glTranslatef(v0.x * getProportion(1).x, + v0.y * getProportion(1).y, + v0.z * getProportion(1).z); } if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) { - glTranslatef(v0.x * proportionarms.x, - v0.y * proportionarms.y, - v0.z * proportionarms.z); + glTranslatef(v0.x * getProportion(2).x, + v0.y * getProportion(2).y, + v0.z * getProportion(2).z); } if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) { - glTranslatef(v0.x * proportionlegs.x, - v0.y * proportionlegs.y, - v0.z * proportionlegs.z); + glTranslatef(v0.x * getProportion(3).x, + v0.y * getProportion(3).y, + v0.z * getProportion(3).z); } if (p1 == head || p2 == head) { - glTranslatef(v0.x * proportionhead.x, - v0.y * proportionhead.y, - v0.z * proportionhead.z); + glTranslatef(v0.x * getProportion(0).x, + v0.y * getProportion(0).y, + v0.z * getProportion(0).z); } glGetFloatv(GL_MODELVIEW_MATRIX, M); skeleton.drawmodelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x = M[12] * scale; @@ -8443,10 +8417,11 @@ void Person::doAI() //chase player XYZ rotatetarget = Person::players[0]->coords + Person::players[0]->velocity; XYZ targetpoint = Person::players[0]->coords; - if (findLength(&velocity) != 0 && + float vellength = findLength(&velocity); + if (vellength != 0 && distsq(&Person::players[0]->coords, &coords) < distsq(&rotatetarget, &coords)) { targetpoint += Person::players[0]->velocity * - findDistance(&Person::players[0]->coords, &coords) / findLength(&velocity); + findDistance(&Person::players[0]->coords, &coords) / vellength; } targetyaw = roughDirectionTo(coords, targetpoint); lookyaw = targetyaw;