mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-11 07:34:33 +02:00
#4 collision check for bridges; rename DoorFloor -> TrapDoor
This commit is contained in:
@@ -186,7 +186,6 @@ namespace Debug {
|
|||||||
|
|
||||||
void debugFloor(const TR::Level &level, int roomIndex, int x, int y, int z) {
|
void debugFloor(const TR::Level &level, int roomIndex, int x, int y, int z) {
|
||||||
TR::Level::FloorInfo info;
|
TR::Level::FloorInfo info;
|
||||||
level.getFloorInfo(roomIndex, x, y, z, info);
|
|
||||||
|
|
||||||
vec3 rf[4], rc[4], f[4], c[4];
|
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_BIG_2 = 62,
|
||||||
DOOR_5 = 63,
|
DOOR_5 = 63,
|
||||||
DOOR_6 = 64,
|
DOOR_6 = 64,
|
||||||
DOOR_FLOOR_1 = 65,
|
TRAP_DOOR_1 = 65,
|
||||||
DOOR_FLOOR_2 = 66,
|
TRAP_DOOR_2 = 66,
|
||||||
|
|
||||||
|
BRIDGE_0 = 68,
|
||||||
|
BRIDGE_1 = 69,
|
||||||
|
BRIDGE_2 = 70,
|
||||||
|
|
||||||
LARA_CUT = 77,
|
LARA_CUT = 77,
|
||||||
|
|
||||||
@@ -1064,6 +1068,8 @@ namespace TR {
|
|||||||
if (info.trigCmdCount) {
|
if (info.trigCmdCount) {
|
||||||
int sx = x / 1024;
|
int sx = x / 1024;
|
||||||
int sz = z / 1024;
|
int sz = z / 1024;
|
||||||
|
int dx = x % 1024;
|
||||||
|
int dz = z % 1024;
|
||||||
|
|
||||||
for (int i = 0; i < info.trigCmdCount; i++) {
|
for (int i = 0; i < info.trigCmdCount; i++) {
|
||||||
FloorData::TriggerCommand cmd = info.trigCmd[i];
|
FloorData::TriggerCommand cmd = info.trigCmd[i];
|
||||||
@@ -1075,9 +1081,9 @@ namespace TR {
|
|||||||
if (sx != e.x / 1024 || sz != e.z / 1024) continue;
|
if (sx != e.x / 1024 || sz != e.z / 1024) continue;
|
||||||
|
|
||||||
switch (e.type) {
|
switch (e.type) {
|
||||||
case Entity::DOOR_FLOOR_1 :
|
case Entity::TRAP_DOOR_1 :
|
||||||
case Entity::DOOR_FLOOR_2 :
|
case Entity::TRAP_DOOR_2 :
|
||||||
case Entity::TRAP_FLOOR : {
|
case Entity::TRAP_FLOOR : {
|
||||||
int ey = e.y - (e.type == Entity::TRAP_FLOOR ? 512 : 0);
|
int ey = e.y - (e.type == Entity::TRAP_FLOOR ? 512 : 0);
|
||||||
if (ey >= y - 128 && ey < info.floor)
|
if (ey >= y - 128 && ey < info.floor)
|
||||||
info.floor = ey;
|
info.floor = ey;
|
||||||
@@ -1085,6 +1091,35 @@ namespace TR {
|
|||||||
info.ceiling = ey + (e.type == Entity::TRAP_FLOOR ? 0 : 256);
|
info.ceiling = ey + (e.type == Entity::TRAP_FLOOR ? 0 : 256);
|
||||||
break;
|
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 : ;
|
default : ;
|
||||||
}
|
}
|
||||||
|
11
src/level.h
11
src/level.h
@@ -85,9 +85,14 @@ struct Level {
|
|||||||
case TR::Entity::DOOR_BIG_2 :
|
case TR::Entity::DOOR_BIG_2 :
|
||||||
entity.controller = new Door(&level, i);
|
entity.controller = new Door(&level, i);
|
||||||
break;
|
break;
|
||||||
case TR::Entity::DOOR_FLOOR_1 :
|
case TR::Entity::TRAP_DOOR_1 :
|
||||||
case TR::Entity::DOOR_FLOOR_2 :
|
case TR::Entity::TRAP_DOOR_2 :
|
||||||
entity.controller = new DoorFloor(&level, i);
|
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;
|
break;
|
||||||
case TR::Entity::TRAP_FLOOR :
|
case TR::Entity::TRAP_FLOOR :
|
||||||
entity.controller = new TrapFloor(&level, i);
|
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;
|
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
|
#endif
|
Reference in New Issue
Block a user