|
|
|
@ -13,44 +13,78 @@
|
|
|
|
|
|
|
|
|
|
#include "saveload.h"
|
|
|
|
|
|
|
|
|
|
/** Description of a plan within the savegame. */
|
|
|
|
|
static const SaveLoad _plan_desc[] = {
|
|
|
|
|
SLE_VAR(Plan, owner, SLE_UINT8),
|
|
|
|
|
SLE_VAR(Plan, visible, SLE_BOOL),
|
|
|
|
|
SLE_VAR(Plan, visible_by_all, SLE_BOOL),
|
|
|
|
|
SLE_VAR(Plan, creation_date, SLE_INT32),
|
|
|
|
|
SLE_CONDSSTR_X(Plan, name, 0, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ENH_VIEWPORT_PLANS, 3)),
|
|
|
|
|
SLE_CONDSSTR_X(Plan, name, 0, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_20)),
|
|
|
|
|
SLE_CONDVAR_X(Plan, colour, SLE_UINT8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ENH_VIEWPORT_PLANS, 4)),
|
|
|
|
|
};
|
|
|
|
|
struct PlanLineStructHandler final : public TypedSaveLoadStructHandler<PlanLineStructHandler, Plan> {
|
|
|
|
|
NamedSaveLoadTable GetDescription() const override
|
|
|
|
|
{
|
|
|
|
|
static const NamedSaveLoad _plan_line_sub_desc[] = {
|
|
|
|
|
NSLT("tiles", SLE_VARVEC(PlanLine, tiles, SLE_UINT32)),
|
|
|
|
|
};
|
|
|
|
|
return _plan_line_sub_desc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void RealSave_PLAN(Plan *p)
|
|
|
|
|
{
|
|
|
|
|
SlObject(p, _plan_desc);
|
|
|
|
|
SlWriteUint32((uint32_t)p->lines.size());
|
|
|
|
|
for (size_t i = 0; i < p->lines.size(); i++) {
|
|
|
|
|
PlanLine *pl = p->lines[i];
|
|
|
|
|
SlWriteUint32((uint32_t)pl->tiles.size());
|
|
|
|
|
SlArray(pl->tiles.data(), pl->tiles.size(), SLE_UINT32);
|
|
|
|
|
void Save(Plan *p) const override
|
|
|
|
|
{
|
|
|
|
|
SlSetStructListLength(p->lines.size());
|
|
|
|
|
for (PlanLine *pl : p->lines) {
|
|
|
|
|
SlObjectSaveFiltered(pl, this->GetLoadDescription());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Load(Plan *p) const override
|
|
|
|
|
{
|
|
|
|
|
size_t line_count = SlGetStructListLength(UINT32_MAX);
|
|
|
|
|
p->lines.resize(line_count);
|
|
|
|
|
for (size_t i = 0; i < line_count; i++) {
|
|
|
|
|
PlanLine *pl = new PlanLine();
|
|
|
|
|
p->lines[i] = pl;
|
|
|
|
|
SlObjectLoadFiltered(pl, this->GetLoadDescription());
|
|
|
|
|
pl->UpdateVisualExtents();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** Description of a plan within the savegame. */
|
|
|
|
|
static const NamedSaveLoad _plan_desc[] = {
|
|
|
|
|
NSL("owner", SLE_VAR(Plan, owner, SLE_UINT8)),
|
|
|
|
|
NSL("visible", SLE_VAR(Plan, visible, SLE_BOOL)),
|
|
|
|
|
NSL("visible_by_all", SLE_VAR(Plan, visible_by_all, SLE_BOOL)),
|
|
|
|
|
NSL("creation_date", SLE_VAR(Plan, creation_date, SLE_INT32)),
|
|
|
|
|
NSL("name", SLE_CONDSSTR_X(Plan, name, SLE_STR, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ENH_VIEWPORT_PLANS, 3))),
|
|
|
|
|
NSL("name", SLE_CONDSSTR_X(Plan, name, SLE_STR, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_20))),
|
|
|
|
|
NSL("colour", SLE_CONDVAR_X(Plan, colour, SLE_UINT8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ENH_VIEWPORT_PLANS, 4))),
|
|
|
|
|
NSLT_STRUCTLIST<PlanLineStructHandler>("lines"),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** Save all plans. */
|
|
|
|
|
static void Save_PLAN()
|
|
|
|
|
{
|
|
|
|
|
SaveLoadTableData slt = SlTableHeader(_plan_desc);
|
|
|
|
|
|
|
|
|
|
for (Plan *p : Plan::Iterate()) {
|
|
|
|
|
SlSetArrayIndex(p->index);
|
|
|
|
|
SlAutolength(RealSave_PLAN, p);
|
|
|
|
|
SlObjectSaveFiltered(p, slt);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Load all plans. */
|
|
|
|
|
static void Load_PLAN()
|
|
|
|
|
{
|
|
|
|
|
SaveLoadTableData slt = SlTableHeaderOrRiff(_plan_desc);
|
|
|
|
|
|
|
|
|
|
if (SlIsTableChunk()) {
|
|
|
|
|
int index;
|
|
|
|
|
while ((index = SlIterateArray()) != -1) {
|
|
|
|
|
Plan *p = new (index) Plan();
|
|
|
|
|
SlObjectLoadFiltered(p, slt);
|
|
|
|
|
p->SetVisibility(false);
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int index;
|
|
|
|
|
while ((index = SlIterateArray()) != -1) {
|
|
|
|
|
Plan *p = new (index) Plan();
|
|
|
|
|
SlObject(p, _plan_desc);
|
|
|
|
|
SlObjectLoadFiltered(p, slt);
|
|
|
|
|
if (SlXvIsFeaturePresent(XSLFI_ENH_VIEWPORT_PLANS, 2)) {
|
|
|
|
|
const size_t line_count = SlReadUint32();
|
|
|
|
|
p->lines.resize(line_count);
|
|
|
|
@ -90,7 +124,7 @@ static void Load_PLANLINE()
|
|
|
|
|
|
|
|
|
|
/** Chunk handlers related to plans. */
|
|
|
|
|
static const ChunkHandler plan_chunk_handlers[] = {
|
|
|
|
|
{ 'PLAN', Save_PLAN, Load_PLAN, nullptr, nullptr, CH_ARRAY },
|
|
|
|
|
{ 'PLAN', Save_PLAN, Load_PLAN, nullptr, nullptr, CH_TABLE },
|
|
|
|
|
{ 'PLLN', nullptr, Load_PLANLINE, nullptr, nullptr, CH_READONLY },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|