mirror of
https://github.com/perfect-dark-pc-port/perfect_dark.git
synced 2026-10-24 00:02:43 +02:00
mpsetups: manage default setup + save the selected random weapons
This commit is contained in:
1 parent
9e19055348
commit
a1d6916871
4 files changed
+87
-13
No files matched your search
@@ -3,7 +3,8 @@
|
||||
|
||||
#include "types.h"
|
||||
|
||||
s32 mpsetupLoadCurrentSetupFile();
|
||||
s32 mpsetupLoadCurrentFile();
|
||||
s32 mpsetupSaveCurrentFile();
|
||||
void mpsetupLoadSetup(s32 slotindex);
|
||||
s32 mpsetupSaveSetup(s32 slotindex);
|
||||
|
||||
|
||||
+61
-11
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user