mpsetups: convert existing setups from the eeprom, removed "combat settings" items from file menu

increased block size from 64 to 80 (it was insufficient)
This commit is contained in:
Raf committed 2025-03-31 10:24:26 +08:00
1 parent 4d4fa8f681
commit 8f477a36b6
11 files changed
+87 -62

No files matched your search

+2 -1
View File
@@ -6,6 +6,7 @@
s32 mpsetupLoadCurrentFile();
s32 mpsetupSaveCurrentFile();
void mpsetupLoadSetup(s32 slotindex);
s32 mpsetupSaveSetup(s32 slotindex);
s32 mpsetupSaveSetup(s32 slotindex, u8 savefile);
void mpsetupCopyAllFromPak();
#endif
+45 -6
View File
@@ -1,6 +1,8 @@
#include "types.h"
#include "constants.h"
#include "bss.h"
#include "game/pak.h"
#include "game/filelist.h"
#include "game/menu.h"
#include "game/savebuffer.h"
#include "game/mplayer/mplayer.h"
@@ -21,6 +23,8 @@ MP Setup File Format
[setup_n{64}]
*/
#define MPSETUP_VERSION 1
#define MPSETUP_EXPORTDIR "$S/exported/"
#define MPSETUP_FILENAME "mpsetups"
#define MPSETUP_FILENAME_EXP "mpsetups-ext"
@@ -131,7 +135,7 @@ MenuItemHandlerResult menuhandlerRenameSetup(s32 operation, struct menuitem *ite
break;
case MENUOP_SET:
strcpy(setup->bytes, name);
err = mpsetupSaveSetup(slotindex);
err = mpsetupSaveSetup(slotindex, true);
if (!err) {
menuPopDialog();
}
@@ -501,13 +505,14 @@ static MenuItemHandlerResult menuhandlerSetupSetDefault(s32 operation, struct me
{
if (operation == MENUOP_SET) {
s32 selected = g_Menus[g_MpPlayerNum].mpsetup.slotindex;
// clicked on "clear default"
if (selected == g_MpSetupFile.defaultsetup - 1) {
strcpy(g_LabelSetDefault, "Set Default\n");
g_MpSetupFile.defaultsetup = -1;
strcpy(g_LabelSetDefault, "Set Default\n");
}
else {
strcpy(g_LabelSetDefault, "Clear Default\n");
g_MpSetupFile.defaultsetup = selected + 1;
strcpy(g_LabelSetDefault, "Clear Default\n");
}
mpsetupSaveCurrentFile();
@@ -750,6 +755,7 @@ s32 mpsetupLoadCurrentFile()
s32 mpsetupSaveCurrentFile()
{
g_MpSetupFile.version = MPSETUP_VERSION;
return mpsetupSaveFile(MPSETUP_OP_DEFAULT, &g_MpSetupFile);
}
@@ -843,7 +849,7 @@ static s32 mpsetupSaveFile(u8 op, struct mpsetupfile *setupfile)
return mpsetupLoadCurrentFile();
}
s32 mpsetupSaveSetup(s32 slotindex)
s32 mpsetupSaveSetup(s32 slotindex, u8 savefile)
{
struct savebuffer setup;
@@ -857,7 +863,7 @@ s32 mpsetupSaveSetup(s32 slotindex)
memcpy(g_MpSetupFile.setups[slotindex].bytes, setup.bytes, MPSETUP_BLOCKSIZE);
return mpsetupSaveCurrentFile();
return savefile ? mpsetupSaveCurrentFile() : 0;
}
void mpsetupLoadSetup(s32 index)
@@ -866,6 +872,39 @@ void mpsetupLoadSetup(s32 index)
savebufferClear(&buffer);
struct setupblock *block = &g_MpSetupFile.setups[index];
memcpy(&buffer.bytes, block->bytes, MPSETUP_BLOCKSIZE);
mpsetupfileLoadWad(&buffer);
mpsetupfileLoadWad(&buffer, g_MpSetupFile.version);
g_MpCurrentSetup = index;
}
void mpsetupCopyAllFromPak()
{
if (fsFileSize("$S/" MPSETUP_FILENAME ".bin") > 0) {
return;
}
filelistCreate(1, FILETYPE_MPSETUP);
filelistsTick();
for (int i = 0; i < g_FileLists[1]->numfiles; ++i) {
struct savebuffer buffer;
savebufferClear(&buffer);
struct filelistfile *file = &g_FileLists[1]->files[i];
s32 device = pakFindBySerial(file->deviceserial);
s32 err = pakReadBodyAtGuid(device, file->fileid, buffer.bytes, 0);
if (err != 0) {
sysLogPrintf(LOG_ERROR, "Unable to read pak. device %d fileid %d deviceserial %d err %d",
device, file->fileid, file->deviceserial, err);
continue;
}
mpsetupfileLoadWad(&buffer, 0);
// save the file when writing the last setup
u8 savefile = i == g_FileLists[1]->numfiles - 1;
mpsetupSaveSetup(g_MpSetupFile.numsetups, savefile);
}
// to reset the mp setup
mpInit();
}
-21
View File
@@ -499,11 +499,6 @@ char *filemgrMenuTextFileType(struct menuitem *item)
case FILEOP_LOAD_GAME:
case FILEOP_READ_GAME:
return langGet(names[0]);
case FILEOP_SAVE_MPSETUP:
case FILEOP_WRITE_MPSETUP:
case FILEOP_LOAD_MPSETUP:
case FILEOP_READ_MPSETUP:
return langGet(names[1]);
case FILEOP_SAVE_MPPLAYER:
case FILEOP_WRITE_MPPLAYER:
case FILEOP_LOAD_MPPLAYER:
@@ -3296,14 +3291,6 @@ struct menuitem g_FilemgrOperationsMenuItems[] = {
0,
filemgrOpenCopyFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
FILETYPE_MPSETUP,
0,
L_OPTIONS_104, // "Combat Simulator Settings File"
0,
filemgrOpenCopyFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
FILETYPE_MPPLAYER,
@@ -3336,14 +3323,6 @@ struct menuitem g_FilemgrOperationsMenuItems[] = {
0,
filemgrOpenDeleteFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
FILETYPE_MPSETUP,
0,
L_OPTIONS_104, // "Combat Simulator Settings File"
0,
filemgrOpenDeleteFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
FILETYPE_MPPLAYER,
-16
View File
@@ -133,14 +133,6 @@ struct menuitem g_GameFiles4MbMenuItems[] = {
0,
filemgrOpenCopyFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
1,
0,
L_OPTIONS_104, // "Combat Simulator Settings File"
0,
filemgrOpenCopyFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
2,
@@ -173,14 +165,6 @@ struct menuitem g_GameFiles4MbMenuItems[] = {
0,
filemgrOpenDeleteFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
1,
0,
L_OPTIONS_104, // "Combat Simulator Settings File"
0,
filemgrOpenDeleteFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
2,
-1
View File
@@ -473,7 +473,6 @@ void menuTick(void)
(g_MenuData.root == MENUROOT_MPSETUP || g_MenuData.root == MENUROOT_4MBMAINMENU)) {
var80062948 = 1;
filelistCreate(0, FILETYPE_MPPLAYER);
filelistCreate(1, FILETYPE_MPSETUP);
}
if (var80062944) {
+27 -7
View File
@@ -3931,16 +3931,32 @@ void mpsetupfileLoadWad(struct savebuffer *buffer, u8 version)
s32 i;
s32 j;
savebufferReadString_ext(buffer, g_MpSetup.name, false, MPSETUP_MAXNAME+1);
if (version > 0) {
savebufferReadString_ext(buffer, g_MpSetup.name, false, MPSETUP_MAXNAME + 1);
}
else {
savebufferReadString(buffer, g_MpSetup.name, false);
}
savebufferReadBits(buffer, 4);
g_MpSetup.stagenum = savebufferReadBits(buffer, 7);
g_MpSetup.scenario = savebufferReadBits(buffer, 3);
scenarioInit();
scenarioReadSave(buffer);
// version == 0 means we're only reading to convert, so no actions are needed
if (version > 0) {
scenarioInit();
}
scenarioReadSave(buffer, version);
if (version > 0) {
g_MpSetup.options = savebufferReadBits(buffer, 32);
}
else {
g_MpSetup.options = savebufferReadBits(buffer, 21);
}
g_MpSetup.options = savebufferReadBits(buffer, 32);
g_MpSetup.chrslots &= 0x000f;
for (i = 0; i < MAX_BOTS; i++) {
@@ -3961,14 +3977,18 @@ void mpsetupfileLoadWad(struct savebuffer *buffer, u8 version)
g_BotConfigsArray[i].base.team = savebufferReadBits(buffer, 3);
}
mpGenerateBotNames();
if (version > 0) {
mpGenerateBotNames();
}
for (i = 0; i < ARRAYCOUNT(g_MpSetup.weapons); i++) {
g_MpSetup.weapons[i] = savebufferReadBits(buffer, 7);
}
u64 wpnRndPacked = savebufferReadBits(buffer, 64);
unpackWeaponSetRandomFilters(wpnRndPacked);
if (version > 0) {
u64 wpnRndPacked = savebufferReadBits(buffer, 64);
unpackWeaponSetRandomFilters(wpnRndPacked);
}
func0f18913c();
+5 -4
View File
@@ -70,7 +70,7 @@ struct mpscenario {
bool (*isroomhighlightedfunc)(RoomNum room);
void (*highlightroomfunc)(RoomNum room, s32 *arg1, s32 *arg2, s32 *arg3);
void *unk3c; // never hooked into nor fired
void (*readsavefunc)(struct savebuffer *buffer);
void (*readsavefunc)(struct savebuffer *buffer, u8 version);
void (*writesavefunc)(struct savebuffer *buffer);
};
@@ -416,12 +416,13 @@ MenuItemHandlerResult menuhandlerMpOpenOptions(s32 operation, struct menuitem *i
*
* Used by KOH to read the mphilltime.
*/
void scenarioReadSave(struct savebuffer *buffer)
void scenarioReadSave(struct savebuffer *buffer, u8 version)
{
if (g_MpScenarios[g_MpSetup.scenario].readsavefunc) {
g_MpScenarios[g_MpSetup.scenario].readsavefunc(buffer);
g_MpScenarios[g_MpSetup.scenario].readsavefunc(buffer, version);
} else {
savebufferReadBits(buffer, 32);
u8 sz = version > 0 ? 32 : 8;
savebufferReadBits(buffer, sz);
}
}
+3 -2
View File
@@ -181,9 +181,10 @@ struct menudialogdef g_KohOptionsMenuDialog = {
NULL,
};
void kohReadSave(struct savebuffer *buffer)
void kohReadSave(struct savebuffer *buffer, u8 version)
{
g_Vars.mphilltime = savebufferReadBits(buffer, 32);
u8 sz = version > 0 ? 32 : 8;
g_Vars.mphilltime = savebufferReadBits(buffer, sz);
}
void kohWriteSave(struct savebuffer *buffer)
+3 -2
View File
@@ -470,7 +470,7 @@ MenuItemHandlerResult menuhandlerMpSetupName(s32 operation, struct menuitem *ite
strcpy(g_MpSetup.name, name);
break;
case MENUOP_SET:
err = mpsetupSaveSetup(g_MpSetupFile.numsetups);
err = mpsetupSaveSetup(g_MpSetupFile.numsetups, true);
if (!err) {
menuPushDialog(&g_FilemgrFileSavedMenuDialog);
}
@@ -488,7 +488,7 @@ MenuItemHandlerResult menuhandlerMpSaveSetupOverwrite(s32 operation, struct menu
{
if (operation == MENUOP_SET) {
menuPopDialog();
mpsetupSaveSetup(g_MpCurrentSetup);
mpsetupSaveSetup(g_MpCurrentSetup, true);
menuPushDialog(&g_FilemgrFileSavedMenuDialog);
}
@@ -5363,6 +5363,7 @@ MenuDialogHandlerResult menudialogCombatSimulator(s32 operation, struct menudial
g_Vars.waitingtojoin[3] = false;
// load the setup file when entering the Combat Simulator
mpsetupCopyAllFromPak();
mpsetupLoadCurrentFile();
}
+1 -1
View File
@@ -4756,7 +4756,7 @@ enum weaponnum {
#define MPSETUP_MAXSETUPS 128
#define MPSETUP_MAXNAME 18
#define MPSETUP_BLOCKSIZE 64
#define MPSETUP_BLOCKSIZE 80
#endif
+1 -1
View File
@@ -17,7 +17,7 @@ struct mpscenariooverview {
extern struct mpscenariooverview g_MpScenarioOverviews[6];
MenuItemHandlerResult menuhandlerMpOpenOptions(s32 operation, struct menuitem *item, union handlerdata *data);
void scenarioReadSave(struct savebuffer *buffer);
void scenarioReadSave(struct savebuffer *buffer, u8 version);
void scenarioWriteSave(struct savebuffer *buffer);
void scenarioInit(void);
s32 scenarioNumProps(void);