diff --git a/src/openrct2-ui/windows/DemolishRidePrompt.cpp b/src/openrct2-ui/windows/DemolishRidePrompt.cpp old mode 100644 new mode 100755 index a48a278e4c..1bef9d3c0e --- a/src/openrct2-ui/windows/DemolishRidePrompt.cpp +++ b/src/openrct2-ui/windows/DemolishRidePrompt.cpp @@ -19,9 +19,12 @@ static constexpr const int32_t WW = 200; static constexpr const int32_t WH = 100; -static money32 _demolishRideCost; - // clang-format off +enum WindowRideDemolishPage { + WINDOW_RIDE_DEMOLISH, + WINDOW_RIDE_REFURBISH, +}; + enum WindowRideDemolishWidgetIdx { WIDX_BACKGROUND, WIDX_TITLE, @@ -46,147 +49,167 @@ static rct_widget window_ride_refurbish_widgets[] = { WIDGETS_END, }; -static void WindowRideDemolishMouseup(rct_window *w, rct_widgetindex widgetIndex); -static void WindowRideDemolishPaint(rct_window *w, rct_drawpixelinfo *dpi); -static void WindowRideRefurbishMouseup(rct_window *w, rct_widgetindex widgetIndex); -static void WindowRideRefurbishPaint(rct_window *w, rct_drawpixelinfo *dpi); - -//0x0098E2E4 -static rct_window_event_list window_ride_demolish_events([](auto& events) +class DemolishRidePromptWindow final : public Window { - events.mouse_up = &WindowRideDemolishMouseup; - events.paint = &WindowRideDemolishPaint; -}); -// clang-format on + money32 _demolishRideCost; -static rct_window_event_list window_ride_refurbish_events([](auto& events) { - events.mouse_up = &WindowRideRefurbishMouseup; - events.paint = &WindowRideRefurbishPaint; -}); +public: + void SetPageAndCurrentRide(int32_t p, Ride* currentRide) + { + page = p; + rideId = currentRide->id; + _demolishRideCost = -ride_get_refund_price(currentRide); + + switch (page) + { + case WINDOW_RIDE_DEMOLISH: + widgets = window_ride_demolish_widgets; + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CANCEL) | (1ULL << WIDX_DEMOLISH); + break; + case WINDOW_RIDE_REFURBISH: + widgets = window_ride_refurbish_widgets; + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CANCEL) | (1ULL << WIDX_REFURBISH); + break; + } + WindowInitScrollWidgets(this); + } + + void OnMouseUp(rct_widgetindex widgetIndex) override + { + switch (page) + { + case WINDOW_RIDE_DEMOLISH: + OnMouseUpDemolish(widgetIndex); + break; + case WINDOW_RIDE_REFURBISH: + OnMouseUpRefurbish(widgetIndex); + break; + } + } + + void OnDraw(rct_drawpixelinfo& dpi) override + { + switch (page) + { + case WINDOW_RIDE_DEMOLISH: + OnDrawDemolish(&dpi); + break; + case WINDOW_RIDE_REFURBISH: + OnDrawRefurbish(&dpi); + break; + } + } + +private: + void OnMouseUpDemolish(rct_widgetindex widgetIndex) + { + switch (widgetIndex) + { + case WIDX_DEMOLISH: + { + auto* currentRide = get_ride(rideId); + ride_action_modify(currentRide, RIDE_MODIFY_DEMOLISH, GAME_COMMAND_FLAG_APPLY); + break; + } + case WIDX_CANCEL: + case WIDX_CLOSE: + Close(); + break; + } + } + + void OnMouseUpRefurbish(rct_widgetindex widgetIndex) + { + switch (widgetIndex) + { + case WIDX_REFURBISH: + { + auto* currentRide = get_ride(rideId); + ride_action_modify(currentRide, RIDE_MODIFY_RENEW, GAME_COMMAND_FLAG_APPLY); + break; + } + case WIDX_CANCEL: + case WIDX_CLOSE: + Close(); + break; + } + } + + void OnDrawDemolish(rct_drawpixelinfo* dpi) + { + WindowDrawWidgets(this, dpi); + + auto currentRide = get_ride(rideId); + if (currentRide != nullptr) + { + auto stringId = (gParkFlags & PARK_FLAGS_NO_MONEY) ? STR_DEMOLISH_RIDE_ID : STR_DEMOLISH_RIDE_ID_MONEY; + auto ft = Formatter(); + currentRide->FormatNameTo(ft); + ft.Add(_demolishRideCost); + + ScreenCoordsXY stringCoords(windowPos.x + WW / 2, windowPos.y + (WH / 2) - 3); + DrawTextWrapped(dpi, stringCoords, WW - 4, stringId, ft, { TextAlignment::CENTRE }); + } + } + + void OnDrawRefurbish(rct_drawpixelinfo* dpi) + { + WindowDrawWidgets(this, dpi); + + auto currentRide = get_ride(rideId); + if (currentRide != nullptr) + { + auto stringId = (gParkFlags & PARK_FLAGS_NO_MONEY) ? STR_REFURBISH_RIDE_ID_NO_MONEY : STR_REFURBISH_RIDE_ID_MONEY; + auto ft = Formatter(); + currentRide->FormatNameTo(ft); + ft.Add(_demolishRideCost / 2); + + ScreenCoordsXY stringCoords(windowPos.x + WW / 2, windowPos.y + (WH / 2) - 3); + DrawTextWrapped(dpi, stringCoords, WW - 4, stringId, ft, { TextAlignment::CENTRE }); + } + } +}; -/** Based off of rct2: 0x006B486A */ rct_window* WindowRideDemolishPromptOpen(Ride* ride) { rct_window* w; + DemolishRidePromptWindow* newWindow; w = window_find_by_class(WC_DEMOLISH_RIDE_PROMPT); if (w != nullptr) { auto windowPos = w->windowPos; window_close(w); - w = WindowCreate(windowPos, WW, WH, &window_ride_demolish_events, WC_DEMOLISH_RIDE_PROMPT, WF_TRANSPARENT); + newWindow = WindowCreate(WC_DEMOLISH_RIDE_PROMPT, windowPos, WW, WH, WF_TRANSPARENT); } else { - w = WindowCreateCentred(WW, WH, &window_ride_demolish_events, WC_DEMOLISH_RIDE_PROMPT, WF_TRANSPARENT); + newWindow = WindowCreate(WC_DEMOLISH_RIDE_PROMPT, WW, WH, WF_CENTRE_SCREEN | WF_TRANSPARENT); } - w->widgets = window_ride_demolish_widgets; - w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CANCEL) | (1ULL << WIDX_DEMOLISH); - WindowInitScrollWidgets(w); - w->rideId = ride->id; - _demolishRideCost = -ride_get_refund_price(ride); + newWindow->SetPageAndCurrentRide(WINDOW_RIDE_DEMOLISH, ride); - return w; + return newWindow; } rct_window* WindowRideRefurbishPromptOpen(Ride* ride) { rct_window* w; + DemolishRidePromptWindow* newWindow; w = window_find_by_class(WC_DEMOLISH_RIDE_PROMPT); if (w != nullptr) { auto windowPos = w->windowPos; window_close(w); - w = WindowCreate(windowPos, WW, WH, &window_ride_refurbish_events, WC_DEMOLISH_RIDE_PROMPT, WF_TRANSPARENT); + newWindow = WindowCreate(WC_DEMOLISH_RIDE_PROMPT, windowPos, WW, WH, WF_TRANSPARENT); } else { - w = WindowCreateCentred(WW, WH, &window_ride_refurbish_events, WC_DEMOLISH_RIDE_PROMPT, WF_TRANSPARENT); + newWindow = WindowCreate(WC_DEMOLISH_RIDE_PROMPT, WW, WH, WF_CENTRE_SCREEN | WF_TRANSPARENT); } - w->widgets = window_ride_refurbish_widgets; - w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CANCEL) | (1ULL << WIDX_REFURBISH); - WindowInitScrollWidgets(w); - w->rideId = ride->id; - _demolishRideCost = -ride_get_refund_price(ride); + newWindow->SetPageAndCurrentRide(WINDOW_RIDE_REFURBISH, ride); - return w; -} - -/** - * - * rct2: 0x006B4933 - */ -static void WindowRideDemolishMouseup(rct_window* w, rct_widgetindex widgetIndex) -{ - switch (widgetIndex) - { - case WIDX_DEMOLISH: - { - auto ride = get_ride(w->rideId); - ride_action_modify(ride, RIDE_MODIFY_DEMOLISH, GAME_COMMAND_FLAG_APPLY); - break; - } - case WIDX_CANCEL: - case WIDX_CLOSE: - window_close(w); - break; - } -} - -static void WindowRideRefurbishMouseup(rct_window* w, rct_widgetindex widgetIndex) -{ - switch (widgetIndex) - { - case WIDX_REFURBISH: - { - auto ride = get_ride(w->rideId); - ride_action_modify(ride, RIDE_MODIFY_RENEW, GAME_COMMAND_FLAG_APPLY); - break; - } - case WIDX_CANCEL: - case WIDX_CLOSE: - window_close(w); - break; - } -} - -/** - * - * rct2: 0x006B48E5 - */ -static void WindowRideDemolishPaint(rct_window* w, rct_drawpixelinfo* dpi) -{ - WindowDrawWidgets(w, dpi); - - auto ride = get_ride(w->rideId); - if (ride != nullptr) - { - auto stringId = (gParkFlags & PARK_FLAGS_NO_MONEY) ? STR_DEMOLISH_RIDE_ID : STR_DEMOLISH_RIDE_ID_MONEY; - auto ft = Formatter(); - ride->FormatNameTo(ft); - ft.Add(_demolishRideCost); - - ScreenCoordsXY stringCoords(w->windowPos.x + WW / 2, w->windowPos.y + (WH / 2) - 3); - DrawTextWrapped(dpi, stringCoords, WW - 4, stringId, ft, { TextAlignment::CENTRE }); - } -} - -static void WindowRideRefurbishPaint(rct_window* w, rct_drawpixelinfo* dpi) -{ - WindowDrawWidgets(w, dpi); - - auto ride = get_ride(w->rideId); - if (ride != nullptr) - { - auto stringId = (gParkFlags & PARK_FLAGS_NO_MONEY) ? STR_REFURBISH_RIDE_ID_NO_MONEY : STR_REFURBISH_RIDE_ID_MONEY; - auto ft = Formatter(); - ride->FormatNameTo(ft); - ft.Add(_demolishRideCost / 2); - - ScreenCoordsXY stringCoords(w->windowPos.x + WW / 2, w->windowPos.y + (WH / 2) - 3); - DrawTextWrapped(dpi, stringCoords, WW - 4, stringId, ft, { TextAlignment::CENTRE }); - } + return newWindow; }