mirror of
https://github.com/perfect-dark-pc-port/perfect_dark.git
synced 2026-10-24 00:02:43 +02:00
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:
1 parent
4d4fa8f681
commit
8f477a36b6
11 files changed
+87
-62
No files matched your search
@@ -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
@@ -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();
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -4756,7 +4756,7 @@ enum weaponnum {
|
||||
|
||||
#define MPSETUP_MAXSETUPS 128
|
||||
#define MPSETUP_MAXNAME 18
|
||||
#define MPSETUP_BLOCKSIZE 64
|
||||
#define MPSETUP_BLOCKSIZE 80
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user