ext updates

git-svn-id: https://svn.eduke32.com/eduke32@7901 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2019-08-07 22:36:16 +00:00 committed by Christoph Oelckers
parent 091a2961ab
commit 4523515a33
6 changed files with 80 additions and 31 deletions

View file

@ -158,6 +158,7 @@ enum GameEvent_t {
EVENT_DAMAGECEILING, EVENT_DAMAGECEILING,
EVENT_DISPLAYROOMSCAMERATILE, EVENT_DISPLAYROOMSCAMERATILE,
EVENT_RESETGOTPICS, EVENT_RESETGOTPICS,
EVENT_VALIDATESTART,
#ifdef LUNATIC #ifdef LUNATIC
EVENT_ANIMATEALLSPRITES, EVENT_ANIMATEALLSPRITES,
#endif #endif

View file

@ -989,6 +989,7 @@ const char *EventNames[MAXEVENTS] =
"EVENT_DAMAGECEILING", "EVENT_DAMAGECEILING",
"EVENT_DISPLAYROOMSCAMERATILE", "EVENT_DISPLAYROOMSCAMERATILE",
"EVENT_RESETGOTPICS", "EVENT_RESETGOTPICS",
"EVENT_VALIDATESTART",
#ifdef LUNATIC #ifdef LUNATIC
"EVENT_ANIMATEALLSPRITES", "EVENT_ANIMATEALLSPRITES",
#endif #endif

View file

@ -77,9 +77,13 @@ static void mgametext(int32_t x, int32_t y, char const * t)
G_ScreenText(MF_Bluefont.tilenum, x, y, MF_Bluefont.zoom, 0, 0, t, 0, MF_Bluefont.pal, 2|8|16|ROTATESPRITE_FULL16, 0, MF_Bluefont.emptychar.x, MF_Bluefont.emptychar.y, MF_Bluefont.between.x, MF_Bluefont.between.y, MF_Bluefont.textflags, 0, 0, xdim-1, ydim-1); G_ScreenText(MF_Bluefont.tilenum, x, y, MF_Bluefont.zoom, 0, 0, t, 0, MF_Bluefont.pal, 2|8|16|ROTATESPRITE_FULL16, 0, MF_Bluefont.emptychar.x, MF_Bluefont.emptychar.y, MF_Bluefont.between.x, MF_Bluefont.between.y, MF_Bluefont.textflags, 0, 0, xdim-1, ydim-1);
} }
static vec2_t mgametextcenterat(int32_t x, int32_t y, char const * t, int32_t f = 0)
{
return G_ScreenText(MF_Bluefont.tilenum, x, y, MF_Bluefont.zoom, 0, 0, t, 0, MF_Bluefont.pal, 2|8|16|ROTATESPRITE_FULL16, 0, MF_Bluefont.emptychar.x, MF_Bluefont.emptychar.y, MF_Bluefont.between.x, MF_Bluefont.between.y, MF_Bluefont.textflags|f|TEXT_XCENTER, 0, 0, xdim-1, ydim-1);
}
static vec2_t mgametextcenter(int32_t x, int32_t y, char const * t, int32_t f = 0) static vec2_t mgametextcenter(int32_t x, int32_t y, char const * t, int32_t f = 0)
{ {
return G_ScreenText(MF_Bluefont.tilenum, (MENU_MARGIN_CENTER<<16) + x, y, MF_Bluefont.zoom, 0, 0, t, 0, MF_Bluefont.pal, 2|8|16|ROTATESPRITE_FULL16, 0, MF_Bluefont.emptychar.x, MF_Bluefont.emptychar.y, MF_Bluefont.between.x, MF_Bluefont.between.y, MF_Bluefont.textflags|f|TEXT_XCENTER, 0, 0, xdim-1, ydim-1); return mgametextcenterat((MENU_MARGIN_CENTER<<16) + x, y, t, f);
} }
#define mminitext(x,y,t,p) minitext_(x, y, t, 0, p, 2|8|16|ROTATESPRITE_FULL16) #define mminitext(x,y,t,p) minitext_(x, y, t, 0, p, 2|8|16|ROTATESPRITE_FULL16)
@ -2224,22 +2228,24 @@ static void Menu_PreDraw(MenuID_t cm, MenuEntry_t *entry, const vec2_t origin)
if (msv.brief.isValid()) if (msv.brief.isValid())
{ {
if (waloff[TILE_LOADSHOT]) if (waloff[TILE_LOADSHOT])
rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536>>1,512,TILE_LOADSHOT,-32,0,4+10+64); rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536>>1,512,TILE_LOADSHOT, msv.isOldVer?16:-32, 0,4+10+64);
if (msv.isOldVer) if (msv.isOldVer)
{ {
menutext_centeralign(origin.x + (101<<16), origin.y + (97<<16), "Previous\nVersion"); mgametextcenterat(origin.x + (101<<16), origin.y + (50<<16),
msv.brief.isExt ? "Previous Version,\nSequence Point Available" : "Previous Version,\nUnable to Load");
#ifndef EDUKE32_SIMPLE_MENU #ifndef EDUKE32_SIMPLE_MENU
Bsprintf(tempbuf,"Saved: %d.%d.%d.%u %d-bit", savehead.majorver, savehead.minorver, Bsprintf(tempbuf,"Saved: %d.%d.%d.%u %d-bit", savehead.majorver, savehead.minorver,
savehead.bytever, savehead.userbytever, 8*savehead.getPtrSize()); savehead.bytever, savehead.userbytever, 8*savehead.getPtrSize());
mgametext(origin.x + (31<<16), origin.y + (104<<16), tempbuf); mgametext(origin.x + (25<<16), origin.y + (124<<16), tempbuf);
Bsprintf(tempbuf,"Our: %d.%d.%d.%u %d-bit", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION, Bsprintf(tempbuf,"Our: %d.%d.%d.%u %d-bit", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION,
ud.userbytever, (int32_t)(8*sizeof(intptr_t))); ud.userbytever, (int32_t)(8*sizeof(intptr_t)));
mgametext(origin.x + ((31+16)<<16), origin.y + (114<<16), tempbuf); mgametext(origin.x + ((25+16)<<16), origin.y + (134<<16), tempbuf);
#endif #endif
break; if (msv.isUnreadable)
break;
} }
if (savehead.numplayers > 1) if (savehead.numplayers > 1)
@ -2282,25 +2288,26 @@ static void Menu_PreDraw(MenuID_t cm, MenuEntry_t *entry, const vec2_t origin)
rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536L>>1,512,TILE_SAVESHOT,-32,0,4+10+64); rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536L>>1,512,TILE_SAVESHOT,-32,0,4+10+64);
else if (0 < M_SAVE.currentEntry && M_SAVE.currentEntry <= (int32_t)g_nummenusaves) else if (0 < M_SAVE.currentEntry && M_SAVE.currentEntry <= (int32_t)g_nummenusaves)
{ {
if (g_menusaves[M_SAVE.currentEntry-1].brief.isValid()) menusave_t & msv = g_menusaves[M_SAVE.currentEntry-1];
if (msv.brief.isValid())
{ {
if (waloff[TILE_LOADSHOT]) if (waloff[TILE_LOADSHOT])
rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536L>>1,512,TILE_LOADSHOT,-32,0,4+10+64); rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536>>1,512,TILE_LOADSHOT, msv.isOldVer?16:-32, 0,4+10+64);
if (g_menusaves[M_SAVE.currentEntry-1].isOldVer) if (msv.isOldVer)
{ {
menutext_centeralign(origin.x + (101<<16), origin.y + (97<<16), "Previous\nVersion"); mgametextcenterat(origin.x + (101<<16), origin.y + (50<<16),
msv.brief.isExt ? "Previous Version,\nSequence Point Available" : "Previous Version,\nUnable to Load");
#ifndef EDUKE32_SIMPLE_MENU #ifndef EDUKE32_SIMPLE_MENU
Bsprintf(tempbuf,"Saved: %d.%d.%d.%u %d-bit", savehead.majorver, savehead.minorver, Bsprintf(tempbuf,"Saved: %d.%d.%d.%u %d-bit", savehead.majorver, savehead.minorver,
savehead.bytever, savehead.userbytever, 8*savehead.getPtrSize()); savehead.bytever, savehead.userbytever, 8*savehead.getPtrSize());
mgametext(origin.x + (31<<16), origin.y + (104<<16), tempbuf); mgametext(origin.x + (25<<16), origin.y + (124<<16), tempbuf);
Bsprintf(tempbuf,"Our: %d.%d.%d.%u %d-bit", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION, Bsprintf(tempbuf,"Our: %d.%d.%d.%u %d-bit", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION,
ud.userbytever, (int32_t)(8*sizeof(intptr_t))); ud.userbytever, (int32_t)(8*sizeof(intptr_t)));
mgametext(origin.x + ((31+16)<<16), origin.y + (114<<16), tempbuf); mgametext(origin.x + ((25+16)<<16), origin.y + (134<<16), tempbuf);
#endif #endif
break;
} }
} }
} }

View file

@ -5640,7 +5640,7 @@ HORIZONLY:;
#define SJSON_IMPLEMENT #define SJSON_IMPLEMENT
#include "sjson.h" #include "sjson.h"
int portableBackupSave(const char * path) int portableBackupSave(const char * path, int volume, int level)
{ {
if (!FURY) if (!FURY)
return 0; return 0;
@ -5662,8 +5662,8 @@ int portableBackupSave(const char * path)
sjson_node * root = sjson_mkobject(ctx); sjson_node * root = sjson_mkobject(ctx);
// sjson_put_string(ctx, root, "map", currentboardfilename); // sjson_put_string(ctx, root, "map", currentboardfilename);
sjson_put_int(ctx, root, "volume", ud.last_stateless_volume); sjson_put_int(ctx, root, "volume", volume);
sjson_put_int(ctx, root, "level", ud.last_stateless_level); sjson_put_int(ctx, root, "level", level);
sjson_put_int(ctx, root, "skill", ud.player_skill); sjson_put_int(ctx, root, "skill", ud.player_skill);
{ {

View file

@ -426,6 +426,6 @@ static inline int P_Get(int32_t spriteNum) { return P_GetP((uspriteptr_t)&sprite
} }
#endif #endif
extern int portableBackupSave(const char *); extern int portableBackupSave(const char *, int, int);
#endif #endif

View file

@ -173,11 +173,11 @@ static void ReadSaveGameHeaders_CACHE1D(CACHE1D_FIND_REC *f)
{ {
char extfn[BMAX_PATH]; char extfn[BMAX_PATH];
snprintf(extfn, ARRAY_SIZE(extfn), "%s.ext", fn); snprintf(extfn, ARRAY_SIZE(extfn), "%s.ext", fn);
buildvfs_kfd fil = kopen4loadfrommod(extfn, 0); buildvfs_kfd extfil = kopen4loadfrommod(extfn, 0);
if (fil != buildvfs_kfd_invalid) if (extfil != buildvfs_kfd_invalid)
{ {
msv.brief.isExt = 1; msv.brief.isExt = 1;
kclose(fil); kclose(extfil);
} }
} }
} }
@ -325,6 +325,17 @@ int32_t G_LoadSaveHeaderNew(char const *fn, savehead_t *saveh)
OSD_Printf("G_LoadSaveHeaderNew(): failed reading screenshot in \"%s\"\n", fn); OSD_Printf("G_LoadSaveHeaderNew(): failed reading screenshot in \"%s\"\n", fn);
goto corrupt; goto corrupt;
} }
#if 0
// debug code to dump the screenshot
char scrbuf[BMAX_PATH];
if (G_ModDirSnprintf(scrbuf, sizeof(scrbuf), "%s.raw", fn) == 0)
{
buildvfs_FILE scrfil = buildvfs_fopen_write(scrbuf);
buildvfs_fwrite((char *)waloff[TILE_LOADSHOT], 320, 200, scrfil);
buildvfs_fclose(scrfil);
}
#endif
} }
else else
{ {
@ -353,26 +364,46 @@ int32_t G_LoadPlayer(savebrief_t & sv)
{ {
if (sv.isExt) if (sv.isExt)
{ {
int volume = -1;
int level = -1;
int skill = -1;
buildvfs_kfd const fil = kopen4loadfrommod(sv.path, 0);
if (fil != buildvfs_kfd_invalid)
{
savehead_t h;
int status = sv_loadheader(fil, 0, &h);
if (status >= 0)
{
volume = h.volnum;
level = h.levnum;
skill = h.skill;
}
kclose(fil);
}
char extfn[BMAX_PATH]; char extfn[BMAX_PATH];
snprintf(extfn, ARRAY_SIZE(extfn), "%s.ext", sv.path); snprintf(extfn, ARRAY_SIZE(extfn), "%s.ext", sv.path);
buildvfs_kfd fil = kopen4loadfrommod(extfn, 0); buildvfs_kfd extfil = kopen4loadfrommod(extfn, 0);
if (fil == buildvfs_kfd_invalid) if (extfil == buildvfs_kfd_invalid)
{ {
return -1; return -1;
} }
int32_t len = kfilelength(fil); int32_t len = kfilelength(extfil);
auto text = (char *)Xmalloc(len+1); auto text = (char *)Xmalloc(len+1);
text[len] = '\0'; text[len] = '\0';
if (kread_and_test(fil, text, len)) if (kread_and_test(extfil, text, len))
{ {
kclose(fil); kclose(extfil);
Xfree(text); Xfree(text);
return -1; return -1;
} }
kclose(fil); kclose(extfil);
sjson_context * ctx = sjson_create_context(0, 0, NULL); sjson_context * ctx = sjson_create_context(0, 0, NULL);
@ -380,9 +411,12 @@ int32_t G_LoadPlayer(savebrief_t & sv)
Xfree(text); Xfree(text);
int volume = sjson_get_int(root, "volume", -1); if (volume == -1)
int level = sjson_get_int(root, "level", -1); volume = sjson_get_int(root, "volume", volume);
int skill = sjson_get_int(root, "skill", -1); if (level == -1)
level = sjson_get_int(root, "level", level);
if (skill == -1)
skill = sjson_get_int(root, "skill", skill);
if (volume == -1 || level == -1 || skill == -1) if (volume == -1 || level == -1 || skill == -1)
{ {
@ -402,6 +436,12 @@ int32_t G_LoadPlayer(savebrief_t & sv)
return 1; return 1;
} }
ud.returnvar[0] = level;
volume = VM_OnEventWithReturn(EVENT_VALIDATESTART, g_player[myconnectindex].ps->i, myconnectindex, volume);
level = ud.returnvar[0];
{ {
// CODEDUP from non-isExt branch, with simplifying assumptions // CODEDUP from non-isExt branch, with simplifying assumptions
@ -782,7 +822,7 @@ int32_t G_SavePlayer(savebrief_t & sv, bool isAutoSave)
VM_OnEvent(EVENT_SAVEGAME, g_player[screenpeek].ps->i, screenpeek); VM_OnEvent(EVENT_SAVEGAME, g_player[screenpeek].ps->i, screenpeek);
portableBackupSave(sv.path); portableBackupSave(sv.path, ud.last_stateless_volume, ud.last_stateless_level);
// SAVE! // SAVE!
sv_saveandmakesnapshot(fil, sv.name, 0, 0, 0, 0, isAutoSave); sv_saveandmakesnapshot(fil, sv.name, 0, 0, 0, 0, isAutoSave);