/** * 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(); }
/** * Play a voice. Volume is based on distance to position. * @param voiceID Which voice to play. * @param position Which position to play it on. */ void Voice_PlayAtTile(int16 voiceID, tile32 position) { uint16 index; uint16 volume; if (voiceID < 0 || voiceID >= 120) return; if (!g_gameConfig.sounds) return; volume = 255; if (position.tile != 0) { volume = Tile_GetDistancePacked(g_minimapPosition, Tile_PackTile(position)); if (volume > 64) volume = 64; volume = 255 - (volume * 255 / 80); } index = g_table_voiceMapping[voiceID]; if (g_enableVoices != 0 && index != 0xFFFF && g_variable_3E54[index] != NULL && g_table_voices[index].variable_04 >= s_variable_4060) { s_variable_4060 = g_table_voices[index].variable_04; memmove(g_readBuffer, g_variable_3E54[index], g_variable_3E54_size[index]); Driver_Voice_Play(g_readBuffer, s_variable_4060); } else { Driver_Sound_Play(voiceID, volume); } }
/** * Play a voice. Volume is based on distance to position. * @param voiceID Which voice to play. * @param position Which position to play it on. */ void Voice_PlayAtTile(int16 voiceID, tile32 position) { uint16 index; uint16 volume; if (voiceID < 0 || voiceID >= 120) return; if (!g_gameConfig.sounds) return; volume = 255; if (position.x != 0 || position.y != 0) { volume = Tile_GetDistancePacked(g_minimapPosition, Tile_PackTile(position)); if (volume > 64) volume = 64; volume = 255 - (volume * 255 / 80); } index = g_table_voiceMapping[voiceID]; if (g_enableVoices != 0 && index != 0xFFFF && g_voiceData[index] != NULL && g_table_voices[index].priority >= s_currentVoicePriority) { s_currentVoicePriority = g_table_voices[index].priority; memmove(g_readBuffer, g_voiceData[index], g_voiceDataSize[index]); Driver_Voice_Play(g_readBuffer, s_currentVoicePriority); } else { Driver_Sound_Play(voiceID, volume); } }
/** * Handle clicks on the Mentat widget. * @return True, always. */ bool GUI_Widget_Mentat_Click(Widget *w) { VARIABLE_NOT_USED(w); g_cursorSpriteID = 0; Sprites_SetMouseSprite(0, 0, g_sprites[0]); Sound_Output_Feedback(0xFFFE); Driver_Voice_Play(NULL, 0xFF); Music_Play(g_table_houseInfo[g_playerHouseID].musicBriefing); Sprites_UnloadTiles(); Timer_SetTimer(TIMER_GAME, false); GUI_Mentat_ShowHelpList(false); Timer_SetTimer(TIMER_GAME, true); Driver_Sound_Play(1, 0xFF); Sprites_LoadTiles(); g_textDisplayNeedsUpdate = true; GUI_DrawInterfaceAndRadar(SCREEN_0); Music_Play(Tools_RandomLCG_Range(0, 5) + 8); return true; }
/** * Start playing a sound sample. * @param index Sample to play. */ void Sound_StartSound(uint16 index) { if (index == 0xFFFF || g_gameConfig.sounds == 0 || (int16)g_table_voices[index].variable_04 < (int16)s_variable_4060) return; s_variable_4060 = g_table_voices[index].variable_04; if (g_variable_3E54[index] != NULL) { Driver_Voice_Play(g_variable_3E54[index], 0xFF); } else { char filenameBuffer[16]; const char *filename; filename = g_table_voices[index].string; if (filename[0] == '?') { snprintf(filenameBuffer, sizeof(filenameBuffer), filename + 1, g_playerHouseID < HOUSE_MAX ? g_table_houseInfo[g_playerHouseID].prefixChar : ' '); Driver_Voice_LoadFile(filenameBuffer, g_readBuffer, g_readBufferSize); Driver_Voice_Play(g_readBuffer, 0xFF); } } }
void async_GUI_Mentat_ShowDialogOpen() { asyncMentatShowDialog.w1 = GUI_Widget_Allocate(1, GUI_Widget_GetShortcut(String_Get_ByIndex(STR_PROCEED)[0]), 168, 168, 379, 0); asyncMentatShowDialog.w2 = GUI_Widget_Allocate(2, GUI_Widget_GetShortcut(String_Get_ByIndex(STR_REPEAT)[0]), 240, 168, 381, 0); asyncMentatShowDialog.w1 = GUI_Widget_Link(asyncMentatShowDialog.w1, asyncMentatShowDialog.w2); Sound_Output_Feedback(0xFFFE); Driver_Voice_Play(NULL, 0xFF); Music_Play(asyncMentatShowDialog.musicID); asyncMentatShowDialog.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 + asyncMentatShowDialog.houseID * 40; }
/** * Plays a music. * @param index The index of the music to play. */ void Music_Play(uint16 musicID) { if (musicID == 0xFFFF || musicID >= 38) return; if (g_table_musics[musicID].string != s_currentMusic) { s_currentMusic = g_table_musics[musicID].string; Driver_Music_Stop(); Driver_Voice_Play(NULL, 0xFF); Driver_Music_LoadFile(NULL); Driver_Sound_LoadFile(NULL); Driver_Music_LoadFile(s_currentMusic); Driver_Sound_LoadFile(s_currentMusic); } Driver_Music_Play(g_table_musics[musicID].variable_04, 0xFF); }
/** * Plays a music. * @param index The index of the music to play. */ void Music_Play(uint16 musicID) { static uint16 currentMusicID = 0; if (musicID == 0xFFFF || musicID >= 38 || musicID == currentMusicID) return; currentMusicID = musicID; if (g_table_musics[musicID].string != s_currentMusic) { s_currentMusic = g_table_musics[musicID].string; Driver_Music_Stop(); Driver_Voice_Play(NULL, 0xFF); Driver_Music_LoadFile(NULL); Driver_Sound_LoadFile(NULL); Driver_Music_LoadFile(s_currentMusic); Driver_Sound_LoadFile(s_currentMusic); } Driver_Music_Play(g_table_musics[musicID].index, 0xFF); }
/** * Handle clicks on the Mentat widget. * @return True, always. */ bool GUI_Widget_Mentat_Click(Widget *w) { VARIABLE_NOT_USED(w); g_cursorSpriteID = 0; Sprites_SetMouseSprite(0, 0, g_sprites[0]); Sound_Output_Feedback(0xFFFE); Driver_Voice_Play(NULL, 0xFF); Music_Play(g_table_houseInfo[g_playerHouseID].musicBriefing); Sprites_UnloadTiles(); Timer_SetTimer(TIMER_GAME, false); AsyncGUI_Mentat_ShowHelpList(false); Async_InvokeAfterAsync(GUI_Widget_Mentat_Click_Close); return true; }
/** * 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; }