diff --git a/src/sl/saveload.h b/src/sl/saveload.h index 67eaaaeef0..dcf76e19cd 100644 --- a/src/sl/saveload.h +++ b/src/sl/saveload.h @@ -169,9 +169,55 @@ namespace upstream_sl { }; return ch; } + + template + ChunkHandler MakeConditionallyUpstreamChunkHandler(ChunkSaveLoadProc *save_proc, ChunkSaveLoadProc *load_proc, ChunkSaveLoadProc *ptrs_proc, ChunkSaveLoadProc *load_check_proc, ChunkType type) + { + extern void SlLoadChunkByID(uint32); + extern void SlLoadCheckChunkByID(uint32); + extern void SlFixPointerChunkByID(uint32); + + ChunkHandler ch = { + id, + save_proc, + load_proc, + ptrs_proc, + load_check_proc, + type + }; + ch.special_proc = [](uint32 chunk_id, ChunkSaveLoadSpecialOp op) -> ChunkSaveLoadSpecialOpResult { + assert(id == chunk_id); + switch (op) { + case CSLSO_PRE_LOAD: + if (!F::LoadUpstream()) return CSLSOR_NONE; + SlExecWithSlVersion(F::GetLoadVersion(), []() { + SlLoadChunkByID(id); + }); + return CSLSOR_LOAD_CHUNK_CONSUMED; + case CSLSO_PRE_LOADCHECK: + if (!F::LoadUpstream()) return CSLSOR_NONE; + SlExecWithSlVersion(F::GetLoadVersion(), []() { + SlLoadCheckChunkByID(id); + }); + return CSLSOR_LOAD_CHUNK_CONSUMED; + case CSLSO_PRE_PTRS: + if (!F::LoadUpstream()) return CSLSOR_NONE; + SlExecWithSlVersion(F::GetLoadVersion(), []() { + SlFixPointerChunkByID(id); + }); + return CSLSOR_LOAD_CHUNK_CONSUMED; + case CSLSO_SHOULD_SAVE_CHUNK: + return F::SaveUpstream() ? CSLSOR_UPSTREAM_SAVE_CHUNK : CSLSOR_NONE; + default: + return CSLSOR_NONE; + } + }; + return ch; + } } using upstream_sl::MakeUpstreamChunkHandler; +using upstream_sl::MakeConditionallyUpstreamChunkHandler; struct NullStruct { byte null;