/** * The Intro. */ void GameLoop_GameIntroAnimation(void) { GUI_ChangeSelectionType(SELECTIONTYPE_INTRO); Gameloop_Logos(); if (Input_Keyboard_NextKey() == 0 || !g_canSkipIntro) { const HouseAnimation_Animation *animation = g_table_houseAnimation_animation[HOUSEANIMATION_INTRO]; const HouseAnimation_Subtitle *subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_INTRO]; const HouseAnimation_SoundEffect *soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_INTRO]; Music_Play(0x1B); /* 0x4A = 74 = Intro feedback base index */ GameLoop_PrepareAnimation(subtitle, 0x4A, soundEffect); GameLoop_PlayAnimation(animation); Driver_Music_FadeOut(); GameLoop_FinishAnimation(); } GUI_ChangeSelectionType(SELECTIONTYPE_MENTAT); }
/** * Show the Mentat screen with a dialog (Proceed / Repeat). * @param houseID The house to show the mentat of. * @param stringID The string to show. * @param wsaFilename The WSA to show. * @param musicID The Music to play. */ static void GUI_Mentat_ShowDialog(uint8 houseID, uint16 stringID, const char *wsaFilename, uint16 musicID) { Widget *w1, *w2; if (g_debugSkipDialogs) return; w1 = GUI_Widget_Allocate(1, GUI_Widget_GetShortcut(String_Get_ByIndex(STR_PROCEED)[0]), 168, 168, 379, 0); w2 = GUI_Widget_Allocate(2, GUI_Widget_GetShortcut(String_Get_ByIndex(STR_REPEAT)[0]), 240, 168, 381, 0); w1 = GUI_Widget_Link(w1, w2); Sound_Output_Feedback(0xFFFE); Driver_Voice_Play(NULL, 0xFF); Music_Play(musicID); stringID += STR_HOUSE_HARKONNENFROM_THE_DARK_WORLD_OF_GIEDI_PRIME_THE_SAVAGE_HOUSE_HARKONNEN_HAS_SPREAD_ACROSS_THE_UNIVERSE_A_CRUEL_PEOPLE_THE_HARKONNEN_ARE_RUTHLESS_TOWARDS_BOTH_FRIEND_AND_FOE_IN_THEIR_FANATICAL_PURSUIT_OF_POWER + houseID * 40; do { strncpy(g_readBuffer, String_Get_ByIndex(stringID), g_readBufferSize); sleepIdle(); } while (GUI_Mentat_Show(g_readBuffer, wsaFilename, w1, true) == 0x8002); free(w2); free(w1); if (musicID != 0xFFFF) Driver_Music_FadeOut(); }
/** * Shows the end game "movie" */ void GameLoop_GameEndAnimation(void) { const HouseAnimation_Animation *animation; const HouseAnimation_Subtitle *subtitle; const HouseAnimation_SoundEffect *soundEffect; uint16 sound; Voice_LoadVoices(0xFFFE); switch (g_playerHouseID) { case HOUSE_HARKONNEN: animation = g_table_houseAnimation_animation[HOUSEANIMATION_LEVEL9_HARKONNEN]; subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_LEVEL9_HARKONNEN]; soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_LEVEL9_HARKONNEN]; sound = 0x1E; break; default: case HOUSE_ATREIDES: animation = g_table_houseAnimation_animation[HOUSEANIMATION_LEVEL9_ARTREIDES]; subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_LEVEL9_ARTREIDES]; soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_LEVEL9_ARTREIDES]; sound = 0x1F; break; case HOUSE_ORDOS: animation = g_table_houseAnimation_animation[HOUSEANIMATION_LEVEL9_ORDOS]; subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_LEVEL9_ORDOS]; soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_LEVEL9_ORDOS]; sound = 0x20; break; } GameLoop_PrepareAnimation(subtitle, 0xFFFF, soundEffect); Music_Play(sound); GameLoop_PlayAnimation(animation); Driver_Music_FadeOut(); GameLoop_FinishAnimation(); GameLoop_GameCredits(); }
/** * Intro menu. */ static void GameLoop_GameIntroAnimationMenu(void) { static const uint16 mainMenuStrings[][6] = { {STR_PLAY_A_GAME, STR_REPLAY_INTRODUCTION, STR_EXIT_GAME, STR_NULL, STR_NULL, STR_NULL}, /* Neither HOF nor save. */ {STR_PLAY_A_GAME, STR_REPLAY_INTRODUCTION, STR_LOAD_GAME, STR_EXIT_GAME, STR_NULL, STR_NULL}, /* Has a save game. */ {STR_PLAY_A_GAME, STR_REPLAY_INTRODUCTION, STR_EXIT_GAME, STR_HALL_OF_FAME, STR_NULL, STR_NULL}, /* Has a HOF. */ {STR_PLAY_A_GAME, STR_REPLAY_INTRODUCTION, STR_LOAD_GAME, STR_EXIT_GAME, STR_HALL_OF_FAME, STR_NULL} /* Has a HOF and a save game. */ }; bool loadGame = false; static bool drawMenu = true; static uint16 stringID = STR_REPLAY_INTRODUCTION; uint16 maxWidth; static bool hasSave = false; static bool hasFame = false; static const char *strings[6]; static uint16 index = 0xFFFF; if (index == 0xFFFF) { hasSave = File_Exists("_save000.dat"); hasFame = File_Exists("SAVEFAME.DAT"); index = (hasFame ? 2 : 0) + (hasSave ? 1 : 0); } if (hasSave || File_Exists("ONETIME.DAT")) g_canSkipIntro = true; switch (stringID) { case STR_REPLAY_INTRODUCTION: Music_Play(0); free(g_readBuffer); g_readBufferSize = (g_enableVoices == 0) ? 12000 : 28000; g_readBuffer = calloc(1, g_readBufferSize); GUI_Mouse_Hide_Safe(); Driver_Music_FadeOut(); GameLoop_GameIntroAnimation(); Sound_Output_Feedback(0xFFFE); File_ReadBlockFile("IBM.PAL", g_palette_998A, 256 * 3); memmove(g_palette1, g_palette_998A, 256 * 3); if (!g_canSkipIntro) { File_Create("ONETIME.DAT"); g_canSkipIntro = true; } Music_Play(0); free(g_readBuffer); g_readBufferSize = (g_enableVoices == 0) ? 12000 : 20000; g_readBuffer = calloc(1, g_readBufferSize); GUI_Mouse_Show_Safe(); Music_Play(28); drawMenu = true; break; case STR_EXIT_GAME: g_running = false; return; case STR_HALL_OF_FAME: GUI_HallOfFame_Show(0xFFFF); GFX_SetPalette(g_palette2); hasFame = File_Exists("SAVEFAME.DAT"); drawMenu = true; break; case STR_LOAD_GAME: GUI_Mouse_Hide_Safe(); GUI_SetPaletteAnimated(g_palette2, 30); GUI_ClearScreen(SCREEN_0); GUI_Mouse_Show_Safe(); GFX_SetPalette(g_palette1); if (GUI_Widget_SaveLoad_Click(false)) { loadGame = true; if (g_gameMode == GM_RESTART) break; g_gameMode = GM_NORMAL; } else { GFX_SetPalette(g_palette2); drawMenu = true; } break; default: break; } if (drawMenu) { uint16 i; g_widgetProperties[21].height = 0; for (i = 0; i < 6; i++) { strings[i] = NULL; if (mainMenuStrings[index][i] == 0) { if (g_widgetProperties[21].height == 0) g_widgetProperties[21].height = i; continue; } strings[i] = String_Get_ByIndex(mainMenuStrings[index][i]); } GUI_DrawText_Wrapper(NULL, 0, 0, 0, 0, 0x22); maxWidth = 0; for (i = 0; i < g_widgetProperties[21].height; i++) { if (Font_GetStringWidth(strings[i]) <= maxWidth) continue; maxWidth = Font_GetStringWidth(strings[i]); } maxWidth += 7; g_widgetProperties[21].width = maxWidth >> 3; g_widgetProperties[13].width = g_widgetProperties[21].width + 2; g_widgetProperties[13].xBase = 19 - (maxWidth >> 4); g_widgetProperties[13].yBase = 160 - ((g_widgetProperties[21].height * g_fontCurrent->height) >> 1); g_widgetProperties[13].height = (g_widgetProperties[21].height * g_fontCurrent->height) + 11; Sprites_LoadImage(String_GenerateFilename("TITLE"), SCREEN_1, NULL); GUI_Mouse_Hide_Safe(); GUI_ClearScreen(SCREEN_0); GUI_Screen_Copy(0, 0, 0, 0, SCREEN_WIDTH / 8, SCREEN_HEIGHT, SCREEN_1, SCREEN_0); GUI_SetPaletteAnimated(g_palette1, 30); GUI_DrawText_Wrapper("V1.07", 319, 192, 133, 0, 0x231, 0x39); GUI_DrawText_Wrapper(NULL, 0, 0, 0, 0, 0x22); Widget_SetCurrentWidget(13); GUI_Widget_DrawBorder(13, 2, 1); GameLoop_DrawMenu(strings); GUI_Mouse_Show_Safe(); drawMenu = false; } if (loadGame) return; stringID = GameLoop_HandleEvents(strings); if (stringID != 0xFFFF) stringID = mainMenuStrings[index][stringID]; GUI_PaletteAnimate(); if (stringID == STR_PLAY_A_GAME) g_gameMode = GM_PICKHOUSE; }
/** * Handles Click event for "Options" button. * * @param w The widget. * @return False, always. */ bool GUI_Widget_Options_Click(Widget *w) { WindowDesc *desc = &g_optionsWindowDesc; uint16 cursor = g_cursorSpriteID; bool loop; g_cursorSpriteID = 0; Sprites_SetMouseSprite(0, 0, g_sprites[0]); Sprites_UnloadTiles(); memmove(g_palette_998A, g_paletteActive, 256 * 3); Driver_Voice_Play(NULL, 0xFF); Timer_SetTimer(TIMER_GAME, false); GUI_DrawText_Wrapper(NULL, 0, 0, 0, 0, 0x22); ShadeScreen(); GUI_Window_BackupScreen(desc); GUI_Window_Create(desc); for (loop = true; loop; sleepIdle()) { Widget *w2 = g_widgetLinkedListTail; uint16 key = GUI_Widget_HandleEvents(w2); if ((key & 0x8000) != 0) { w = GUI_Widget_Get_ByIndex(w2, key); GUI_Window_RestoreScreen(desc); switch ((key & 0x7FFF) - 0x1E) { case 0: if (GUI_Widget_SaveLoad_Click(false)) loop = false; break; case 1: if (GUI_Widget_SaveLoad_Click(true)) loop = false; break; case 2: GUI_Widget_GameControls_Click(w); break; case 3: /* "Are you sure you wish to restart?" */ if (!GUI_YesNo(0x76)) break; loop = false; g_gameMode = GM_RESTART; break; case 4: /* "Are you sure you wish to pick a new house?" */ if (!GUI_YesNo(0x77)) break; loop = false; Driver_Music_FadeOut(); g_gameMode = GM_PICKHOUSE; break; case 5: loop = false; break; case 6: /* "Are you sure you want to quit playing?" */ loop = !GUI_YesNo(0x65); g_running = loop; Sound_Output_Feedback(0xFFFE); while (Driver_Voice_IsPlaying()) sleepIdle(); break; default: break; } if (g_running && loop) { GUI_Window_BackupScreen(desc); GUI_Window_Create(desc); } } GUI_PaletteAnimate(); } g_textDisplayNeedsUpdate = true; Sprites_LoadTiles(); GUI_DrawInterfaceAndRadar(SCREEN_0); UnshadeScreen(); GUI_Widget_MakeSelected(w, false); Timer_SetTimer(TIMER_GAME, true); GameOptions_Save(); Structure_Recount(); Unit_Recount(); g_cursorSpriteID = cursor; Sprites_SetMouseSprite(0, 0, g_sprites[cursor]); return false; }
void async_GUI_Mentat_ShowDialogClose() { free(asyncMentatShowDialog.w2); free(asyncMentatShowDialog.w1); if (asyncMentatShowDialog.musicID != 0xFFFF) Driver_Music_FadeOut(); }
/** * Shows the game credits. */ static void GameLoop_GameCredits(void) { static const uint8 colours[] = {0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint16 i; uint8 *memory; GUI_Mouse_Hide_Safe(); Widget_SetCurrentWidget(20); Sprites_LoadImage("BIGPLAN.CPS", SCREEN_1, g_palette_998A); GUI_ClearScreen(SCREEN_0); GUI_Screen_Copy(g_curWidgetXBase, g_curWidgetYBase, g_curWidgetXBase, g_curWidgetYBase, g_curWidgetWidth, g_curWidgetHeight, SCREEN_1, SCREEN_0); GUI_SetPaletteAnimated(g_palette_998A, 60); Music_Play(0); GameLoop_Uninit(); Music_Play(33); memory = GFX_Screen_Get_ByIndex(SCREEN_2); for (i = 0; i < 256; i++) { uint8 loc06; uint8 loc04; memory[i] = i & 0xFF; loc06 = i / 16; loc04 = i % 16; if (loc06 == 9 && loc04 <= 6) { memory[i] = (g_playerHouseID * 16) + loc04 + 144; } } Sprites_LoadImage("MAPPLAN.CPS", SCREEN_1, g_palette_998A); GUI_Palette_RemapScreen(g_curWidgetXBase << 3, g_curWidgetYBase, g_curWidgetWidth << 3, g_curWidgetHeight, SCREEN_1, memory); GUI_Screen_FadeIn2(g_curWidgetXBase << 3, g_curWidgetYBase, g_curWidgetWidth << 3, g_curWidgetHeight, SCREEN_1, SCREEN_0, 1, false); GameCredits_LoadPalette(); GUI_Mouse_Hide_Safe(); GUI_InitColors(colours, 0, lengthof(colours) - 1); g_fontCharOffset = -1; GFX_SetPalette(g_palette1); for (;; sleepIdle()) { File_ReadBlockFile(String_GenerateFilename("CREDITS"), s_buffer_1832, GFX_Screen_GetSize_ByIndex(SCREEN_3)); GameCredits_Play(s_buffer_1832, 20, SCREEN_1, SCREEN_2, 6); if (Input_Keyboard_NextKey() != 0) break; Music_Play(33); } GUI_SetPaletteAnimated(g_palette2, 60); Driver_Music_FadeOut(); GFX_ClearScreen(); }
void GameLoop_LevelEndAnimation(void) { const HouseAnimation_Animation *animation; const HouseAnimation_Subtitle *subtitle; const HouseAnimation_SoundEffect *soundEffect; Input_History_Clear(); switch (g_campaignID) { case 4: switch (g_playerHouseID) { case HOUSE_HARKONNEN: animation = g_table_houseAnimation_animation[HOUSEANIMATION_LEVEL4_HARKONNEN]; subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_LEVEL4_HARKONNEN]; soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_LEVEL4_HARKONNEN]; break; case HOUSE_ATREIDES: animation = g_table_houseAnimation_animation[HOUSEANIMATION_LEVEL4_ARTREIDES]; subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_LEVEL4_ARTREIDES]; soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_LEVEL4_ARTREIDES]; break; case HOUSE_ORDOS: animation = g_table_houseAnimation_animation[HOUSEANIMATION_LEVEL4_ORDOS]; subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_LEVEL4_ORDOS]; soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_LEVEL4_ORDOS]; break; default: return; } break; case 8: switch (g_playerHouseID) { case HOUSE_HARKONNEN: animation = g_table_houseAnimation_animation[HOUSEANIMATION_LEVEL8_HARKONNEN]; subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_LEVEL8_HARKONNEN]; soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_LEVEL8_HARKONNEN]; break; case HOUSE_ATREIDES: animation = g_table_houseAnimation_animation[HOUSEANIMATION_LEVEL8_ARTREIDES]; subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_LEVEL8_ARTREIDES]; soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_LEVEL8_ARTREIDES]; break; case HOUSE_ORDOS: animation = g_table_houseAnimation_animation[HOUSEANIMATION_LEVEL8_ORDOS]; subtitle = g_table_houseAnimation_subtitle[HOUSEANIMATION_LEVEL8_ORDOS]; soundEffect = g_table_houseAnimation_soundEffect[HOUSEANIMATION_LEVEL8_ORDOS]; break; default: return; } break; default: return; } GameLoop_PrepareAnimation(subtitle, 0xFFFF, soundEffect); Music_Play(0x22); GameLoop_PlayAnimation(animation); Driver_Music_FadeOut(); GameLoop_FinishAnimation(); }