diff --git a/engines/ags/engine/ac/dynobj/script_object.h b/engines/ags/engine/ac/dynobj/script_object.h index c9583fadd004..761e474257a3 100644 --- a/engines/ags/engine/ac/dynobj/script_object.h +++ b/engines/ags/engine/ac/dynobj/script_object.h @@ -26,10 +26,9 @@ namespace AGS3 { -// 64 bit: Struct size must be 8 byte for scripts to work +// WARNING: struct size must be 8 byte for old scripts to work struct ScriptObject { - int id = 0; - //RoomObject *obj; + int id = -1; int __padding = 0; }; diff --git a/engines/ags/engine/ac/room.cpp b/engines/ags/engine/ac/room.cpp index 8dd038c14e55..f4c088e4ed18 100644 --- a/engines/ags/engine/ac/room.cpp +++ b/engines/ags/engine/ac/room.cpp @@ -314,11 +314,11 @@ void convert_room_coordinates_to_data_res(RoomStruct *rstruc) { return; const int mul = _GP(game).GetDataUpscaleMult(); - for (size_t i = 0; i < rstruc->ObjectCount; ++i) { - rstruc->Objects[i].X /= mul; - rstruc->Objects[i].Y /= mul; - if (rstruc->Objects[i].Baseline > 0) { - rstruc->Objects[i].Baseline /= mul; + for (auto &obj : rstruc->Objects) { + obj.X /= mul; + obj.Y /= mul; + if (obj.Baseline > 0) { + obj.Baseline /= mul; } } @@ -405,8 +405,6 @@ HError LoadRoomScript(RoomStruct *room, int newnum) { } static void reset_temp_room() { - _GP(troom).FreeScriptData(); - _GP(troom).FreeProperties(); _GP(troom) = RoomStatus(); } @@ -537,7 +535,7 @@ void load_new_room(int newnum, CharacterInfo *forchar) { _GP(thisroom).Interaction->CopyTimesRun(_G(croom)->intrRoom); for (cc = 0; cc < MAX_ROOM_HOTSPOTS; cc++) _GP(thisroom).Hotspots[cc].Interaction->CopyTimesRun(_G(croom)->intrHotspot[cc]); - for (cc = 0; cc < MAX_ROOM_OBJECTS; cc++) + for (cc = 0; cc < _GP(thisroom).Objects.size(); cc++) _GP(thisroom).Objects[cc].Interaction->CopyTimesRun(_G(croom)->intrObject[cc]); for (cc = 0; cc < MAX_ROOM_REGIONS; cc++) _GP(thisroom).Regions[cc].Interaction->CopyTimesRun(_G(croom)->intrRegion[cc]); @@ -547,39 +545,44 @@ void load_new_room(int newnum, CharacterInfo *forchar) { // Always copy object and hotspot names for < 3.6.0 games, because they were not settable if (_G(loaded_game_file_version) < kGameVersion_360_16) { - for (cc = 0; cc < _G(croom)->numobj; ++cc) + for (cc = 0; cc < _GP(thisroom).Objects.size(); ++cc) _G(croom)->obj[cc].name = _GP(thisroom).Objects[cc].Name; for (cc = 0; cc < MAX_ROOM_HOTSPOTS; cc++) _G(croom)->hotspot[cc].Name = _GP(thisroom).Hotspots[cc].Name; } } else { // If we have not been in this room before, then copy necessary fields from _GP(thisroom) - _G(croom)->numobj = _GP(thisroom).ObjectCount; + _G(croom)->numobj = _GP(thisroom).Objects.size(); _G(croom)->tsdatasize = 0; + _G(croom)->obj.resize(_G(croom)->numobj); + _G(croom)->objProps.resize(_G(croom)->numobj); + _G(croom)->intrObject.resize(_G(croom)->numobj); for (cc = 0; cc < _G(croom)->numobj; cc++) { - _G(croom)->obj[cc].x = _GP(thisroom).Objects[cc].X; - _G(croom)->obj[cc].y = _GP(thisroom).Objects[cc].Y; - _G(croom)->obj[cc].num = Math::InRangeOrDef(_GP(thisroom).Objects[cc].Sprite, 0); - _G(croom)->obj[cc].on = _GP(thisroom).Objects[cc].IsOn; - _G(croom)->obj[cc].view = RoomObject::NoView; - _G(croom)->obj[cc].loop = 0; - _G(croom)->obj[cc].frame = 0; - _G(croom)->obj[cc].wait = 0; - _G(croom)->obj[cc].transparent = 0; - _G(croom)->obj[cc].moving = -1; - _G(croom)->obj[cc].flags = _GP(thisroom).Objects[cc].Flags; - _G(croom)->obj[cc].baseline = -1; - _G(croom)->obj[cc].zoom = 100; - _G(croom)->obj[cc].last_width = 0; - _G(croom)->obj[cc].last_height = 0; - _G(croom)->obj[cc].blocking_width = 0; - _G(croom)->obj[cc].blocking_height = 0; - _G(croom)->obj[cc].name = _GP(thisroom).Objects[cc].Name; - if (_GP(thisroom).Objects[cc].Baseline >= 0) - _G(croom)->obj[cc].baseline = _GP(thisroom).Objects[cc].Baseline; - if (_GP(thisroom).Objects[cc].Sprite > UINT16_MAX) + const auto &trobj = _GP(thisroom).Objects[cc]; + auto &crobj = _G(croom)->obj[cc]; + crobj.x = trobj.X; + crobj.y = trobj.Y; + crobj.num = Math::InRangeOrDef(trobj.Sprite, 0); + crobj.on = trobj.IsOn; + crobj.view = RoomObject::NoView; + crobj.loop = 0; + crobj.frame = 0; + crobj.wait = 0; + crobj.transparent = 0; + crobj.moving = -1; + crobj.flags = trobj.Flags; + crobj.baseline = -1; + crobj.zoom = 100; + crobj.last_width = 0; + crobj.last_height = 0; + crobj.blocking_width = 0; + crobj.blocking_height = 0; + crobj.name = trobj.Name; + if (trobj.Baseline >= 0) + crobj.baseline = trobj.Baseline; + if (trobj.Sprite > UINT16_MAX) debug_script_warn("Warning: object's (id %d) sprite %d outside of internal range (%d), reset to 0", - cc, _GP(thisroom).Objects[cc].Sprite, UINT16_MAX); + cc, trobj.Sprite, UINT16_MAX); } for (size_t i = 0; i < (size_t)MAX_WALK_BEHINDS; ++i) _G(croom)->walkbehind_base[i] = _GP(thisroom).WalkBehinds[i].Baseline; @@ -614,13 +617,13 @@ void load_new_room(int newnum, CharacterInfo *forchar) { _G(croom)->intrRoom = *_GP(thisroom).Interaction; for (cc = 0; cc < MAX_ROOM_HOTSPOTS; cc++) _G(croom)->intrHotspot[cc] = *_GP(thisroom).Hotspots[cc].Interaction; - for (cc = 0; cc < MAX_ROOM_OBJECTS; cc++) + for (cc = 0; cc < _GP(thisroom).Objects.size(); cc++) _G(croom)->intrObject[cc] = *_GP(thisroom).Objects[cc].Interaction; for (cc = 0; cc < MAX_ROOM_REGIONS; cc++) _G(croom)->intrRegion[cc] = *_GP(thisroom).Regions[cc].Interaction; } - _G(objs) = &_G(croom)->obj[0]; + _G(objs) = _G(croom)->obj.size() > 0 ? &_G(croom)->obj[0] : nullptr; for (cc = 0; cc < _G(croom)->numobj; cc++) { // export the object's script object diff --git a/engines/ags/engine/ac/room_status.cpp b/engines/ags/engine/ac/room_status.cpp index b1625f0bae9a..c424544a9834 100644 --- a/engines/ags/engine/ac/room_status.cpp +++ b/engines/ags/engine/ac/room_status.cpp @@ -73,23 +73,28 @@ void RoomStatus::FreeProperties() { for (int i = 0; i < MAX_ROOM_HOTSPOTS; ++i) { hsProps[i].clear(); } - for (int i = 0; i < MAX_ROOM_OBJECTS; ++i) { - objProps[i].clear(); - } + objProps.clear(); } void RoomStatus::ReadFromFile_v321(Stream *in) { + FreeScriptData(); + FreeProperties(); + beenhere = in->ReadInt32(); numobj = in->ReadInt32(); + obj.resize(numobj); + objProps.resize(numobj); + intrObject.resize(numobj); ReadRoomObjects_Aligned(in); + in->Seek(MAX_LEGACY_ROOM_FLAGS * sizeof(int16_t)); // flagstates (OBSOLETE) tsdatasize = in->ReadInt32(); in->ReadInt32(); // tsdata for (int i = 0; i < MAX_ROOM_HOTSPOTS; ++i) { intrHotspot[i].ReadFromSavedgame_v321(in); } - for (int i = 0; i < MAX_ROOM_OBJECTS; ++i) { - intrObject[i].ReadFromSavedgame_v321(in); + for (auto &intr : intrObject) { + intr.ReadFromSavedgame_v321(in); } for (int i = 0; i < MAX_ROOM_REGIONS; ++i) { intrRegion[i].ReadFromSavedgame_v321(in); @@ -106,16 +111,16 @@ void RoomStatus::ReadFromFile_v321(Stream *in) { for (int i = 0; i < MAX_ROOM_HOTSPOTS; ++i) { Properties::ReadValues(hsProps[i], in); } - for (int i = 0; i < MAX_ROOM_OBJECTS; ++i) { - Properties::ReadValues(objProps[i], in); + for (auto &props : objProps) { + Properties::ReadValues(props, in); } } } void RoomStatus::ReadRoomObjects_Aligned(Shared::Stream *in) { AlignedStream align_s(in, Shared::kAligned_Read); - for (int i = 0; i < MAX_ROOM_OBJECTS; ++i) { - obj[i].ReadFromSavegame(&align_s, 0); + for (auto &o : obj) { + o.ReadFromSavegame(&align_s, 0); align_s.Reset(); } } @@ -126,7 +131,10 @@ void RoomStatus::ReadFromSavegame(Stream *in, int save_ver) { beenhere = in->ReadInt8(); numobj = in->ReadInt32(); - for (int i = 0; i < numobj; ++i) { + obj.resize(numobj); + objProps.resize(numobj); + intrObject.resize(numobj); + for (size_t i = 0; i < numobj; ++i) { obj[i].ReadFromSavegame(in, save_ver); Properties::ReadValues(objProps[i], in); if (_G(loaded_game_file_version) <= kGameVersion_272) @@ -163,7 +171,7 @@ void RoomStatus::ReadFromSavegame(Stream *in, int save_ver) { void RoomStatus::WriteToSavegame(Stream *out) const { out->WriteInt8(beenhere); out->WriteInt32(numobj); - for (int i = 0; i < numobj; ++i) { + for (size_t i = 0; i < numobj; ++i) { obj[i].WriteToSavegame(out); Properties::WriteValues(objProps[i], out); if (_G(loaded_game_file_version) <= kGameVersion_272) diff --git a/engines/ags/engine/ac/room_status.h b/engines/ags/engine/ac/room_status.h index ee8d2e79f14c..bf17316e3369 100644 --- a/engines/ags/engine/ac/room_status.h +++ b/engines/ags/engine/ac/room_status.h @@ -52,17 +52,17 @@ struct HotspotState { struct RoomStatus { int beenhere = 0; int numobj = 0; - RoomObject obj[MAX_ROOM_OBJECTS]; + std::vector obj; int tsdatasize = 0; char *tsdata = nullptr; Interaction intrHotspot[MAX_ROOM_HOTSPOTS]; - Interaction intrObject[MAX_ROOM_OBJECTS]; + std::vector intrObject; Interaction intrRegion[MAX_ROOM_REGIONS]; Interaction intrRoom; Shared::StringIMap roomProps; Shared::StringIMap hsProps[MAX_ROOM_HOTSPOTS]; - Shared::StringIMap objProps[MAX_ROOM_OBJECTS]; + std::vector objProps; HotspotState hotspot[MAX_ROOM_HOTSPOTS]; int8 region_enabled[MAX_ROOM_REGIONS]; short walkbehind_base[MAX_WALK_BEHINDS]; diff --git a/engines/ags/engine/game/savegame.cpp b/engines/ags/engine/game/savegame.cpp index 3f2c81cc6438..63c69626c349 100644 --- a/engines/ags/engine/game/savegame.cpp +++ b/engines/ags/engine/game/savegame.cpp @@ -374,8 +374,7 @@ void DoBeforeRestore(PreservedParams &pp) { _G(dialogScriptsInst) = nullptr; resetRoomStatuses(); - _GP(troom).FreeScriptData(); - _GP(troom).FreeProperties(); + _GP(troom) = RoomStatus(); // reset temp room state free_do_once_tokens(); // unregister gui controls from API exports diff --git a/engines/ags/engine/game/savegame_components.cpp b/engines/ags/engine/game/savegame_components.cpp index 4bc8a5ae0739..277cf1adf3c4 100644 --- a/engines/ags/engine/game/savegame_components.cpp +++ b/engines/ags/engine/game/savegame_components.cpp @@ -917,8 +917,9 @@ HSaveError WriteThisRoom(Stream *out) { } // room object movement paths cache - out->WriteInt32(_GP(thisroom).ObjectCount + 1); - for (size_t i = 0; i < _GP(thisroom).ObjectCount + 1; ++i) { + // CHECKME: not sure why it saves (object count + 1) move lists + out->WriteInt32(_GP(thisroom).Objects.size() + 1); + for (size_t i = 0; i < _GP(thisroom).Objects.size() + 1; ++i) { _GP(mls)[i].WriteToFile(out); } diff --git a/engines/ags/shared/game/room_file.cpp b/engines/ags/shared/game/room_file.cpp index 0db9e4bd203f..de5529dfae71 100644 --- a/engines/ags/shared/game/room_file.cpp +++ b/engines/ags/shared/game/room_file.cpp @@ -149,12 +149,13 @@ HError ReadMainBlock(RoomStruct *room, Stream *in, RoomFileVersion data_ver) { room->Edges.Right = in->ReadInt16(); // Room objects - room->ObjectCount = in->ReadInt16(); - if (room->ObjectCount > MAX_ROOM_OBJECTS) - return new RoomFileError(kRoomFileErr_IncompatibleEngine, String::FromFormat("Too many objects (in room: %d, max: %d).", room->ObjectCount, MAX_ROOM_OBJECTS)); + uint16_t obj_count = in->ReadInt16(); + if (obj_count > MAX_ROOM_OBJECTS) + return new RoomFileError(kRoomFileErr_IncompatibleEngine, String::FromFormat("Too many objects (in room: %d, max: %d).", obj_count, MAX_ROOM_OBJECTS)); - for (size_t i = 0; i < room->ObjectCount; ++i) - ReadRoomObject(room->Objects[i], in); + room->Objects.resize(obj_count); + for (auto &obj : room->Objects) + ReadRoomObject(obj, in); // Legacy interactions if (data_ver >= kRoomVersion_253) { @@ -169,8 +170,8 @@ HError ReadMainBlock(RoomStruct *room, Stream *in, RoomFileVersion data_ver) { if (data_ver >= kRoomVersion_241 && data_ver < kRoomVersion_300a) { for (size_t i = 0; i < room->HotspotCount; ++i) room->Hotspots[i].Interaction.reset(Interaction::CreateFromStream(in)); - for (size_t i = 0; i < room->ObjectCount; ++i) - room->Objects[i].Interaction.reset(Interaction::CreateFromStream(in)); + for (auto &obj : room->Objects) + obj.Interaction.reset(Interaction::CreateFromStream(in)); room->Interaction.reset(Interaction::CreateFromStream(in)); } @@ -190,22 +191,22 @@ HError ReadMainBlock(RoomStruct *room, Stream *in, RoomFileVersion data_ver) { room->EventHandlers.reset(InteractionScripts::CreateFromStream(in)); for (size_t i = 0; i < room->HotspotCount; ++i) room->Hotspots[i].EventHandlers.reset(InteractionScripts::CreateFromStream(in)); - for (size_t i = 0; i < room->ObjectCount; ++i) - room->Objects[i].EventHandlers.reset(InteractionScripts::CreateFromStream(in)); + for (auto &obj : room->Objects) + obj.EventHandlers.reset(InteractionScripts::CreateFromStream(in)); for (size_t i = 0; i < room->RegionCount; ++i) room->Regions[i].EventHandlers.reset(InteractionScripts::CreateFromStream(in)); } if (data_ver >= kRoomVersion_200_alpha) { - for (size_t i = 0; i < room->ObjectCount; ++i) - room->Objects[i].Baseline = in->ReadInt32(); + for (auto &obj : room->Objects) + obj.Baseline = in->ReadInt32(); room->Width = in->ReadInt16(); room->Height = in->ReadInt16(); } if (data_ver >= kRoomVersion_262) - for (size_t i = 0; i < room->ObjectCount; ++i) - room->Objects[i].Flags = in->ReadInt16(); + for (auto &obj : room->Objects) + obj.Flags = in->ReadInt16(); if (data_ver >= kRoomVersion_200_final) room->MaskResolution = in->ReadInt16(); @@ -339,15 +340,15 @@ HError ReadCompSc3Block(RoomStruct *room, Stream *in, RoomFileVersion /*data_ver // Room object names HError ReadObjNamesBlock(RoomStruct *room, Stream *in, RoomFileVersion data_ver) { size_t name_count = static_cast(in->ReadInt8()); - if (name_count != room->ObjectCount) + if (name_count != room->Objects.size()) return new RoomFileError(kRoomFileErr_InconsistentData, - String::FromFormat("In the object names block, expected name count: %zu, got %zu", room->ObjectCount, name_count)); + String::FromFormat("In the object names block, expected name count: %zu, got %zu", room->Objects.size(), name_count)); - for (size_t i = 0; i < room->ObjectCount; ++i) { + for (auto &obj : room->Objects) { if (data_ver >= kRoomVersion_3415) - room->Objects[i].Name = StrUtil::ReadString(in); + obj.Name = StrUtil::ReadString(in); else - room->Objects[i].Name.ReadCount(in, LEGACY_MAXOBJNAMELEN); + obj.Name.ReadCount(in, LEGACY_MAXOBJNAMELEN); } return HError::None(); } @@ -355,15 +356,15 @@ HError ReadObjNamesBlock(RoomStruct *room, Stream *in, RoomFileVersion data_ver) // Room object script names HError ReadObjScNamesBlock(RoomStruct *room, Stream *in, RoomFileVersion data_ver) { size_t name_count = static_cast(in->ReadInt8()); - if (name_count != room->ObjectCount) + if (name_count != room->Objects.size()) return new RoomFileError(kRoomFileErr_InconsistentData, - String::FromFormat("In the object script names block, expected name count: %zu, got %zu", room->ObjectCount, name_count)); + String::FromFormat("In the object script names block, expected name count: %zu, got %zu", room->Objects.size(), name_count)); - for (size_t i = 0; i < room->ObjectCount; ++i) { + for (auto &obj : room->Objects) { if (data_ver >= kRoomVersion_3415) - room->Objects[i].ScriptName = StrUtil::ReadString(in); + obj.ScriptName = StrUtil::ReadString(in); else - room->Objects[i].ScriptName.ReadCount(in, MAX_SCRIPT_NAME_LEN); + obj.ScriptName.ReadCount(in, MAX_SCRIPT_NAME_LEN); } return HError::None(); } @@ -398,8 +399,8 @@ HError ReadPropertiesBlock(RoomStruct *room, Stream *in, RoomFileVersion /*data_ errors += Properties::ReadValues(room->Properties, in); for (size_t i = 0; i < room->HotspotCount; ++i) errors += Properties::ReadValues(room->Hotspots[i].Properties, in); - for (size_t i = 0; i < room->ObjectCount; ++i) - errors += Properties::ReadValues(room->Objects[i].Properties, in); + for (auto &obj : room->Objects) + errors += Properties::ReadValues(obj.Properties, in); if (errors > 0) return new RoomFileError(kRoomFileErr_InvalidPropertyValues); @@ -525,9 +526,9 @@ HRoomFileError UpdateRoomData(RoomStruct *room, RoomFileVersion data_ver, bool g for (size_t i = 0; i < (size_t)MAX_ROOM_HOTSPOTS; ++i) if (!room->Hotspots[i].Interaction) room->Hotspots[i].Interaction.reset(new Interaction()); - for (size_t i = 0; i < (size_t)MAX_ROOM_OBJECTS; ++i) - if (!room->Objects[i].Interaction) - room->Objects[i].Interaction.reset(new Interaction()); + for (auto &obj : room->Objects) + if (!obj.Interaction) + obj.Interaction.reset(new Interaction()); for (size_t i = 0; i < (size_t)MAX_ROOM_REGIONS; ++i) if (!room->Regions[i].Interaction) room->Regions[i].Interaction.reset(new Interaction()); @@ -535,14 +536,14 @@ HRoomFileError UpdateRoomData(RoomStruct *room, RoomFileVersion data_ver, bool g // Upgade room object script names if (data_ver < kRoomVersion_300a) { - for (size_t i = 0; i < room->ObjectCount; ++i) { - if (room->Objects[i].ScriptName.GetLength() > 0) { + for (auto &obj : room->Objects) { + if (obj.ScriptName.GetLength() > 0) { String jibbledScriptName; - jibbledScriptName.Format("o%s", room->Objects[i].ScriptName.GetCStr()); + jibbledScriptName.Format("o%s", obj.ScriptName.GetCStr()); jibbledScriptName.MakeLower(); if (jibbledScriptName.GetLength() >= 2) jibbledScriptName.SetAt(1, toupper(jibbledScriptName[1u])); - room->Objects[i].ScriptName = jibbledScriptName; + obj.ScriptName = jibbledScriptName; } } } @@ -553,11 +554,11 @@ HRoomFileError UpdateRoomData(RoomStruct *room, RoomFileVersion data_ver, bool g // function in the engine if (data_ver < kRoomVersion_303b && game_is_hires) { const int mul = HIRES_COORD_MULTIPLIER; - for (size_t i = 0; i < room->ObjectCount; ++i) { - room->Objects[i].X *= mul; - room->Objects[i].Y *= mul; - if (room->Objects[i].Baseline > 0) { - room->Objects[i].Baseline *= mul; + for (auto &obj : room->Objects) { + obj.X *= mul; + obj.Y *= mul; + if (obj.Baseline > 0) { + obj.Baseline *= mul; } } @@ -582,8 +583,8 @@ HRoomFileError UpdateRoomData(RoomStruct *room, RoomFileVersion data_ver, bool g // NOTE: this is impossible to do without game sprite information loaded beforehand // NOTE: this should be done after coordinate conversion above for simplicity if (data_ver < kRoomVersion_300a) { - for (size_t i = 0; i < room->ObjectCount; ++i) - room->Objects[i].Y += sprinfos[room->Objects[i].Sprite].Height; + for (auto &obj : room->Objects) + obj.Y += sprinfos[obj.Sprite].Height; } if (data_ver >= kRoomVersion_251) { @@ -681,9 +682,9 @@ void WriteMainBlock(const RoomStruct *room, Stream *out) { out->WriteInt16(room->Edges.Left); out->WriteInt16(room->Edges.Right); - out->WriteInt16((int16_t)room->ObjectCount); - for (size_t i = 0; i < room->ObjectCount; ++i) { - WriteRoomObject(room->Objects[i], out); + out->WriteInt16((int16_t)room->Objects.size()); + for (const auto &obj : room->Objects) { + WriteRoomObject(obj, out); } out->WriteInt32(0); // legacy interaction vars @@ -692,17 +693,17 @@ void WriteMainBlock(const RoomStruct *room, Stream *out) { WriteInteractionScripts(room->EventHandlers.get(), out); for (size_t i = 0; i < room->HotspotCount; ++i) WriteInteractionScripts(room->Hotspots[i].EventHandlers.get(), out); - for (size_t i = 0; i < room->ObjectCount; ++i) - WriteInteractionScripts(room->Objects[i].EventHandlers.get(), out); + for (const auto &obj : room->Objects) + WriteInteractionScripts(obj.EventHandlers.get(), out); for (size_t i = 0; i < room->RegionCount; ++i) WriteInteractionScripts(room->Regions[i].EventHandlers.get(), out); - for (size_t i = 0; i < room->ObjectCount; ++i) - out->WriteInt32(room->Objects[i].Baseline); + for (const auto &obj : room->Objects) + out->WriteInt32(obj.Baseline); out->WriteInt16(room->Width); out->WriteInt16(room->Height); - for (size_t i = 0; i < room->ObjectCount; ++i) - out->WriteInt16(room->Objects[i].Flags); + for (const auto &obj : room->Objects) + out->WriteInt16(obj.Flags); out->WriteInt16(room->MaskResolution); out->WriteInt32(MAX_WALK_AREAS + 1); @@ -755,15 +756,15 @@ void WriteCompSc3Block(const RoomStruct *room, Stream *out) { } void WriteObjNamesBlock(const RoomStruct *room, Stream *out) { - out->WriteByte((int8_t)room->ObjectCount); - for (size_t i = 0; i < room->ObjectCount; ++i) - Shared::StrUtil::WriteString(room->Objects[i].Name, out); + out->WriteByte((uint8_t)room->Objects.size()); + for (const auto &obj : room->Objects) + Shared::StrUtil::WriteString(obj.Name, out); } void WriteObjScNamesBlock(const RoomStruct *room, Stream *out) { - out->WriteByte((int8_t)room->ObjectCount); - for (size_t i = 0; i < room->ObjectCount; ++i) - Shared::StrUtil::WriteString(room->Objects[i].ScriptName, out); + out->WriteByte((uint8_t)room->Objects.size()); + for (const auto &obj : room->Objects) + Shared::StrUtil::WriteString(obj.ScriptName, out); } void WriteAnimBgBlock(const RoomStruct *room, Stream *out) { @@ -781,8 +782,8 @@ void WritePropertiesBlock(const RoomStruct *room, Stream *out) { Properties::WriteValues(room->Properties, out); for (size_t i = 0; i < room->HotspotCount; ++i) Properties::WriteValues(room->Hotspots[i].Properties, out); - for (size_t i = 0; i < room->ObjectCount; ++i) - Properties::WriteValues(room->Objects[i].Properties, out); + for (const auto &obj : room->Objects) + Properties::WriteValues(obj.Properties, out); } void WriteStrOptions(const RoomStruct *room, Stream *out) { @@ -801,7 +802,7 @@ HRoomFileError WriteRoomData(const RoomStruct *room, Stream *out, RoomFileVersio if (room->CompiledScript) WriteRoomBlock(room, kRoomFblk_CompScript3, WriteCompSc3Block, out); // Object names - if (room->ObjectCount > 0) { + if (room->Objects.size() > 0) { WriteRoomBlock(room, kRoomFblk_ObjectNames, WriteObjNamesBlock, out); WriteRoomBlock(room, kRoomFblk_ObjectScNames, WriteObjScNamesBlock, out); } diff --git a/engines/ags/shared/game/room_struct.cpp b/engines/ags/shared/game/room_struct.cpp index a2f76d3f8c53..e5cd1915e1fc 100644 --- a/engines/ags/shared/game/room_struct.cpp +++ b/engines/ags/shared/game/room_struct.cpp @@ -112,10 +112,7 @@ void RoomStruct::Free() { Hotspots[i].Interaction.reset(); Hotspots[i].Properties.clear(); } - for (size_t i = 0; i < (size_t)MAX_ROOM_OBJECTS; ++i) { - Objects[i].Interaction.reset(); - Objects[i].Properties.clear(); - } + Objects.clear(); for (size_t i = 0; i < (size_t)MAX_ROOM_REGIONS; ++i) { Regions[i].Interaction.reset(); Regions[i].Properties.clear(); @@ -139,8 +136,8 @@ void RoomStruct::FreeScripts() { EventHandlers.reset(); for (size_t i = 0; i < HotspotCount; ++i) Hotspots[i].EventHandlers.reset(); - for (size_t i = 0; i < ObjectCount; ++i) - Objects[i].EventHandlers.reset(); + for (auto &obj : Objects) + obj.EventHandlers.reset(); for (size_t i = 0; i < RegionCount; ++i) Regions[i].EventHandlers.reset(); } @@ -159,7 +156,6 @@ void RoomStruct::InitDefaults() { BgFrameCount = 1; HotspotCount = 0; - ObjectCount = 0; RegionCount = 0; WalkAreaCount = 0; WalkBehindCount = 0; @@ -167,8 +163,6 @@ void RoomStruct::InitDefaults() { for (size_t i = 0; i < (size_t)MAX_ROOM_HOTSPOTS; ++i) Hotspots[i] = RoomHotspot(); - for (size_t i = 0; i < (size_t)MAX_ROOM_OBJECTS; ++i) - Objects[i] = RoomObjectInfo(); for (size_t i = 0; i < (size_t)MAX_ROOM_REGIONS; ++i) Regions[i] = RoomRegion(); for (size_t i = 0; i <= (size_t)MAX_WALK_AREAS; ++i) diff --git a/engines/ags/shared/game/room_struct.h b/engines/ags/shared/game/room_struct.h index 89b1a182b50d..e54322f4e0b1 100644 --- a/engines/ags/shared/game/room_struct.h +++ b/engines/ags/shared/game/room_struct.h @@ -349,8 +349,7 @@ class RoomStruct { // Room entities size_t HotspotCount; RoomHotspot Hotspots[MAX_ROOM_HOTSPOTS]; - size_t ObjectCount; - RoomObjectInfo Objects[MAX_ROOM_OBJECTS]; + std::vector Objects; size_t RegionCount; RoomRegion Regions[MAX_ROOM_REGIONS]; size_t WalkAreaCount;