static void flashSupportShip (ROSTER_STATE *rosterState) { static Color c = BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x00, 0x00), 0x24); static TimeCount NextTime = 0; if (GetTimeCounter () >= NextTime) { NextTime = GetTimeCounter () + (ONE_SECOND / 15); /* The commented code out code is the old code before the switch * to 24-bits colors. The current code produces very slightly * different colors due to rounding errors, but the old code wasn't * original anyhow, and you can't tell the difference visually. * - SvdB if (c >= BUILD_COLOR (MAKE_RGB15 (0x1F, 0x19, 0x19), 0x24)) c = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x00, 0x00), 0x24); else c += BUILD_COLOR (MAKE_RGB15 (0x00, 0x02, 0x02), 0x00); */ if (c.g >= CC5TO8 (0x19)) { c = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x00, 0x00), 0x24); } else { c.g += CC5TO8 (0x02); c.b += CC5TO8 (0x02); } SetContextForeGroundColor (c); drawSupportShip (rosterState, TRUE); } }
static void drawModifiedSupportShip (ROSTER_STATE *rosterState) { SetContext (StatusContext); SetContextForeGroundColor (ROSTER_MODIFY_SHIP_COLOR); drawSupportShip (rosterState, TRUE); }
BOOLEAN RosterMenu (void) { MENU_STATE MenuState; ROSTER_STATE RosterState; memset (&MenuState, 0, sizeof MenuState); MenuState.privData = &RosterState; memset (&RosterState, 0, sizeof RosterState); RosterState.count = CountLinks (&GLOBAL (built_ship_q)); if (!RosterState.count) return FALSE; // Get the escort positions we will use and sort on X then Y assert (sizeof (RosterState.shipPos) == sizeof (ship_pos)); memcpy (RosterState.shipPos, ship_pos, sizeof (ship_pos)); qsort (RosterState.shipPos, RosterState.count, sizeof (RosterState.shipPos[0]), compShipPos); LockMutex (GraphicsLock); SetContext (StatusContext); selectSupportShip (&RosterState, MenuState.CurState); UnlockMutex (GraphicsLock); SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT); MenuState.InputFunc = DoModifyRoster; DoInput (&MenuState, TRUE); LockMutex (GraphicsLock); SetContext (StatusContext); // unselect the last ship drawSupportShip (&RosterState, FALSE); DrawStatusMessage (NULL); UnlockMutex (GraphicsLock); return TRUE; }
static BOOLEAN DoModifyRoster (MENU_STATE *pMS) { ROSTER_STATE *rosterState = pMS->privData; BOOLEAN select, cancel, up, down, horiz; if (GLOBAL (CurrentActivity) & CHECK_ABORT) return FALSE; select = PulsedInputState.menu[KEY_MENU_SELECT]; cancel = PulsedInputState.menu[KEY_MENU_CANCEL]; up = PulsedInputState.menu[KEY_MENU_UP]; down = PulsedInputState.menu[KEY_MENU_DOWN]; // Left or right produces the same effect because there are 2 columns horiz = PulsedInputState.menu[KEY_MENU_LEFT] || PulsedInputState.menu[KEY_MENU_RIGHT]; if (cancel && !rosterState->modifyingCrew) { return FALSE; } else if (select || cancel) { rosterState->modifyingCrew ^= true; if (!rosterState->modifyingCrew) { SetFlashRect (NULL); SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT); } else { drawModifiedSupportShip (rosterState); flashSupportShipCrew (); SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT | MENU_SOUND_CANCEL); } } else if (rosterState->modifyingCrew) { SIZE delta = 0; BOOLEAN failed = FALSE; if (up) { if (GLOBAL_SIS (CrewEnlisted)) delta = 1; else failed = TRUE; } else if (down) { if (GLOBAL_SIS (CrewEnlisted) < GetCrewPodCapacity ()) delta = -1; else failed = TRUE; } if (delta != 0) { failed = !DeltaSupportCrew (rosterState, delta); } if (failed) { // not enough room or crew PlayMenuSound (MENU_SOUND_FAILURE); } } else { COUNT NewState; POINT *pship_pos = rosterState->shipPos; COUNT top_right = (rosterState->count + 1) >> 1; NewState = pMS->CurState; if (rosterState->count < 2) { // no navigation allowed } else if (horiz) { if (NewState == top_right - 1) NewState = rosterState->count - 1; else if (NewState >= top_right) { NewState -= top_right; if (pship_pos[NewState].y < pship_pos[pMS->CurState].y) ++NewState; } else { NewState += top_right; if (NewState != top_right && pship_pos[NewState].y > pship_pos[pMS->CurState].y) --NewState; } } else if (down) { ++NewState; if (NewState == rosterState->count) NewState = top_right; else if (NewState == top_right) NewState = 0; } else if (up) { if (NewState == 0) NewState = top_right - 1; else if (NewState == top_right) NewState = rosterState->count - 1; else --NewState; } BatchGraphics (); SetContext (StatusContext); if (NewState != pMS->CurState) { // Draw the previous escort in unselected state drawSupportShip (rosterState, FALSE); // Select the new one selectSupportShip (rosterState, NewState); pMS->CurState = NewState; } flashSupportShip (rosterState); UnbatchGraphics (); } SleepThread (ONE_SECOND / 30); return TRUE; }