mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-04 02:38:00 +03:00
Added better items handling on load and save for runtime created items
This commit is contained in:
parent
cbc8c42037
commit
2ee369e7ea
6 changed files with 378 additions and 60 deletions
|
@ -108,6 +108,10 @@ table ItemNumber {
|
||||||
num: short;
|
num: short;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table Short {
|
||||||
|
scalar: short;
|
||||||
|
}
|
||||||
|
|
||||||
table Int {
|
table Int {
|
||||||
scalar: ulong;
|
scalar: ulong;
|
||||||
}
|
}
|
||||||
|
@ -139,6 +143,7 @@ union ItemData {
|
||||||
ulong,
|
ulong,
|
||||||
double,*/
|
double,*/
|
||||||
Int,
|
Int,
|
||||||
|
Short,
|
||||||
Float,
|
Float,
|
||||||
ShortArray,
|
ShortArray,
|
||||||
ItemNumber,
|
ItemNumber,
|
||||||
|
|
|
@ -87,6 +87,10 @@ struct ItemNumber;
|
||||||
struct ItemNumberBuilder;
|
struct ItemNumberBuilder;
|
||||||
struct ItemNumberT;
|
struct ItemNumberT;
|
||||||
|
|
||||||
|
struct Short;
|
||||||
|
struct ShortBuilder;
|
||||||
|
struct ShortT;
|
||||||
|
|
||||||
struct Int;
|
struct Int;
|
||||||
struct IntBuilder;
|
struct IntBuilder;
|
||||||
struct IntT;
|
struct IntT;
|
||||||
|
@ -104,34 +108,36 @@ struct Vector3;
|
||||||
enum class ItemData : uint8_t {
|
enum class ItemData : uint8_t {
|
||||||
NONE = 0,
|
NONE = 0,
|
||||||
Int = 1,
|
Int = 1,
|
||||||
Float = 2,
|
Short = 2,
|
||||||
ShortArray = 3,
|
Float = 3,
|
||||||
ItemNumber = 4,
|
ShortArray = 4,
|
||||||
Creature = 5,
|
ItemNumber = 5,
|
||||||
LaserHead = 6,
|
Creature = 6,
|
||||||
QuadBike = 7,
|
LaserHead = 7,
|
||||||
BigGun = 8,
|
QuadBike = 8,
|
||||||
Motorbike = 9,
|
BigGun = 9,
|
||||||
Jeep = 10,
|
Motorbike = 10,
|
||||||
LaraInfo = 11,
|
Jeep = 11,
|
||||||
Kayak = 12,
|
LaraInfo = 12,
|
||||||
Door = 13,
|
Kayak = 13,
|
||||||
Skidoo = 14,
|
Door = 14,
|
||||||
UPV = 15,
|
Skidoo = 15,
|
||||||
Motorboat = 16,
|
UPV = 16,
|
||||||
GameVector = 17,
|
Motorboat = 17,
|
||||||
Wraith = 18,
|
GameVector = 18,
|
||||||
Rubberboat = 19,
|
Wraith = 19,
|
||||||
Pushable = 20,
|
Rubberboat = 20,
|
||||||
Minecart = 21,
|
Pushable = 21,
|
||||||
|
Minecart = 22,
|
||||||
MIN = NONE,
|
MIN = NONE,
|
||||||
MAX = Minecart
|
MAX = Minecart
|
||||||
};
|
};
|
||||||
|
|
||||||
inline const ItemData (&EnumValuesItemData())[22] {
|
inline const ItemData (&EnumValuesItemData())[23] {
|
||||||
static const ItemData values[] = {
|
static const ItemData values[] = {
|
||||||
ItemData::NONE,
|
ItemData::NONE,
|
||||||
ItemData::Int,
|
ItemData::Int,
|
||||||
|
ItemData::Short,
|
||||||
ItemData::Float,
|
ItemData::Float,
|
||||||
ItemData::ShortArray,
|
ItemData::ShortArray,
|
||||||
ItemData::ItemNumber,
|
ItemData::ItemNumber,
|
||||||
|
@ -157,9 +163,10 @@ inline const ItemData (&EnumValuesItemData())[22] {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const char * const *EnumNamesItemData() {
|
inline const char * const *EnumNamesItemData() {
|
||||||
static const char * const names[23] = {
|
static const char * const names[24] = {
|
||||||
"NONE",
|
"NONE",
|
||||||
"Int",
|
"Int",
|
||||||
|
"Short",
|
||||||
"Float",
|
"Float",
|
||||||
"ShortArray",
|
"ShortArray",
|
||||||
"ItemNumber",
|
"ItemNumber",
|
||||||
|
@ -199,6 +206,10 @@ template<> struct ItemDataTraits<TEN::Save::Int> {
|
||||||
static const ItemData enum_value = ItemData::Int;
|
static const ItemData enum_value = ItemData::Int;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<> struct ItemDataTraits<TEN::Save::Short> {
|
||||||
|
static const ItemData enum_value = ItemData::Short;
|
||||||
|
};
|
||||||
|
|
||||||
template<> struct ItemDataTraits<TEN::Save::Float> {
|
template<> struct ItemDataTraits<TEN::Save::Float> {
|
||||||
static const ItemData enum_value = ItemData::Float;
|
static const ItemData enum_value = ItemData::Float;
|
||||||
};
|
};
|
||||||
|
@ -319,6 +330,14 @@ struct ItemDataUnion {
|
||||||
return type == ItemData::Int ?
|
return type == ItemData::Int ?
|
||||||
reinterpret_cast<const TEN::Save::IntT *>(value) : nullptr;
|
reinterpret_cast<const TEN::Save::IntT *>(value) : nullptr;
|
||||||
}
|
}
|
||||||
|
TEN::Save::ShortT *AsShort() {
|
||||||
|
return type == ItemData::Short ?
|
||||||
|
reinterpret_cast<TEN::Save::ShortT *>(value) : nullptr;
|
||||||
|
}
|
||||||
|
const TEN::Save::ShortT *AsShort() const {
|
||||||
|
return type == ItemData::Short ?
|
||||||
|
reinterpret_cast<const TEN::Save::ShortT *>(value) : nullptr;
|
||||||
|
}
|
||||||
TEN::Save::FloatT *AsFloat() {
|
TEN::Save::FloatT *AsFloat() {
|
||||||
return type == ItemData::Float ?
|
return type == ItemData::Float ?
|
||||||
reinterpret_cast<TEN::Save::FloatT *>(value) : nullptr;
|
reinterpret_cast<TEN::Save::FloatT *>(value) : nullptr;
|
||||||
|
@ -1764,6 +1783,64 @@ struct ItemNumber::Traits {
|
||||||
|
|
||||||
flatbuffers::Offset<ItemNumber> CreateItemNumber(flatbuffers::FlatBufferBuilder &_fbb, const ItemNumberT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
flatbuffers::Offset<ItemNumber> CreateItemNumber(flatbuffers::FlatBufferBuilder &_fbb, const ItemNumberT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
||||||
|
|
||||||
|
struct ShortT : public flatbuffers::NativeTable {
|
||||||
|
typedef Short TableType;
|
||||||
|
int16_t scalar = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Short FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
||||||
|
typedef ShortT NativeTableType;
|
||||||
|
typedef ShortBuilder Builder;
|
||||||
|
struct Traits;
|
||||||
|
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
|
||||||
|
VT_SCALAR = 4
|
||||||
|
};
|
||||||
|
int16_t scalar() const {
|
||||||
|
return GetField<int16_t>(VT_SCALAR, 0);
|
||||||
|
}
|
||||||
|
bool Verify(flatbuffers::Verifier &verifier) const {
|
||||||
|
return VerifyTableStart(verifier) &&
|
||||||
|
VerifyField<int16_t>(verifier, VT_SCALAR) &&
|
||||||
|
verifier.EndTable();
|
||||||
|
}
|
||||||
|
ShortT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
|
||||||
|
void UnPackTo(ShortT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
|
||||||
|
static flatbuffers::Offset<Short> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ShortT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ShortBuilder {
|
||||||
|
typedef Short Table;
|
||||||
|
flatbuffers::FlatBufferBuilder &fbb_;
|
||||||
|
flatbuffers::uoffset_t start_;
|
||||||
|
void add_scalar(int16_t scalar) {
|
||||||
|
fbb_.AddElement<int16_t>(Short::VT_SCALAR, scalar, 0);
|
||||||
|
}
|
||||||
|
explicit ShortBuilder(flatbuffers::FlatBufferBuilder &_fbb)
|
||||||
|
: fbb_(_fbb) {
|
||||||
|
start_ = fbb_.StartTable();
|
||||||
|
}
|
||||||
|
flatbuffers::Offset<Short> Finish() {
|
||||||
|
const auto end = fbb_.EndTable(start_);
|
||||||
|
auto o = flatbuffers::Offset<Short>(end);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline flatbuffers::Offset<Short> CreateShort(
|
||||||
|
flatbuffers::FlatBufferBuilder &_fbb,
|
||||||
|
int16_t scalar = 0) {
|
||||||
|
ShortBuilder builder_(_fbb);
|
||||||
|
builder_.add_scalar(scalar);
|
||||||
|
return builder_.Finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Short::Traits {
|
||||||
|
using type = Short;
|
||||||
|
static auto constexpr Create = CreateShort;
|
||||||
|
};
|
||||||
|
|
||||||
|
flatbuffers::Offset<Short> CreateShort(flatbuffers::FlatBufferBuilder &_fbb, const ShortT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
||||||
|
|
||||||
struct IntT : public flatbuffers::NativeTable {
|
struct IntT : public flatbuffers::NativeTable {
|
||||||
typedef Int TableType;
|
typedef Int TableType;
|
||||||
uint64_t scalar = 0;
|
uint64_t scalar = 0;
|
||||||
|
@ -2463,6 +2540,32 @@ inline flatbuffers::Offset<ItemNumber> CreateItemNumber(flatbuffers::FlatBufferB
|
||||||
_num);
|
_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline ShortT *Short::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
|
||||||
|
auto _o = std::make_unique<ShortT>();
|
||||||
|
UnPackTo(_o.get(), _resolver);
|
||||||
|
return _o.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Short::UnPackTo(ShortT *_o, const flatbuffers::resolver_function_t *_resolver) const {
|
||||||
|
(void)_o;
|
||||||
|
(void)_resolver;
|
||||||
|
{ auto _e = scalar(); _o->scalar = _e; }
|
||||||
|
}
|
||||||
|
|
||||||
|
inline flatbuffers::Offset<Short> Short::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ShortT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
|
||||||
|
return CreateShort(_fbb, _o, _rehasher);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline flatbuffers::Offset<Short> CreateShort(flatbuffers::FlatBufferBuilder &_fbb, const ShortT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
|
||||||
|
(void)_rehasher;
|
||||||
|
(void)_o;
|
||||||
|
struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ShortT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
|
||||||
|
auto _scalar = _o->scalar;
|
||||||
|
return TEN::Save::CreateShort(
|
||||||
|
_fbb,
|
||||||
|
_scalar);
|
||||||
|
}
|
||||||
|
|
||||||
inline IntT *Int::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
|
inline IntT *Int::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
|
||||||
auto _o = std::make_unique<IntT>();
|
auto _o = std::make_unique<IntT>();
|
||||||
UnPackTo(_o.get(), _resolver);
|
UnPackTo(_o.get(), _resolver);
|
||||||
|
@ -2550,6 +2653,10 @@ inline bool VerifyItemData(flatbuffers::Verifier &verifier, const void *obj, Ite
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::Int *>(obj);
|
auto ptr = reinterpret_cast<const TEN::Save::Int *>(obj);
|
||||||
return verifier.VerifyTable(ptr);
|
return verifier.VerifyTable(ptr);
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
auto ptr = reinterpret_cast<const TEN::Save::Short *>(obj);
|
||||||
|
return verifier.VerifyTable(ptr);
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::Float *>(obj);
|
auto ptr = reinterpret_cast<const TEN::Save::Float *>(obj);
|
||||||
return verifier.VerifyTable(ptr);
|
return verifier.VerifyTable(ptr);
|
||||||
|
@ -2652,6 +2759,10 @@ inline void *ItemDataUnion::UnPack(const void *obj, ItemData type, const flatbuf
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::Int *>(obj);
|
auto ptr = reinterpret_cast<const TEN::Save::Int *>(obj);
|
||||||
return ptr->UnPack(resolver);
|
return ptr->UnPack(resolver);
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
auto ptr = reinterpret_cast<const TEN::Save::Short *>(obj);
|
||||||
|
return ptr->UnPack(resolver);
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::Float *>(obj);
|
auto ptr = reinterpret_cast<const TEN::Save::Float *>(obj);
|
||||||
return ptr->UnPack(resolver);
|
return ptr->UnPack(resolver);
|
||||||
|
@ -2742,6 +2853,10 @@ inline flatbuffers::Offset<void> ItemDataUnion::Pack(flatbuffers::FlatBufferBuil
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::IntT *>(value);
|
auto ptr = reinterpret_cast<const TEN::Save::IntT *>(value);
|
||||||
return CreateInt(_fbb, ptr, _rehasher).Union();
|
return CreateInt(_fbb, ptr, _rehasher).Union();
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
auto ptr = reinterpret_cast<const TEN::Save::ShortT *>(value);
|
||||||
|
return CreateShort(_fbb, ptr, _rehasher).Union();
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::FloatT *>(value);
|
auto ptr = reinterpret_cast<const TEN::Save::FloatT *>(value);
|
||||||
return CreateFloat(_fbb, ptr, _rehasher).Union();
|
return CreateFloat(_fbb, ptr, _rehasher).Union();
|
||||||
|
@ -2832,6 +2947,10 @@ inline ItemDataUnion::ItemDataUnion(const ItemDataUnion &u) : type(u.type), valu
|
||||||
value = new TEN::Save::IntT(*reinterpret_cast<TEN::Save::IntT *>(u.value));
|
value = new TEN::Save::IntT(*reinterpret_cast<TEN::Save::IntT *>(u.value));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
value = new TEN::Save::ShortT(*reinterpret_cast<TEN::Save::ShortT *>(u.value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
value = new TEN::Save::FloatT(*reinterpret_cast<TEN::Save::FloatT *>(u.value));
|
value = new TEN::Save::FloatT(*reinterpret_cast<TEN::Save::FloatT *>(u.value));
|
||||||
break;
|
break;
|
||||||
|
@ -2924,6 +3043,11 @@ inline void ItemDataUnion::Reset() {
|
||||||
delete ptr;
|
delete ptr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
auto ptr = reinterpret_cast<TEN::Save::ShortT *>(value);
|
||||||
|
delete ptr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
auto ptr = reinterpret_cast<TEN::Save::FloatT *>(value);
|
auto ptr = reinterpret_cast<TEN::Save::FloatT *>(value);
|
||||||
delete ptr;
|
delete ptr;
|
||||||
|
|
|
@ -313,6 +313,9 @@ struct Item FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
||||||
const TEN::Save::Int *data_as_Int() const {
|
const TEN::Save::Int *data_as_Int() const {
|
||||||
return data_type() == TEN::Save::ItemData::Int ? static_cast<const TEN::Save::Int *>(data()) : nullptr;
|
return data_type() == TEN::Save::ItemData::Int ? static_cast<const TEN::Save::Int *>(data()) : nullptr;
|
||||||
}
|
}
|
||||||
|
const TEN::Save::Short *data_as_Short() const {
|
||||||
|
return data_type() == TEN::Save::ItemData::Short ? static_cast<const TEN::Save::Short *>(data()) : nullptr;
|
||||||
|
}
|
||||||
const TEN::Save::Float *data_as_Float() const {
|
const TEN::Save::Float *data_as_Float() const {
|
||||||
return data_type() == TEN::Save::ItemData::Float ? static_cast<const TEN::Save::Float *>(data()) : nullptr;
|
return data_type() == TEN::Save::ItemData::Float ? static_cast<const TEN::Save::Float *>(data()) : nullptr;
|
||||||
}
|
}
|
||||||
|
@ -423,6 +426,10 @@ template<> inline const TEN::Save::Int *Item::data_as<TEN::Save::Int>() const {
|
||||||
return data_as_Int();
|
return data_as_Int();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<> inline const TEN::Save::Short *Item::data_as<TEN::Save::Short>() const {
|
||||||
|
return data_as_Short();
|
||||||
|
}
|
||||||
|
|
||||||
template<> inline const TEN::Save::Float *Item::data_as<TEN::Save::Float>() const {
|
template<> inline const TEN::Save::Float *Item::data_as<TEN::Save::Float>() const {
|
||||||
return data_as_Float();
|
return data_as_Float();
|
||||||
}
|
}
|
||||||
|
|
|
@ -412,6 +412,18 @@ bool SaveGame::Save(int slot)
|
||||||
serializedItem.add_data_type(Save::ItemData::Creature);
|
serializedItem.add_data_type(Save::ItemData::Creature);
|
||||||
serializedItem.add_data(creatureOffset.Union());
|
serializedItem.add_data(creatureOffset.Union());
|
||||||
}
|
}
|
||||||
|
else if (itemToSerialize.data.is<short>())
|
||||||
|
{
|
||||||
|
short& data = itemToSerialize.data;
|
||||||
|
serializedItem.add_data_type(Save::ItemData::Short);
|
||||||
|
serializedItem.add_data(data);
|
||||||
|
}
|
||||||
|
else if (itemToSerialize.data.is<int>())
|
||||||
|
{
|
||||||
|
int& data = itemToSerialize.data;
|
||||||
|
serializedItem.add_data_type(Save::ItemData::Int);
|
||||||
|
serializedItem.add_data(data);
|
||||||
|
}
|
||||||
|
|
||||||
auto serializedItemOffset = serializedItem.Finish();
|
auto serializedItemOffset = serializedItem.Finish();
|
||||||
serializedItems.push_back(serializedItemOffset);
|
serializedItems.push_back(serializedItemOffset);
|
||||||
|
@ -771,13 +783,29 @@ bool SaveGame::Load(int slot)
|
||||||
// Items
|
// Items
|
||||||
for (int i = 0; i < s->items()->size(); i++)
|
for (int i = 0; i < s->items()->size(); i++)
|
||||||
{
|
{
|
||||||
if (i >= g_Level.NumItems)
|
|
||||||
break;
|
|
||||||
|
|
||||||
const Save::Item* savedItem = s->items()->Get(i);
|
const Save::Item* savedItem = s->items()->Get(i);
|
||||||
ITEM_INFO* item = &g_Level.Items[i];
|
|
||||||
|
short itemNumber = i;
|
||||||
|
bool dynamicItem = false;
|
||||||
|
|
||||||
|
if (i >= g_Level.NumItems)
|
||||||
|
{
|
||||||
|
// Items beyond items level space must be active
|
||||||
|
if (!savedItem->active())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Items beyond items level space must be initialised differently
|
||||||
|
itemNumber = CreateItem();
|
||||||
|
if (itemNumber == NO_ITEM)
|
||||||
|
continue;
|
||||||
|
dynamicItem = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||||
OBJECT_INFO* obj = &Objects[item->objectNumber];
|
OBJECT_INFO* obj = &Objects[item->objectNumber];
|
||||||
|
|
||||||
|
if (!dynamicItem)
|
||||||
|
{
|
||||||
// Kill immediately item if already killed and continue
|
// Kill immediately item if already killed and continue
|
||||||
if (savedItem->flags() & IFLAG_KILLED)
|
if (savedItem->flags() & IFLAG_KILLED)
|
||||||
{
|
{
|
||||||
|
@ -790,6 +818,7 @@ bool SaveGame::Load(int slot)
|
||||||
// If not triggered, don't load remaining data
|
// If not triggered, don't load remaining data
|
||||||
if (item->objectNumber != ID_LARA && !(savedItem->flags() & (TRIGGERED | CODE_BITS | ONESHOT)))
|
if (item->objectNumber != ID_LARA && !(savedItem->flags() & (TRIGGERED | CODE_BITS | ONESHOT)))
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
item->pos.xPos = savedItem->position()->x_pos();
|
item->pos.xPos = savedItem->position()->x_pos();
|
||||||
item->pos.yPos = savedItem->position()->y_pos();
|
item->pos.yPos = savedItem->position()->y_pos();
|
||||||
|
@ -798,11 +827,27 @@ bool SaveGame::Load(int slot)
|
||||||
item->pos.yRot = savedItem->position()->y_rot();
|
item->pos.yRot = savedItem->position()->y_rot();
|
||||||
item->pos.zRot = savedItem->position()->z_rot();
|
item->pos.zRot = savedItem->position()->z_rot();
|
||||||
|
|
||||||
|
short roomNumber = savedItem->room_number();
|
||||||
|
|
||||||
|
if (dynamicItem)
|
||||||
|
{
|
||||||
|
item->roomNumber = roomNumber;
|
||||||
|
|
||||||
|
InitialiseItem(itemNumber);
|
||||||
|
|
||||||
|
// InitialiseItem could overwrite position so restore it
|
||||||
|
item->pos.xPos = savedItem->position()->x_pos();
|
||||||
|
item->pos.yPos = savedItem->position()->y_pos();
|
||||||
|
item->pos.zPos = savedItem->position()->z_pos();
|
||||||
|
item->pos.xRot = savedItem->position()->x_rot();
|
||||||
|
item->pos.yRot = savedItem->position()->y_rot();
|
||||||
|
item->pos.zRot = savedItem->position()->z_rot();
|
||||||
|
}
|
||||||
|
|
||||||
item->speed = savedItem->speed();
|
item->speed = savedItem->speed();
|
||||||
item->fallspeed = savedItem->fall_speed();
|
item->fallspeed = savedItem->fall_speed();
|
||||||
|
|
||||||
// Do the correct way for assigning new room number
|
// Do the correct way for assigning new room number
|
||||||
short roomNumber = savedItem->room_number();
|
|
||||||
if (item->objectNumber == ID_LARA)
|
if (item->objectNumber == ID_LARA)
|
||||||
{
|
{
|
||||||
LaraItem->location.roomNumber = roomNumber;
|
LaraItem->location.roomNumber = roomNumber;
|
||||||
|
@ -891,6 +936,12 @@ bool SaveGame::Load(int slot)
|
||||||
creature->patrol2 = savedCreature->patrol2();
|
creature->patrol2 = savedCreature->patrol2();
|
||||||
creature->reachedGoal = savedCreature->reached_goal();
|
creature->reachedGoal = savedCreature->reached_goal();
|
||||||
}
|
}
|
||||||
|
else if (savedItem->data_type() == Save::ItemData::Short)
|
||||||
|
{
|
||||||
|
auto data = savedItem->data();
|
||||||
|
auto savedData = (Save::Short*)data;
|
||||||
|
item->data = savedData->scalar();
|
||||||
|
}
|
||||||
|
|
||||||
// Mesh stuff
|
// Mesh stuff
|
||||||
item->meshBits = savedItem->mesh_bits();
|
item->meshBits = savedItem->mesh_bits();
|
||||||
|
|
|
@ -87,6 +87,10 @@ struct ItemNumber;
|
||||||
struct ItemNumberBuilder;
|
struct ItemNumberBuilder;
|
||||||
struct ItemNumberT;
|
struct ItemNumberT;
|
||||||
|
|
||||||
|
struct Short;
|
||||||
|
struct ShortBuilder;
|
||||||
|
struct ShortT;
|
||||||
|
|
||||||
struct Int;
|
struct Int;
|
||||||
struct IntBuilder;
|
struct IntBuilder;
|
||||||
struct IntT;
|
struct IntT;
|
||||||
|
@ -104,34 +108,36 @@ struct Vector3;
|
||||||
enum class ItemData : uint8_t {
|
enum class ItemData : uint8_t {
|
||||||
NONE = 0,
|
NONE = 0,
|
||||||
Int = 1,
|
Int = 1,
|
||||||
Float = 2,
|
Short = 2,
|
||||||
ShortArray = 3,
|
Float = 3,
|
||||||
ItemNumber = 4,
|
ShortArray = 4,
|
||||||
Creature = 5,
|
ItemNumber = 5,
|
||||||
LaserHead = 6,
|
Creature = 6,
|
||||||
QuadBike = 7,
|
LaserHead = 7,
|
||||||
BigGun = 8,
|
QuadBike = 8,
|
||||||
Motorbike = 9,
|
BigGun = 9,
|
||||||
Jeep = 10,
|
Motorbike = 10,
|
||||||
LaraInfo = 11,
|
Jeep = 11,
|
||||||
Kayak = 12,
|
LaraInfo = 12,
|
||||||
Door = 13,
|
Kayak = 13,
|
||||||
Skidoo = 14,
|
Door = 14,
|
||||||
UPV = 15,
|
Skidoo = 15,
|
||||||
Motorboat = 16,
|
UPV = 16,
|
||||||
GameVector = 17,
|
Motorboat = 17,
|
||||||
Wraith = 18,
|
GameVector = 18,
|
||||||
Rubberboat = 19,
|
Wraith = 19,
|
||||||
Pushable = 20,
|
Rubberboat = 20,
|
||||||
Minecart = 21,
|
Pushable = 21,
|
||||||
|
Minecart = 22,
|
||||||
MIN = NONE,
|
MIN = NONE,
|
||||||
MAX = Minecart
|
MAX = Minecart
|
||||||
};
|
};
|
||||||
|
|
||||||
inline const ItemData (&EnumValuesItemData())[22] {
|
inline const ItemData (&EnumValuesItemData())[23] {
|
||||||
static const ItemData values[] = {
|
static const ItemData values[] = {
|
||||||
ItemData::NONE,
|
ItemData::NONE,
|
||||||
ItemData::Int,
|
ItemData::Int,
|
||||||
|
ItemData::Short,
|
||||||
ItemData::Float,
|
ItemData::Float,
|
||||||
ItemData::ShortArray,
|
ItemData::ShortArray,
|
||||||
ItemData::ItemNumber,
|
ItemData::ItemNumber,
|
||||||
|
@ -157,9 +163,10 @@ inline const ItemData (&EnumValuesItemData())[22] {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const char * const *EnumNamesItemData() {
|
inline const char * const *EnumNamesItemData() {
|
||||||
static const char * const names[23] = {
|
static const char * const names[24] = {
|
||||||
"NONE",
|
"NONE",
|
||||||
"Int",
|
"Int",
|
||||||
|
"Short",
|
||||||
"Float",
|
"Float",
|
||||||
"ShortArray",
|
"ShortArray",
|
||||||
"ItemNumber",
|
"ItemNumber",
|
||||||
|
@ -199,6 +206,10 @@ template<> struct ItemDataTraits<TEN::Save::Int> {
|
||||||
static const ItemData enum_value = ItemData::Int;
|
static const ItemData enum_value = ItemData::Int;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<> struct ItemDataTraits<TEN::Save::Short> {
|
||||||
|
static const ItemData enum_value = ItemData::Short;
|
||||||
|
};
|
||||||
|
|
||||||
template<> struct ItemDataTraits<TEN::Save::Float> {
|
template<> struct ItemDataTraits<TEN::Save::Float> {
|
||||||
static const ItemData enum_value = ItemData::Float;
|
static const ItemData enum_value = ItemData::Float;
|
||||||
};
|
};
|
||||||
|
@ -319,6 +330,14 @@ struct ItemDataUnion {
|
||||||
return type == ItemData::Int ?
|
return type == ItemData::Int ?
|
||||||
reinterpret_cast<const TEN::Save::IntT *>(value) : nullptr;
|
reinterpret_cast<const TEN::Save::IntT *>(value) : nullptr;
|
||||||
}
|
}
|
||||||
|
TEN::Save::ShortT *AsShort() {
|
||||||
|
return type == ItemData::Short ?
|
||||||
|
reinterpret_cast<TEN::Save::ShortT *>(value) : nullptr;
|
||||||
|
}
|
||||||
|
const TEN::Save::ShortT *AsShort() const {
|
||||||
|
return type == ItemData::Short ?
|
||||||
|
reinterpret_cast<const TEN::Save::ShortT *>(value) : nullptr;
|
||||||
|
}
|
||||||
TEN::Save::FloatT *AsFloat() {
|
TEN::Save::FloatT *AsFloat() {
|
||||||
return type == ItemData::Float ?
|
return type == ItemData::Float ?
|
||||||
reinterpret_cast<TEN::Save::FloatT *>(value) : nullptr;
|
reinterpret_cast<TEN::Save::FloatT *>(value) : nullptr;
|
||||||
|
@ -1764,6 +1783,64 @@ struct ItemNumber::Traits {
|
||||||
|
|
||||||
flatbuffers::Offset<ItemNumber> CreateItemNumber(flatbuffers::FlatBufferBuilder &_fbb, const ItemNumberT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
flatbuffers::Offset<ItemNumber> CreateItemNumber(flatbuffers::FlatBufferBuilder &_fbb, const ItemNumberT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
||||||
|
|
||||||
|
struct ShortT : public flatbuffers::NativeTable {
|
||||||
|
typedef Short TableType;
|
||||||
|
int16_t scalar = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Short FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
||||||
|
typedef ShortT NativeTableType;
|
||||||
|
typedef ShortBuilder Builder;
|
||||||
|
struct Traits;
|
||||||
|
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
|
||||||
|
VT_SCALAR = 4
|
||||||
|
};
|
||||||
|
int16_t scalar() const {
|
||||||
|
return GetField<int16_t>(VT_SCALAR, 0);
|
||||||
|
}
|
||||||
|
bool Verify(flatbuffers::Verifier &verifier) const {
|
||||||
|
return VerifyTableStart(verifier) &&
|
||||||
|
VerifyField<int16_t>(verifier, VT_SCALAR) &&
|
||||||
|
verifier.EndTable();
|
||||||
|
}
|
||||||
|
ShortT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
|
||||||
|
void UnPackTo(ShortT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
|
||||||
|
static flatbuffers::Offset<Short> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ShortT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ShortBuilder {
|
||||||
|
typedef Short Table;
|
||||||
|
flatbuffers::FlatBufferBuilder &fbb_;
|
||||||
|
flatbuffers::uoffset_t start_;
|
||||||
|
void add_scalar(int16_t scalar) {
|
||||||
|
fbb_.AddElement<int16_t>(Short::VT_SCALAR, scalar, 0);
|
||||||
|
}
|
||||||
|
explicit ShortBuilder(flatbuffers::FlatBufferBuilder &_fbb)
|
||||||
|
: fbb_(_fbb) {
|
||||||
|
start_ = fbb_.StartTable();
|
||||||
|
}
|
||||||
|
flatbuffers::Offset<Short> Finish() {
|
||||||
|
const auto end = fbb_.EndTable(start_);
|
||||||
|
auto o = flatbuffers::Offset<Short>(end);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline flatbuffers::Offset<Short> CreateShort(
|
||||||
|
flatbuffers::FlatBufferBuilder &_fbb,
|
||||||
|
int16_t scalar = 0) {
|
||||||
|
ShortBuilder builder_(_fbb);
|
||||||
|
builder_.add_scalar(scalar);
|
||||||
|
return builder_.Finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Short::Traits {
|
||||||
|
using type = Short;
|
||||||
|
static auto constexpr Create = CreateShort;
|
||||||
|
};
|
||||||
|
|
||||||
|
flatbuffers::Offset<Short> CreateShort(flatbuffers::FlatBufferBuilder &_fbb, const ShortT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
||||||
|
|
||||||
struct IntT : public flatbuffers::NativeTable {
|
struct IntT : public flatbuffers::NativeTable {
|
||||||
typedef Int TableType;
|
typedef Int TableType;
|
||||||
uint64_t scalar = 0;
|
uint64_t scalar = 0;
|
||||||
|
@ -2463,6 +2540,32 @@ inline flatbuffers::Offset<ItemNumber> CreateItemNumber(flatbuffers::FlatBufferB
|
||||||
_num);
|
_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline ShortT *Short::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
|
||||||
|
auto _o = std::make_unique<ShortT>();
|
||||||
|
UnPackTo(_o.get(), _resolver);
|
||||||
|
return _o.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Short::UnPackTo(ShortT *_o, const flatbuffers::resolver_function_t *_resolver) const {
|
||||||
|
(void)_o;
|
||||||
|
(void)_resolver;
|
||||||
|
{ auto _e = scalar(); _o->scalar = _e; }
|
||||||
|
}
|
||||||
|
|
||||||
|
inline flatbuffers::Offset<Short> Short::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ShortT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
|
||||||
|
return CreateShort(_fbb, _o, _rehasher);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline flatbuffers::Offset<Short> CreateShort(flatbuffers::FlatBufferBuilder &_fbb, const ShortT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
|
||||||
|
(void)_rehasher;
|
||||||
|
(void)_o;
|
||||||
|
struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ShortT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
|
||||||
|
auto _scalar = _o->scalar;
|
||||||
|
return TEN::Save::CreateShort(
|
||||||
|
_fbb,
|
||||||
|
_scalar);
|
||||||
|
}
|
||||||
|
|
||||||
inline IntT *Int::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
|
inline IntT *Int::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
|
||||||
auto _o = std::make_unique<IntT>();
|
auto _o = std::make_unique<IntT>();
|
||||||
UnPackTo(_o.get(), _resolver);
|
UnPackTo(_o.get(), _resolver);
|
||||||
|
@ -2550,6 +2653,10 @@ inline bool VerifyItemData(flatbuffers::Verifier &verifier, const void *obj, Ite
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::Int *>(obj);
|
auto ptr = reinterpret_cast<const TEN::Save::Int *>(obj);
|
||||||
return verifier.VerifyTable(ptr);
|
return verifier.VerifyTable(ptr);
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
auto ptr = reinterpret_cast<const TEN::Save::Short *>(obj);
|
||||||
|
return verifier.VerifyTable(ptr);
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::Float *>(obj);
|
auto ptr = reinterpret_cast<const TEN::Save::Float *>(obj);
|
||||||
return verifier.VerifyTable(ptr);
|
return verifier.VerifyTable(ptr);
|
||||||
|
@ -2652,6 +2759,10 @@ inline void *ItemDataUnion::UnPack(const void *obj, ItemData type, const flatbuf
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::Int *>(obj);
|
auto ptr = reinterpret_cast<const TEN::Save::Int *>(obj);
|
||||||
return ptr->UnPack(resolver);
|
return ptr->UnPack(resolver);
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
auto ptr = reinterpret_cast<const TEN::Save::Short *>(obj);
|
||||||
|
return ptr->UnPack(resolver);
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::Float *>(obj);
|
auto ptr = reinterpret_cast<const TEN::Save::Float *>(obj);
|
||||||
return ptr->UnPack(resolver);
|
return ptr->UnPack(resolver);
|
||||||
|
@ -2742,6 +2853,10 @@ inline flatbuffers::Offset<void> ItemDataUnion::Pack(flatbuffers::FlatBufferBuil
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::IntT *>(value);
|
auto ptr = reinterpret_cast<const TEN::Save::IntT *>(value);
|
||||||
return CreateInt(_fbb, ptr, _rehasher).Union();
|
return CreateInt(_fbb, ptr, _rehasher).Union();
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
auto ptr = reinterpret_cast<const TEN::Save::ShortT *>(value);
|
||||||
|
return CreateShort(_fbb, ptr, _rehasher).Union();
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
auto ptr = reinterpret_cast<const TEN::Save::FloatT *>(value);
|
auto ptr = reinterpret_cast<const TEN::Save::FloatT *>(value);
|
||||||
return CreateFloat(_fbb, ptr, _rehasher).Union();
|
return CreateFloat(_fbb, ptr, _rehasher).Union();
|
||||||
|
@ -2832,6 +2947,10 @@ inline ItemDataUnion::ItemDataUnion(const ItemDataUnion &u) : type(u.type), valu
|
||||||
value = new TEN::Save::IntT(*reinterpret_cast<TEN::Save::IntT *>(u.value));
|
value = new TEN::Save::IntT(*reinterpret_cast<TEN::Save::IntT *>(u.value));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
value = new TEN::Save::ShortT(*reinterpret_cast<TEN::Save::ShortT *>(u.value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
value = new TEN::Save::FloatT(*reinterpret_cast<TEN::Save::FloatT *>(u.value));
|
value = new TEN::Save::FloatT(*reinterpret_cast<TEN::Save::FloatT *>(u.value));
|
||||||
break;
|
break;
|
||||||
|
@ -2924,6 +3043,11 @@ inline void ItemDataUnion::Reset() {
|
||||||
delete ptr;
|
delete ptr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ItemData::Short: {
|
||||||
|
auto ptr = reinterpret_cast<TEN::Save::ShortT *>(value);
|
||||||
|
delete ptr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ItemData::Float: {
|
case ItemData::Float: {
|
||||||
auto ptr = reinterpret_cast<TEN::Save::FloatT *>(value);
|
auto ptr = reinterpret_cast<TEN::Save::FloatT *>(value);
|
||||||
delete ptr;
|
delete ptr;
|
||||||
|
|
|
@ -313,6 +313,9 @@ struct Item FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
||||||
const TEN::Save::Int *data_as_Int() const {
|
const TEN::Save::Int *data_as_Int() const {
|
||||||
return data_type() == TEN::Save::ItemData::Int ? static_cast<const TEN::Save::Int *>(data()) : nullptr;
|
return data_type() == TEN::Save::ItemData::Int ? static_cast<const TEN::Save::Int *>(data()) : nullptr;
|
||||||
}
|
}
|
||||||
|
const TEN::Save::Short *data_as_Short() const {
|
||||||
|
return data_type() == TEN::Save::ItemData::Short ? static_cast<const TEN::Save::Short *>(data()) : nullptr;
|
||||||
|
}
|
||||||
const TEN::Save::Float *data_as_Float() const {
|
const TEN::Save::Float *data_as_Float() const {
|
||||||
return data_type() == TEN::Save::ItemData::Float ? static_cast<const TEN::Save::Float *>(data()) : nullptr;
|
return data_type() == TEN::Save::ItemData::Float ? static_cast<const TEN::Save::Float *>(data()) : nullptr;
|
||||||
}
|
}
|
||||||
|
@ -423,6 +426,10 @@ template<> inline const TEN::Save::Int *Item::data_as<TEN::Save::Int>() const {
|
||||||
return data_as_Int();
|
return data_as_Int();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<> inline const TEN::Save::Short *Item::data_as<TEN::Save::Short>() const {
|
||||||
|
return data_as_Short();
|
||||||
|
}
|
||||||
|
|
||||||
template<> inline const TEN::Save::Float *Item::data_as<TEN::Save::Float>() const {
|
template<> inline const TEN::Save::Float *Item::data_as<TEN::Save::Float>() const {
|
||||||
return data_as_Float();
|
return data_as_Float();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue