2020-09-05 20:12:14 +02:00
|
|
|
#include "DRIVER2.H"
|
2020-03-27 21:47:29 +01:00
|
|
|
#include "PAUSE.H"
|
2020-04-11 23:02:26 +02:00
|
|
|
#include "SYSTEM.H"
|
|
|
|
#include "MISSION.H"
|
|
|
|
#include "OVERLAY.H"
|
|
|
|
#include "PRES.H"
|
|
|
|
#include "PAD.H"
|
|
|
|
#include "MAIN.H"
|
|
|
|
#include "GLAUNCH.H"
|
|
|
|
#include "SCORES.H"
|
2020-04-12 15:26:17 +02:00
|
|
|
#include "SOUND.H"
|
2020-04-12 23:30:03 +02:00
|
|
|
#include "CUTSCENE.H"
|
2020-05-27 18:02:16 +02:00
|
|
|
#include "REPLAYS.H"
|
2020-05-30 11:53:05 +02:00
|
|
|
#include "OVERMAP.H"
|
2020-08-22 08:46:41 +02:00
|
|
|
#include "HANDLING.H"
|
2020-08-28 21:42:42 +02:00
|
|
|
#include "../MEMCARD/MAIN.H"
|
|
|
|
|
|
|
|
#include "STRINGS.H"
|
2020-03-27 21:47:29 +01:00
|
|
|
|
2020-04-26 12:17:24 +02:00
|
|
|
static int gScoreEntered = 0;
|
|
|
|
static char EnterNameText[32] = { 0 };
|
|
|
|
static int PauseReturnValue;
|
|
|
|
int pauseflag = 0;
|
|
|
|
int gShowMap = 0;
|
|
|
|
int gDrawPauseMenus = 0;
|
|
|
|
int gEnteringScore = 0;
|
|
|
|
static int gScorePosition = 0;
|
|
|
|
static int allownameentry = 0;
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
#define PAUSE_MENU_LEVELS 3
|
|
|
|
|
|
|
|
static MENU_ITEM* ActiveItem[PAUSE_MENU_LEVELS];
|
|
|
|
static MENU_HEADER* VisibleMenus[PAUSE_MENU_LEVELS];
|
2020-10-31 01:11:58 +01:00
|
|
|
static MENU_HEADER* ActiveMenu;
|
2020-04-26 12:17:24 +02:00
|
|
|
static int ActiveMenuItem;
|
|
|
|
static int VisibleMenu;
|
2020-11-18 19:21:16 +01:00
|
|
|
|
2020-04-26 12:17:24 +02:00
|
|
|
static char SfxVolumeText[8];
|
|
|
|
static char MusicVolumeText[8];
|
|
|
|
|
2020-08-28 21:42:42 +02:00
|
|
|
static char ScoreTime[5][16];
|
|
|
|
static char ScoreItems[5][16];
|
|
|
|
static char ScoreName[5][7];
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
static char validchars[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+!\xFF\xFE";
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-03-27 21:47:29 +01:00
|
|
|
void PauseMap(int direction);
|
|
|
|
void SfxVolume(int direction);
|
|
|
|
void MusicVolume(int direction);
|
|
|
|
void SaveReplay(int direction);
|
|
|
|
void SaveGame(int direction);
|
|
|
|
void EnterName();
|
|
|
|
|
|
|
|
char EnterScoreText[32] = { 0 };
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
enum MenuItemType
|
|
|
|
{
|
|
|
|
//PAUSE_TYPE_ACTIVE = (1 << 0), // suggested - USUSED flag
|
|
|
|
PAUSE_TYPE_FUNC = (1 << 1), // simple function calling when pressing Cross
|
|
|
|
PAUSE_TYPE_DIRFUNC = (1 << 2), // function calling with direction (left/right)
|
|
|
|
PAUSE_TYPE_SFXVOLUME = (1 << 3),
|
|
|
|
PAUSE_TYPE_MUSICVOLUME = (1 << 4),
|
|
|
|
PAUSE_TYPE_SUBMENU = (1 << 6),
|
|
|
|
PAUSE_TYPE_ENDITEMS = (1 << 7),
|
|
|
|
};
|
|
|
|
|
2020-04-26 14:20:35 +02:00
|
|
|
#if defined(_DEBUG) || defined(DEBUG_OPTIONS)
|
2020-04-26 12:07:37 +02:00
|
|
|
|
2020-04-26 12:17:24 +02:00
|
|
|
void SetRightWayUp(int direction)
|
2020-04-26 12:07:37 +02:00
|
|
|
{
|
|
|
|
extern char gRightWayUp;
|
2020-04-26 12:17:24 +02:00
|
|
|
gRightWayUp = 1;
|
|
|
|
PauseReturnValue = MENU_QUIT_CONTINUE;
|
2020-04-26 12:07:37 +02:00
|
|
|
}
|
|
|
|
|
2020-11-07 19:49:16 +01:00
|
|
|
void SetDisplayPosition(int direction)
|
|
|
|
{
|
|
|
|
extern int gDisplayPosition;
|
|
|
|
gDisplayPosition ^= 1;
|
|
|
|
}
|
|
|
|
|
2020-09-26 18:37:50 +02:00
|
|
|
void ToggleInvincibility(int direction)
|
2020-04-26 12:07:37 +02:00
|
|
|
{
|
|
|
|
extern int gInvincibleCar;
|
2020-04-26 12:23:42 +02:00
|
|
|
gInvincibleCar ^= 1;
|
2020-04-26 12:07:37 +02:00
|
|
|
}
|
|
|
|
|
2020-09-26 18:37:50 +02:00
|
|
|
void ToggleImmunity(int direction)
|
2020-04-26 12:07:37 +02:00
|
|
|
{
|
|
|
|
extern int gPlayerImmune;
|
2020-04-26 12:23:42 +02:00
|
|
|
gPlayerImmune ^= 1;
|
2020-04-26 12:07:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void TogglePlayerGhost(int direction)
|
|
|
|
{
|
|
|
|
extern int playerghost;
|
2020-04-26 12:23:42 +02:00
|
|
|
playerghost ^= 1;
|
2020-04-26 12:07:37 +02:00
|
|
|
}
|
|
|
|
|
2020-09-26 18:37:50 +02:00
|
|
|
void ToggleOverlays(int direction)
|
|
|
|
{
|
|
|
|
gDoOverlays ^= 1;
|
|
|
|
}
|
|
|
|
|
2020-08-22 09:29:17 +02:00
|
|
|
int lastCar = -1;
|
|
|
|
|
2020-08-22 08:46:41 +02:00
|
|
|
void ToggleSecretCarFun(int direction)
|
|
|
|
{
|
|
|
|
extern CAR_COSMETICS car_cosmetics[5];
|
2020-08-22 09:29:17 +02:00
|
|
|
extern int wantedCar[2];
|
|
|
|
|
|
|
|
int active = (ActiveCheats.cheat10 ^= 1);
|
|
|
|
|
|
|
|
if (active)
|
|
|
|
{
|
|
|
|
if (lastCar == -1)
|
|
|
|
lastCar = wantedCar[0];
|
|
|
|
|
|
|
|
// make our current car the secret car
|
|
|
|
wantedCar[0] = 12;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (lastCar != -1)
|
|
|
|
{
|
|
|
|
// restore our initial car
|
|
|
|
wantedCar[0] = lastCar;
|
|
|
|
lastCar = -1;
|
|
|
|
}
|
|
|
|
}
|
2020-08-22 08:46:41 +02:00
|
|
|
|
|
|
|
FixCarCos(&car_cosmetics[4], 12);
|
|
|
|
}
|
|
|
|
|
2020-10-05 20:42:38 +02:00
|
|
|
void ToggleMiniCars(int direction)
|
|
|
|
{
|
|
|
|
ActiveCheats.cheat13 ^= 1;
|
|
|
|
}
|
|
|
|
|
2020-09-04 21:08:51 +02:00
|
|
|
void ToggleJerichoMode(int direction)
|
|
|
|
{
|
|
|
|
ActiveCheats.cheat12 ^= 1;
|
|
|
|
}
|
|
|
|
|
2020-09-26 18:37:50 +02:00
|
|
|
void TogglePuppyDogCops(int direction)
|
|
|
|
{
|
|
|
|
gPuppyDogCop ^= 1;
|
|
|
|
}
|
|
|
|
|
2020-04-26 12:07:37 +02:00
|
|
|
extern void LoadSky(void);
|
|
|
|
|
|
|
|
void DebugTimeOfDayDay(int direction)
|
|
|
|
{
|
2020-11-14 22:05:05 +01:00
|
|
|
wantedTimeOfDay = 1;
|
2020-04-26 12:07:37 +02:00
|
|
|
gTimeOfDay = 1;
|
2020-05-06 06:42:10 +02:00
|
|
|
gWantNight = 0;
|
2020-04-26 12:07:37 +02:00
|
|
|
LoadSky();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DebugTimeOfDayNight(int direction)
|
|
|
|
{
|
2020-11-14 22:05:05 +01:00
|
|
|
wantedTimeOfDay = 3;
|
2020-04-26 12:07:37 +02:00
|
|
|
gTimeOfDay = 3;
|
2020-05-06 06:42:10 +02:00
|
|
|
gWantNight = 1;
|
2020-04-26 12:07:37 +02:00
|
|
|
LoadSky();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DebugTimeOfDayDusk(int direction)
|
|
|
|
{
|
2020-11-14 22:05:05 +01:00
|
|
|
wantedTimeOfDay = 0;
|
2020-04-26 12:07:37 +02:00
|
|
|
gTimeOfDay = 0;
|
2020-05-06 06:42:10 +02:00
|
|
|
gWantNight = 0;
|
2020-04-26 12:07:37 +02:00
|
|
|
LoadSky();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DebugTimeOfDayDawn(int direction)
|
|
|
|
{
|
2020-11-14 22:05:05 +01:00
|
|
|
wantedTimeOfDay = 2;
|
2020-04-26 12:07:37 +02:00
|
|
|
gTimeOfDay = 2;
|
2020-05-06 06:42:10 +02:00
|
|
|
gWantNight = 0;
|
2020-04-26 12:07:37 +02:00
|
|
|
LoadSky();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DebugTimeOfDayRain(int direction)
|
|
|
|
{
|
|
|
|
//extern int weather;
|
|
|
|
//weather ^= weather;
|
2020-04-26 12:23:42 +02:00
|
|
|
gWeather ^= 1;
|
2020-11-14 22:05:05 +01:00
|
|
|
wantedWeather = gWeather;
|
2020-04-26 12:23:42 +02:00
|
|
|
|
|
|
|
if (gWeather == 1)
|
|
|
|
wetness = 7000;
|
|
|
|
else
|
|
|
|
wetness = 0;
|
|
|
|
|
2020-04-26 12:07:37 +02:00
|
|
|
LoadSky();
|
|
|
|
}
|
|
|
|
|
|
|
|
MENU_ITEM DebugTimeOfDayItems[] =
|
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
{ "Day", PAUSE_TYPE_FUNC, 2, DebugTimeOfDayDay, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Night", PAUSE_TYPE_FUNC, 2, DebugTimeOfDayNight,MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Dusk", PAUSE_TYPE_FUNC, 2, DebugTimeOfDayDusk, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Dawn", PAUSE_TYPE_FUNC, 2, DebugTimeOfDayDawn, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Rain", PAUSE_TYPE_FUNC, 2, DebugTimeOfDayRain, MENU_QUIT_NONE, NULL },
|
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-04-26 12:07:37 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
MENU_HEADER DebugTimeOfDayHeader =
|
|
|
|
{ "Time Of Day", { 0, 0, 0, 0 }, 0u, DebugTimeOfDayItems };
|
|
|
|
|
2020-09-26 18:37:50 +02:00
|
|
|
MENU_ITEM DebugJustForFunItems[] =
|
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
{ "Secret Car Fun", PAUSE_TYPE_FUNC, 2, ToggleSecretCarFun, MENU_QUIT_RESTART, NULL },
|
|
|
|
{ "Mini Cars", PAUSE_TYPE_FUNC, 2, ToggleMiniCars, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Jericho Mode", PAUSE_TYPE_FUNC, 2, ToggleJerichoMode, MENU_QUIT_NONE, NULL },
|
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-09-26 18:37:50 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
MENU_HEADER DebugJustForFunHeader =
|
|
|
|
{ "Just for fun", { 0, 0, 0, 0 }, 0u, DebugJustForFunItems };
|
|
|
|
|
2020-10-04 20:19:53 +02:00
|
|
|
#ifdef CUTSCENE_RECORDER
|
|
|
|
extern void NextCutsceneRecorderPlayer(int dir);
|
|
|
|
extern char gCutsceneRecorderPauseText[64];
|
2020-10-09 22:13:49 +02:00
|
|
|
|
|
|
|
extern void NextChase(int dir);
|
|
|
|
extern char gCurrentChasePauseText[64];
|
2020-10-04 20:19:53 +02:00
|
|
|
#endif
|
|
|
|
|
2020-04-26 12:07:37 +02:00
|
|
|
MENU_ITEM DebugOptionsItems[] =
|
|
|
|
{
|
2020-10-09 22:13:49 +02:00
|
|
|
#ifdef CUTSCENE_RECORDER
|
|
|
|
//{ gCutsceneRecorderPauseText, 5u, 2u, (pauseFunc)&NextCutsceneRecorderPlayer, MENU_QUIT_NONE, NULL },
|
|
|
|
{ gCurrentChasePauseText, 5u, 2u, (pauseFunc)&NextChase, MENU_QUIT_NONE, NULL },
|
2020-10-04 20:19:53 +02:00
|
|
|
#endif
|
2020-11-18 19:21:16 +01:00
|
|
|
{ "Display position", PAUSE_TYPE_FUNC, 2, SetDisplayPosition, MENU_QUIT_NONE, NULL},
|
|
|
|
{ "Back on Wheels", PAUSE_TYPE_FUNC, 2, SetRightWayUp, MENU_QUIT_NONE, NULL},
|
|
|
|
{ "Time of Day", PAUSE_TYPE_SUBMENU, 2, NULL, MENU_QUIT_NONE, &DebugTimeOfDayHeader },
|
|
|
|
{ "Fun Cheats", PAUSE_TYPE_SUBMENU, 2, NULL, MENU_QUIT_NONE, &DebugJustForFunHeader },
|
|
|
|
{ "Invincibility", PAUSE_TYPE_FUNC, 2, ToggleInvincibility,MENU_QUIT_NONE, NULL},
|
|
|
|
{ "Immunity", PAUSE_TYPE_FUNC, 2, ToggleImmunity, MENU_QUIT_NONE, NULL},
|
|
|
|
{ "Puppy Dog Cops", PAUSE_TYPE_FUNC, 2, TogglePuppyDogCops, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Toggle Overlay", PAUSE_TYPE_FUNC, 2, ToggleOverlays, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Player Ghost", PAUSE_TYPE_FUNC, 2, TogglePlayerGhost, MENU_QUIT_NONE, NULL },
|
2020-11-20 21:10:17 +01:00
|
|
|
{ "Next Mission", 0, 2, NULL, MENU_QUIT_NEXTMISSION, NULL },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-04-26 12:07:37 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
MENU_HEADER DebugOptionsHeader =
|
|
|
|
{ "Debug Options", { 0, 0, 0, 0 }, 0u, DebugOptionsItems };
|
|
|
|
#endif
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM YesNoRestartItems[] =
|
2020-04-05 22:04:37 +02:00
|
|
|
{
|
|
|
|
{ "NO", 1u, 2u, NULL, MENU_QUIT_BACKMENU, NULL },
|
|
|
|
{ "YES", 1u, 2u, NULL, MENU_QUIT_RESTART, NULL },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-04-05 22:04:37 +02:00
|
|
|
};
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM YesNoQuitItems[] =
|
2020-04-05 22:04:37 +02:00
|
|
|
{
|
|
|
|
{ "NO", 1u, 2u, NULL, MENU_QUIT_BACKMENU, NULL },
|
|
|
|
{ "YES", 1u, 2u, NULL, MENU_QUIT_QUIT, NULL },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-04-05 22:04:37 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
MENU_HEADER YesNoRestartHeader =
|
2020-08-31 13:15:40 +02:00
|
|
|
{ "Are You Sure?", { 0, 0, 0, 0 }, 0u, YesNoRestartItems };
|
2020-04-05 22:04:37 +02:00
|
|
|
|
|
|
|
MENU_HEADER YesNoQuitHeader =
|
2020-08-31 13:15:40 +02:00
|
|
|
{ "Are You Sure?", { 0, 0, 0, 0 }, 0u, YesNoQuitItems };
|
2020-04-05 22:04:37 +02:00
|
|
|
|
2020-04-26 12:07:37 +02:00
|
|
|
MENU_ITEM MainPauseItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
2020-04-12 15:26:17 +02:00
|
|
|
{ "Continue", 1u, 2u, NULL, MENU_QUIT_CONTINUE, NULL },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ "Show Map", PAUSE_TYPE_FUNC, 2u, (pauseFunc)&PauseMap, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Restart", PAUSE_TYPE_SUBMENU, 2u, NULL, MENU_QUIT_NONE, &YesNoRestartHeader },
|
|
|
|
{ "Sfx Volume", PAUSE_TYPE_SFXVOLUME | PAUSE_TYPE_DIRFUNC, 2u, (pauseFunc)&SfxVolume, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Music Volume", PAUSE_TYPE_MUSICVOLUME | PAUSE_TYPE_DIRFUNC, 2u, (pauseFunc)&MusicVolume, MENU_QUIT_NONE, NULL },
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Film Director", 1u, 2u, NULL, MENU_QUIT_DIRECTOR, NULL},
|
|
|
|
{ "Quick Replay",1u,2u,NULL,MENU_QUIT_QUICKREPLAY,NULL},
|
2020-09-26 18:37:50 +02:00
|
|
|
#if defined(_DEBUG) || defined(DEBUG_OPTIONS)
|
2020-11-18 19:21:16 +01:00
|
|
|
{ "Debug Options", PAUSE_TYPE_SUBMENU, 2u, NULL, MENU_QUIT_NONE, &DebugOptionsHeader },
|
2020-09-26 18:37:50 +02:00
|
|
|
#endif
|
2020-11-18 19:21:16 +01:00
|
|
|
{ "Exit", PAUSE_TYPE_SUBMENU, 2u, NULL, MENU_QUIT_NONE, &YesNoQuitHeader },
|
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-11-16 18:15:28 +01:00
|
|
|
MENU_ITEM MultiplayerPauseItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
2020-11-16 18:15:28 +01:00
|
|
|
{ "Continue", 1u, 2u, NULL, MENU_QUIT_CONTINUE, NULL },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ "Restart", PAUSE_TYPE_SUBMENU, 2u, NULL, MENU_QUIT_NONE, &YesNoRestartHeader },
|
|
|
|
{ "Sfx Volume", PAUSE_TYPE_SFXVOLUME | PAUSE_TYPE_DIRFUNC, 2u, (pauseFunc)&SfxVolume, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Music Volume", PAUSE_TYPE_MUSICVOLUME | PAUSE_TYPE_DIRFUNC, 2u, (pauseFunc)&MusicVolume, MENU_QUIT_NONE, NULL },
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Quick Replay",1u,2u,NULL,MENU_QUIT_QUICKREPLAY,NULL},
|
2020-11-18 19:21:16 +01:00
|
|
|
{ "Exit", PAUSE_TYPE_SUBMENU, 2u, NULL, MENU_QUIT_NONE, &YesNoQuitHeader },
|
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-09-26 20:20:22 +02:00
|
|
|
void SkipCutscene(int dir)
|
|
|
|
{
|
|
|
|
gSkipInGameCutscene = 1;
|
|
|
|
}
|
2020-03-27 21:47:29 +01:00
|
|
|
|
2020-04-26 12:07:37 +02:00
|
|
|
MENU_ITEM CutscenePauseItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
|
|
|
{ "Continue", 1u, 2u, NULL, MENU_QUIT_CONTINUE, NULL },
|
2020-09-26 20:20:22 +02:00
|
|
|
#if defined(_DEBUG) || defined(DEBUG_OPTIONS)
|
|
|
|
{ "Skip Cutscene", 3u, 2u, (pauseFunc)&SkipCutscene, MENU_QUIT_CONTINUE, NULL },
|
|
|
|
#endif
|
2020-03-27 21:47:29 +01:00
|
|
|
{ "Restart", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoRestartHeader },
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Effects Volume", 13u, 2u, (pauseFunc)&SfxVolume, MENU_QUIT_NONE, NULL },
|
|
|
|
{ "Music Volume", 21u, 2u, (pauseFunc)&MusicVolume, MENU_QUIT_NONE, NULL },
|
2020-09-26 18:37:50 +02:00
|
|
|
#if defined(_DEBUG) || defined(DEBUG_OPTIONS)
|
|
|
|
{ "Debug Options", 65u, 2u, NULL, MENU_QUIT_NONE, &DebugOptionsHeader },
|
|
|
|
#endif
|
2020-03-27 21:47:29 +01:00
|
|
|
{ "Exit", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoQuitHeader },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-08-31 13:15:40 +02:00
|
|
|
MENU_ITEM MissionCompleteItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
2020-08-31 13:15:40 +02:00
|
|
|
#ifdef PSX
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Save Game", 3u, 2u, (pauseFunc)&SaveGame, MENU_QUIT_NONE, NULL },
|
2020-08-31 13:15:40 +02:00
|
|
|
#endif
|
2020-05-17 19:45:44 +02:00
|
|
|
{ "Continue", 1u, 2u, NULL, MENU_QUIT_NEXTMISSION, NULL },
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Film Director",1u,2u,NULL,MENU_QUIT_DIRECTOR,NULL},
|
|
|
|
{ "Quick Replay",1u,2u,NULL,MENU_QUIT_QUICKREPLAY,NULL},
|
|
|
|
{ "Save Replay", 3u, 2u, (pauseFunc)&SaveReplay, MENU_QUIT_NONE, NULL },
|
2020-03-27 21:47:29 +01:00
|
|
|
{ "Restart", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoRestartHeader },
|
|
|
|
{ "Exit", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoQuitHeader },
|
|
|
|
{ NULL, 128u, 0u, NULL, MENU_QUIT_NONE, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
MENU_ITEM MissionFailedItems[6] =
|
|
|
|
{
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Film Director",1u,2u,NULL,MENU_QUIT_DIRECTOR,NULL},
|
|
|
|
{ "Quick Replay",1u,2u,NULL,MENU_QUIT_QUICKREPLAY,NULL},
|
2020-04-05 22:04:37 +02:00
|
|
|
{ "Exit", 3u, 2u, (pauseFunc)&SaveReplay, MENU_QUIT_NONE, NULL },
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Retry Mission",65u,2u,NULL,MENU_QUIT_NONE,&YesNoRestartHeader },
|
2020-03-27 21:47:29 +01:00
|
|
|
{ "Exit", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoQuitHeader },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-05-20 23:33:21 +02:00
|
|
|
MENU_ITEM TakeARideFinishedItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
|
|
|
{ "Restart", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoRestartHeader },
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Film Director",1u,2u,NULL,MENU_QUIT_DIRECTOR,NULL},
|
|
|
|
{ "Quick Replay",1u,2u,NULL,MENU_QUIT_QUICKREPLAY,NULL},
|
|
|
|
{ "Save Replay", 3u, 2u, (pauseFunc)&SaveReplay, MENU_QUIT_NONE, NULL },
|
2020-03-27 21:47:29 +01:00
|
|
|
{ "Exit", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoQuitHeader },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM DrivingGameFinishedItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
2020-08-31 13:15:40 +02:00
|
|
|
{ "Play Again", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoRestartHeader },
|
2020-04-12 15:04:54 +02:00
|
|
|
{ EnterScoreText, 3u, 2u, (pauseFunc)&EnterName, MENU_QUIT_NONE, NULL },
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Film Director",1u,2u,NULL,MENU_QUIT_DIRECTOR,NULL},
|
|
|
|
{ "Quick Replay",1u,2u,NULL,MENU_QUIT_QUICKREPLAY,NULL},
|
|
|
|
{ "Save Replay", 3u, 2u, (pauseFunc)&SaveReplay, MENU_QUIT_NONE, NULL },
|
2020-03-27 21:47:29 +01:00
|
|
|
{ "Exit", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoQuitHeader },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM MultiplayerFinishedItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
2020-08-31 13:15:40 +02:00
|
|
|
{ "Play Again", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoRestartHeader },
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Quick Replay",1u,2u,NULL,MENU_QUIT_QUICKREPLAY,NULL},
|
|
|
|
{ "Save Replay", 3u, 2u, (pauseFunc)&SaveReplay, MENU_QUIT_NONE, NULL },
|
2020-03-27 21:47:29 +01:00
|
|
|
{ "Exit", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoQuitHeader },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM ChaseGameFinishedItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
2020-08-31 13:15:40 +02:00
|
|
|
{ "Play Again", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoRestartHeader },
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Film Director",1u,2u,NULL,MENU_QUIT_DIRECTOR,NULL},
|
|
|
|
{ "Quick Replay",1u,2u,NULL,MENU_QUIT_QUICKREPLAY,NULL},
|
|
|
|
{ "Save Replay", 3u, 2u, (pauseFunc)&SaveReplay, MENU_QUIT_NONE, NULL },
|
2020-03-27 21:47:29 +01:00
|
|
|
{ "Exit", 65u, 2u, NULL, MENU_QUIT_NONE, &YesNoQuitHeader },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM NoPadItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
|
|
|
{ NULL, 128u, 0u, NULL, MENU_QUIT_NONE, NULL}
|
|
|
|
};
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM NoMultiPadItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
|
|
|
{ "Exit", 1u, 2u, NULL, MENU_QUIT_QUIT, NULL },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM InvalidPadItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL}
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM InvalidMultiPadItems[] =
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
|
|
|
{ "Exit", 1u, 2u, NULL, MENU_QUIT_QUIT, NULL },
|
2020-11-18 19:21:16 +01:00
|
|
|
{ NULL, PAUSE_TYPE_ENDITEMS, 0u, NULL, MENU_QUIT_NONE, NULL }
|
2020-03-27 21:47:29 +01:00
|
|
|
};
|
|
|
|
|
2020-04-26 12:07:37 +02:00
|
|
|
|
2020-03-27 21:47:29 +01:00
|
|
|
MENU_HEADER PauseMenuHeader =
|
2020-04-12 15:26:17 +02:00
|
|
|
{ "Paused", { 0, 0, 0, 0 }, 0u, MainPauseItems };
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
MENU_HEADER MultiplayerPauseHeader =
|
2020-04-12 15:26:17 +02:00
|
|
|
{ "Paused", { 0, 0, 0, 0 }, 0u, MultiplayerPauseItems };
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
MENU_HEADER CutscenePauseMenuHeader =
|
2020-04-12 15:26:17 +02:00
|
|
|
{ "Paused", { 0, 0, 0, 0 }, 0u, CutscenePauseItems };
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
MENU_HEADER MissionCompleteHeader =
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Mission Successful", { 0, 0, 0, 0 }, 0u, MissionCompleteItems };
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
MENU_HEADER MissionFailedHeader =
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Mission Failed", { 0, 0, 0, 0 }, 0u, MissionFailedItems };
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
MENU_HEADER TakeARideFinishedHeader =
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Game Over", { 0, 0, 0, 0 }, 0u, TakeARideFinishedItems };
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
MENU_HEADER DrivingGameFinishedHeader =
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Game Over", { 0, 0, 0, 0 }, 0u, DrivingGameFinishedItems };
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
MENU_HEADER MultiplayerFinishedHeader =
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Game Over", { 0, 0, 0, 0 }, 0u, MultiplayerFinishedItems };
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
MENU_HEADER ChaseGameFinishedHeader =
|
2020-04-11 23:24:54 +02:00
|
|
|
{ "Game Over", { 0, 0, 0, 0 }, 0u, ChaseGameFinishedItems };
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
MENU_HEADER NoPadHeader =
|
|
|
|
{
|
2020-10-07 11:11:58 +02:00
|
|
|
"Insert a Controller in port 1",
|
2020-03-27 21:47:29 +01:00
|
|
|
{ 0, 0, 0, 0 },
|
|
|
|
0u,
|
|
|
|
NoPadItems
|
|
|
|
};
|
|
|
|
|
|
|
|
MENU_HEADER NoMultiPadHeader =
|
|
|
|
{
|
2020-10-07 11:11:58 +02:00
|
|
|
"Insert a Controller in port 2",
|
2020-03-27 21:47:29 +01:00
|
|
|
{ 0, 0, 0, 0 },
|
|
|
|
0u,
|
|
|
|
NoMultiPadItems
|
|
|
|
};
|
|
|
|
|
|
|
|
MENU_HEADER InvalidPadHeader =
|
|
|
|
{
|
2020-10-07 11:11:58 +02:00
|
|
|
"Unsupported controller in port 1",
|
2020-03-27 21:47:29 +01:00
|
|
|
{ 0, 0, 0, 0 },
|
|
|
|
0u,
|
|
|
|
InvalidPadItems
|
|
|
|
};
|
|
|
|
|
|
|
|
MENU_HEADER InvalidMultiPadHeader =
|
|
|
|
{
|
2020-10-07 11:11:58 +02:00
|
|
|
"Unsupported controller in port 2",
|
2020-03-27 21:47:29 +01:00
|
|
|
{ 0, 0, 0, 0 },
|
|
|
|
0u,
|
|
|
|
InvalidMultiPadItems
|
|
|
|
};
|
|
|
|
|
|
|
|
int playerwithcontrol[3] = { 0 };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
2020-10-31 01:11:58 +01:00
|
|
|
// int /*$ra*/ ShowPauseMenu(PAUSEMODE mode /*$s0*/)
|
2020-03-27 21:47:29 +01:00
|
|
|
// line 1004, offset 0x0006bf50
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 1005
|
|
|
|
// Start offset: 0x0006BF50
|
|
|
|
// Variables:
|
2020-10-31 01:11:58 +01:00
|
|
|
// PAUSEMODE passed_mode; // $s2
|
2020-03-27 21:47:29 +01:00
|
|
|
|
|
|
|
/* begin block 1.1 */
|
|
|
|
// Start line: 1062
|
|
|
|
// Start offset: 0x0006C0C0
|
|
|
|
/* end block 1.1 */
|
|
|
|
// End offset: 0x0006C140
|
|
|
|
// End Line: 1085
|
|
|
|
|
|
|
|
/* begin block 1.2 */
|
|
|
|
// Start line: 1092
|
|
|
|
// Start offset: 0x0006C178
|
|
|
|
// Variables:
|
2020-10-31 01:11:58 +01:00
|
|
|
// RECT rect; // stack offset -32
|
2020-03-27 21:47:29 +01:00
|
|
|
/* end block 1.2 */
|
|
|
|
// End offset: 0x0006C1FC
|
|
|
|
// End Line: 1101
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006C2AC
|
|
|
|
// End Line: 1137
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 2008
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 2009
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
int ShowPauseMenu(PAUSEMODE mode)
|
|
|
|
{
|
2020-05-12 06:00:32 +02:00
|
|
|
PAUSEMODE passed_mode;
|
2020-04-11 23:02:26 +02:00
|
|
|
RECT16 rect;
|
2020-04-05 22:04:37 +02:00
|
|
|
|
|
|
|
ReadControllers();
|
2020-05-12 06:00:32 +02:00
|
|
|
|
|
|
|
if (mode == PAUSEMODE_PAUSEP1)
|
|
|
|
{
|
|
|
|
playerwithcontrol[0] = 1;
|
2020-04-11 23:02:26 +02:00
|
|
|
playerwithcontrol[1] = 0;
|
|
|
|
playerwithcontrol[2] = 0;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
else if (mode == PAUSEMODE_PAUSEP2)
|
|
|
|
{
|
|
|
|
playerwithcontrol[0] = 0;
|
|
|
|
playerwithcontrol[1] = 1;
|
|
|
|
playerwithcontrol[2] = 0;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
playerwithcontrol[0] = 0;
|
|
|
|
playerwithcontrol[1] = 0;
|
|
|
|
playerwithcontrol[2] = 1;
|
|
|
|
}
|
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
SetDispMask(1);
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
SfxVolume(0);
|
|
|
|
MusicVolume(0);
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
StopPadVibration(0);
|
|
|
|
StopPadVibration(1);
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
InitaliseMenu(mode);
|
|
|
|
gDrawPauseMenus = 1;
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (NoPlayerControl == 0 && OnScoreTable(NULL) != -1 && allownameentry)
|
2020-05-12 06:00:32 +02:00
|
|
|
{
|
2020-04-05 22:04:37 +02:00
|
|
|
gScoreEntered = 0;
|
2020-11-18 19:21:16 +01:00
|
|
|
|
2020-08-31 13:15:40 +02:00
|
|
|
sprintf(EnterScoreText, "Enter Score");
|
|
|
|
sprintf(EnterNameText, "Enter Name:");
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
else
|
|
|
|
{
|
2020-04-05 22:04:37 +02:00
|
|
|
gScoreEntered = 1;
|
2020-11-18 19:21:16 +01:00
|
|
|
|
2020-08-31 13:15:40 +02:00
|
|
|
sprintf(EnterScoreText, "View Table");
|
|
|
|
sprintf(EnterNameText, "High Scores");
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
|
|
|
|
passed_mode = mode;
|
|
|
|
|
|
|
|
if (mode == PAUSEMODE_PADERROR)
|
|
|
|
mode = PAUSEMODE_PAUSE;
|
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
PauseReturnValue = 0;
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
do {
|
|
|
|
UpdatePadData();
|
2020-05-12 06:00:32 +02:00
|
|
|
|
|
|
|
if (passed_mode == PAUSEMODE_PADERROR)
|
|
|
|
{
|
|
|
|
if (pad_connected == 1)
|
|
|
|
{
|
|
|
|
InitaliseMenu(mode);
|
|
|
|
passed_mode = mode;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
else
|
|
|
|
{
|
2020-04-05 22:04:37 +02:00
|
|
|
InitaliseMenu(PAUSEMODE_PADERROR);
|
|
|
|
}
|
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (pad_connected != 1)
|
|
|
|
{
|
|
|
|
passed_mode = PAUSEMODE_PADERROR;
|
2020-04-05 22:04:37 +02:00
|
|
|
InitaliseMenu(PAUSEMODE_PADERROR);
|
|
|
|
}
|
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
|
|
|
|
if (pad_connected < 1)
|
2020-04-11 23:02:26 +02:00
|
|
|
playerwithcontrol[2] = 1;
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
ControlMenu();
|
|
|
|
DrawGame();
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
} while (PauseReturnValue == 0);
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
gDrawPauseMenus = 0;
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (NumPlayers > 1)
|
2020-05-12 06:00:32 +02:00
|
|
|
{
|
2020-04-11 23:02:26 +02:00
|
|
|
rect.x = 0;
|
2020-05-12 06:00:32 +02:00
|
|
|
rect.w = 320;
|
2020-04-11 23:02:26 +02:00
|
|
|
rect.h = 1;
|
2020-05-12 06:00:32 +02:00
|
|
|
rect.y = current->draw.clip.y + current->draw.clip.h;
|
2020-11-18 19:21:16 +01:00
|
|
|
|
2020-05-12 06:00:32 +02:00
|
|
|
ClearImage2(&rect, 0, 0, 0);
|
2020-04-05 22:04:37 +02:00
|
|
|
DrawGame();
|
2020-11-18 19:21:16 +01:00
|
|
|
|
2020-05-12 06:00:32 +02:00
|
|
|
ClearImage2(&rect, 0, 0, 0);
|
2020-04-05 22:04:37 +02:00
|
|
|
DrawGame();
|
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
|
|
|
|
switch (PauseReturnValue)
|
|
|
|
{
|
2020-04-11 23:02:26 +02:00
|
|
|
case 1:
|
|
|
|
pauseflag = 0;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
EndGame(GAMEMODE_QUIT);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
EndGame(GAMEMODE_RESTART);
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
EndGame(GAMEMODE_DIRECTOR);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
EndGame(GAMEMODE_REPLAY);
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
EndGame(GAMEMODE_NEXTMISSION);
|
2020-05-12 06:00:32 +02:00
|
|
|
break;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-04-11 23:02:26 +02:00
|
|
|
return PauseReturnValue;
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ DrawPauseMenus()
|
|
|
|
// line 1139, offset 0x0006dcd4
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 4357
|
|
|
|
/* end block 1 */
|
|
|
|
// End Line: 4358
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 2278
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 2279
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 4358
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 4359
|
|
|
|
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void DrawPauseMenus(void)
|
|
|
|
{
|
2020-08-30 18:30:48 +02:00
|
|
|
#if !defined(PSX) && defined(DEBUG_OPTIONS)
|
|
|
|
extern int g_FreeCameraEnabled;
|
|
|
|
|
|
|
|
if (g_FreeCameraEnabled)
|
|
|
|
return;
|
|
|
|
#endif
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (gDrawPauseMenus && gShowMap == 0)
|
2020-05-12 06:00:32 +02:00
|
|
|
{
|
|
|
|
if (gEnteringScore == 0)
|
2020-04-05 22:04:37 +02:00
|
|
|
DrawVisibleMenus();
|
2020-05-12 06:00:32 +02:00
|
|
|
else
|
2020-04-05 22:04:37 +02:00
|
|
|
DrawHighScoreMenu(gScorePosition);
|
|
|
|
}
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ SaveReplay(int direction /*$a0*/)
|
|
|
|
// line 1153, offset 0x0006d9b0
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 3753
|
|
|
|
/* end block 1 */
|
|
|
|
// End Line: 3754
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 2306
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 2307
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 3754
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 3755
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void SaveReplay(int direction)
|
|
|
|
{
|
2020-11-11 19:37:19 +01:00
|
|
|
char filename[64];
|
2020-05-27 18:02:16 +02:00
|
|
|
#ifdef PSX
|
2020-04-05 22:04:37 +02:00
|
|
|
CallMemoryCard(0x10, 1);
|
2020-05-27 18:02:16 +02:00
|
|
|
#else
|
2020-05-27 20:07:54 +02:00
|
|
|
int size = SaveReplayToBuffer(_other_buffer);
|
2020-11-11 19:37:19 +01:00
|
|
|
|
|
|
|
#ifdef CUTSCENE_RECORDER
|
|
|
|
extern int gCutsceneAsReplay;
|
|
|
|
if(gCutsceneAsReplay != 0)
|
2020-11-12 11:02:45 +01:00
|
|
|
{
|
|
|
|
FILE* temp;
|
|
|
|
int cnt;
|
|
|
|
cnt = 2;
|
|
|
|
|
|
|
|
while(cnt < 14)
|
|
|
|
{
|
|
|
|
sprintf(filename, "CUT%d_%d.D2RP", gCutsceneAsReplay, cnt);
|
|
|
|
|
|
|
|
temp = fopen(filename, "rb");
|
|
|
|
if (temp)
|
|
|
|
{
|
|
|
|
fclose(temp);
|
|
|
|
cnt++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-11-13 17:11:01 +01:00
|
|
|
else
|
|
|
|
{
|
|
|
|
sprintf(filename, "CHASE.D2RP", gCurrentMissionNumber);
|
|
|
|
}
|
2020-11-11 19:37:19 +01:00
|
|
|
#else
|
|
|
|
sprintf(filename, "CHASE.D2RP", gCurrentMissionNumber);
|
|
|
|
#endif
|
|
|
|
FILE* fp = fopen(filename, "wb");
|
2020-05-27 18:02:16 +02:00
|
|
|
if (fp)
|
|
|
|
{
|
2020-11-13 17:11:34 +01:00
|
|
|
printInfo("Saving replay '%s'\n", filename);
|
2020-10-04 20:19:53 +02:00
|
|
|
fwrite(_other_buffer, 1, size, fp);
|
2020-05-27 18:02:16 +02:00
|
|
|
fclose(fp);
|
|
|
|
}
|
|
|
|
#endif
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ SaveGame(int direction /*$a0*/)
|
|
|
|
// line 1158, offset 0x0006d9d4
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 3763
|
|
|
|
/* end block 1 */
|
|
|
|
// End Line: 3764
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 3764
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 3765
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void SaveGame(int direction)
|
|
|
|
{
|
2020-04-05 22:04:37 +02:00
|
|
|
CallMemoryCard(0x20, 1);
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ EnterName()
|
|
|
|
// line 1163, offset 0x0006d9f8
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 3773
|
|
|
|
/* end block 1 */
|
|
|
|
// End Line: 3774
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 3774
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 3775
|
|
|
|
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void EnterName(void)
|
|
|
|
{
|
2020-04-05 22:04:37 +02:00
|
|
|
EnterScoreName();
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
2020-10-31 01:11:58 +01:00
|
|
|
// int /*$ra*/ MaxMenuStringLength(MENU_HEADER *pMenu /*$v0*/)
|
2020-03-27 21:47:29 +01:00
|
|
|
// line 1185, offset 0x0006da18
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 1186
|
|
|
|
// Start offset: 0x0006DA18
|
|
|
|
// Variables:
|
2020-10-31 01:11:58 +01:00
|
|
|
// MENU_ITEM *pItems; // $s1
|
2020-03-27 21:47:29 +01:00
|
|
|
// int max; // $s2
|
|
|
|
// int temp; // $s0
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006DAD0
|
|
|
|
// End Line: 1206
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 3817
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 3818
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
int MaxMenuStringLength(MENU_HEADER *pMenu)
|
|
|
|
{
|
2020-05-12 06:00:32 +02:00
|
|
|
int max;
|
|
|
|
int temp;
|
|
|
|
MENU_ITEM *pItems;
|
2020-04-05 22:04:37 +02:00
|
|
|
|
2020-05-12 06:00:32 +02:00
|
|
|
pItems = pMenu->MenuItems;
|
|
|
|
max = StringWidth(pMenu->Title);
|
2020-04-11 23:57:32 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
while ((pItems->Type & PAUSE_TYPE_ENDITEMS) == 0)
|
2020-04-11 23:57:32 +02:00
|
|
|
{
|
2020-05-12 06:00:32 +02:00
|
|
|
temp = StringWidth(pItems->Text);
|
2020-04-11 23:57:32 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (pItems->Type & (PAUSE_TYPE_SFXVOLUME | PAUSE_TYPE_MUSICVOLUME))
|
2020-05-12 06:00:32 +02:00
|
|
|
temp = temp + StringWidth(" 100");
|
2020-04-11 23:57:32 +02:00
|
|
|
|
2020-05-12 06:00:32 +02:00
|
|
|
if (max < temp)
|
|
|
|
max = temp;
|
2020-04-11 23:57:32 +02:00
|
|
|
|
2020-05-12 06:00:32 +02:00
|
|
|
pItems++;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
|
|
|
|
return max;
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
2020-10-31 01:11:58 +01:00
|
|
|
// void /*$ra*/ InitaliseMenu(PAUSEMODE mode /*$a2*/)
|
2020-03-27 21:47:29 +01:00
|
|
|
// line 1216, offset 0x0006c2ac
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 1217
|
|
|
|
// Start offset: 0x0006C2AC
|
|
|
|
// Variables:
|
2020-10-31 01:11:58 +01:00
|
|
|
// MENU_ITEM *pItem; // $a0
|
2020-03-27 21:47:29 +01:00
|
|
|
// int i; // $a1
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006C6B8
|
|
|
|
// End Line: 1388
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 2361
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 2362
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 2441
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 2442
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void InitaliseMenu(PAUSEMODE mode)
|
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_HEADER* pNewMenu;
|
|
|
|
int i;
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
for (i = 0; i < PAUSE_MENU_LEVELS; i++)
|
|
|
|
{
|
|
|
|
ActiveItem[i] = NULL;
|
|
|
|
VisibleMenus[i] = NULL;
|
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = NULL;
|
2020-05-12 06:00:32 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
allownameentry = 0;
|
2020-05-12 06:00:32 +02:00
|
|
|
|
|
|
|
switch (mode)
|
|
|
|
{
|
2020-08-28 21:42:42 +02:00
|
|
|
case PAUSEMODE_PAUSE:
|
|
|
|
case PAUSEMODE_PAUSEP1:
|
|
|
|
case PAUSEMODE_PAUSEP2:
|
|
|
|
if (NumPlayers == 1 && gMultiplayerLevels == 0)
|
2020-05-12 06:00:32 +02:00
|
|
|
{
|
2020-08-28 21:42:42 +02:00
|
|
|
if (gInGameCutsceneActive == 0)
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &PauseMenuHeader;
|
2020-08-28 21:42:42 +02:00
|
|
|
else
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &CutscenePauseMenuHeader;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-05-12 06:00:32 +02:00
|
|
|
else
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &MultiplayerPauseHeader;
|
|
|
|
|
2020-08-28 21:42:42 +02:00
|
|
|
break;
|
|
|
|
case PAUSEMODE_GAMEOVER:
|
2020-05-12 06:00:32 +02:00
|
|
|
switch (GameType)
|
|
|
|
{
|
2020-08-28 21:42:42 +02:00
|
|
|
case GAME_PURSUIT:
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &ChaseGameFinishedHeader;
|
2020-05-12 06:00:32 +02:00
|
|
|
gMissionCompletionState = mode;
|
2020-11-18 19:21:16 +01:00
|
|
|
break;
|
2020-05-12 06:00:32 +02:00
|
|
|
case GAME_GETAWAY:
|
|
|
|
case GAME_CHECKPOINT:
|
2020-08-28 21:42:42 +02:00
|
|
|
if (NumPlayers == 1)
|
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &DrivingGameFinishedHeader;
|
2020-08-28 21:42:42 +02:00
|
|
|
allownameentry = 0;
|
|
|
|
gMissionCompletionState = mode;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case GAME_GATERACE:
|
2020-05-12 06:00:32 +02:00
|
|
|
case GAME_TRAILBLAZER:
|
|
|
|
case GAME_SURVIVAL:
|
2020-08-28 21:42:42 +02:00
|
|
|
if (NumPlayers == 1)
|
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &DrivingGameFinishedHeader;
|
2020-05-12 06:00:32 +02:00
|
|
|
gMissionCompletionState = mode;
|
2020-08-28 21:42:42 +02:00
|
|
|
allownameentry = NumPlayers;
|
2020-05-12 06:00:32 +02:00
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (NumPlayers == 1)
|
2020-11-18 19:21:16 +01:00
|
|
|
{
|
|
|
|
pNewMenu = &TakeARideFinishedHeader;
|
|
|
|
gMissionCompletionState = mode;
|
|
|
|
}
|
|
|
|
break;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
break;
|
|
|
|
case PAUSEMODE_COMPLETE:
|
2020-11-18 19:21:16 +01:00
|
|
|
|
|
|
|
switch (GameType)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
case GAME_MISSION:
|
|
|
|
pNewMenu = &MissionCompleteHeader;
|
|
|
|
gMissionCompletionState = mode;
|
|
|
|
break;
|
|
|
|
case GAME_GETAWAY:
|
|
|
|
case GAME_GATERACE:
|
|
|
|
case GAME_CHECKPOINT:
|
|
|
|
case GAME_TRAILBLAZER:
|
|
|
|
case GAME_SURVIVAL:
|
|
|
|
case GAME_COPSANDROBBERS:
|
|
|
|
case GAME_CAPTURETHEFLAG:
|
|
|
|
if (NumPlayers == 1)
|
|
|
|
{
|
|
|
|
pNewMenu = &DrivingGameFinishedHeader;
|
2020-08-28 21:42:42 +02:00
|
|
|
gMissionCompletionState = mode;
|
2020-11-18 19:21:16 +01:00
|
|
|
allownameentry = NumPlayers;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pNewMenu = &MultiplayerFinishedHeader;
|
|
|
|
gMissionCompletionState = mode;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case GAME_PURSUIT:
|
|
|
|
pNewMenu = &ChaseGameFinishedHeader;
|
|
|
|
gMissionCompletionState = mode;
|
|
|
|
break;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
break;
|
|
|
|
case PAUSEMODE_PADERROR:
|
|
|
|
if (pad_connected < 0)
|
|
|
|
{
|
|
|
|
if (NumPlayers == 1)
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &InvalidPadHeader;
|
2020-08-28 21:42:42 +02:00
|
|
|
else
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &InvalidMultiPadHeader;
|
|
|
|
|
|
|
|
if (Pads[0].type == 1)
|
|
|
|
pNewMenu->Title = "Incorrect controller in Port 1";
|
|
|
|
else
|
|
|
|
pNewMenu->Title = "Incorrect controller in Port 2";
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (NumPlayers == 1)
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &NoPadHeader;
|
2020-08-28 21:42:42 +02:00
|
|
|
else
|
2020-11-18 19:21:16 +01:00
|
|
|
pNewMenu = &NoMultiPadHeader;
|
|
|
|
|
|
|
|
if (Pads[0].type == 0)
|
|
|
|
pNewMenu->Title = "Please insert controller into Port 1";
|
|
|
|
else
|
|
|
|
pNewMenu->Title = "Please insert controller into Port 2";
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
break;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-04-11 23:02:26 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [A]
|
|
|
|
if(pNewMenu)
|
2020-04-11 23:02:26 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
VisibleMenu = 0;
|
|
|
|
VisibleMenus[0] = pNewMenu;
|
|
|
|
SetupMenu(pNewMenu, 0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printError("pNewMenu is NULL!\n");
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
2020-10-31 01:11:58 +01:00
|
|
|
// void /*$ra*/ SetupMenu(MENU_HEADER *menu /*$a0*/, int back /*$a1*/)
|
2020-03-27 21:47:29 +01:00
|
|
|
// line 1401, offset 0x0006c6b8
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 1402
|
|
|
|
// Start offset: 0x0006C6B8
|
|
|
|
// Variables:
|
2020-10-31 01:11:58 +01:00
|
|
|
// MENU_ITEM *pItem; // $a2
|
2020-03-27 21:47:29 +01:00
|
|
|
// int count; // $a3
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006C7F4
|
|
|
|
// End Line: 1431
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 2819
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 2820
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 2833
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 2834
|
|
|
|
|
|
|
|
/* begin block 4 */
|
|
|
|
// Start line: 2840
|
|
|
|
/* end block 4 */
|
|
|
|
// End Line: 2841
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-04-05 22:04:37 +02:00
|
|
|
void SetupMenu(MENU_HEADER *menu, int back)
|
2020-03-27 21:47:29 +01:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
int len;
|
|
|
|
MENU_ITEM *pItem;
|
|
|
|
int numItems;
|
2020-04-12 15:04:54 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
numItems = 0;
|
2020-04-05 22:04:37 +02:00
|
|
|
|
|
|
|
ActiveMenuItem = 0;
|
2020-11-18 19:21:16 +01:00
|
|
|
|
|
|
|
pItem = menu->MenuItems;
|
|
|
|
while (pItem->Type != PAUSE_TYPE_ENDITEMS)
|
2020-04-12 15:04:54 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
if (back && pItem == ActiveItem[VisibleMenu])
|
|
|
|
ActiveMenuItem = numItems;
|
2020-04-12 15:04:54 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
numItems++;
|
|
|
|
pItem++;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
ActiveMenu = menu;
|
2020-11-18 19:21:16 +01:00
|
|
|
ActiveMenu->NumItems = numItems;
|
|
|
|
|
|
|
|
len = MaxMenuStringLength(ActiveMenu);
|
|
|
|
|
|
|
|
ActiveMenu->Bound.x = ((304 - len) / 2) - 4;
|
|
|
|
ActiveMenu->Bound.w = len + 24;
|
|
|
|
ActiveMenu->Bound.y = MAX(48, ((numItems + 1) * -15 + 256) / 2);
|
|
|
|
ActiveMenu->Bound.h = (numItems + 1) * 15 + 10;
|
2020-04-12 15:04:54 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
ActiveItem[VisibleMenu] = &ActiveMenu->MenuItems[ActiveMenuItem];
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ DrawVisibleMenus()
|
|
|
|
// line 1443, offset 0x0006c7f4
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 1445
|
|
|
|
// Start offset: 0x0006C7F4
|
|
|
|
// Variables:
|
2020-10-31 01:11:58 +01:00
|
|
|
// MENU_HEADER *pActive; // $s5
|
|
|
|
// MENU_ITEM *pItem; // $s1
|
|
|
|
// POLY_FT3 *null; // $a0
|
2020-03-27 21:47:29 +01:00
|
|
|
// int i; // stack offset -48
|
|
|
|
// int ypos; // $s3
|
|
|
|
// int xpos; // $fp
|
|
|
|
// int width; // $s4
|
|
|
|
|
|
|
|
/* begin block 1.1 */
|
|
|
|
// Start line: 1473
|
|
|
|
// Start offset: 0x0006C8C0
|
|
|
|
// Variables:
|
|
|
|
// unsigned char r; // $s6
|
|
|
|
// unsigned char b; // $s7
|
|
|
|
// int x1; // $s0
|
|
|
|
// int x2; // $s2
|
|
|
|
/* end block 1.1 */
|
|
|
|
// End offset: 0x0006CA40
|
|
|
|
// End Line: 1509
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006CBE8
|
|
|
|
// End Line: 1528
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 2919
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 2920
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 2932
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 2933
|
|
|
|
|
|
|
|
/* begin block 4 */
|
|
|
|
// Start line: 2933
|
|
|
|
/* end block 4 */
|
|
|
|
// End Line: 2934
|
|
|
|
|
|
|
|
/* begin block 5 */
|
|
|
|
// Start line: 2939
|
|
|
|
/* end block 5 */
|
|
|
|
// End Line: 2940
|
|
|
|
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void DrawVisibleMenus(void)
|
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
int width;
|
|
|
|
int itemXpos;
|
2020-04-11 23:02:26 +02:00
|
|
|
POLY_FT3 *null;
|
|
|
|
POLY_F4 *poly;
|
2020-11-18 19:21:16 +01:00
|
|
|
MENU_ITEM *pItem;
|
|
|
|
MENU_HEADER *pActive;
|
|
|
|
int r, b;
|
2020-04-11 23:02:26 +02:00
|
|
|
int i;
|
2020-11-18 19:21:16 +01:00
|
|
|
int xpos, ypos;
|
|
|
|
int menuWidth;
|
|
|
|
|
|
|
|
int x1, x2, y1, y2;
|
|
|
|
static int maxPercentageWidth = StringWidth(" 100");
|
2020-04-05 22:04:37 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (NumPlayers > 1)
|
|
|
|
{
|
2020-04-05 22:04:37 +02:00
|
|
|
SetFullscreenDrawing();
|
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
|
|
|
|
pActive = VisibleMenus[VisibleMenu];
|
|
|
|
|
|
|
|
xpos = pActive->Bound.x;
|
|
|
|
ypos = pActive->Bound.y;
|
|
|
|
menuWidth = pActive->Bound.w;
|
|
|
|
|
|
|
|
if (pActive->Title)
|
|
|
|
{
|
|
|
|
OutputString(pActive->Title, 2, xpos, ypos, menuWidth, 128, 32, 32);
|
|
|
|
|
|
|
|
ypos += 15;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-04-11 23:02:26 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// show all menu items
|
|
|
|
for (i = 0; i < pActive->NumItems; i++)
|
|
|
|
{
|
|
|
|
pItem = &pActive->MenuItems[i];
|
2020-04-11 23:02:26 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (!pItem->Text)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (pItem == ActiveItem[VisibleMenu])
|
|
|
|
{
|
|
|
|
r = 0;
|
|
|
|
b = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
b = 128;
|
|
|
|
r = 128;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(pItem->Type & (PAUSE_TYPE_SFXVOLUME | PAUSE_TYPE_MUSICVOLUME))
|
|
|
|
{
|
|
|
|
width = StringWidth(pItem->Text);
|
|
|
|
|
|
|
|
itemXpos = xpos + ((menuWidth - width) - maxPercentageWidth) / 2;
|
|
|
|
|
|
|
|
OutputString(pItem->Text, 1, itemXpos, ypos, menuWidth, r, 128, b);
|
|
|
|
|
|
|
|
if (pItem->Type & PAUSE_TYPE_SFXVOLUME)
|
|
|
|
OutputString(SfxVolumeText, 1, itemXpos + width + 10, ypos, menuWidth, r, 128, b);
|
|
|
|
else if (pItem->Type & PAUSE_TYPE_MUSICVOLUME)
|
|
|
|
OutputString(MusicVolumeText, 1, itemXpos + width + 10, ypos, menuWidth, r, 128, b);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
OutputString(pItem->Text, pItem->Justify, xpos, ypos, menuWidth, r, 128, b);
|
|
|
|
}
|
|
|
|
|
|
|
|
ypos += 15;
|
2020-04-11 23:02:26 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
|
|
|
|
poly = (POLY_F4*)current->primptr;
|
|
|
|
|
|
|
|
ypos = pActive->Bound.y;
|
2020-04-11 23:24:54 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
setPolyF4(poly);
|
|
|
|
x1 = xpos - 5;
|
|
|
|
x2 = xpos + menuWidth + 5;
|
|
|
|
|
|
|
|
y1 = ypos - 5;
|
|
|
|
y2 = ypos + pActive->Bound.h;
|
|
|
|
|
|
|
|
poly->x0 = x1;
|
|
|
|
poly->x1 = x2;
|
|
|
|
poly->y0 = y1;
|
|
|
|
poly->x2 = x1;
|
|
|
|
|
|
|
|
poly->y1 = y1;
|
|
|
|
poly->y2 = y2;
|
|
|
|
|
|
|
|
poly->x3 = x2;
|
|
|
|
poly->y3 = y2;
|
|
|
|
|
|
|
|
poly->r0 = 16;
|
|
|
|
poly->g0 = 16;
|
|
|
|
poly->b0 = 16;
|
|
|
|
|
|
|
|
setSemiTrans(poly, 1);
|
|
|
|
|
|
|
|
addPrim(current->ot, poly);
|
|
|
|
current->primptr += sizeof(POLY_F4);
|
|
|
|
|
2020-04-11 23:02:26 +02:00
|
|
|
null = (POLY_FT3 *)current->primptr;
|
|
|
|
setPolyFT3(null);
|
|
|
|
null->x0 = -1;
|
|
|
|
null->y0 = -1;
|
|
|
|
null->x1 = -1;
|
|
|
|
null->y1 = -1;
|
|
|
|
null->x2 = -1;
|
|
|
|
null->y2 = -1;
|
|
|
|
null->tpage = 0;
|
|
|
|
|
|
|
|
addPrim(current->ot, null);
|
|
|
|
|
|
|
|
current->primptr += sizeof(POLY_FT3);
|
2020-04-11 23:57:32 +02:00
|
|
|
|
2020-04-11 23:02:26 +02:00
|
|
|
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ ControlMenu()
|
|
|
|
// line 1543, offset 0x0006cbe8
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 1545
|
|
|
|
// Start offset: 0x0006CBE8
|
|
|
|
// Variables:
|
|
|
|
// static int debounce; // offset 0x30
|
|
|
|
// unsigned short paddata; // $a2
|
|
|
|
// unsigned short paddirect; // $a3
|
|
|
|
|
|
|
|
/* begin block 1.1 */
|
|
|
|
// Start line: 1596
|
|
|
|
// Start offset: 0x0006CCD4
|
|
|
|
// Variables:
|
|
|
|
// int doit; // $v1
|
|
|
|
/* end block 1.1 */
|
|
|
|
// End offset: 0x0006CD78
|
|
|
|
// End Line: 1621
|
|
|
|
|
|
|
|
/* begin block 1.2 */
|
|
|
|
// Start line: 1675
|
|
|
|
// Start offset: 0x0006CF54
|
|
|
|
// Variables:
|
|
|
|
// int i; // $a0
|
|
|
|
/* end block 1.2 */
|
|
|
|
// End offset: 0x0006CFB8
|
|
|
|
// End Line: 1682
|
|
|
|
|
|
|
|
/* begin block 1.3 */
|
|
|
|
// Start line: 1692
|
|
|
|
// Start offset: 0x0006CFD8
|
|
|
|
// Variables:
|
|
|
|
// int i; // $a0
|
|
|
|
/* end block 1.3 */
|
|
|
|
// End offset: 0x0006D034
|
|
|
|
// End Line: 1703
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006D034
|
|
|
|
// End Line: 1705
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 3196
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 3197
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 3212
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 3213
|
|
|
|
|
|
|
|
/* begin block 4 */
|
|
|
|
// Start line: 3213
|
|
|
|
/* end block 4 */
|
|
|
|
// End Line: 3214
|
|
|
|
|
|
|
|
/* begin block 5 */
|
|
|
|
// Start line: 3233
|
|
|
|
/* end block 5 */
|
|
|
|
// End Line: 3234
|
|
|
|
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void ControlMenu(void)
|
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
static int controlmenu_debounce = 0;
|
|
|
|
MENU_ITEM* pItem;
|
|
|
|
int i;
|
|
|
|
ushort paddata;
|
|
|
|
MENU_HEADER* menu;
|
|
|
|
ushort paddirect;
|
|
|
|
int doit;
|
|
|
|
|
|
|
|
if (playerwithcontrol[2] == 0)
|
2020-07-05 18:32:12 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
paddata = Pads[1].dirnew;
|
|
|
|
paddirect = Pads[1].direct;
|
2020-07-05 18:32:12 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (playerwithcontrol[0])
|
2020-07-05 18:32:12 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
paddata = Pads[0].dirnew;
|
|
|
|
paddirect = Pads[0].direct;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
else
|
2020-07-05 18:32:12 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
paddata = Pads[0].dirnew;
|
|
|
|
paddirect = Pads[0].direct;
|
|
|
|
|
|
|
|
if (NumPlayers == 2)
|
2020-07-05 18:32:12 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
paddata = Pads[1].dirnew | Pads[0].dirnew;
|
|
|
|
paddirect = Pads[1].direct | Pads[0].direct;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
|
|
|
}
|
2020-07-05 18:32:12 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// toggle map off
|
|
|
|
if (gShowMap)
|
2020-07-05 18:32:12 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
if (paddata & 0x50)
|
|
|
|
PauseMap(0);
|
2020-07-05 18:32:12 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
return;
|
|
|
|
}
|
2020-04-12 15:04:54 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
pItem = ActiveItem[VisibleMenu];
|
2020-04-12 15:04:54 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if ((paddirect & 0xA000) && (pItem->Type & PAUSE_TYPE_DIRFUNC))
|
2020-04-12 15:04:54 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
doit = 0;
|
2020-07-05 18:32:12 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (controlmenu_debounce == 0)
|
2020-04-12 15:04:54 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
doit = 1;
|
|
|
|
controlmenu_debounce = 10;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
else
|
2020-07-05 18:32:12 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
controlmenu_debounce--;
|
2020-07-05 18:32:12 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (controlmenu_debounce == 0)
|
2020-04-12 15:04:54 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
doit = 1;
|
|
|
|
controlmenu_debounce = 2;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
|
|
|
}
|
2020-07-05 18:32:12 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (doit)
|
|
|
|
{
|
|
|
|
// left/right
|
|
|
|
(*pItem->func)((paddirect & 0x8000) ? -1 : 1);
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
return;
|
|
|
|
}
|
2020-04-12 15:04:54 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
controlmenu_debounce = 0;
|
|
|
|
|
2020-11-24 10:14:48 +01:00
|
|
|
#ifndef PSX
|
|
|
|
// Pause fix for PC mapping
|
|
|
|
if ((paddata & 0x10) && paddata & (0x1000 | 0x4000))
|
|
|
|
{
|
|
|
|
paddata = 0;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (paddata & 0x1000)
|
2020-04-12 15:04:54 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
// go up
|
|
|
|
ActiveMenuItem--;
|
|
|
|
|
|
|
|
if (ActiveMenuItem < 0)
|
|
|
|
ActiveMenuItem = ActiveMenu->NumItems - 1;
|
|
|
|
|
|
|
|
ActiveItem[VisibleMenu] = &ActiveMenu->MenuItems[ActiveMenuItem];
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
else if (paddata & 0x4000)
|
2020-04-12 15:04:54 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
// go down
|
|
|
|
ActiveMenuItem++;
|
|
|
|
|
|
|
|
if (ActiveMenuItem > ActiveMenu->NumItems - 1)
|
|
|
|
ActiveMenuItem = 0;
|
2020-07-05 18:32:12 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
ActiveItem[VisibleMenu] = &ActiveMenu->MenuItems[ActiveMenuItem];
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
else if (paddata & 0x40)
|
|
|
|
{
|
|
|
|
// Enter submenu
|
|
|
|
if (pItem->Type & PAUSE_TYPE_SUBMENU)
|
|
|
|
{
|
|
|
|
menu = pItem->SubMenu;
|
|
|
|
|
|
|
|
VisibleMenu++;
|
|
|
|
VisibleMenus[VisibleMenu] = menu;
|
|
|
|
|
|
|
|
SetupMenu(menu, 0);
|
|
|
|
return;
|
|
|
|
}
|
2020-04-12 15:04:54 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// function flag
|
|
|
|
if (pItem->Type & PAUSE_TYPE_FUNC)
|
|
|
|
(*pItem->func)(0);
|
|
|
|
|
|
|
|
if (pItem->ExitValue == MENU_QUIT_NONE)
|
|
|
|
return;
|
2020-04-12 15:04:54 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (pItem->ExitValue == MENU_QUIT_BACKMENU)
|
|
|
|
{
|
|
|
|
VisibleMenu--; // go back in menu stack
|
|
|
|
SetupMenu(VisibleMenus[VisibleMenu], 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
PauseReturnValue = pItem->ExitValue;
|
|
|
|
}
|
|
|
|
else if ((paddata & 0x10) || (paddata & 0x800)) // Triangle or Start
|
2020-04-12 15:04:54 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
// continue game if needed
|
2020-11-24 10:14:48 +01:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (VisibleMenu == 0)
|
2020-04-12 15:04:54 +02:00
|
|
|
{
|
2020-11-24 10:14:48 +01:00
|
|
|
#ifndef PSX
|
|
|
|
// hack for keyboard swap
|
|
|
|
if(!(paddata & 0x800))
|
|
|
|
return;
|
|
|
|
#endif
|
2020-11-18 19:21:16 +01:00
|
|
|
for (i = 0; i < ActiveMenu->NumItems; i++)
|
|
|
|
{
|
|
|
|
pItem = &ActiveMenu->MenuItems[i];
|
|
|
|
|
|
|
|
if (pItem->ExitValue == MENU_QUIT_CONTINUE)
|
|
|
|
{
|
|
|
|
PauseReturnValue = pItem->ExitValue;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
else
|
2020-04-12 15:04:54 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
// only triangle
|
|
|
|
if(paddata & 0x10)
|
|
|
|
{
|
|
|
|
VisibleMenu--;
|
|
|
|
SetupMenu(VisibleMenus[VisibleMenu], 1);
|
|
|
|
}
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
|
|
|
}
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ PauseMap(int direction /*$a0*/)
|
|
|
|
// line 1710, offset 0x0006dad0
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 4364
|
|
|
|
/* end block 1 */
|
|
|
|
// End Line: 4365
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 4869
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 4870
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 4870
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 4871
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void PauseMap(int direction)
|
|
|
|
{
|
2020-05-30 11:53:05 +02:00
|
|
|
gShowMap ^= 1;
|
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
ReadControllers();
|
2020-05-30 11:53:05 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
map_x_shift = 0;
|
|
|
|
map_z_shift = 0;
|
2020-05-30 11:53:05 +02:00
|
|
|
|
|
|
|
if (gShowMap == 0)
|
2020-04-05 22:04:37 +02:00
|
|
|
InitOverheadMap();
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ SfxVolume(int direction /*$a0*/)
|
|
|
|
// line 1725, offset 0x0006db34
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 1726
|
|
|
|
// Start offset: 0x0006DB34
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006DC04
|
|
|
|
// End Line: 1744
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 4902
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 4903
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 4905
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 4906
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void SfxVolume(int direction)
|
|
|
|
{
|
2020-04-12 15:26:17 +02:00
|
|
|
if (direction < 0)
|
2020-04-05 22:04:37 +02:00
|
|
|
gMasterVolume = gMasterVolume + -100;
|
2020-04-12 15:26:17 +02:00
|
|
|
else if (0 < direction)
|
|
|
|
gMasterVolume = gMasterVolume + 100;
|
|
|
|
|
|
|
|
if (gMasterVolume < -10000)
|
2020-04-05 22:04:37 +02:00
|
|
|
gMasterVolume = -10000;
|
2020-04-12 15:26:17 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (gMasterVolume > 0)
|
2020-04-05 22:04:37 +02:00
|
|
|
gMasterVolume = 0;
|
2020-04-12 15:26:17 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
sprintf(SfxVolumeText, "%d", (10000 + gMasterVolume) / 100);
|
2020-04-12 15:26:17 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
SetMasterVolume(gMasterVolume);
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ MusicVolume(int direction /*$a0*/)
|
|
|
|
// line 1746, offset 0x0006dc04
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 1747
|
|
|
|
// Start offset: 0x0006DC04
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006DCD4
|
|
|
|
// End Line: 1765
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 4942
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 4943
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 4945
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 4946
|
|
|
|
|
|
|
|
/* begin block 4 */
|
|
|
|
// Start line: 4948
|
|
|
|
/* end block 4 */
|
|
|
|
// End Line: 4949
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void MusicVolume(int direction)
|
|
|
|
{
|
2020-04-12 15:26:17 +02:00
|
|
|
if (direction < 0)
|
2020-04-05 22:04:37 +02:00
|
|
|
gMusicVolume = gMusicVolume + -100;
|
2020-04-12 15:26:17 +02:00
|
|
|
else if (0 < direction)
|
|
|
|
gMusicVolume = gMusicVolume + 100;
|
|
|
|
|
|
|
|
if (gMusicVolume < -10000)
|
2020-04-05 22:04:37 +02:00
|
|
|
gMusicVolume = -10000;
|
2020-04-12 15:26:17 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (gMusicVolume > 0)
|
2020-04-05 22:04:37 +02:00
|
|
|
gMusicVolume = 0;
|
2020-04-12 15:26:17 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
sprintf(MusicVolumeText, "%d", (10000 + gMusicVolume) / 100);
|
2020-04-12 15:26:17 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
SetXMVolume(gMusicVolume);
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ EnterScoreName()
|
|
|
|
// line 1787, offset 0x0006d044
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 1789
|
|
|
|
// Start offset: 0x0006D044
|
|
|
|
// Variables:
|
2020-10-31 01:11:58 +01:00
|
|
|
// SCORE_ENTRY *table; // stack offset -40
|
2020-03-27 21:47:29 +01:00
|
|
|
// char *username; // $s3
|
|
|
|
// unsigned short npad; // $a1
|
|
|
|
// int so; // $s0
|
|
|
|
// int co; // $s1
|
|
|
|
// int delay; // $s2
|
|
|
|
// char c; // $a0
|
|
|
|
// char toggle; // $s6
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006D324
|
|
|
|
// End Line: 1941
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 3716
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 3717
|
|
|
|
|
|
|
|
/* begin block 3 */
|
|
|
|
// Start line: 3717
|
|
|
|
/* end block 3 */
|
|
|
|
// End Line: 3718
|
|
|
|
|
|
|
|
/* begin block 4 */
|
|
|
|
// Start line: 3718
|
|
|
|
/* end block 4 */
|
|
|
|
// End Line: 3719
|
|
|
|
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void EnterScoreName(void)
|
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
u_char chr;
|
|
|
|
int so;
|
|
|
|
int co;
|
|
|
|
int delay;
|
2020-08-28 21:42:42 +02:00
|
|
|
char* username;
|
2020-11-18 19:21:16 +01:00
|
|
|
int toggle;
|
2020-08-28 21:42:42 +02:00
|
|
|
SCORE_ENTRY* table;
|
2020-11-18 19:21:16 +01:00
|
|
|
unsigned short npad, dpad;
|
2020-04-05 22:04:37 +02:00
|
|
|
|
2020-08-28 21:42:42 +02:00
|
|
|
username = NULL;
|
2020-11-18 19:21:16 +01:00
|
|
|
delay = 0;
|
2020-04-05 22:04:37 +02:00
|
|
|
gEnteringScore = 1;
|
2020-11-18 19:21:16 +01:00
|
|
|
toggle = 0;
|
2020-08-28 21:42:42 +02:00
|
|
|
|
|
|
|
if (gScoreEntered == 0)
|
|
|
|
{
|
|
|
|
gScorePosition = OnScoreTable(&table);
|
|
|
|
|
|
|
|
if (gScorePosition != -1)
|
|
|
|
username = ScoreName[gScorePosition];
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
OnScoreTable(&table);
|
2020-04-05 22:04:37 +02:00
|
|
|
gScorePosition = -1;
|
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
co = 1;
|
|
|
|
so = 0;
|
2020-08-28 21:42:42 +02:00
|
|
|
|
|
|
|
CreateScoreNames(table, &gPlayerScore, gScorePosition);
|
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
do {
|
|
|
|
ReadControllers();
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
npad = Pads[0].dirnew;
|
|
|
|
dpad = Pads[0].direct;
|
|
|
|
|
|
|
|
if (gScoreEntered)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
if (npad & 0x50)
|
|
|
|
{
|
|
|
|
gEnteringScore = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// cancel
|
|
|
|
if (npad & 0x10)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-04-05 22:04:37 +02:00
|
|
|
gEnteringScore = 0;
|
|
|
|
return;
|
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (dpad & 0x20)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
// switch to end
|
|
|
|
delay = 1;
|
|
|
|
toggle = 0;
|
|
|
|
co = 67;
|
|
|
|
}
|
|
|
|
else if (dpad & 0x8000)
|
|
|
|
{
|
|
|
|
// move left/right to switch chars
|
|
|
|
if (delay-- == 0)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
delay = 20;
|
|
|
|
toggle = 0;
|
|
|
|
co--;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
else if (delay < 1)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
delay = 2;
|
|
|
|
toggle = 0;
|
|
|
|
co--;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
|
|
|
|
if (co < 0)
|
|
|
|
co = 67;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
else if (dpad & 0x2000)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
if (delay-- == 0)
|
|
|
|
{
|
|
|
|
delay = 20;
|
|
|
|
toggle = 0;
|
|
|
|
co++;
|
|
|
|
}
|
|
|
|
else if (delay < 1)
|
|
|
|
{
|
|
|
|
delay = 2;
|
|
|
|
toggle = 0;
|
|
|
|
co++;
|
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (co > 67)
|
|
|
|
co = 0;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
else
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
delay = 0;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (so == 5)
|
|
|
|
chr = 254;
|
|
|
|
else
|
|
|
|
chr = validchars[co];
|
|
|
|
|
|
|
|
toggle++;
|
|
|
|
|
|
|
|
if (toggle & 4)
|
|
|
|
username[so] = 0;
|
|
|
|
else if (chr == ' ')
|
|
|
|
username[so] = '.';
|
|
|
|
else
|
|
|
|
username[so] = chr;
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (npad & 0x80)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
if (so > 0)
|
|
|
|
so--;
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
username[so] = 0;
|
|
|
|
username[so+1] = 0;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (npad & 0x40)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
// complete
|
|
|
|
if (chr == 254)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
username[so] = 0;
|
2020-08-28 21:42:42 +02:00
|
|
|
strcpy(gPlayerScore.name, username);
|
|
|
|
AddScoreToTable(table, gScorePosition);
|
2020-11-18 19:21:16 +01:00
|
|
|
|
2020-08-31 13:15:40 +02:00
|
|
|
sprintf(EnterScoreText, "View Table");
|
|
|
|
sprintf(EnterNameText, "High Scores");
|
2020-11-18 19:21:16 +01:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
gEnteringScore = 0;
|
|
|
|
gScoreEntered = 1;
|
|
|
|
return;
|
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// delete chars
|
|
|
|
if(chr == 255)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
if (so > 0)
|
|
|
|
so--;
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
username[so] = 0;
|
|
|
|
username[so + 1] = 0;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-11-18 19:21:16 +01:00
|
|
|
else if (so < 5)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
username[so] = chr;
|
|
|
|
username[so+1] = 0;
|
|
|
|
so++;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-04-05 22:04:37 +02:00
|
|
|
DrawGame();
|
|
|
|
} while (true);
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// decompiled code
|
|
|
|
// original method signature:
|
|
|
|
// void /*$ra*/ DrawHighScoreMenu(int selection /*stack 0*/)
|
|
|
|
// line 2020, offset 0x0006d694
|
|
|
|
/* begin block 1 */
|
|
|
|
// Start line: 2021
|
|
|
|
// Start offset: 0x0006D694
|
|
|
|
// Variables:
|
2020-10-31 01:11:58 +01:00
|
|
|
// POLY_FT3 *null; // $a0
|
2020-03-27 21:47:29 +01:00
|
|
|
// char text[4]; // stack offset -48
|
|
|
|
// unsigned char r; // $s3
|
|
|
|
// unsigned char g; // $s5
|
|
|
|
// unsigned char b; // $s2
|
|
|
|
// int i; // $s0
|
|
|
|
// int ypos; // $s4
|
|
|
|
/* end block 1 */
|
|
|
|
// End offset: 0x0006D9B0
|
|
|
|
// End Line: 2075
|
|
|
|
|
|
|
|
/* begin block 2 */
|
|
|
|
// Start line: 4486
|
|
|
|
/* end block 2 */
|
|
|
|
// End Line: 4487
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-03-27 21:47:29 +01:00
|
|
|
void DrawHighScoreMenu(int selection)
|
|
|
|
{
|
2020-08-28 21:42:42 +02:00
|
|
|
POLY_FT3* null;
|
|
|
|
POLY_F4* prim;
|
2020-11-18 19:21:16 +01:00
|
|
|
int i;
|
2020-04-05 22:04:37 +02:00
|
|
|
int b;
|
|
|
|
int r;
|
2020-11-18 19:21:16 +01:00
|
|
|
int ypos;
|
2020-08-28 21:42:42 +02:00
|
|
|
char text[8];
|
2020-04-05 22:04:37 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
OutputString(EnterNameText, 2, 160, 70, 0, 128, 32, 32);
|
|
|
|
OutputString("Name", 1, 40, 90, 0, 128, 128, 32);
|
|
|
|
OutputString("Time", 4, 280, 90, 0, 128, 128, 32);
|
|
|
|
|
|
|
|
ypos = 110;
|
|
|
|
|
|
|
|
i = 0;
|
2020-04-05 22:04:37 +02:00
|
|
|
do {
|
2020-11-18 19:21:16 +01:00
|
|
|
|
|
|
|
if (i == selection)
|
2020-08-28 21:42:42 +02:00
|
|
|
{
|
2020-04-05 22:04:37 +02:00
|
|
|
r = 0;
|
|
|
|
b = 0;
|
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
else
|
|
|
|
{
|
2020-11-18 19:21:16 +01:00
|
|
|
r = 128;
|
|
|
|
b = 128;
|
2020-04-05 22:04:37 +02:00
|
|
|
}
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
sprintf(text, "%d", i+1);
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
OutputString(text, 1, 40, ypos, 0, r, 128, b);
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
OutputString(ScoreName[i], 1, 60, ypos, 0, r, 128, b);
|
|
|
|
OutputString(ScoreItems[i], 4, 220, ypos, 0, r, 128, b);
|
|
|
|
OutputString(ScoreTime[i], 4, 280, ypos, 0, r, 128, b);
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
ypos += 15;
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
i++;
|
|
|
|
} while (i < 5);
|
2020-08-28 21:42:42 +02:00
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
prim = (POLY_F4*)current->primptr;
|
|
|
|
setPolyF4(prim);
|
|
|
|
setSemiTrans(prim, 1);
|
|
|
|
setShadeTex(prim, 1);
|
|
|
|
|
|
|
|
prim->y0 = 65;
|
|
|
|
prim->y1 = 65;
|
|
|
|
prim->y2 = 197;
|
|
|
|
prim->y3 = 197;
|
|
|
|
prim->x0 = 26;
|
|
|
|
prim->x1 = 294;
|
|
|
|
prim->x2 = 26;
|
|
|
|
prim->x3 = 294;
|
|
|
|
|
|
|
|
prim->r0 = 16;
|
|
|
|
prim->g0 = 16;
|
|
|
|
prim->b0 = 16;
|
|
|
|
|
|
|
|
addPrim(current->ot, prim);
|
|
|
|
current->primptr += sizeof(POLY_F4);
|
|
|
|
|
|
|
|
null = (POLY_FT3*)current->primptr;
|
2020-08-28 21:42:42 +02:00
|
|
|
setPolyFT3(null);
|
|
|
|
|
|
|
|
null->x0 = -1;
|
|
|
|
null->y0 = -1;
|
|
|
|
null->x1 = -1;
|
|
|
|
null->y1 = -1;
|
|
|
|
null->x2 = -1;
|
|
|
|
null->y2 = -1;
|
|
|
|
null->tpage = 0;
|
|
|
|
|
|
|
|
addPrim(current->ot, null);
|
|
|
|
current->primptr += sizeof(POLY_FT3);
|
2020-03-27 21:47:29 +01:00
|
|
|
}
|
|
|
|
|
2020-08-28 21:42:42 +02:00
|
|
|
//*Offset 0x6D324, from D : \driver2\game\C\PAUSE.C(lines 1943..2011)
|
|
|
|
//* Stack frame base $sp, size 80
|
|
|
|
//* Saved registers at offset - 4: s0 s1 s2 s3 s4 s5 s6 s7 fp ra
|
|
|
|
//* /
|
2020-10-31 01:11:58 +01:00
|
|
|
//void /*$ra*/ CreateScoreNames(SCORE_ENTRY* table /*$s0*/, PLAYER_SCORE* score /*stack 4*/, int position /*stack 8*/)
|
2020-08-28 21:42:42 +02:00
|
|
|
//{ // line 1, offset 0x6d324
|
|
|
|
// char* text; // $s1
|
|
|
|
// int min; // $t1
|
|
|
|
// int frac; // $v0
|
|
|
|
// int i; // $s5
|
|
|
|
//} // line 69, offset 0x6d664
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
// [D] [T]
|
2020-08-28 21:42:42 +02:00
|
|
|
void CreateScoreNames(SCORE_ENTRY* table, PLAYER_SCORE* score, int position)
|
|
|
|
{
|
|
|
|
int time;
|
|
|
|
char* text;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
switch (GameType)
|
|
|
|
{
|
|
|
|
case GAME_PURSUIT:
|
|
|
|
case GAME_GETAWAY:
|
|
|
|
case GAME_CHECKPOINT:
|
|
|
|
case GAME_SURVIVAL:
|
|
|
|
text = NULL;
|
|
|
|
break;
|
|
|
|
case GAME_GATERACE:
|
|
|
|
text = "Gates";
|
|
|
|
break;
|
|
|
|
case GAME_TRAILBLAZER:
|
|
|
|
text = "Cones";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return;
|
|
|
|
}
|
2020-03-27 21:47:29 +01:00
|
|
|
|
2020-08-28 21:42:42 +02:00
|
|
|
i = 0;
|
|
|
|
do {
|
|
|
|
if (i == position)
|
|
|
|
{
|
|
|
|
time = score->time;
|
|
|
|
if (time == -1)
|
|
|
|
sprintf(ScoreTime[i], "-:--.--");
|
|
|
|
else
|
|
|
|
sprintf(ScoreTime[i], "%d:%02d.%02d", time / 180000, time / 3000 + (time / 180000) * -0x3c, (time % 3000) / 0x1e);
|
|
|
|
|
|
|
|
ScoreItems[i][0] = '\0';
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (text != NULL && score->items != -1)
|
2020-08-28 21:42:42 +02:00
|
|
|
sprintf(ScoreItems[i], "%d %s", score->items, text);
|
|
|
|
|
|
|
|
ClearMem(ScoreName[i], 7);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
time = table->time;
|
|
|
|
|
|
|
|
if (time == -1)
|
|
|
|
sprintf(ScoreTime[i], "-:--.--");
|
|
|
|
else
|
|
|
|
sprintf(ScoreTime[i], "%d:%02d.%02d", time / 180000, time / 3000 + (time / 180000) * -0x3c, (time % 3000) / 0x1e);
|
|
|
|
|
|
|
|
ScoreItems[i][0] = '\0';
|
|
|
|
|
2020-11-18 19:21:16 +01:00
|
|
|
if (text != NULL && table->items != -1)
|
2020-08-28 21:42:42 +02:00
|
|
|
sprintf(ScoreItems[i], "%d %s", table->items, text);
|
|
|
|
|
|
|
|
sprintf(ScoreName[i], "%s", table->name);
|
|
|
|
table = table + 1;
|
|
|
|
}
|
2020-03-27 21:47:29 +01:00
|
|
|
|
2020-08-28 21:42:42 +02:00
|
|
|
i++;
|
|
|
|
} while (i < 5);
|
2020-03-27 21:47:29 +01:00
|
|
|
|
2020-08-28 21:42:42 +02:00
|
|
|
}
|