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:
parent
79e125d9b5
commit
10d45a4150
@ -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];
|
||||
|
||||
|
45
src/format.h
45
src/format.h
@ -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 : ;
|
||||
}
|
||||
|
11
src/level.h
11
src/level.h
@ -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);
|
||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user