mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-12 03:00:38 +00:00
Android savegame hacks. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4990 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
31b557ef61
commit
9a43465780
2 changed files with 205 additions and 45 deletions
|
@ -44,47 +44,55 @@ uint8_t g_oldverSavegame[MAXSAVEGAMES];
|
||||||
// mode: see enum in savegame.h
|
// mode: see enum in savegame.h
|
||||||
void G_Util_PtrToIdx(void *ptr, int32_t count, const void *base, int32_t mode)
|
void G_Util_PtrToIdx(void *ptr, int32_t count, const void *base, int32_t mode)
|
||||||
{
|
{
|
||||||
int32_t i;
|
|
||||||
intptr_t *iptr = (intptr_t *)ptr;
|
intptr_t *iptr = (intptr_t *)ptr;
|
||||||
intptr_t ibase = (intptr_t)base;
|
intptr_t const ibase = (intptr_t)base;
|
||||||
int32_t back_p = mode&P2I_BACK_BIT;
|
int32_t const onlynon0_p = mode&P2I_ONLYNON0_BIT;
|
||||||
int32_t onlynon0_p = mode&P2I_ONLYNON0_BIT;
|
|
||||||
|
|
||||||
// TODO: convert to proper offsets/indices for (a step towards) cross-
|
// TODO: convert to proper offsets/indices for (a step towards) cross-
|
||||||
// compatibility between 32- and 64-bit systems in the netplay.
|
// compatibility between 32- and 64-bit systems in the netplay.
|
||||||
// REMEMBER to bump BYTEVERSION then.
|
// REMEMBER to bump BYTEVERSION then.
|
||||||
|
|
||||||
for (i=0; i<count; i++)
|
|
||||||
// WARNING: C std doesn't say that bit pattern of NULL is necessarily 0!
|
// WARNING: C std doesn't say that bit pattern of NULL is necessarily 0!
|
||||||
if (!onlynon0_p || iptr[i])
|
if ((mode & P2I_BACK_BIT) == 0)
|
||||||
{
|
{
|
||||||
if (!back_p)
|
for (int i = 0; i < count; i++)
|
||||||
|
if (!onlynon0_p || iptr[i])
|
||||||
iptr[i] -= ibase;
|
iptr[i] -= ibase;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
if (!onlynon0_p || iptr[i])
|
||||||
iptr[i] += ibase;
|
iptr[i] += ibase;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void G_Util_PtrToIdx2(void *ptr, int32_t count, size_t stride, const void *base, int32_t mode)
|
void G_Util_PtrToIdx2(void *ptr, int32_t count, size_t stride, const void *base, int32_t mode)
|
||||||
{
|
{
|
||||||
int32_t i;
|
|
||||||
uint8_t *iptr = (uint8_t *)ptr;
|
uint8_t *iptr = (uint8_t *)ptr;
|
||||||
intptr_t ibase = (intptr_t)base;
|
intptr_t const ibase = (intptr_t)base;
|
||||||
int32_t back_p = mode&P2I_BACK_BIT;
|
int32_t const onlynon0_p = mode&P2I_ONLYNON0_BIT;
|
||||||
int32_t onlynon0_p = mode&P2I_ONLYNON0_BIT;
|
|
||||||
|
|
||||||
for (i=0; i<count; i++)
|
if ((mode & P2I_BACK_BIT) == 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
if (!onlynon0_p || *(intptr_t *)iptr)
|
if (!onlynon0_p || *(intptr_t *)iptr)
|
||||||
{
|
|
||||||
if (!back_p)
|
|
||||||
*(intptr_t *)iptr -= ibase;
|
*(intptr_t *)iptr -= ibase;
|
||||||
else
|
|
||||||
*(intptr_t *)iptr += ibase;
|
|
||||||
}
|
|
||||||
|
|
||||||
iptr += stride;
|
iptr += stride;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
if (!onlynon0_p || *(intptr_t *)iptr)
|
||||||
|
*(intptr_t *)iptr += ibase;
|
||||||
|
|
||||||
|
iptr += stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: sync with TROR special interpolations? (e.g. upper floor of subway)
|
// TODO: sync with TROR special interpolations? (e.g. upper floor of subway)
|
||||||
|
@ -356,12 +364,44 @@ 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else fclose(fil);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t G_SavePlayer(int32_t spot)
|
int32_t G_SavePlayer(int32_t spot)
|
||||||
{
|
{
|
||||||
char fn[16];
|
char fn[16];
|
||||||
// char mpfn[16];
|
|
||||||
FILE *fil;
|
FILE *fil;
|
||||||
|
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
G_SavePalette();
|
||||||
|
#endif
|
||||||
|
|
||||||
Bassert(spot < MAXSAVEGAMES);
|
Bassert(spot < MAXSAVEGAMES);
|
||||||
|
|
||||||
G_SaveTimers();
|
G_SaveTimers();
|
||||||
|
@ -493,23 +533,22 @@ static uint8_t savegame_comprthres;
|
||||||
|
|
||||||
static int32_t ds_getcnt(const dataspec_t *sp)
|
static int32_t ds_getcnt(const dataspec_t *sp)
|
||||||
{
|
{
|
||||||
switch (sp->flags&DS_CNTMASK)
|
int rv = -1;
|
||||||
|
|
||||||
|
switch (sp->flags & DS_CNTMASK)
|
||||||
{
|
{
|
||||||
case 0: return sp->cnt;
|
case 0: rv = sp->cnt; break;
|
||||||
case DS_CNT16: return *((int16_t *)sp->cnt);
|
case DS_CNT16: rv = *((int16_t *)sp->cnt); break;
|
||||||
case DS_CNT32: return *((int32_t *)sp->cnt);
|
case DS_CNT32: rv = *((int32_t *)sp->cnt); break;
|
||||||
default: return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ds_get(const dataspec_t *sp, void **ptr, int32_t *cnt)
|
static inline void ds_get(const dataspec_t *sp, void **ptr, int32_t *cnt)
|
||||||
{
|
{
|
||||||
*cnt = ds_getcnt(sp);
|
*cnt = ds_getcnt(sp);
|
||||||
|
*ptr = (sp->flags&DS_DYNAMIC) ? *((void **)sp->ptr) : sp->ptr;
|
||||||
if (sp->flags&DS_DYNAMIC)
|
|
||||||
*ptr = *((void **)sp->ptr);
|
|
||||||
else
|
|
||||||
*ptr = sp->ptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// write state to file and/or to dump
|
// write state to file and/or to dump
|
||||||
|
@ -1176,12 +1215,9 @@ static void sv_makevarspec()
|
||||||
|
|
||||||
void sv_freemem()
|
void sv_freemem()
|
||||||
{
|
{
|
||||||
if (svsnapshot)
|
DO_FREE_AND_NULL(svsnapshot);
|
||||||
Bfree(svsnapshot), svsnapshot=NULL;
|
DO_FREE_AND_NULL(svinitsnap);
|
||||||
if (svinitsnap)
|
DO_FREE_AND_NULL(svdiff);
|
||||||
Bfree(svinitsnap), svinitsnap=NULL;
|
|
||||||
if (svdiff)
|
|
||||||
Bfree(svdiff), svdiff=NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SV_AllocSnap(int32_t allocinit)
|
static void SV_AllocSnap(int32_t allocinit)
|
||||||
|
@ -1195,8 +1231,7 @@ static void SV_AllocSnap(int32_t allocinit)
|
||||||
svdiff = (uint8_t *)Xmalloc(svdiffsiz);
|
svdiff = (uint8_t *)Xmalloc(svdiffsiz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EDUKE32_STATIC_ASSERT(sizeof(savehead_t) == SAVEHEAD_SIZE);
|
||||||
EDUKE32_STATIC_ASSERT(sizeof(savehead_t) == 310);
|
|
||||||
|
|
||||||
// make snapshot only if spot < 0 (demo)
|
// make snapshot only if spot < 0 (demo)
|
||||||
int32_t sv_saveandmakesnapshot(FILE *fil, int8_t spot, int8_t recdiffsp, int8_t diffcompress, int8_t synccompress)
|
int32_t sv_saveandmakesnapshot(FILE *fil, int8_t spot, int8_t recdiffsp, int8_t diffcompress, int8_t synccompress)
|
||||||
|
@ -1259,6 +1294,10 @@ int32_t sv_saveandmakesnapshot(FILE *fil, int8_t spot, int8_t recdiffsp, int8_t
|
||||||
{
|
{
|
||||||
// savegame
|
// savegame
|
||||||
Bstrncpyz(h.savename, ud.savegame[spot], sizeof(h.savename));
|
Bstrncpyz(h.savename, ud.savegame[spot], sizeof(h.savename));
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
Bstrncpyz(h.volname, EpisodeNames[ud.volume_number], sizeof(h.volname));
|
||||||
|
Bstrncpyz(h.skillname, SkillNames[ud.player_skill], sizeof(h.skillname));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1332,8 +1371,7 @@ int32_t sv_saveandmakesnapshot(FILE *fil, int8_t spot, int8_t recdiffsp, int8_t
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EDUKE32_STATIC_ASSERT(sizeof(savehead_t) == SAVEHEAD_SIZE);
|
||||||
EDUKE32_STATIC_ASSERT(sizeof(savehead_t) == 310);
|
|
||||||
|
|
||||||
// if file is not an EDuke32 savegame/demo, h->headerstr will be all zeros
|
// 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(int32_t fil, int32_t spot, savehead_t *h)
|
||||||
|
@ -2116,3 +2154,111 @@ static void postloadplayer(int32_t savegamep)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////// END GENERIC SAVING/LOADING SYSTEM //////////
|
////////// END GENERIC SAVING/LOADING SYSTEM //////////
|
||||||
|
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
#include <jni.h>
|
||||||
|
#include <android/log.h>
|
||||||
|
|
||||||
|
#ifndef LOGI
|
||||||
|
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO,"DUKE", __VA_ARGS__))
|
||||||
|
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "DUKE", __VA_ARGS__))
|
||||||
|
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,"DUKE", __VA_ARGS__))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char const * G_GetStringFromSavegame(const char *filename, int type)
|
||||||
|
{
|
||||||
|
LOGI("getSavegameText %s", filename);
|
||||||
|
int32_t fil = kopen4load(filename, 0);
|
||||||
|
|
||||||
|
if (fil == -1)
|
||||||
|
{
|
||||||
|
LOGE("couldn't load %s", filename);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
savehead_t saveh;
|
||||||
|
|
||||||
|
int32_t i = sv_loadheader(fil, 0, &saveh);
|
||||||
|
|
||||||
|
if (i && (i != 2 && i != 3))
|
||||||
|
goto corrupt;
|
||||||
|
|
||||||
|
kclose(fil);
|
||||||
|
|
||||||
|
static char tempbuf[64];
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case 0: Bstrncpyz(tempbuf, saveh.savename, sizeof(saveh.savename) - 1); break;
|
||||||
|
case 1: Bstrncpyz(tempbuf, saveh.volname, sizeof(saveh.volname) - 1); break;
|
||||||
|
case 2: Bstrncpyz(tempbuf, saveh.skillname, sizeof(saveh.skillname) - 1); break;
|
||||||
|
}
|
||||||
|
return tempbuf;
|
||||||
|
|
||||||
|
corrupt:
|
||||||
|
kclose(fil);
|
||||||
|
LOGE("couldn't load %s", filename);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t G_GetScreenshotFromSavegame(const char *filename, char *pal, char *data)
|
||||||
|
{
|
||||||
|
LOGI("getSavegameScreenshot %s", filename);
|
||||||
|
|
||||||
|
int32_t fil = kopen4load(filename, 0);
|
||||||
|
|
||||||
|
if (fil == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
savehead_t saveh;
|
||||||
|
|
||||||
|
int32_t i = sv_loadheader(fil, 0, &saveh);
|
||||||
|
|
||||||
|
if (i && (i != 2 && i != 3))
|
||||||
|
goto corrupt;
|
||||||
|
|
||||||
|
int32_t screenshotofs;
|
||||||
|
|
||||||
|
if (kread(fil, &screenshotofs, 4) != 4)
|
||||||
|
goto corrupt;
|
||||||
|
|
||||||
|
if (screenshotofs)
|
||||||
|
{
|
||||||
|
if (kdfread(data, 320, 200, fil) != 200)
|
||||||
|
{
|
||||||
|
// OSD_Printf("G_LoadSaveHeaderNew(%d): failed reading screenshot\n", spot);
|
||||||
|
goto corrupt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
kclose(fil);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
kclose(fil);
|
||||||
|
|
||||||
|
char pstr[BMAX_PATH];
|
||||||
|
|
||||||
|
Bstrcpy(pstr, filename);
|
||||||
|
Bcorrectfilename(pstr, 1);
|
||||||
|
Bstrcat(pstr, "palette.dat");
|
||||||
|
|
||||||
|
int32_t pfil;
|
||||||
|
|
||||||
|
if ((pfil = kopen4load(pstr, 0)) == -1)
|
||||||
|
{
|
||||||
|
LOGE("couldn't load %s", pstr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
kread(pfil, pal, 768);
|
||||||
|
kclose(pfil);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
corrupt:
|
||||||
|
kclose(fil);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -55,10 +55,19 @@ typedef struct
|
||||||
uint8_t numplayers, volnum, levnum, skill;
|
uint8_t numplayers, volnum, levnum, skill;
|
||||||
char boardfn[BMAX_PATH];
|
char boardfn[BMAX_PATH];
|
||||||
// 282 bytes
|
// 282 bytes
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
char skillname[32], volname[32];
|
||||||
|
#endif
|
||||||
} savehead_t;
|
} savehead_t;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
EDUKE32_STATIC_ASSERT(sizeof(savehead_t) == 310);
|
#ifdef __ANDROID__
|
||||||
|
#define SAVEHEAD_SIZE 374
|
||||||
|
#else
|
||||||
|
#define SAVEHEAD_SIZE 310
|
||||||
|
#endif
|
||||||
|
|
||||||
|
EDUKE32_STATIC_ASSERT(sizeof(savehead_t) == SAVEHEAD_SIZE);
|
||||||
|
|
||||||
int32_t sv_updatestate(int32_t frominit);
|
int32_t sv_updatestate(int32_t frominit);
|
||||||
int32_t sv_readdiff(int32_t fil);
|
int32_t sv_readdiff(int32_t fil);
|
||||||
|
@ -102,6 +111,11 @@ extern const char *(*El_SerializeGamevars)(int32_t *slenptr, int32_t levelnum);
|
||||||
void El_FreeSaveCode(void);
|
void El_FreeSaveCode(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
char const * G_GetStringFromSavegame(const char *filename, int type);
|
||||||
|
int32_t G_GetScreenshotFromSavegame(const char *filename, char *pal, char *data);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue