diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index cf4b622e49..40675311a2 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -41,8 +41,6 @@ #include #include #include -#include -#include #include #include #include @@ -368,27 +366,6 @@ namespace OpenRCT2::Ui::Windows } } - /** - * - * rct2: 0x0066CD9C - */ - void ToggleWaterWindow(WidgetIndex widgetIndex) - { - if ((InputTestFlag(INPUT_FLAG_TOOL_ACTIVE)) && gCurrentToolWidget.window_classification == WindowClass::TopToolbar - && gCurrentToolWidget.widget_index == WIDX_WATER) - { - ToolCancel(); - } - else - { - _landToolBlocked = false; - ShowGridlines(); - ToolSet(*this, widgetIndex, Tool::WaterDown); - InputSetFlag(INPUT_FLAG_6, true); - ContextOpenWindow(WindowClass::Water); - } - } - /** * * rct2: 0x0068E213 @@ -405,128 +382,6 @@ namespace OpenRCT2::Ui::Windows } } - /** - * - * rct2: 0x006E6BDC - */ - void ToolUpdateWater(const ScreenCoordsXY& screenPos) - { - MapInvalidateSelectionRect(); - - if (gCurrentToolId == Tool::UpDownArrow) - { - if (!(gMapSelectFlags & MAP_SELECT_FLAG_ENABLE)) - return; - - auto waterLowerAction = WaterLowerAction( - { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); - auto waterRaiseAction = WaterRaiseAction( - { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); - - auto res = GameActions::Query(&waterLowerAction); - money64 lowerCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; - - res = GameActions::Query(&waterRaiseAction); - money64 raiseCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; - - if (gWaterToolRaiseCost != raiseCost || gWaterToolLowerCost != lowerCost) - { - gWaterToolRaiseCost = raiseCost; - gWaterToolLowerCost = lowerCost; - WindowInvalidateByClass(WindowClass::Water); - } - return; - } - - gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; - - auto info = GetMapCoordinatesFromPos( - screenPos, EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water)); - - if (info.SpriteType == ViewportInteractionItem::None) - { - if (gWaterToolRaiseCost != kMoney64Undefined || gWaterToolLowerCost != kMoney64Undefined) - { - gWaterToolRaiseCost = kMoney64Undefined; - gWaterToolLowerCost = kMoney64Undefined; - WindowInvalidateByClass(WindowClass::Water); - } - return; - } - - auto mapTile = info.Loc; - - uint8_t state_changed = 0; - - if (!(gMapSelectFlags & MAP_SELECT_FLAG_ENABLE)) - { - gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE; - state_changed++; - } - - if (gMapSelectType != MAP_SELECT_TYPE_FULL_WATER) - { - gMapSelectType = MAP_SELECT_TYPE_FULL_WATER; - state_changed++; - } - - uint16_t tool_size = std::max(1, gLandToolSize); - uint16_t tool_length = (tool_size - 1) * kCoordsXYStep; - - // Move to tool bottom left - mapTile.x -= tool_length / 2; - mapTile.y -= tool_length / 2; - - if (gMapSelectPositionA.x != mapTile.x) - { - gMapSelectPositionA.x = mapTile.x; - state_changed++; - } - - if (gMapSelectPositionA.y != mapTile.y) - { - gMapSelectPositionA.y = mapTile.y; - state_changed++; - } - - mapTile.x += tool_length; - mapTile.y += tool_length; - - if (gMapSelectPositionB.x != mapTile.x) - { - gMapSelectPositionB.x = mapTile.x; - state_changed++; - } - - if (gMapSelectPositionB.y != mapTile.y) - { - gMapSelectPositionB.y = mapTile.y; - state_changed++; - } - - MapInvalidateSelectionRect(); - if (!state_changed) - return; - - auto waterLowerAction = WaterLowerAction( - { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); - auto waterRaiseAction = WaterRaiseAction( - { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); - - auto res = GameActions::Query(&waterLowerAction); - money64 lowerCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; - - res = GameActions::Query(&waterRaiseAction); - money64 raiseCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; - - if (gWaterToolRaiseCost != raiseCost || gWaterToolLowerCost != lowerCost) - { - gWaterToolRaiseCost = raiseCost; - gWaterToolLowerCost = lowerCost; - WindowInvalidateByClass(WindowClass::Water); - } - } - /** * * rct2: 0x006E287B @@ -836,50 +691,6 @@ namespace OpenRCT2::Ui::Windows } } - /** - * part of window_top_toolbar_tool_drag(0x0066CB4E) - * rct2: 0x006E6D4B - */ - void WaterToolDrag(const ScreenCoordsXY& screenPos) - { - auto* window = WindowFindFromPoint(screenPos); - if (window == nullptr || window->viewport == nullptr) - return; - - int16_t dx = window->viewport->zoom.ApplyInversedTo(-16); - - auto offsetPos = screenPos - ScreenCoordsXY{ 0, gInputDragLast.y }; - - if (offsetPos.y <= dx) - { - gInputDragLast.y += dx; - - auto waterRaiseAction = WaterRaiseAction( - { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); - GameActions::Execute(&waterRaiseAction); - - gWaterToolRaiseCost = kMoney64Undefined; - gWaterToolLowerCost = kMoney64Undefined; - - return; - } - - dx = -dx; - - if (offsetPos.y >= dx) - { - gInputDragLast.y += dx; - - auto waterLowerAction = WaterLowerAction( - { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); - GameActions::Execute(&waterLowerAction); - gWaterToolRaiseCost = kMoney64Undefined; - gWaterToolLowerCost = kMoney64Undefined; - - return; - } - } - /** * * rct2: 0x006E24F6 @@ -2077,7 +1888,7 @@ namespace OpenRCT2::Ui::Windows ToggleLandWindow(); break; case WIDX_WATER: - ToggleWaterWindow(WIDX_WATER); + ToggleWaterWindow(); break; case WIDX_SCENERY: if (!ToolSet(*this, WIDX_SCENERY, Tool::Arrow)) @@ -2293,9 +2104,6 @@ namespace OpenRCT2::Ui::Windows case WIDX_CLEAR_SCENERY: ToolUpdateSceneryClear(screenCoords); break; - case WIDX_WATER: - ToolUpdateWater(screenCoords); - break; case WIDX_SCENERY: ToolUpdateScenery(screenCoords); break; @@ -2323,16 +2131,6 @@ namespace OpenRCT2::Ui::Windows gCurrentToolId = Tool::Crosshair; } break; - case WIDX_WATER: - if (gMapSelectFlags & MAP_SELECT_FLAG_ENABLE) - { - gCurrentToolId = Tool::UpDownArrow; - } - else - { - _landToolBlocked = true; - } - break; case WIDX_SCENERY: SceneryToolDown(screenCoords, widgetIndex); break; @@ -2360,12 +2158,6 @@ namespace OpenRCT2::Ui::Windows gCurrentToolId = Tool::Crosshair; } break; - case WIDX_WATER: - if (!_landToolBlocked) - { - WaterToolDrag(screenCoords); - } - break; case WIDX_SCENERY: if (gWindowSceneryPaintEnabled & 1) SceneryToolDown(screenCoords, widgetIndex); @@ -2389,11 +2181,6 @@ namespace OpenRCT2::Ui::Windows _landToolBlocked = false; switch (widgetIndex) { - case WIDX_WATER: - MapInvalidateSelectionRect(); - gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; - gCurrentToolId = Tool::WaterDown; - break; case WIDX_CLEAR_SCENERY: MapInvalidateSelectionRect(); gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; @@ -2415,7 +2202,6 @@ namespace OpenRCT2::Ui::Windows { switch (widgetIndex) { - case WIDX_WATER: case WIDX_CLEAR_SCENERY: HideGridlines(); break; @@ -2875,21 +2661,6 @@ namespace OpenRCT2::Ui::Windows return true; } - /** - * - * rct2: 0x0066D125 - */ - bool WaterToolIsActive() - { - if (!(InputTestFlag(INPUT_FLAG_TOOL_ACTIVE))) - return false; - if (gCurrentToolWidget.window_classification != WindowClass::TopToolbar) - return false; - if (gCurrentToolWidget.widget_index != WIDX_WATER) - return false; - return true; - } - void TopToolbar::InitViewMenu(Widget& widget) { using namespace Dropdown; diff --git a/src/openrct2-ui/windows/Water.cpp b/src/openrct2-ui/windows/Water.cpp index c010735ff2..535749d258 100644 --- a/src/openrct2-ui/windows/Water.cpp +++ b/src/openrct2-ui/windows/Water.cpp @@ -12,6 +12,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -181,7 +184,228 @@ static Widget _waterWidgets[] = { ResizeFrame(); } + void OnToolUpdate(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) override + { + switch (widgetIndex) + { + case WIDX_BACKGROUND: + ToolUpdateWater(screenCoords); + break; + } + } + + void OnToolDown(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) override + { + switch (widgetIndex) + { + case WIDX_BACKGROUND: + if (gMapSelectFlags & MAP_SELECT_FLAG_ENABLE) + { + gCurrentToolId = Tool::UpDownArrow; + } + break; + } + } + + void OnToolDrag(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) override + { + switch (widgetIndex) + { + case WIDX_BACKGROUND: + WaterToolDrag(screenCoords); + break; + } + } + + void OnToolUp(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) override + { + switch (widgetIndex) + { + case WIDX_BACKGROUND: + MapInvalidateSelectionRect(); + gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; + gCurrentToolId = Tool::WaterDown; + break; + } + } + + void OnToolAbort(WidgetIndex widgetIndex) override + { + switch (widgetIndex) + { + case WIDX_BACKGROUND: + HideGridlines(); + break; + } + } + private: + /** + * part of window_top_toolbar_tool_drag(0x0066CB4E) + * rct2: 0x006E6D4B + */ + void WaterToolDrag(const ScreenCoordsXY& screenPos) + { + auto* window = WindowFindFromPoint(screenPos); + if (window == nullptr || window->viewport == nullptr) + return; + + int16_t dx = window->viewport->zoom.ApplyInversedTo(-16); + + auto offsetPos = screenPos - ScreenCoordsXY{ 0, gInputDragLast.y }; + + if (offsetPos.y <= dx) + { + gInputDragLast.y += dx; + + auto waterRaiseAction = WaterRaiseAction( + { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); + GameActions::Execute(&waterRaiseAction); + + gWaterToolRaiseCost = kMoney64Undefined; + gWaterToolLowerCost = kMoney64Undefined; + + return; + } + + dx = -dx; + + if (offsetPos.y >= dx) + { + gInputDragLast.y += dx; + + auto waterLowerAction = WaterLowerAction( + { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); + GameActions::Execute(&waterLowerAction); + gWaterToolRaiseCost = kMoney64Undefined; + gWaterToolLowerCost = kMoney64Undefined; + + return; + } + } + + /** + * + * rct2: 0x006E6BDC + */ + void ToolUpdateWater(const ScreenCoordsXY& screenPos) + { + MapInvalidateSelectionRect(); + + if (gCurrentToolId == Tool::UpDownArrow) + { + if (!(gMapSelectFlags & MAP_SELECT_FLAG_ENABLE)) + return; + + auto waterLowerAction = WaterLowerAction( + { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); + auto waterRaiseAction = WaterRaiseAction( + { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); + + auto res = GameActions::Query(&waterLowerAction); + money64 lowerCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + + res = GameActions::Query(&waterRaiseAction); + money64 raiseCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + + if (gWaterToolRaiseCost != raiseCost || gWaterToolLowerCost != lowerCost) + { + gWaterToolRaiseCost = raiseCost; + gWaterToolLowerCost = lowerCost; + WindowInvalidateByClass(WindowClass::Water); + } + return; + } + + gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; + + auto info = GetMapCoordinatesFromPos( + screenPos, EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water)); + + if (info.SpriteType == ViewportInteractionItem::None) + { + if (gWaterToolRaiseCost != kMoney64Undefined || gWaterToolLowerCost != kMoney64Undefined) + { + gWaterToolRaiseCost = kMoney64Undefined; + gWaterToolLowerCost = kMoney64Undefined; + WindowInvalidateByClass(WindowClass::Water); + } + return; + } + + auto mapTile = info.Loc; + + uint8_t state_changed = 0; + + if (!(gMapSelectFlags & MAP_SELECT_FLAG_ENABLE)) + { + gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE; + state_changed++; + } + + if (gMapSelectType != MAP_SELECT_TYPE_FULL_WATER) + { + gMapSelectType = MAP_SELECT_TYPE_FULL_WATER; + state_changed++; + } + + uint16_t tool_size = std::max(1, gLandToolSize); + uint16_t tool_length = (tool_size - 1) * kCoordsXYStep; + + // Move to tool bottom left + mapTile.x -= tool_length / 2; + mapTile.y -= tool_length / 2; + + if (gMapSelectPositionA.x != mapTile.x) + { + gMapSelectPositionA.x = mapTile.x; + state_changed++; + } + + if (gMapSelectPositionA.y != mapTile.y) + { + gMapSelectPositionA.y = mapTile.y; + state_changed++; + } + + mapTile.x += tool_length; + mapTile.y += tool_length; + + if (gMapSelectPositionB.x != mapTile.x) + { + gMapSelectPositionB.x = mapTile.x; + state_changed++; + } + + if (gMapSelectPositionB.y != mapTile.y) + { + gMapSelectPositionB.y = mapTile.y; + state_changed++; + } + + MapInvalidateSelectionRect(); + if (!state_changed) + return; + + auto waterLowerAction = WaterLowerAction( + { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); + auto waterRaiseAction = WaterRaiseAction( + { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); + + auto res = GameActions::Query(&waterLowerAction); + money64 lowerCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + + res = GameActions::Query(&waterRaiseAction); + money64 raiseCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + + if (gWaterToolRaiseCost != raiseCost || gWaterToolLowerCost != lowerCost) + { + gWaterToolRaiseCost = raiseCost; + gWaterToolLowerCost = lowerCost; + WindowInvalidateByClass(WindowClass::Water); + } + } + void InputSize() { Formatter ft; @@ -195,4 +419,38 @@ static Widget _waterWidgets[] = { { return WindowFocusOrCreate(WindowClass::Water, ScreenCoordsXY(ContextGetWidth() - WW, 29), WW, WH, 0); } + + /** + * + * rct2: 0x0066D125 + */ + bool WaterToolIsActive() + { + if (!(InputTestFlag(INPUT_FLAG_TOOL_ACTIVE))) + return false; + if (gCurrentToolWidget.window_classification != WindowClass::Water) + return false; + if (gCurrentToolWidget.widget_index != WIDX_BACKGROUND) + return false; + return true; + } + + /** + * + * rct2: 0x0066CD9C + */ + void ToggleWaterWindow() + { + if (WaterToolIsActive()) + { + ToolCancel(); + } + else + { + ShowGridlines(); + auto* toolWindow = ContextOpenWindow(WindowClass::Water); + ToolSet(*toolWindow, WIDX_BACKGROUND, Tool::WaterDown); + InputSetFlag(INPUT_FLAG_6, true); + } + } } // namespace OpenRCT2::Ui::Windows diff --git a/src/openrct2-ui/windows/Window.h b/src/openrct2-ui/windows/Window.h index 06f6c80e3f..7a6d8a53bc 100644 --- a/src/openrct2-ui/windows/Window.h +++ b/src/openrct2-ui/windows/Window.h @@ -81,7 +81,10 @@ namespace OpenRCT2::Ui::Windows WindowBase* TitleOptionsOpen(); WindowBase* TitleVersionOpen(); WindowBase* ViewportOpen(); + WindowBase* WaterOpen(); + void ToggleWaterWindow(); + WindowBase* ViewClippingOpen(); WindowBase* TransparencyOpen(); WindowBase* AssetPacksOpen();