From 10d45a4150348bb67f078728fedcbe3654230c9e Mon Sep 17 00:00:00 2001 From: XProger Date: Sun, 27 Nov 2016 01:48:25 +0300 Subject: [PATCH] #4 collision check for bridges; rename DoorFloor -> TrapDoor --- src/debug.h | 1 - src/format.h | 45 ++++++++++++++++++++++++++++++++++++++++----- src/level.h | 11 ++++++++--- src/trigger.h | 12 ++++++++++-- 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/debug.h b/src/debug.h index e366d25..243fe0e 100644 --- a/src/debug.h +++ b/src/debug.h @@ -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]; diff --git a/src/format.h b/src/format.h index 8f79e81..d1c4a17 100644 --- a/src/format.h +++ b/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 : ; } diff --git a/src/level.h b/src/level.h index 3f086e0..0916738 100644 --- a/src/level.h +++ b/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); diff --git a/src/trigger.h b/src/trigger.h index 7fec58d..1531f2e 100644 --- a/src/trigger.h +++ b/src/trigger.h @@ -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 \ No newline at end of file