mirror of https://github.com/OpenTTD/OpenTTD
Change: indicate in the savegame if a SL_STRUCT contains any data
This helps external tooling to understand if a SL_STRUCT should be skipped when reading. Basically, this transforms an SL_STRUCT into a SL_STRUCTLIST with either 0 or 1 length.pull/9375/head
parent
a146bcfe93
commit
75e7451151
|
@ -1467,6 +1467,10 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld)
|
||||||
_sl.obj_len = old_obj_len;
|
_sl.obj_len = old_obj_len;
|
||||||
_sl.need_length = old_need_length;
|
_sl.need_length = old_need_length;
|
||||||
|
|
||||||
|
if (sld.cmd == SL_STRUCT) {
|
||||||
|
length += SlGetArrayLength(1);
|
||||||
|
}
|
||||||
|
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
|
@ -1575,10 +1579,35 @@ static bool SlObjectMember(void *object, const SaveLoad &sld)
|
||||||
if (!SlIsObjectValidInSavegame(sld)) return false;
|
if (!SlIsObjectValidInSavegame(sld)) return false;
|
||||||
|
|
||||||
switch (_sl.action) {
|
switch (_sl.action) {
|
||||||
case SLA_SAVE: sld.handler->Save(object); break;
|
case SLA_SAVE: {
|
||||||
case SLA_LOAD_CHECK: sld.handler->LoadCheck(object); break;
|
if (sld.cmd == SL_STRUCT) {
|
||||||
case SLA_LOAD: sld.handler->Load(object); break;
|
/* Store in the savegame if this struct was written or not. */
|
||||||
case SLA_PTRS: sld.handler->FixPointers(object); break;
|
SlSetStructListLength(SlCalcObjMemberLength(object, sld) > SlGetArrayLength(1) ? 1 : 0);
|
||||||
|
}
|
||||||
|
sld.handler->Save(object);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SLA_LOAD_CHECK: {
|
||||||
|
if (sld.cmd == SL_STRUCT && !IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH)) {
|
||||||
|
SlGetStructListLength(1);
|
||||||
|
}
|
||||||
|
sld.handler->LoadCheck(object);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SLA_LOAD: {
|
||||||
|
if (sld.cmd == SL_STRUCT && !IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH)) {
|
||||||
|
SlGetStructListLength(1);
|
||||||
|
}
|
||||||
|
sld.handler->Load(object);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SLA_PTRS:
|
||||||
|
sld.handler->FixPointers(object);
|
||||||
|
break;
|
||||||
|
|
||||||
case SLA_NULL: break;
|
case SLA_NULL: break;
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue