- refactored all file reading in the savegame code to the FileReader interface.

In this case a different open function is used because this is normally files on the hard drive and not assets, so being able to have a different setup for finding them is important.
This commit is contained in:
Christoph Oelckers 2019-10-20 21:04:55 +02:00
parent 7cacb7203f
commit 2be5727137
13 changed files with 147 additions and 164 deletions

View file

@ -37,7 +37,7 @@ BEGIN_RR_NS
char g_firstDemoFile[BMAX_PATH];
buildvfs_FILE g_demo_filePtr{}; // write
buildvfs_kfd g_demo_recFilePtr = buildvfs_kfd_invalid; // read
FileReader g_demo_recFilePtr;
int32_t g_demo_cnt;
int32_t g_demo_goalCnt=0;
@ -101,8 +101,8 @@ static int32_t G_OpenDemoRead(int32_t g_whichDemo) // 0 = mine
demofnptr = demofn;
}
g_demo_recFilePtr = kopen4loadfrommod(demofnptr, g_loadFromGroupOnly);
if (g_demo_recFilePtr == buildvfs_kfd_invalid)
g_demo_recFilePtr = fopenFileReader(demofnptr, g_loadFromGroupOnly);
if (!g_demo_recFilePtr.isOpen())
return 0;
Bassert(g_whichDemo >= 1);
@ -110,7 +110,7 @@ static int32_t G_OpenDemoRead(int32_t g_whichDemo) // 0 = mine
if (i)
{
OSD_Printf(OSD_ERROR "There were errors opening demo %d (code: %d).\n", g_whichDemo, i);
kclose(g_demo_recFilePtr); g_demo_recFilePtr = buildvfs_kfd_invalid;
g_demo_recFilePtr.Close();
return 0;
}
@ -147,8 +147,7 @@ void G_OpenDemoWrite(void)
if (ud.recstat == 2)
{
kclose(g_demo_recFilePtr);
g_demo_recFilePtr = buildvfs_kfd_invalid;
g_demo_recFilePtr.Close();
}
if ((g_player[myconnectindex].ps->gm&MODE_GAME) && g_player[myconnectindex].ps->dead_flag)
@ -329,13 +328,13 @@ static int32_t Demo_ReadSync(int32_t errcode)
uint16_t si;
int32_t i;
if (kread(g_demo_recFilePtr, &si, sizeof(uint16_t)) != sizeof(uint16_t))
if (g_demo_recFilePtr.Read(&si, sizeof(uint16_t)) != sizeof(uint16_t))
return errcode;
i = si;
if (demo_hasseeds)
{
if (kread(g_demo_recFilePtr, g_demo_seedbuf, i) != i)
if (g_demo_recFilePtr.Read(g_demo_seedbuf, i) != i)
return errcode;
}
@ -348,7 +347,7 @@ static int32_t Demo_ReadSync(int32_t errcode)
{
int32_t bytes = sizeof(input_t)*i;
if (kread(g_demo_recFilePtr, recsync, bytes) != bytes)
if (g_demo_recFilePtr.Read(recsync, bytes) != bytes)
return errcode+2;
}
@ -527,7 +526,7 @@ RECHECK:
g_player[myconnectindex].ps->gm &= ~MODE_GAME;
g_player[myconnectindex].ps->gm |= MODE_DEMO;
lastsyncofs = ktell(g_demo_recFilePtr);
lastsyncofs = g_demo_recFilePtr.Tell();
initsyncofs = lastsyncofs;
lastsynctic = g_demo_cnt;
lastsyncclock = (int32_t) totalclock;
@ -583,8 +582,8 @@ RECHECK:
if (Demo_UpdateState(0)==0)
{
g_demo_cnt = lastsynctic;
klseek(g_demo_recFilePtr, lastsyncofs, SEEK_SET);
ud.reccnt = 0;
g_demo_recFilePtr.Seek(lastsyncofs, FileReader::SeekSet);
ud.reccnt = 0;
totalclock = ototalclock = lockclock = lastsyncclock;
}
@ -595,8 +594,8 @@ RECHECK:
// update to initial state
if (Demo_UpdateState(1) == 0)
{
klseek(g_demo_recFilePtr, initsyncofs, SEEK_SET);
g_levelTextTime = 0;
g_demo_recFilePtr.Seek(initsyncofs, FileReader::SeekSet);
g_levelTextTime = 0;
g_demo_cnt = 1;
ud.reccnt = 0;
@ -634,7 +633,7 @@ RECHECK:
bigi = 0;
//reread:
if (kread(g_demo_recFilePtr, tmpbuf, 4) != 4)
if (g_demo_recFilePtr.Read(tmpbuf, 4) != 4)
CORRUPT(2);
if (Bmemcmp(tmpbuf, "sYnC", 4)==0)
@ -655,11 +654,11 @@ RECHECK:
}
else
{
lastsyncofs = ktell(g_demo_recFilePtr);
lastsyncofs = g_demo_recFilePtr.Tell();
lastsynctic = g_demo_cnt;
lastsyncclock = (int32_t) totalclock;
if (kread(g_demo_recFilePtr, tmpbuf, 4) != 4)
if (g_demo_recFilePtr.Read(tmpbuf, 4) != 4)
CORRUPT(7);
if (Bmemcmp(tmpbuf, "sYnC", 4))
CORRUPT(8);
@ -690,7 +689,7 @@ nextdemo:
nextdemo_nomenu:
foundemo = 0;
ud.reccnt = 0;
kclose(g_demo_recFilePtr); g_demo_recFilePtr = buildvfs_kfd_invalid;
g_demo_recFilePtr.Close();
if (g_demo_goalCnt>0)
{
@ -957,7 +956,7 @@ nextdemo_nomenu:
#if KRANDDEBUG
krd_print("krandplay.log");
#endif
kclose(g_demo_recFilePtr); g_demo_recFilePtr = buildvfs_kfd_invalid;
g_demo_recFilePtr.Close();
}
return 0;
@ -965,7 +964,7 @@ nextdemo_nomenu:
}
ud.multimode = numplayers; // fixes 2 infinite loops after watching demo
kclose(g_demo_recFilePtr); g_demo_recFilePtr = buildvfs_kfd_invalid;
g_demo_recFilePtr.Close();
Demo_FinishProfile();

View file

@ -24,6 +24,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define demo_h_
#include "compat.h"
#include "files.h"
BEGIN_RR_NS
@ -46,7 +47,7 @@ extern int32_t demorec_synccompress_cvar;
extern int32_t g_demo_cnt;
extern int32_t g_demo_goalCnt;
extern int32_t g_demo_paused;
extern int32_t g_demo_recFilePtr;
extern FileReader g_demo_recFilePtr;
extern int32_t g_demo_rewind;
extern int32_t g_demo_showStats;
extern int32_t g_demo_totalCnt;

View file

@ -151,8 +151,8 @@ static void ReadSaveGameHeaders_CACHE1D(CACHE1D_FIND_REC *f)
for (; f != nullptr; f = f->next)
{
char const * fn = f->name;
int32_t fil = kopen4loadfrommod(fn, 0);
if (fil == -1)
auto fil = fopenFileReader(fn, 0);
if (!fil.isOpen())
continue;
menusave_t & msv = g_internalsaves[g_numinternalsaves];
@ -178,8 +178,6 @@ static void ReadSaveGameHeaders_CACHE1D(CACHE1D_FIND_REC *f)
}
else
msv.isUnreadable = 1;
kclose(fil);
}
}
@ -282,8 +280,8 @@ void ReadSaveGameHeaders(void)
int32_t G_LoadSaveHeaderNew(char const *fn, savehead_t *saveh)
{
int32_t fil = kopen4loadfrommod(fn, 0);
if (fil == -1)
auto fil = fopenFileReader(fn, 0);
if (!fil.isOpen())
return -1;
int32_t i = sv_loadheader(fil, 0, saveh);
@ -291,7 +289,7 @@ int32_t G_LoadSaveHeaderNew(char const *fn, savehead_t *saveh)
goto corrupt;
int32_t screenshotofs;
if (kread(fil, &screenshotofs, 4) != 4)
if (fil.Read(&screenshotofs, 4) != 4)
goto corrupt;
TileFiles.tileCreate(TILE_LOADSHOT, 200, 320);
@ -309,11 +307,9 @@ int32_t G_LoadSaveHeaderNew(char const *fn, savehead_t *saveh)
}
tileInvalidate(TILE_LOADSHOT, 0, 255);
kclose(fil);
return 0;
corrupt:
kclose(fil);
return 1;
}
@ -326,9 +322,9 @@ static int different_user_map;
// XXX: keyboard input 'blocked' after load fail? (at least ESC?)
int32_t G_LoadPlayer(savebrief_t & sv)
{
int const fil = kopen4loadfrommod(sv.path, 0);
auto fil = fopenFileReader(sv.path, 0);
if (fil == -1)
if (!fil.isOpen())
return -1;
ready2send = 0;
@ -343,7 +339,6 @@ int32_t G_LoadPlayer(savebrief_t & sv)
else if (h.numplayers != ud.multimode)
P_DoQuote(QUOTE_SAVE_BAD_PLAYERS, g_player[myconnectindex].ps);
kclose(fil);
ototalclock = totalclock;
ready2send = 1;
@ -405,7 +400,6 @@ int32_t G_LoadPlayer(savebrief_t & sv)
}
sv_postudload(); // ud.m_XXX = ud.XXX
kclose(fil);
return 0;
}
@ -437,36 +431,6 @@ static void G_RestoreTimers(void)
//////////
#ifdef __ANDROID__
static void G_SavePalette(void)
{
int32_t pfil;
if ((pfil = kopen4load("palette.dat", 0)) != -1)
{
int len = kfilelength(pfil);
FILE *fil = fopen("palette.dat", "rb");
if (!fil)
{
fil = fopen("palette.dat", "wb");
if (fil)
{
char *buf = (char *) Xaligned_alloc(16, len);
kread(pfil, buf, len);
fwrite(buf, len, 1, fil);
fclose(fil);
Bfree(buf);
}
}
else fclose(fil);
}
}
#endif
void G_DeleteSave(savebrief_t const & sv)
{
@ -735,14 +699,14 @@ static uint8_t *writespecdata(const dataspec_t *spec, FILE *fil, uint8_t *dump)
// (fil>=0 && havedump): first restore dump from file, then restore state from dump
// (fil<0 && havedump): only restore state from dump
// (fil>=0 && !havedump): only restore state from file
static int32_t readspecdata(const dataspec_t *spec, int32_t fil, uint8_t **dumpvar)
static int32_t readspecdata(const dataspec_t *spec, FileReader *fil, uint8_t **dumpvar)
{
uint8_t * dump = dumpvar ? *dumpvar : NULL;
auto const sptr = spec;
for (; spec->flags != DS_END; spec++)
{
if (fil < 0 && spec->flags & (DS_NOCHK|DS_STRING|DS_CMP)) // we're updating
if (fil == nullptr && spec->flags & (DS_NOCHK|DS_STRING|DS_CMP)) // we're updating
continue;
if (spec->flags & (DS_LOADFN|DS_SAVEFN))
@ -756,7 +720,7 @@ static int32_t readspecdata(const dataspec_t *spec, int32_t fil, uint8_t **dumpv
{
static char cmpstrbuf[32];
int const siz = (spec->flags & DS_STRING) ? Bstrlen((const char *)spec->ptr) : spec->size * spec->cnt;
int const ksiz = kread(fil, cmpstrbuf, siz);
int const ksiz = fil->Read(cmpstrbuf, siz);
if (ksiz != siz || Bmemcmp(spec->ptr, cmpstrbuf, siz))
{
@ -786,12 +750,12 @@ static int32_t readspecdata(const dataspec_t *spec, int32_t fil, uint8_t **dumpv
if (!ptr || !cnt)
continue;
if (fil >= 0)
if (fil->isOpen())
{
auto const mem = (dump && (spec->flags & DS_NOCHK) == 0) ? dump : (uint8_t *)ptr;
bool const comp = !((spec->flags & DS_CNTMASK) == 0 && spec->size * cnt <= savegame_comprthres);
int const siz = comp ? cnt : cnt * spec->size;
int const ksiz = comp ? kdfread_LZ4(mem, spec->size, siz, fil) : kread(fil, mem, siz);
int const ksiz = comp ? kdfread_LZ4(mem, spec->size, siz, *fil) : fil->Read(mem, siz);
if (ksiz != siz)
{
@ -1318,7 +1282,7 @@ static const dataspec_t svgm_anmisc[] =
};
static uint8_t *dosaveplayer2(FILE *fil, uint8_t *mem);
static int32_t doloadplayer2(int32_t fil, uint8_t **memptr);
static int32_t doloadplayer2(FileReader &fil, uint8_t **memptr);
static void postloadplayer(int32_t savegamep);
// SVGM snapshot system
@ -1463,11 +1427,11 @@ int32_t sv_saveandmakesnapshot(FILE *fil, char const *name, int8_t spot, int8_t
}
// if file is not an EDuke32 savegame/demo, h->headerstr will be all zeros
int32_t sv_loadheader(int32_t fil, int32_t spot, savehead_t *h)
int32_t sv_loadheader(FileReader &fil, int32_t spot, savehead_t *h)
{
int32_t havedemo = (spot < 0);
if (kread(fil, h, sizeof(savehead_t)) != sizeof(savehead_t))
if (fil.Read(h, sizeof(savehead_t)) != sizeof(savehead_t))
{
OSD_Printf("%s %d header corrupt.\n", havedemo ? "Demo":"Savegame", havedemo ? -spot : spot);
Bmemset(h->headerstr, 0, sizeof(h->headerstr));
@ -1523,7 +1487,7 @@ int32_t sv_loadheader(int32_t fil, int32_t spot, savehead_t *h)
return 0;
}
int32_t sv_loadsnapshot(int32_t fil, int32_t spot, savehead_t *h)
int32_t sv_loadsnapshot(FileReader &fil, int32_t spot, savehead_t *h)
{
uint8_t *p;
int32_t i;
@ -1546,14 +1510,14 @@ int32_t sv_loadsnapshot(int32_t fil, int32_t spot, savehead_t *h)
OSD_Printf("sv_loadsnapshot: snapshot size: %d bytes.\n", h->snapsiz);
#endif
if (kread(fil, &i, 4) != 4)
if (fil.Read(&i, 4) != 4)
{
OSD_Printf("sv_snapshot: couldn't read 4 bytes after header.\n");
return 7;
}
if (i > 0)
{
if (klseek(fil, i, SEEK_SET) != i)
if (fil.Seek(i, FileReader::SeekSet) != i)
{
OSD_Printf("sv_snapshot: failed skipping over the screenshot.\n");
return 8;
@ -1633,11 +1597,11 @@ uint32_t sv_writediff(FILE *fil)
return diffsiz;
}
int32_t sv_readdiff(int32_t fil)
int32_t sv_readdiff(FileReader &fil)
{
int32_t diffsiz;
if (kread(fil, &diffsiz, sizeof(uint32_t)) != sizeof(uint32_t))
if (fil.Read(&diffsiz, sizeof(uint32_t)) != sizeof(uint32_t))
return -1;
if (savegame_diffcompress)
@ -1647,7 +1611,7 @@ int32_t sv_readdiff(int32_t fil)
}
else
{
if (kread(fil, svdiff, diffsiz) != diffsiz)
if (fil.Read(svdiff, diffsiz) != diffsiz)
return -2;
}
@ -1828,20 +1792,20 @@ static uint8_t *dosaveplayer2(FILE *fil, uint8_t *mem)
return mem;
}
static int32_t doloadplayer2(int32_t fil, uint8_t **memptr)
static int32_t doloadplayer2(FileReader &fil, uint8_t **memptr)
{
uint8_t *mem = memptr ? *memptr : NULL;
#ifdef DEBUGGINGAIDS
uint8_t *tmem=mem;
int32_t t=timerGetTicks();
#endif
if (readspecdata(svgm_udnetw, fil, &mem)) return -2;
if (readspecdata(svgm_udnetw, &fil, &mem)) return -2;
PRINTSIZE("ud");
if (readspecdata(svgm_secwsp, fil, &mem)) return -4;
if (readspecdata(svgm_secwsp, &fil, &mem)) return -4;
PRINTSIZE("sws");
if (readspecdata(svgm_script, fil, &mem)) return -5;
if (readspecdata(svgm_script, &fil, &mem)) return -5;
PRINTSIZE("script");
if (readspecdata(svgm_anmisc, fil, &mem)) return -6;
if (readspecdata(svgm_anmisc, &fil, &mem)) return -6;
PRINTSIZE("animisc");
if (memptr)
@ -1856,10 +1820,10 @@ int32_t sv_updatestate(int32_t frominit)
if (frominit)
Bmemcpy(svsnapshot, svinitsnap, svsnapsiz);
if (readspecdata(svgm_udnetw, -1, &p)) return -2;
if (readspecdata(svgm_secwsp, -1, &p)) return -4;
if (readspecdata(svgm_script, -1, &p)) return -5;
if (readspecdata(svgm_anmisc, -1, &p)) return -6;
if (readspecdata(svgm_udnetw, nullptr, &p)) return -2;
if (readspecdata(svgm_secwsp, nullptr, &p)) return -4;
if (readspecdata(svgm_script, nullptr, &p)) return -5;
if (readspecdata(svgm_anmisc, nullptr, &p)) return -6;
if (p != pbeg+svsnapsiz)
{

View file

@ -111,10 +111,10 @@ extern menusave_t * g_menusaves;
extern uint16_t g_nummenusaves;
int32_t sv_updatestate(int32_t frominit);
int32_t sv_readdiff(int32_t fil);
int32_t sv_readdiff(FileReader &fil);
uint32_t sv_writediff(FILE *fil);
int32_t sv_loadheader(int32_t fil, int32_t spot, savehead_t *h);
int32_t sv_loadsnapshot(int32_t fil, int32_t spot, savehead_t *h);
int32_t sv_loadheader(FileReader& fil, int32_t spot, savehead_t* h);
int32_t sv_loadsnapshot(FileReader& fil, int32_t spot, savehead_t* h);
int32_t sv_saveandmakesnapshot(FILE *fil, char const *name, int8_t spot, int8_t recdiffsp, int8_t diffcompress, int8_t synccompress, bool isAutoSave = false);
void sv_freemem();
void G_DeleteSave(savebrief_t const & sv);

View file

@ -1540,17 +1540,10 @@ void G_DisplayLogo(void)
if (!I_CheckAllInput() && g_noLogoAnim == 0)
{
int32_t i;
Net_GetPackets();
i = kopen4loadfrommod("3dr.ivf", 0);
if (i == -1)
i = kopen4loadfrommod("3dr.anm", 0);
if (i != -1)
if (testkopen("3dr.ivf", 0) || testkopen("3dr.anm", 0))
{
kclose(i);
Anim_Play("3dr.anm");
G_FadePalette(0, 0, 0, 252);
I_ClearAllInput();