mirror of https://github.com/OpenRCT2/OpenRCT2.git
110 lines
3.4 KiB
C++
110 lines
3.4 KiB
C++
/*****************************************************************************
|
|
* 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 "ParkEntranceRemoveAction.h"
|
|
|
|
#include "../GameState.h"
|
|
#include "../OpenRCT2.h"
|
|
#include "../management/Finance.h"
|
|
#include "../world/Entrance.h"
|
|
#include "../world/Park.h"
|
|
|
|
using namespace OpenRCT2;
|
|
|
|
ParkEntranceRemoveAction::ParkEntranceRemoveAction(const CoordsXYZ& loc)
|
|
: _loc(loc)
|
|
{
|
|
}
|
|
|
|
void ParkEntranceRemoveAction::AcceptParameters(GameActionParameterVisitor& visitor)
|
|
{
|
|
visitor.Visit(_loc);
|
|
}
|
|
|
|
uint16_t ParkEntranceRemoveAction::GetActionFlags() const
|
|
{
|
|
return GameAction::GetActionFlags() | GameActions::Flags::EditorOnly;
|
|
}
|
|
|
|
void ParkEntranceRemoveAction::Serialise(DataSerialiser& stream)
|
|
{
|
|
GameAction::Serialise(stream);
|
|
|
|
stream << DS_TAG(_loc);
|
|
}
|
|
|
|
GameActions::Result ParkEntranceRemoveAction::Query() const
|
|
{
|
|
if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !GetGameState().Cheats.SandboxMode)
|
|
{
|
|
return GameActions::Result(GameActions::Status::NotInEditorMode, STR_CANT_REMOVE_THIS, STR_NONE);
|
|
}
|
|
|
|
auto res = GameActions::Result();
|
|
res.Expenditure = ExpenditureType::LandPurchase;
|
|
res.Position = _loc;
|
|
res.ErrorTitle = STR_CANT_REMOVE_THIS;
|
|
|
|
if (!LocationValid(_loc))
|
|
{
|
|
return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP);
|
|
}
|
|
if (ParkEntranceGetIndex(_loc) == -1)
|
|
{
|
|
LOG_ERROR("No park entrance at x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z);
|
|
return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_NONE);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
GameActions::Result ParkEntranceRemoveAction::Execute() const
|
|
{
|
|
auto res = GameActions::Result();
|
|
res.Expenditure = ExpenditureType::LandPurchase;
|
|
res.Position = _loc;
|
|
res.ErrorTitle = STR_CANT_REMOVE_THIS;
|
|
|
|
auto entranceIndex = ParkEntranceGetIndex(_loc);
|
|
if (entranceIndex == -1)
|
|
{
|
|
LOG_ERROR("No park entrance at x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z);
|
|
return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_NONE);
|
|
}
|
|
|
|
auto& gameState = GetGameState();
|
|
auto direction = (gameState.Park.Entrances[entranceIndex].direction - 1) & 3;
|
|
|
|
// Centre (sign)
|
|
ParkEntranceRemoveSegment(_loc);
|
|
|
|
// Left post
|
|
ParkEntranceRemoveSegment(
|
|
{ _loc.x + CoordsDirectionDelta[direction].x, _loc.y + CoordsDirectionDelta[direction].y, _loc.z });
|
|
|
|
// Right post
|
|
ParkEntranceRemoveSegment(
|
|
{ _loc.x - CoordsDirectionDelta[direction].x, _loc.y - CoordsDirectionDelta[direction].y, _loc.z });
|
|
|
|
gameState.Park.Entrances.erase(gameState.Park.Entrances.begin() + entranceIndex);
|
|
return res;
|
|
}
|
|
|
|
void ParkEntranceRemoveAction::ParkEntranceRemoveSegment(const CoordsXYZ& loc) const
|
|
{
|
|
auto entranceElement = MapGetParkEntranceElementAt(loc, true);
|
|
if (entranceElement == nullptr)
|
|
{
|
|
return;
|
|
}
|
|
|
|
MapInvalidateTile({ loc, entranceElement->GetBaseZ(), entranceElement->GetClearanceZ() });
|
|
entranceElement->Remove();
|
|
Park::UpdateFences({ loc.x, loc.y });
|
|
}
|