/** * Shows the Help window. * @param proceed Display a "Proceed" button if true, "Exit" otherwise. */ static void AsyncGUI_Mentat_ShowHelpList(bool proceed) { GUI_Mentat_ShowHelpList_oldScreenID = GFX_Screen_SetActive(2); Input_Flags_SetBits(INPUT_FLAG_KEY_REPEAT); Input_History_Clear(); GUI_Mentat_Display(NULL, g_playerHouseID); g_widgetMentatFirst = GUI_Widget_Allocate(1, GUI_Widget_GetShortcut(*String_Get_ByIndex(STR_EXIT)), 200, 168, proceed ? 379 : 377, 5); g_widgetMentatFirst->shortcut2 = 'n'; GUI_Mentat_Create_HelpScreen_Widgets(); GUI_Mouse_Hide_Safe(); GUI_Screen_Copy(0, 0, 0, 0, SCREEN_WIDTH / 8, SCREEN_HEIGHT, 2, 0); GUI_Mouse_Show_Safe(); GUI_Mentat_LoadHelpSubjects(true); GUI_Mentat_Draw(true); GFX_Screen_SetActive(0); AsyncGUI_Mentat_HelpListLoop(); Async_InvokeAfterAsync(GUI_Mentat_ShowHelpList_Close); }
/** * Shows the Help window. * @param proceed Display a "Proceed" button if true, "Exit" otherwise. */ static void GUI_Mentat_ShowHelpList(bool proceed) { Screen oldScreenID; oldScreenID = GFX_Screen_SetActive(SCREEN_1); /* ENHANCEMENT -- After visiting Mentat (the help) window, auto-repeat of keys gets disabled. */ if (!g_dune2_enhanced) Input_Flags_SetBits(INPUT_FLAG_KEY_REPEAT); Input_History_Clear(); GUI_Mentat_Display(NULL, g_playerHouseID); g_widgetMentatFirst = GUI_Widget_Allocate(1, GUI_Widget_GetShortcut(*String_Get_ByIndex(STR_EXIT)), 200, 168, proceed ? 379 : 377, 5); g_widgetMentatFirst->shortcut2 = 'n'; GUI_Mentat_Create_HelpScreen_Widgets(); GUI_Mouse_Hide_Safe(); GUI_Screen_Copy(0, 0, 0, 0, SCREEN_WIDTH / 8, SCREEN_HEIGHT, SCREEN_1, SCREEN_0); GUI_Mouse_Show_Safe(); GUI_Mentat_LoadHelpSubjects(true); GUI_Mentat_Draw(true); GFX_Screen_SetActive(SCREEN_0); GUI_Mentat_HelpListLoop(); free(g_widgetMentatFirst); g_widgetMentatFirst = NULL; Load_Palette_Mercenaries(); GUI_Widget_Free_WithScrollbar(g_widgetMentatScrollbar); g_widgetMentatScrollbar = NULL; free(g_widgetMentatScrollUp); g_widgetMentatScrollUp = NULL; free(g_widgetMentatScrollDown); g_widgetMentatScrollDown = NULL; /* ENHANCEMENT -- After visiting Mentat (the help) window, auto-repeat of keys gets disabled. */ if (!g_dune2_enhanced) Input_Flags_ClearBits(INPUT_FLAG_KEY_REPEAT); GFX_Screen_SetActive(oldScreenID); }
/** * Shows the Help window. * @param proceed Display a "Proceed" button if true, "Exit" otherwise. */ static void GUI_Mentat_ShowHelpList(bool proceed) { uint16 oldScreenID; oldScreenID = GFX_Screen_SetActive(2); Input_Flags_SetBits(INPUT_FLAG_KEY_REPEAT); Input_History_Clear(); GUI_Mentat_Display(NULL, g_playerHouseID); g_widgetMentatFirst = GUI_Widget_Allocate(1, GUI_Widget_GetShortcut(*String_Get_ByIndex(STR_EXIT)), 200, 168, proceed ? 379 : 377, 5); g_widgetMentatFirst->shortcut2 = 'n'; GUI_Mentat_Create_HelpScreen_Widgets(); GUI_Mouse_Hide_Safe(); GUI_Screen_Copy(0, 0, 0, 0, SCREEN_WIDTH / 8, SCREEN_HEIGHT, 2, 0); GUI_Mouse_Show_Safe(); GUI_Mentat_LoadHelpSubjects(true); GUI_Mentat_Draw(true); GFX_Screen_SetActive(0); GUI_Mentat_HelpListLoop(); free(g_widgetMentatFirst); g_widgetMentatFirst = NULL; Load_Palette_Mercenaries(); GUI_Widget_Free_WithScrollbar(g_widgetMentatScrollbar); g_widgetMentatScrollbar = NULL; free(g_widgetMentatScrollUp); g_widgetMentatScrollUp = NULL; free(g_widgetMentatScrollDown); g_widgetMentatScrollDown = NULL; Input_Flags_ClearBits(INPUT_FLAG_KEY_REPEAT); GFX_Screen_SetActive(oldScreenID); }
/** * Main game loop. */ static void GameLoop_Main(void) { static uint32 l_timerNext = 0; static uint32 l_timerUnitStatus = 0; static int16 l_selectionState = -2; uint16 key; String_Init(); Sprites_Init(); Input_Flags_SetBits(INPUT_FLAG_KEY_REPEAT | INPUT_FLAG_UNKNOWN_0010 | INPUT_FLAG_UNKNOWN_0200 | INPUT_FLAG_UNKNOWN_2000); Input_Flags_ClearBits(INPUT_FLAG_KEY_RELEASE | INPUT_FLAG_UNKNOWN_0400 | INPUT_FLAG_UNKNOWN_0100 | INPUT_FLAG_UNKNOWN_0080 | INPUT_FLAG_UNKNOWN_0040 | INPUT_FLAG_UNKNOWN_0020 | INPUT_FLAG_UNKNOWN_0008 | INPUT_FLAG_UNKNOWN_0004 | INPUT_FLAG_NO_TRANSLATE); Timer_SetTimer(TIMER_GAME, true); Timer_SetTimer(TIMER_GUI, true); g_campaignID = 0; g_scenarioID = 1; g_playerHouseID = HOUSE_INVALID; g_debugScenario = false; g_selectionType = SELECTIONTYPE_MENTAT; g_selectionTypeNew = SELECTIONTYPE_MENTAT; g_palette1 = calloc(1, 256 * 3); g_palette2 = calloc(1, 256 * 3); g_readBufferSize = 12000; g_readBuffer = calloc(1, g_readBufferSize); ReadProfileIni("PROFILE.INI"); free(g_readBuffer); g_readBuffer = NULL; File_ReadBlockFile("IBM.PAL", g_palette_998A, 256 * 3); memmove(g_palette1, g_palette_998A, 256 * 3); GUI_ClearScreen(SCREEN_0); Video_SetPalette(g_palette1, 0, 256); GFX_SetPalette(g_palette1); GFX_SetPalette(g_palette2); g_paletteMapping1 = malloc(256); g_paletteMapping2 = malloc(256); GUI_Palette_CreateMapping(g_palette1, g_paletteMapping1, 0xC, 0x55); g_paletteMapping1[0xFF] = 0xFF; g_paletteMapping1[0xDF] = 0xDF; g_paletteMapping1[0xEF] = 0xEF; GUI_Palette_CreateMapping(g_palette1, g_paletteMapping2, 0xF, 0x55); g_paletteMapping2[0xFF] = 0xFF; g_paletteMapping2[0xDF] = 0xDF; g_paletteMapping2[0xEF] = 0xEF; Script_LoadFromFile("TEAM.EMC", g_scriptTeam, g_scriptFunctionsTeam, NULL); Script_LoadFromFile("BUILD.EMC", g_scriptStructure, g_scriptFunctionsStructure, NULL); GUI_Palette_CreateRemap(HOUSE_MERCENARY); g_cursorSpriteID = 0; Sprites_SetMouseSprite(0, 0, g_sprites[0]); while (g_mouseHiddenDepth > 1) { GUI_Mouse_Show_Safe(); } Window_WidgetClick_Create(); GameOptions_Load(); Unit_Init(); Team_Init(); House_Init(); Structure_Init(); GUI_Mouse_Show_Safe(); if (g_debugSkipDialogs) { Music_Play(0); free(g_readBuffer); g_readBufferSize = (g_enableVoices == 0) ? 12000 : 20000; g_readBuffer = calloc(1, g_readBufferSize); g_gameMode = GM_NORMAL; } for (;; sleepIdle()) { if (g_gameMode == GM_MENU) { GameLoop_GameIntroAnimationMenu(); if (!g_running) break; if (g_gameMode == GM_MENU) continue; GUI_Mouse_Hide_Safe(); g_canSkipIntro = false; GUI_DrawFilledRectangle(g_curWidgetXBase << 3, g_curWidgetYBase, (g_curWidgetXBase + g_curWidgetWidth) << 3, g_curWidgetYBase + g_curWidgetHeight, 12); Input_History_Clear(); if (s_enableLog != 0) Mouse_SetMouseMode((uint8)s_enableLog, "DUNE.LOG"); GFX_SetPalette(g_palette1); GUI_Mouse_Show_Safe(); } if (g_gameMode == GM_PICKHOUSE) { Music_Play(28); g_playerHouseID = HOUSE_MERCENARY; g_playerHouseID = GUI_PickHouse(); GUI_Mouse_Hide_Safe(); GFX_ClearBlock(SCREEN_0); Sprites_LoadTiles(); GUI_Palette_CreateRemap(g_playerHouseID); Voice_LoadVoices(g_playerHouseID); GUI_Mouse_Show_Safe(); g_gameMode = GM_RESTART; g_scenarioID = 1; g_campaignID = 0; g_strategicRegionBits = 0; } if (g_selectionTypeNew != g_selectionType) { GUI_ChangeSelectionType(g_selectionTypeNew); } GUI_PaletteAnimate(); if (g_gameMode == GM_RESTART) { GUI_ChangeSelectionType(SELECTIONTYPE_MENTAT); Game_LoadScenario(g_playerHouseID, g_scenarioID); if (!g_debugScenario && !g_debugSkipDialogs) GUI_Mentat_ShowBriefing(); g_gameMode = GM_NORMAL; GUI_ChangeSelectionType(g_debugScenario ? SELECTIONTYPE_DEBUG : SELECTIONTYPE_STRUCTURE); Music_Play(Tools_RandomLCG_Range(0, 8) + 8); l_timerNext = g_timerGUI + 300; } if (l_selectionState != g_selectionState) { Map_SetSelectionObjectPosition(0xFFFF); Map_SetSelectionObjectPosition(g_selectionRectanglePosition); l_selectionState = g_selectionState; } if (!Driver_Voice_IsPlaying() && !Sound_StartSpeech()) { if (g_gameConfig.music == 0) { Music_Play(2); g_musicInBattle = 0; } else if (g_musicInBattle > 0) { Music_Play(Tools_RandomLCG_Range(0, 5) + 17); l_timerNext = g_timerGUI + 300; g_musicInBattle = -1; } else { g_musicInBattle = 0; if (g_enableSoundMusic != 0 && g_timerGUI > l_timerNext) { if (!Driver_Music_IsPlaying()) { Music_Play(Tools_RandomLCG_Range(0, 8) + 8); l_timerNext = g_timerGUI + 300; } } } } GFX_Screen_SetActive(SCREEN_0); key = GUI_Widget_HandleEvents(g_widgetLinkedListHead); if (g_selectionType == SELECTIONTYPE_TARGET || g_selectionType == SELECTIONTYPE_PLACE || g_selectionType == SELECTIONTYPE_UNIT || g_selectionType == SELECTIONTYPE_STRUCTURE) { if (g_unitSelected != NULL) { if (l_timerUnitStatus < g_timerGame) { Unit_DisplayStatusText(g_unitSelected); l_timerUnitStatus = g_timerGame + 300; } if (g_selectionType != SELECTIONTYPE_TARGET) { g_selectionPosition = Tile_PackTile(Tile_Center(g_unitSelected->o.position)); } } GUI_Widget_ActionPanel_Draw(false); InGame_Numpad_Move(key); GUI_DrawCredits(g_playerHouseID, 0); GameLoop_Team(); GameLoop_Unit(); GameLoop_Structure(); GameLoop_House(); GUI_DrawScreen(SCREEN_0); } GUI_DisplayText(NULL, 0); if (g_running && !g_debugScenario) { GameLoop_LevelEnd(); } if (!g_running) break; } GUI_Mouse_Hide_Safe(); if (s_enableLog != 0) Mouse_SetMouseMode(INPUT_MOUSE_MODE_NORMAL, "DUNE.LOG"); GUI_Mouse_Hide_Safe(); Widget_SetCurrentWidget(0); GFX_Screen_SetActive(SCREEN_1); GFX_ClearScreen(); GUI_Screen_FadeIn(g_curWidgetXBase, g_curWidgetYBase, g_curWidgetXBase, g_curWidgetYBase, g_curWidgetWidth, g_curWidgetHeight, SCREEN_1, SCREEN_0); }
/** * Show an EditBox and handles the input. * @param text The text to edit. Uses the pointer to make the modifications. * @param maxLength The maximum length of the text. * @param unknown1 Unknown. * @param w The widget this editbox is attached to. * @param tickProc The function to call every tick, for animation etc. * @param unknown4 Unknown. * @return Unknown. */ uint16 GUI_EditBox(char *text, uint16 maxLength, uint16 unknown1, Widget *w, uint16 (*tickProc)(void), uint16 unknown4) { Screen oldScreenID; uint16 oldValue_07AE_0000; uint16 positionX; uint16 maxWidth; uint16 textWidth; uint16 textLength; uint16 returnValue; char *t; /* Initialize */ { Input_Flags_SetBits(INPUT_FLAG_NO_TRANSLATE); Input_Flags_ClearBits(INPUT_FLAG_UNKNOWN_2000); oldScreenID = GFX_Screen_SetActive(SCREEN_0); oldValue_07AE_0000 = Widget_SetCurrentWidget(unknown1); returnValue = 0x0; } positionX = g_curWidgetXBase << 3; textWidth = 0; textLength = 0; maxWidth = (g_curWidgetWidth << 3) - Font_GetCharWidth('W') - 1; t = text; /* Calculate the length and width of the current string */ for (; *t != '\0'; t++) { textWidth += Font_GetCharWidth(*t); textLength++; if (textWidth >= maxWidth) break; } *t = '\0'; if ((unknown4 & 0x1) != 0) { unknown4 |= 0x4; } GUI_Mouse_Hide_Safe(); if ((unknown4 & 0x4) != 0) Widget_PaintCurrentWidget(); GUI_DrawText_Wrapper(text, positionX, g_curWidgetYBase, g_curWidgetFGColourBlink, g_curWidgetFGColourNormal, 0); GUI_EditBox_BlinkCursor(positionX + textWidth, false); GUI_Mouse_Show_Safe(); for (;; sleepIdle()) { uint16 keyWidth; uint16 key; if (tickProc != NULL) { returnValue = tickProc(); if (returnValue != 0) break; } key = GUI_Widget_HandleEvents(w); GUI_EditBox_BlinkCursor(positionX + textWidth, false); if (key == 0x0) continue; if ((key & 0x8000) != 0) { returnValue = key; break; } if (key == 0x2B) { returnValue = 0x2B; break; } if (key == 0x6E) { *t = '\0'; returnValue = 0x6B; break; } /* Handle backspace */ if (key == 0x0F) { if (textLength == 0) continue; GUI_EditBox_BlinkCursor(positionX + textWidth, true); textWidth -= Font_GetCharWidth(*(t - 1)); textLength--; *(--t) = '\0'; GUI_EditBox_BlinkCursor(positionX + textWidth, false); continue; } key = Input_Keyboard_HandleKeys(key) & 0xFF; /* Names can't start with a space, and should be alpha-numeric */ if ((key == 0x20 && textLength == 0) || key < 0x20 || key > 0x7E) continue; keyWidth = Font_GetCharWidth(key & 0xFF); if (textWidth + keyWidth >= maxWidth || textLength >= maxLength) continue; /* Add char to the text */ *t = key & 0xFF; *(++t) = '\0'; textLength++; GUI_Mouse_Hide_Safe(); GUI_EditBox_BlinkCursor(positionX + textWidth, true); /* Draw new character */ GUI_DrawText_Wrapper(text + textLength - 1, positionX + textWidth, g_curWidgetYBase, g_curWidgetFGColourBlink, g_curWidgetFGColourNormal, 0x020); GUI_Mouse_Show_Safe(); textWidth += keyWidth; GUI_EditBox_BlinkCursor(positionX + textWidth, false); } /* Deinitialize */ { Input_Flags_ClearBits(INPUT_FLAG_NO_TRANSLATE); Input_Flags_SetBits(INPUT_FLAG_UNKNOWN_2000); Widget_SetCurrentWidget(oldValue_07AE_0000); GFX_Screen_SetActive(oldScreenID); } return returnValue; }
void Mouse_SetMouseMode(uint8 mouseMode, const char *filename) { switch (mouseMode) { default: break; case INPUT_MOUSE_MODE_NORMAL: g_mouseMode = mouseMode; if (g_mouseFileID != 0xFF) { Input_Flags_ClearBits(INPUT_FLAG_KEY_RELEASE); File_Close(g_mouseFileID); } g_mouseFileID = 0xFF; g_var_701B = true; break; case INPUT_MOUSE_MODE_RECORD: if (g_mouseFileID != 0xFF) break; File_Delete(filename); File_Create(filename); Tools_RandomLCG_Seed(0x21433412); g_mouseFileID = File_Open(filename, 3); g_mouseMode = mouseMode; Input_Flags_SetBits(INPUT_FLAG_KEY_RELEASE); Input_HandleInput(0x2D); break; case INPUT_MOUSE_MODE_PLAY: if (g_mouseFileID == 0xFF) { g_mouseFileID = File_Open(filename, 1); Tools_RandomLCG_Seed(0x21433412); } g_var_701B = true; File_Read(g_mouseFileID, &g_var_7013, 2); if (File_Read(g_mouseFileID, &g_var_7015, 2) != 2) break;; if ((g_var_7013 >= 0x41 && g_var_7013 <= 0x44) || g_var_7013 == 0x2D) { File_Read(g_mouseFileID, &g_var_7017, 2); if (File_Read(g_mouseFileID, &g_var_7019, 2) == 2) { g_mouseX = g_var_7017; g_mouseY = g_var_7019; g_prevButtonState = 0; GUI_Mouse_Hide_Safe(); GUI_Mouse_Show_Safe(); g_var_701B = false; break; } g_var_701B = true; break; } g_var_701B = false; break; } g_timerInput = 0; g_mouseMode = mouseMode; }