extern XYZ windvector;
std::vector<std::shared_ptr<Person>> Person::players(1, std::shared_ptr<Person>(new Person()));
+std::vector<PersonType> 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)
, 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)
jumpclimb(false)
{
+ setProportions(1, 1, 1, 1);
}
/* Read a person in tfile. Throws an error if it’s not valid */
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);
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:
*/
int Person::getCrouch()
{
- if (creature == rabbittype) {
- return crouchanim;
- }
- if (creature == wolftype) {
- return wolfcrouchanim;
- }
- return 0;
+ return PersonType::types[creature].animCrouch;
}
/* FUNCTION
*/
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
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;
}
}
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;
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;
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);
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;