void ConfirmSaveLoad (STAMP *MsgStamp) { RECT r, clip_r; TEXT t; SetContextFont (StarConFont); GetContextClipRect (&clip_r); t.baseline.x = clip_r.extent.width >> 1; t.baseline.y = (clip_r.extent.height >> 1) + (3 << RESOLUTION_FACTOR); // JMS_GFX t.align = ALIGN_CENTER; t.CharCount = (COUNT)~0; if (MsgStamp) t.pStr = GAME_STRING (SAVEGAME_STRING_BASE + 0); // "Saving . . ." else t.pStr = GAME_STRING (SAVEGAME_STRING_BASE + 1); // "Loading . . ." TextRect (&t, &r, NULL); r.corner.x -= 4 << RESOLUTION_FACTOR; // JMS_GFX r.corner.y -= 4 << RESOLUTION_FACTOR; // JMS_GFX r.extent.width += 8 << RESOLUTION_FACTOR; // JMS_GFX r.extent.height += 8 << RESOLUTION_FACTOR; // JMS_GFX if (MsgStamp) { *MsgStamp = SaveContextFrame (&r); } if (RESOLUTION_FACTOR == 0) { DrawStarConBox (&r, 2, BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19), BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F), TRUE, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x14, 0x14, 0x14), 0x0F)); } else { DrawStarConBox (&r, 2, PCMENU_TOP_LEFT_BORDER_COLOR, PCMENU_BOTTOM_RIGHT_BORDER_COLOR, TRUE, PCMENU_BACKGROUND_COLOR); SetContextForeGroundColor (PCMENU_SELECTION_TEXT_COLOR); } font_DrawText (&t); }
/* Actually display the menu text */ static void DrawPCMenu (BYTE beg_index, BYTE end_index, BYTE NewState, BYTE hilite, RECT *r) { #define PC_MENU_HEIGHT 8 BYTE pos; COUNT i; int num_items; FONT OldFont; TEXT t; UNICODE buf[256]; pos = beg_index + NewState; num_items = 1 + end_index - beg_index; r->corner.x -= 1; r->extent.width += 1; DrawFilledRectangle (r); if (num_items * PC_MENU_HEIGHT > r->extent.height) log_add (log_Error, "Warning, no room for all menu items!"); else r->corner.y += (r->extent.height - num_items * PC_MENU_HEIGHT) / 2; r->extent.height = num_items * PC_MENU_HEIGHT + 4; DrawPCMenuFrame (r); OldFont = SetContextFont (StarConFont); t.align = ALIGN_LEFT; t.baseline.x = r->corner.x + 2; t.baseline.y = r->corner.y + PC_MENU_HEIGHT -1; t.pStr = buf; t.CharCount = (COUNT)~0; r->corner.x++; r->extent.width -= 2; for (i = beg_index; i <= end_index; i++) { utf8StringCopy (buf, sizeof buf, (i == PM_FUEL) ? pm_fuel_str : (i == PM_CREW) ? pm_crew_str : GAME_STRING (MAINMENU_STRING_BASE + i)); if (hilite && pos == i) { // Currently selected menu option. // Draw the background of the selection. SetContextForeGroundColor (PCMENU_SELECTION_BACKGROUND_COLOR); r->corner.y = t.baseline.y - PC_MENU_HEIGHT + 2; r->extent.height = PC_MENU_HEIGHT - 1; DrawFilledRectangle (r); // Draw the text of the selected item. SetContextForeGroundColor (PCMENU_SELECTION_TEXT_COLOR); font_DrawText (&t); } else { // Draw the text of an unselected item. SetContextForeGroundColor (PCMENU_TEXT_COLOR); font_DrawText (&t); } t.baseline.y += PC_MENU_HEIGHT; } SetContextFont (OldFont); }
static void DrawDevice (COUNT device, COUNT pos, bool selected) { RECT r; TEXT t; t.align = ALIGN_CENTER; t.baseline.x = DEVICE_COL_1; r.extent.width = DEVICE_SEL_WIDTH; r.extent.height = TEXT_SPACING_Y * 2; r.corner.x = DEVICE_SEL_ORG_X; // draw line background r.corner.y = DEVICE_ORG_Y + pos * DEVICE_SPACING_Y + NAME_OFS_Y; SetContextForeGroundColor (selected ? DEVICES_SELECTED_BACK_COLOR : DEVICES_BACK_COLOR); DrawFilledRectangle (&r); SetContextFont (TinyFont); // print device name SetContextForeGroundColor (selected ? DEVICES_SELECTED_NAME_COLOR : DEVICES_NAME_COLOR); t.baseline.y = r.corner.y + TEXT_BASELINE; t.pStr = GAME_STRING (device + DEVICE_STRING_BASE + 1); t.CharCount = utf8StringPos (t.pStr, ' '); font_DrawText (&t); t.baseline.y += TEXT_SPACING_Y; t.pStr = skipUTF8Chars (t.pStr, t.CharCount + 1); t.CharCount = (COUNT)~0; font_DrawText (&t); }
static void FeedbackPlayerPhrase (UNICODE *pStr) { SetContext (SpaceContext); BatchGraphics (); DrawSISComWindow (); if (pStr[0]) { TEXT ct; ct.baseline.x = SIS_SCREEN_WIDTH >> 1; ct.baseline.y = SLIDER_Y + SLIDER_HEIGHT + RES_SCALE(13); // JMS_GFX ct.align = ALIGN_CENTER; ct.CharCount = (COUNT)~0; ct.pStr = GAME_STRING (FEEDBACK_STRING_BASE); // "(In response to your statement)" SetContextForeGroundColor (COMM_RESPONSE_INTRO_TEXT_COLOR); font_DrawText (&ct); ct.baseline.y += RES_SCALE(16); // JMS_GFX SetContextForeGroundColor (COMM_FEEDBACK_TEXT_COLOR); ct.pStr = pStr; add_text (-4, &ct); } UnbatchGraphics (); }
const char * planetTypeString (int typeIndex) { static UNICODE typeStr[40]; if (typeIndex >= FIRST_GAS_GIANT) { // "Gas Giant" snprintf(typeStr, sizeof typeStr, "%s", GAME_STRING (SCAN_STRING_BASE + 4 + 51)); } else { // "<type> World" (eg. "Water World") snprintf(typeStr, sizeof typeStr, "%s %s", GAME_STRING (SCAN_STRING_BASE + 4 + typeIndex), GAME_STRING (SCAN_STRING_BASE + 4 + 50)); } return typeStr; }
static void DrawConfirmationWindow (BOOLEAN answer) { Color oldfg = SetContextForeGroundColor (MENU_TEXT_COLOR); FONT oldfont = SetContextFont (StarConFont); FRAME oldFontEffect = SetContextFontEffect (NULL); RECT r; TEXT t; BatchGraphics (); r.corner.x = (SCREEN_WIDTH - CONFIRM_WIN_WIDTH) >> 1; r.corner.y = (SCREEN_HEIGHT - CONFIRM_WIN_HEIGHT) >> 1; r.extent.width = CONFIRM_WIN_WIDTH; r.extent.height = CONFIRM_WIN_HEIGHT; DrawShadowedBox (&r, SHADOWBOX_BACKGROUND_COLOR, SHADOWBOX_DARK_COLOR, SHADOWBOX_MEDIUM_COLOR); t.baseline.x = r.corner.x + (r.extent.width >> 1); t.baseline.y = r.corner.y + (8 << RESOLUTION_FACTOR); // JMS_GFX t.pStr = GAME_STRING (QUITMENU_STRING_BASE); // "Really Quit?" t.align = ALIGN_CENTER; t.CharCount = (COUNT)~0; font_DrawText (&t); t.baseline.y += (10 << RESOLUTION_FACTOR); // JMS_GFX t.baseline.x = r.corner.x + (r.extent.width >> 2); t.pStr = GAME_STRING (QUITMENU_STRING_BASE + 1); // "Yes" SetContextForeGroundColor (answer ? MENU_HIGHLIGHT_COLOR : MENU_TEXT_COLOR); font_DrawText (&t); t.baseline.x += (r.extent.width >> 1); t.pStr = GAME_STRING (QUITMENU_STRING_BASE + 2); // "No" SetContextForeGroundColor (answer ? MENU_TEXT_COLOR : MENU_HIGHLIGHT_COLOR); font_DrawText (&t); UnbatchGraphics (); SetContextFontEffect (oldFontEffect); SetContextFont (oldfont); SetContextForeGroundColor (oldfg); }
void dumpPlanetType (FILE *out, int index, const PlanetFrame *planetType) { int i; fprintf (out, "%s\n" "\tType: %s\n" "\tColor: %s\n" "\tSurface generation algoritm: %s\n" "\tTectonics: %s\n" "\tAtmosphere: %s\n" "\tDensity: %s\n" "\tElements:\n", planetTypeString (index), worldSizeString (PLANSIZE (planetType->Type)), bodyColorString (PLANCOLOR (planetType->Type)), worldGenAlgoString (PLANALGO (planetType->Type)), tectonicsString (planetType->BaseTectonics), atmosphereString (HINIBBLE (planetType->AtmoAndDensity)), densityString (LONIBBLE (planetType->AtmoAndDensity)) ); for (i = 0; i < NUM_USEFUL_ELEMENTS; i++) { const ELEMENT_ENTRY *entry; entry = &planetType->UsefulElements[i]; if (entry->Density == 0) continue; fprintf(out, "\t\t0 to %d %s-quality (+%d) deposits of %s (%s)\n", DEPOSIT_QUANTITY (entry->Density), depositQualityString (DEPOSIT_QUALITY (entry->Density)), DEPOSIT_QUALITY (entry->Density) * 5, GAME_STRING (ELEMENTS_STRING_BASE + entry->ElementType), GAME_STRING (CARGO_STRING_BASE + 2 + ElementCategory ( entry->ElementType)) ); } fprintf (out, "\n"); }
static void DrawDevicesDisplay (DEVICES_STATE *devState) { TEXT t; RECT r; STAMP s; COORD cy; COUNT i; r.corner.x = 2; r.corner.y = 20; r.extent.width = FIELD_WIDTH + 1; // XXX: Shouldn't the height be 1 less? This draws the bottom border // 1 pixel too low. Or if not, why do we need another box anyway? r.extent.height = 129 - r.corner.y; DrawStarConBox (&r, 1, SHADOWBOX_MEDIUM_COLOR, SHADOWBOX_DARK_COLOR, TRUE, DEVICES_BACK_COLOR); // print the "DEVICES" title SetContextFont (StarConFont); t.baseline.x = (STATUS_WIDTH >> 1) - 1; t.baseline.y = r.corner.y + 7; t.align = ALIGN_CENTER; t.pStr = GAME_STRING (DEVICE_STRING_BASE); t.CharCount = (COUNT)~0; SetContextForeGroundColor (DEVICES_SELECTED_NAME_COLOR); font_DrawText (&t); s.origin.x = DEVICE_COL_0; cy = DEVICE_ORG_Y; // draw device icons and print names for (i = 0; i < MAX_VIS_DEVICES; ++i, cy += DEVICE_SPACING_Y) { COUNT devIndex = devState->topIndex + i; if (devIndex >= devState->count) break; // draw device icon s.origin.y = cy + ICON_OFS_Y; s.frame = SetAbsFrameIndex (MiscDataFrame, 77 + devState->list[devIndex]); DrawStamp (&s); DrawDevice (devState->list[devIndex], i, false); } }
static BOOLEAN RestartMessage(MENU_STATE *pMS, TimeCount TimeIn){ if(optRequiresRestart){ SetFlashRect (NULL); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 35)); // Got to restart -message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); SleepThreadUntil (FadeScreen(FadeAllToBlack, ONE_SECOND / 2)); GLOBAL (CurrentActivity) = CHECK_ABORT; restartGame = TRUE; return TRUE; } else if (!PacksInstalled()) { Flash_pause(pMS->flashContext); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 35 + RESOLUTION_FACTOR)); // Could not find graphics pack - message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); Flash_continue(pMS->flashContext); SleepThreadUntil (TimeIn + ONE_SECOND / 30); return TRUE; } else return FALSE; }
static BOOLEAN DoRestart (MENU_STATE *pMS) { static TimeCount LastInputTime; static TimeCount InactTimeOut; TimeCount TimeIn = GetTimeCounter (); /* Cancel any presses of the Pause key. */ GamePaused = FALSE; if(optSuperMelee && !optLoadGame && PacksInstalled()){ pMS->CurState = PLAY_SUPER_MELEE; PulsedInputState.menu[KEY_MENU_SELECT] = 65535; } if(optLoadGame && !optSuperMelee && PacksInstalled()){ pMS->CurState = LOAD_SAVED_GAME; PulsedInputState.menu[KEY_MENU_SELECT] = 65535; } if (pMS->Initialized) Flash_process(pMS->flashContext); if (!pMS->Initialized) { if (pMS->hMusic && !comingFromInit) { StopMusic (); DestroyMusic (pMS->hMusic); pMS->hMusic = 0; } pMS->hMusic = loadMainMenuMusic (Rando); InactTimeOut = (optMainMenuMusic ? 60 : 20) * ONE_SECOND; pMS->flashContext = Flash_createOverlay (ScreenContext, NULL, NULL); Flash_setMergeFactors (pMS->flashContext, -3, 3, 16); Flash_setSpeed (pMS->flashContext, (6 * ONE_SECOND) / 14, 0, (6 * ONE_SECOND) / 14, 0); Flash_setFrameTime (pMS->flashContext, ONE_SECOND / 16); Flash_setState(pMS->flashContext, FlashState_fadeIn, (3 * ONE_SECOND) / 16); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); Flash_start (pMS->flashContext); LastInputTime = GetTimeCounter (); pMS->Initialized = TRUE; SleepThreadUntil (FadeScreen (FadeAllToColor, ONE_SECOND / 2)); if (!comingFromInit){ FadeMusic(0,0); PlayMusic (pMS->hMusic, TRUE, 1); if (optMainMenuMusic) FadeMusic (NORMAL_VOLUME+70, ONE_SECOND * 3); } } else if (GLOBAL (CurrentActivity) & CHECK_ABORT) { return FALSE; } else if (PulsedInputState.menu[KEY_MENU_SELECT]) { //BYTE fade_buf[1]; COUNT oldresfactor; switch (pMS->CurState) { case LOAD_SAVED_GAME: if (!RestartMessage(pMS, TimeIn)) { LastActivity = CHECK_LOAD; GLOBAL (CurrentActivity) = IN_INTERPLANETARY; optLoadGame = FALSE; } else return TRUE; break; case START_NEW_GAME: if (!RestartMessage(pMS, TimeIn)) { LastActivity = CHECK_LOAD | CHECK_RESTART; GLOBAL (CurrentActivity) = IN_INTERPLANETARY; } else return TRUE; break; case PLAY_SUPER_MELEE: if (!RestartMessage(pMS, TimeIn)) { GLOBAL (CurrentActivity) = SUPER_MELEE; optSuperMelee = FALSE; } else return TRUE; break; case SETUP_GAME: oldresfactor = resolutionFactor; Flash_pause(pMS->flashContext); Flash_setState(pMS->flashContext, FlashState_fadeIn, (3 * ONE_SECOND) / 16); SetupMenu (); SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); InactTimeOut = (optMainMenuMusic ? 60 : 20) * ONE_SECOND; LastInputTime = GetTimeCounter (); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); ScreenTransition (3, NULL); // JMS_GFX: This prevents drawing an annoying wrong-sized "Setup" frame when changing resolution. if (oldresfactor < resolutionFactor) DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, TRUE); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); Flash_continue(pMS->flashContext); UnbatchGraphics (); return TRUE; case QUIT_GAME: SleepThreadUntil (FadeScreen (FadeAllToBlack, ONE_SECOND / 2)); GLOBAL (CurrentActivity) = CHECK_ABORT; break; } Flash_pause(pMS->flashContext); return FALSE; } else if (PulsedInputState.menu[KEY_MENU_UP] || PulsedInputState.menu[KEY_MENU_DOWN]) { BYTE NewState; NewState = pMS->CurState; if (PulsedInputState.menu[KEY_MENU_UP]) { if (NewState == START_NEW_GAME) NewState = QUIT_GAME; else --NewState; } else if (PulsedInputState.menu[KEY_MENU_DOWN]) { if (NewState == QUIT_GAME) NewState = START_NEW_GAME; else ++NewState; } if (NewState != pMS->CurState) { BatchGraphics (); DrawRestartMenu (pMS, NewState, pMS->CurFrame, FALSE); UnbatchGraphics (); pMS->CurState = NewState; } LastInputTime = GetTimeCounter (); } else if (PulsedInputState.menu[KEY_MENU_LEFT] || PulsedInputState.menu[KEY_MENU_RIGHT]) { // Does nothing, but counts as input for timeout purposes LastInputTime = GetTimeCounter (); } else if (MouseButtonDown) { Flash_pause(pMS->flashContext); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 54)); // Mouse not supported message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); ScreenTransition (3, NULL); UnbatchGraphics (); Flash_continue(pMS->flashContext); LastInputTime = GetTimeCounter (); } else { // No input received, check if timed out // JMS: After changing resolution mode, prevent displaying credits // (until the next time the game is restarted). This is to prevent // showing the credits with the wrong resolution mode's font&background. if (GetTimeCounter () - LastInputTime > InactTimeOut && !optRequiresRestart && PacksInstalled()) { SleepThreadUntil (FadeMusic (0, ONE_SECOND/2)); StopMusic (); FadeMusic (NORMAL_VOLUME, 0); GLOBAL (CurrentActivity) = (ACTIVITY)~0; return FALSE; } } comingFromInit = FALSE; SleepThreadUntil (TimeIn + ONE_SECOND / 30); return TRUE; }
static void DrawElementDescription (COUNT element) { DrawStatusMessage (GAME_STRING (element + (CARGO_STRING_BASE + 2))); }
static void DrawDevices (PMENU_STATE pMS, BYTE OldDevice, BYTE NewDevice) { #define MAX_VIS_DEVICES 5 COORD y, cy; TEXT t; RECT r; PBYTE pDeviceMap; LockMutex (GraphicsLock); SetContext (StatusContext); SetContextFont (TinyFont); y = 41; t.baseline.x = 40; t.align = ALIGN_CENTER; t.CharCount = 3; pDeviceMap = (PBYTE)pMS->CurFrame; if (OldDevice > NUM_DEVICES || (NewDevice < NUM_DEVICES && (NewDevice < (BYTE)pMS->first_item.y || NewDevice >= (BYTE)(pMS->first_item.y + MAX_VIS_DEVICES)))) { STAMP s; r.corner.x = 2; r.extent.width = FIELD_WIDTH + 1; if (!(pMS->Initialized & 1)) { ++r.corner.x; r.extent.width -= 2; r.corner.y = 33; r.extent.height = 89; SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); DrawFilledRectangle (&r); } else { TEXT ct; r.corner.y = 20; r.extent.height = 109; DrawStarConBox (&r, 1, BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19), BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F), TRUE, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); SetContextFont (StarConFont); ct.baseline.x = (STATUS_WIDTH >> 1) - 1; ct.baseline.y = 27; ct.align = ALIGN_CENTER; ct.pStr = GAME_STRING (DEVICE_STRING_BASE); ct.CharCount = (COUNT)~0; SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B)); font_DrawText (&ct); SetContextFont (TinyFont); } if (NewDevice < (BYTE)pMS->first_item.y) pMS->first_item.y = NewDevice; else if (NewDevice >= (BYTE)(pMS->first_item.y + MAX_VIS_DEVICES)) pMS->first_item.y = NewDevice - (MAX_VIS_DEVICES - 1); s.origin.x = 4; s.origin.y = 34; cy = y; SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03)); for (OldDevice = (BYTE)pMS->first_item.y; OldDevice < (BYTE)(pMS->first_item.y + MAX_VIS_DEVICES) && OldDevice < (BYTE)pMS->first_item.x; ++OldDevice) { s.frame = SetAbsFrameIndex ( MiscDataFrame, 77 + pDeviceMap[OldDevice]); DrawStamp (&s); if (OldDevice != NewDevice) { t.baseline.y = cy; t.pStr = GAME_STRING (pDeviceMap[OldDevice] + DEVICE_STRING_BASE + 1); t.CharCount = utf8StringPos (t.pStr, ' '); font_DrawText (&t); t.baseline.y += 7; t.pStr = skipUTF8Chars (t.pStr, t.CharCount + 1); t.CharCount = (COUNT)~0; font_DrawText (&t); } cy += 18; s.origin.y += 18; } OldDevice = NewDevice; }
// This function should help in making sure that gamestr.h matches // gamestrings.txt. void dumpStrings (FILE *out) { #define STRINGIZE(a) #a #define MAKE_STRING_CATEGORY(prefix) \ { \ /* .name = */ STRINGIZE(prefix ## _BASE), \ /* .base = */ prefix ## _BASE, \ /* .count = */ prefix ## _COUNT \ } struct { const char *name; size_t base; size_t count; } categories[] = { { "0", 0, 0 }, MAKE_STRING_CATEGORY(STAR_STRING), MAKE_STRING_CATEGORY(DEVICE_STRING), MAKE_STRING_CATEGORY(CARGO_STRING), MAKE_STRING_CATEGORY(ELEMENTS_STRING), MAKE_STRING_CATEGORY(SCAN_STRING), MAKE_STRING_CATEGORY(STAR_NUMBER), MAKE_STRING_CATEGORY(PLANET_NUMBER), MAKE_STRING_CATEGORY(MONTHS_STRING), MAKE_STRING_CATEGORY(FEEDBACK_STRING), MAKE_STRING_CATEGORY(STARBASE_STRING), MAKE_STRING_CATEGORY(ENCOUNTER_STRING), MAKE_STRING_CATEGORY(NAVIGATION_STRING), MAKE_STRING_CATEGORY(NAMING_STRING), MAKE_STRING_CATEGORY(MELEE_STRING), MAKE_STRING_CATEGORY(SAVEGAME_STRING), MAKE_STRING_CATEGORY(OPTION_STRING), MAKE_STRING_CATEGORY(QUITMENU_STRING), MAKE_STRING_CATEGORY(STATUS_STRING), MAKE_STRING_CATEGORY(FLAGSHIP_STRING), MAKE_STRING_CATEGORY(ORBITSCAN_STRING), MAKE_STRING_CATEGORY(MAINMENU_STRING), MAKE_STRING_CATEGORY(NETMELEE_STRING), { "GAMESTR_COUNT", GAMESTR_COUNT, (size_t) -1 } }; size_t numCategories = sizeof categories / sizeof categories[0]; size_t numStrings = GetStringTableCount (GameStrings); size_t stringI; size_t categoryI = 0; // Start with a sanity check to see if gamestr.h has been changed but // not this file. for (categoryI = 0; categoryI < numCategories - 1; categoryI++) { if (categories[categoryI].base + categories[categoryI].count != categories[categoryI + 1].base) { fprintf(stderr, "Error: String category list in dumpStrings() is " "not up to date.\n"); return; } } if (GAMESTR_COUNT != numStrings) { fprintf(stderr, "Warning: GAMESTR_COUNT is %d, but GameStrings " "contains %d strings.\n", GAMESTR_COUNT, numStrings); } categoryI = 0; for (stringI = 0; stringI < numStrings; stringI++) { while (categoryI < numCategories && stringI >= categories[categoryI + 1].base) categoryI++; fprintf(out, "[ %s + %d ] %s\n", categories[categoryI].name, stringI - categories[categoryI].base, GAME_STRING(stringI)); } }
static void DrawDevicesDisplay (DEVICES_STATE *devState) { TEXT t; RECT r; STAMP s; COORD cy; COUNT i; r.corner.x = RES_CASE(2,2,3); // JMS_GFX r.corner.y = RES_STAT_SCALE(20) - RES_CASE(0,1,0); // JMS_GFX r.extent.width = FIELD_WIDTH + 1; // JMS_GFX // XXX: Shouldn't the height be 1 less? This draws the bottom border // 1 pixel too low. Or if not, why do we need another box anyway? r.extent.height = RES_STAT_SCALE(129) - r.corner.y + RES_CASE(0,6,19); // JMS_GFX DrawStarConBox (&r, 1, SHADOWBOX_MEDIUM_COLOR, SHADOWBOX_DARK_COLOR, TRUE, DEVICES_BACK_COLOR); DrawBorder(12); // print the "DEVICES" title SetContextFont (StarConFont); t.baseline.x = (STATUS_WIDTH >> 1) - RES_STAT_SCALE(1); // JMS_GFX t.baseline.y = r.corner.y + RES_STAT_SCALE(7); // JMS_GFX t.align = ALIGN_CENTER; t.pStr = GAME_STRING (DEVICE_STRING_BASE); t.CharCount = (COUNT)~0; SetContextForeGroundColor (DEVICES_SELECTED_NAME_COLOR); font_DrawText (&t); s.origin.x = DEVICE_COL_0; cy = DEVICE_ORG_Y; // draw device icons and print names for (i = 0; i < MAX_VIS_DEVICES; ++i, cy += DEVICE_SPACING_Y) { COUNT devIndex = devState->topIndex + i; if (devIndex >= devState->count) break; // draw device icon s.origin.y = cy + ICON_OFS_Y; s.frame = SetAbsFrameIndex (MiscDataFrame, 77 + devState->list[devIndex]); if (RESOLUTION_FACTOR < 2) { DrawStamp (&s); } else { int oldMode, oldScale; oldMode = SetGraphicScaleMode (TFB_SCALE_BILINEAR); oldScale = SetGraphicScale ((int)(GSCALE_IDENTITY / 2)); DrawStamp (&s); SetGraphicScale (oldScale); SetGraphicScaleMode (oldMode); } DrawDevice (devState->list[devIndex], i, false); } }
static void DrawCargoDisplay (void) { STAMP s; TEXT t; RECT r; COORD cy; COUNT i; r.corner.x = 2; r.extent.width = FIELD_WIDTH + 1; r.corner.y = 20; // XXX: Shouldn't the height be 1 less? This draws the bottom border // 1 pixel too low. Or if not, why do we need another box anyway? r.extent.height = 129 - r.corner.y; DrawStarConBox (&r, 1, SHADOWBOX_MEDIUM_COLOR, SHADOWBOX_DARK_COLOR, TRUE, CARGO_BACK_COLOR); // draw the "CARGO" title SetContextFont (StarConFont); t.baseline.x = (STATUS_WIDTH >> 1) - 1; t.baseline.y = 27; t.align = ALIGN_CENTER; t.pStr = GAME_STRING (CARGO_STRING_BASE); t.CharCount = (COUNT)~0; SetContextForeGroundColor (CARGO_SELECTED_AMOUNT_COLOR); font_DrawText (&t); SetContextFont (TinyFont); s.frame = SetAbsFrameIndex (MiscDataFrame, (NUM_SCANDOT_TRANSITIONS * 2) + 3); r.corner.x = ELEMENT_COL_0; r.extent = GetFrameBounds (s.frame); s.origin.x = r.corner.x + (r.extent.width >> 1); cy = ELEMENT_ORG_Y; // print element column headings t.align = ALIGN_RIGHT; t.baseline.y = cy - 1; t.CharCount = (COUNT)~0; SetContextForeGroundColor (CARGO_WORTH_COLOR); t.baseline.x = ELEMENT_COL_1; t.pStr = "$"; font_DrawText (&t); t.baseline.x = ELEMENT_COL_2; t.pStr = "#"; font_DrawText (&t); // draw element icons and print amounts for (i = 0; i < NUM_ELEMENT_CATEGORIES; ++i, cy += ELEMENT_SPACING_Y) { // erase background under an element icon SetContextForeGroundColor (BLACK_COLOR); r.corner.y = cy; DrawFilledRectangle (&r); // draw an element icon s.origin.y = r.corner.y + (r.extent.height >> 1); DrawStamp (&s); s.frame = SetRelFrameIndex (s.frame, 5); DrawElementAmount (i, false); } // erase background under the Bio icon SetContextForeGroundColor (BLACK_COLOR); r.corner.y = BIO_ORG_Y; DrawFilledRectangle (&r); // draw the Bio icon s.origin.y = r.corner.y + (r.extent.height >> 1); s.frame = SetAbsFrameIndex (s.frame, 68); DrawStamp (&s); // print the Bio amount DrawElementAmount (NUM_ELEMENT_CATEGORIES, false); // draw the line over the Bio amount r.corner.x = 4; r.corner.y = BIO_ORG_Y - 2; r.extent.width = FIELD_WIDTH - 3; r.extent.height = 1; SetContextForeGroundColor (CARGO_SELECTED_BACK_COLOR); DrawFilledRectangle (&r); // print "Free" t.baseline.x = 5; t.baseline.y = FREE_ORG_Y + TEXT_BASELINE; t.align = ALIGN_LEFT; t.pStr = GAME_STRING (CARGO_STRING_BASE + 1); t.CharCount = (COUNT)~0; font_DrawText (&t); ShowRemainingCapacity (); }
void DrawMenuStateStrings (BYTE beg_index, SWORD NewState) { BYTE end_index; RECT r; STAMP s; CONTEXT OldContext; BYTE hilite = 1; extern FRAME PlayFrame; if (NewState < 0) { NewState = -NewState; hilite = 0; } if (optWhichMenu == OPT_PC) { BYTE tmpState = (BYTE)NewState; GetAlternateMenu (&beg_index, &tmpState); NewState = tmpState; } if (beg_index == PM_STARMAP) NewState--; end_index = GetEndMenuState (beg_index); s.frame = 0; if (NewState <= end_index - beg_index) s.frame = SetAbsFrameIndex (PlayFrame, beg_index + NewState); PreUpdateFlashRect (); OldContext = SetContext (StatusContext); GetContextClipRect (&r); s.origin.x = RADAR_X - r.corner.x; s.origin.y = RADAR_Y - r.corner.y; r.corner.x = s.origin.x - 1; r.corner.y = s.origin.y - 11; r.extent.width = RADAR_WIDTH + 2; BatchGraphics (); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); if (s.frame && optWhichMenu == OPT_PC) { if (beg_index == PM_CREW) snprintf (pm_crew_str, sizeof pm_crew_str, "%s(%d)", GAME_STRING (MAINMENU_STRING_BASE + PM_CREW), GLOBAL (CrewCost)); if (beg_index == PM_FUEL) snprintf (pm_fuel_str, sizeof pm_fuel_str, "%s(%d)", GAME_STRING (MAINMENU_STRING_BASE + PM_FUEL), GLOBAL (FuelCost)); if (beg_index == PM_SOUND_ON) { end_index = beg_index + 5; switch (beg_index + NewState) { case PM_SOUND_ON: case PM_SOUND_OFF: NewState = 0; break; case PM_MUSIC_ON: case PM_MUSIC_OFF: NewState = 1; break; case PM_CYBORG_OFF: case PM_CYBORG_NORMAL: case PM_CYBORG_DOUBLE: case PM_CYBORG_SUPER: NewState = 2; break; case PM_CHANGE_CAPTAIN: NewState = 3; break; case PM_CHANGE_SHIP: NewState = 4; break; case PM_EXIT_SETTINGS: NewState = 5; break; } } r.extent.height = RADAR_HEIGHT + 11; DrawPCMenu (beg_index, end_index, (BYTE)NewState, hilite, &r); s.frame = 0; } else { if (optWhichMenu == OPT_PC) { r.corner.x -= 1; r.extent.width += 1; r.extent.height = RADAR_HEIGHT + 11; } else r.extent.height = 11; DrawFilledRectangle (&r); } if (s.frame) { DrawStamp (&s); switch (beg_index + NewState) { TEXT t; UNICODE buf[20]; case PM_CREW: t.baseline.x = s.origin.x + RADAR_WIDTH - 2; t.baseline.y = s.origin.y + RADAR_HEIGHT - 2; t.align = ALIGN_RIGHT; t.CharCount = (COUNT)~0; t.pStr = buf; snprintf (buf, sizeof buf, "%u", GLOBAL (CrewCost)); SetContextFont (TinyFont); SetContextForeGroundColor (THREEDOMENU_TEXT_COLOR); font_DrawText (&t); break; case PM_FUEL: t.baseline.x = s.origin.x + RADAR_WIDTH - 2; t.baseline.y = s.origin.y + RADAR_HEIGHT - 2; t.align = ALIGN_RIGHT; t.CharCount = (COUNT)~0; t.pStr = buf; snprintf (buf, sizeof buf, "%u", GLOBAL (FuelCost)); SetContextFont (TinyFont); SetContextForeGroundColor (THREEDOMENU_TEXT_COLOR); font_DrawText (&t); break; } } UnbatchGraphics (); SetContext (OldContext); PostUpdateFlashRect (); }
static BOOLEAN DoConvSummary (SUMMARY_STATE *pSS) { #define DELTA_Y_SUMMARY RES_SCALE(8) // JMS_GFX //#define MAX_SUMM_ROWS ((SIS_SCREEN_HEIGHT - SLIDER_Y - SLIDER_HEIGHT) / DELTA_Y_SUMMARY #define MAX_SUMM_ROWS (SLIDER_Y / DELTA_Y_SUMMARY) - 1 // JMS_GFX if (!pSS->Initialized) { pSS->PrintNext = TRUE; pSS->NextSub = GetFirstTrackSubtitle (); pSS->LeftOver = NULL; pSS->InputFunc = DoConvSummary; pSS->Initialized = TRUE; DoInput (pSS, FALSE); } else if (GLOBAL (CurrentActivity) & CHECK_ABORT) { return FALSE; // bail out } else if (PulsedInputState.menu[KEY_MENU_SELECT] || PulsedInputState.menu[KEY_MENU_CANCEL] || PulsedInputState.menu[KEY_MENU_RIGHT]) { if (pSS->NextSub) { // we want the next page pSS->PrintNext = TRUE; } else { // no more, we are done return FALSE; } } else if (pSS->PrintNext) { // print the next page RECT r; TEXT t; int row; r.corner.x = 0; r.corner.y = 0; r.extent.width = SIS_SCREEN_WIDTH; r.extent.height = SLIDER_Y; //SIS_SCREEN_HEIGHT - SLIDER_Y - SLIDER_HEIGHT + RES_SCALE(2) + 16 * RESOLUTION_FACTOR; // JMS_GFX SetContext (AnimContext); SetContextForeGroundColor (COMM_HISTORY_BACKGROUND_COLOR); DrawFilledRectangle (&r); SetContextForeGroundColor (COMM_HISTORY_TEXT_COLOR); r.extent.width -= 2 + 2; t.baseline.x = RES_SCALE(2); // JMS_GFX t.align = ALIGN_LEFT; t.baseline.y = DELTA_Y_SUMMARY; SetContextFont (TinyFont); for (row = 0; row < MAX_SUMM_ROWS && pSS->NextSub; ++row, pSS->NextSub = GetNextTrackSubtitle (pSS->NextSub)) { const char *next = NULL; if (pSS->LeftOver) { // some text left from last subtitle t.pStr = pSS->LeftOver; pSS->LeftOver = NULL; } else { t.pStr = GetTrackSubtitleText (pSS->NextSub); if (!t.pStr) continue; } t.CharCount = (COUNT)~0; for ( ; row < MAX_SUMM_ROWS && !getLineWithinWidth (&t, &next, r.extent.width, (COUNT)~0); ++row) { if (CommData.AlienConv == ORZ_CONVERSATION) { // MB: nasty hack: remove '$'s from conversation for Orz UNICODE my_copy[128]; strcpy(my_copy, t.pStr); remove_char_from_string(my_copy, '$'); t.pStr = my_copy; font_DrawText(&t); } else { // Normal mode font_DrawText(&t); } t.baseline.y += DELTA_Y_SUMMARY; t.pStr = next; t.CharCount = (COUNT)~0; } if (row >= MAX_SUMM_ROWS) { // no more space on screen, but some text left over // from the current subtitle pSS->LeftOver = next; break; } // this subtitle fit completely if (CommData.AlienConv == ORZ_CONVERSATION) { // MB: nasty hack: remove '$'s from conversation for Orz UNICODE my_copy[128]; strcpy(my_copy, t.pStr); remove_char_from_string(my_copy, '$'); t.pStr = my_copy; font_DrawText(&t); } else { // Normal mode font_DrawText(&t); } t.baseline.y += DELTA_Y_SUMMARY; } if (row >= MAX_SUMM_ROWS && (pSS->NextSub || pSS->LeftOver)) { // draw *MORE* TEXT mt; UNICODE buffer[128]; mt.baseline.x = SIS_SCREEN_WIDTH >> 1; mt.baseline.y = t.baseline.y; mt.align = ALIGN_CENTER; snprintf (buffer, sizeof (buffer), "%s%s%s", // "MORE" STR_MIDDLE_DOT, GAME_STRING (FEEDBACK_STRING_BASE + 1), STR_MIDDLE_DOT); if (CommData.AlienConv == ORZ_CONVERSATION) { // MB: nasty hack: remove '$'s from conversation for Orz remove_char_from_string(buffer, '$'); } mt.pStr = buffer; SetContextForeGroundColor (COMM_MORE_TEXT_COLOR); font_DrawText (&mt); }
static BOOLEAN DoRestart (MENU_STATE *pMS) { static TimeCount LastInputTime; static TimeCount InactTimeOut; TimeCount TimeIn = GetTimeCounter (); /* Cancel any presses of the Pause key. */ GamePaused = FALSE; if (pMS->Initialized) Flash_process(pMS->flashContext); if (!pMS->Initialized) { if (pMS->hMusic) { StopMusic (); DestroyMusic (pMS->hMusic); pMS->hMusic = 0; } pMS->hMusic = LoadMusic (MAINMENU_MUSIC); InactTimeOut = (pMS->hMusic ? 120 : 20) * ONE_SECOND; pMS->flashContext = Flash_createOverlay (ScreenContext, NULL, NULL); Flash_setMergeFactors (pMS->flashContext, -3, 3, 16); Flash_setSpeed (pMS->flashContext, (6 * ONE_SECOND) / 16, 0, (6 * ONE_SECOND) / 16, 0); Flash_setFrameTime (pMS->flashContext, ONE_SECOND / 16); Flash_setState(pMS->flashContext, FlashState_fadeIn, (3 * ONE_SECOND) / 16); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); Flash_start (pMS->flashContext); PlayMusic (pMS->hMusic, TRUE, 1); LastInputTime = GetTimeCounter (); pMS->Initialized = TRUE; SleepThreadUntil (FadeScreen (FadeAllToColor, ONE_SECOND / 2)); } else if (GLOBAL (CurrentActivity) & CHECK_ABORT) { return FALSE; } else if (PulsedInputState.menu[KEY_MENU_SELECT]) { //BYTE fade_buf[1]; COUNT oldresfactor; BOOLEAN packsInstalled; if (resolutionFactor == 0) packsInstalled = TRUE; else if (resolutionFactor == 1 && hires2xPackPresent) packsInstalled = TRUE; else if (resolutionFactor == 2 && hires4xPackPresent) packsInstalled = TRUE; else packsInstalled = FALSE; switch (pMS->CurState) { case LOAD_SAVED_GAME: if (resFactorWasChanged) { LockMutex (GraphicsLock); SetFlashRect (NULL); UnlockMutex (GraphicsLock); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 35)); // Got to restart -message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); ScreenTransition (3, NULL); UnbatchGraphics (); //fade_buf[0] = FadeAllToBlack; //SleepThreadUntil (XFormColorMap ((COLORMAPPTR)fade_buf, ONE_SECOND / 2)); SleepThreadUntil (FadeScreen(FadeAllToBlack, ONE_SECOND / 2)); GLOBAL (CurrentActivity) = CHECK_ABORT; } else if (!packsInstalled) { Flash_pause(pMS->flashContext); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 35 + resolutionFactor)); // Could not find graphics pack - message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); ScreenTransition (3, NULL); UnbatchGraphics (); Flash_continue(pMS->flashContext); SleepThreadUntil (TimeIn + ONE_SECOND / 30); return TRUE; } else { LastActivity = CHECK_LOAD; GLOBAL (CurrentActivity) = IN_INTERPLANETARY; } break; case START_NEW_GAME: if (resFactorWasChanged) { LockMutex (GraphicsLock); SetFlashRect (NULL); UnlockMutex (GraphicsLock); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 35)); // Got to restart -message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); ScreenTransition (3, NULL); UnbatchGraphics (); //fade_buf[0] = FadeAllToBlack; //SleepThreadUntil (XFormColorMap ((COLORMAPPTR)fade_buf, ONE_SECOND / 2)); SleepThreadUntil (FadeScreen(FadeAllToBlack, ONE_SECOND / 2)); GLOBAL (CurrentActivity) = CHECK_ABORT; } else if (!packsInstalled) { Flash_pause(pMS->flashContext); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 35 + resolutionFactor)); // Could not find graphics pack - message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); ScreenTransition (3, NULL); UnbatchGraphics (); Flash_continue(pMS->flashContext); SleepThreadUntil (TimeIn + ONE_SECOND / 30); return TRUE; } else { LastActivity = CHECK_LOAD | CHECK_RESTART; GLOBAL (CurrentActivity) = IN_INTERPLANETARY; } break; case PLAY_SUPER_MELEE: if (resFactorWasChanged) { LockMutex (GraphicsLock); SetFlashRect (NULL); UnlockMutex (GraphicsLock); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 35)); // Got to restart -message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); ScreenTransition (3, NULL); UnbatchGraphics (); //fade_buf[0] = FadeAllToBlack; //SleepThreadUntil (XFormColorMap ((COLORMAPPTR)fade_buf, ONE_SECOND / 2)); SleepThreadUntil (FadeScreen(FadeAllToBlack, ONE_SECOND / 2)); GLOBAL (CurrentActivity) = CHECK_ABORT; } else if (!packsInstalled) { Flash_pause(pMS->flashContext); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 35 + resolutionFactor)); // Could not find graphics pack - message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); ScreenTransition (3, NULL); UnbatchGraphics (); Flash_continue(pMS->flashContext); SleepThreadUntil (TimeIn + ONE_SECOND / 30); return TRUE; } else { GLOBAL (CurrentActivity) = SUPER_MELEE; } break; case SETUP_GAME: oldresfactor = resolutionFactor; Flash_pause(pMS->flashContext); Flash_setState(pMS->flashContext, FlashState_fadeIn, (3 * ONE_SECOND) / 16); SetupMenu (); SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); LastInputTime = GetTimeCounter (); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); ScreenTransition (3, NULL); // JMS_GFX: This prevents drawing an annoying wrong-sized "Setup" frame when changing resolution. if (oldresfactor < resolutionFactor) DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, TRUE); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); Flash_continue(pMS->flashContext); UnbatchGraphics (); return TRUE; case QUIT_GAME: SleepThreadUntil (FadeScreen (FadeAllToBlack, ONE_SECOND / 2)); GLOBAL (CurrentActivity) = CHECK_ABORT; break; } Flash_pause(pMS->flashContext); return FALSE; } else if (PulsedInputState.menu[KEY_MENU_UP] || PulsedInputState.menu[KEY_MENU_DOWN]) { BYTE NewState; NewState = pMS->CurState; if (PulsedInputState.menu[KEY_MENU_UP]) { if (NewState == START_NEW_GAME) NewState = QUIT_GAME; else --NewState; } else if (PulsedInputState.menu[KEY_MENU_DOWN]) { if (NewState == QUIT_GAME) NewState = START_NEW_GAME; else ++NewState; } if (NewState != pMS->CurState) { BatchGraphics (); DrawRestartMenu (pMS, NewState, pMS->CurFrame, FALSE); UnbatchGraphics (); pMS->CurState = NewState; } LastInputTime = GetTimeCounter (); } else if (PulsedInputState.menu[KEY_MENU_LEFT] || PulsedInputState.menu[KEY_MENU_RIGHT]) { // Does nothing, but counts as input for timeout purposes LastInputTime = GetTimeCounter (); } else if (MouseButtonDown) { Flash_pause(pMS->flashContext); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 54)); // Mouse not supported message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame, FALSE); ScreenTransition (3, NULL); UnbatchGraphics (); Flash_continue(pMS->flashContext); LastInputTime = GetTimeCounter (); } else { // No input received, check if timed out if (GetTimeCounter () - LastInputTime > InactTimeOut) { SleepThreadUntil (FadeMusic (0, ONE_SECOND)); StopMusic (); FadeMusic (NORMAL_VOLUME, 0); GLOBAL (CurrentActivity) = (ACTIVITY)~0; return FALSE; } } SleepThreadUntil (TimeIn + ONE_SECOND / 30); return TRUE; }
static void InitPreBuilt (MELEE_STATE *pMS) { MeleeTeam **list; #define PREBUILT_COUNT 15 pMS->load.preBuiltList = HMalloc (PREBUILT_COUNT * sizeof (MeleeTeam *)); pMS->load.preBuiltCount = PREBUILT_COUNT; #undef PREBUILT_COUNT { size_t fleetI; for (fleetI = 0; fleetI < pMS->load.preBuiltCount; fleetI++) pMS->load.preBuiltList[fleetI] = MeleeTeam_new (); } list = pMS->load.preBuiltList; { /* "Balanced Team 1" */ FleetShipIndex i = 0; MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 4)); MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH); MeleeTeam_setShip (*list, i++, MELEE_CHMMR); MeleeTeam_setShip (*list, i++, MELEE_DRUUGE); MeleeTeam_setShip (*list, i++, MELEE_URQUAN); MeleeTeam_setShip (*list, i++, MELEE_MELNORME); MeleeTeam_setShip (*list, i++, MELEE_ORZ); MeleeTeam_setShip (*list, i++, MELEE_SPATHI); MeleeTeam_setShip (*list, i++, MELEE_SYREEN); MeleeTeam_setShip (*list, i++, MELEE_UTWIG); list++; } { /* "Balanced Team 2" */ FleetShipIndex i = 0; MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 5)); MeleeTeam_setShip (*list, i++, MELEE_ARILOU); MeleeTeam_setShip (*list, i++, MELEE_CHENJESU); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH); MeleeTeam_setShip (*list, i++, MELEE_MYCON); MeleeTeam_setShip (*list, i++, MELEE_YEHAT); MeleeTeam_setShip (*list, i++, MELEE_PKUNK); MeleeTeam_setShip (*list, i++, MELEE_SUPOX); MeleeTeam_setShip (*list, i++, MELEE_THRADDASH); MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK); MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI); list++; } { /* "200 points" */ FleetShipIndex i = 0; MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 6)); MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH); MeleeTeam_setShip (*list, i++, MELEE_CHMMR); MeleeTeam_setShip (*list, i++, MELEE_DRUUGE); MeleeTeam_setShip (*list, i++, MELEE_MELNORME); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH); MeleeTeam_setShip (*list, i++, MELEE_SUPOX); MeleeTeam_setShip (*list, i++, MELEE_ORZ); MeleeTeam_setShip (*list, i++, MELEE_SPATHI); MeleeTeam_setShip (*list, i++, MELEE_ILWRATH); MeleeTeam_setShip (*list, i++, MELEE_VUX); list++; } { /* "Behemoth Zenith" */ FleetShipIndex i = 0; MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 7)); MeleeTeam_setShip (*list, i++, MELEE_CHENJESU); MeleeTeam_setShip (*list, i++, MELEE_CHENJESU); MeleeTeam_setShip (*list, i++, MELEE_CHMMR); MeleeTeam_setShip (*list, i++, MELEE_CHMMR); MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH); MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH); MeleeTeam_setShip (*list, i++, MELEE_URQUAN); MeleeTeam_setShip (*list, i++, MELEE_URQUAN); MeleeTeam_setShip (*list, i++, MELEE_UTWIG); MeleeTeam_setShip (*list, i++, MELEE_UTWIG); list++; } { /* "The Peeled Eyes" */ FleetShipIndex i = 0; MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 8)); MeleeTeam_setShip (*list, i++, MELEE_URQUAN); MeleeTeam_setShip (*list, i++, MELEE_CHENJESU); MeleeTeam_setShip (*list, i++, MELEE_MYCON); MeleeTeam_setShip (*list, i++, MELEE_SYREEN); MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK); MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH); MeleeTeam_setShip (*list, i++, MELEE_MELNORME); MeleeTeam_setShip (*list, i++, MELEE_DRUUGE); MeleeTeam_setShip (*list, i++, MELEE_PKUNK); MeleeTeam_setShip (*list, i++, MELEE_ORZ); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "Ford's Fighters"); MeleeTeam_setShip (*list, i++, MELEE_CHMMR); MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK); MeleeTeam_setShip (*list, i++, MELEE_MELNORME); MeleeTeam_setShip (*list, i++, MELEE_SUPOX); MeleeTeam_setShip (*list, i++, MELEE_UTWIG); MeleeTeam_setShip (*list, i++, MELEE_UMGAH); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "Leyland's Lashers"); MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_MYCON); MeleeTeam_setShip (*list, i++, MELEE_ORZ); MeleeTeam_setShip (*list, i++, MELEE_URQUAN); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "The Gregorizers 200"); MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH); MeleeTeam_setShip (*list, i++, MELEE_CHMMR); MeleeTeam_setShip (*list, i++, MELEE_DRUUGE); MeleeTeam_setShip (*list, i++, MELEE_MELNORME); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH); MeleeTeam_setShip (*list, i++, MELEE_SUPOX); MeleeTeam_setShip (*list, i++, MELEE_ORZ); MeleeTeam_setShip (*list, i++, MELEE_PKUNK); MeleeTeam_setShip (*list, i++, MELEE_SPATHI); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "300 point Armada!"); MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH); MeleeTeam_setShip (*list, i++, MELEE_CHMMR); MeleeTeam_setShip (*list, i++, MELEE_CHENJESU); MeleeTeam_setShip (*list, i++, MELEE_DRUUGE); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH); MeleeTeam_setShip (*list, i++, MELEE_MELNORME); MeleeTeam_setShip (*list, i++, MELEE_MYCON); MeleeTeam_setShip (*list, i++, MELEE_ORZ); MeleeTeam_setShip (*list, i++, MELEE_PKUNK); MeleeTeam_setShip (*list, i++, MELEE_SPATHI); MeleeTeam_setShip (*list, i++, MELEE_SUPOX); MeleeTeam_setShip (*list, i++, MELEE_URQUAN); MeleeTeam_setShip (*list, i++, MELEE_YEHAT); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "Little Dudes with Attitudes"); MeleeTeam_setShip (*list, i++, MELEE_UMGAH); MeleeTeam_setShip (*list, i++, MELEE_THRADDASH); MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_VUX); MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "New Alliance Ships"); MeleeTeam_setShip (*list, i++, MELEE_ARILOU); MeleeTeam_setShip (*list, i++, MELEE_CHMMR); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_ORZ); MeleeTeam_setShip (*list, i++, MELEE_PKUNK); MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI); MeleeTeam_setShip (*list, i++, MELEE_SUPOX); MeleeTeam_setShip (*list, i++, MELEE_SYREEN); MeleeTeam_setShip (*list, i++, MELEE_UTWIG); MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK); MeleeTeam_setShip (*list, i++, MELEE_YEHAT); MeleeTeam_setShip (*list, i++, MELEE_DRUUGE); MeleeTeam_setShip (*list, i++, MELEE_THRADDASH); MeleeTeam_setShip (*list, i++, MELEE_SPATHI); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "Old Alliance Ships"); MeleeTeam_setShip (*list, i++, MELEE_ARILOU); MeleeTeam_setShip (*list, i++, MELEE_CHENJESU); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_MMRNMHRM); MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI); MeleeTeam_setShip (*list, i++, MELEE_SYREEN); MeleeTeam_setShip (*list, i++, MELEE_YEHAT); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "Old Hierarchy Ships"); MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH); MeleeTeam_setShip (*list, i++, MELEE_ILWRATH); MeleeTeam_setShip (*list, i++, MELEE_MYCON); MeleeTeam_setShip (*list, i++, MELEE_SPATHI); MeleeTeam_setShip (*list, i++, MELEE_UMGAH); MeleeTeam_setShip (*list, i++, MELEE_URQUAN); MeleeTeam_setShip (*list, i++, MELEE_VUX); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "Star Control 1"); MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH); MeleeTeam_setShip (*list, i++, MELEE_ARILOU); MeleeTeam_setShip (*list, i++, MELEE_CHENJESU); MeleeTeam_setShip (*list, i++, MELEE_EARTHLING); MeleeTeam_setShip (*list, i++, MELEE_ILWRATH); MeleeTeam_setShip (*list, i++, MELEE_MMRNMHRM); MeleeTeam_setShip (*list, i++, MELEE_MYCON); MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI); MeleeTeam_setShip (*list, i++, MELEE_SPATHI); MeleeTeam_setShip (*list, i++, MELEE_SYREEN); MeleeTeam_setShip (*list, i++, MELEE_UMGAH); MeleeTeam_setShip (*list, i++, MELEE_URQUAN); MeleeTeam_setShip (*list, i++, MELEE_VUX); MeleeTeam_setShip (*list, i++, MELEE_YEHAT); list++; } { FleetShipIndex i = 0; MeleeTeam_setName (*list, "Star Control 2"); MeleeTeam_setShip (*list, i++, MELEE_CHMMR); MeleeTeam_setShip (*list, i++, MELEE_DRUUGE); MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH); MeleeTeam_setShip (*list, i++, MELEE_MELNORME); MeleeTeam_setShip (*list, i++, MELEE_ORZ); MeleeTeam_setShip (*list, i++, MELEE_PKUNK); MeleeTeam_setShip (*list, i++, MELEE_SLYLANDRO); MeleeTeam_setShip (*list, i++, MELEE_SUPOX); MeleeTeam_setShip (*list, i++, MELEE_THRADDASH); MeleeTeam_setShip (*list, i++, MELEE_UTWIG); MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK); MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK); MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK); MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK); list++; } assert (list == pMS->load.preBuiltList + pMS->load.preBuiltCount); }
static void FeedbackSetting (BYTE which_setting) { UNICODE buf[128]; const char *tmpstr; buf[0] = '\0'; // pre-terminate buffer in case snprintf() overflows buf[sizeof (buf) - 1] = '\0'; switch (which_setting) { case SOUND_ON_SETTING: case SOUND_OFF_SETTING: snprintf (buf, sizeof (buf) - 1, "%s %s", GAME_STRING (OPTION_STRING_BASE + 0), GLOBAL (glob_flags) & SOUND_DISABLED ? GAME_STRING (OPTION_STRING_BASE + 4) : GAME_STRING (OPTION_STRING_BASE + 5)); break; case MUSIC_ON_SETTING: case MUSIC_OFF_SETTING: snprintf (buf, sizeof (buf) - 1, "%s %s", GAME_STRING (OPTION_STRING_BASE + 1), GLOBAL (glob_flags) & MUSIC_DISABLED ? GAME_STRING (OPTION_STRING_BASE + 4) : GAME_STRING (OPTION_STRING_BASE + 5)); break; case VOICE_ON_SETTING: case VOICE_OFF_SETTING: snprintf (buf, sizeof (buf) - 1, "%s %s", GAME_STRING (OPTION_STRING_BASE + 2), GLOBAL (glob_flags) & VOICE_DISABLED ? GAME_STRING (OPTION_STRING_BASE + 4) : GAME_STRING (OPTION_STRING_BASE + 5)); break; case CYBORG_OFF_SETTING: case CYBORG_NORMAL_SETTING: case CYBORG_DOUBLE_SETTING: case CYBORG_SUPER_SETTING: if (optWhichMenu == OPT_PC && which_setting > CYBORG_NORMAL_SETTING) { if (which_setting == CYBORG_DOUBLE_SETTING) tmpstr = "+"; else tmpstr = "++"; } else tmpstr = ""; snprintf (buf, sizeof (buf) - 1, "%s %s%s", GAME_STRING (OPTION_STRING_BASE + 3), !(GLOBAL (glob_flags) & CYBORG_ENABLED) ? GAME_STRING (OPTION_STRING_BASE + 4) : GAME_STRING (OPTION_STRING_BASE + 5), tmpstr); break; case CHANGE_CAPTAIN_SETTING: case CHANGE_SHIP_SETTING: utf8StringCopy (buf, sizeof (buf), GAME_STRING (NAMING_STRING_BASE + 0)); break; } LockMutex (GraphicsLock); DrawStatusMessage (buf); UnlockMutex (GraphicsLock); }
static BOOLEAN DoRestart (MENU_STATE *pMS) { static DWORD InTime; static DWORD InactTimeOut; /* Cancel any presses of the Pause key. */ GamePaused = FALSE; if (!pMS->Initialized) { if (pMS->hMusic) { StopMusic (); DestroyMusic (pMS->hMusic); pMS->hMusic = 0; } pMS->hMusic = LoadMusic (MAINMENU_MUSIC); InactTimeOut = (pMS->hMusic ? 120 : 20) * ONE_SECOND; PlayMusic (pMS->hMusic, TRUE, 1); DrawRestartMenu ((BYTE)~0, pMS->CurState, pMS->CurFrame); pMS->Initialized = TRUE; { BYTE clut_buf[] = {FadeAllToColor}; DWORD TimeOut = XFormColorMap ( (COLORMAPPTR)clut_buf, ONE_SECOND / 2); while ((GetTimeCounter () <= TimeOut) && !(GLOBAL (CurrentActivity) & CHECK_ABORT)) { UpdateInputState (); TaskSwitch (); } } } else if (GLOBAL (CurrentActivity) & CHECK_ABORT) { return (FALSE); } else if (!(PulsedInputState.menu[KEY_MENU_UP] || PulsedInputState.menu[KEY_MENU_DOWN] || PulsedInputState.menu[KEY_MENU_LEFT] || PulsedInputState.menu[KEY_MENU_RIGHT] || PulsedInputState.menu[KEY_MENU_SELECT] || MouseButtonDown)) { if (GetTimeCounter () - InTime < InactTimeOut) return (TRUE); SleepThreadUntil (FadeMusic (0, ONE_SECOND)); StopMusic (); FadeMusic (NORMAL_VOLUME, 0); GLOBAL (CurrentActivity) = (ACTIVITY)~0; return (FALSE); } else if (PulsedInputState.menu[KEY_MENU_SELECT]) { BYTE fade_buf[1]; switch (pMS->CurState) { case LOAD_SAVED_GAME: LastActivity = CHECK_LOAD; GLOBAL (CurrentActivity) = IN_INTERPLANETARY; break; case START_NEW_GAME: LastActivity = CHECK_LOAD | CHECK_RESTART; GLOBAL (CurrentActivity) = IN_INTERPLANETARY; break; case PLAY_SUPER_MELEE: GLOBAL (CurrentActivity) = SUPER_MELEE; break; case SETUP_GAME: LockMutex (GraphicsLock); SetFlashRect (NULL, (FRAME)0); UnlockMutex (GraphicsLock); SetupMenu (); SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); InTime = GetTimeCounter (); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu ((BYTE)~0, pMS->CurState, pMS->CurFrame); ScreenTransition (3, NULL); UnbatchGraphics (); return TRUE; case QUIT_GAME: fade_buf[0] = FadeAllToBlack; SleepThreadUntil (XFormColorMap ( (COLORMAPPTR)fade_buf, ONE_SECOND / 2)); GLOBAL (CurrentActivity) = CHECK_ABORT; break; } LockMutex (GraphicsLock); SetFlashRect (NULL, (FRAME)0); UnlockMutex (GraphicsLock); return (FALSE); } else { BYTE NewState; NewState = pMS->CurState; if (PulsedInputState.menu[KEY_MENU_UP]) { if (NewState-- == START_NEW_GAME) NewState = QUIT_GAME; } else if (PulsedInputState.menu[KEY_MENU_DOWN]) { if (NewState++ == QUIT_GAME) NewState = START_NEW_GAME; } if (NewState != pMS->CurState) { BatchGraphics (); DrawRestartMenu (pMS->CurState, NewState, pMS->CurFrame); UnbatchGraphics (); pMS->CurState = NewState; } } if (MouseButtonDown) { LockMutex (GraphicsLock); SetFlashRect (NULL, (FRAME)0); UnlockMutex (GraphicsLock); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 56)); // Mouse not supported message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu ((BYTE)~0, pMS->CurState, pMS->CurFrame); ScreenTransition (3, NULL); UnbatchGraphics (); } InTime = GetTimeCounter (); return (TRUE); }
static BOOLEAN DoRestart (MENU_STATE *pMS) { static TimeCount LastInputTime; static TimeCount InactTimeOut; TimeCount TimeIn = GetTimeCounter (); /* Cancel any presses of the Pause key. */ GamePaused = FALSE; if (pMS->Initialized) Flash_process(pMS->flashContext); if (!pMS->Initialized) { if (pMS->hMusic) { StopMusic (); DestroyMusic (pMS->hMusic); pMS->hMusic = 0; } pMS->hMusic = LoadMusic (MAINMENU_MUSIC); InactTimeOut = (pMS->hMusic ? 120 : 20) * ONE_SECOND; pMS->flashContext = Flash_createOverlay (ScreenContext, NULL, NULL); Flash_setMergeFactors (pMS->flashContext, -3, 3, 16); Flash_setSpeed (pMS->flashContext, (6 * ONE_SECOND) / 16, 0, (6 * ONE_SECOND) / 16, 0); Flash_setFrameTime (pMS->flashContext, ONE_SECOND / 16); Flash_setState(pMS->flashContext, FlashState_fadeIn, (3 * ONE_SECOND) / 16); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame); Flash_start (pMS->flashContext); PlayMusic (pMS->hMusic, TRUE, 1); LastInputTime = GetTimeCounter (); pMS->Initialized = TRUE; SleepThreadUntil (FadeScreen (FadeAllToColor, ONE_SECOND / 2)); } else if (GLOBAL (CurrentActivity) & CHECK_ABORT) { return FALSE; } else if (PulsedInputState.menu[KEY_MENU_SELECT]) { switch (pMS->CurState) { case LOAD_SAVED_GAME: LastActivity = CHECK_LOAD; GLOBAL (CurrentActivity) = IN_INTERPLANETARY; break; case START_NEW_GAME: LastActivity = CHECK_LOAD | CHECK_RESTART; GLOBAL (CurrentActivity) = IN_INTERPLANETARY; break; case PLAY_SUPER_MELEE: GLOBAL (CurrentActivity) = SUPER_MELEE; break; case SETUP_GAME: Flash_pause(pMS->flashContext); Flash_setState(pMS->flashContext, FlashState_fadeIn, (3 * ONE_SECOND) / 16); SetupMenu (); SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); LastInputTime = GetTimeCounter (); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); ScreenTransition (3, NULL); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame); Flash_continue(pMS->flashContext); UnbatchGraphics (); return TRUE; case QUIT_GAME: SleepThreadUntil (FadeScreen (FadeAllToBlack, ONE_SECOND / 2)); GLOBAL (CurrentActivity) = CHECK_ABORT; break; } Flash_pause(pMS->flashContext); return FALSE; } else if (PulsedInputState.menu[KEY_MENU_UP] || PulsedInputState.menu[KEY_MENU_DOWN]) { BYTE NewState; NewState = pMS->CurState; if (PulsedInputState.menu[KEY_MENU_UP]) { if (NewState == START_NEW_GAME) NewState = QUIT_GAME; else --NewState; } else if (PulsedInputState.menu[KEY_MENU_DOWN]) { if (NewState == QUIT_GAME) NewState = START_NEW_GAME; else ++NewState; } if (NewState != pMS->CurState) { BatchGraphics (); DrawRestartMenu (pMS, NewState, pMS->CurFrame); UnbatchGraphics (); pMS->CurState = NewState; } LastInputTime = GetTimeCounter (); } else if (PulsedInputState.menu[KEY_MENU_LEFT] || PulsedInputState.menu[KEY_MENU_RIGHT]) { // Does nothing, but counts as input for timeout purposes LastInputTime = GetTimeCounter (); } else if (MouseButtonDown) { Flash_pause(pMS->flashContext); DoPopupWindow (GAME_STRING (MAINMENU_STRING_BASE + 54)); // Mouse not supported message SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetTransitionSource (NULL); BatchGraphics (); DrawRestartMenuGraphic (pMS); DrawRestartMenu (pMS, pMS->CurState, pMS->CurFrame); ScreenTransition (3, NULL); UnbatchGraphics (); Flash_continue(pMS->flashContext); LastInputTime = GetTimeCounter (); } else { // No input received, check if timed out if (GetTimeCounter () - LastInputTime > InactTimeOut) { SleepThreadUntil (FadeMusic (0, ONE_SECOND)); StopMusic (); FadeMusic (NORMAL_VOLUME, 0); GLOBAL (CurrentActivity) = (ACTIVITY)~0; return FALSE; } } SleepThreadUntil (TimeIn + ONE_SECOND / 30); return TRUE; }
void GenerateSOL (BYTE control) { COUNT i; DWORD rand_val; PPLANET_DESC pCurDesc; switch (control) { case INIT_NPCS: init_probe (); break; case REINIT_NPCS: if (GET_GAME_STATE (CHMMR_BOMB_STATE) != 3) GenerateRandomIP (REINIT_NPCS); else { GLOBAL (BattleGroupRef) = 0; ReinitQueue (&GLOBAL (npc_built_ship_q)); } break; case GENERATE_ENERGY: generate_energy_nodes (); break; case GENERATE_LIFE: generate_tractors (); break; case GENERATE_ORBITAL: generate_orbital (); break; case GENERATE_NAME: i = pSolarSysState->pBaseDesc - pSolarSysState->PlanetDesc; wstrcpy (GLOBAL_SIS (PlanetName), GAME_STRING (PLANET_NUMBER_BASE + i)); SET_GAME_STATE (BATTLE_PLANET, pSolarSysState->PlanetDesc[i].data_index); break; case GENERATE_MOONS: { GenerateRandomIP (GENERATE_MOONS); i = pSolarSysState->pBaseDesc - pSolarSysState->PlanetDesc; switch (i) { case 2: /* moons of EARTH */ { COUNT angle; pSolarSysState->MoonDesc[0].data_index = (BYTE)~0; pSolarSysState->MoonDesc[0].radius = MIN_MOON_RADIUS; angle = HALF_CIRCLE + QUADRANT; pSolarSysState->MoonDesc[0].location.x = COSINE (angle, pSolarSysState->MoonDesc[0].radius); pSolarSysState->MoonDesc[0].location.y = SINE (angle, pSolarSysState->MoonDesc[0].radius); pSolarSysState->MoonDesc[1].data_index = SELENIC_WORLD; pSolarSysState->MoonDesc[1].radius = MIN_MOON_RADIUS + (MAX_MOONS - 1) * MOON_DELTA; rand_val = Random (); angle = NORMALIZE_ANGLE (LOWORD (rand_val)); pSolarSysState->MoonDesc[1].location.x = COSINE (angle, pSolarSysState->MoonDesc[1].radius); pSolarSysState->MoonDesc[1].location.y = SINE (angle, pSolarSysState->MoonDesc[1].radius); break; } case 4: /* moons of JUPITER */ pSolarSysState->MoonDesc[0].data_index = RADIOACTIVE_WORLD; pSolarSysState->MoonDesc[1].data_index = HALIDE_WORLD; pSolarSysState->MoonDesc[2].data_index = CYANIC_WORLD; pSolarSysState->MoonDesc[3].data_index = PELLUCID_WORLD; break; case 5: /* moons of SATURN */ pSolarSysState->MoonDesc[0].data_index = ALKALI_WORLD; break; case 7: /* moons of NEPTUNE */ pSolarSysState->MoonDesc[0].data_index = VINYLOGOUS_WORLD; break; } break; } case GENERATE_PLANETS: { #define SOL_SEED 334241042L SeedRandom (SOL_SEED); pSolarSysState->SunDesc[0].NumPlanets = 9; for (i = 0, pCurDesc = pSolarSysState->PlanetDesc; i < 9; ++i, ++pCurDesc) { COUNT angle; UWORD word_val; pCurDesc->rand_seed = rand_val = Random (); word_val = LOWORD (rand_val); angle = NORMALIZE_ANGLE ((COUNT)HIBYTE (word_val)); switch (i) { case 0: /* MERCURY */ pCurDesc->data_index = METAL_WORLD; pCurDesc->radius = EARTH_RADIUS * 39L / 100; pCurDesc->NumPlanets = 0; break; case 1: /* VENUS */ pCurDesc->data_index = PRIMORDIAL_WORLD; pCurDesc->radius = EARTH_RADIUS * 72L / 100; pCurDesc->NumPlanets = 0; angle = NORMALIZE_ANGLE (FULL_CIRCLE - angle); break; case 2: /* EARTH */ pCurDesc->data_index = WATER_WORLD | PLANET_SHIELDED; pCurDesc->radius = EARTH_RADIUS; pCurDesc->NumPlanets = 2; break; case 3: /* MARS */ pCurDesc->data_index = DUST_WORLD; pCurDesc->radius = EARTH_RADIUS * 152L / 100; pCurDesc->NumPlanets = 0; break; case 4: /* JUPITER */ pCurDesc->data_index = RED_GAS_GIANT; pCurDesc->radius = EARTH_RADIUS * 500L /* 520L */ / 100; pCurDesc->NumPlanets = 4; break; case 5: /* SATURN */ pCurDesc->data_index = ORA_GAS_GIANT; pCurDesc->radius = EARTH_RADIUS * 750L /* 952L */ / 100; pCurDesc->NumPlanets = 1; break; case 6: /* URANUS */ pCurDesc->data_index = GRN_GAS_GIANT; pCurDesc->radius = EARTH_RADIUS * 1000L /* 1916L */ / 100; pCurDesc->NumPlanets = 0; break; case 7: /* NEPTUNE */ pCurDesc->data_index = BLU_GAS_GIANT; pCurDesc->radius = EARTH_RADIUS * 1250L /* 2999L */ / 100; pCurDesc->NumPlanets = 1; break; case 8: /* PLUTO */ pCurDesc->data_index = PELLUCID_WORLD; pCurDesc->radius = EARTH_RADIUS * 1550L /* 3937L */ / 100; pCurDesc->NumPlanets = 0; angle = FULL_CIRCLE - OCTANT; break; } pCurDesc->location.x = COSINE (angle, pCurDesc->radius); pCurDesc->location.y = SINE (angle, pCurDesc->radius); } break; } default: GenerateRandomIP (control); break; } }