1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-24 00:03:11 +01:00

Move water tool functions from TopToolbar.cpp into Water.cpp

This commit is contained in:
Aaron van Geffen
2024-07-29 13:17:25 +02:00
parent bae80ecfad
commit bb4a357214
3 changed files with 262 additions and 230 deletions

View File

@@ -41,8 +41,6 @@
#include <openrct2/actions/SmallScenerySetColourAction.h>
#include <openrct2/actions/WallPlaceAction.h>
#include <openrct2/actions/WallSetColourAction.h>
#include <openrct2/actions/WaterLowerAction.h>
#include <openrct2/actions/WaterRaiseAction.h>
#include <openrct2/audio/audio.h>
#include <openrct2/config/Config.h>
#include <openrct2/entity/Staff.h>
@@ -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<uint16_t>(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;

View File

@@ -12,6 +12,9 @@
#include <openrct2-ui/windows/Window.h>
#include <openrct2/Context.h>
#include <openrct2/GameState.h>
#include <openrct2/Input.h>
#include <openrct2/actions/WaterLowerAction.h>
#include <openrct2/actions/WaterRaiseAction.h>
#include <openrct2/drawing/Drawing.h>
#include <openrct2/localisation/Formatter.h>
#include <openrct2/world/Park.h>
@@ -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<uint16_t>(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<WaterWindow>(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

View File

@@ -81,7 +81,10 @@ namespace OpenRCT2::Ui::Windows
WindowBase* TitleOptionsOpen();
WindowBase* TitleVersionOpen();
WindowBase* ViewportOpen();
WindowBase* WaterOpen();
void ToggleWaterWindow();
WindowBase* ViewClippingOpen();
WindowBase* TransparencyOpen();
WindowBase* AssetPacksOpen();