From 8f477a36b60242436e9124b1780c17a4eb53ce15 Mon Sep 17 00:00:00 2001 From: Raf <> Date: Mon, 31 Mar 2025 10:22:12 +0800 Subject: [PATCH] mpsetups: convert existing setups from the eeprom, removed "combat settings" items from file menu increased block size from 64 to 80 (it was insufficient) --- port/include/mpsetups.h | 3 +- port/src/mpsetups.c | 51 +++++++++++++++++--- src/game/filemgr.c | 21 -------- src/game/fmb.c | 16 ------ src/game/menutick.c | 1 - src/game/mplayer/mplayer.c | 34 ++++++++++--- src/game/mplayer/scenarios.c | 9 ++-- src/game/mplayer/scenarios/kingofthehill.inc | 5 +- src/game/mplayer/setup.c | 5 +- src/include/constants.h | 2 +- src/include/game/mplayer/scenarios.h | 2 +- 11 files changed, 87 insertions(+), 62 deletions(-) diff --git a/port/include/mpsetups.h b/port/include/mpsetups.h index 9a2b2f58a..c54aee371 100644 --- a/port/include/mpsetups.h +++ b/port/include/mpsetups.h @@ -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 diff --git a/port/src/mpsetups.c b/port/src/mpsetups.c index a1c9d658d..dc9e0fc2e 100644 --- a/port/src/mpsetups.c +++ b/port/src/mpsetups.c @@ -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(); +} diff --git a/src/game/filemgr.c b/src/game/filemgr.c index 9c87e071d..a5dbc53e8 100644 --- a/src/game/filemgr.c +++ b/src/game/filemgr.c @@ -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, diff --git a/src/game/fmb.c b/src/game/fmb.c index f6de5aadd..3cd114d0f 100644 --- a/src/game/fmb.c +++ b/src/game/fmb.c @@ -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, diff --git a/src/game/menutick.c b/src/game/menutick.c index 5a795da9d..fcd0df3b8 100644 --- a/src/game/menutick.c +++ b/src/game/menutick.c @@ -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) { diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index 69facd19f..4b8f70ecf 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -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(); diff --git a/src/game/mplayer/scenarios.c b/src/game/mplayer/scenarios.c index 0c4df1f51..b9ea325b3 100644 --- a/src/game/mplayer/scenarios.c +++ b/src/game/mplayer/scenarios.c @@ -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); } } diff --git a/src/game/mplayer/scenarios/kingofthehill.inc b/src/game/mplayer/scenarios/kingofthehill.inc index 721550423..542256b9b 100644 --- a/src/game/mplayer/scenarios/kingofthehill.inc +++ b/src/game/mplayer/scenarios/kingofthehill.inc @@ -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) diff --git a/src/game/mplayer/setup.c b/src/game/mplayer/setup.c index a70087eda..27e0b7fc3 100644 --- a/src/game/mplayer/setup.c +++ b/src/game/mplayer/setup.c @@ -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(); } diff --git a/src/include/constants.h b/src/include/constants.h index e1c4b4ea3..f465b6263 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -4756,7 +4756,7 @@ enum weaponnum { #define MPSETUP_MAXSETUPS 128 #define MPSETUP_MAXNAME 18 -#define MPSETUP_BLOCKSIZE 64 +#define MPSETUP_BLOCKSIZE 80 #endif diff --git a/src/include/game/mplayer/scenarios.h b/src/include/game/mplayer/scenarios.h index a04f0d021..48c7bdcc1 100644 --- a/src/include/game/mplayer/scenarios.h +++ b/src/include/game/mplayer/scenarios.h @@ -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);