From 282927ffdac03c12f210f73fbe77d0f33787b5e0 Mon Sep 17 00:00:00 2001 From: Lwmte Date: Mon, 8 Nov 2021 17:28:04 +0300 Subject: [PATCH] Fix #344 --- TR5Main/Game/Lara/lara_swim.cpp | 18 +++++++++--------- TR5Main/Game/control/box.cpp | 2 +- TR5Main/Game/control/control.cpp | 18 +++++++++--------- TR5Main/Game/floordata.cpp | 16 ++++++++-------- TR5Main/Game/room.cpp | 6 +++--- TR5Main/Game/room.h | 2 +- .../Objects/TR4/Entity/tr4_knighttemplar.cpp | 2 +- TR5Main/Objects/TR4/Entity/tr4_wraith.cpp | 4 ++-- .../Objects/TR5/Shatter/tr5_smashobject.cpp | 2 +- TR5Main/Renderer/Render11Helper.cpp | 4 ++-- TR5Main/Renderer/Renderer11Draw.cpp | 2 +- TR5Main/Renderer/Renderer11Frame.cpp | 2 +- TR5Main/Specific/level.cpp | 10 ++++++---- 13 files changed, 45 insertions(+), 43 deletions(-) diff --git a/TR5Main/Game/Lara/lara_swim.cpp b/TR5Main/Game/Lara/lara_swim.cpp index f97877f51..1f5ea7ff2 100644 --- a/TR5Main/Game/Lara/lara_swim.cpp +++ b/TR5Main/Game/Lara/lara_swim.cpp @@ -120,23 +120,23 @@ int GetWaterDepth(int x, int y, int z, short roomNumber) zFloor = 0; if (xFloor < 1) xFloor = 1; - else if (xFloor > r->ySize - 2) - xFloor = r->ySize - 2; + else if (xFloor > r->xSize - 2) + xFloor = r->xSize - 2; } - else if (zFloor >= r->xSize - 1) + else if (zFloor >= r->zSize - 1) { - zFloor = r->xSize - 1; + zFloor = r->zSize - 1; if (xFloor < 1) xFloor = 1; - else if (xFloor > r->ySize - 2) - xFloor = r->ySize - 2; + else if (xFloor > r->xSize - 2) + xFloor = r->xSize - 2; } else if (xFloor < 0) xFloor = 0; - else if (xFloor >= r->ySize) - xFloor = r->ySize - 1; + else if (xFloor >= r->xSize) + xFloor = r->xSize - 1; - floor = &r->floor[zFloor + xFloor * r->xSize]; + floor = &r->floor[zFloor + xFloor * r->zSize]; roomIndex = floor->WallPortal; if (roomIndex != NO_ROOM) { diff --git a/TR5Main/Game/control/box.cpp b/TR5Main/Game/control/box.cpp index 07a231b92..32832147a 100644 --- a/TR5Main/Game/control/box.cpp +++ b/TR5Main/Game/control/box.cpp @@ -2094,7 +2094,7 @@ void InitialiseItemBoxData() { for (const auto& mesh : r.mesh) { - long index = ((mesh.pos.zPos - r.z) / 1024) + r.xSize * ((mesh.pos.xPos - r.x) / 1024); + long index = ((mesh.pos.zPos - r.z) / 1024) + r.zSize * ((mesh.pos.xPos - r.x) / 1024); if (index > r.floor.size()) continue; diff --git a/TR5Main/Game/control/control.cpp b/TR5Main/Game/control/control.cpp index 04ecafa8c..381fab2b3 100644 --- a/TR5Main/Game/control/control.cpp +++ b/TR5Main/Game/control/control.cpp @@ -873,23 +873,23 @@ int GetWaterHeight(int x, int y, int z, short roomNumber) zBlock = 0; if (xBlock < 1) xBlock = 1; - else if (xBlock > r->ySize - 2) - xBlock = r->ySize - 2; + else if (xBlock > r->xSize - 2) + xBlock = r->xSize - 2; } - else if (zBlock >= r->xSize - 1) + else if (zBlock >= r->zSize - 1) { - zBlock = r->xSize - 1; + zBlock = r->zSize - 1; if (xBlock < 1) xBlock = 1; - else if (xBlock > r->ySize - 2) - xBlock = r->ySize - 2; + else if (xBlock > r->xSize - 2) + xBlock = r->xSize - 2; } else if (xBlock < 0) xBlock = 0; - else if (xBlock >= r->ySize) - xBlock = r->ySize - 1; + else if (xBlock >= r->xSize) + xBlock = r->xSize - 1; - floor = &r->floor[zBlock + xBlock * r->xSize]; + floor = &r->floor[zBlock + xBlock * r->zSize]; adjoiningRoom = floor->WallPortal; if (adjoiningRoom != NO_ROOM) diff --git a/TR5Main/Game/floordata.cpp b/TR5Main/Game/floordata.cpp index 36e0bbd73..0c0648c14 100644 --- a/TR5Main/Game/floordata.cpp +++ b/TR5Main/Game/floordata.cpp @@ -275,9 +275,9 @@ namespace TEN::Floordata VectorInt2 GetRoomPosition(int roomNumber, int x, int z) { const auto& room = g_Level.Rooms[roomNumber]; - const auto xRoom = (z - room.z) / SECTOR(1); - const auto yRoom = (x - room.x) / SECTOR(1); - auto pos = VectorInt2{xRoom, yRoom}; + const auto zRoom = (z - room.z) / SECTOR(1); + const auto xRoom = (x - room.x) / SECTOR(1); + auto pos = VectorInt2{xRoom, zRoom}; if (pos.x < 0) { @@ -292,9 +292,9 @@ namespace TEN::Floordata { pos.y = 0; } - else if (pos.y > room.ySize - 1) + else if (pos.y > room.zSize - 1) { - pos.y = room.ySize - 1; + pos.y = room.zSize - 1; } return pos; @@ -303,7 +303,7 @@ namespace TEN::Floordata FLOOR_INFO& GetFloor(int roomNumber, const VectorInt2& pos) { auto& room = g_Level.Rooms[roomNumber]; - return room.floor[room.xSize * pos.y + pos.x]; + return room.floor[room.zSize * pos.x + pos.y]; } FLOOR_INFO& GetFloor(int roomNumber, int x, int z) @@ -787,8 +787,8 @@ namespace TEN::Floordata auto maxZ = ceil((std::max(std::max(std::max(corners[0].z, corners[1].z), corners[4].z), corners[5].z) - room->z) / SECTOR(1)); // Run through all blocks enclosed in AABB - for (int x = 0; x < room->ySize; x++) - for (int z = 0; z < room->xSize; z++) + for (int x = 0; x < room->xSize; x++) + for (int z = 0; z < room->zSize; z++) { auto pX = room->x + (x * WALL_SIZE) + (WALL_SIZE / 2); auto pZ = room->z + (z * WALL_SIZE) + (WALL_SIZE / 2); diff --git a/TR5Main/Game/room.cpp b/TR5Main/Game/room.cpp index e8af58e8e..993891265 100644 --- a/TR5Main/Game/room.cpp +++ b/TR5Main/Game/room.cpp @@ -131,8 +131,8 @@ int IsRoomOutside(int x, int y, int z) ROOM_INFO* r = &g_Level.Rooms[roomNumber]; if ((y > r->maxceiling) && (y < r->minfloor) - && ((z > (r->z + 1024)) && (z < (r->z + ((r->xSize - 1) * 1024)))) - && ((x > (r->x + 1024)) && (x < (r->x + ((r->ySize - 1) * 1024))))) + && ((z > (r->z + 1024)) && (z < (r->z + ((r->zSize - 1) * 1024)))) + && ((x > (r->x + 1024)) && (x < (r->x + ((r->xSize - 1) * 1024))))) { IsRoomOutsideNo = roomNumber; @@ -155,7 +155,7 @@ FLOOR_INFO* GetSector(ROOM_INFO* r, int x, int z) { int sectorX = (x) / SECTOR(1); int sectorZ = (z) / SECTOR(1); - int index = sectorZ + sectorX * r->xSize; + int index = sectorZ + sectorX * r->zSize; if (index > r->floor.size()) { return nullptr; diff --git a/TR5Main/Game/room.h b/TR5Main/Game/room.h index c1816f3bd..2046ef968 100644 --- a/TR5Main/Game/room.h +++ b/TR5Main/Game/room.h @@ -103,7 +103,7 @@ struct ROOM_INFO std::vector buckets; std::vector doors; int xSize; - int ySize; + int zSize; std::vector floor; Vector3 ambient; std::vector lights; diff --git a/TR5Main/Objects/TR4/Entity/tr4_knighttemplar.cpp b/TR5Main/Objects/TR4/Entity/tr4_knighttemplar.cpp index 2ff8930a0..5a1540685 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_knighttemplar.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_knighttemplar.cpp @@ -166,7 +166,7 @@ void KnightTemplarControl(short itemNumber) ROOM_INFO* room = &g_Level.Rooms[item->roomNumber]; - FLOOR_INFO* currentFloor = &room->floor[(pos.z - room->z) / SECTOR(1) + (pos.z - room->x) / SECTOR(1) * room->xSize]; + FLOOR_INFO* currentFloor = &room->floor[(pos.z - room->z) / SECTOR(1) + (pos.z - room->x) / SECTOR(1) * room->zSize]; if (currentFloor->Stopper) { diff --git a/TR5Main/Objects/TR4/Entity/tr4_wraith.cpp b/TR5Main/Objects/TR4/Entity/tr4_wraith.cpp index 6bb742aad..ca606ef3a 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_wraith.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_wraith.cpp @@ -79,8 +79,8 @@ namespace TEN::Entities::TR4 { ROOM_INFO* room = &g_Level.Rooms[LaraItem->roomNumber]; - x = room->x + room->ySize * 1024 / 2 - item->pos.xPos; - z = room->z + room->xSize * 1024 / 2 - item->pos.zPos; + x = room->x + room->xSize * 1024 / 2 - item->pos.xPos; + z = room->z + room->zSize * 1024 / 2 - item->pos.zPos; distance = SQUARE(x) + SQUARE(z); dy = abs((distance / MAX_VISIBILITY_DISTANCE) - 768); diff --git a/TR5Main/Objects/TR5/Shatter/tr5_smashobject.cpp b/TR5Main/Objects/TR5/Shatter/tr5_smashobject.cpp index 8be2aac8d..34b9c17aa 100644 --- a/TR5Main/Objects/TR5/Shatter/tr5_smashobject.cpp +++ b/TR5Main/Objects/TR5/Shatter/tr5_smashobject.cpp @@ -23,7 +23,7 @@ void SmashObject(short itemNumber) { ITEM_INFO* item = &g_Level.Items[itemNumber]; ROOM_INFO* r = &g_Level.Rooms[item->roomNumber]; - int sector = ((item->pos.zPos - r->z) / 1024) + r->xSize * ((item->pos.xPos - r->x) / 1024); + int sector = ((item->pos.zPos - r->z) / 1024) + r->zSize * ((item->pos.xPos - r->x) / 1024); BOX_INFO* box = &g_Level.Boxes[r->floor[sector].Box]; if (box->flags & 0x8000) diff --git a/TR5Main/Renderer/Render11Helper.cpp b/TR5Main/Renderer/Render11Helper.cpp index 8e751b55e..ee2d106c9 100644 --- a/TR5Main/Renderer/Render11Helper.cpp +++ b/TR5Main/Renderer/Render11Helper.cpp @@ -46,7 +46,7 @@ namespace TEN::Renderer return (x >= r->x && x <= r->x + r->xSize * 1024.0f && y >= r->maxceiling && y <= r->minfloor && - z >= r->z && z <= r->z + r->ySize * 1024.0f); + z >= r->z && z <= r->z + r->zSize * 1024.0f); } std::vector* Renderer11::getAdapters() @@ -655,7 +655,7 @@ namespace TEN::Renderer Vector3 roomCentre = Vector3(room->x + room->xSize * WALL_SIZE / 2.0f, (room->minfloor + room->maxceiling) / 2.0f, - room->z + room->ySize * WALL_SIZE / 2.0f); + room->z + room->zSize * WALL_SIZE / 2.0f); Vector3 laraPosition = Vector3(Camera.pos.x, Camera.pos.y, Camera.pos.z); m_rooms[node->To].Distance = (roomCentre - laraPosition).Length(); diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index 3e2ce270d..b0798413f 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -2099,7 +2099,7 @@ namespace TEN::Renderer printDebugMessage("LaraItem.boxNumber: %d",/* canJump: %d, canLongJump: %d, canMonkey: %d,*/ LaraItem->boxNumber); printDebugMessage("Lara.pos: %d %d %d", LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos); printDebugMessage("Lara.rot: %d %d %d", LaraItem->pos.xRot, LaraItem->pos.yRot, LaraItem->pos.zRot); - printDebugMessage("Room: %d %d %d %d", r->x, r->z, r->x + r->xSize * WALL_SIZE, r->z + r->ySize * WALL_SIZE); + printDebugMessage("Room: %d %d %d %d", r->x, r->z, r->x + r->xSize * WALL_SIZE, r->z + r->zSize * WALL_SIZE); printDebugMessage("Room.y, minFloor, maxCeiling: %d %d %d ", r->y, r->minfloor, r->maxceiling); printDebugMessage("Camera.pos: %d %d %d", Camera.pos.x, Camera.pos.y, Camera.pos.z); printDebugMessage("Camera.target: %d %d %d", Camera.target.x, Camera.target.y, Camera.target.z); diff --git a/TR5Main/Renderer/Renderer11Frame.cpp b/TR5Main/Renderer/Renderer11Frame.cpp index 6b7692a38..e3dd3cca1 100644 --- a/TR5Main/Renderer/Renderer11Frame.cpp +++ b/TR5Main/Renderer/Renderer11Frame.cpp @@ -339,7 +339,7 @@ namespace TEN::Renderer RendererLight *light = m_dynamicLights[i]; Vector3 boxMin = Vector3(r->x - WALL_SIZE, -r->minfloor, r->z - WALL_SIZE); - Vector3 boxMax = Vector3(r->x + r->xSize * WALL_SIZE, -r->maxceiling, r->z + r->ySize * WALL_SIZE); + Vector3 boxMax = Vector3(r->x + r->xSize * WALL_SIZE, -r->maxceiling, r->z + r->zSize * WALL_SIZE); Vector3 center = Vector3(light->Position.x, -light->Position.y, light->Position.z); if (renderView.lightsToDraw.size() < NUM_LIGHTS_PER_BUFFER - 1 diff --git a/TR5Main/Specific/level.cpp b/TR5Main/Specific/level.cpp index 61a9750d7..4f4bc88ae 100644 --- a/TR5Main/Specific/level.cpp +++ b/TR5Main/Specific/level.cpp @@ -633,10 +633,12 @@ void ReadRooms() room.doors.push_back(door); } + room.zSize = ReadInt32(); room.xSize = ReadInt32(); - room.ySize = ReadInt32(); - room.floor.reserve(room.xSize * room.ySize); - for (int j = 0; j < room.xSize * room.ySize; j++) + + room.floor.reserve(room.zSize * room.xSize); + + for (int j = 0; j < room.zSize * room.xSize; j++) { FLOOR_INFO floor; @@ -1323,7 +1325,7 @@ void BuildOutsideRoomsTable() int rx = (r->x / 1024); int rz = (r->z / 1024); - if (x >= rx + 1 && z >= rz + 1 && x <= (rx + r->ySize - 2) && z <= (rz + r->xSize - 2)) + if (x >= rx + 1 && z >= rz + 1 && x <= (rx + r->xSize - 2) && z <= (rz + r->zSize - 2)) OutsideRoomTable[x][z].push_back(i); } }