#include "Sounds.h"
#include "Awards.h"
#include "Game.h"
+#include "Dialog.h"
+#include "Utils/Folders.h"
extern float multiplier;
extern Terrain terrain;
extern int hostile;
extern float hostiletime;
-extern int indialogue;
-
extern bool gamestarted;
std::vector<std::shared_ptr<Person>> Person::players(1, std::shared_ptr<Person>(new Person()));
stunned(0),
surprised(0),
runninghowlong(0),
+ occluded(0),
lastoccluded(0),
laststanding(0),
escapednum(0),
tempanimation(),
- occluded(0),
-
jumpclimb(false)
{
}
+/* Read a person in tfile. Throws an error if it’s not valid */
+Person::Person(FILE *tfile, int mapvers, unsigned i) : Person()
+{
+ id = i;
+ funpackf(tfile, "Bi Bi Bf Bf Bf Bi", &whichskin, &creature, &coords.x, &coords.y, &coords.z, &num_weapons);
+ if (mapvers >= 5) {
+ funpackf(tfile, "Bi", &howactive);
+ } else {
+ howactive = typeactive;
+ }
+ if (mapvers >= 3) {
+ funpackf(tfile, "Bf", &scale);
+ } else {
+ scale = -1;
+ }
+ if (mapvers >= 11) {
+ funpackf(tfile, "Bb", &immobile);
+ } else {
+ immobile = 0;
+ }
+ if (mapvers >= 12) {
+ funpackf(tfile, "Bf", &yaw);
+ } else {
+ yaw = 0;
+ }
+ targetyaw = yaw;
+ if (num_weapons < 0 || num_weapons > 5) {
+ throw InvalidPersonException();
+ }
+ if (num_weapons > 0 && num_weapons < 5) {
+ for (int j = 0; j < num_weapons; j++) {
+ weaponids[j] = weapons.size();
+ int type;
+ funpackf(tfile, "Bi", &type);
+ weapons.push_back(Weapon(type, id));
+ }
+ }
+ funpackf(tfile, "Bi", &numwaypoints);
+ for (int j = 0; j < numwaypoints; j++) {
+ funpackf(tfile, "Bf", &waypoints[j].x);
+ funpackf(tfile, "Bf", &waypoints[j].y);
+ funpackf(tfile, "Bf", &waypoints[j].z);
+ if (mapvers >= 5) {
+ funpackf(tfile, "Bi", &waypointtype[j]);
+ } else {
+ waypointtype[j] = wpkeepwalking;
+ }
+ }
+
+ funpackf(tfile, "Bi", &waypoint);
+ if (waypoint > (numwaypoints - 1)) {
+ waypoint = 0;
+ }
+
+ funpackf(tfile, "Bf Bf Bf", &armorhead, &armorhigh, &armorlow);
+ funpackf(tfile, "Bf Bf Bf", &protectionhead, &protectionhigh, &protectionlow);
+ 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);
+ } 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;
+ }
+
+ funpackf(tfile, "Bi", &numclothes);
+ for (int k = 0; k < numclothes; k++) {
+ int templength;
+ funpackf(tfile, "Bi", &templength);
+ for (int l = 0; l < templength; l++)
+ funpackf(tfile, "Bb", &clothes[k][l]);
+ clothes[k][templength] = '\0';
+ funpackf(tfile, "Bf Bf Bf", &clothestintr[k], &clothestintg[k], &clothestintb[k]);
+ }
+}
+
/* EFFECT
*
* USES:
*/
int Person::getIdle()
{
- if (indialogue != -1 && howactive == typeactive && creature == rabbittype)
+ if (Dialog::inDialog() && (howactive == typeactive) && (creature == rabbittype))
return talkidleanim;
if (hasvictim && (victim != this->shared_from_this())/*||(id==0&&attackkeydown)*/)
if (/*(id==0&&attackkeydown)||*/(!victim->dead && victim->aitype != passivetype &&
/* EFFECT
*/
-void Person::FootLand(int which, float opacity)
+void Person::FootLand(bodyparts whichfoot, float opacity)
{
+ if ((whichfoot != leftfoot) && (whichfoot != rightfoot)) {
+ cerr << "FootLand called on wrong bodypart" << endl;
+ return;
+ }
static XYZ terrainlight;
static XYZ footvel, footpoint;
- if (opacity >= 1 || skiddelay <= 0)
+ if (opacity >= 1 || skiddelay <= 0) {
if (opacity > 1) {
footvel = 0;
- if (which == 0)
- footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords;
- if (which == 1)
- footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords;
- //footpoint.y=coords.y;
+ footpoint = DoRotation(jointPos(whichfoot), 0, yaw, 0) * scale + coords;
if (distsq(&footpoint, &viewer))
Sprite::MakeSprite(cloudsprite, footpoint, footvel, 1, 1, 1, .5, .2 * opacity);
- } else if (environment == snowyenvironment && onterrain && terrain.getOpacity(coords.x, coords.z) < .2) {
+ } else if (onterrain && terrain.getOpacity(coords.x, coords.z) < .2) {
footvel = velocity / 5;
if (footvel.y < .8)
footvel.y = .8;
- if (which == 0)
- footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords;
- if (which == 1)
- footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords;
+ footpoint = DoRotation(jointPos(whichfoot), 0, yaw, 0) * scale + coords;
footpoint.y = terrain.getHeight(footpoint.x, footpoint.z);
terrainlight = terrain.getLighting(footpoint.x, footpoint.z);
- if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4)
- Sprite::MakeSprite(cloudsprite, footpoint, footvel * .6, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7 * opacity);
- if (opacity >= 1 || detail == 2)
- if (detail == 2)
- if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4)
+ if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4) {
+ if (environment == snowyenvironment) {
+ Sprite::MakeSprite(cloudsprite, footpoint, footvel * .6, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7 * opacity);
+ if (detail == 2) {
terrain.MakeDecal(footprintdecal, footpoint, .2, 1 * opacity, yaw);
- } else if (environment == grassyenvironment && onterrain && terrain.getOpacity(coords.x, coords.z) < .2) {
- footvel = velocity / 5;
- if (footvel.y < .8)
- footvel.y = .8;
- if (which == 0)
- footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords;
- if (which == 1)
- footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords;
- footpoint.y = terrain.getHeight(footpoint.x, footpoint.z);
- terrainlight = terrain.getLighting(footpoint.x, footpoint.z);
- if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4)
- Sprite::MakeSprite(cloudsprite, footpoint, footvel * .6, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5 * opacity);
- } else if (environment == desertenvironment && onterrain && terrain.getOpacity(coords.x, coords.z) < .2) {
- footvel = velocity / 5;
- if (footvel.y < .8)
- footvel.y = .8;
- if (which == 0)
- footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords;
- if (which == 1)
- footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords;
- footpoint.y = terrain.getHeight(footpoint.x, footpoint.z);
- terrainlight = terrain.getLighting(footpoint.x, footpoint.z);
- if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4)
- Sprite::MakeSprite(cloudsprite, footpoint, footvel * .6, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7 * opacity);
- if (opacity >= 1 || detail == 2)
- if (detail == 2)
- if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4)
+ }
+ } else if (environment == grassyenvironment) {
+ Sprite::MakeSprite(cloudsprite, footpoint, footvel * .6, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5 * opacity);
+ } else if (environment == desertenvironment) {
+ Sprite::MakeSprite(cloudsprite, footpoint, footvel * .6, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7 * opacity);
+ if (detail == 2) {
terrain.MakeDecal(footprintdecal, footpoint, .2, .25 * opacity, yaw);
- } else if (isLanding() || animTarget == jumpupanim || isLandhard()) {
+ }
+ }
+ }
+ } else if (isLanding() || (animTarget == jumpupanim) || isLandhard()) {
footvel = velocity / 5;
if (footvel.y < .8)
footvel.y = .8;
- if (which == 0)
- footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords;
- if (which == 1)
- footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords;
- //footpoint.y=coords.y;
- if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4)
+ footpoint = DoRotation(jointPos(whichfoot), 0, yaw, 0) * scale + coords;
+ if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4) {
Sprite::MakeSprite(cloudsprite, footpoint, footvel * .6, 1, 1, 1, .5, .2 * opacity);
+ }
}
+ }
}
/* EFFECT
else
whichsound = footstepsound2;
if (animation[animTarget].label[frameTarget] == 1)
- FootLand(0, 1);
+ FootLand(leftfoot, 1);
if (animation[animTarget].label[frameTarget] == 2)
- FootLand(1, 1);
+ FootLand(rightfoot, 1);
if (animation[animTarget].label[frameTarget] == 3 && isRun()) {
- FootLand(1, 1);
- FootLand(0, 1);
+ FootLand(rightfoot, 1);
+ FootLand(leftfoot, 1);
}
}
if ((!wasLanding() && !wasLandhard()) && animCurrent != getIdle() && (isLanding() || isLandhard())) {
- FootLand(0, 1);
- FootLand(1, 1);
+ FootLand(leftfoot, 1);
+ FootLand(rightfoot, 1);
}
transspeed = 0;
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(head) += relative * damagemult * 200;
- //FootLand(1,2);
victim->Puff(head);
victim->DoDamage(damagemult * 100 / victim->protectionhead);
victim->skeleton.joints[i].velocity += relative * damagemult * 20;
}
victim->jointVel(head) += relative * damagemult * 100;
- //FootLand(1,2);
victim->Puff(head);
victim->DoDamage(damagemult * 50 / victim->protectionhead);
}
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(head) += relative * damagemult * 200;
- //FootLand(1,2);
victim->Puff(head);
victim->DoDamage(damagemult * 150 / victim->protectionhead);
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(head) += relative * damagemult * 200;
- //FootLand(1,2);
victim->Puff(head);
victim->DoDamage(damagemult * 150 / victim->protectionhead);
victim->skeleton.joints[i].velocity += relative * damagemult * 30;
}
victim->jointVel(head) += relative * damagemult * 100;
- //FootLand(1,2);
victim->Puff(head);
victim->DoDamage(damagemult * 50 / victim->protectionhead);
}
}
victim->jointVel(head) += relative * damagemult * 230;
victim->jointVel(neck) += relative * damagemult * 230;
- //FootLand(1,2);
victim->Puff(head);
if (tutoriallevel != 1) {
victim->DoDamage(damagemult * 120 / victim->protectionhigh);
}
victim->jointVel(head) += relative * damagemult * 220;
victim->jointVel(neck) += relative * damagemult * 220;
- //FootLand(1,2);
victim->Puff(head);
if (tutoriallevel != 1) {
victim->DoDamage(damagemult * 350 / victim->protectionhead);
victim->RagDoll(0);
XYZ relative;
relative = 0;
- /*relative=victim->coords-coords;
- relative.y=0;
- Normalise(&relative);
- relative=DoRotation(relative,0,90,0);*/
relative.y = -1;
Normalise(&relative);
if (!victim->dead) {
for (int i = 0; i < victim->skeleton.num_joints; i++) {
victim->skeleton.joints[i].velocity = relative * damagemult * 40;
}
- //FootLand(1,2);
victim->jointVel(abdomen) += relative * damagemult * 40;
}
if (victim->dead) {
for (int i = 0; i < victim->skeleton.num_joints; i++) {
victim->skeleton.joints[i].velocity = relative * damagemult * abs(Random() % 20);
}
- //FootLand(1,2);
- //victim->jointVel(abdomen)+=relative*damagemult*20;
}
victim->Puff(abdomen);
if (tutoriallevel != 1) {
relative = victim->coords - oldcoords;
relative.y = 0;
Normalise(&relative);
- //relative=DoRotation(relative,0,-90,0);
for (int i = 0; i < victim->skeleton.num_joints; i++) {
victim->skeleton.joints[i].velocity += relative * damagemult * 40;
}
victim->jointVel(abdomen) += relative * damagemult * 200;
- //FootLand(1,2);
victim->Puff(abdomen);
victim->DoDamage(damagemult * 150 / victim->protectionhigh);
weapons[weaponids[weaponactive]].blooddrip += 3;
}
if (weaponactive == -1 && creature == wolftype) {
- ;
emit_sound_at(clawslicesound, victim->coords, 128.);
victim->spurt = 1;
victim->DoBloodBig(2 / victim->armorhigh, 175);
frameTarget = 0;
if (wasStop()) {
animTarget = getIdle();
- FootLand(0, 1);
- FootLand(1, 1);
+ FootLand(leftfoot, 1);
+ FootLand(rightfoot, 1);
}
if (animCurrent == rabbittackleanim || animCurrent == rabbittacklinganim) {
animTarget = rollanim;
}
if (animCurrent == rollanim) {
animTarget = getCrouch();
- FootLand(0, 1);
- FootLand(1, 1);
+ FootLand(leftfoot, 1);
+ FootLand(rightfoot, 1);
}
if (isFlip()) {
if (animTarget == walljumprightkickanim) {
if (velspeed > 5 && (isLanding() || isLandhard())) {
skiddingdelay += multiplier;
if (skiddelay <= 0) {
- FootLand(0, .5);
- FootLand(1, .5);
+ FootLand(leftfoot, .5);
+ FootLand(rightfoot, .5);
skiddelay = .02;
}
} else
if (velspeed > 5 && (isLanding() || isLandhard())) {
skiddingdelay += multiplier;
if (skiddelay <= 0) {
- FootLand(0, .5);
- FootLand(1, .5);
+ FootLand(leftfoot, .5);
+ FootLand(rightfoot, .5);
skiddelay = .02;
}
} else
if (terrainheight > 1.7)
terrainheight = 1.7;
- //burnt=0;
glColor4f((1 - (1 - terrainlight.x) / terrainheight) - burnt, (1 - (1 - terrainlight.y) / terrainheight) - burnt, (1 - (1 - terrainlight.z) / terrainheight) - burnt, distance);
glDisable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.0001);
//Load Image
ImageRec texture;
- bool opened = load_image(fileName, texture);
+ bool opened = load_image(Folders::getResourcePath(fileName).c_str(), texture);
float alphanum;
//Is it valid?