Skip to content

Commit

Permalink
Add buttons to make a ride invisible/visible
Browse files Browse the repository at this point in the history
  • Loading branch information
Gymnasiast committed Jan 22, 2025
1 parent 4273bb7 commit 75195bf
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 11 deletions.
4 changes: 4 additions & 0 deletions data/language/en-GB.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3794,3 +3794,7 @@ STR_6728 :Dive Loop (right)
STR_6729 :Cable lift hill must start immediately after station or block brake
STR_6730 :Export emscripten data
STR_6731 :Import emscripten data
STR_6732 :Make invisible
STR_6733 :Makes the whole ride invisible
STR_6734 :Make visible
STR_6735 :Makes the whole ride visible
4 changes: 4 additions & 0 deletions src/openrct2-ui/UiStringIds.h
Original file line number Diff line number Diff line change
Expand Up @@ -1452,6 +1452,10 @@ namespace OpenRCT2
STR_LOSS_PER_ITEM_SOLD = 1857,
STR_MAINTENANCE_OPTIONS_TIP = 1395,
STR_MAIN_COLOUR_SCHEME = 2971,
STR_MAKE_INVISIBLE = 6732,
STR_MAKE_INVISIBLE_TIP = 6733,
STR_MAKE_VISIBLE = 6734,
STR_MAKE_VISIBLE_TIP = 6735,
STR_MAXIMUM_LENGTH_BEFORE_DEPARTING_TIP = 1214,
STR_MAXIMUM_WAITING_TIME = 1212,
STR_MAX_CARS_PER_TRAIN_TIP = 5923,
Expand Down
41 changes: 30 additions & 11 deletions src/openrct2-ui/windows/Ride.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <openrct2/actions/RideSetPriceAction.h>
#include <openrct2/actions/RideSetSettingAction.h>
#include <openrct2/actions/RideSetStatusAction.h>
#include <openrct2/actions/RideSetVisibilityAction.h>
#include <openrct2/audio/audio.h>
#include <openrct2/config/Config.h>
#include <openrct2/core/String.hpp>
Expand Down Expand Up @@ -132,6 +133,8 @@ namespace OpenRCT2::Ui::Windows
WIDX_OPEN_LIGHT,
WIDX_RIDE_TYPE,
WIDX_RIDE_TYPE_DROPDOWN,
WIDX_MAKE_INVISIBLE,
WIDX_MAKE_VISIBLE,

WIDX_VEHICLE_TYPE = 14,
WIDX_VEHICLE_TYPE_DROPDOWN,
Expand Down Expand Up @@ -270,8 +273,10 @@ namespace OpenRCT2::Ui::Windows
MakeWidget({296, 62}, { 14, 14}, WindowWidgetType::ImgBtn, WindowColour::Secondary, ImageId(SPR_G2_RCT1_TEST_BUTTON_0), STR_SIMULATE_RIDE_TIP ),
MakeWidget({296, 62}, { 14, 14}, WindowWidgetType::ImgBtn, WindowColour::Secondary, ImageId(SPR_G2_RCT1_TEST_BUTTON_0), STR_TEST_RIDE_TIP ),
MakeWidget({296, 76}, { 14, 14}, WindowWidgetType::ImgBtn, WindowColour::Secondary, ImageId(SPR_G2_RCT1_OPEN_BUTTON_0), STR_OPEN_RIDE_TIP ),
MakeWidget({ 3, 180}, {305, 12}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_ARG_6_STRINGID ),
MakeWidget({297, 180}, { 11, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH ),
MakeWidget({ 3, 180}, {305, 12}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_ARG_6_STRINGID ),
MakeWidget({297, 180}, { 11, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH ),
MakeWidget({ 3, 195}, {144, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAKE_INVISIBLE, STR_MAKE_INVISIBLE_TIP ),
MakeWidget({153, 195}, {144, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAKE_VISIBLE, STR_MAKE_VISIBLE_TIP ),
};

// 0x009ADDA8
Expand Down Expand Up @@ -1678,6 +1683,18 @@ namespace OpenRCT2::Ui::Windows
}
break;
}
case WIDX_MAKE_INVISIBLE:
{
auto gameAction = RideSetVisibilityAction(rideId, RideSetVisibilityType::Invisible);
GameActions::Execute(&gameAction);
break;
}
case WIDX_MAKE_VISIBLE:
{
auto gameAction = RideSetVisibilityAction(rideId, RideSetVisibilityType::Visible);
GameActions::Execute(&gameAction);
break;
}
}
}

Expand Down Expand Up @@ -1705,7 +1722,7 @@ namespace OpenRCT2::Ui::Windows
}
if (GetGameState().Cheats.allowArbitraryRideTypeChanges)
{
minHeight += 15;
minHeight += 30;
}

flags |= WF_RESIZABLE;
Expand Down Expand Up @@ -1957,7 +1974,7 @@ namespace OpenRCT2::Ui::Windows
Dropdown::SetChecked(pos, true);
for (auto i : indicesToDisable)
{
Dropdown::SetDisabled(i, true);
Dropdown::SetDisabled(static_cast<int32_t>(i), true);
}
}

Expand Down Expand Up @@ -2375,7 +2392,7 @@ namespace OpenRCT2::Ui::Windows

AnchorBorderWidgets();

const int32_t offset = gameState.Cheats.allowArbitraryRideTypeChanges ? 15 : 0;
const int32_t offset = gameState.Cheats.allowArbitraryRideTypeChanges ? 30 : 0;
// Anchor main page specific widgets
widgets[WIDX_VIEWPORT].right = width - 26;
widgets[WIDX_VIEWPORT].bottom = height - (14 + offset);
Expand All @@ -2386,23 +2403,25 @@ namespace OpenRCT2::Ui::Windows
widgets[WIDX_VIEW_DROPDOWN].right = width - 61;
widgets[WIDX_VIEW_DROPDOWN].left = width - 71;
widgets[WIDX_RIDE_TYPE].right = width - 26;
widgets[WIDX_RIDE_TYPE].top = height - 17;
widgets[WIDX_RIDE_TYPE].bottom = height - 4;
widgets[WIDX_RIDE_TYPE_DROPDOWN].left = width - 37;
widgets[WIDX_RIDE_TYPE_DROPDOWN].right = width - 27;
widgets[WIDX_RIDE_TYPE_DROPDOWN].top = height - 16;
widgets[WIDX_RIDE_TYPE_DROPDOWN].bottom = height - 5;
widgets[WIDX_RIDE_TYPE].moveToY(height - 32);
widgets[WIDX_RIDE_TYPE_DROPDOWN].moveTo({ width - 37, height - 31 });
widgets[WIDX_MAKE_INVISIBLE].moveToY(height - 17);
widgets[WIDX_MAKE_VISIBLE].moveToY(height - 17);

if (!gameState.Cheats.allowArbitraryRideTypeChanges)
{
widgets[WIDX_RIDE_TYPE].type = WindowWidgetType::Empty;
widgets[WIDX_RIDE_TYPE_DROPDOWN].type = WindowWidgetType::Empty;
widgets[WIDX_MAKE_INVISIBLE].type = WindowWidgetType::Empty;
widgets[WIDX_MAKE_VISIBLE].type = WindowWidgetType::Empty;
}
else
{
widgets[WIDX_RIDE_TYPE].type = WindowWidgetType::DropdownMenu;
widgets[WIDX_RIDE_TYPE].text = ride->GetRideTypeDescriptor().Naming.Name;
widgets[WIDX_RIDE_TYPE_DROPDOWN].type = WindowWidgetType::Button;
widgets[WIDX_MAKE_INVISIBLE].type = WindowWidgetType::Button;
widgets[WIDX_MAKE_VISIBLE].type = WindowWidgetType::Button;
}

WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_10);
Expand Down
2 changes: 2 additions & 0 deletions src/openrct2/actions/GameActionRegistry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
#include "RideSetSettingAction.h"
#include "RideSetStatusAction.h"
#include "RideSetVehicleAction.h"
#include "RideSetVisibilityAction.h"
#include "ScenarioSetSettingAction.h"
#include "ScenerySetRestrictedAction.h"
#include "SignSetNameAction.h"
Expand Down Expand Up @@ -213,6 +214,7 @@ namespace OpenRCT2::GameActions
REGISTER_ACTION(MapChangeSizeAction);
REGISTER_ACTION(GameSetSpeedAction);
REGISTER_ACTION(ScenerySetRestrictedAction);
REGISTER_ACTION(RideSetVisibilityAction);
#ifdef ENABLE_SCRIPTING
REGISTER_ACTION(CustomAction);
#endif
Expand Down
72 changes: 72 additions & 0 deletions src/openrct2/actions/RideSetVisibilityAction.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*****************************************************************************
* Copyright (c) 2014-2024 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/

#include "RideSetVisibilityAction.h"

#include "../Diagnostic.h"
#include "../GameState.h"
#include "../world/TileElementsView.h"
#include "../world/tile_element/TrackElement.h"
#include "GameAction.h"

using namespace OpenRCT2;

RideSetVisibilityAction::RideSetVisibilityAction(RideId rideIndex, RideSetVisibilityType visiblity)
: _rideIndex(rideIndex)
, _visibility(visiblity)
{
}

void RideSetVisibilityAction::AcceptParameters(GameActionParameterVisitor& visitor)
{
visitor.Visit("ride", _rideIndex);
visitor.Visit("visiblity", _visibility);
}

uint16_t RideSetVisibilityAction::GetActionFlags() const
{
return GameAction::GetActionFlags() | GameActions::Flags::AllowWhilePaused;
}

void RideSetVisibilityAction::Serialise(DataSerialiser& stream)
{
GameAction::Serialise(stream);
stream << DS_TAG(_rideIndex) << DS_TAG(_visibility);
}

GameActions::Result RideSetVisibilityAction::Query() const
{
if (EnumValue(_visibility) >= 2)
{
LOG_ERROR("Invalid visibility type %d", _visibility);
return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_CHANGE_THIS, STR_ERR_VALUE_OUT_OF_RANGE);
}

return GameActions::Result();
}

GameActions::Result RideSetVisibilityAction::Execute() const
{
auto& gameState = GetGameState();
for (int32_t y = 1; y <= gameState.MapSize.y; y++)
{
for (int32_t x = 1; x <= gameState.MapSize.x; x++)
{
for (auto* trackElement : TileElementsView<TrackElement>(TileCoordsXY{ x, y }))
{
if (trackElement->GetRideIndex() == _rideIndex)
{
trackElement->SetInvisible(_visibility == RideSetVisibilityType::Invisible);
}
}
}
}

return GameActions::Result();
}
37 changes: 37 additions & 0 deletions src/openrct2/actions/RideSetVisibilityAction.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*****************************************************************************
* Copyright (c) 2014-2024 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/

#pragma once

#include "GameAction.h"

enum class RideSetVisibilityType : uint8_t
{
Invisible,
Visible,
};

class RideSetVisibilityAction final : public GameActionBase<GameCommand::SetRideVehicles>
{
private:
RideId _rideIndex{ RideId::GetNull() };
RideSetVisibilityType _visibility{};

public:
RideSetVisibilityAction() = default;
RideSetVisibilityAction(RideId rideIndex, RideSetVisibilityType visibility);

void AcceptParameters(GameActionParameterVisitor& visitor) override;

uint16_t GetActionFlags() const override;

void Serialise(DataSerialiser& stream) override;
OpenRCT2::GameActions::Result Query() const override;
OpenRCT2::GameActions::Result Execute() const override;
};
2 changes: 2 additions & 0 deletions src/openrct2/libopenrct2.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@
<ClInclude Include="actions\RideSetColourSchemeAction.h" />
<ClInclude Include="actions\RideSetNameAction.h" />
<ClInclude Include="actions\RideSetPriceAction.h" />
<ClInclude Include="actions\RideSetVisibilityAction.h" />
<ClInclude Include="actions\RideSetSettingAction.h" />
<ClInclude Include="actions\RideSetStatusAction.h" />
<ClInclude Include="actions\RideSetVehicleAction.h" />
Expand Down Expand Up @@ -713,6 +714,7 @@
<ClCompile Include="actions\RideSetSettingAction.cpp" />
<ClCompile Include="actions\RideSetStatusAction.cpp" />
<ClCompile Include="actions\RideSetVehicleAction.cpp" />
<ClCompile Include="actions\RideSetVisibilityAction.cpp" />
<ClCompile Include="actions\ScenarioSetSettingAction.cpp" />
<ClCompile Include="actions\ScenerySetRestrictedAction.cpp" />
<ClCompile Include="actions\SignSetNameAction.cpp" />
Expand Down

0 comments on commit 75195bf

Please sign in to comment.