diff --git a/src/g_shared/hudmessages.cpp b/src/g_shared/hudmessages.cpp index 531870571..b86cf6417 100644 --- a/src/g_shared/hudmessages.cpp +++ b/src/g_shared/hudmessages.cpp @@ -182,6 +182,10 @@ void DHUDMessage::Serialize(FSerializer &arc) ("tics", Tics) ("state", State) .Enum("textcolor", TextColor) + ("sbarid", SBarID) + ("sourcetext", SourceText) + ("font", Font) + ("next", Next) ("hudwidth", HUDWidth) ("hudheight", HUDHeight) ("nowrap", NoWrap) diff --git a/src/json.cpp b/src/json.cpp index 2d8c84d33..43f185301 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -71,7 +71,6 @@ CCMD(writejson) FSerializer arc; arc.OpenWriter(); arc.BeginObject(nullptr); - DThinker::SerializeThinkers(arc, false); G_SerializeLevel(arc, false); arc.WriteObjects(); arc.EndObject(); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index c366e4f42..22b44aa1c 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1646,7 +1646,7 @@ void FBehavior::StaticSerializeModuleStates (FSerializer &arc) if (arc.BeginArray("modules")) { FBehavior *module = StaticModules[modnum]; - const char *modname; + const char *modname = module->ModuleName; int ModSize = module->GetDataSize(); if (arc.BeginObject(nullptr)) @@ -1693,50 +1693,54 @@ void FBehavior::SerializeVarSet (FSerializer &arc, SDWORD *vars, int max) SDWORD count; SDWORD first, last; - if (arc.isWriting ()) + if (arc.BeginObject(nullptr)) { - // Find first non-zero variable - for (first = 0; first < max; ++first) + if (arc.isWriting()) { - if (vars[first] != 0) + // Find first non-zero variable + for (first = 0; first < max; ++first) { - break; + if (vars[first] != 0) + { + break; + } + } + + // Find last non-zero variable + for (last = max - 1; last >= first; --last) + { + if (vars[last] != 0) + { + break; + } + } + + if (last < first) + { // no non-zero variables + count = 0; + arc("count", count); + } + else + { + count = last - first + 1; + arc("count", count); + arc("first", first); + arc.Array("values", &vars[first], count); } } - - // Find last non-zero variable - for (last = max - 1; last >= first; --last) + else { - if (vars[last] != 0) - { - break; - } - } - - if (last < first) - { // no non-zero variables - count = 0; + memset(vars, 0, max * sizeof(*vars)); arc("count", count); - return; - } - count = last - first + 1; - arc("count", count); - arc("first", first); - arc.Array("values", &vars[first], count); - } - else - { - memset (vars, 0, max*sizeof(*vars)); - arc("count", count); - - if (count == 0) - { - return; + if (count != 0) + { + arc("first", first); + if (first + count > max) count = max - first; + arc.Array("values", &vars[first], count); + } } - arc("first", first); - if (first + count > max) count = max - first; - arc.Array("values", &vars[first], count); + arc.EndObject(); } } @@ -2923,6 +2927,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, SavingRunningscript &r void DACSThinker::Serialize(FSerializer &arc) { + Super::Serialize(arc); arc("scripts", Scripts); if (arc.isWriting()) @@ -3007,29 +3012,6 @@ END_POINTERS // //========================================================================== -template<> FSerializer &Serialize(FSerializer &arc, const char *key, FFont *&font, FFont **def) -{ - if (arc.isWriting()) - { - const char *n = font->GetName(); - return arc.StringPtr(key, n); - } - else - { - const char *n; - arc.StringPtr(key, n); - font = V_GetFont(n); - if (font == NULL) - { - Printf("Could not load font %s\n", n); - font = SmallFont; - } - return arc; - } - -} - - void DLevelScript::Serialize(FSerializer &arc) { Super::Serialize(arc); diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 2e927e9fa..1b9a0bfab 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -527,13 +527,17 @@ FSerializer &Serialize(FSerializer &arc, const char *key, secplane_t &p, secplan FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t *def) { + // save the Scroll data here because it's a lot easier to handle a default. + // Just writing out the full array can massively inflate the archive for no gain. + DVector2 scroll = { 0,0 }, nul = { 0,0 }; + if (arc.isWriting() && level.Scrolls.Size() > 0) scroll = level.Scrolls[p.sectornum]; + if (arc.BeginObject(key)) { arc("floorplane", p.floorplane, def->floorplane) ("ceilingplane", p.ceilingplane, def->ceilingplane) ("lightlevel", p.lightlevel, def->lightlevel) ("special", p.special, def->special) - ("soundtraversed", p.soundtraversed, def->soundtraversed) ("seqtype", p.seqType, def->seqType) ("seqname", p.SeqName, def->SeqName) ("friction", p.friction, def->friction) @@ -572,7 +576,17 @@ FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t ("colormap", p.ColorMap, def->ColorMap) .Terrain("floorterrain", p.terrainnum[0], &def->terrainnum[0]) .Terrain("ceilingterrain", p.terrainnum[1], &def->terrainnum[1]) + ("scrolls", scroll, nul) .EndObject(); + + if (!scroll.isZero()) + { + if (level.Scrolls.Size() == 0) + { + level.Scrolls.Resize(numsectors); + memset(&level.Scrolls[0], 0, sizeof(level.Scrolls[0])*level.Scrolls.Size()); + } + } } return arc; } @@ -837,8 +851,7 @@ void G_SerializeLevel(FSerializer &arc, bool hubload) ("level.maptime", level.maptime) ("level.totaltime", i) ("level.skytexture1", level.skytexture1) - ("level.skytexture2", level.skytexture2) - ("level.scrolls", level.Scrolls); + ("level.skytexture2", level.skytexture2); // Hub transitions must keep the current total time if (!hubload) @@ -852,23 +865,26 @@ void G_SerializeLevel(FSerializer &arc, bool hubload) interpolator.ClearInterpolations(); } + G_AirControlChanged(); // fixme: This needs to ensure it reads from the correct place. Should be one once there's enough of this code converted to JSON - AM_SerializeMarkers(arc); FBehavior::StaticSerializeModuleStates(arc); + // The order here is important: First world state, then portal state, then thinkers, and last polyobjects. arc.Array("linedefs", lines, &loadlines[0], numlines); arc.Array("sidedefs", sides, &loadsides[0], numsides); arc.Array("sectors", sectors, &loadsectors[0], numsectors); - arc.Array("polyobjs", polyobjs, po_NumPolyobjs); - arc("subsectors", subsectors); - StatusBar->SerializeMessages(arc); arc("zones", Zones); arc("lineportals", linePortals); arc("sectorportals", sectorPortals); - if (arc.isReading()) P_CollectLinkedPortals(); + DThinker::SerializeThinkers(arc, !hubload); + arc.Array("polyobjs", polyobjs, po_NumPolyobjs); + arc("subsectors", subsectors); + StatusBar->SerializeMessages(arc); + AM_SerializeMarkers(arc); + } diff --git a/src/serializer.cpp b/src/serializer.cpp index c282c9090..1386319fb 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -29,6 +29,7 @@ #include "r_data/r_interpolate.h" #include "g_shared/a_sharedglobal.h" #include "po_man.h" +#include "v_font.h" char nulspace[1024 * 1024 * 4]; @@ -211,6 +212,7 @@ void FSerializer::WriteKey(const char *key) { if (isWriting() && w->inObject()) { + assert(key != nullptr); if (key == nullptr) { I_Error("missing element name"); @@ -426,7 +428,6 @@ FSerializer &FSerializer::ScriptNum(const char *key, int &num) { w->mWriter.Int(num); } - w->mWriter.EndArray(); } else { @@ -1434,4 +1435,33 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, char *&pstr } } return arc; -} \ No newline at end of file +} + +//========================================================================== +// +// +// +//========================================================================== + +template<> FSerializer &Serialize(FSerializer &arc, const char *key, FFont *&font, FFont **def) +{ + if (arc.isWriting()) + { + const char *n = font->GetName(); + return arc.StringPtr(key, n); + } + else + { + const char *n; + arc.StringPtr(key, n); + font = V_GetFont(n); + if (font == NULL) + { + Printf("Could not load font %s\n", n); + font = SmallFont; + } + return arc; + } + +} + diff --git a/src/serializer.h b/src/serializer.h index efa92a550..abc62755a 100644 --- a/src/serializer.h +++ b/src/serializer.h @@ -189,6 +189,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FStrifeDial template<> FSerializer &Serialize(FSerializer &arc, const char *key, FString *&pstr, FString **def); template<> FSerializer &Serialize(FSerializer &arc, const char *key, FDoorAnimation *&pstr, FDoorAnimation **def); template<> FSerializer &Serialize(FSerializer &arc, const char *key, char *&pstr, char **def); +template<> FSerializer &Serialize(FSerializer &arc, const char *key, FFont *&font, FFont **def); inline FSerializer &Serialize(FSerializer &arc, const char *key, DVector3 &p, DVector3 *def)