diff --git a/engines/ags/engine/ac/room.cpp b/engines/ags/engine/ac/room.cpp index a29c520c9a0..4e7fe009538 100644 --- a/engines/ags/engine/ac/room.cpp +++ b/engines/ags/engine/ac/room.cpp @@ -937,6 +937,16 @@ void new_room(int newnum, CharacterInfo *forchar) { load_new_room(newnum, forchar); } +void set_room_placeholder() { + _GP(thisroom).InitDefaults(); + std::shared_ptr dummy_bg(new Bitmap(1, 1, 8)); + _GP(thisroom).BgFrames[0].Graphic = dummy_bg; + _GP(thisroom).HotspotMask = dummy_bg; + _GP(thisroom).RegionMask = dummy_bg; + _GP(thisroom).WalkAreaMask = dummy_bg; + _GP(thisroom).WalkBehindMask = dummy_bg; +} + int find_highest_room_entered() { int qq, fndas = -1; for (qq = 0; qq < MAX_ROOMS; qq++) { diff --git a/engines/ags/engine/ac/room.h b/engines/ags/engine/ac/room.h index aa42ac18eaa..9ed38a4d1a4 100644 --- a/engines/ags/engine/ac/room.h +++ b/engines/ags/engine/ac/room.h @@ -52,6 +52,9 @@ void save_room_data_segment(); void unload_old_room(); void load_new_room(int newnum, CharacterInfo *forchar); void new_room(int newnum, CharacterInfo *forchar); +// Sets up a placeholder room object; this is used to avoid occasional crashes +// in case an API function was called that needs to access a room, while no real room is loaded +void set_room_placeholder(); int find_highest_room_entered(); void first_room_initialization(); void check_new_room(); diff --git a/engines/ags/engine/game/savegame.cpp b/engines/ags/engine/game/savegame.cpp index 9bacfe6cd8b..e14e4ed5c57 100644 --- a/engines/ags/engine/game/savegame.cpp +++ b/engines/ags/engine/game/savegame.cpp @@ -493,6 +493,8 @@ HSaveError DoAfterRestore(const PreservedParams &pp, const RestoredData &r_data) // load the room the game was saved in if (_G(displayed_room) >= 0) load_new_room(_G(displayed_room), nullptr); + else + set_room_placeholder(); update_polled_stuff_if_runtime(); diff --git a/engines/ags/engine/main/game_start.cpp b/engines/ags/engine/main/game_start.cpp index 7e89a78e2c2..e0d4bfe78cc 100644 --- a/engines/ags/engine/main/game_start.cpp +++ b/engines/ags/engine/main/game_start.cpp @@ -73,6 +73,7 @@ void start_game_load_savegame_on_startup() { } void start_game() { + set_room_placeholder(); set_cursor_mode(MODE_WALK); _GP(mouse).SetPosition(Point(160, 100)); newmusic(0);