diff --git a/source/sw/src/game.cpp b/source/sw/src/game.cpp index 437d5eadf..59a44d5c3 100644 --- a/source/sw/src/game.cpp +++ b/source/sw/src/game.cpp @@ -4810,23 +4810,20 @@ void G_Polymer_UnInit(void) { } #include "saveable.h" -static saveable_data saveable_build_data[] = -{ - SAVE_DATA(sector), - SAVE_DATA(sprite), - SAVE_DATA(wall) -}; +saveable_module saveable_build{}; -saveable_module saveable_build = +void Saveable_Init_Dynamic() { - // code - NULL, - 0, + static saveable_data saveable_build_data[] = + { + {sector, MAXSECTORS*sizeof(sectortype)}, + {sprite, MAXSPRITES*sizeof(spritetype)}, + {wall, MAXWALLS*sizeof(walltype)}, + }; - // data - saveable_build_data, - NUM_SAVEABLE_ITEMS(saveable_build_data) -}; + saveable_build.data = saveable_build_data; + saveable_build.numdata = NUM_SAVEABLE_ITEMS(saveable_build_data); +} /*extern*/ bool GameInterface::validate_hud(int requested_size) { return requested_size; } /*extern*/ void GameInterface::set_hud_layout(int requested_size) { /* the relevant setting is gs.BorderNum */} diff --git a/source/sw/src/saveable.cpp b/source/sw/src/saveable.cpp index c568b1593..67e8339da 100644 --- a/source/sw/src/saveable.cpp +++ b/source/sw/src/saveable.cpp @@ -38,6 +38,8 @@ void Saveable_Init(void) { if (nummodules > 0) return; + Saveable_Init_Dynamic(); + #define MODULE(x) { \ extern saveable_module saveable_ ## x; \ saveablemodules[nummodules++] = &saveable_ ## x; \ diff --git a/source/sw/src/saveable.h b/source/sw/src/saveable.h index 657abadf4..0a288d058 100644 --- a/source/sw/src/saveable.h +++ b/source/sw/src/saveable.h @@ -24,6 +24,7 @@ #ifndef SAVEABLE_H #define SAVEABLE_H +#include "compat.h" typedef void *saveable_code; @@ -42,10 +43,16 @@ typedef struct unsigned int numdata; } saveable_module; -#define SAVE_CODE(s) (void*)s -#define SAVE_DATA(s) { (void*)&s, sizeof(s) } +template +static FORCE_INLINE constexpr enable_if_t::value, size_t> SAVE_SIZEOF(T const & obj) noexcept +{ + return sizeof(obj); +} -#define NUM_SAVEABLE_ITEMS(x) (sizeof(x)/sizeof(x[0])) +#define SAVE_CODE(s) (void*)(s) +#define SAVE_DATA(s) { (void*)&(s), SAVE_SIZEOF(s) } + +#define NUM_SAVEABLE_ITEMS(x) ARRAY_SIZE(x) typedef struct { @@ -61,6 +68,7 @@ typedef struct } saveddatasym; void Saveable_Init(void); +void Saveable_Init_Dynamic(void); int Saveable_FindCodeSym(void *ptr, savedcodesym *sym); int Saveable_FindDataSym(void *ptr, saveddatasym *sym);