void PlanetOrbitMenu (void) { MENU_STATE MenuState; InputFrameCallback *oldCallback; memset (&MenuState, 0, sizeof MenuState); DrawMenuStateStrings (PM_SCAN, SCAN); LockMutex (GraphicsLock); SetFlashRect (SFR_MENU_3DO); UnlockMutex (GraphicsLock); MenuState.CurState = SCAN; SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT); oldCallback = SetInputCallback (on_input_frame); MenuState.InputFunc = DoPlanetOrbit; DoInput (&MenuState, TRUE); SetInputCallback (oldCallback); LockMutex (GraphicsLock); SetFlashRect (NULL); UnlockMutex (GraphicsLock); DrawMenuStateStrings (PM_STARMAP, -NAVIGATION); }
BOOLEAN DoMenuChooser (MENU_STATE *pMS, BYTE BaseState) { BYTE NewState = pMS->CurState; BYTE OrigBase = BaseState; BOOLEAN useAltMenu = FALSE; if (optWhichMenu == OPT_PC) useAltMenu = GetAlternateMenu (&BaseState, &NewState); if (PulsedInputState.menu[KEY_MENU_LEFT] || PulsedInputState.menu[KEY_MENU_UP]) NewState = PreviousMenuState (BaseState, NewState); else if (PulsedInputState.menu[KEY_MENU_RIGHT] || PulsedInputState.menu[KEY_MENU_DOWN]) NewState = NextMenuState (BaseState, NewState); else if (useAltMenu && PulsedInputState.menu[KEY_MENU_SELECT]) { NewState = ConvertAlternateMenu (BaseState, NewState); if (NewState == ALT_MANIFEST) { DrawMenuStateStrings (PM_ALT_CARGO, 0); pMS->CurState = PM_CARGO - PM_SCAN; return TRUE; } if (NewState == ALT_EXIT_MANIFEST) { if (OrigBase == PM_SCAN) DrawMenuStateStrings (PM_ALT_SCAN, PM_ALT_MANIFEST - PM_ALT_SCAN); else DrawMenuStateStrings (PM_ALT_STARMAP, PM_ALT_MANIFEST - PM_ALT_STARMAP); pMS->CurState = ALT_MANIFEST; return TRUE; } return FALSE; } else if ((optWhichMenu == OPT_PC) && PulsedInputState.menu[KEY_MENU_CANCEL] && (BaseState == PM_ALT_CARGO)) { if (OrigBase == PM_SCAN) DrawMenuStateStrings (PM_ALT_SCAN, PM_ALT_MANIFEST - PM_ALT_SCAN); else DrawMenuStateStrings (PM_ALT_STARMAP, PM_ALT_MANIFEST - PM_ALT_STARMAP); pMS->CurState = ALT_MANIFEST; return TRUE; } else return FALSE; DrawMenuStateStrings (BaseState, NewState); if (useAltMenu) NewState = ConvertAlternateMenu (BaseState, NewState); pMS->CurState = NewState; SleepThread (ONE_SECOND / 20); return TRUE; }
static BOOLEAN DoPlanetOrbit (MENU_STATE *pMS) { BOOLEAN select = PulsedInputState.menu[KEY_MENU_SELECT]; BOOLEAN handled; if ((GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD)) || GLOBAL_SIS (CrewEnlisted) == (COUNT)~0) return FALSE; // XXX: pMS actually refers to pSolarSysState->MenuState handled = DoMenuChooser (pMS, PM_SCAN); if (handled) return TRUE; if (!select) return TRUE; LockMutex (GraphicsLock); SetFlashRect (NULL); UnlockMutex (GraphicsLock); switch (pMS->CurState) { case SCAN: ScanSystem (); if (GLOBAL (CurrentActivity) & START_ENCOUNTER) { // Found Fwiffo on Pluto return FALSE; } break; case EQUIP_DEVICE: select = DevicesMenu (); if (GLOBAL (CurrentActivity) & START_ENCOUNTER) { // Invoked Talking Pet, a Caster or Sun Device over Chmmr, // or a Caster for Ilwrath // Going into conversation return FALSE; } break; case CARGO: CargoMenu (); break; case ROSTER: select = RosterMenu (); break; case GAME_MENU: if (!GameOptions ()) return FALSE; // abort or load break; case STARMAP: { BOOLEAN AutoPilotSet; InputFrameCallback *oldCallback; // Deactivate planet rotation oldCallback = SetInputCallback (NULL); LockMutex (GraphicsLock); RepairSISBorder (); UnlockMutex (GraphicsLock); AutoPilotSet = StarMap (); if (GLOBAL (CurrentActivity) & CHECK_ABORT) return FALSE; // Reactivate planet rotation SetInputCallback (oldCallback); if (!AutoPilotSet) { // Redraw the orbital display LockMutex (GraphicsLock); DrawOrbitalDisplay (DRAW_ORBITAL_FULL); UnlockMutex (GraphicsLock); break; } // Fall through !!! } case NAVIGATION: return FALSE; } if (!(GLOBAL (CurrentActivity) & CHECK_ABORT)) { if (select) { // 3DO menu jumps to NAVIGATE after a successful submenu run if (optWhichMenu != OPT_PC) pMS->CurState = NAVIGATION; DrawMenuStateStrings (PM_SCAN, pMS->CurState); } LockMutex (GraphicsLock); SetFlashRect (SFR_MENU_3DO); UnlockMutex (GraphicsLock); } return TRUE; }