Merge branch 'luabanks' into 'master'
Lua save-banks! See merge request STJr/SRB2Internal!295
This commit is contained in:
commit
71cc09c8c2
|
@ -716,6 +716,7 @@ void D_StartTitle(void)
|
||||||
botskin = 0;
|
botskin = 0;
|
||||||
cv_debug = 0;
|
cv_debug = 0;
|
||||||
emeralds = 0;
|
emeralds = 0;
|
||||||
|
memset(&luabanks, 0, sizeof(luabanks));
|
||||||
lastmaploaded = 0;
|
lastmaploaded = 0;
|
||||||
|
|
||||||
// In case someone exits out at the same time they start a time attack run,
|
// In case someone exits out at the same time they start a time attack run,
|
||||||
|
|
|
@ -1916,7 +1916,10 @@ static void Got_Mapcmd(UINT8 **cp, INT32 playernum)
|
||||||
precache = false;
|
precache = false;
|
||||||
|
|
||||||
if (resetplayer && !FLS)
|
if (resetplayer && !FLS)
|
||||||
|
{
|
||||||
emeralds = 0;
|
emeralds = 0;
|
||||||
|
memset(&luabanks, 0, sizeof(luabanks));
|
||||||
|
}
|
||||||
|
|
||||||
if (modeattacking)
|
if (modeattacking)
|
||||||
{
|
{
|
||||||
|
@ -4111,6 +4114,7 @@ void Command_ExitGame_f(void)
|
||||||
botskin = 0;
|
botskin = 0;
|
||||||
cv_debug = 0;
|
cv_debug = 0;
|
||||||
emeralds = 0;
|
emeralds = 0;
|
||||||
|
memset(&luabanks, 0, sizeof(luabanks));
|
||||||
|
|
||||||
if (dirmenu)
|
if (dirmenu)
|
||||||
closefilemenu(true);
|
closefilemenu(true);
|
||||||
|
|
|
@ -420,6 +420,10 @@ extern UINT16 emeralds;
|
||||||
#define EMERALD7 64
|
#define EMERALD7 64
|
||||||
#define ALL7EMERALDS(v) ((v & (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7)) == (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7))
|
#define ALL7EMERALDS(v) ((v & (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7)) == (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7))
|
||||||
|
|
||||||
|
// yes, even in non HAVE_BLUA
|
||||||
|
#define NUM_LUABANKS 16 // please only make this number go up between versions, never down. you'll break saves otherwise. also, must fit in UINT8
|
||||||
|
extern INT32 luabanks[NUM_LUABANKS];
|
||||||
|
|
||||||
extern INT32 nummaprings; //keep track of spawned rings/coins
|
extern INT32 nummaprings; //keep track of spawned rings/coins
|
||||||
|
|
||||||
/** Time attack information, currently a very small structure.
|
/** Time attack information, currently a very small structure.
|
||||||
|
|
25
src/g_game.c
25
src/g_game.c
|
@ -172,6 +172,7 @@ static boolean retrying = false;
|
||||||
UINT8 stagefailed; // Used for GEMS BONUS? Also to see if you beat the stage.
|
UINT8 stagefailed; // Used for GEMS BONUS? Also to see if you beat the stage.
|
||||||
|
|
||||||
UINT16 emeralds;
|
UINT16 emeralds;
|
||||||
|
INT32 luabanks[NUM_LUABANKS]; // yes, even in non HAVE_BLUA
|
||||||
UINT32 token; // Number of tokens collected in a level
|
UINT32 token; // Number of tokens collected in a level
|
||||||
UINT32 tokenlist; // List of tokens collected
|
UINT32 tokenlist; // List of tokens collected
|
||||||
boolean gottoken; // Did you get a token? Used for end of act
|
boolean gottoken; // Did you get a token? Used for end of act
|
||||||
|
@ -3788,7 +3789,29 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives)
|
||||||
|
|
||||||
// File end marker check
|
// File end marker check
|
||||||
CHECKPOS
|
CHECKPOS
|
||||||
if (READUINT8(save_p) != 0x1d) BADSAVE;
|
switch (READUINT8(save_p))
|
||||||
|
{
|
||||||
|
case 0xb7:
|
||||||
|
{
|
||||||
|
UINT8 i, banksinuse;
|
||||||
|
CHECKPOS
|
||||||
|
banksinuse = READUINT8(save_p);
|
||||||
|
CHECKPOS
|
||||||
|
if (banksinuse > NUM_LUABANKS)
|
||||||
|
BADSAVE
|
||||||
|
for (i = 0; i < banksinuse; i++)
|
||||||
|
{
|
||||||
|
(void)READINT32(save_p);
|
||||||
|
CHECKPOS
|
||||||
|
}
|
||||||
|
if (READUINT8(save_p) != 0x1d)
|
||||||
|
BADSAVE
|
||||||
|
}
|
||||||
|
case 0x1d:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BADSAVE
|
||||||
|
}
|
||||||
|
|
||||||
// done
|
// done
|
||||||
saved = FIL_WriteFile(backup, savebuffer, length);
|
saved = FIL_WriteFile(backup, savebuffer, length);
|
||||||
|
|
|
@ -182,6 +182,8 @@ static const struct {
|
||||||
{META_CAMERA, "camera_t"},
|
{META_CAMERA, "camera_t"},
|
||||||
|
|
||||||
{META_ACTION, "action"},
|
{META_ACTION, "action"},
|
||||||
|
|
||||||
|
{META_LUABANKS, "luabanks[]"},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -228,6 +230,18 @@ static int lib_isPlayerAdmin(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lib_reserveLuabanks(lua_State *L)
|
||||||
|
{
|
||||||
|
static boolean reserved = false;
|
||||||
|
if (!lua_lumploading)
|
||||||
|
return luaL_error(L, "luabanks[] cannot be reserved from within a hook or coroutine!");
|
||||||
|
if (reserved)
|
||||||
|
return luaL_error(L, "luabanks[] has already been reserved! Only one savedata-enabled mod at a time may use this feature.");
|
||||||
|
reserved = true;
|
||||||
|
LUA_PushUserdata(L, &luabanks, META_LUABANKS);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// M_RANDOM
|
// M_RANDOM
|
||||||
//////////////
|
//////////////
|
||||||
|
|
||||||
|
@ -2736,6 +2750,7 @@ static luaL_Reg lib[] = {
|
||||||
{"chatprintf", lib_chatprintf},
|
{"chatprintf", lib_chatprintf},
|
||||||
{"userdataType", lib_userdataType},
|
{"userdataType", lib_userdataType},
|
||||||
{"IsPlayerAdmin", lib_isPlayerAdmin},
|
{"IsPlayerAdmin", lib_isPlayerAdmin},
|
||||||
|
{"reserveLuabanks", lib_reserveLuabanks},
|
||||||
|
|
||||||
// m_random
|
// m_random
|
||||||
{"P_RandomFixed",lib_pRandomFixed},
|
{"P_RandomFixed",lib_pRandomFixed},
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "p_mobj.h"
|
#include "p_mobj.h"
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
|
#include "doomstat.h" // luabanks[]
|
||||||
|
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
#include "lua_libs.h"
|
#include "lua_libs.h"
|
||||||
|
@ -146,7 +147,7 @@ static int lib_getSpr2default(lua_State *L)
|
||||||
return luaL_error(L, "spr2defaults[] invalid index");
|
return luaL_error(L, "spr2defaults[] invalid index");
|
||||||
|
|
||||||
if (i >= free_spr2)
|
if (i >= free_spr2)
|
||||||
return 0;
|
return luaL_error(L, "spr2defaults[] index %d out of range (%d - %d)", i, 0, free_spr2-1);
|
||||||
|
|
||||||
lua_pushinteger(L, spr2defaults[i]);
|
lua_pushinteger(L, spr2defaults[i]);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1026,6 +1027,61 @@ static int sfxinfo_num(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////
|
||||||
|
// LUABANKS //
|
||||||
|
//////////////
|
||||||
|
|
||||||
|
static int lib_getluabanks(lua_State *L)
|
||||||
|
{
|
||||||
|
UINT8 i;
|
||||||
|
|
||||||
|
lua_remove(L, 1); // don't care about luabanks[] dummy userdata.
|
||||||
|
|
||||||
|
if (lua_isnumber(L, 1))
|
||||||
|
i = lua_tonumber(L, 1);
|
||||||
|
else
|
||||||
|
return luaL_error(L, "luabanks[] invalid index");
|
||||||
|
|
||||||
|
if (i >= NUM_LUABANKS)
|
||||||
|
luaL_error(L, "luabanks[] index %d out of range (%d - %d)", i, 0, NUM_LUABANKS-1);
|
||||||
|
|
||||||
|
lua_pushinteger(L, luabanks[i]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int lib_setluabanks(lua_State *L)
|
||||||
|
{
|
||||||
|
UINT8 i;
|
||||||
|
INT32 j = 0;
|
||||||
|
|
||||||
|
if (hud_running)
|
||||||
|
return luaL_error(L, "Do not alter luabanks[] in HUD rendering code!");
|
||||||
|
|
||||||
|
lua_remove(L, 1); // don't care about luabanks[] dummy userdata.
|
||||||
|
|
||||||
|
if (lua_isnumber(L, 1))
|
||||||
|
i = lua_tonumber(L, 1);
|
||||||
|
else
|
||||||
|
return luaL_error(L, "luabanks[] invalid index");
|
||||||
|
|
||||||
|
if (i >= NUM_LUABANKS)
|
||||||
|
luaL_error(L, "luabanks[] index %d out of range (%d - %d)", i, 0, NUM_LUABANKS-1);
|
||||||
|
|
||||||
|
if (lua_isnumber(L, 2))
|
||||||
|
j = lua_tonumber(L, 2);
|
||||||
|
else
|
||||||
|
return luaL_error(L, "luabanks[] invalid set");
|
||||||
|
|
||||||
|
luabanks[i] = j;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int lib_luabankslen(lua_State *L)
|
||||||
|
{
|
||||||
|
lua_pushinteger(L, NUM_LUABANKS);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//
|
//
|
||||||
// Now push all these functions into the Lua state!
|
// Now push all these functions into the Lua state!
|
||||||
|
@ -1147,6 +1203,18 @@ int LUA_InfoLib(lua_State *L)
|
||||||
lua_pushvalue(L, -1);
|
lua_pushvalue(L, -1);
|
||||||
lua_setglobal(L, "S_sfx");
|
lua_setglobal(L, "S_sfx");
|
||||||
lua_setglobal(L, "sfxinfo");
|
lua_setglobal(L, "sfxinfo");
|
||||||
|
|
||||||
|
luaL_newmetatable(L, META_LUABANKS);
|
||||||
|
lua_pushcfunction(L, lib_getluabanks);
|
||||||
|
lua_setfield(L, -2, "__index");
|
||||||
|
|
||||||
|
lua_pushcfunction(L, lib_setluabanks);
|
||||||
|
lua_setfield(L, -2, "__newindex");
|
||||||
|
|
||||||
|
lua_pushcfunction(L, lib_luabankslen);
|
||||||
|
lua_setfield(L, -2, "__len");
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,8 @@ extern lua_State *gL;
|
||||||
|
|
||||||
#define META_ACTION "ACTIONF_T*"
|
#define META_ACTION "ACTIONF_T*"
|
||||||
|
|
||||||
|
#define META_LUABANKS "LUABANKS[]*"
|
||||||
|
|
||||||
boolean luaL_checkboolean(lua_State *L, int narg);
|
boolean luaL_checkboolean(lua_State *L, int narg);
|
||||||
|
|
||||||
int LUA_EnumLib(lua_State *L);
|
int LUA_EnumLib(lua_State *L);
|
||||||
|
|
27
src/m_menu.c
27
src/m_menu.c
|
@ -6895,6 +6895,7 @@ static void M_StartTutorial(INT32 choice)
|
||||||
tutorialmode = true; // turn on tutorial mode
|
tutorialmode = true; // turn on tutorial mode
|
||||||
|
|
||||||
emeralds = 0;
|
emeralds = 0;
|
||||||
|
memset(&luabanks, 0, sizeof(luabanks));
|
||||||
M_ClearMenus(true);
|
M_ClearMenus(true);
|
||||||
gamecomplete = false;
|
gamecomplete = false;
|
||||||
cursaveslot = 0;
|
cursaveslot = 0;
|
||||||
|
@ -7303,7 +7304,29 @@ static void M_ReadSavegameInfo(UINT32 slot)
|
||||||
|
|
||||||
// File end marker check
|
// File end marker check
|
||||||
CHECKPOS
|
CHECKPOS
|
||||||
if (READUINT8(save_p) != 0x1d) BADSAVE;
|
switch (READUINT8(save_p))
|
||||||
|
{
|
||||||
|
case 0xb7:
|
||||||
|
{
|
||||||
|
UINT8 i, banksinuse;
|
||||||
|
CHECKPOS
|
||||||
|
banksinuse = READUINT8(save_p);
|
||||||
|
CHECKPOS
|
||||||
|
if (banksinuse > NUM_LUABANKS)
|
||||||
|
BADSAVE
|
||||||
|
for (i = 0; i < banksinuse; i++)
|
||||||
|
{
|
||||||
|
(void)READINT32(save_p);
|
||||||
|
CHECKPOS
|
||||||
|
}
|
||||||
|
if (READUINT8(save_p) != 0x1d)
|
||||||
|
BADSAVE
|
||||||
|
}
|
||||||
|
case 0x1d:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BADSAVE
|
||||||
|
}
|
||||||
|
|
||||||
// done
|
// done
|
||||||
Z_Free(savebuffer);
|
Z_Free(savebuffer);
|
||||||
|
@ -8505,6 +8528,7 @@ static void M_ChooseNightsAttack(INT32 choice)
|
||||||
char nameofdemo[256];
|
char nameofdemo[256];
|
||||||
(void)choice;
|
(void)choice;
|
||||||
emeralds = 0;
|
emeralds = 0;
|
||||||
|
memset(&luabanks, 0, sizeof(luabanks));
|
||||||
M_ClearMenus(true);
|
M_ClearMenus(true);
|
||||||
modeattacking = ATTACKING_NIGHTS;
|
modeattacking = ATTACKING_NIGHTS;
|
||||||
|
|
||||||
|
@ -8529,6 +8553,7 @@ static void M_ChooseTimeAttack(INT32 choice)
|
||||||
char nameofdemo[256];
|
char nameofdemo[256];
|
||||||
(void)choice;
|
(void)choice;
|
||||||
emeralds = 0;
|
emeralds = 0;
|
||||||
|
memset(&luabanks, 0, sizeof(luabanks));
|
||||||
M_ClearMenus(true);
|
M_ClearMenus(true);
|
||||||
modeattacking = ATTACKING_RECORD;
|
modeattacking = ATTACKING_RECORD;
|
||||||
|
|
||||||
|
|
|
@ -4119,12 +4119,54 @@ static inline boolean P_NetUnArchiveMisc(void)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void P_ArchiveLuabanksAndConsistency(void)
|
||||||
|
{
|
||||||
|
UINT8 i, banksinuse = NUM_LUABANKS;
|
||||||
|
|
||||||
|
while (banksinuse && !luabanks[banksinuse-1])
|
||||||
|
banksinuse--; // get the last used bank
|
||||||
|
|
||||||
|
if (banksinuse)
|
||||||
|
{
|
||||||
|
WRITEUINT8(save_p, 0xb7); // luabanks marker
|
||||||
|
WRITEUINT8(save_p, banksinuse);
|
||||||
|
for (i = 0; i < banksinuse; i++)
|
||||||
|
WRITEINT32(save_p, luabanks[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITEUINT8(save_p, 0x1d); // consistency marker
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline boolean P_UnArchiveLuabanksAndConsistency(void)
|
||||||
|
{
|
||||||
|
switch (READUINT8(save_p))
|
||||||
|
{
|
||||||
|
case 0xb7:
|
||||||
|
{
|
||||||
|
UINT8 i, banksinuse = READUINT8(save_p);
|
||||||
|
if (banksinuse > NUM_LUABANKS)
|
||||||
|
return false;
|
||||||
|
for (i = 0; i < banksinuse; i++)
|
||||||
|
luabanks[i] = READINT32(save_p);
|
||||||
|
if (READUINT8(save_p) != 0x1d)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case 0x1d:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void P_SaveGame(void)
|
void P_SaveGame(void)
|
||||||
{
|
{
|
||||||
P_ArchiveMisc();
|
P_ArchiveMisc();
|
||||||
P_ArchivePlayer();
|
P_ArchivePlayer();
|
||||||
|
|
||||||
WRITEUINT8(save_p, 0x1d); // consistency marker
|
// yes, even in non HAVE_BLUA
|
||||||
|
P_ArchiveLuabanksAndConsistency();
|
||||||
}
|
}
|
||||||
|
|
||||||
void P_SaveNetGame(void)
|
void P_SaveNetGame(void)
|
||||||
|
@ -4163,7 +4205,7 @@ void P_SaveNetGame(void)
|
||||||
LUA_Archive();
|
LUA_Archive();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
WRITEUINT8(save_p, 0x1d); // consistency marker
|
P_ArchiveLuabanksAndConsistency();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean P_LoadGame(INT16 mapoverride)
|
boolean P_LoadGame(INT16 mapoverride)
|
||||||
|
@ -4175,8 +4217,7 @@ boolean P_LoadGame(INT16 mapoverride)
|
||||||
P_UnArchiveSPGame(mapoverride);
|
P_UnArchiveSPGame(mapoverride);
|
||||||
P_UnArchivePlayer();
|
P_UnArchivePlayer();
|
||||||
|
|
||||||
// Savegame end marker
|
if (!P_UnArchiveLuabanksAndConsistency())
|
||||||
if (READUINT8(save_p) != 0x1d)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Only do this after confirming savegame is ok
|
// Only do this after confirming savegame is ok
|
||||||
|
@ -4217,5 +4258,5 @@ boolean P_LoadNetGame(void)
|
||||||
// precipitation when loading a netgame save. Instead, precip has to be spawned here.
|
// precipitation when loading a netgame save. Instead, precip has to be spawned here.
|
||||||
// This is done in P_NetUnArchiveSpecials now.
|
// This is done in P_NetUnArchiveSpecials now.
|
||||||
|
|
||||||
return READUINT8(save_p) == 0x1d;
|
return P_UnArchiveLuabanksAndConsistency();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue