/** * Handles Click event for the "+" button in starport window. * * @return True, always. */ bool GUI_Purchase_Plus_Click(Widget *w) { FactoryWindowItem *item; ObjectInfo *oi; House *h = g_playerHouse; GUI_Widget_MakeNormal(w, false); item = GUI_FactoryWindow_GetItem(g_factoryWindowSelected); oi = item->objectInfo; if (item->amount < oi->available && item->credits <= h->credits) { item->amount++; GUI_FactoryWindow_UpdateDetails(); g_factoryWindowOrdered++; h->credits -= item->credits; GUI_FactoryWindow_DrawCaption(NULL); } return true; }
/** * Handles Click event for the "Build this" button in production window. * * @return True, always. */ bool GUI_Production_BuildThis_Click(Widget *w) { if (g_factoryWindowStarport) { if (g_factoryWindowOrdered == 0) { GUI_Widget_MakeInvisible(w); GUI_Purchase_ShowInvoice(); GUI_Widget_MakeVisible(w); } else { g_factoryWindowResult = FACTORY_BUY; } } else { FactoryWindowItem *item; ObjectInfo *oi; item = GUI_FactoryWindow_GetItem(g_factoryWindowSelected); oi = item->objectInfo; if (oi->available > 0) { item->amount = 1; g_factoryWindowResult = FACTORY_BUY; } } GUI_Widget_MakeNormal(w, false); return true; }
/** * Handles Click event for the "Invoice" button in starport window. * * @return True, always. */ bool GUI_Purchase_Invoice_Click(Widget *w) { GUI_Widget_MakeInvisible(w); GUI_Purchase_ShowInvoice(); GUI_Widget_MakeVisible(w); GUI_Widget_MakeNormal(w, false); return true; }
/** * Handles Click event for the "Ugrade" button in production window. * * @return True, always. */ bool GUI_Production_Upgrade_Click(Widget *w) { GUI_Widget_MakeNormal(w, false); g_factoryWindowResult = FACTORY_UPGRADE; return true; }
/** * Handles Click event for "Game controls" button. * * @param w The widget. */ static void GUI_Widget_GameControls_Click(Widget *w) { WindowDesc *desc = &g_gameControlWindowDesc; bool loop; GUI_Window_BackupScreen(desc); GUI_Window_Create(desc); loop = true; while (loop) { Widget *w2 = g_widgetLinkedListTail; uint16 key = GUI_Widget_HandleEvents(w2); if ((key & 0x8000) != 0) { w = GUI_Widget_Get_ByIndex(w2, key & 0x7FFF); switch ((key & 0x7FFF) - 0x1E) { case 0: g_gameConfig.music ^= 0x1; if (g_gameConfig.music == 0) Driver_Music_Stop(); break; case 1: g_gameConfig.sounds ^= 0x1; if (g_gameConfig.sounds == 0) Driver_Sound_Stop(); break; case 2: if (++g_gameConfig.gameSpeed >= 5) g_gameConfig.gameSpeed = 0; break; case 3: g_gameConfig.hints ^= 0x1; break; case 4: g_gameConfig.autoScroll ^= 0x1; break; case 5: loop = false; break; default: break; } GUI_Widget_MakeNormal(w, false); GUI_Widget_Draw(w); } GUI_PaletteAnimate(); sleepIdle(); } GUI_Window_RestoreScreen(desc); }
/** * Handles Click event for list in mentat window. * * @param w The widget. */ bool GUI_Mentat_List_Click(Widget *w) { uint16 index; Widget *w2; index = s_selectedHelpSubject + 3; if (w->index != index) { w2 = GUI_Widget_Get_ByIndex(g_widgetMentatTail, index); GUI_Widget_MakeNormal(w, false); GUI_Widget_MakeNormal(w2, false); if (w2->stringID == 0x31) { w2->fgColourDown = 15; w2->fgColourNormal = 15; GUI_Widget_Draw(w2); } if (w->stringID == 0x31) { w->fgColourDown = 8; w->fgColourNormal = 8; GUI_Widget_Draw(w); } s_selectedHelpSubject = w->index - 3; return true; } if ((w->state.buttonState & 0x11) == 0 && !s_selectMentatHelp) return true; if (w->stringID != 0x31) return true; GUI_Widget_MakeNormal(w, false); GUI_Mentat_ShowHelp(); GUI_Mentat_Draw(true); Input_HandleInput(0x841); Input_HandleInput(0x842); return false; }
void GUI_Mentat_ShowHelp_Close() { GUI_Widget_MakeNormal(g_widgetMentatFirst, false); GUI_Mentat_LoadHelpSubjects(false); GUI_Mentat_Create_HelpScreen_Widgets(); GUI_Mentat_Draw(true); }
/** * Handles Click event for "Clear List" button. * * @param w The widget. * @return True, always. */ bool GUI_Widget_HOF_ClearList_Click(Widget *w) { /* "Are you sure you want to clear the high scores?" */ if (GUI_YesNo(STR_ARE_YOU_SURE_YOU_WANT_TO_CLEAR_THE_HIGH_SCORES)) { HallOfFameStruct *data = w->data; memset(data, 0, 128); if (File_Exists_Personal("SAVEFAME.DAT")) File_Delete_Personal("SAVEFAME.DAT"); GUI_HallOfFame_DrawData(data, true); g_doQuitHOF = true; } GUI_Widget_MakeNormal(w, false); return true; }
/** * Handles Click event for "Clear List" button. * * @param w The widget. * @return True, always. */ bool GUI_Widget_HOF_ClearList_Click(Widget *w) { /* "Are you sure you want to clear the high scores?" */ if (GUI_YesNo(0x148)) { HallOfFameStruct *data = w->data; memset(data, 0, 128); if (File_Exists("SAVEFAME.DAT")) File_Delete("SAVEFAME.DAT"); GUI_HallOfFame_DrawData(data, true); g_doQuitHOF = true; } GUI_Widget_MakeNormal(w, false); return true; }
/** * Handles Click event for the "Up" button in production window. * * @return True, always. */ bool GUI_Production_Up_Click(Widget *w) { bool locdi = false; if (g_factoryWindowSelected != 0) { g_timerTimeout = 10; GUI_FactoryWindow_B495_0F30(); g_factoryWindowSelected--; GUI_FactoryWindow_UpdateSelection(true); locdi = true; } else { if (g_factoryWindowBase != 0) { g_timerTimeout = 10; g_factoryWindowBase--; locdi = true; GUI_FactoryWindow_ScrollList(-1); GUI_FactoryWindow_UpdateSelection(true); } else { locdi = false; GUI_FactoryWindow_DrawDetails(); GUI_FactoryWindow_FailScrollList(-1); } } do { GUI_FactoryWindow_UpdateSelection(false); sleepIdle(); } while (g_timerTimeout != 0); if (locdi) GUI_FactoryWindow_DrawDetails(); GUI_Widget_MakeNormal(w, false); return true; }
/** * Handles Click event for the "Down" button in production window. * * @return True, always. */ bool GUI_Production_Down_Click(Widget *w) { bool locdi = false; if (g_factoryWindowSelected < 3 && (g_factoryWindowSelected + 1) < g_factoryWindowTotal) { g_timerTimeout = 10; GUI_FactoryWindow_B495_0F30(); g_factoryWindowSelected++; GUI_FactoryWindow_UpdateSelection(true); locdi = true; } else { if (g_factoryWindowBase + 4 < g_factoryWindowTotal) { g_timerTimeout = 10; g_factoryWindowBase++; locdi = true; GUI_FactoryWindow_ScrollList(1); GUI_FactoryWindow_UpdateSelection(true); } else { locdi = false; GUI_FactoryWindow_DrawDetails(); GUI_FactoryWindow_FailScrollList(1); } } for (; g_timerTimeout != 0; sleepIdle()) { GUI_FactoryWindow_UpdateSelection(false); } if (locdi) GUI_FactoryWindow_DrawDetails(); GUI_Widget_MakeNormal(w, false); return true; }
/** * Handles Click event for the "-" button in startport window. * * @return True, always. */ bool GUI_Purchase_Minus_Click(Widget *w) { FactoryWindowItem *item; House *h = g_playerHouse; GUI_Widget_MakeNormal(w, false); item = GUI_FactoryWindow_GetItem(g_factoryWindowSelected); if (item->amount != 0) { item->amount--; GUI_FactoryWindow_UpdateDetails(); g_factoryWindowOrdered--; h->credits += item->credits; GUI_FactoryWindow_DrawCaption(NULL); } return true; }
/** * Handles Click event for the "Resume Game" button in production window. * * @return True, always. */ bool GUI_Production_ResumeGame_Click(Widget *w) { g_factoryWindowResult = FACTORY_RESUME; if (g_factoryWindowStarport) { uint8 i = 0; House *h = g_playerHouse; while (g_factoryWindowOrdered != 0) { if (g_factoryWindowItems[i].amount != 0) { h->credits += g_factoryWindowItems[i].amount * g_factoryWindowItems[i].credits; g_factoryWindowOrdered -= g_factoryWindowItems[i].amount; g_factoryWindowItems[i].amount = 0; } i++; GUI_DrawCredits(g_playerHouseID, 0); } } if (w != NULL) GUI_Widget_MakeNormal(w, false); return true; }
static void GUI_Mentat_ShowHelp(void) { struct { uint8 notused[8]; uint32 length; } info; uint8 *subject; uint16 i; bool noDesc; uint8 fileID; uint32 offset; char *compressedText; char *desc; char *picture; char *text; bool loc12; subject = s_helpSubjects; for (i = 0; i < s_selectedHelpSubject; i++) subject = String_NextString(subject); noDesc = (subject[5] == '0'); offset = HTOBE32(*(uint32 *)(subject + 1)); fileID = ChunkFile_Open(s_mentatFilename); ChunkFile_Read(fileID, HTOBE32(CC_INFO), &info, 12); ChunkFile_Close(fileID); info.length = HTOBE32(info.length); text = g_readBuffer; compressedText = GFX_Screen_Get_ByIndex(SCREEN_1); fileID = File_Open(s_mentatFilename, FILE_MODE_READ); File_Seek(fileID, offset, 0); File_Read(fileID, compressedText, info.length); String_Decompress(compressedText, text); String_TranslateSpecial(text, text); File_Close(fileID); while (*text != '*' && *text != '?') text++; loc12 = (*text == '*'); *text++ = '\0'; if (noDesc) { uint16 index; picture = g_scenario.pictureBriefing; desc = NULL; text = (char *)g_readBuffer; index = *text - 44 + g_campaignID * 4 + 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 + g_playerHouseID * 40; strncpy(g_readBuffer, String_Get_ByIndex(index), g_readBufferSize); } else { picture = (char *)g_readBuffer; desc = text; while (*text != '\0' && *text != 0xC) text++; if (*text != '\0') *text++ = '\0'; } GUI_Mentat_Loop(picture, desc, text, loc12 ? 1 : 0, g_widgetMentatFirst); GUI_Widget_MakeNormal(g_widgetMentatFirst, false); GUI_Mentat_LoadHelpSubjects(false); GUI_Mentat_Create_HelpScreen_Widgets(); GUI_Mentat_Draw(true); }
static void GUI_Mentat_Draw(bool force) { static uint16 displayedHelpSubject = 0; Screen oldScreenID; Widget *line; Widget *w = g_widgetMentatTail; uint8 *helpSubjects = s_helpSubjects; uint16 i; if (!force && s_topHelpList == displayedHelpSubject) return; displayedHelpSubject = s_topHelpList; oldScreenID = GFX_Screen_SetActive(SCREEN_1); Widget_SetAndPaintCurrentWidget(8); GUI_DrawSprite(SCREEN_1, g_sprites[397 + g_playerHouseID * 15], g_shoulderLeft, g_shoulderTop, 0, 0); GUI_DrawText_Wrapper(String_Get_ByIndex(STR_SELECT_SUBJECT), (g_curWidgetXBase << 3) + 16, g_curWidgetYBase + 2, 12, 0, 0x12); GUI_DrawText_Wrapper(NULL, 0, 0, 0, 0, 0x11); line = GUI_Widget_Get_ByIndex(w, 3); for (i = 0; i < 11; i++) { line->drawParameterDown.text = (char *)helpSubjects + 7; line->drawParameterSelected.text = (char *)helpSubjects + 7; line->drawParameterNormal.text = (char *)helpSubjects + 7; if (helpSubjects[6] == '0') { line->offsetX = 16; line->fgColourSelected = 11; line->fgColourDown = 11; line->fgColourNormal = 11; line->stringID = 0x30; } else { uint8 colour = (i == s_selectedHelpSubject) ? 8 : 15; line->offsetX = 24; line->fgColourSelected = colour; line->fgColourDown = colour; line->fgColourNormal = colour; line->stringID = 0x31; } GUI_Widget_MakeNormal(line, false); GUI_Widget_Draw(line); line = GUI_Widget_GetNext(line); helpSubjects = String_NextString(helpSubjects); } GUI_Widget_Scrollbar_Init(GUI_Widget_Get_ByIndex(w, 15), s_numberHelpSubjects, 11, s_topHelpList); GUI_Widget_Draw(GUI_Widget_Get_ByIndex(w, 16)); GUI_Widget_Draw(GUI_Widget_Get_ByIndex(w, 17)); GUI_Mouse_Hide_Safe(); GUI_Screen_Copy(g_curWidgetXBase, g_curWidgetYBase, g_curWidgetXBase, g_curWidgetYBase, g_curWidgetWidth, g_curWidgetHeight, SCREEN_1, SCREEN_0); GUI_Mouse_Show_Safe(); GFX_Screen_SetActive(oldScreenID); }
/** * Handles Click event for "Save Game" or "Load Game" button. * * @param save Wether to save or load. * @return True if a game has been saved or loaded, False otherwise. */ bool GUI_Widget_SaveLoad_Click(bool save) { WindowDesc *desc = &g_saveLoadWindowDesc; bool loop; s_savegameCountOnDisk = GetSavegameCount(); s_savegameIndexBase = max(0, s_savegameCountOnDisk - (save ? 0 : 1)); FillSavegameDesc(save); desc->stringID = save ? STR_SELECT_A_POSITION_TO_SAVE_TO : STR_SELECT_A_SAVED_GAME_TO_LOAD; GUI_Window_BackupScreen(desc); GUI_Window_Create(desc); UpdateArrows(save, true); for (loop = true; loop; sleepIdle()) { Widget *w = g_widgetLinkedListTail; uint16 key = GUI_Widget_HandleEvents(w); UpdateArrows(save, false); if ((key & 0x8000) != 0) { Widget *w2; key &= 0x7FFF; w2 = GUI_Widget_Get_ByIndex(w, key); switch (key) { case 0x25: s_savegameIndexBase = min(s_savegameCountOnDisk - (save ? 0 : 1), s_savegameIndexBase + 1); FillSavegameDesc(save); GUI_Widget_DrawAll(w); break; case 0x26: s_savegameIndexBase = max(0, s_savegameIndexBase - 1); FillSavegameDesc(save); GUI_Widget_DrawAll(w); break; case 0x23: loop = false; break; default: { GUI_Window_RestoreScreen(desc); key -= 0x1E; if (!save) { LoadFile(GenerateSavegameFilename(s_savegameIndexBase - key)); return true; } if (GUI_Widget_Savegame_Click(key)) return true; GUI_Window_BackupScreen(desc); UpdateArrows(save, true); GUI_Window_Create(desc); UpdateArrows(save, true); } break; } GUI_Widget_MakeNormal(w2, false); } GUI_PaletteAnimate(); } GUI_Window_RestoreScreen(desc); return false; }
/** * Handles Click event for savegame button. * * @param key The index of the clicked button. * @return True if a game has been saved, False otherwise. */ static bool GUI_Widget_Savegame_Click(uint16 key) { WindowDesc *desc = &g_savegameNameWindowDesc; bool loop; char *saveDesc = g_savegameDesc[key]; uint16 loc08; uint16 loc0A; bool ret; if (*saveDesc == '[') *saveDesc = 0; GUI_Window_BackupScreen(desc); GUI_Window_Create(desc); ret = false; loc08 = 1; if (*saveDesc == '[') key = s_savegameCountOnDisk; GFX_Screen_SetActive(SCREEN_0); Widget_SetCurrentWidget(15); GUI_Mouse_Hide_Safe(); GUI_DrawBorder((g_curWidgetXBase << 3) - 1, g_curWidgetYBase - 1, (g_curWidgetWidth << 3) + 2, g_curWidgetHeight + 2, 4, false); GUI_Mouse_Show_Safe(); for (loop = true; loop; sleepIdle()) { Widget *w = g_widgetLinkedListTail; GUI_DrawText_Wrapper(NULL, 0, 0, 232, 235, 0x22); loc0A = GUI_EditBox(saveDesc, 50, 15, g_widgetLinkedListTail, NULL, loc08); loc08 = 2; if ((loc0A & 0x8000) == 0) continue; GUI_Widget_MakeNormal(GUI_Widget_Get_ByIndex(w, loc0A & 0x7FFF), false); switch (loc0A & 0x7FFF) { case 0x1E: if (*saveDesc == 0) break; SaveFile(GenerateSavegameFilename(s_savegameIndexBase - key), saveDesc); loop = false; ret = true; break; case 0x1F: loop = false; ret = false; FillSavegameDesc(true); break; default: break; } } GUI_Window_RestoreScreen(desc); return ret; }
static void GUI_Window_Create(WindowDesc *desc) { uint8 i; if (desc == NULL) return; g_widgetLinkedListTail = NULL; GFX_Screen_SetActive(SCREEN_1); Widget_SetCurrentWidget(desc->index); GUI_Widget_DrawBorder(g_curWidgetIndex, 2, true); if (GUI_String_Get_ByIndex(desc->stringID) != NULL) { GUI_DrawText_Wrapper(GUI_String_Get_ByIndex(desc->stringID), (g_curWidgetXBase << 3) + (g_curWidgetWidth << 2), g_curWidgetYBase + 6 + ((desc == &g_yesNoWindowDesc) ? 2 : 0), 238, 0, 0x122); } if (GUI_String_Get_ByIndex(desc->widgets[0].stringID) == NULL) { GUI_DrawText_Wrapper(String_Get_ByIndex(STR_THERE_ARE_NO_SAVED_GAMES_TO_LOAD), (g_curWidgetXBase + 2) << 3, g_curWidgetYBase + 42, 232, 0, 0x22); } for (i = 0; i < desc->widgetCount; i++) { Widget *w = &g_table_windowWidgets[i]; if (GUI_String_Get_ByIndex(desc->widgets[i].stringID) == NULL) continue; w->next = NULL; w->offsetX = desc->widgets[i].offsetX; w->offsetY = desc->widgets[i].offsetY; w->width = desc->widgets[i].width; w->height = desc->widgets[i].height; w->shortcut = 0; w->shortcut2 = 0; if (desc != &g_savegameNameWindowDesc) { if (desc->widgets[i].labelStringId != STR_NULL) { w->shortcut = GUI_Widget_GetShortcut(*GUI_String_Get_ByIndex(desc->widgets[i].labelStringId)); } else { w->shortcut = GUI_Widget_GetShortcut(*GUI_String_Get_ByIndex(desc->widgets[i].stringID)); } } w->shortcut2 = desc->widgets[i].shortcut2; if (w->shortcut == 0x1B) { w->shortcut2 = 0x13; } w->stringID = desc->widgets[i].stringID; w->drawModeNormal = DRAW_MODE_CUSTOM_PROC; w->drawModeSelected = DRAW_MODE_CUSTOM_PROC; w->drawModeDown = DRAW_MODE_CUSTOM_PROC; w->drawParameterNormal.proc = &GUI_Widget_TextButton_Draw; w->drawParameterSelected.proc = &GUI_Widget_TextButton_Draw; w->drawParameterDown.proc = &GUI_Widget_TextButton_Draw; w->parentID = desc->index; memset(&w->state, 0, sizeof(w->state)); g_widgetLinkedListTail = GUI_Widget_Link(g_widgetLinkedListTail, w); GUI_Widget_MakeVisible(w); GUI_Widget_MakeNormal(w, false); GUI_Widget_Draw(w); if (desc->widgets[i].labelStringId == STR_NULL) continue; if (g_config.language == LANGUAGE_FRENCH) { GUI_DrawText_Wrapper(GUI_String_Get_ByIndex(desc->widgets[i].labelStringId), (g_widgetProperties[w->parentID].xBase << 3) + 40, w->offsetY + g_widgetProperties[w->parentID].yBase + 3, 232, 0, 0x22); } else { GUI_DrawText_Wrapper(GUI_String_Get_ByIndex(desc->widgets[i].labelStringId), w->offsetX + (g_widgetProperties[w->parentID].xBase << 3) - 10, w->offsetY + g_widgetProperties[w->parentID].yBase + 3, 232, 0, 0x222); } } if (s_savegameCountOnDisk >= 5 && desc->addArrows) { Widget *w = &g_table_windowWidgets[7]; w->drawParameterNormal.sprite = g_sprites[59]; w->drawParameterSelected.sprite = g_sprites[60]; w->drawParameterDown.sprite = g_sprites[60]; w->next = NULL; w->parentID = desc->index; GUI_Widget_MakeNormal(w, false); GUI_Widget_MakeInvisible(w); GUI_Widget_Undraw(w, 233); g_widgetLinkedListTail = GUI_Widget_Link(g_widgetLinkedListTail, w); w = &g_table_windowWidgets[8]; w->drawParameterNormal.sprite = g_sprites[61]; w->drawParameterSelected.sprite = g_sprites[62]; w->drawParameterDown.sprite = g_sprites[62]; w->next = NULL; w->parentID = desc->index; GUI_Widget_MakeNormal(w, false); GUI_Widget_MakeInvisible(w); GUI_Widget_Undraw(w, 233); g_widgetLinkedListTail = GUI_Widget_Link(g_widgetLinkedListTail, w); } GUI_Mouse_Hide_Safe(); Widget_SetCurrentWidget(desc->index); GUI_Screen_Copy(g_curWidgetXBase, g_curWidgetYBase, g_curWidgetXBase, g_curWidgetYBase, g_curWidgetWidth, g_curWidgetHeight, SCREEN_1, SCREEN_0); GUI_Mouse_Show_Safe(); GFX_Screen_SetActive(SCREEN_0); }
/** * Handles Click event for unit commands button. * * @param w The widget. * @return True, always. */ bool GUI_Widget_TextButton_Click(Widget *w) { const UnitInfo *ui; const ActionInfo *ai; const uint16 *actions; ActionType action; Unit *u; uint16 *found; ActionType unitAction; u = g_unitSelected; ui = &g_table_unitInfo[u->o.type]; actions = ui->o.actionsPlayer; if (Unit_GetHouseID(u) != g_playerHouseID && u->o.type != UNIT_HARVESTER) { actions = g_table_actionsAI; } action = actions[w->index - 8]; unitAction = u->nextActionID; if (unitAction == ACTION_INVALID) { unitAction = u->actionID; } if (u->deviated != 0) { Unit_Deviation_Decrease(u, 5); if (u->deviated == 0) { GUI_Widget_MakeNormal(w, false); return true; } } GUI_Widget_MakeSelected(w, false); ai = &g_table_actionInfo[action]; if (ai->selectionType != g_selectionType) { g_unitActive = g_unitSelected; g_activeAction = action; GUI_ChangeSelectionType(ai->selectionType); return true; } Object_Script_Variable4_Clear(&u->o); u->targetAttack = 0; u->targetMove = 0; u->route[0] = 0xFF; Unit_SetAction(u, action); if (ui->movementType == MOVEMENT_FOOT) Sound_StartSound(ai->soundID); if (unitAction == action) return true; found = memchr(actions, unitAction, 4); if (found == NULL) return true; GUI_Widget_MakeNormal(GUI_Widget_Get_ByIndex(g_widgetLinkedListHead, found - actions + 8), false); return true; }
/** * Handles Click event for savegame button. * * @param index The index of the clicked button. * @return True if a game has been saved, False otherwise. */ static bool GUI_Widget_Savegame_Click(uint16 index) { WindowDesc *desc = &g_savegameNameWindowDesc; bool loop; char *saveDesc = g_savegameDesc[index]; bool widgetPaint; bool ret; if (*saveDesc == '[') *saveDesc = 0; GUI_Window_BackupScreen(desc); GUI_Window_Create(desc); ret = false; widgetPaint = true; if (*saveDesc == '[') index = s_savegameCountOnDisk; GFX_Screen_SetActive(SCREEN_0); Widget_SetCurrentWidget(15); GUI_Mouse_Hide_Safe(); GUI_DrawBorder((g_curWidgetXBase << 3) - 1, g_curWidgetYBase - 1, (g_curWidgetWidth << 3) + 2, g_curWidgetHeight + 2, 4, false); GUI_Mouse_Show_Safe(); for (loop = true; loop; sleepIdle()) { uint16 eventKey; Widget *w = g_widgetLinkedListTail; GUI_DrawText_Wrapper(NULL, 0, 0, 232, 235, 0x22); eventKey = GUI_EditBox(saveDesc, 50, 15, g_widgetLinkedListTail, NULL, widgetPaint); widgetPaint = false; if ((eventKey & 0x8000) == 0) continue; GUI_Widget_MakeNormal(GUI_Widget_Get_ByIndex(w, eventKey & 0x7FFF), false); switch (eventKey & 0x7FFF) { case 0x1E: /* RETURN / Save Button */ if (*saveDesc == 0) break; SaveGame_SaveFile(GenerateSavegameFilename(s_savegameIndexBase - index), saveDesc); loop = false; ret = true; break; case 0x1F: /* ESCAPE / Cancel Button */ loop = false; ret = false; FillSavegameDesc(true); break; default: break; } } GUI_Window_RestoreScreen(desc); return ret; }