From 9475ceed7c95b5d26494a410e9089968d07eb20b Mon Sep 17 00:00:00 2001 From: asasas9500 Date: Fri, 20 Dec 2019 23:02:35 -0300 Subject: [PATCH] Rename cupboard functions; Add trapdoor functions; Add camera information to diagnostics --- TR5Main/Game/door.h | 5 - TR5Main/Game/pickup.cpp | 45 +++---- TR5Main/Game/pickup.h | 9 +- TR5Main/Game/traps.cpp | 216 ++++++++++++++++++++++++++++++++ TR5Main/Game/traps.h | 9 +- TR5Main/Renderer/Renderer11.cpp | 2 + TR5Main/Specific/setup.cpp | 38 +++--- 7 files changed, 267 insertions(+), 57 deletions(-) diff --git a/TR5Main/Game/door.h b/TR5Main/Game/door.h index 50fd1a719..b128fd162 100644 --- a/TR5Main/Game/door.h +++ b/TR5Main/Game/door.h @@ -5,11 +5,6 @@ #define InitialiseDoor ((void (__cdecl*)(short)) 0x0043DB60) #define DrawLiftDoor ((void (__cdecl*)(ITEM_INFO*)) 0x0045AAF0) #define DoubleDoorControl ((void (__cdecl*)(short)) 0x00429840) -#define InitialiseTrapDoor ((void (__cdecl*)(short)) 0x0043D2F0) -#define TrapDoorFloorCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x004891F0) -#define TrapDoorCeilingCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00489450) -#define TrapDoorNormalCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x004896D0) -#define TrapDoorControl ((void (__cdecl*)(short)) 0x00488FA0) #define InitialiseSteelDoor ((void (__cdecl*)(short)) 0x0043F180) #define SteelDoorControl ((void (__cdecl*)(short)) 0x00486BE0) #define SteelDoorCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00487AD0) diff --git a/TR5Main/Game/pickup.cpp b/TR5Main/Game/pickup.cpp index 9c5ede591..6677293a6 100644 --- a/TR5Main/Game/pickup.cpp +++ b/TR5Main/Game/pickup.cpp @@ -1436,14 +1436,7 @@ void InitialisePickup(short itemNumber) } } -/// related to cupboard !!! -#define CupboardBounds ARRAY_(0x00509C1C, short, []) -#define CupboardPos VAR_U_(0x0051CF70, PHD_VECTOR) -#define CupboardAnims ARRAY_(0x00509C3C, short, []) -#define CupboardOffsets ARRAY_(0x00509C44, short, []) -#define CupboardFrames ARRAY_(0x00509C34, short, []) - -void InitialiseCupboard(short itemNumber) +void InitialiseSearchObject(short itemNumber) { ITEM_INFO* item, *item2; short itemNumber2; @@ -1476,9 +1469,9 @@ void InitialiseCupboard(short itemNumber) } } else if (Objects[item2->objectNumber].collision == PickupCollision - && item->pos.xPos == item2->pos.xPos - && item->pos.yPos == item2->pos.yPos - && item->pos.zPos == item2->pos.zPos) + && item->pos.xPos == item2->pos.xPos + && item->pos.yPos == item2->pos.yPos + && item->pos.zPos == item2->pos.zPos) { item->itemFlags[1] = itemNumber2; break; @@ -1491,7 +1484,7 @@ void InitialiseCupboard(short itemNumber) } } -void CupboardCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* laracoll) +void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* laracoll) { ITEM_INFO* item; int objNumber; @@ -1506,30 +1499,30 @@ void CupboardCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* laracol bounds = GetBoundsAccurate(item); if (item->objectNumber != ID_SEARCH_OBJECT1) { - CupboardBounds[0] = bounds[0] - 128; - CupboardBounds[1] = bounds[1] + 128; + SOBounds[0] = bounds[0] - 128; + SOBounds[1] = bounds[1] + 128; } else { - CupboardBounds[0] = bounds[0] + 64; - CupboardBounds[1] = bounds[1] - 64; + SOBounds[0] = bounds[0] + 64; + SOBounds[1] = bounds[1] - 64; } - CupboardBounds[4] = bounds[4] - 200; - CupboardBounds[5] = bounds[5] + 200; - CupboardPos.z = bounds[4] - CupboardOffsets[objNumber]; + SOBounds[4] = bounds[4] - 200; + SOBounds[5] = bounds[5] + 200; + SOPos.z = bounds[4] - SearchOffsets[objNumber]; - if (TestLaraPosition(CupboardBounds, item, laraitem)) + if (TestLaraPosition(SOBounds, item, laraitem)) { - if (MoveLaraPosition(&CupboardPos, item, laraitem)) + if (MoveLaraPosition(&SOPos, item, laraitem)) { laraitem->currentAnimState = STATE_LARA_MISC_CONTROL; - laraitem->animNumber = CupboardAnims[objNumber]; + laraitem->animNumber = SearchAnims[objNumber]; laraitem->frameNumber = Anims[laraitem->animNumber].frameBase; Lara.isMoving = false; Lara.headYrot = 0; Lara.headXrot = 0; - Lara.headZrot = 0; Lara.torsoYrot = 0; + Lara.torsoXrot = 0; Lara.gunStatus = LG_HANDS_BUSY; if (item->objectNumber == ID_SEARCH_OBJECT4) @@ -1554,7 +1547,7 @@ void CupboardCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* laracol else if (Lara.isMoving && Lara.generalPtr == (void *) itemNumber) { Lara.isMoving = false; - Lara.generalPtr = NULL; + Lara.gunStatus = LG_NO_ARMS; } } else if (laraitem->currentAnimState != STATE_LARA_MISC_CONTROL) @@ -1563,7 +1556,7 @@ void CupboardCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* laracol } } -void CupboardControl(short itemNumber) +void SearchObjectControl(short itemNumber) { ITEM_INFO* item, *item2; int objNumber; @@ -1616,7 +1609,7 @@ void CupboardControl(short itemNumber) } } - if (frameNumber == CupboardFrames[objNumber]) + if (frameNumber == SearchCollectFrames[objNumber]) { if (item->objectNumber == ID_SEARCH_OBJECT4) { diff --git a/TR5Main/Game/pickup.h b/TR5Main/Game/pickup.h index 9249d85c4..9ebd094b8 100644 --- a/TR5Main/Game/pickup.h +++ b/TR5Main/Game/pickup.h @@ -21,12 +21,9 @@ short* FindPlinth(ITEM_INFO* item); void PuzzleDone(ITEM_INFO* item, short itemNum); void PickupControl(short itemNum); -#define _InitialiseCupboard ((void (__cdecl*)(short)) 0x0043EDB0) -#define _CupboardCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x004699A0) -#define _CupboardControl ((void (__cdecl*)(short)) 0x00469660) -void InitialiseCupboard(short itemNumber); -void CupboardCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* laracoll); -void CupboardControl(short itemNumber); +void InitialiseSearchObject(short itemNumber); +void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* laracoll); +void SearchObjectControl(short itemNumber); void Inject_Pickup(); diff --git a/TR5Main/Game/traps.cpp b/TR5Main/Game/traps.cpp index 1ca7c7661..fb6ebda25 100644 --- a/TR5Main/Game/traps.cpp +++ b/TR5Main/Game/traps.cpp @@ -1,6 +1,12 @@ #include "traps.h" #include "..\Global\global.h" #include "items.h" +#include "collide.h" + +static short CeilingTrapDoorBounds[12] = {-256, 256, 0, 900, -768, -256, -1820, 1820, -5460, 5460, -1820, 1820}; +static PHD_VECTOR CeilingTrapDoorPos = {0, 1056, -480}; +static short FloorTrapDoorBounds[12] = {-256, 256, 0, 0, -1024, -256, -1820, 1820, -5460, 5460, -1820, 1820}; +static PHD_VECTOR FloorTrapDoorPos = {0, 0, -655}; void LaraBurn() { @@ -14,3 +20,213 @@ void LaraBurn() } } } + +void InitialiseTrapDoor(short itemNumber) +{ + ITEM_INFO* item; + + item = &Items[itemNumber]; + CloseTrapDoor(item); +} + +void TrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) +{ + ITEM_INFO* item; + + item = &Items[itemNumber]; + if (item->currentAnimState == 1 && item->frameNumber == Anims[item->animNumber].frameEnd) + ObjectCollision(itemNumber, l, coll); +} + +void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) +{ + ITEM_INFO* item; + int result, result2; + + item = &Items[itemNumber]; + result = TestLaraPosition(CeilingTrapDoorBounds, item, l); + l->pos.yRot += ANGLE(180); + result2 = TestLaraPosition(CeilingTrapDoorBounds, item, l); + l->pos.yRot += ANGLE(180); + if (TrInput & IN_ACTION && item->status != ITEM_DEACTIVATED && l->currentAnimState == STATE_LARA_JUMP_UP && l->gravityStatus && Lara.gunStatus == LG_NO_ARMS && (result || result2)) + { + AlignLaraPosition(&CeilingTrapDoorPos, item, l); + if (result2) + l->pos.yRot += ANGLE(180); + Lara.headYrot = 0; + Lara.headXrot = 0; + Lara.torsoYrot = 0; + Lara.torsoXrot = 0; + Lara.gunStatus = LG_HANDS_BUSY; + l->gravityStatus = false; + l->fallspeed = 0; + l->animNumber = ANIMATION_LARA_CEILING_TRAPDOOR_OPEN; + l->frameNumber = Anims[l->animNumber].frameBase; + l->currentAnimState = STATE_LARA_FREEFALL_BIS; + AddActiveItem(itemNumber); + item->status = ITEM_ACTIVE; + item->goalAnimState = 1; + + UseForcedFixedCamera = 1; + ForcedFixedCamera.x = item->pos.xPos - SIN(item->pos.yRot) / 16; + ForcedFixedCamera.y = item->pos.yPos + 1024; + ForcedFixedCamera.z = item->pos.zPos - COS(item->pos.yRot) / 16; + ForcedFixedCamera.roomNumber = item->roomNumber; + } + else + { + if (item->currentAnimState == 1) + UseForcedFixedCamera = 0; + } + + if (item->currentAnimState == 1 && item->frameNumber == Anims[item->animNumber].frameEnd) + ObjectCollision(itemNumber, l, coll); +} + +void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) +{ + ITEM_INFO* item; + + item = &Items[itemNumber]; + if (TrInput & IN_ACTION && item->status != ITEM_DEACTIVATED && l->currentAnimState == STATE_LARA_STOP && l->animNumber == ANIMATION_LARA_STAY_IDLE && Lara.gunStatus == LG_NO_ARMS + || Lara.isMoving && Lara.generalPtr == (void *) itemNumber) + { + if (TestLaraPosition(FloorTrapDoorBounds, item, l)) + { + if (MoveLaraPosition(&FloorTrapDoorPos, item, l)) + { + l->animNumber = ANIMATION_LARA_FLOOR_TRAPDOOR_OPEN; + l->frameNumber = Anims[l->animNumber].frameBase; + l->currentAnimState = STATE_LARA_TRAPDOOR_FLOOR_OPEN; + Lara.isMoving = false; + Lara.headYrot = 0; + Lara.headXrot = 0; + Lara.torsoYrot = 0; + Lara.torsoXrot = 0; + Lara.gunStatus = LG_HANDS_BUSY; + AddActiveItem(itemNumber); + item->status = ITEM_ACTIVE; + item->goalAnimState = 1; + + UseForcedFixedCamera = 1; + ForcedFixedCamera.x = item->pos.xPos - SIN(item->pos.yRot) / 8; + ForcedFixedCamera.y = item->pos.yPos - 2048; + if (ForcedFixedCamera.y < Rooms[item->roomNumber].maxceiling) + ForcedFixedCamera.y = Rooms[item->roomNumber].maxceiling; + ForcedFixedCamera.z = item->pos.zPos - COS(item->pos.yRot) / 8; + ForcedFixedCamera.roomNumber = item->roomNumber; + } + else + { + Lara.generalPtr = (void *) itemNumber; + } + } + } + else + { + if (item->currentAnimState == 1) + UseForcedFixedCamera = 0; + } + + if (item->currentAnimState == 1 && item->frameNumber == Anims[item->animNumber].frameEnd) + ObjectCollision(itemNumber, l, coll); +} + +void TrapDoorControl(short itemNumber) +{ + ITEM_INFO* item; + + item = &Items[itemNumber]; + if (TriggerActive(item)) + { + if (!item->currentAnimState && item->triggerFlags >= 0) + { + item->goalAnimState = 1; + } + else if (item->frameNumber == Anims[item->animNumber].frameEnd && CurrentLevel == 14 && item->objectNumber == ID_TRAPDOOR1) + { + item->status = ITEM_INVISIBLE; + } + } + else + { + item->status = ITEM_ACTIVE; + + if (item->currentAnimState == 1) + { + item->goalAnimState = 0; + } + } + + AnimateItem(item); + + if (item->currentAnimState == 1 && (item->itemFlags[2] || JustLoaded)) + { + OpenTrapDoor(item); + } + else if (!item->currentAnimState && !item->itemFlags[2]) + { + CloseTrapDoor(item); + } +} + +void CloseTrapDoor(ITEM_INFO* item) +{ + ROOM_INFO* r; + FLOOR_INFO* floor; + unsigned short pitsky; + + r = &Rooms[item->roomNumber]; + floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z); + pitsky = 0; + + if (item->pos.yPos == r->minfloor) + { + pitsky = floor->pitRoom; + floor->pitRoom = NO_ROOM; + r = &Rooms[pitsky]; + floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z); + pitsky |= floor->skyRoom << 8; + floor->skyRoom = NO_ROOM; + } + else if (item->pos.yPos == r->maxceiling) + { + pitsky = floor->skyRoom; + floor->skyRoom = NO_ROOM; + r = &Rooms[pitsky]; + floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z); + pitsky = pitsky << 8 | floor->pitRoom; + floor->pitRoom = NO_ROOM; + } + + item->itemFlags[2] = 1; + item->itemFlags[3] = pitsky; +} + +void OpenTrapDoor(ITEM_INFO* item) +{ + ROOM_INFO* r; + FLOOR_INFO* floor; + unsigned short pitsky; + + r = &Rooms[item->roomNumber]; + floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z); + pitsky = item->itemFlags[3]; + + if (item->pos.yPos == r->minfloor) + { + floor->pitRoom = (unsigned char) pitsky; + r = &Rooms[floor->pitRoom]; + floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z); + floor->skyRoom = pitsky >> 8; + } + else + { + floor->skyRoom = pitsky >> 8; + r = &Rooms[floor->skyRoom]; + floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z); + floor->pitRoom = (unsigned char) pitsky; + } + + item->itemFlags[2] = 0; +} diff --git a/TR5Main/Game/traps.h b/TR5Main/Game/traps.h index c099d2df9..7ea0730da 100644 --- a/TR5Main/Game/traps.h +++ b/TR5Main/Game/traps.h @@ -57,4 +57,11 @@ #define TeethSpikeControl ((void (__cdecl*)(short)) 0x0043FBC0) #define DrawScaledSpike ((void (__cdecl*)(ITEM_INFO*)) 0x0043FBC0) -void LaraBurn(); \ No newline at end of file +void LaraBurn(); +void InitialiseTrapDoor(short itemNumber); +void TrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll); +void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll); +void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll); +void TrapDoorControl(short itemNumber); +void CloseTrapDoor(ITEM_INFO* item); +void OpenTrapDoor(ITEM_INFO* item); diff --git a/TR5Main/Renderer/Renderer11.cpp b/TR5Main/Renderer/Renderer11.cpp index b06c58e23..f519861d7 100644 --- a/TR5Main/Renderer/Renderer11.cpp +++ b/TR5Main/Renderer/Renderer11.cpp @@ -1583,6 +1583,8 @@ bool Renderer11::drawScene(bool dump) printDebugMessage("Lara.requiredAnimState: %d", LaraItem->requiredAnimState); printDebugMessage("Lara.goalAnimState: %d", LaraItem->goalAnimState); printDebugMessage("Room: %d %d %d %d", r->x, r->z, r->x + r->xSize * WALL_SIZE, r->z + r->ySize * WALL_SIZE); + 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); #endif } diff --git a/TR5Main/Specific/setup.cpp b/TR5Main/Specific/setup.cpp index c779e2714..e6282ad27 100644 --- a/TR5Main/Specific/setup.cpp +++ b/TR5Main/Specific/setup.cpp @@ -2387,49 +2387,49 @@ void ObjectObjects() if (obj->loaded) { obj->initialise = InitialiseTrapDoor; - obj->collision = TrapDoorFloorCollision; + obj->collision = FloorTrapDoorCollision; obj->control = TrapDoorControl; } obj = &Objects[ID_FLOOR_TRAPDOOR2]; if (obj->loaded) { obj->initialise = InitialiseTrapDoor; - obj->collision = TrapDoorFloorCollision; + obj->collision = FloorTrapDoorCollision; obj->control = TrapDoorControl; } obj = &Objects[ID_CEILING_TRAPDOOR1]; if (obj->loaded) { obj->initialise = InitialiseTrapDoor; - obj->collision = TrapDoorCeilingCollision; + obj->collision = CeilingTrapDoorCollision; obj->control = TrapDoorControl; } obj = &Objects[ID_CEILING_TRAPDOOR2]; if (obj->loaded) { obj->initialise = InitialiseTrapDoor; - obj->collision = TrapDoorCeilingCollision; + obj->collision = CeilingTrapDoorCollision; obj->control = TrapDoorControl; } obj = &Objects[ID_TRAPDOOR1]; if (obj->loaded) { obj->initialise = InitialiseTrapDoor; - obj->collision = TrapDoorNormalCollision; + obj->collision = TrapDoorCollision; obj->control = TrapDoorControl; } obj = &Objects[ID_TRAPDOOR2]; if (obj->loaded) { obj->initialise = InitialiseTrapDoor; - obj->collision = TrapDoorNormalCollision; + obj->collision = TrapDoorCollision; obj->control = TrapDoorControl; } obj = &Objects[ID_TRAPDOOR3]; if (obj->loaded) { obj->initialise = InitialiseTrapDoor; - obj->collision = TrapDoorNormalCollision; + obj->collision = TrapDoorCollision; obj->control = TrapDoorControl; } } @@ -2437,30 +2437,30 @@ void ObjectObjects() obj = &Objects[ID_SEARCH_OBJECT1]; if (obj->loaded) { - obj->initialise = InitialiseCupboard; - obj->collision = CupboardCollision; - obj->control = CupboardControl; + obj->initialise = InitialiseSearchObject; + obj->collision = SearchObjectCollision; + obj->control = SearchObjectControl; } obj = &Objects[ID_SEARCH_OBJECT2]; if (obj->loaded) { - obj->initialise = InitialiseCupboard; - obj->collision = CupboardCollision; - obj->control = CupboardControl; + obj->initialise = InitialiseSearchObject; + obj->collision = SearchObjectCollision; + obj->control = SearchObjectControl; } obj = &Objects[ID_SEARCH_OBJECT3]; if (obj->loaded) { - obj->initialise = InitialiseCupboard; - obj->collision = CupboardCollision; - obj->control = CupboardControl; + obj->initialise = InitialiseSearchObject; + obj->collision = SearchObjectCollision; + obj->control = SearchObjectControl; } obj = &Objects[ID_SEARCH_OBJECT4]; if (obj->loaded) { - obj->initialise = InitialiseCupboard; - obj->collision = CupboardCollision; - obj->control = CupboardControl; + obj->initialise = InitialiseSearchObject; + obj->collision = SearchObjectCollision; + obj->control = SearchObjectControl; } obj = &Objects[ID_FLARE_ITEM];