diff --git a/TombEngine/Game/savegame.cpp b/TombEngine/Game/savegame.cpp index 880da8c05..a58985c66 100644 --- a/TombEngine/Game/savegame.cpp +++ b/TombEngine/Game/savegame.cpp @@ -614,7 +614,6 @@ bool SaveGame::Save(int slot) } Save::ItemBuilder serializedItem{ fbb }; - serializedItem.add_next_item(itemToSerialize.NextItem); serializedItem.add_next_item_active(itemToSerialize.NextActive); serializedItem.add_anim_number(itemToSerialize.Animation.AnimNumber - obj->animIndex); @@ -622,7 +621,6 @@ bool SaveGame::Save(int slot) serializedItem.add_box_number(itemToSerialize.BoxNumber); serializedItem.add_carried_item(itemToSerialize.CarriedItem); serializedItem.add_active_state(itemToSerialize.Animation.ActiveState); - serializedItem.add_vertical_velocity(itemToSerialize.Animation.Velocity.y); serializedItem.add_flags(itemToSerialize.Flags); serializedItem.add_floor(itemToSerialize.Floor); serializedItem.add_frame_number(itemToSerialize.Animation.FrameNumber); @@ -634,7 +632,7 @@ bool SaveGame::Save(int slot) serializedItem.add_pose(&FromPHD(itemToSerialize.Pose)); serializedItem.add_required_state(itemToSerialize.Animation.RequiredState); serializedItem.add_room_number(itemToSerialize.RoomNumber); - serializedItem.add_velocity(itemToSerialize.Animation.Velocity.z); + serializedItem.add_velocity(&FromVector3(itemToSerialize.Animation.Velocity)); serializedItem.add_timer(itemToSerialize.Timer); serializedItem.add_color(&FromVector4(itemToSerialize.Color)); serializedItem.add_touch_bits(itemToSerialize.TouchBits); @@ -1331,8 +1329,7 @@ bool SaveGame::Load(int slot) item->Pose = ToPHD(savedItem->pose()); item->RoomNumber = savedItem->room_number(); - item->Animation.Velocity.z = savedItem->velocity(); - item->Animation.Velocity.y = savedItem->vertical_velocity(); + item->Animation.Velocity = ToVector3(savedItem->velocity()); if (item->ObjectNumber == ID_LARA && !dynamicItem) { diff --git a/TombEngine/Specific/savegame/flatbuffers/ten_savegame_generated.h b/TombEngine/Specific/savegame/flatbuffers/ten_savegame_generated.h index f3e28472e..a3ce470cc 100644 --- a/TombEngine/Specific/savegame/flatbuffers/ten_savegame_generated.h +++ b/TombEngine/Specific/savegame/flatbuffers/ten_savegame_generated.h @@ -381,18 +381,18 @@ struct KeyValPair::Traits { struct ItemT : public flatbuffers::NativeTable { typedef Item TableType; + int32_t active_state = 0; + int32_t anim_number = 0; + int32_t frame_number = 0; + bool is_airborne = false; + int32_t required_state = 0; + int32_t target_state = 0; + std::unique_ptr velocity{}; int32_t floor = 0; int32_t touch_bits = 0; int32_t mesh_bits = 0; int32_t object_id = 0; - int32_t active_state = 0; - int32_t target_state = 0; - int32_t required_state = 0; - int32_t anim_number = 0; - int32_t frame_number = 0; int32_t room_number = 0; - int32_t velocity = 0; - int32_t vertical_velocity = 0; int32_t hit_points = 0; int32_t box_number = 0; int32_t timer = 0; @@ -408,7 +408,6 @@ struct ItemT : public flatbuffers::NativeTable { bool triggered = false; bool active = false; int32_t status = 0; - bool is_airborne = false; bool hit_stauts = false; bool collidable = false; bool looked_at = false; @@ -427,18 +426,18 @@ struct Item FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ItemBuilder Builder; struct Traits; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FLOOR = 4, - VT_TOUCH_BITS = 6, - VT_MESH_BITS = 8, - VT_OBJECT_ID = 10, - VT_ACTIVE_STATE = 12, + VT_ACTIVE_STATE = 4, + VT_ANIM_NUMBER = 6, + VT_FRAME_NUMBER = 8, + VT_IS_AIRBORNE = 10, + VT_REQUIRED_STATE = 12, VT_TARGET_STATE = 14, - VT_REQUIRED_STATE = 16, - VT_ANIM_NUMBER = 18, - VT_FRAME_NUMBER = 20, - VT_ROOM_NUMBER = 22, - VT_VELOCITY = 24, - VT_VERTICAL_VELOCITY = 26, + VT_VELOCITY = 16, + VT_FLOOR = 18, + VT_TOUCH_BITS = 20, + VT_MESH_BITS = 22, + VT_OBJECT_ID = 24, + VT_ROOM_NUMBER = 26, VT_HIT_POINTS = 28, VT_BOX_NUMBER = 30, VT_TIMER = 32, @@ -454,20 +453,40 @@ struct Item FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_TRIGGERED = 52, VT_ACTIVE = 54, VT_STATUS = 56, - VT_IS_AIRBORNE = 58, - VT_HIT_STAUTS = 60, - VT_COLLIDABLE = 62, - VT_LOOKED_AT = 64, - VT_AI_BITS = 66, - VT_SWAP_MESH_FLAGS = 68, - VT_DATA_TYPE = 70, - VT_DATA = 72, - VT_LUA_NAME = 74, - VT_LUA_ON_KILLED_NAME = 76, - VT_LUA_ON_HIT_NAME = 78, - VT_LUA_ON_COLLIDED_WITH_OBJECT_NAME = 80, - VT_LUA_ON_COLLIDED_WITH_ROOM_NAME = 82 + VT_HIT_STAUTS = 58, + VT_COLLIDABLE = 60, + VT_LOOKED_AT = 62, + VT_AI_BITS = 64, + VT_SWAP_MESH_FLAGS = 66, + VT_DATA_TYPE = 68, + VT_DATA = 70, + VT_LUA_NAME = 72, + VT_LUA_ON_KILLED_NAME = 74, + VT_LUA_ON_HIT_NAME = 76, + VT_LUA_ON_COLLIDED_WITH_OBJECT_NAME = 78, + VT_LUA_ON_COLLIDED_WITH_ROOM_NAME = 80 }; + int32_t active_state() const { + return GetField(VT_ACTIVE_STATE, 0); + } + int32_t anim_number() const { + return GetField(VT_ANIM_NUMBER, 0); + } + int32_t frame_number() const { + return GetField(VT_FRAME_NUMBER, 0); + } + bool is_airborne() const { + return GetField(VT_IS_AIRBORNE, 0) != 0; + } + int32_t required_state() const { + return GetField(VT_REQUIRED_STATE, 0); + } + int32_t target_state() const { + return GetField(VT_TARGET_STATE, 0); + } + const TEN::Save::Vector3 *velocity() const { + return GetStruct(VT_VELOCITY); + } int32_t floor() const { return GetField(VT_FLOOR, 0); } @@ -480,30 +499,9 @@ struct Item FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { int32_t object_id() const { return GetField(VT_OBJECT_ID, 0); } - int32_t active_state() const { - return GetField(VT_ACTIVE_STATE, 0); - } - int32_t target_state() const { - return GetField(VT_TARGET_STATE, 0); - } - int32_t required_state() const { - return GetField(VT_REQUIRED_STATE, 0); - } - int32_t anim_number() const { - return GetField(VT_ANIM_NUMBER, 0); - } - int32_t frame_number() const { - return GetField(VT_FRAME_NUMBER, 0); - } int32_t room_number() const { return GetField(VT_ROOM_NUMBER, 0); } - int32_t velocity() const { - return GetField(VT_VELOCITY, 0); - } - int32_t vertical_velocity() const { - return GetField(VT_VERTICAL_VELOCITY, 0); - } int32_t hit_points() const { return GetField(VT_HIT_POINTS, 0); } @@ -549,9 +547,6 @@ struct Item FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { int32_t status() const { return GetField(VT_STATUS, 0); } - bool is_airborne() const { - return GetField(VT_IS_AIRBORNE, 0) != 0; - } bool hit_stauts() const { return GetField(VT_HIT_STAUTS, 0) != 0; } @@ -657,18 +652,18 @@ struct Item FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ACTIVE_STATE) && + VerifyField(verifier, VT_ANIM_NUMBER) && + VerifyField(verifier, VT_FRAME_NUMBER) && + VerifyField(verifier, VT_IS_AIRBORNE) && + VerifyField(verifier, VT_REQUIRED_STATE) && + VerifyField(verifier, VT_TARGET_STATE) && + VerifyField(verifier, VT_VELOCITY) && VerifyField(verifier, VT_FLOOR) && VerifyField(verifier, VT_TOUCH_BITS) && VerifyField(verifier, VT_MESH_BITS) && VerifyField(verifier, VT_OBJECT_ID) && - VerifyField(verifier, VT_ACTIVE_STATE) && - VerifyField(verifier, VT_TARGET_STATE) && - VerifyField(verifier, VT_REQUIRED_STATE) && - VerifyField(verifier, VT_ANIM_NUMBER) && - VerifyField(verifier, VT_FRAME_NUMBER) && VerifyField(verifier, VT_ROOM_NUMBER) && - VerifyField(verifier, VT_VELOCITY) && - VerifyField(verifier, VT_VERTICAL_VELOCITY) && VerifyField(verifier, VT_HIT_POINTS) && VerifyField(verifier, VT_BOX_NUMBER) && VerifyField(verifier, VT_TIMER) && @@ -685,7 +680,6 @@ struct Item FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VerifyField(verifier, VT_TRIGGERED) && VerifyField(verifier, VT_ACTIVE) && VerifyField(verifier, VT_STATUS) && - VerifyField(verifier, VT_IS_AIRBORNE) && VerifyField(verifier, VT_HIT_STAUTS) && VerifyField(verifier, VT_COLLIDABLE) && VerifyField(verifier, VT_LOOKED_AT) && @@ -803,6 +797,27 @@ struct ItemBuilder { typedef Item Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; + void add_active_state(int32_t active_state) { + fbb_.AddElement(Item::VT_ACTIVE_STATE, active_state, 0); + } + void add_anim_number(int32_t anim_number) { + fbb_.AddElement(Item::VT_ANIM_NUMBER, anim_number, 0); + } + void add_frame_number(int32_t frame_number) { + fbb_.AddElement(Item::VT_FRAME_NUMBER, frame_number, 0); + } + void add_is_airborne(bool is_airborne) { + fbb_.AddElement(Item::VT_IS_AIRBORNE, static_cast(is_airborne), 0); + } + void add_required_state(int32_t required_state) { + fbb_.AddElement(Item::VT_REQUIRED_STATE, required_state, 0); + } + void add_target_state(int32_t target_state) { + fbb_.AddElement(Item::VT_TARGET_STATE, target_state, 0); + } + void add_velocity(const TEN::Save::Vector3 *velocity) { + fbb_.AddStruct(Item::VT_VELOCITY, velocity); + } void add_floor(int32_t floor) { fbb_.AddElement(Item::VT_FLOOR, floor, 0); } @@ -815,30 +830,9 @@ struct ItemBuilder { void add_object_id(int32_t object_id) { fbb_.AddElement(Item::VT_OBJECT_ID, object_id, 0); } - void add_active_state(int32_t active_state) { - fbb_.AddElement(Item::VT_ACTIVE_STATE, active_state, 0); - } - void add_target_state(int32_t target_state) { - fbb_.AddElement(Item::VT_TARGET_STATE, target_state, 0); - } - void add_required_state(int32_t required_state) { - fbb_.AddElement(Item::VT_REQUIRED_STATE, required_state, 0); - } - void add_anim_number(int32_t anim_number) { - fbb_.AddElement(Item::VT_ANIM_NUMBER, anim_number, 0); - } - void add_frame_number(int32_t frame_number) { - fbb_.AddElement(Item::VT_FRAME_NUMBER, frame_number, 0); - } void add_room_number(int32_t room_number) { fbb_.AddElement(Item::VT_ROOM_NUMBER, room_number, 0); } - void add_velocity(int32_t velocity) { - fbb_.AddElement(Item::VT_VELOCITY, velocity, 0); - } - void add_vertical_velocity(int32_t vertical_velocity) { - fbb_.AddElement(Item::VT_VERTICAL_VELOCITY, vertical_velocity, 0); - } void add_hit_points(int32_t hit_points) { fbb_.AddElement(Item::VT_HIT_POINTS, hit_points, 0); } @@ -884,9 +878,6 @@ struct ItemBuilder { void add_status(int32_t status) { fbb_.AddElement(Item::VT_STATUS, status, 0); } - void add_is_airborne(bool is_airborne) { - fbb_.AddElement(Item::VT_IS_AIRBORNE, static_cast(is_airborne), 0); - } void add_hit_stauts(bool hit_stauts) { fbb_.AddElement(Item::VT_HIT_STAUTS, static_cast(hit_stauts), 0); } @@ -936,18 +927,18 @@ struct ItemBuilder { inline flatbuffers::Offset CreateItem( flatbuffers::FlatBufferBuilder &_fbb, + int32_t active_state = 0, + int32_t anim_number = 0, + int32_t frame_number = 0, + bool is_airborne = false, + int32_t required_state = 0, + int32_t target_state = 0, + const TEN::Save::Vector3 *velocity = 0, int32_t floor = 0, int32_t touch_bits = 0, int32_t mesh_bits = 0, int32_t object_id = 0, - int32_t active_state = 0, - int32_t target_state = 0, - int32_t required_state = 0, - int32_t anim_number = 0, - int32_t frame_number = 0, int32_t room_number = 0, - int32_t velocity = 0, - int32_t vertical_velocity = 0, int32_t hit_points = 0, int32_t box_number = 0, int32_t timer = 0, @@ -963,7 +954,6 @@ inline flatbuffers::Offset CreateItem( bool triggered = false, bool active = false, int32_t status = 0, - bool is_airborne = false, bool hit_stauts = false, bool collidable = false, bool looked_at = false, @@ -998,25 +988,24 @@ inline flatbuffers::Offset CreateItem( builder_.add_timer(timer); builder_.add_box_number(box_number); builder_.add_hit_points(hit_points); - builder_.add_vertical_velocity(vertical_velocity); - builder_.add_velocity(velocity); builder_.add_room_number(room_number); - builder_.add_frame_number(frame_number); - builder_.add_anim_number(anim_number); - builder_.add_required_state(required_state); - builder_.add_target_state(target_state); - builder_.add_active_state(active_state); builder_.add_object_id(object_id); builder_.add_mesh_bits(mesh_bits); builder_.add_touch_bits(touch_bits); builder_.add_floor(floor); + builder_.add_velocity(velocity); + builder_.add_target_state(target_state); + builder_.add_required_state(required_state); + builder_.add_frame_number(frame_number); + builder_.add_anim_number(anim_number); + builder_.add_active_state(active_state); builder_.add_data_type(data_type); builder_.add_looked_at(looked_at); builder_.add_collidable(collidable); builder_.add_hit_stauts(hit_stauts); - builder_.add_is_airborne(is_airborne); builder_.add_active(active); builder_.add_triggered(triggered); + builder_.add_is_airborne(is_airborne); return builder_.Finish(); } @@ -1027,18 +1016,18 @@ struct Item::Traits { inline flatbuffers::Offset CreateItemDirect( flatbuffers::FlatBufferBuilder &_fbb, + int32_t active_state = 0, + int32_t anim_number = 0, + int32_t frame_number = 0, + bool is_airborne = false, + int32_t required_state = 0, + int32_t target_state = 0, + const TEN::Save::Vector3 *velocity = 0, int32_t floor = 0, int32_t touch_bits = 0, int32_t mesh_bits = 0, int32_t object_id = 0, - int32_t active_state = 0, - int32_t target_state = 0, - int32_t required_state = 0, - int32_t anim_number = 0, - int32_t frame_number = 0, int32_t room_number = 0, - int32_t velocity = 0, - int32_t vertical_velocity = 0, int32_t hit_points = 0, int32_t box_number = 0, int32_t timer = 0, @@ -1054,7 +1043,6 @@ inline flatbuffers::Offset CreateItemDirect( bool triggered = false, bool active = false, int32_t status = 0, - bool is_airborne = false, bool hit_stauts = false, bool collidable = false, bool looked_at = false, @@ -1075,18 +1063,18 @@ inline flatbuffers::Offset CreateItemDirect( auto lua_on_collided_with_room_name__ = lua_on_collided_with_room_name ? _fbb.CreateString(lua_on_collided_with_room_name) : 0; return TEN::Save::CreateItem( _fbb, + active_state, + anim_number, + frame_number, + is_airborne, + required_state, + target_state, + velocity, floor, touch_bits, mesh_bits, object_id, - active_state, - target_state, - required_state, - anim_number, - frame_number, room_number, - velocity, - vertical_velocity, hit_points, box_number, timer, @@ -1102,7 +1090,6 @@ inline flatbuffers::Offset CreateItemDirect( triggered, active, status, - is_airborne, hit_stauts, collidable, looked_at, @@ -6413,18 +6400,18 @@ inline ItemT *Item::UnPack(const flatbuffers::resolver_function_t *_resolver) co inline void Item::UnPackTo(ItemT *_o, const flatbuffers::resolver_function_t *_resolver) const { (void)_o; (void)_resolver; + { auto _e = active_state(); _o->active_state = _e; } + { auto _e = anim_number(); _o->anim_number = _e; } + { auto _e = frame_number(); _o->frame_number = _e; } + { auto _e = is_airborne(); _o->is_airborne = _e; } + { auto _e = required_state(); _o->required_state = _e; } + { auto _e = target_state(); _o->target_state = _e; } + { auto _e = velocity(); if (_e) _o->velocity = std::unique_ptr(new TEN::Save::Vector3(*_e)); } { auto _e = floor(); _o->floor = _e; } { auto _e = touch_bits(); _o->touch_bits = _e; } { auto _e = mesh_bits(); _o->mesh_bits = _e; } { auto _e = object_id(); _o->object_id = _e; } - { auto _e = active_state(); _o->active_state = _e; } - { auto _e = target_state(); _o->target_state = _e; } - { auto _e = required_state(); _o->required_state = _e; } - { auto _e = anim_number(); _o->anim_number = _e; } - { auto _e = frame_number(); _o->frame_number = _e; } { auto _e = room_number(); _o->room_number = _e; } - { auto _e = velocity(); _o->velocity = _e; } - { auto _e = vertical_velocity(); _o->vertical_velocity = _e; } { auto _e = hit_points(); _o->hit_points = _e; } { auto _e = box_number(); _o->box_number = _e; } { auto _e = timer(); _o->timer = _e; } @@ -6440,7 +6427,6 @@ inline void Item::UnPackTo(ItemT *_o, const flatbuffers::resolver_function_t *_r { auto _e = triggered(); _o->triggered = _e; } { auto _e = active(); _o->active = _e; } { auto _e = status(); _o->status = _e; } - { auto _e = is_airborne(); _o->is_airborne = _e; } { auto _e = hit_stauts(); _o->hit_stauts = _e; } { auto _e = collidable(); _o->collidable = _e; } { auto _e = looked_at(); _o->looked_at = _e; } @@ -6463,18 +6449,18 @@ inline flatbuffers::Offset CreateItem(flatbuffers::FlatBufferBuilder &_fbb (void)_rehasher; (void)_o; struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ItemT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; + auto _active_state = _o->active_state; + auto _anim_number = _o->anim_number; + auto _frame_number = _o->frame_number; + auto _is_airborne = _o->is_airborne; + auto _required_state = _o->required_state; + auto _target_state = _o->target_state; + auto _velocity = _o->velocity ? _o->velocity.get() : 0; auto _floor = _o->floor; auto _touch_bits = _o->touch_bits; auto _mesh_bits = _o->mesh_bits; auto _object_id = _o->object_id; - auto _active_state = _o->active_state; - auto _target_state = _o->target_state; - auto _required_state = _o->required_state; - auto _anim_number = _o->anim_number; - auto _frame_number = _o->frame_number; auto _room_number = _o->room_number; - auto _velocity = _o->velocity; - auto _vertical_velocity = _o->vertical_velocity; auto _hit_points = _o->hit_points; auto _box_number = _o->box_number; auto _timer = _o->timer; @@ -6490,7 +6476,6 @@ inline flatbuffers::Offset CreateItem(flatbuffers::FlatBufferBuilder &_fbb auto _triggered = _o->triggered; auto _active = _o->active; auto _status = _o->status; - auto _is_airborne = _o->is_airborne; auto _hit_stauts = _o->hit_stauts; auto _collidable = _o->collidable; auto _looked_at = _o->looked_at; @@ -6505,18 +6490,18 @@ inline flatbuffers::Offset CreateItem(flatbuffers::FlatBufferBuilder &_fbb auto _lua_on_collided_with_room_name = _o->lua_on_collided_with_room_name.empty() ? _fbb.CreateSharedString("") : _fbb.CreateString(_o->lua_on_collided_with_room_name); return TEN::Save::CreateItem( _fbb, + _active_state, + _anim_number, + _frame_number, + _is_airborne, + _required_state, + _target_state, + _velocity, _floor, _touch_bits, _mesh_bits, _object_id, - _active_state, - _target_state, - _required_state, - _anim_number, - _frame_number, _room_number, - _velocity, - _vertical_velocity, _hit_points, _box_number, _timer, @@ -6532,7 +6517,6 @@ inline flatbuffers::Offset CreateItem(flatbuffers::FlatBufferBuilder &_fbb _triggered, _active, _status, - _is_airborne, _hit_stauts, _collidable, _looked_at, diff --git a/TombEngine/Specific/savegame/schema/ten_savegame.fbs b/TombEngine/Specific/savegame/schema/ten_savegame.fbs index 83b475dd7..2e1d13b31 100644 --- a/TombEngine/Specific/savegame/schema/ten_savegame.fbs +++ b/TombEngine/Specific/savegame/schema/ten_savegame.fbs @@ -1,45 +1,46 @@ include "ten_itemdata.fbs"; namespace TEN.Save; + struct RoomVector { - room: uint32; - y_location: uint32; + room: uint32; + y_location: uint32; } table Item { - floor: int; - touch_bits: int32; - mesh_bits: int32; - object_id: int32; - active_state: int32; - target_state: int32; - required_state: int32; - anim_number: int32; - frame_number: int32; - room_number: int32; - velocity: int32; - vertical_velocity: int32; - hit_points: int32; - box_number: int32; - timer: int32; + active_state: int32; + anim_number: int32; + frame_number: int32; + is_airborne: bool; + required_state: int32; + target_state: int32; + velocity: Vector3; + + floor: int; + touch_bits: int32; + mesh_bits: int32; + object_id: int32; + room_number: int32; + hit_points: int32; + box_number: int32; + timer: int32; color: Vector4; - flags: int32; - trigger_flags: int32; - carried_item: int32; - after_death: int32; - item_flags: [int32]; + flags: int32; + trigger_flags: int32; + carried_item: int32; + after_death: int32; + item_flags: [int32]; pose: Position; next_item: int32; next_item_active: int32; triggered: bool; active: bool; status: int32; - is_airborne: bool; hit_stauts: bool; collidable: bool; looked_at: bool; ai_bits: int32; swap_mesh_flags: int32; - data: TEN.Save.ItemData; + data: TEN.Save.ItemData; lua_name: string; lua_on_killed_name: string; lua_on_hit_name: string; @@ -459,4 +460,4 @@ table SaveGame { script_vars: UnionVec; } -root_type TEN.Save.SaveGame; \ No newline at end of file +root_type TEN.Save.SaveGame;