2019-11-20 16:21:32 +00:00
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
/*
|
|
|
|
Copyright (C) 2010-2019 EDuke32 developers and contributors
|
|
|
|
Copyright (C) 2019 sirlemonhead, Nuke.YKT
|
|
|
|
This file is part of PCExhumed.
|
|
|
|
PCExhumed is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License version 2
|
|
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
//-------------------------------------------------------------------------
|
2019-11-22 23:11:37 +00:00
|
|
|
#include "ns.h"
|
2019-08-26 03:59:14 +00:00
|
|
|
#include "save.h"
|
|
|
|
#include <stdio.h>
|
2019-12-26 21:00:04 +00:00
|
|
|
#include <stdarg.h>
|
2019-12-26 22:17:11 +00:00
|
|
|
#include "init.h"
|
2019-12-27 16:07:09 +00:00
|
|
|
#include "music/z_music.h"
|
2019-11-13 20:06:48 +00:00
|
|
|
//#include <fcntl.h>
|
|
|
|
//#include <sys/stat.h>
|
|
|
|
//#include <io.h>
|
2019-08-26 03:59:14 +00:00
|
|
|
#include "engine.h"
|
2019-12-26 21:00:04 +00:00
|
|
|
#include "exhumed.h"
|
2019-12-26 22:17:11 +00:00
|
|
|
#include "mmulti.h"
|
2019-12-26 21:00:04 +00:00
|
|
|
#include "savegamehelp.h"
|
2019-12-27 21:17:36 +00:00
|
|
|
#include "sound.h"
|
2019-08-26 03:59:14 +00:00
|
|
|
|
2019-11-22 23:11:37 +00:00
|
|
|
BEGIN_PS_NS
|
|
|
|
|
2019-12-27 16:07:09 +00:00
|
|
|
extern int MenuExitCondition;
|
2019-12-27 09:52:40 +00:00
|
|
|
void SaveTextureState();
|
|
|
|
void LoadTextureState();
|
|
|
|
|
2019-12-26 22:17:11 +00:00
|
|
|
static TArray<SavegameHelper*> sghelpers(TArray<SavegameHelper*>::NoInit);
|
|
|
|
|
2019-12-27 09:52:40 +00:00
|
|
|
bool GameInterface::SaveGame(FSaveGameNode* sv)
|
2019-08-26 03:59:14 +00:00
|
|
|
{
|
2019-12-26 22:17:11 +00:00
|
|
|
for (auto sgh : sghelpers) sgh->Save();
|
2019-12-27 09:52:40 +00:00
|
|
|
SaveTextureState();
|
|
|
|
FinishSavegameWrite();
|
2019-08-31 07:47:15 +00:00
|
|
|
return 1; // CHECKME
|
2019-08-26 03:59:14 +00:00
|
|
|
}
|
|
|
|
|
2019-12-27 09:52:40 +00:00
|
|
|
bool GameInterface::LoadGame(FSaveGameNode* sv)
|
2019-08-26 03:59:14 +00:00
|
|
|
{
|
|
|
|
|
2019-12-26 22:17:11 +00:00
|
|
|
for (auto sgh : sghelpers) sgh->Load();
|
2019-12-27 09:52:40 +00:00
|
|
|
LoadTextureState();
|
|
|
|
FinishSavegameRead();
|
2019-12-26 22:17:11 +00:00
|
|
|
|
|
|
|
// reset the sky in case it hasn't been done yet.
|
|
|
|
psky_t* pSky = tileSetupSky(0);
|
|
|
|
pSky->tileofs[0] = 0;
|
|
|
|
pSky->tileofs[1] = 0;
|
|
|
|
pSky->tileofs[2] = 0;
|
|
|
|
pSky->tileofs[3] = 0;
|
|
|
|
pSky->yoffs = 256;
|
|
|
|
pSky->lognumtiles = 2;
|
|
|
|
pSky->horizfrac = 65536;
|
|
|
|
pSky->yscale = 65536;
|
|
|
|
parallaxtype = 2;
|
|
|
|
g_visibility = 2048;
|
|
|
|
ototalclock = totalclock;
|
2019-12-27 16:07:09 +00:00
|
|
|
MenuExitCondition = 6;
|
2019-12-27 21:17:36 +00:00
|
|
|
|
|
|
|
if (levelnum > 15)
|
|
|
|
{
|
|
|
|
nSwitchSound = 35;
|
|
|
|
nStoneSound = 23;
|
|
|
|
nElevSound = 51;
|
|
|
|
nStopSound = 35;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nSwitchSound = 33;
|
|
|
|
nStoneSound = 23;
|
|
|
|
nElevSound = 23;
|
|
|
|
nStopSound = 66;
|
|
|
|
}
|
|
|
|
|
2019-12-27 16:07:09 +00:00
|
|
|
Mus_ResumeSaved();
|
2019-08-31 07:47:15 +00:00
|
|
|
return 1; // CHECKME
|
2019-08-26 03:59:14 +00:00
|
|
|
}
|
|
|
|
|
2019-12-26 21:00:04 +00:00
|
|
|
|
|
|
|
SavegameHelper::SavegameHelper(const char* name, ...)
|
|
|
|
{
|
|
|
|
Name = name;
|
|
|
|
sghelpers.Push(this);
|
|
|
|
va_list ap;
|
|
|
|
va_start(ap, name);
|
|
|
|
for(;;)
|
|
|
|
{
|
|
|
|
void* addr = va_arg(ap, void*);
|
|
|
|
if (!addr) break;
|
|
|
|
size_t size = va_arg(ap, size_t);
|
|
|
|
Elements.Push(std::make_pair(addr, size));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SavegameHelper::Load()
|
|
|
|
{
|
|
|
|
auto fr = ReadSavegameChunk(Name);
|
|
|
|
for (auto& entry : Elements)
|
|
|
|
{
|
|
|
|
auto read = fr.Read(entry.first, entry.second);
|
|
|
|
if (read != entry.second) I_Error("Save game read error in %s", Name.GetChars());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void SavegameHelper::Save()
|
|
|
|
{
|
|
|
|
auto fw = WriteSavegameChunk(Name);
|
|
|
|
for (auto& entry : Elements)
|
|
|
|
{
|
|
|
|
auto write = fw->Write(entry.first, entry.second);
|
|
|
|
if (write != entry.second) I_Error("Save game write error in %s", Name.GetChars());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-22 23:11:37 +00:00
|
|
|
END_PS_NS
|