mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-13 08:34:32 +02:00
#22 heavy triggers
This commit is contained in:
@@ -50,6 +50,8 @@ struct IGame {
|
|||||||
virtual void renderView(int roomIndex, bool water) {}
|
virtual void renderView(int roomIndex, bool water) {}
|
||||||
virtual void setEffect(TR::Effect effect, float param) {}
|
virtual void setEffect(TR::Effect effect, float param) {}
|
||||||
|
|
||||||
|
virtual void checkTrigger(Controller *controller, bool heavy) {}
|
||||||
|
|
||||||
virtual bool invUse(TR::Entity::Type type) { return false; }
|
virtual bool invUse(TR::Entity::Type type) { return false; }
|
||||||
virtual void invAdd(TR::Entity::Type type, int count = 1) {}
|
virtual void invAdd(TR::Entity::Type type, int count = 1) {}
|
||||||
virtual int* invCount(TR::Entity::Type type) { return NULL; }
|
virtual int* invCount(TR::Entity::Type type) { return NULL; }
|
||||||
|
12
src/lara.h
12
src/lara.h
@@ -1354,13 +1354,14 @@ struct Lara : Character {
|
|||||||
switch (hitType) {
|
switch (hitType) {
|
||||||
case TR::HIT_BOULDER : {
|
case TR::HIT_BOULDER : {
|
||||||
animation.setAnim(ANIM_DEATH_BOULDER);
|
animation.setAnim(ANIM_DEATH_BOULDER);
|
||||||
angle = enemy->angle;
|
if (enemy)
|
||||||
|
angle = enemy->angle;
|
||||||
TR::Level::FloorInfo info;
|
TR::Level::FloorInfo info;
|
||||||
level->getFloorInfo(getRoomIndex(), int(pos.x), int(pos.y), int(pos.z), info);
|
level->getFloorInfo(getRoomIndex(), int(pos.x), int(pos.y), int(pos.z), info);
|
||||||
vec3 d = getDir();
|
vec3 d = getDir();
|
||||||
vec3 v = info.getSlant(d);
|
vec3 v = info.getSlant(d);
|
||||||
angle.x = -acos(d.dot(v));
|
angle.x = -acos(d.dot(v));
|
||||||
v = ((TrapBoulder*)enemy)->velocity * 2.0f;
|
v = enemy ? ((TrapBoulder*)enemy)->velocity * 2.0f : vec3(0.0f);
|
||||||
for (int i = 0; i < 15; i++)
|
for (int i = 0; i < 15; i++)
|
||||||
addBlood(256.0f, 512.0f, v);
|
addBlood(256.0f, 512.0f, v);
|
||||||
break;
|
break;
|
||||||
@@ -1564,8 +1565,8 @@ struct Lara : Character {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkTrigger() {
|
void checkTrigger(Controller *controller, bool heavy) {
|
||||||
TR::Entity &e = getEntity();
|
TR::Entity &e = controller->getEntity();
|
||||||
TR::Level::FloorInfo info;
|
TR::Level::FloorInfo info;
|
||||||
level->getFloorInfo(e.room, e.x, e.y, e.z, info);
|
level->getFloorInfo(e.room, e.x, e.y, e.z, info);
|
||||||
|
|
||||||
@@ -1653,6 +1654,7 @@ struct Lara : Character {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TR::Level::Trigger::HEAVY :
|
case TR::Level::Trigger::HEAVY :
|
||||||
|
if (!heavy) return;
|
||||||
break;
|
break;
|
||||||
case TR::Level::Trigger::DUMMY :
|
case TR::Level::Trigger::DUMMY :
|
||||||
return;
|
return;
|
||||||
@@ -2353,7 +2355,7 @@ struct Lara : Character {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (!(input & DEATH))
|
if (!(input & DEATH))
|
||||||
checkTrigger();
|
checkTrigger(this, false);
|
||||||
|
|
||||||
// get turning angle
|
// get turning angle
|
||||||
float w = (input & LEFT) ? -1.0f : ((input & RIGHT) ? 1.0f : 0.0f);
|
float w = (input & LEFT) ? -1.0f : ((input & RIGHT) ? 1.0f : 0.0f);
|
||||||
|
@@ -213,6 +213,10 @@ struct Level : IGame {
|
|||||||
this->effectTimer = 0.0f;
|
this->effectTimer = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void checkTrigger(Controller *controller, bool heavy) {
|
||||||
|
lara->checkTrigger(controller, heavy);
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool invUse(TR::Entity::Type type) {
|
virtual bool invUse(TR::Entity::Type type) {
|
||||||
if (!lara->useItem(type))
|
if (!lara->useItem(type))
|
||||||
return inventory.use(type);
|
return inventory.use(type);
|
||||||
|
@@ -176,6 +176,8 @@ struct TrapBoulder : Controller {
|
|||||||
if (info.roomNext != TR::NO_ROOM)
|
if (info.roomNext != TR::NO_ROOM)
|
||||||
getEntity().room = info.roomNext;
|
getEntity().room = info.roomNext;
|
||||||
|
|
||||||
|
game->checkTrigger(this, true);
|
||||||
|
|
||||||
vec3 v = pos + getDir() * 512.0f;
|
vec3 v = pos + getDir() * 512.0f;
|
||||||
level->getFloorInfo(getRoomIndex(), int(v.x), int(v.y), int(v.z), info);
|
level->getFloorInfo(getRoomIndex(), int(v.x), int(v.y), int(v.z), info);
|
||||||
if (pos.y > info.floor) {
|
if (pos.y > info.floor) {
|
||||||
@@ -267,6 +269,7 @@ struct Block : Controller {
|
|||||||
updateEntity();
|
updateEntity();
|
||||||
updateFloor(true);
|
updateFloor(true);
|
||||||
deactivate();
|
deactivate();
|
||||||
|
game->checkTrigger(this, true);
|
||||||
}
|
}
|
||||||
updateLights();
|
updateLights();
|
||||||
}
|
}
|
||||||
@@ -318,6 +321,7 @@ struct MovingBlock : Controller {
|
|||||||
pos.x = int(pos.x / 1024.0f) * 1024.0f + 512.0f;
|
pos.x = int(pos.x / 1024.0f) * 1024.0f + 512.0f;
|
||||||
pos.z = int(pos.z / 1024.0f) * 1024.0f + 512.0f;
|
pos.z = int(pos.z / 1024.0f) * 1024.0f + 512.0f;
|
||||||
updateFloor(true);
|
updateFloor(true);
|
||||||
|
game->checkTrigger(this, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user