1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-02-24 15:32:30 +01:00

#4 collision check for bridges; rename DoorFloor -> TrapDoor

This commit is contained in:
XProger 2016-11-27 01:48:25 +03:00
parent 79e125d9b5
commit 10d45a4150
4 changed files with 58 additions and 11 deletions

View File

@ -186,7 +186,6 @@ namespace Debug {
void debugFloor(const TR::Level &level, int roomIndex, int x, int y, int z) {
TR::Level::FloorInfo info;
level.getFloorInfo(roomIndex, x, y, z, info);
vec3 rf[4], rc[4], f[4], c[4];

View File

@ -368,8 +368,12 @@ namespace TR {
DOOR_BIG_2 = 62,
DOOR_5 = 63,
DOOR_6 = 64,
DOOR_FLOOR_1 = 65,
DOOR_FLOOR_2 = 66,
TRAP_DOOR_1 = 65,
TRAP_DOOR_2 = 66,
BRIDGE_0 = 68,
BRIDGE_1 = 69,
BRIDGE_2 = 70,
LARA_CUT = 77,
@ -1064,6 +1068,8 @@ namespace TR {
if (info.trigCmdCount) {
int sx = x / 1024;
int sz = z / 1024;
int dx = x % 1024;
int dz = z % 1024;
for (int i = 0; i < info.trigCmdCount; i++) {
FloorData::TriggerCommand cmd = info.trigCmd[i];
@ -1075,9 +1081,9 @@ namespace TR {
if (sx != e.x / 1024 || sz != e.z / 1024) continue;
switch (e.type) {
case Entity::DOOR_FLOOR_1 :
case Entity::DOOR_FLOOR_2 :
case Entity::TRAP_FLOOR : {
case Entity::TRAP_DOOR_1 :
case Entity::TRAP_DOOR_2 :
case Entity::TRAP_FLOOR : {
int ey = e.y - (e.type == Entity::TRAP_FLOOR ? 512 : 0);
if (ey >= y - 128 && ey < info.floor)
info.floor = ey;
@ -1085,6 +1091,35 @@ namespace TR {
info.ceiling = ey + (e.type == Entity::TRAP_FLOOR ? 0 : 256);
break;
}
case Entity::BRIDGE_0 :
case Entity::BRIDGE_1 :
case Entity::BRIDGE_2 : {
int s = (e.type == Entity::BRIDGE_1) ? 1 :
(e.type == Entity::BRIDGE_2) ? 2 : 0;
int ey = e.y, sx = 0, sz = 0;
if (s > 0) {
switch (e.rotation.value / 0x4000) { // get slantXZ by direction
case 0 : sx = s; break;
case 1 : sz = -s; break;
case 2 : sx = -s; break;
case 3 : sz = s; break;
}
ey -= sx * (sx > 0 ? (dx - 1024) : dx) >> 2;
ey -= sz * (sz > 0 ? (dz - 1024) : dz) >> 2;
}
if (y - 128 <= ey) {
info.floor = ey;
info.slantX = sx;
info.slantZ = sz;
}
if (ey < y - 128)
info.ceiling = ey + 64;
break;
}
default : ;
}

View File

@ -85,9 +85,14 @@ struct Level {
case TR::Entity::DOOR_BIG_2 :
entity.controller = new Door(&level, i);
break;
case TR::Entity::DOOR_FLOOR_1 :
case TR::Entity::DOOR_FLOOR_2 :
entity.controller = new DoorFloor(&level, i);
case TR::Entity::TRAP_DOOR_1 :
case TR::Entity::TRAP_DOOR_2 :
entity.controller = new TrapDoor(&level, i);
break;
case TR::Entity::BRIDGE_0 :
case TR::Entity::BRIDGE_1 :
case TR::Entity::BRIDGE_2 :
entity.controller = new Bridge(&level, i);
break;
case TR::Entity::TRAP_FLOOR :
entity.controller = new TrapFloor(&level, i);

View File

@ -220,9 +220,9 @@ struct Door : Trigger {
}
};
struct DoorFloor : Trigger {
struct TrapDoor : Trigger {
DoorFloor(TR::Level *level, int entity) : Trigger(level, entity, true) {
TrapDoor(TR::Level *level, int entity) : Trigger(level, entity, true) {
getEntity().flags.collision = true;
}
@ -280,4 +280,12 @@ struct TrapFloor : Trigger {
}
};
struct Bridge : Trigger {
Bridge(TR::Level *level, int entity) : Trigger(level, entity, true) {
getEntity().flags.collision = true;
}
};
#endif