From a1d6916871be190e61cedc15171cf10689ddfe8c Mon Sep 17 00:00:00 2001 From: Raf <> Date: Sat, 29 Mar 2025 04:19:46 +0800 Subject: [PATCH] mpsetups: manage default setup + save the selected random weapons --- port/include/mpsetups.h | 3 +- port/src/mpsetups.c | 72 ++++++++++++++++++++++++++++++++------ src/game/mplayer/mplayer.c | 23 ++++++++++++ src/game/mplayer/setup.c | 2 +- 4 files changed, 87 insertions(+), 13 deletions(-) diff --git a/port/include/mpsetups.h b/port/include/mpsetups.h index c2a24056f..9a2b2f58a 100644 --- a/port/include/mpsetups.h +++ b/port/include/mpsetups.h @@ -3,7 +3,8 @@ #include "types.h" -s32 mpsetupLoadCurrentSetupFile(); +s32 mpsetupLoadCurrentFile(); +s32 mpsetupSaveCurrentFile(); void mpsetupLoadSetup(s32 slotindex); s32 mpsetupSaveSetup(s32 slotindex); diff --git a/port/src/mpsetups.c b/port/src/mpsetups.c index 27eb82c6b..a1c9d658d 100644 --- a/port/src/mpsetups.c +++ b/port/src/mpsetups.c @@ -421,9 +421,17 @@ struct menudialogdef g_ManageImportExportDialog = { // #### Manage settings dialog struct menudialogdef g_ManageSetupDialog; -MenuItemHandlerResult mpSelectSettingHandler(s32 operation, struct menuitem *item, union handlerdata *data) +char g_LabelSetDefault[20] = "Set Default\n"; +MenuItemHandlerResult mpSelectSetupHandler(s32 operation, struct menuitem *item, union handlerdata *data) { switch (operation) { + case MENUOP_GETCOLOUR: { + u32 colour = data->list.unk04; + if (data->list.value + 1 == g_MpSetupFile.defaultsetup) { + data->list.unk04 = (colour & 0xffff0000) | 0xff; + } + break; + } case MENUOP_GETOPTIONCOUNT: data->list.value = g_MpSetupFile.numsetups; break; @@ -432,6 +440,12 @@ MenuItemHandlerResult mpSelectSettingHandler(s32 operation, struct menuitem *ite case MENUOP_SET: { g_Menus[g_MpPlayerNum].mpsetup.slotindex = data->list.value; + if (data->list.value == g_MpSetupFile.defaultsetup - 1) { + strcpy(g_LabelSetDefault, "Clear Default\n"); + } + else { + strcpy(g_LabelSetDefault, "Set Default\n"); + } menuPushDialog(&g_ManageSetupDialog); } case MENUOP_GETSELECTEDINDEX: @@ -446,10 +460,10 @@ struct menuitem g_MpManageSettingsListItems[] = { { MENUITEMTYPE_LIST, 0, - 0, + MENUITEMFLAG_LABEL_CUSTOMCOLOUR, 160, 0x00000042, - mpSelectSettingHandler, + mpSelectSetupHandler, }, { MENUITEMTYPE_END }, @@ -483,6 +497,25 @@ static MenuItemHandlerResult menuhandlerSetupDelete(s32 operation, struct menuit return 0; } +static MenuItemHandlerResult menuhandlerSetupSetDefault(s32 operation, struct menuitem *item, union handlerdata *data) +{ + if (operation == MENUOP_SET) { + s32 selected = g_Menus[g_MpPlayerNum].mpsetup.slotindex; + if (selected == g_MpSetupFile.defaultsetup - 1) { + strcpy(g_LabelSetDefault, "Set Default\n"); + g_MpSetupFile.defaultsetup = -1; + } + else { + strcpy(g_LabelSetDefault, "Clear Default\n"); + g_MpSetupFile.defaultsetup = selected + 1; + } + + mpsetupSaveCurrentFile(); + } + + return 0; +} + struct menuitem g_ManageSetupItems[] = { { MENUITEMTYPE_SELECTABLE, @@ -500,6 +533,14 @@ struct menuitem g_ManageSetupItems[] = { 0, menuhandlerSetupDelete, }, + { + MENUITEMTYPE_SELECTABLE, + 0, + MENUITEMFLAG_LITERAL_TEXT, + (uintptr_t)g_LabelSetDefault, + 0, + menuhandlerSetupSetDefault, + }, { MENUITEMTYPE_SEPARATOR, 0, @@ -624,8 +665,12 @@ static s32 deleteSetup() g_MpCurrentSetup = -1; } + if (g_MpSetupFile.defaultsetup == slotindex + 1) { + g_MpSetupFile.defaultsetup = 0; + } + g_MpSetupFile.numsetups--; - return mpsetupSaveFile(MPSETUP_OP_DEFAULT, &g_MpSetupFile); + return mpsetupSaveCurrentFile(); } static FILE *openMpSetupFile(u8 mode, u8 op) { @@ -689,8 +734,8 @@ s32 mpsetupLoadFile(struct mpsetupfile *setupfile, u8 op) mpsetupDeserialize(setupfile, filebuffer); - if (op == MPSETUP_OP_DEFAULT && setupfile->defaultsetup != 0) { - g_MpCurrentSetup = setupfile->defaultsetup; + if (op == MPSETUP_OP_DEFAULT && setupfile->defaultsetup > 0) { + mpsetupLoadSetup(setupfile->defaultsetup - 1); } fsFileFree(f); @@ -698,11 +743,16 @@ s32 mpsetupLoadFile(struct mpsetupfile *setupfile, u8 op) return 0; } -s32 mpsetupLoadCurrentSetupFile() +s32 mpsetupLoadCurrentFile() { return mpsetupLoadFile(&g_MpSetupFile, MPSETUP_OP_DEFAULT); } +s32 mpsetupSaveCurrentFile() +{ + return mpsetupSaveFile(MPSETUP_OP_DEFAULT, &g_MpSetupFile); +} + s32 importMpSetupFile(u8 op, u8 skipOverlap) { if (!skipOverlap) { @@ -739,7 +789,7 @@ s32 importMpSetupFile(u8 op, u8 skipOverlap) memcpy(g_MpSetupFile.setups[importIdx].bytes, g_ImportMpSetupFile.setups[i].bytes, MPSETUP_BLOCKSIZE); } - return mpsetupSaveFile(MPSETUP_OP_DEFAULT, &g_MpSetupFile); + return mpsetupSaveCurrentFile(); } s32 exportMpSetupFile() @@ -790,7 +840,7 @@ static s32 mpsetupSaveFile(u8 op, struct mpsetupfile *setupfile) fsFileFree(f); // reload the file to update in-memory structs - return mpsetupLoadFile(&g_MpSetupFile, MPSETUP_OP_DEFAULT); + return mpsetupLoadCurrentFile(); } s32 mpsetupSaveSetup(s32 slotindex) @@ -805,9 +855,9 @@ s32 mpsetupSaveSetup(s32 slotindex) savebufferClear(&setup); mpsetupfileSaveWad(&setup); - memcpy(g_MpSetupFile.setups[slotindex].bytes, &setup.bytes, MPSETUP_BLOCKSIZE); + memcpy(g_MpSetupFile.setups[slotindex].bytes, setup.bytes, MPSETUP_BLOCKSIZE); - return mpsetupSaveFile(MPSETUP_OP_DEFAULT, &g_MpSetupFile); + return mpsetupSaveCurrentFile(); } void mpsetupLoadSetup(s32 index) diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index c324afb47..a8629c8e4 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -3913,6 +3913,23 @@ void mp0f18dec4(s32 slot) #endif } +static u64 packWeaponSetRandomFilters() +{ + u64 packed = 0; + for (int i = 0; i < NUM_MPWEAPONS; ++i) { + packed |= g_MpWeaponSetRandomFilters[i] != 0 ? (1 << i) : 0; + } + + return packed; +} + +static void unpackWeaponSetRandomFilters(u64 packed) +{ + for (int i = 0; i < NUM_MPWEAPONS; ++i) { + g_MpWeaponSetRandomFilters[i] = (packed & (1 << i)) >> i; + } +} + void mpsetupfileLoadWad(struct savebuffer *buffer) { s32 i; @@ -3954,6 +3971,9 @@ void mpsetupfileLoadWad(struct savebuffer *buffer) g_MpSetup.weapons[i] = savebufferReadBits(buffer, 7); } + u64 wpnRndPacked = savebufferReadBits(buffer, 64); + unpackWeaponSetRandomFilters(wpnRndPacked); + func0f18913c(); g_MpSetup.timelimit = savebufferReadBits(buffer, 6); @@ -4020,6 +4040,9 @@ void mpsetupfileSaveWad(struct savebuffer *buffer) savebufferOr(buffer, g_MpSetup.weapons[i], 7); } + u64 wpnRndPacked = packWeaponSetRandomFilters(); + savebufferOr(buffer, wpnRndPacked, 64); + savebufferOr(buffer, g_MpSetup.timelimit, 6); savebufferOr(buffer, g_MpSetup.scorelimit, 7); savebufferOr(buffer, g_MpSetup.teamscorelimit, 9); diff --git a/src/game/mplayer/setup.c b/src/game/mplayer/setup.c index 02ec00730..a70087eda 100644 --- a/src/game/mplayer/setup.c +++ b/src/game/mplayer/setup.c @@ -5363,7 +5363,7 @@ MenuDialogHandlerResult menudialogCombatSimulator(s32 operation, struct menudial g_Vars.waitingtojoin[3] = false; // load the setup file when entering the Combat Simulator - mpsetupLoadCurrentSetupFile(); + mpsetupLoadCurrentFile(); } if (g_Menus[g_MpPlayerNum].curdialog