mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-27 20:20:40 +00:00
- SW: save the player and related data as JSON.
This commit is contained in:
parent
9bae2295cc
commit
06b03f7301
3 changed files with 395 additions and 280 deletions
|
@ -196,7 +196,7 @@ static cheatseq_t swcheats[] = {
|
||||||
static void WeaponCheat(int player)
|
static void WeaponCheat(int player)
|
||||||
{
|
{
|
||||||
auto p = &Player[player];
|
auto p = &Player[player];
|
||||||
auto u = User[p->PlayerSprite];
|
auto u = User[p->PlayerSprite].Data();
|
||||||
|
|
||||||
if (!TEST(p->Flags, PF_TWO_UZI))
|
if (!TEST(p->Flags, PF_TWO_UZI))
|
||||||
{
|
{
|
||||||
|
@ -280,7 +280,7 @@ static void cmd_Give(int player, uint8_t** stream, bool skip)
|
||||||
case GIVE_AMMO:
|
case GIVE_AMMO:
|
||||||
{
|
{
|
||||||
auto p = &Player[player];
|
auto p = &Player[player];
|
||||||
auto u = User[p->PlayerSprite];
|
auto u = User[p->PlayerSprite].Data();
|
||||||
|
|
||||||
p->WpnShotgunAuto = 50;
|
p->WpnShotgunAuto = 50;
|
||||||
p->WpnRocketHeat = 5;
|
p->WpnRocketHeat = 5;
|
||||||
|
|
|
@ -851,13 +851,6 @@ struct PLAYERstruct
|
||||||
int slide_dec;
|
int slide_dec;
|
||||||
float drive_avel;
|
float drive_avel;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// scroll 2D mode stuff
|
|
||||||
int scr_x, scr_y, oscr_x, oscr_y;
|
|
||||||
int scr_xvect, scr_yvect;
|
|
||||||
short scr_ang, oscr_ang, scr_sectnum;
|
|
||||||
|
|
||||||
short view_outside_dang; // outside view delta ang
|
short view_outside_dang; // outside view delta ang
|
||||||
short circle_camera_ang;
|
short circle_camera_ang;
|
||||||
short camera_check_time_delay;
|
short camera_check_time_delay;
|
||||||
|
@ -989,7 +982,7 @@ struct PLAYERstruct
|
||||||
short Heads; // Number of Accursed Heads orbiting player
|
short Heads; // Number of Accursed Heads orbiting player
|
||||||
int PlayerVersion;
|
int PlayerVersion;
|
||||||
|
|
||||||
char cookieQuote[256]; // Should be an FString but must be POD for now to be storable in a savegame.
|
char cookieQuote[256]; // Should be an FString but must be POD for now so that PLAYER remains POD.
|
||||||
int cookieTime;
|
int cookieTime;
|
||||||
|
|
||||||
char WpnReloadState;
|
char WpnReloadState;
|
||||||
|
|
|
@ -83,7 +83,6 @@ extern bool sumowasseen;
|
||||||
extern bool zillawasseen;
|
extern bool zillawasseen;
|
||||||
extern short BossSpriteNum[3];
|
extern short BossSpriteNum[3];
|
||||||
|
|
||||||
#define PANEL_SAVE 1
|
|
||||||
#define ANIM_SAVE 1
|
#define ANIM_SAVE 1
|
||||||
|
|
||||||
extern STATE s_NotRestored[];
|
extern STATE s_NotRestored[];
|
||||||
|
@ -227,6 +226,221 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, ATTRIBUTEp& w, ATT
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Temporary array to serialize the panel sprites.
|
||||||
|
static TArray<PANEL_SPRITEp> pspAsArray;
|
||||||
|
|
||||||
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, PANEL_SPRITEp& w, PANEL_SPRITEp* def)
|
||||||
|
{
|
||||||
|
unsigned idx = ~0u;
|
||||||
|
if (arc.isWriting())
|
||||||
|
{
|
||||||
|
if (w != nullptr)
|
||||||
|
{
|
||||||
|
idx = pspAsArray.Find(w);
|
||||||
|
if ((unsigned)idx >= pspAsArray.Size())
|
||||||
|
{
|
||||||
|
for (unsigned i = 0; i < MAX_SW_PLAYERS_REG; i++)
|
||||||
|
{
|
||||||
|
// special case for pointing to the list head
|
||||||
|
if ((LIST)w == (LIST)&Player[i].PanelSpriteList)
|
||||||
|
{
|
||||||
|
idx = 1000'0000 + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (idx >= pspAsArray.Size() && idx < 1000'0000)
|
||||||
|
idx = pspAsArray.Push(w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arc(keyname, idx);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned int ndx;
|
||||||
|
arc(keyname, ndx);
|
||||||
|
|
||||||
|
if (ndx == ~0u) w = nullptr;
|
||||||
|
else if (ndx >= 1000'0000) w = (PANEL_SPRITEp)&Player[ndx - 1000'0000].PanelSpriteList;
|
||||||
|
else if ((unsigned)ndx >= pspAsArray.Size())
|
||||||
|
I_Error("Bad panel sprite index in savegame");
|
||||||
|
else w = pspAsArray[ndx];
|
||||||
|
}
|
||||||
|
return arc;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// we need to allocate the needed panel sprites before loading anything else
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void preSerializePanelSprites(FSerializer& arc)
|
||||||
|
{
|
||||||
|
if (arc.isReading())
|
||||||
|
{
|
||||||
|
unsigned siz;
|
||||||
|
arc("panelcount", siz);
|
||||||
|
pspAsArray.Resize(siz);
|
||||||
|
for (unsigned i = 0; i < siz; i++)
|
||||||
|
{
|
||||||
|
pspAsArray[i] = (PANEL_SPRITEp)CallocMem(sizeof(PANEL_SPRITE), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void postSerializePanelSprites(FSerializer& arc)
|
||||||
|
{
|
||||||
|
if (arc.isWriting())
|
||||||
|
{
|
||||||
|
unsigned siz = pspAsArray.Size();
|
||||||
|
arc("panelcount", siz);
|
||||||
|
}
|
||||||
|
if (arc.BeginArray("panelsprites"))
|
||||||
|
{
|
||||||
|
for (auto psp : pspAsArray)
|
||||||
|
{
|
||||||
|
arc(nullptr, *psp);
|
||||||
|
}
|
||||||
|
arc.EndArray();
|
||||||
|
}
|
||||||
|
pspAsArray.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, PANEL_SPRITE_OVERLAY& w, PANEL_SPRITE_OVERLAY* def)
|
||||||
|
{
|
||||||
|
if (arc.BeginObject(keyname))
|
||||||
|
{
|
||||||
|
arc("state", w.State)
|
||||||
|
("flags", w.flags)
|
||||||
|
("tics", w.tics)
|
||||||
|
("pic", w.pic)
|
||||||
|
("xoff", w.xoff)
|
||||||
|
("yoff", w.yoff)
|
||||||
|
.EndObject();
|
||||||
|
}
|
||||||
|
return arc;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, PANEL_SPRITEstruct& w, PANEL_SPRITEstruct* def)
|
||||||
|
{
|
||||||
|
static PANEL_SPRITEstruct nul;
|
||||||
|
if (!def)
|
||||||
|
{
|
||||||
|
def = &nul;
|
||||||
|
if (arc.isReading()) w = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arc.BeginObject(keyname))
|
||||||
|
{
|
||||||
|
arc("Next", w.Next)
|
||||||
|
("Prev", w.Prev)
|
||||||
|
("sibling", w.sibling)
|
||||||
|
("State", w.State)
|
||||||
|
("RetractState", w.RetractState)
|
||||||
|
("PresentState", w.PresentState)
|
||||||
|
("ActionState", w.ActionState)
|
||||||
|
("RestState", w.RestState)
|
||||||
|
("xfract", w.xfract)
|
||||||
|
("x", w.x)
|
||||||
|
("yfract", w.yfract)
|
||||||
|
("y", w.y)
|
||||||
|
.Array("over", w.over, countof(w.over))
|
||||||
|
("id", w.ID)
|
||||||
|
("picndx", w.picndx)
|
||||||
|
("picnum", w.picnum)
|
||||||
|
("vel", w.vel)
|
||||||
|
("vel_adj", w.vel_adj)
|
||||||
|
("xorig", w.xorig)
|
||||||
|
("yorig", w.yorig)
|
||||||
|
("flags", w.flags)
|
||||||
|
("priority", w.priority)
|
||||||
|
("scale", w.scale)
|
||||||
|
("jump_speed", w.jump_speed)
|
||||||
|
("jump_grav", w.jump_grav)
|
||||||
|
("xspeed", w.xspeed)
|
||||||
|
("tics", w.tics)
|
||||||
|
("delay", w.delay)
|
||||||
|
("ang", w.ang)
|
||||||
|
("rotate_ang", w.rotate_ang)
|
||||||
|
("sin_ndx", w.sin_ndx)
|
||||||
|
("sin_amt", w.sin_amt)
|
||||||
|
("sin_arc_speed", w.sin_arc_speed)
|
||||||
|
("bob_height_divider", w.bob_height_divider)
|
||||||
|
("shade", w.shade)
|
||||||
|
("pal", w.pal)
|
||||||
|
("kill_tics", w.kill_tics)
|
||||||
|
("WeaponType", w.WeaponType)
|
||||||
|
("playerp", w.PlayerP);
|
||||||
|
|
||||||
|
SerializeCodePtr(arc, "PanelSpriteFunc", (void**)&w.PanelSpriteFunc);
|
||||||
|
|
||||||
|
arc.EndObject();
|
||||||
|
}
|
||||||
|
if (arc.isReading())
|
||||||
|
{
|
||||||
|
w.ox = w.x;
|
||||||
|
w.oy = w.y;
|
||||||
|
}
|
||||||
|
return arc;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, REMOTE_CONTROL& w, REMOTE_CONTROL* def)
|
||||||
|
{
|
||||||
|
static REMOTE_CONTROL nul;
|
||||||
|
if (!def)
|
||||||
|
{
|
||||||
|
def = &nul;
|
||||||
|
if (arc.isReading()) w = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arc.BeginObject(keyname))
|
||||||
|
{
|
||||||
|
arc("cursectnum", w.cursectnum)
|
||||||
|
("lastcursectnum", w.lastcursectnum)
|
||||||
|
("pang", w.pang)
|
||||||
|
("filler", w.filler)
|
||||||
|
("xvect", w.xvect)
|
||||||
|
("yvect", w.yvect)
|
||||||
|
("slide_xvect", w.slide_xvect)
|
||||||
|
("slide_yvect", w.slide_yvect)
|
||||||
|
("x", w.posx)
|
||||||
|
("y", w.posy)
|
||||||
|
("z", w.posz)
|
||||||
|
("sop_control", w.sop_control)
|
||||||
|
.EndObject();
|
||||||
|
}
|
||||||
|
if (arc.isReading())
|
||||||
|
{
|
||||||
|
w.oxvect = w.xvect;
|
||||||
|
w.oyvect = w.yvect;
|
||||||
|
}
|
||||||
|
return arc;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
FSerializer& Serialize(FSerializer& arc, const char* keyname, PLAYERp& w, PLAYERp* def)
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, PLAYERp& w, PLAYERp* def)
|
||||||
{
|
{
|
||||||
int ndx = w ? int(w - Player) : -1;
|
int ndx = w ? int(w - Player) : -1;
|
||||||
|
@ -241,6 +455,178 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, PLAYERp& w, PLAYER
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, PLAYERstruct& w, PLAYERstruct* def)
|
||||||
|
{
|
||||||
|
if (arc.BeginObject(keyname))
|
||||||
|
{
|
||||||
|
arc("x", w.posx)
|
||||||
|
("y", w.posy)
|
||||||
|
("z", w.posz)
|
||||||
|
("lv_sectnum", w.lv_sectnum)
|
||||||
|
("lv_x", w.lv_x)
|
||||||
|
("lv_y", w.lv_y)
|
||||||
|
("lv_z", w.lv_z)
|
||||||
|
("remote_sprite", w.remote_sprite)
|
||||||
|
("remote", w.remote)
|
||||||
|
("sop_remote", w.sop_remote)
|
||||||
|
("sop", w.sop)
|
||||||
|
("jump_count", w.jump_count)
|
||||||
|
("jump_speed", w.jump_speed)
|
||||||
|
("down_speed", w.down_speed)
|
||||||
|
("up_speed", w.up_speed)
|
||||||
|
("z_speed", w.z_speed)
|
||||||
|
("climb_ndx", w.climb_ndx)
|
||||||
|
("hiz", w.hiz)
|
||||||
|
("loz", w.loz)
|
||||||
|
("ceiling_dist", w.ceiling_dist)
|
||||||
|
("floor_dist", w.floor_dist)
|
||||||
|
("hi_sectp", w.hi_sectp)
|
||||||
|
("lo_sectp", w.lo_sectp)
|
||||||
|
("hi_sp", w.hi_sp)
|
||||||
|
("lo_sp", w.lo_sp)
|
||||||
|
("last_camera_sp", w.last_camera_sp)
|
||||||
|
("circle_camera_dist", w.circle_camera_dist)
|
||||||
|
("six", w.six)
|
||||||
|
("siy", w.siy)
|
||||||
|
("siz", w.siz)
|
||||||
|
("siang", w.siang)
|
||||||
|
("xvect", w.xvect)
|
||||||
|
("yvect", w.yvect)
|
||||||
|
("friction", w.friction)
|
||||||
|
("slide_xvect", w.slide_xvect)
|
||||||
|
("slide_yvect", w.slide_yvect)
|
||||||
|
("slide_ang", w.slide_ang)
|
||||||
|
("slide_dec", w.slide_dec)
|
||||||
|
("drive_avel", w.drive_avel)
|
||||||
|
("view_outside_dang", w.view_outside_dang)
|
||||||
|
("circle_camera_ang", w.circle_camera_ang)
|
||||||
|
("camera_check_time_delay", w.camera_check_time_delay)
|
||||||
|
("cursectnum", w.cursectnum)
|
||||||
|
("lastcursectnum", w.lastcursectnum)
|
||||||
|
("turn180_target", w.turn180_target)
|
||||||
|
("hvel", w.hvel)
|
||||||
|
("tilt", w.tilt)
|
||||||
|
("tilt_dest", w.tilt_dest)
|
||||||
|
("horizon", w.horizon)
|
||||||
|
("angle", w.angle)
|
||||||
|
("recoil_amt", w.recoil_amt)
|
||||||
|
("recoil_speed", w.recoil_speed)
|
||||||
|
("recoil_ndx", w.recoil_ndx)
|
||||||
|
("recoil_horizoff", w.recoil_horizoff)
|
||||||
|
("oldposx", w.oldposx)
|
||||||
|
("oldposy", w.oldposy)
|
||||||
|
("oldposz", w.oldposz)
|
||||||
|
("revolvex", w.RevolveX)
|
||||||
|
("revolvey", w.RevolveY)
|
||||||
|
("RevolveDeltaAng", w.RevolveDeltaAng)
|
||||||
|
("RevolveAng", w.RevolveAng)
|
||||||
|
("PlayerSprite", w.PlayerSprite)
|
||||||
|
("PlayerUnderSprite", w.PlayerUnderSprite)
|
||||||
|
("SpriteP", w.SpriteP)
|
||||||
|
("UnderSpriteP", w.UnderSpriteP)
|
||||||
|
("pnum", w.pnum)
|
||||||
|
("LadderSector", w.LadderSector)
|
||||||
|
("lx", w.lx)
|
||||||
|
("ly", w.ly)
|
||||||
|
("JumpDuration", w.JumpDuration)
|
||||||
|
("WadeDepth", w.WadeDepth)
|
||||||
|
("bob_amt", w.bob_amt)
|
||||||
|
("bob_ndx", w.bob_ndx)
|
||||||
|
("bcnt", w.bcnt)
|
||||||
|
("bob_z", w.bob_z)
|
||||||
|
("playerreadyflag", w.playerreadyflag)
|
||||||
|
("Flags", w.Flags)
|
||||||
|
("Flags2", w.Flags2)
|
||||||
|
("sop_control", w.sop_control)
|
||||||
|
("sop_riding", w.sop_riding)
|
||||||
|
.Array("HasKey", w.HasKey, countof(w.HasKey))
|
||||||
|
("SwordAng", w.SwordAng)
|
||||||
|
("WpnGotOnceFlags", w.WpnGotOnceFlags)
|
||||||
|
("WpnFlags", w.WpnFlags)
|
||||||
|
.Array("WpnAmmo", w.WpnAmmo, countof(w.WpnAmmo))
|
||||||
|
("WpnNum", w.WpnNum)
|
||||||
|
("pnum", w.pnum)
|
||||||
|
("panelnext", w.PanelSpriteList.Next)
|
||||||
|
("panelprev", w.PanelSpriteList.Prev)
|
||||||
|
("curwpn", w.CurWpn)
|
||||||
|
.Array("wpn", w.Wpn, countof(w.Wpn))
|
||||||
|
("WpnRocketType", w.WpnRocketType)
|
||||||
|
("WpnRocketHeat", w.WpnRocketHeat)
|
||||||
|
("WpnRocketNuke", w.WpnRocketNuke)
|
||||||
|
("WpnFlameType", w.WpnFlameType)
|
||||||
|
("WpnFirstType", w.WpnFirstType)
|
||||||
|
("WeaponType", w.WeaponType)
|
||||||
|
("FirePause", w.FirePause)
|
||||||
|
("InventoryNum", w.InventoryNum)
|
||||||
|
("InventoryBarTics", w.InventoryBarTics)
|
||||||
|
.Array("InventoryTics", w.InventoryTics, countof(w.InventoryTics))
|
||||||
|
.Array("InventoryPercent", w.InventoryPercent, countof(w.InventoryPercent))
|
||||||
|
.Array("InventoryAmount", w.InventoryAmount, countof(w.InventoryAmount))
|
||||||
|
.Array("InventoryActive", w.InventoryActive, countof(w.InventoryActive))
|
||||||
|
("DiveTics", w.DiveTics)
|
||||||
|
("DiveDamageTics", w.DiveDamageTics)
|
||||||
|
("DeathType", w.DeathType)
|
||||||
|
("Kills", w.Kills)
|
||||||
|
("Killer", w.Killer)
|
||||||
|
.Array("KilledPlayer", w.KilledPlayer, countof(w.KilledPlayer))
|
||||||
|
("SecretsFound", w.SecretsFound)
|
||||||
|
("Armor", w.Armor)
|
||||||
|
("MaxHealth", w.MaxHealth)
|
||||||
|
("UziShellLeftAlt", w.UziShellLeftAlt)
|
||||||
|
("UziShellRightAlt", w.UziShellRightAlt)
|
||||||
|
("TeamColor", w.TeamColor)
|
||||||
|
("FadeTics", w.FadeTics)
|
||||||
|
("FadeAmt", w.FadeAmt)
|
||||||
|
("NightVision", w.NightVision)
|
||||||
|
("IsAI", w.IsAI)
|
||||||
|
("NumFootPrints", w.NumFootPrints)
|
||||||
|
("WpnUziType", w.WpnUziType)
|
||||||
|
("WpnShotgunType", w.WpnShotgunType)
|
||||||
|
("WpnShotgunAuto", w.WpnShotgunAuto)
|
||||||
|
("WpnShotgunLastShell", w.WpnShotgunLastShell)
|
||||||
|
("WpnRailType", w.WpnRailType)
|
||||||
|
("Bloody", w.Bloody)
|
||||||
|
("InitingNuke", w.InitingNuke)
|
||||||
|
("TestNukeInit", w.TestNukeInit)
|
||||||
|
("NukeInitialized", w.NukeInitialized)
|
||||||
|
("FistAng", w.FistAng)
|
||||||
|
("WpnKungFuMove", w.WpnKungFuMove)
|
||||||
|
("HitBy", w.HitBy)
|
||||||
|
("Reverb", w.Reverb)
|
||||||
|
("Heads", w.Heads)
|
||||||
|
("PlayerVersion", w.PlayerVersion)
|
||||||
|
("cookieTime", w.cookieTime)
|
||||||
|
("WpnReloadState", w.WpnReloadState)
|
||||||
|
("keypressbits", w.KeyPressBits)
|
||||||
|
("chops", w.Chops);
|
||||||
|
|
||||||
|
SerializeCodePtr(arc, "DoPlayerAction", (void**)&w.DoPlayerAction);
|
||||||
|
arc.EndObject();
|
||||||
|
}
|
||||||
|
if (arc.isReading())
|
||||||
|
{
|
||||||
|
w.oposx = w.posx;
|
||||||
|
w.oposy = w.posx;
|
||||||
|
w.oposz = w.posx;
|
||||||
|
w.oz_speed = w.z_speed;
|
||||||
|
w.oxvect = w.xvect;
|
||||||
|
w.oyvect = w.yvect;
|
||||||
|
w.obob_z = w.bob_z;
|
||||||
|
w.input = {};
|
||||||
|
w.lastinput = {};
|
||||||
|
memset(w.cookieQuote, 0, sizeof(w.cookieQuote)); // no need to remember this.
|
||||||
|
w.StartColor = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
return arc;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
FSerializer& Serialize(FSerializer& arc, const char* keyname, SECTOR_OBJECTp& w, SECTOR_OBJECTp* def)
|
FSerializer& Serialize(FSerializer& arc, const char* keyname, SECTOR_OBJECTp& w, SECTOR_OBJECTp* def)
|
||||||
{
|
{
|
||||||
int ndx = w ? int(w - SectorObject) : -1;
|
int ndx = w ? int(w - SectorObject) : -1;
|
||||||
|
@ -431,57 +817,18 @@ void GameInterface::SerializeGameState(FSerializer& arc)
|
||||||
|
|
||||||
if (arc.BeginObject("state"))
|
if (arc.BeginObject("state"))
|
||||||
{
|
{
|
||||||
|
preSerializePanelSprites(arc);
|
||||||
SerializeUser(arc);
|
SerializeUser(arc);
|
||||||
|
arc("numplayers", numplayers)
|
||||||
|
.Array("players", Player, numplayers)
|
||||||
|
;
|
||||||
|
postSerializePanelSprites(arc);
|
||||||
arc.EndObject();
|
arc.EndObject();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int PanelSpriteToNdx(PLAYERp pp, PANEL_SPRITEp psprite)
|
|
||||||
{
|
|
||||||
short ndx = 0;
|
|
||||||
PANEL_SPRITEp psp=NULL, next=NULL;
|
|
||||||
|
|
||||||
TRAVERSE(&pp->PanelSpriteList, psp, next)
|
|
||||||
{
|
|
||||||
if (psp == psprite)
|
|
||||||
return ndx;
|
|
||||||
|
|
||||||
ndx++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// special case for pointing to the list head
|
|
||||||
if ((LIST)psprite == (LIST)&pp->PanelSpriteList)
|
|
||||||
return 9999;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PANEL_SPRITEp PanelNdxToSprite(PLAYERp pp, int ndx)
|
|
||||||
{
|
|
||||||
short count = 0;
|
|
||||||
PANEL_SPRITEp psp, next;
|
|
||||||
|
|
||||||
if (ndx == -1)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (ndx == 9999)
|
|
||||||
return (PANEL_SPRITEp)&pp->PanelSpriteList;
|
|
||||||
|
|
||||||
TRAVERSE(&pp->PanelSpriteList, psp, next)
|
|
||||||
{
|
|
||||||
if (count == ndx)
|
|
||||||
return psp;
|
|
||||||
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SaveSymDataInfo(MFILE_WRITE fil, void *ptr)
|
int SaveSymDataInfo(MFILE_WRITE fil, void *ptr)
|
||||||
{
|
{
|
||||||
saveddatasym sym;
|
saveddatasym sym;
|
||||||
|
@ -577,110 +924,6 @@ bool GameInterface::SaveGame()
|
||||||
|
|
||||||
MWRITE(&Skill,sizeof(Skill),1,fil);
|
MWRITE(&Skill,sizeof(Skill),1,fil);
|
||||||
|
|
||||||
MWRITE(&numplayers,sizeof(numplayers),1,fil);
|
|
||||||
|
|
||||||
//save players info
|
|
||||||
pp = &tp;
|
|
||||||
for (i = 0; i < numplayers; i++)
|
|
||||||
{
|
|
||||||
memcpy(&tp, &Player[i], sizeof(PLAYER));
|
|
||||||
|
|
||||||
// this does not point to global data - this is allocated link list based
|
|
||||||
// save this inside the structure
|
|
||||||
#if PANEL_SAVE
|
|
||||||
pp->CurWpn = (PANEL_SPRITEp)(intptr_t)PanelSpriteToNdx(&Player[i], pp->CurWpn);
|
|
||||||
for (ndx = 0; ndx < MAX_WEAPONS; ndx++)
|
|
||||||
pp->Wpn[ndx] = (PANEL_SPRITEp)(intptr_t)PanelSpriteToNdx(&Player[i], pp->Wpn[ndx]);
|
|
||||||
pp->Chops = (PANEL_SPRITEp)(intptr_t)PanelSpriteToNdx(&Player[i], pp->Chops);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MWRITE(&tp, sizeof(PLAYER),1,fil);
|
|
||||||
|
|
||||||
//////
|
|
||||||
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->remote_sprite);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->remote.sop_control);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->sop_remote);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->sop);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->hi_sectp);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->lo_sectp);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->hi_sp);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->lo_sp);
|
|
||||||
assert(!saveisshot);
|
|
||||||
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->last_camera_sp);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->SpriteP);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->UnderSpriteP);
|
|
||||||
assert(!saveisshot);
|
|
||||||
|
|
||||||
saveisshot |= SaveSymCodeInfo(fil, pp->DoPlayerAction);
|
|
||||||
assert(!saveisshot);
|
|
||||||
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->sop_control);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, pp->sop_riding);
|
|
||||||
assert(!saveisshot);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if PANEL_SAVE
|
|
||||||
// local copy
|
|
||||||
psp = &tpanel_sprite;
|
|
||||||
for (i = 0; i < numplayers; i++)
|
|
||||||
{
|
|
||||||
unsigned j;
|
|
||||||
pp = &Player[i];
|
|
||||||
ndx = 0;
|
|
||||||
|
|
||||||
TRAVERSE(&pp->PanelSpriteList, cur, next)
|
|
||||||
{
|
|
||||||
// this is a HEADER
|
|
||||||
MWRITE(&ndx, sizeof(ndx),1,fil);
|
|
||||||
|
|
||||||
memcpy(psp, cur, sizeof(PANEL_SPRITE));
|
|
||||||
|
|
||||||
// Panel Sprite - save in structure
|
|
||||||
psp->sibling = (PANEL_SPRITEp)(intptr_t)PanelSpriteToNdx(pp, cur->sibling);
|
|
||||||
MWRITE(psp, sizeof(PANEL_SPRITE),1,fil);
|
|
||||||
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, psp->PlayerP);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, psp->State);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, psp->RetractState);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, psp->PresentState);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, psp->ActionState);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, psp->RestState);
|
|
||||||
assert(!saveisshot);
|
|
||||||
saveisshot |= SaveSymCodeInfo(fil, psp->PanelSpriteFunc);
|
|
||||||
assert(!saveisshot);
|
|
||||||
|
|
||||||
for (j = 0; j < SIZ(psp->over); j++)
|
|
||||||
{
|
|
||||||
saveisshot |= SaveSymDataInfo(fil, psp->over[j].State);
|
|
||||||
assert(!saveisshot);
|
|
||||||
}
|
|
||||||
|
|
||||||
ndx++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// store -1 when done for player
|
|
||||||
ndx = -1;
|
|
||||||
MWRITE(&ndx, sizeof(ndx),1,fil);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//Sector User information
|
//Sector User information
|
||||||
for (i = 0; i < numsectors; i++)
|
for (i = 0; i < numsectors; i++)
|
||||||
{
|
{
|
||||||
|
@ -905,85 +1148,6 @@ bool GameInterface::LoadGame()
|
||||||
|
|
||||||
MREAD(&Skill,sizeof(Skill),1,fil);
|
MREAD(&Skill,sizeof(Skill),1,fil);
|
||||||
|
|
||||||
MREAD(&numplayers, sizeof(numplayers),1,fil);
|
|
||||||
|
|
||||||
//save players
|
|
||||||
//MREAD(Player,sizeof(PLAYER), numplayers,fil);
|
|
||||||
|
|
||||||
//save players info
|
|
||||||
|
|
||||||
for (auto& pp : Player)
|
|
||||||
{
|
|
||||||
pp.cookieTime = 0;
|
|
||||||
memset(pp.cookieQuote, 0, sizeof(pp.cookieQuote));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < numplayers; i++)
|
|
||||||
{
|
|
||||||
pp = &Player[i];
|
|
||||||
|
|
||||||
MREAD(pp, sizeof(*pp), 1, fil);
|
|
||||||
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->remote_sprite);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->remote.sop_control);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->sop_remote);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->sop);
|
|
||||||
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->hi_sectp);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->lo_sectp);
|
|
||||||
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->hi_sp);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->lo_sp);
|
|
||||||
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->last_camera_sp);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->SpriteP);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->UnderSpriteP);
|
|
||||||
saveisshot |= LoadSymCodeInfo(fil, (void **)&pp->DoPlayerAction);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->sop_control);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&pp->sop_riding);
|
|
||||||
if (saveisshot) { MCLOSE_READ(fil); return false; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if PANEL_SAVE
|
|
||||||
for (i = 0; i < numplayers; i++)
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
pp = &Player[i];
|
|
||||||
|
|
||||||
INITLIST(&pp->PanelSpriteList);
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
MREAD(&ndx, sizeof(ndx),1,fil);
|
|
||||||
|
|
||||||
if (ndx == -1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
psp = (PANEL_SPRITEp)CallocMem(sizeof(PANEL_SPRITE), 1);
|
|
||||||
ASSERT(psp);
|
|
||||||
|
|
||||||
MREAD(psp, sizeof(PANEL_SPRITE),1,fil);
|
|
||||||
INSERT_TAIL(&pp->PanelSpriteList,psp);
|
|
||||||
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&psp->PlayerP);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&psp->State);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&psp->RetractState);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&psp->PresentState);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&psp->ActionState);
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&psp->RestState);
|
|
||||||
saveisshot |= LoadSymCodeInfo(fil, (void **)&psp->PanelSpriteFunc);
|
|
||||||
if (saveisshot) { MCLOSE_READ(fil); return false; }
|
|
||||||
|
|
||||||
for (j = 0; j < (int)SIZ(psp->over); j++)
|
|
||||||
{
|
|
||||||
saveisshot |= LoadSymDataInfo(fil, (void **)&psp->over[j].State);
|
|
||||||
if (saveisshot) { MCLOSE_READ(fil); return false; }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//Sector User information
|
//Sector User information
|
||||||
for (i = 0; i < numsectors; i++)
|
for (i = 0; i < numsectors; i++)
|
||||||
|
@ -1149,28 +1313,6 @@ bool GameInterface::LoadGame()
|
||||||
MCLOSE_READ(fil);
|
MCLOSE_READ(fil);
|
||||||
|
|
||||||
|
|
||||||
//!!IMPORTANT - this POST stuff will not work here now becaus it does actual reads
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// POST processing of info MREAD in
|
|
||||||
//
|
|
||||||
|
|
||||||
#if PANEL_SAVE
|
|
||||||
for (i = 0; i < numplayers; i++)
|
|
||||||
{
|
|
||||||
pp = &Player[i];
|
|
||||||
TRAVERSE(&pp->PanelSpriteList, psp, next)
|
|
||||||
{
|
|
||||||
// dont need to set Next and Prev this was done
|
|
||||||
// when sprites were inserted
|
|
||||||
|
|
||||||
// sibling is the only PanelSprite (malloced ptr) in the PanelSprite struct
|
|
||||||
psp->sibling = PanelNdxToSprite(pp, (int)(intptr_t)psp->sibling);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DoTheCache();
|
DoTheCache();
|
||||||
|
|
||||||
// this is ok - just duplicating sector list with pointers
|
// this is ok - just duplicating sector list with pointers
|
||||||
|
@ -1180,21 +1322,6 @@ bool GameInterface::LoadGame()
|
||||||
sop->sectp[i] = §or[sop->sector[i]];
|
sop->sectp[i] = §or[sop->sector[i]];
|
||||||
}
|
}
|
||||||
|
|
||||||
//!!Again this will not work here
|
|
||||||
//restore players info
|
|
||||||
for (i = 0; i < numplayers; i++)
|
|
||||||
{
|
|
||||||
#if PANEL_SAVE
|
|
||||||
pp->CurWpn = PanelNdxToSprite(pp, (int)(intptr_t)pp->CurWpn);
|
|
||||||
|
|
||||||
for (ndx = 0; ndx < MAX_WEAPONS; ndx++)
|
|
||||||
pp->Wpn[ndx] = PanelNdxToSprite(pp, (int)(intptr_t)pp->Wpn[ndx]);
|
|
||||||
|
|
||||||
pp->Chops = PanelNdxToSprite(pp, (int)(intptr_t)pp->Chops);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
int SavePlayClock = PlayClock;
|
int SavePlayClock = PlayClock;
|
||||||
InitTimingVars();
|
InitTimingVars();
|
||||||
|
@ -1208,11 +1335,6 @@ bool GameInterface::LoadGame()
|
||||||
if (snd_ambience)
|
if (snd_ambience)
|
||||||
StartAmbientSound();
|
StartAmbientSound();
|
||||||
|
|
||||||
TRAVERSE_CONNECT(i)
|
|
||||||
{
|
|
||||||
Player[i].StartColor = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is not a new game
|
// this is not a new game
|
||||||
ShadowWarrior::NewGame = false;
|
ShadowWarrior::NewGame = false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue