Rename cupboard functions; Add trapdoor functions; Add camera information to diagnostics

This commit is contained in:
asasas9500 2019-12-20 23:02:35 -03:00
parent d80ae316b9
commit 9475ceed7c
7 changed files with 267 additions and 57 deletions

View file

@ -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)

View file

@ -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;
@ -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)
{

View file

@ -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();

View file

@ -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;
}

View file

@ -58,3 +58,10 @@
#define DrawScaledSpike ((void (__cdecl*)(ITEM_INFO*)) 0x0043FBC0)
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);

View file

@ -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
}

View file

@ -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];