From 63e625e295eaa9e72fcc4499654f5ab6c0b1ce79 Mon Sep 17 00:00:00 2001 From: Roman Fomin Date: Sat, 6 Jan 2024 17:40:03 +0700 Subject: [PATCH] savegame fixes (#1376) * restore function pointer reading There seems to be a check for NULL somewhere. * remove saveg_compat checks in write function, formatting --- src/p_saveg.c | 117 +++++++++++++++++++++++++------------------------- 1 file changed, 59 insertions(+), 58 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index cd9661ed..25411300 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -264,8 +264,7 @@ static void saveg_read_thinker_t(thinker_t *str) str->next = saveg_readp(); // think_t function; - saveg_readp(); - str->function.v = NULL; + str->function.v = (actionf_v)saveg_readp(); // struct thinker_s* cnext; str->cnext = saveg_readp(); @@ -384,12 +383,12 @@ static void saveg_read_mobj_t(mobj_t *str) if (saveg_compat > saveg_woof510) { - // [Woof!]: mbf21: int flags2; - str->flags2 = saveg_read32(); + // [Woof!]: mbf21: int flags2; + str->flags2 = saveg_read32(); } else { - str->flags2 = mobjinfo[str->type].flags2; + str->flags2 = mobjinfo[str->type].flags2; } // int intflags @@ -448,11 +447,11 @@ static void saveg_read_mobj_t(mobj_t *str) if (saveg_compat > saveg_mbf) { - // [Woof!]: int friction; - str->friction = saveg_read32(); + // [Woof!]: int friction; + str->friction = saveg_read32(); - // [Woof!]: int movefactor; - str->movefactor = saveg_read32(); + // [Woof!]: int movefactor; + str->movefactor = saveg_read32(); } else { @@ -465,20 +464,20 @@ static void saveg_read_mobj_t(mobj_t *str) if (saveg_compat > saveg_mbf) { - // [Woof!]: int interp; - str->interp = saveg_read32(); + // [Woof!]: int interp; + str->interp = saveg_read32(); - // [Woof!]: fixed_t oldx; - str->oldx = saveg_read32(); + // [Woof!]: fixed_t oldx; + str->oldx = saveg_read32(); - // [Woof!]: fixed_t oldy; - str->oldy = saveg_read32(); + // [Woof!]: fixed_t oldy; + str->oldy = saveg_read32(); - // [Woof!]: fixed_t oldz; - str->oldz = saveg_read32(); + // [Woof!]: fixed_t oldz; + str->oldz = saveg_read32(); - // [Woof!]: angle_t oldangle; - str->oldangle = saveg_read32(); + // [Woof!]: angle_t oldangle; + str->oldangle = saveg_read32(); } else { @@ -491,12 +490,12 @@ static void saveg_read_mobj_t(mobj_t *str) if (saveg_compat > saveg_woof510) { - // [Woof!]: int bloodcolor; - str->bloodcolor = saveg_read32(); + // [Woof!]: int bloodcolor; + str->bloodcolor = saveg_read32(); } else { - str->bloodcolor = 0; + str->bloodcolor = 0; } // [FG] height of the sprite in pixels @@ -583,11 +582,8 @@ static void saveg_write_mobj_t(mobj_t *str) // int flags; saveg_write32(str->flags); - if (saveg_compat > saveg_woof510) - { // [Woof!]: mbf21: int flags2; saveg_write32(str->flags2); - } // int intflags; saveg_write32(str->intflags); @@ -667,11 +663,8 @@ static void saveg_write_mobj_t(mobj_t *str) // [Woof!]: int oldangle; saveg_write32(str->oldangle); - if (saveg_compat > saveg_woof510) - { // [Woof!]: int bloodcolor; saveg_write32(str->bloodcolor); - } } // @@ -752,11 +745,11 @@ static void saveg_read_pspdef_t(pspdef_t *str) if (saveg_compat > saveg_mbf) { - // [Woof!]: fixed_t sx2; - str->sx2 = saveg_read32(); + // [Woof!]: fixed_t sx2; + str->sx2 = saveg_read32(); - // [Woof!]: fixed_t sy2; - str->sy2 = saveg_read32(); + // [Woof!]: fixed_t sy2; + str->sy2 = saveg_read32(); } else { @@ -767,7 +760,6 @@ static void saveg_read_pspdef_t(pspdef_t *str) static void saveg_write_pspdef_t(pspdef_t *str) { - // state_t* state; if (str->state) { saveg_write32(str->state - states); @@ -839,13 +831,13 @@ static void saveg_read_player_t(player_t *str) str->armortype = saveg_read32(); // int powers[NUMPOWERS]; - for (i=0; ipowers[i] = saveg_read32(); } // boolean cards[NUMCARDS]; - for (i=0; icards[i] = saveg_read32(); } @@ -854,7 +846,7 @@ static void saveg_read_player_t(player_t *str) str->backpack = saveg_read32(); // int frags[MAXPLAYERS]; - for (i=0; ifrags[i] = saveg_read32(); } @@ -866,19 +858,19 @@ static void saveg_read_player_t(player_t *str) str->pendingweapon = saveg_read_enum(); // boolean weaponowned[NUMWEAPONS]; - for (i=0; iweaponowned[i] = saveg_read32(); } // int ammo[NUMAMMO]; - for (i=0; iammo[i] = saveg_read32(); } // int maxammo[NUMAMMO]; - for (i=0; imaxammo[i] = saveg_read32(); } @@ -926,7 +918,7 @@ static void saveg_read_player_t(player_t *str) str->colormap = saveg_read32(); // pspdef_t psprites[NUMPSPRITES]; - for (i=0; ipsprites[i]); } @@ -939,12 +931,12 @@ static void saveg_read_player_t(player_t *str) if (saveg_compat > saveg_mbf) { - // [Woof!]: angle_t oldviewz; - str->oldviewz = saveg_read32(); + // [Woof!]: angle_t oldviewz; + str->oldviewz = saveg_read32(); } else { - str->oldviewz = 0; + str->oldviewz = 0; } } @@ -989,13 +981,13 @@ static void saveg_write_player_t(player_t *str) saveg_write32(str->armortype); // int powers[NUMPOWERS]; - for (i=0; ipowers[i]); } // boolean cards[NUMCARDS]; - for (i=0; icards[i]); } @@ -1004,7 +996,7 @@ static void saveg_write_player_t(player_t *str) saveg_write32(str->backpack); // int frags[MAXPLAYERS]; - for (i=0; ifrags[i]); } @@ -1016,19 +1008,19 @@ static void saveg_write_player_t(player_t *str) saveg_write_enum(str->pendingweapon); // boolean weaponowned[NUMWEAPONS]; - for (i=0; iweaponowned[i]); } // int ammo[NUMAMMO]; - for (i=0; iammo[i]); } // int maxammo[NUMAMMO]; - for (i=0; imaxammo[i]); } @@ -1076,7 +1068,7 @@ static void saveg_write_player_t(player_t *str) saveg_write32(str->colormap); // pspdef_t psprites[NUMPSPRITES]; - for (i=0; ipsprites[i]); } @@ -1204,7 +1196,7 @@ static void saveg_write_ceiling_t(ceiling_t *str) static void saveg_read_vldoor_t(vldoor_t *str) { - int sector; + int sector, line; // thinker_t thinker; saveg_read_thinker_t(&str->thinker); @@ -1232,7 +1224,16 @@ static void saveg_read_vldoor_t(vldoor_t *str) str->topcountdown = saveg_read32(); // line_t *line; - str->line = saveg_readp(); + //jff 1/31/98 unarchive line remembered by door as well + line = saveg_read32(); + if (line == -1) + { + str->line = NULL; + } + else + { + str->line = &lines[line]; + } // int lighttag; str->lighttag = saveg_read32(); @@ -1267,9 +1268,13 @@ static void saveg_write_vldoor_t(vldoor_t *str) // line_t *line; //jff 1/31/98 archive line remembered by door as well if (str->line) - saveg_write32(str->line - lines); + { + saveg_write32(str->line - lines); + } else - saveg_write32(-1); + { + saveg_write32(-1); + } // int lighttag; saveg_write32(str->lighttag); @@ -2593,10 +2598,6 @@ void P_UnArchiveSpecials (void) { vldoor_t *door = Z_Malloc (sizeof(*door), PU_LEVEL, NULL); saveg_read_vldoor_t(door); - - //jff 1/31/98 unarchive line remembered by door as well - door->line = (intptr_t)door->line!=-1? &lines[(size_t)door->line] : NULL; - door->sector->ceilingdata = door; //jff 2/22/98 door->thinker.function.p1 = (actionf_p1)T_VerticalDoor; P_AddThinker (&door->thinker);