mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-15 19:13:07 +01:00
@@ -65,36 +65,134 @@ static constexpr const StringId window_save_prompt_labels[][2] = {
|
||||
{ STR_QUIT_GAME_PROMPT_TITLE, STR_SAVE_BEFORE_QUITTING },
|
||||
{ STR_QUIT_GAME_2_PROMPT_TITLE, STR_SAVE_BEFORE_QUITTING_2 },
|
||||
};
|
||||
|
||||
|
||||
static void WindowSavePromptClose(rct_window *w);
|
||||
static void WindowSavePromptMouseup(rct_window *w, WidgetIndex widgetIndex);
|
||||
static void WindowSavePromptPaint(rct_window *w, rct_drawpixelinfo *dpi);
|
||||
static void WindowSavePromptCallback(int32_t result, const utf8 * path);
|
||||
|
||||
static WindowEventList window_save_prompt_events([](auto& events)
|
||||
{
|
||||
events.close = &WindowSavePromptClose;
|
||||
events.mouse_up = &WindowSavePromptMouseup;
|
||||
events.paint = &WindowSavePromptPaint;
|
||||
});
|
||||
// clang-format on
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066DCBE
|
||||
*/
|
||||
static void WindowSavePromptCallback(int32_t result, const utf8* path)
|
||||
{
|
||||
if (result == MODAL_RESULT_OK)
|
||||
{
|
||||
game_load_or_quit_no_save_prompt();
|
||||
}
|
||||
}
|
||||
|
||||
class SavePromptWindow final : public Window
|
||||
{
|
||||
private:
|
||||
PromptMode _promptMode;
|
||||
|
||||
public:
|
||||
SavePromptWindow(PromptMode promptMode)
|
||||
: _promptMode(promptMode)
|
||||
{
|
||||
}
|
||||
|
||||
void OnOpen() override
|
||||
{
|
||||
if (gScreenFlags & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER))
|
||||
{
|
||||
widgets = window_quit_prompt_widgets;
|
||||
}
|
||||
else
|
||||
{
|
||||
widgets = window_save_prompt_widgets;
|
||||
}
|
||||
InitScrollWidgets();
|
||||
|
||||
// Pause the game if not network play.
|
||||
if (network_get_mode() == NETWORK_MODE_NONE)
|
||||
{
|
||||
gGamePaused |= GAME_PAUSED_MODAL;
|
||||
OpenRCT2::Audio::StopAll();
|
||||
}
|
||||
|
||||
window_invalidate_by_class(WindowClass::TopToolbar);
|
||||
|
||||
StringId stringId = window_save_prompt_labels[EnumValue(_promptMode)][0];
|
||||
if (stringId == STR_LOAD_GAME_PROMPT_TITLE && gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)
|
||||
{
|
||||
stringId = STR_LOAD_LANDSCAPE_PROMPT_TITLE;
|
||||
}
|
||||
else if (stringId == STR_QUIT_GAME_PROMPT_TITLE && gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)
|
||||
{
|
||||
stringId = STR_QUIT_SCENARIO_EDITOR;
|
||||
}
|
||||
window_save_prompt_widgets[WIDX_TITLE].text = stringId;
|
||||
window_save_prompt_widgets[WIDX_LABEL].text = window_save_prompt_labels[EnumValue(_promptMode)][1];
|
||||
}
|
||||
|
||||
void OnClose() override
|
||||
{
|
||||
// Unpause the game
|
||||
if (network_get_mode() == NETWORK_MODE_NONE)
|
||||
{
|
||||
gGamePaused &= ~GAME_PAUSED_MODAL;
|
||||
OpenRCT2::Audio::Resume();
|
||||
}
|
||||
|
||||
window_invalidate_by_class(WindowClass::TopToolbar);
|
||||
}
|
||||
|
||||
void OnMouseUp(WidgetIndex widgetIndex) override
|
||||
{
|
||||
if (gScreenFlags & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER))
|
||||
{
|
||||
switch (widgetIndex)
|
||||
{
|
||||
case WQIDX_OK:
|
||||
game_load_or_quit_no_save_prompt();
|
||||
break;
|
||||
case WQIDX_CLOSE:
|
||||
case WQIDX_CANCEL:
|
||||
Close();
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
switch (widgetIndex)
|
||||
{
|
||||
case WIDX_SAVE:
|
||||
{
|
||||
std::unique_ptr<Intent> intent;
|
||||
|
||||
if (gScreenFlags & (SCREEN_FLAGS_EDITOR))
|
||||
{
|
||||
intent = std::make_unique<Intent>(WindowClass::Loadsave);
|
||||
intent->putExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE);
|
||||
intent->putExtra(INTENT_EXTRA_PATH, gScenarioName);
|
||||
}
|
||||
else
|
||||
{
|
||||
intent = create_save_game_as_intent();
|
||||
}
|
||||
Close();
|
||||
intent->putExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast<void*>(WindowSavePromptCallback));
|
||||
context_open_intent(intent.get());
|
||||
break;
|
||||
}
|
||||
case WIDX_DONT_SAVE:
|
||||
game_load_or_quit_no_save_prompt();
|
||||
return;
|
||||
case WIDX_CLOSE:
|
||||
case WIDX_CANCEL:
|
||||
Close();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void OnDraw(rct_drawpixelinfo& dpi) override
|
||||
{
|
||||
DrawWidgets(dpi);
|
||||
}
|
||||
};
|
||||
|
||||
rct_window* WindowSavePromptOpen()
|
||||
{
|
||||
int32_t width, height;
|
||||
StringId stringId;
|
||||
rct_window* window;
|
||||
PromptMode prompt_mode;
|
||||
rct_widget* widgets;
|
||||
|
||||
prompt_mode = gSavePromptMode;
|
||||
PromptMode prompt_mode = gSavePromptMode;
|
||||
if (prompt_mode == PromptMode::Quit)
|
||||
{
|
||||
prompt_mode = PromptMode::SaveBeforeQuit;
|
||||
}
|
||||
|
||||
// do not show save prompt if we're in the title demo and click on load game
|
||||
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)
|
||||
@@ -119,133 +217,28 @@ rct_window* WindowSavePromptOpen()
|
||||
}
|
||||
|
||||
// Check if window is already open
|
||||
window = window_bring_to_front_by_class(WindowClass::SavePrompt);
|
||||
rct_window* window = window_bring_to_front_by_class(WindowClass::SavePrompt);
|
||||
if (window != nullptr)
|
||||
{
|
||||
window_close(*window);
|
||||
}
|
||||
|
||||
if (gScreenFlags & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER))
|
||||
{
|
||||
widgets = window_quit_prompt_widgets;
|
||||
width = WW_QUIT;
|
||||
height = WH_QUIT;
|
||||
}
|
||||
else
|
||||
{
|
||||
widgets = window_save_prompt_widgets;
|
||||
width = WW_SAVE;
|
||||
height = WH_SAVE;
|
||||
}
|
||||
|
||||
if (EnumValue(prompt_mode) >= std::size(window_save_prompt_labels))
|
||||
{
|
||||
log_warning("Invalid save prompt mode %u", prompt_mode);
|
||||
return nullptr;
|
||||
}
|
||||
window = WindowCreateCentred(
|
||||
width, height, &window_save_prompt_events, WindowClass::SavePrompt, WF_TRANSPARENT | WF_STICK_TO_FRONT);
|
||||
|
||||
window->widgets = widgets;
|
||||
WindowInitScrollWidgets(*window);
|
||||
|
||||
// Pause the game if not network play.
|
||||
if (network_get_mode() == NETWORK_MODE_NONE)
|
||||
int32_t width = WW_SAVE;
|
||||
int32_t height = WH_SAVE;
|
||||
if (gScreenFlags & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER))
|
||||
{
|
||||
gGamePaused |= GAME_PAUSED_MODAL;
|
||||
OpenRCT2::Audio::StopAll();
|
||||
width = WW_QUIT;
|
||||
height = WH_QUIT;
|
||||
}
|
||||
|
||||
window_invalidate_by_class(WindowClass::TopToolbar);
|
||||
|
||||
stringId = window_save_prompt_labels[EnumValue(prompt_mode)][0];
|
||||
if (stringId == STR_LOAD_GAME_PROMPT_TITLE && gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)
|
||||
stringId = STR_LOAD_LANDSCAPE_PROMPT_TITLE;
|
||||
if (stringId == STR_QUIT_GAME_PROMPT_TITLE && gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)
|
||||
stringId = STR_QUIT_SCENARIO_EDITOR;
|
||||
window_save_prompt_widgets[WIDX_TITLE].text = stringId;
|
||||
window_save_prompt_widgets[WIDX_LABEL].text = window_save_prompt_labels[EnumValue(prompt_mode)][1];
|
||||
|
||||
return window;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066DF17
|
||||
*/
|
||||
static void WindowSavePromptClose(rct_window* w)
|
||||
{
|
||||
// Unpause the game
|
||||
if (network_get_mode() == NETWORK_MODE_NONE)
|
||||
{
|
||||
gGamePaused &= ~GAME_PAUSED_MODAL;
|
||||
OpenRCT2::Audio::Resume();
|
||||
}
|
||||
|
||||
window_invalidate_by_class(WindowClass::TopToolbar);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066DDF2
|
||||
*/
|
||||
static void WindowSavePromptMouseup(rct_window* w, WidgetIndex widgetIndex)
|
||||
{
|
||||
if (gScreenFlags & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER))
|
||||
{
|
||||
switch (widgetIndex)
|
||||
{
|
||||
case WQIDX_OK:
|
||||
game_load_or_quit_no_save_prompt();
|
||||
break;
|
||||
case WQIDX_CLOSE:
|
||||
case WQIDX_CANCEL:
|
||||
window_close(*w);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
switch (widgetIndex)
|
||||
{
|
||||
case WIDX_SAVE:
|
||||
{
|
||||
std::unique_ptr<Intent> intent;
|
||||
|
||||
if (gScreenFlags & (SCREEN_FLAGS_EDITOR))
|
||||
{
|
||||
intent = std::make_unique<Intent>(WindowClass::Loadsave);
|
||||
intent->putExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE);
|
||||
intent->putExtra(INTENT_EXTRA_PATH, gScenarioName);
|
||||
}
|
||||
else
|
||||
{
|
||||
intent = create_save_game_as_intent();
|
||||
}
|
||||
window_close(*w);
|
||||
intent->putExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast<void*>(WindowSavePromptCallback));
|
||||
context_open_intent(intent.get());
|
||||
break;
|
||||
}
|
||||
case WIDX_DONT_SAVE:
|
||||
game_load_or_quit_no_save_prompt();
|
||||
return;
|
||||
case WIDX_CLOSE:
|
||||
case WIDX_CANCEL:
|
||||
window_close(*w);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void WindowSavePromptPaint(rct_window* w, rct_drawpixelinfo* dpi)
|
||||
{
|
||||
WindowDrawWidgets(*w, dpi);
|
||||
}
|
||||
|
||||
static void WindowSavePromptCallback(int32_t result, const utf8* path)
|
||||
{
|
||||
if (result == MODAL_RESULT_OK)
|
||||
{
|
||||
game_load_or_quit_no_save_prompt();
|
||||
}
|
||||
auto savePromptWindow = std::make_unique<SavePromptWindow>(prompt_mode);
|
||||
return WindowCreate(
|
||||
std::move(savePromptWindow), WindowClass::SavePrompt, {}, width, height,
|
||||
WF_TRANSPARENT | WF_STICK_TO_FRONT | WF_CENTRE_SCREEN | WF_AUTO_POSITION);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user