perfect_dark/src/game/fmb.c

851 lines
15 KiB
C

#include <ultra64.h>
#include "constants.h"
#include "game/menu.h"
#include "game/filemgr.h"
#include "game/fmb.h"
#include "game/mainmenu.h"
#include "game/challenge.h"
#include "game/mplayer/mplayer.h"
#include "game/mplayer/scenarios.h"
#include "game/mplayer/setup.h"
#include "bss.h"
#include "data.h"
#include "types.h"
MenuItemHandlerResult fmbHandleDropOut(s32 operation, struct menuitem *item, union handlerdata *data)
{
if (operation == MENUOP_SET) {
menuPopDialog();
menuPopDialog();
if (mpGetNumChrs() == 1) {
func0f0f820c(&g_MainMenu4MbMenuDialog, MENUROOT_4MBMAINMENU);
}
}
return 0;
}
MenuItemHandlerResult fmdHandleAbortGame(s32 operation, struct menuitem *item, union handlerdata *data)
{
if (operation == MENUOP_SET) {
if (g_Vars.stagenum == STAGE_4MBMENU) {
func0f0f820c(&g_MainMenu4MbMenuDialog, MENUROOT_4MBMAINMENU);
} else {
func0f0f820c(&g_SoloMissionPauseMenuDialog, MENUROOT_MAINMENU);
}
}
return 0;
}
MenuItemHandlerResult fmbHandleAdvancedSetup(s32 operation, struct menuitem *item, union handlerdata *data)
{
if (operation == MENUOP_SET) {
func0f0f820c(&g_AdvancedSetup4MbMenuDialog, MENUROOT_4MBMAINMENU);
}
return 0;
}
MenuItemHandlerResult fmbHandleAcceptChallenge(s32 operation, struct menuitem *item, union handlerdata *data)
{
if (operation == MENUOP_SET) {
challengeSetCurrentBySlot(g_Menus[g_MpPlayerNum].main4mb.slotindex);
func0f0f820c(&g_MpQuickGo4MbMenuDialog, MENUROOT_4MBMAINMENU);
}
return 0;
}
void fmbReset(void)
{
s32 i;
u32 prevplayernum = g_MpPlayerNum;
g_MpPlayerNum = 0;
if (g_FileState != FILESTATE_UNSELECTED) {
if (var80087260 == 0) {
g_Vars.mpsetupmenu = MPSETUPMENU_GENERAL;
menuPushRootDialog(&g_MainMenu4MbMenuDialog, MENUROOT_4MBMAINMENU);
}
} else {
g_FileState = FILESTATE_SELECTED;
for (i = 0; i != MAX_MPPLAYERCONFIGS; i++) {
mpPlayerSetDefaults(i, true);
}
g_Vars.bondplayernum = 0;
g_Vars.coopplayernum = -1;
g_Vars.antiplayernum = -1;
challengeDetermineUnlockedFeatures();
menuPushRootDialog(&g_FilemgrFileSelect4MbMenuDialog, MENUROOT_4MBFILEMGR);
#if PAL
if (g_Vars.language >= 6) {
menuPushDialog(&g_ChooseLanguageMenuDialog);
}
#endif
}
g_MpPlayerNum = prevplayernum;
}
MenuDialogHandlerResult fmbHandleMainMenu(s32 operation, struct menudialogdef *dialogdef, union handlerdata *data)
{
if (operation == MENUOP_OPEN) {
g_Vars.waitingtojoin[0] = false;
g_Vars.waitingtojoin[1] = false;
g_Vars.waitingtojoin[2] = false;
g_Vars.waitingtojoin[3] = false;
}
if (g_Menus[g_MpPlayerNum].curdialog
&& g_Menus[g_MpPlayerNum].curdialog->definition == &g_MainMenu4MbMenuDialog
&& operation == MENUOP_TICK) {
g_Vars.mpsetupmenu = MPSETUPMENU_GENERAL;
g_Vars.mpquickteam = MPQUICKTEAM_NONE;
g_Vars.usingadvsetup = false;
challengeUnsetCurrent();
challengeRemovePlayerLock();
}
return false;
}
struct menuitem g_GameFiles4MbMenuItems[] = {
{
MENUITEMTYPE_LABEL,
0,
MENUITEMFLAG_LESSLEFTPADDING | MENUITEMFLAG_DARKERBG,
L_OPTIONS_100, // "Copy:"
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
0,
L_OPTIONS_103, // "Single Player Agent File"
0,
filemgrOpenCopyFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
1,
0,
L_OPTIONS_104, // "Combat Simulator Settings File"
0,
filemgrOpenCopyFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
2,
0,
L_OPTIONS_105, // "Combat Simulator Player File"
0,
filemgrOpenCopyFileMenuHandler,
},
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0,
0,
NULL,
},
{
MENUITEMTYPE_LABEL,
0,
MENUITEMFLAG_LESSLEFTPADDING | MENUITEMFLAG_DARKERBG,
L_OPTIONS_101, // "Delete:"
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
0,
L_OPTIONS_103, // "Single Player Agent File"
0,
filemgrOpenDeleteFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
1,
0,
L_OPTIONS_104, // "Combat Simulator Settings File"
0,
filemgrOpenDeleteFileMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
2,
0,
L_OPTIONS_105, // "Combat Simulator Player File"
0,
filemgrOpenDeleteFileMenuHandler,
},
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0,
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_OPTIONS_102, // "Delete Game Notes..."
0,
(void *)&g_PakChoosePakMenuDialog,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_GameFiles4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
L_OPTIONS_099, // "Game Files"
g_GameFiles4MbMenuItems,
NULL,
MENUDIALOGFLAG_IGNOREBACK,
NULL,
};
struct menuitem g_FilemgrFileSelect4MbMenuItems[] = {
{
MENUITEMTYPE_LABEL,
0,
MENUITEMFLAG_LESSLEFTPADDING | MENUITEMFLAG_DARKERBG,
L_OPTIONS_096, // "Choose Your Reality"
0,
NULL,
},
{
MENUITEMTYPE_LIST,
0,
MENUITEMFLAG_LIST_CUSTOMRENDER,
0x000000f5,
0,
filemgrChooseAgentListMenuHandler,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_FilemgrFileSelect4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
L_OPTIONS_095, // "Perfect Dark"
g_FilemgrFileSelect4MbMenuItems,
filemgrMainMenuDialog,
MENUDIALOGFLAG_IGNOREBACK,
&g_GameFiles4MbMenuDialog,
};
struct menuitem g_AudioVideo4MbMenuItems[] = {
#if VERSION >= VERSION_NTSC_1_0
{
MENUITEMTYPE_SLIDER,
0,
MENUITEMFLAG_SLIDER_FAST | MENUITEMFLAG_SLIDER_HIDEVALUE,
L_OPTIONS_308, // "Sound"
L_MPMENU_000, // ""
menuhandlerSfxVolume,
},
{
MENUITEMTYPE_SLIDER,
0,
MENUITEMFLAG_SLIDER_FAST | MENUITEMFLAG_SLIDER_HIDEVALUE,
L_OPTIONS_309, // "Music"
L_MPMENU_000, // ""
menuhandlerMusicVolume,
},
#else
{
MENUITEMTYPE_SLIDER,
0,
MENUITEMFLAG_SLIDER_FAST | MENUITEMFLAG_SLIDER_HIDEVALUE,
L_OPTIONS_308, // "Sound"
0x7fff,
menuhandlerSfxVolume,
},
{
MENUITEMTYPE_SLIDER,
0,
MENUITEMFLAG_SLIDER_FAST | MENUITEMFLAG_SLIDER_HIDEVALUE,
L_OPTIONS_309, // "Music"
0x7fff,
menuhandlerMusicVolume,
},
#endif
{
MENUITEMTYPE_DROPDOWN,
0,
0,
L_OPTIONS_310, // "Sound Mode"
0,
menuhandlerSoundMode,
},
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0,
0,
NULL,
},
{
MENUITEMTYPE_DROPDOWN,
0,
0,
L_OPTIONS_311, // "Ratio"
0,
menuhandlerScreenRatio,
},
#if PAL
{
MENUITEMTYPE_DROPDOWN,
0,
0,
L_MPWEAPONS_269, // ""
0,
menuhandlerLanguage,
},
#endif
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0,
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_CLOSESDIALOG,
L_OPTIONS_312, // "Back"
0,
NULL,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_AudioVideo4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
L_OPTIONS_307, // "Audio/Visual"
g_AudioVideo4MbMenuItems,
menudialog0010559c,
0,
NULL,
};
struct menuitem g_MpPlayerSetup4MbMenuItems[] = {
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_030, // "Name"
(uintptr_t)&mpGetCurrentPlayerName,
(void *)&g_MpPlayerNameMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_033, // "Control"
0,
(void *)&g_MpControlMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_034, // "Player Options"
0,
(void *)&g_MpPlayerOptionsMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_035, // "Statistics"
0,
(void *)&g_MpPlayerStatsMenuDialog,
},
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0,
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_029, // "Load Player"
0,
(void *)&g_MpLoadPlayerMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
0,
(uintptr_t)&mpMenuTextSavePlayerOrCopy,
0,
menuhandlerMpSavePlayer,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_MpPlayerSetup4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
L_MPMENU_028, // "Player Setup"
g_MpPlayerSetup4MbMenuItems,
NULL,
MENUDIALOGFLAG_DROPOUTONCLOSE,
&g_MpChallengeListOrDetailsMenuDialog,
};
struct menudialogdef g_MpDropOut4MbMenuDialog;
struct menuitem g_MpQuickGo4MbMenuItems[] = {
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MISC_456, // "Start Game"
0,
(void *)&g_MpReadyMenuDialog,
},
#if VERSION >= VERSION_NTSC_1_0
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_029, // "Load Player"
0,
(void *)&g_MpLoadPlayerMenuDialog,
},
#endif
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MISC_458, // "Player Settings"
0,
(void *)&g_MpPlayerSetup4MbMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MISC_457, // "Drop Out"
0,
(void *)&g_MpDropOut4MbMenuDialog,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_MpQuickGo4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
L_MISC_460, // "Quick Go"
g_MpQuickGo4MbMenuItems,
menudialogMpQuickGo,
0,
NULL,
};
struct menuitem g_MpConfirmChallenge4MbMenuItems[] = {
{
MENUITEMTYPE_SCROLLABLE,
DESCRIPTION_MPCONFIG,
0,
0x0000007c,
(VERSION == VERSION_PAL_FINAL ? 65 : 55),
NULL,
},
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0,
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
0,
L_MPMENU_057, // "Accept"
0,
fmbHandleAcceptChallenge,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_CLOSESDIALOG,
L_MPMENU_058, // "Cancel"
0,
NULL,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_MpConfirmChallenge4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
(uintptr_t)&func0f17e318,
g_MpConfirmChallenge4MbMenuItems,
menudialog0017e3fc,
0,
NULL,
};
struct menuitem g_MpChallenges4MbMenuItems[] = {
{
MENUITEMTYPE_LIST,
1,
MENUITEMFLAG_LIST_CUSTOMRENDER,
0x00000078,
0x0000004d,
mpChallengesListMenuHandler,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_MpChallenges4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
L_MPMENU_050, // "Combat Challenges"
g_MpChallenges4MbMenuItems,
mpCombatChallengesMenuDialog,
0,
NULL,
};
struct menuitem g_MainMenu4MbMenuItems[] = {
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG | MENUITEMFLAG_BIGFONT,
L_MISC_441, // "Challenges"
0,
(void *)&g_MpChallenges4MbMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG | MENUITEMFLAG_BIGFONT,
L_MISC_442, // "Load/Preset Games"
0x00000001,
(void *)&g_MpLoadPresetMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG | MENUITEMFLAG_BIGFONT,
L_MISC_443, // "Quick Start"
0x00000002,
(void *)&g_MpQuickTeamMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_BIGFONT,
L_MISC_444, // "Advanced Setup"
0x00000003,
fmbHandleAdvancedSetup,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG | MENUITEMFLAG_BIGFONT,
L_OPTIONS_305, // "Audio/Video"
0,
(void *)&g_AudioVideo4MbMenuDialog,
},
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0x00000082,
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG | MENUITEMFLAG_BIGFONT,
L_OPTIONS_306, // "Change Agent"
0,
(void *)&g_ChangeAgentMenuDialog,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_MainMenu4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
L_OPTIONS_302, // "Small but Perfect Menu"
g_MainMenu4MbMenuItems,
fmbHandleMainMenu,
MENUDIALOGFLAG_MPLOCKABLE | MENUDIALOGFLAG_IGNOREBACK,
NULL,
};
struct menuitem g_MpDropOut4MbMenuItems[] = {
{
MENUITEMTYPE_LABEL,
0,
MENUITEMFLAG_LESSLEFTPADDING,
L_MPMENU_196, // "Are you sure you want to drop out?"
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
0,
L_MPMENU_197, // "Drop Out"
0,
fmbHandleDropOut,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_CLOSESDIALOG,
L_MPMENU_198, // "Cancel"
0,
NULL,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_MpDropOut4MbMenuDialog = {
MENUDIALOGTYPE_DANGER,
L_MPMENU_195, // "Drop Out"
g_MpDropOut4MbMenuItems,
NULL,
0,
NULL,
};
struct menuitem g_UnusedAbortMenuItems[] = {
{
MENUITEMTYPE_LABEL,
0,
MENUITEMFLAG_LESSLEFTPADDING,
L_MPMENU_053, // "Are you sure you want to abort the game?"
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
0,
L_MPMENU_054, // "Abort"
0,
fmdHandleAbortGame,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_CLOSESDIALOG,
L_MPMENU_055, // "Cancel"
0,
NULL,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_UnusedAbortMenuDialog = {
MENUDIALOGTYPE_DANGER,
L_MPMENU_052, // "Abort"
g_UnusedAbortMenuItems,
NULL,
0,
NULL,
};
struct menuitem g_MpEditSimulant4MbMenuItems[] = {
{
MENUITEMTYPE_DROPDOWN,
0,
MENUITEMFLAG_LOCKABLEMINOR,
L_MPMENU_095, // "Difficulty:"
0,
mpBotDifficultyMenuHandler,
},
{
MENUITEMTYPE_SELECTABLE,
0,
0,
L_MPMENU_096, // "Change Type..."
0,
menuhandlerMpChangeSimulantType,
},
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0,
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_LOCKABLEMINOR,
L_MPMENU_098, // "Delete Simulant"
0,
menuhandlerMpDeleteSimulant,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_CLOSESDIALOG,
L_MPMENU_099, // "Back"
0,
NULL,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_MpEditSimulant4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
(uintptr_t)&mpMenuTitleEditSimulant,
g_MpEditSimulant4MbMenuItems,
menudialogMpSimulant,
MENUDIALOGFLAG_MPLOCKABLE,
NULL,
};
struct menuitem g_AdvancedSetup4MbMenuItems[] = {
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG | MENUITEMFLAG_LOCKABLEMINOR,
L_MPMENU_019, // "Scenario"
(uintptr_t)&mpMenuTextScenarioShortName,
(void *)&g_MpScenarioMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
0,
L_MPMENU_021, // "Options"
0,
menuhandlerMpOpenOptions,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_020, // "Arena"
(uintptr_t)&mpMenuTextArenaName,
(void *)&g_MpArenaMenuDialog,
},
{
MENUITEMTYPE_DROPDOWN,
0,
MENUITEMFLAG_LOCKABLEMINOR,
L_MPMENU_044, // "Lock"
0,
menuhandlerMpLock,
},
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0x00000082,
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_023, // "Weapons"
0,
(void *)&g_MpWeaponsMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_024, // "Limits"
0,
(void *)&g_MpLimitsMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPWEAPONS_184, // "Player Handicaps"
0,
(void *)&g_MpHandicapsMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_025, // "Simulants"
0,
(void *)&g_MpSimulantsMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_022, // "Teams"
0,
(void *)&g_MpTeamsMenuDialog,
},
{
MENUITEMTYPE_SEPARATOR,
0,
0,
0x00000082,
0,
NULL,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG,
L_MPMENU_036, // "Start Game"
0,
(void *)&g_MpReadyMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG | MENUITEMFLAG_LOCKABLEMINOR | MENUITEMFLAG_LOCKABLEMAJOR,
L_MPMENU_018, // "Load Settings"
0,
(void *)&g_MpLoadSettingsMenuDialog,
},
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_LOCKABLEMINOR | MENUITEMFLAG_LOCKABLEMAJOR,
L_MPMENU_026, // "Save Settings"
0,
menuhandlerMpSaveSettings,
},
{ MENUITEMTYPE_END },
};
struct menudialogdef g_AdvancedSetup4MbMenuDialog = {
MENUDIALOGTYPE_DEFAULT,
L_MPMENU_017, // "Game Setup"
g_AdvancedSetup4MbMenuItems,
menudialogMpGameSetup,
MENUDIALOGFLAG_MPLOCKABLE | MENUDIALOGFLAG_DROPOUTONCLOSE,
&g_MpPlayerSetup4MbMenuDialog,
};