Integrated ITEM_DATA into ITEM_INFO

TODO: See what happens with ENEMY_JEEP
This commit is contained in:
Raildex 2021-08-29 16:11:03 +02:00
parent be16255efc
commit f7080f56c9
37 changed files with 263 additions and 191 deletions

View file

@ -63,7 +63,8 @@ void FlareControl(short itemNumber)
DoProperDetection(itemNumber, oldX, oldY, oldZ, xv, item->fallspeed, zv); DoProperDetection(itemNumber, oldX, oldY, oldZ, xv, item->fallspeed, zv);
short age = (short)(item->data) & 0x7FFF; short& age = item->data;
age &= 0x7FFF;
if (age >= FLARE_AGE) if (age >= FLARE_AGE)
{ {
if (!item->fallspeed && !item->speed) if (!item->fallspeed && !item->speed)
@ -84,8 +85,6 @@ void FlareControl(short itemNumber)
age |= 0x8000; age |= 0x8000;
} }
item->data = (void*)age;
} }
void ready_flare() void ready_flare()
@ -362,10 +361,11 @@ void CreateFlare(GAME_OBJECT_ID objectNum, int thrown)
if (objectNum == ID_FLARE_ITEM) if (objectNum == ID_FLARE_ITEM)
{ {
short& age = item->data;
if (DoFlareLight((PHD_VECTOR*)&item->pos, Lara.flareAge)) if (DoFlareLight((PHD_VECTOR*)&item->pos, Lara.flareAge))
item->data = (void*)(Lara.flareAge | 0x8000); age = (Lara.flareAge | 0x8000);
else else
item->data = (void*)(Lara.flareAge & 0x7FFF); age = (Lara.flareAge & 0x7FFF);
} }
else else
{ {

View file

@ -364,7 +364,7 @@ void CreatureFloat(short itemNumber)
void CreatureJoint(ITEM_INFO* item, short joint, short required) void CreatureJoint(ITEM_INFO* item, short joint, short required)
{ {
if (item->data == NULL) if (!item->data)
return; return;
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
@ -403,7 +403,7 @@ void CreatureTilt(ITEM_INFO* item, short angle)
short CreatureTurn(ITEM_INFO* item, short maximumTurn) short CreatureTurn(ITEM_INFO* item, short maximumTurn)
{ {
if (item->data == NULL || maximumTurn == 0) if (!item->data || maximumTurn == 0)
return 0; return 0;
CREATURE_INFO* creature; CREATURE_INFO* creature;
@ -446,7 +446,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
int boxHeight, height, nextHeight, nextBox; int boxHeight, height, nextHeight, nextBox;
item = &g_Level.Items[itemNumber]; item = &g_Level.Items[itemNumber];
if (item->data == NULL) if (!item->data)
return false; return false;
creature = (CREATURE_INFO*)item->data; creature = (CREATURE_INFO*)item->data;
@ -1398,9 +1398,9 @@ void FindAITargetObject(CREATURE_INFO* creature, short objectNumber)
if (foundObject != NULL) if (foundObject != NULL)
{ {
ITEM_INFO* aiItem = &creature->aiTarget; CREATURE_TARGET* aiItem = &creature->aiTarget;
creature->enemy = aiItem; creature->enemy = nullptr;
aiItem->objectNumber = foundObject->objectNumber; aiItem->objectNumber = foundObject->objectNumber;
aiItem->roomNumber = foundObject->roomNumber; aiItem->roomNumber = foundObject->roomNumber;
@ -1423,7 +1423,7 @@ void FindAITargetObject(CREATURE_INFO* creature, short objectNumber)
void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info) void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
{ {
if (item->data == NULL) if (!item->data)
return; return;
CREATURE_INFO * creature; CREATURE_INFO * creature;
@ -1525,7 +1525,7 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent) void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
{ {
if (item->data == NULL) if (!item->data)
return; return;
CREATURE_INFO* creature; CREATURE_INFO* creature;
@ -1645,7 +1645,7 @@ void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent) void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
{ {
if (item->data == NULL) if (!item->data)
return; return;
CREATURE_INFO* creature; CREATURE_INFO* creature;

View file

@ -53,6 +53,16 @@ enum MOOD_TYPE {
ESCAPE_MOOD, ESCAPE_MOOD,
STALK_MOOD STALK_MOOD
}; };
struct CREATURE_TARGET {
GAME_OBJECT_ID objectNumber;
int boxNumber;
PHD_3DPOS pos;
uint16_t flags; // ItemFlags enum
uint16_t triggerFlags;
short roomNumber;
};
struct CREATURE_INFO { struct CREATURE_INFO {
short jointRotation[4]; short jointRotation[4];
short maximumTurn; short maximumTurn;
@ -67,7 +77,7 @@ struct CREATURE_INFO {
bool monkeyAhead; bool monkeyAhead;
MOOD_TYPE mood; MOOD_TYPE mood;
ITEM_INFO* enemy; ITEM_INFO* enemy;
ITEM_INFO aiTarget; CREATURE_TARGET aiTarget;
short pad; short pad;
short itemNum; short itemNum;
PHD_VECTOR target; PHD_VECTOR target;

View file

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "floordata.h" #include "floordata.h"
struct ITEM_INFO;
struct DOORPOS_DATA { struct DOORPOS_DATA {
FLOOR_INFO* floor; FLOOR_INFO* floor;
FLOOR_INFO data; FLOOR_INFO data;

View file

@ -1,6 +1,6 @@
#include "framework.h" #include "framework.h"
#include "trmath.h"
#include "floordata.h" #include "floordata.h"
#include "trmath.h"
#include "room.h" #include "room.h"
#include "level.h" #include "level.h"
#include "setup.h" #include "setup.h"

View file

@ -1,7 +1,7 @@
#pragma once #pragma once
#include "trmath.h" #include "trmath.h"
#include "items.h" #include <optional>
#include "roomvector.h"
struct SECTOR_COLLISION_INFO struct SECTOR_COLLISION_INFO
{ {
float SplitAngle; float SplitAngle;
@ -9,9 +9,8 @@ struct SECTOR_COLLISION_INFO
Vector3 Planes[2]; Vector3 Planes[2];
}; };
class FLOOR_INFO struct FLOOR_INFO
{ {
public:
int index; int index;
int box; int box;
int fx; int fx;

View file

@ -2,12 +2,11 @@
#include <cstdint> #include <cstdint>
#include "phd_global.h" #include "phd_global.h"
#include <string> #include <string>
#include "itemdata.h"
#include "roomvector.h"
enum GAME_OBJECT_ID : short; enum GAME_OBJECT_ID : short;
struct ROOM_VECTOR {
int roomNumber;
int yNumber;
};
struct ITEM_INFO { struct ITEM_INFO {
int floor; int floor;
@ -35,7 +34,7 @@ struct ITEM_INFO {
short afterDeath; short afterDeath;
short firedWeapon; short firedWeapon;
short itemFlags[8]; short itemFlags[8];
void* data; ITEM_DATA data;
PHD_3DPOS pos; PHD_3DPOS pos;
bool active; bool active;
short status; // ItemStatus enum short status; // ItemStatus enum

View file

@ -0,0 +1,4 @@
#include "framework.h"
#include "itemdata.h"
ITEM_DATA::ITEM_DATA() : ITEM_DATA(ITEM_DATA_TYPE<std::nullptr_t>()) {}

View file

@ -9,11 +9,21 @@
#include "lara_struct.h" #include "lara_struct.h"
#include "jeep_info.h" #include "jeep_info.h"
#include "motorbike_info.h" #include "motorbike_info.h"
#include "minecart_info.h"
#include "biggun_info.h" #include "biggun_info.h"
#include "quad_info.h" #include "quad_info.h"
#include "tr5_laserhead_info.h" #include "tr5_laserhead_info.h"
#include "creature_info.h" #include "creature_info.h"
#include "boat_info.h"
#include "rubberboat_info.h"
#include <stdexcept> #include <stdexcept>
#include "phd_global.h"
#include "tr4_wraith_info.h"
#include "tr5_pushableblock_info.h"
template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...)->overload<Ts...>; // line not needed in C++20...
struct ITEM_INFO; struct ITEM_INFO;
//Type Wrapper to construct a ITEM_DATA //Type Wrapper to construct a ITEM_DATA
@ -23,10 +33,20 @@ struct ITEM_DATA_TYPE {
}; };
class ITEM_DATA { class ITEM_DATA {
std::variant<std::nullptr_t, std::variant<std::nullptr_t,
char,
short,
int,
long,
long long, long long,
unsigned char,
unsigned short,
unsigned int,
unsigned long,
unsigned long long, unsigned long long,
float,
double,
long double, long double,
ITEM_INFO, ITEM_INFO*,
CREATURE_INFO, CREATURE_INFO,
LASER_HEAD_INFO, LASER_HEAD_INFO,
QUAD_INFO, QUAD_INFO,
@ -37,13 +57,22 @@ class ITEM_DATA {
KAYAK_INFO, KAYAK_INFO,
DOOR_DATA, DOOR_DATA,
SKIDOO_INFO, SKIDOO_INFO,
SUB_INFO SUB_INFO,
BOAT_INFO,
GAME_VECTOR,
WRAITH_INFO,
RUBBER_BOAT_INFO,
PUSHABLE_INFO,
CART_INFO
> data; > data;
public:
ITEM_DATA();
//we have to use a wrapper for a type, because the compiler needs to distinguish different overloads //we have to use a wrapper for a type, because the compiler needs to distinguish different overloads
template<typename D> template<typename D>
ITEM_DATA(ITEM_DATA_TYPE<D> type) : data(ITEM_DATA_TYPE::type{}) { ITEM_DATA(ITEM_DATA_TYPE<D> type) : data(ITEM_DATA_TYPE<D>::type{}) {}
}
template<typename D>
ITEM_DATA(D&& type) : data(type) {}
// conversion operators to keep original syntax! // conversion operators to keep original syntax!
@ -67,8 +96,34 @@ class ITEM_DATA {
} }
template<typename T> template<typename T>
T& operator=(T* newData){ ITEM_DATA& operator=(T* newData) {
data = *newData; data = *newData;
return *this; return *this;
} }
ITEM_DATA& operator=(std::nullptr_t null) {
data = nullptr;
return *this;
}
template<typename T>
ITEM_DATA& operator=(T& newData) {
data = newData;
return *this;
}
template<typename T>
ITEM_DATA& operator=(T&& newData) {
data = newData;
return *this;
}
operator bool() {
return !std::holds_alternative<std::nullptr_t>(data);
}
struct foo {
void operator()(double& d) {}
};
auto& get() const {
return data;
}
}; };

View file

@ -13,7 +13,7 @@ void ClearItem(short itemNum)
ROOM_INFO* room = &g_Level.Rooms[item->roomNumber]; ROOM_INFO* room = &g_Level.Rooms[item->roomNumber];
item->collidable = true; item->collidable = true;
item->data = NULL; item->data = nullptr;
item->drawRoom = (((item->pos.zPos - room->z) / SECTOR(1)) & 0xFF) | ((((item->pos.xPos - room->x) / SECTOR(1)) & 0xFF) * 256); item->drawRoom = (((item->pos.zPos - room->z) / SECTOR(1)) & 0xFF) | ((((item->pos.xPos - room->x) / SECTOR(1)) & 0xFF) * 256);
item->TOSSPAD = item->pos.yRot & 0xE000; item->TOSSPAD = item->pos.yRot & 0xE000;
item->itemFlags[2] = item->roomNumber | ((item->pos.yPos - room->minfloor) & 0xFF00); item->itemFlags[2] = item->roomNumber | ((item->pos.yPos - room->minfloor) & 0xFF00);

View file

@ -0,0 +1,5 @@
#pragma once
struct ROOM_VECTOR {
int roomNumber;
int yNumber;
};

View file

@ -1022,7 +1022,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber)
QUAD_INFO* quadInfo = game_malloc<QUAD_INFO>(); QUAD_INFO* quadInfo = game_malloc<QUAD_INFO>();
m_stream->ReadBytes(reinterpret_cast<byte*>(quadInfo), sizeof(QUAD_INFO)); m_stream->ReadBytes(reinterpret_cast<byte*>(quadInfo), sizeof(QUAD_INFO));
if (item->objectNumber == ID_QUAD) if (item->objectNumber == ID_QUAD)
item->data = (void*)quadInfo; item->data = quadInfo;
return true; return true;
} }
@ -1418,7 +1418,7 @@ bool SaveGame::readFlare()
AddActiveItem(itemNumber); AddActiveItem(itemNumber);
// Flare age // Flare age
item->data = (void*)LEB128::ReadInt32(m_stream); item->data = LEB128::ReadInt32(m_stream);
return true; return true;
} }
@ -1465,7 +1465,8 @@ bool SaveGame::readTorpedo()
void SaveGame::saveItemQuadInfo(int itemNumber, int arg2) void SaveGame::saveItemQuadInfo(int itemNumber, int arg2)
{ {
m_stream->WriteBytes(reinterpret_cast<byte*>(g_Level.Items[itemNumber].data), sizeof(QUAD_INFO));
//m_stream->WriteBytes(reinterpret_cast<byte*>(g_Level.Items[itemNumber].data), sizeof(QUAD_INFO));
} }
void SaveGame::saveRats(int arg1, int arg2) void SaveGame::saveRats(int arg1, int arg2)

View file

@ -6,6 +6,7 @@
#include "sphere.h" #include "sphere.h"
#include "draw.h" #include "draw.h"
#include "collide.h" #include "collide.h"
#include "floordata.h"
namespace TEN::Entities::Switches namespace TEN::Entities::Switches
{ {
OBJECT_COLLISION_BOUNDS SwitchBounds = OBJECT_COLLISION_BOUNDS SwitchBounds =

View file

@ -61,7 +61,7 @@ void DoppelgangerControl(short itemNum)
ref = findReference(item, ID_BACON_REFERENCE); // find reference point ref = findReference(item, ID_BACON_REFERENCE); // find reference point
if (item->data == NULL) if (!item->data)
{ {
if (ref == nullptr) // if no reference found, she doesn't move if (ref == nullptr) // if no reference found, she doesn't move
{ {
@ -106,7 +106,7 @@ void DoppelgangerControl(short itemNum)
item->gravityStatus = true; item->gravityStatus = true;
item->fallspeed = 0; item->fallspeed = 0;
item->speed = 0; item->speed = 0;
item->data = (void*)-1; item->data = -1;
item->pos.yPos += 50; item->pos.yPos += 50;
} }
} }

View file

@ -478,7 +478,7 @@ void InitialiseBartoli(short itemNum)
InitialiseItem(back_item); InitialiseItem(back_item);
back->meshBits = 0x1FFFFF; back->meshBits = 0x1FFFFF;
item->data = (void*)back_item; item->data = back_item;
front = &g_Level.Items[front_item]; front = &g_Level.Items[front_item];
front->objectNumber = ID_DRAGON_FRONT; front->objectNumber = ID_DRAGON_FRONT;
@ -492,7 +492,7 @@ void InitialiseBartoli(short itemNum)
InitialiseItem(front_item); InitialiseItem(front_item);
back->data = (void*)front_item; back->data = front_item;
g_Level.NumItems += 2; g_Level.NumItems += 2;
} }

View file

@ -9,6 +9,7 @@
#include "lara.h" #include "lara.h"
#include "sound.h" #include "sound.h"
#include "creature_info.h" #include "creature_info.h"
#include "floordata.h"
BITE_INFO knifeLeft = { 0, 0, 0, 5 }; BITE_INFO knifeLeft = { 0, 0, 0, 5 };
BITE_INFO knifeRight = { 0, 0, 0, 8 }; BITE_INFO knifeRight = { 0, 0, 0, 8 };

View file

@ -45,7 +45,7 @@ void InitialiseSkidman(short itemNum)
InitialiseItem(skidoo_item); InitialiseItem(skidoo_item);
// The skidman remembers his skidoo // The skidman remembers his skidoo
item->data = (void*)skidoo_item; item->data = skidoo_item;
g_Level.NumItems++; g_Level.NumItems++;
} }

View file

@ -495,7 +495,7 @@ int SpeedBoatDynamics(short itemNum)
int newspeed; int newspeed;
boat = &g_Level.Items[itemNum]; boat = &g_Level.Items[itemNum];
binfo = (BOAT_INFO*)boat->data; binfo = boat->data;
boat->pos.zRot -= binfo->tiltAngle; boat->pos.zRot -= binfo->tiltAngle;
@ -815,8 +815,8 @@ void InitialiseSpeedBoat(short itemNum)
BOAT_INFO* binfo; BOAT_INFO* binfo;
boat = &g_Level.Items[itemNum]; boat = &g_Level.Items[itemNum];
binfo = game_malloc<BOAT_INFO>(); boat->data = ITEM_DATA(ITEM_DATA_TYPE<BOAT_INFO>());
boat->data = (void*)binfo; binfo = boat->data;
binfo->boatTurn = 0; binfo->boatTurn = 0;
binfo->leftFallspeed = 0; binfo->leftFallspeed = 0;
binfo->rightFallspeed = 0; binfo->rightFallspeed = 0;

View file

@ -79,9 +79,8 @@ enum SKIDOO_STATE
void InitialiseSkidoo(short itemNum) void InitialiseSkidoo(short itemNum)
{ {
ITEM_INFO* skidoo = &g_Level.Items[itemNum]; ITEM_INFO* skidoo = &g_Level.Items[itemNum];
skidoo->data = ITEM_DATA(ITEM_DATA_TYPE<SKIDOO_INFO>());
SKIDOO_INFO* skinfo = game_malloc<SKIDOO_INFO>(); SKIDOO_INFO* skinfo = skidoo->data;
skidoo->data = (void*)skinfo;
skinfo->alreadyCdPlayed = false; skinfo->alreadyCdPlayed = false;

View file

@ -121,10 +121,9 @@ void BigGunInitialise(short itemNum)
BIGGUNINFO *gun; BIGGUNINFO *gun;
obj = &g_Level.Items[itemNum]; obj = &g_Level.Items[itemNum];
obj->data = ITEM_DATA(ITEM_DATA_TYPE<BIGGUNINFO>());
gun = (BIGGUNINFO*)malloc(sizeof(BIGGUNINFO)); gun = obj->data;
obj->data = malloc(sizeof(BIGGUNINFO));
gun->flags = 0; gun->flags = 0;
gun->fireCount = 0; gun->fireCount = 0;
gun->xRot = GETOFF_FRAME; gun->xRot = GETOFF_FRAME;

View file

@ -775,8 +775,8 @@ void InitialiseMineCart(short itemNum)
CART_INFO* cart; CART_INFO* cart;
v = &g_Level.Items[itemNum]; v = &g_Level.Items[itemNum];
cart = game_malloc<CART_INFO>(); v->data = CART_INFO();
v->data = (void*)cart; cart = v->data;
cart->Flags = NULL; cart->Flags = NULL;
cart->Speed = 0; cart->Speed = 0;
cart->YVel = 0; cart->YVel = 0;
@ -842,8 +842,8 @@ int MineCartControl(void)
short roomNumber; short roomNumber;
v = &g_Level.Items[Lara.Vehicle]; v = &g_Level.Items[Lara.Vehicle];
if (v->data == NULL) { printf("v->data is nullptr !"); return 0; } if (!v->data) { printf("v->data is nullptr !"); return 0; }
cart = (CART_INFO*)v->data; cart = v->data;
DoUserInput(v, LaraItem, cart); DoUserInput(v, LaraItem, cart);

View file

@ -49,10 +49,10 @@ void DrawRubberBoat(ITEM_INFO *item)
{ {
RUBBER_BOAT_INFO *b; RUBBER_BOAT_INFO *b;
b = (RUBBER_BOAT_INFO*)item->data; b = item->data;
item->data = &b->propRot; item->data = &b->propRot;
DrawAnimatingItem(item); DrawAnimatingItem(item);
item->data = (void *)b; item->data = b;
} }
int RubberBoatCheckGeton(short itemNum, COLL_INFO *coll) int RubberBoatCheckGeton(short itemNum, COLL_INFO *coll)

View file

@ -832,11 +832,10 @@ static void UserInput(ITEM_INFO* v, ITEM_INFO* l, SUB_INFO* sub)
void SubInitialise(short itemNum) void SubInitialise(short itemNum)
{ {
ITEM_INFO* v; ITEM_INFO* v;
SUB_INFO* sub;
v = &g_Level.Items[itemNum]; v = &g_Level.Items[itemNum];
sub = game_malloc<SUB_INFO>(); v->data = ITEM_DATA(ITEM_DATA_TYPE<SUB_INFO>());
v->data = (void*)sub; SUB_INFO* sub = v->data;
sub->Vel = sub->Rot = 0; sub->Vel = sub->Rot = 0;
sub->Flags = UPV_SURFACE; sub->Flags = UPV_SURFACE;
sub->WeaponTimer = 0; sub->WeaponTimer = 0;

View file

@ -145,16 +145,10 @@ void EnemyJeepControl(short itemNumber)
AI_INFO info; AI_INFO info;
CreatureAIInfo(item, &info); CreatureAIInfo(item, &info);
ITEM_INFO* target = &creature->aiTarget; creature->enemy = nullptr;
creature->enemy = target; CREATURE_TARGET* target = &creature->aiTarget;
short angle; short angle;
int distance; int distance;
if (target == LaraItem)
{
angle = info.angle;
distance = info.distance;
}
else
{ {
dx = LaraItem->pos.xPos - item->pos.xPos; dx = LaraItem->pos.xPos - item->pos.xPos;
dz = LaraItem->pos.zPos - item->pos.zPos; dz = LaraItem->pos.zPos - item->pos.zPos;
@ -326,7 +320,7 @@ void EnemyJeepControl(short itemNumber)
if (aiObject != NULL) if (aiObject != NULL)
{ {
creature->enemy = target; creature->enemy = nullptr;
target->objectNumber = aiObject->objectNumber; target->objectNumber = aiObject->objectNumber;
target->roomNumber = aiObject->roomNumber; target->roomNumber = aiObject->roomNumber;
target->pos.xPos = aiObject->x; target->pos.xPos = aiObject->x;

View file

@ -13,7 +13,6 @@
#include <Game/Lara/lara_one_gun.h> #include <Game/Lara/lara_one_gun.h>
#include "creature_info.h" #include "creature_info.h"
#include "control.h" #include "control.h"
void SasControl(short itemNumber)
namespace TEN::Entities::TR4 namespace TEN::Entities::TR4
{ {
enum SAS_STATES enum SAS_STATES

View file

@ -14,7 +14,7 @@
#include "tomb4fx.h" #include "tomb4fx.h"
#include "level.h" #include "level.h"
#include "creature_info.h" #include "creature_info.h"
#include "floordata.h"
namespace TEN::Entities::TR4 namespace TEN::Entities::TR4
{ {
BITE_INFO skeletonBite = { 0, -16, 200, 11 }; BITE_INFO skeletonBite = { 0, -16, 200, 11 };

View file

@ -9,7 +9,7 @@
#include <lara.h> #include <lara.h>
#include <traps.h> #include <traps.h>
#include <tomb4fx.h> #include <tomb4fx.h>
#include "tr4_wraith_info.h"
constexpr auto WRAITH_COUNT = 8; constexpr auto WRAITH_COUNT = 8;
short WraithSpeed = 64; short WraithSpeed = 64;

View file

@ -1,18 +1,7 @@
#pragma once #pragma once
#include "items.h" struct ITEM_INFO;
struct WRAITH_INFO
{
int xPos;
int yPos;
int zPos;
short xRot;
short yRot;
short zRot;
byte r;
byte g;
byte b;
};
void InitialiseWraith(short itemNumber); void InitialiseWraith(short itemNumber);
void WraithControl(short itemNumber); void WraithControl(short itemNumber);

View file

@ -0,0 +1,12 @@
#pragma once
struct WRAITH_INFO {
int xPos;
int yPos;
int zPos;
short xRot;
short yRot;
short zRot;
unsigned char r;
unsigned char g;
unsigned char b;
};

View file

@ -28,7 +28,8 @@ void InitialiseGameStix(short itemNumber)
item = &g_Level.Items[itemNumber]; item = &g_Level.Items[itemNumber];
item->itemFlags[7] = -1; item->itemFlags[7] = -1;
item->data = &item->itemFlags; //not needed
//item->data = &item->itemFlags;
ActivePiece = -1; ActivePiece = -1;
SenetDisplacement = 0; SenetDisplacement = 0;
} }

View file

@ -140,8 +140,8 @@ void InitialiseMotorbike(short itemNumber)
MOTORBIKE_INFO* motorbike; MOTORBIKE_INFO* motorbike;
item = &g_Level.Items[itemNumber]; item = &g_Level.Items[itemNumber];
motorbike = game_malloc<MOTORBIKE_INFO>(); item->data = ITEM_DATA(MOTORBIKE_INFO());
item->data = (void*)motorbike; motorbike = item->data;
motorbike->velocity = 0; motorbike->velocity = 0;
motorbike->bikeTurn = 0; motorbike->bikeTurn = 0;
motorbike->pitch = 0; motorbike->pitch = 0;

View file

@ -10,7 +10,7 @@
#include "input.h" #include "input.h"
#include "sound.h" #include "sound.h"
#include "setup.h" #include "setup.h"
#define GET_PUSHABLEINFO(item) ((PUSHABLE_INFO*) item->data) #include "tr5_pushableblock_info.h"
static OBJECT_COLLISION_BOUNDS PushableBlockBounds = { static OBJECT_COLLISION_BOUNDS PushableBlockBounds = {
0x0000, 0x0000, 0xFFC0, 0x0000, 0x0000, 0x0000, 0xFFC0, 0x0000,
@ -70,7 +70,8 @@ void InitialisePushableBlock(short itemNum)
ClearMovableBlockSplitters(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber); ClearMovableBlockSplitters(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber);
// allocate new pushable info // allocate new pushable info
PUSHABLE_INFO* pushable = new PUSHABLE_INFO; item->data = PUSHABLE_INFO();
PUSHABLE_INFO* pushable = item->data;
pushable->stackLimit = 3; // LUA pushable->stackLimit = 3; // LUA
pushable->gravity = 8; // LUA pushable->gravity = 8; // LUA
@ -112,8 +113,6 @@ void InitialisePushableBlock(short itemNum)
pushable->stopSound = SFX_TR4_PUSH_BLOCK_END; // LUA pushable->stopSound = SFX_TR4_PUSH_BLOCK_END; // LUA
pushable->fallSound = SFX_TR4_BOULDER_FALL; // LUA pushable->fallSound = SFX_TR4_BOULDER_FALL; // LUA
item->data = (void*) pushable;
FindStack(itemNum); // check for stack formation when pushables are initialised FindStack(itemNum); // check for stack formation when pushables are initialised
} }
@ -133,7 +132,7 @@ void PushableBlockControl(short itemNumber)
short roomNumber; short roomNumber;
FLOOR_INFO* floor; FLOOR_INFO* floor;
ROOM_INFO* r; ROOM_INFO* r;
PUSHABLE_INFO* pushable = GET_PUSHABLEINFO(item); PUSHABLE_INFO* pushable = item->data;
int blockHeight = GetStackHeight(item); int blockHeight = GetStackHeight(item);
// do sound effects, it works for now // do sound effects, it works for now
@ -382,7 +381,7 @@ void PushableBlockCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
short roomNumber = item->roomNumber; short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos - 256, item->pos.zPos, &roomNumber); FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos - 256, item->pos.zPos, &roomNumber);
PUSHABLE_INFO* pushable = GET_PUSHABLEINFO(item); PUSHABLE_INFO* pushable = item->data;
int blockHeight = GetStackHeight(item); int blockHeight = GetStackHeight(item);
@ -593,7 +592,7 @@ int TestBlockPush(ITEM_INFO* item, int blockhite, unsigned short quadrant)
if (HeightType) if (HeightType)
return 0; return 0;
if (GET_PUSHABLEINFO(item)->canFall) if (((PUSHABLE_INFO*)item->data)->canFall)
{ {
if (floorHeight < y) if (floorHeight < y)
return 0; return 0;
@ -834,8 +833,8 @@ void MoveStackY(short itemNum, int y)
void AddBridgeStack(short itemNum) void AddBridgeStack(short itemNum)
{ {
auto item = &g_Level.Items[itemNum]; auto item = &g_Level.Items[itemNum];
PUSHABLE_INFO* pushable = item->data;
if (GET_PUSHABLEINFO(item)->hasFloorCeiling) if (pushable->hasFloorCeiling)
ten::Floordata::AddBridge(itemNum); ten::Floordata::AddBridge(itemNum);
int stackIndex = g_Level.Items[itemNum].itemFlags[1]; int stackIndex = g_Level.Items[itemNum].itemFlags[1];
@ -843,7 +842,7 @@ void AddBridgeStack(short itemNum)
{ {
auto stackItem = &g_Level.Items[stackIndex]; auto stackItem = &g_Level.Items[stackIndex];
if (GET_PUSHABLEINFO(stackItem)->hasFloorCeiling) if (pushable->hasFloorCeiling)
ten::Floordata::AddBridge(stackIndex); ten::Floordata::AddBridge(stackIndex);
stackIndex = g_Level.Items[stackIndex].itemFlags[1]; stackIndex = g_Level.Items[stackIndex].itemFlags[1];
@ -853,8 +852,9 @@ void AddBridgeStack(short itemNum)
void RemoveBridgeStack(short itemNum) void RemoveBridgeStack(short itemNum)
{ {
auto item = &g_Level.Items[itemNum]; auto item = &g_Level.Items[itemNum];
PUSHABLE_INFO* pushable = item->data;
if (GET_PUSHABLEINFO(item)->hasFloorCeiling) if (pushable->hasFloorCeiling)
ten::Floordata::RemoveBridge(itemNum); ten::Floordata::RemoveBridge(itemNum);
int stackIndex = g_Level.Items[itemNum].itemFlags[1]; int stackIndex = g_Level.Items[itemNum].itemFlags[1];
@ -862,7 +862,7 @@ void RemoveBridgeStack(short itemNum)
{ {
auto stackItem = &g_Level.Items[stackIndex]; auto stackItem = &g_Level.Items[stackIndex];
if (GET_PUSHABLEINFO(stackItem)->hasFloorCeiling) if (pushable->hasFloorCeiling)
ten::Floordata::RemoveBridge(stackIndex); ten::Floordata::RemoveBridge(stackIndex);
stackIndex = g_Level.Items[stackIndex].itemFlags[1]; stackIndex = g_Level.Items[stackIndex].itemFlags[1];
@ -929,13 +929,14 @@ int FindStack(short itemNum)
int GetStackHeight(ITEM_INFO* item) int GetStackHeight(ITEM_INFO* item)
{ {
int height = GET_PUSHABLEINFO(item)->height; PUSHABLE_INFO* pushable = item->data;
int height = pushable->height;
auto stackItem = item; auto stackItem = item;
while (stackItem->itemFlags[1] != NO_ITEM) while (stackItem->itemFlags[1] != NO_ITEM)
{ {
stackItem = &g_Level.Items[stackItem->itemFlags[1]]; stackItem = &g_Level.Items[stackItem->itemFlags[1]];
height += GET_PUSHABLEINFO(stackItem)->height; height += pushable->height;
} }
return height; return height;
@ -943,7 +944,9 @@ int GetStackHeight(ITEM_INFO* item)
bool CheckStackLimit(ITEM_INFO* item) bool CheckStackLimit(ITEM_INFO* item)
{ {
int limit = GET_PUSHABLEINFO(item)->stackLimit; PUSHABLE_INFO* pushable = item->data;
int limit = pushable->stackLimit;
int count = 1; int count = 1;
auto stackItem = item; auto stackItem = item;
@ -962,7 +965,7 @@ bool CheckStackLimit(ITEM_INFO* item)
std::optional<int> PushableBlockFloor(short itemNumber, int x, int y, int z) std::optional<int> PushableBlockFloor(short itemNumber, int x, int y, int z)
{ {
const auto& item = g_Level.Items[itemNumber]; const auto& item = g_Level.Items[itemNumber];
const auto& pushable = *(PUSHABLE_INFO*)item.data; const auto& pushable = (PUSHABLE_INFO&)item.data;
if (item.status != ITEM_INVISIBLE && pushable.hasFloorCeiling) if (item.status != ITEM_INVISIBLE && pushable.hasFloorCeiling)
{ {
@ -975,7 +978,7 @@ std::optional<int> PushableBlockFloor(short itemNumber, int x, int y, int z)
std::optional<int> PushableBlockCeiling(short itemNumber, int x, int y, int z) std::optional<int> PushableBlockCeiling(short itemNumber, int x, int y, int z)
{ {
const auto& item = g_Level.Items[itemNumber]; const auto& item = g_Level.Items[itemNumber];
const auto& pushable = *(PUSHABLE_INFO*)item.data; const auto& pushable = (PUSHABLE_INFO&)item.data;
if (item.status != ITEM_INVISIBLE && pushable.hasFloorCeiling) if (item.status != ITEM_INVISIBLE && pushable.hasFloorCeiling)
return std::optional{item.pos.yPos}; return std::optional{item.pos.yPos};

View file

@ -2,28 +2,7 @@
struct ITEM_INFO; struct ITEM_INFO;
struct COLL_INFO; struct COLL_INFO;
struct PUSHABLE_INFO
{
int height; // height for collision, also in floor procedure
int weight;
int stackLimit;
int moveX; // used for pushable movement code
int moveZ; // used for pushable movement code
short linkedIndex; // using itemFlags[1] for now
short gravity; // fall acceleration
short loopSound; // looped sound index for movement
short stopSound; // ending sound index
short fallSound; // sound on hitting floor (if dropped)
short climb; // not used for now
bool canFall; // OCB 32
bool hasFloorCeiling; // has floor and ceiling procedures (OCB 64)
bool disablePull; // OCB 128
bool disablePush; // OCB 256
bool disableW; // OCB 512 (W+E)
bool disableE; // OCB 512 (W+E)
bool disableN; // OCB 1024 (N+S)
bool disableS; // OCB 1024 (N+S)
};
void ClearMovableBlockSplitters(int x, int y, int z, short roomNumber); void ClearMovableBlockSplitters(int x, int y, int z, short roomNumber);
void InitialisePushableBlock(short itemNum); void InitialisePushableBlock(short itemNum);

View file

@ -0,0 +1,22 @@
#pragma once
struct PUSHABLE_INFO {
int height; // height for collision, also in floor procedure
int weight;
int stackLimit;
int moveX; // used for pushable movement code
int moveZ; // used for pushable movement code
short linkedIndex; // using itemFlags[1] for now
short gravity; // fall acceleration
short loopSound; // looped sound index for movement
short stopSound; // ending sound index
short fallSound; // sound on hitting floor (if dropped)
short climb; // not used for now
bool canFall; // OCB 32
bool hasFloorCeiling; // has floor and ceiling procedures (OCB 64)
bool disablePull; // OCB 128
bool disablePush; // OCB 256
bool disableW; // OCB 512 (W+E)
bool disableE; // OCB 512 (W+E)
bool disableN; // OCB 1024 (N+S)
bool disableS; // OCB 1024 (N+S)
};

View file

@ -223,91 +223,76 @@ namespace ten::renderer
{ {
RendererBone *currentBone = moveableObj.LinearizedBones[j]; RendererBone *currentBone = moveableObj.LinearizedBones[j];
currentBone->ExtraRotation = Vector3(0.0f, 0.0f, 0.0f); currentBone->ExtraRotation = Vector3(0.0f, 0.0f, 0.0f);
auto& data = item->data.get();
if (item->objectNumber == ID_QUAD) std::visit(overload{
{ [&j,&currentBone](QUAD_INFO& quad) {
QUAD_INFO* quad = (QUAD_INFO*)item->data; if(j == 3 || j == 4) {
if (j == 3 || j == 4) { currentBone->ExtraRotation.x = TO_RAD(quad.rearRot);
currentBone->ExtraRotation.x = TO_RAD(quad->rearRot); } else if(j == 6 || j == 7) {
currentBone->ExtraRotation.x = TO_RAD(quad.frontRot);
} }
else if (j == 6 || j == 7) { },
currentBone->ExtraRotation.x = TO_RAD(quad->frontRot); [&j,&currentBone](JEEP_INFO& jeep) {
} switch(j) {
}
else if (item->objectNumber == ID_JEEP) {
JEEP_INFO* jeep = (JEEP_INFO*)item->data;
switch (j) {
case 9: case 9:
currentBone->ExtraRotation.x = TO_RAD(jeep->rot1); currentBone->ExtraRotation.x = TO_RAD(jeep.rot1);
break; break;
case 10: case 10:
currentBone->ExtraRotation.x = TO_RAD(jeep->rot2); currentBone->ExtraRotation.x = TO_RAD(jeep.rot2);
break; break;
case 12: case 12:
currentBone->ExtraRotation.x = TO_RAD(jeep->rot3); currentBone->ExtraRotation.x = TO_RAD(jeep.rot3);
break; break;
case 13: case 13:
currentBone->ExtraRotation.x = TO_RAD(jeep->rot4); currentBone->ExtraRotation.x = TO_RAD(jeep.rot4);
break; break;
} }
} },
else if (item->objectNumber == ID_MOTORBIKE) { [&j,&currentBone](MOTORBIKE_INFO& bike) {
MOTORBIKE_INFO* bike = (MOTORBIKE_INFO*)item->data; switch(j) {
switch (j) {
case 2: case 2:
case 4: case 4:
currentBone->ExtraRotation.x = TO_RAD(bike->wheelRight); currentBone->ExtraRotation.x = TO_RAD(bike.wheelRight);
break; break;
case 10: case 10:
currentBone->ExtraRotation.x = TO_RAD(bike->wheelLeft); currentBone->ExtraRotation.x = TO_RAD(bike.wheelLeft);
} }
} },
else if (item->objectNumber == ID_RUBBER_BOAT) [&j,&currentBone](RUBBER_BOAT_INFO& boat) {
{ if(j == 2)
RUBBER_BOAT_INFO* boat = (RUBBER_BOAT_INFO*)item->data; currentBone->ExtraRotation.z = TO_RAD(boat.propRot);
if (j == 2) },
currentBone->ExtraRotation.z = TO_RAD(boat->propRot); [&j, &currentBone](SUB_INFO& upv) {
} if(j == 3)
else if (item->objectNumber == ID_UPV) currentBone->ExtraRotation.z = TO_RAD(upv.FanRot);
{ },
SUB_INFO* upv = (SUB_INFO*)item->data; [&j, &currentBone](BIGGUNINFO& biggun) {
if (j == 3) if(j == 2)
currentBone->ExtraRotation.z = TO_RAD(upv->FanRot); currentBone->ExtraRotation.z = biggun.barrelZ;
} },
else if (item->objectNumber == ID_BIGGUN) [&j,&currentBone,&lastJoint](CREATURE_INFO& creature) {
{ if(currentBone->ExtraRotationFlags & ROT_Y) {
BIGGUNINFO* biggun = (BIGGUNINFO*)item->data; currentBone->ExtraRotation.y = TO_RAD(creature.jointRotation[lastJoint]);
if (j == 2) lastJoint++;
currentBone->ExtraRotation.z = biggun->barrelZ;
}
else
{
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
if (creature != NULL)
{
if (currentBone->ExtraRotationFlags & ROT_Y)
{
currentBone->ExtraRotation.y = TO_RAD(creature->jointRotation[lastJoint]);
lastJoint++;
}
if (currentBone->ExtraRotationFlags & ROT_X)
{
currentBone->ExtraRotation.x = TO_RAD(creature->jointRotation[lastJoint]);
lastJoint++;
}
if (currentBone->ExtraRotationFlags & ROT_Z)
{
currentBone->ExtraRotation.z = TO_RAD(creature->jointRotation[lastJoint]);
lastJoint++;
}
} }
}
if(currentBone->ExtraRotationFlags & ROT_X) {
currentBone->ExtraRotation.x = TO_RAD(creature.jointRotation[lastJoint]);
lastJoint++;
}
if(currentBone->ExtraRotationFlags & ROT_Z) {
currentBone->ExtraRotation.z = TO_RAD(creature.jointRotation[lastJoint]);
lastJoint++;
}
},
[](auto&) {},
}, data
);
} }
ANIM_FRAME* framePtr[2]; ANIM_FRAME* framePtr[2];
@ -331,7 +316,6 @@ namespace ten::renderer
{ {
RendererItem *itemToDraw = view.itemsToDraw[i]; RendererItem *itemToDraw = view.itemsToDraw[i];
ITEM_INFO *item = itemToDraw->Item; ITEM_INFO *item = itemToDraw->Item;
CREATURE_INFO *creature = (CREATURE_INFO *)item->data;
// Lara has her own routine // Lara has her own routine
if (item->objectNumber == ID_LARA) if (item->objectNumber == ID_LARA)

View file

@ -146,6 +146,7 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\"</Command>
<ClInclude Include="Game\footprint.h" /> <ClInclude Include="Game\footprint.h" />
<ClInclude Include="Game\groundfx.h" /> <ClInclude Include="Game\groundfx.h" />
<ClInclude Include="Game\item.h" /> <ClInclude Include="Game\item.h" />
<ClInclude Include="Game\roomvector.h" />
<ClInclude Include="Objects\TR2\Vehicles\boat_info.h" /> <ClInclude Include="Objects\TR2\Vehicles\boat_info.h" />
<ClInclude Include="Game\creature_info.h" /> <ClInclude Include="Game\creature_info.h" />
<ClInclude Include="Game\itemdata\itemdata.h" /> <ClInclude Include="Game\itemdata\itemdata.h" />
@ -193,9 +194,11 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\"</Command>
<ClInclude Include="Objects\TR3\Vehicles\quad_info.h" /> <ClInclude Include="Objects\TR3\Vehicles\quad_info.h" />
<ClInclude Include="Objects\TR3\Vehicles\rubberboat_info.h" /> <ClInclude Include="Objects\TR3\Vehicles\rubberboat_info.h" />
<ClInclude Include="Objects\TR3\Vehicles\upv_info.h" /> <ClInclude Include="Objects\TR3\Vehicles\upv_info.h" />
<ClInclude Include="Objects\TR4\Entity\tr4_wraith_info.h" />
<ClInclude Include="Objects\TR4\Vehicles\jeep_info.h" /> <ClInclude Include="Objects\TR4\Vehicles\jeep_info.h" />
<ClInclude Include="Objects\TR4\Vehicles\motorbike_info.h" /> <ClInclude Include="Objects\TR4\Vehicles\motorbike_info.h" />
<ClInclude Include="Objects\TR5\Entity\tr5_laserhead_info.h" /> <ClInclude Include="Objects\TR5\Entity\tr5_laserhead_info.h" />
<ClInclude Include="Objects\TR5\Object\tr5_pushableblock_info.h" />
<ClInclude Include="Objects\TR5\Switch\tr5_crowdove_switch.h" /> <ClInclude Include="Objects\TR5\Switch\tr5_crowdove_switch.h" />
<ClInclude Include="Scripting\GameScriptAIObject.h" /> <ClInclude Include="Scripting\GameScriptAIObject.h" />
<ClInclude Include="Scripting\GameScriptAudioTrack.h" /> <ClInclude Include="Scripting\GameScriptAudioTrack.h" />
@ -517,6 +520,7 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\"</Command>
<ClCompile Include="Game\explosion.cpp" /> <ClCompile Include="Game\explosion.cpp" />
<ClCompile Include="Game\floordata.cpp" /> <ClCompile Include="Game\floordata.cpp" />
<ClCompile Include="Game\footprint.cpp" /> <ClCompile Include="Game\footprint.cpp" />
<ClCompile Include="Game\itemdata\itemdata.cpp" />
<ClCompile Include="Game\Lara\lara_basic.cpp" /> <ClCompile Include="Game\Lara\lara_basic.cpp" />
<ClCompile Include="Game\Lara\lara_cheat.cpp" /> <ClCompile Include="Game\Lara\lara_cheat.cpp" />
<ClCompile Include="Game\Lara\lara_collide.cpp" /> <ClCompile Include="Game\Lara\lara_collide.cpp" />

View file

@ -1128,6 +1128,15 @@
<ClInclude Include="Game\door_data.h"> <ClInclude Include="Game\door_data.h">
<Filter>File di intestazione</Filter> <Filter>File di intestazione</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Game\roomvector.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR4\Entity\tr4_wraith_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR5\Object\tr5_pushableblock_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Game\box.cpp"> <ClCompile Include="Game\box.cpp">
@ -2033,6 +2042,9 @@
<ClCompile Include="Objects\TR5\Switch\tr5_crowdove_switch.cpp"> <ClCompile Include="Objects\TR5\Switch\tr5_crowdove_switch.cpp">
<Filter>File di origine</Filter> <Filter>File di origine</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Game\itemdata\itemdata.cpp">
<Filter>File di origine</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />