1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-06 06:32:56 +01:00

Merge pull request #11635 from IntelOrca/plugin/ride-game-actions

[Plugin] Add named parameters for ride related game actions
This commit is contained in:
Tulio Leao
2020-05-09 10:46:41 -03:00
committed by GitHub
21 changed files with 249 additions and 60 deletions

View File

@@ -297,6 +297,7 @@ declare global {
readonly player: number;
readonly type: string;
readonly isClientOnly: boolean;
readonly args: object;
result: GameActionResult;
}
@@ -313,28 +314,6 @@ declare global {
readonly ride: number;
}
interface RideCreateActionEventArgs extends GameActionEventArgs {
readonly rideType: number;
readonly rideObject: number;
result: RideCreateGameActionResult;
}
interface SmallSceneryPlaceEventArgs extends GameActionEventArgs {
readonly x: number;
readonly y: number;
readonly z: number;
readonly direction: number;
readonly quadrant: number;
readonly object: number;
readonly primaryColour: number;
readonly secondaryColour: number;
}
interface GuestSetNameActionEventArgs extends GameActionEventArgs {
readonly id: number;
readonly name: number;
}
interface NetworkEventArgs {
readonly player: number;
}

View File

@@ -29,6 +29,16 @@ public:
{
}
std::string GetId() const
{
return _id;
}
std::string GetJson() const
{
return _json;
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -148,6 +148,10 @@ class GameActionParameterVisitor
public:
virtual ~GameActionParameterVisitor() = default;
virtual void Visit(const std::string_view& name, bool& param)
{
}
virtual void Visit(const std::string_view& name, int32_t& param)
{
}
@@ -156,6 +160,12 @@ public:
{
}
void Visit(CoordsXY& param)
{
Visit("x", param.x);
Visit("y", param.y);
}
void Visit(CoordsXYZD& param)
{
Visit("x", param.x);
@@ -171,6 +181,11 @@ public:
Visit(name, value);
param = static_cast<T>(value);
}
template<typename T, size_t _TypeID> void Visit(const std::string_view& name, NetworkObjectId_t<T, _TypeID>& param)
{
Visit(name, param.id);
}
};
struct GameAction

View File

@@ -39,7 +39,7 @@ public:
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit("id", _spriteIndex);
visitor.Visit("peep", _spriteIndex);
visitor.Visit("name", _name);
}

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -30,6 +30,13 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit(_loc);
visitor.Visit("ride", _rideIndex);
visitor.Visit("mazeEntry", _mazeEntry);
}
void Serialise(DataSerialiser & stream) override
{
GameAction::Serialise(stream);

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -67,6 +67,14 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit(_loc);
visitor.Visit("ride", _rideIndex);
visitor.Visit("mode", _mode);
visitor.Visit("isInitialPlacement", _initialPlacement);
}
void Serialise(DataSerialiser & stream) override
{
GameAction::Serialise(stream);

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -45,6 +45,12 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit("ride", _rideIndex);
visitor.Visit("modifyType", _modifyType);
}
uint32_t GetCooldownTime() const override
{
return 1000;

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -40,6 +40,15 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit(_loc);
visitor.Visit("direction", _direction);
visitor.Visit("ride", _rideIndex);
visitor.Visit("station", _stationNum);
visitor.Visit("isExit", _isExit);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags();

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -33,6 +33,14 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit(_loc);
visitor.Visit("ride", _rideIndex);
visitor.Visit("station", _stationNum);
visitor.Visit("isExit", _isExit);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags();

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -55,6 +55,14 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit("ride", _rideIndex);
visitor.Visit("type", _type);
visitor.Visit("value", _value);
visitor.Visit("index", _index);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -37,6 +37,13 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit(_loc);
visitor.Visit("trackType", _trackType);
visitor.Visit("colourScheme", _newColourScheme);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -38,6 +38,12 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit("ride", _rideIndex);
visitor.Visit("name", _name);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -41,6 +41,13 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit("ride", _rideIndex);
visitor.Visit("price", _price);
visitor.Visit("isPrimaryPrice", _primaryPrice);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -46,6 +46,13 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit("ride", _rideIndex);
visitor.Visit("setting", _setting);
visitor.Visit("value", _value);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -46,6 +46,12 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit("ride", _rideIndex);
visitor.Visit("status", _status);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -57,6 +57,14 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit("ride", _rideIndex);
visitor.Visit("type", _type);
visitor.Visit("value", _value);
visitor.Visit("colour", _colour);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -50,6 +50,12 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit(_loc);
// TODO visit the track design (it has a lot of sub fields)
}
uint16_t GetActionFlags() const override
{
return GameActionBase::GetActionFlags();

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -74,6 +74,18 @@ public:
_origin.direction &= 3;
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit(_origin);
visitor.Visit("ride", _rideIndex);
visitor.Visit("trackType", _trackType);
visitor.Visit("brakeSpeed", _brakeSpeed);
visitor.Visit("colour", _colour);
visitor.Visit("seatRotation", _seatRotation);
visitor.Visit("trackPlaceFlags", _trackPlaceFlags);
visitor.Visit("isFromTrackDesign", _fromTrackDesign);
}
uint16_t GetActionFlags() const override final
{
return GameAction::GetActionFlags();

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -39,6 +39,13 @@ public:
_origin.direction &= 3;
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit(_origin);
visitor.Visit("trackType", _trackType);
visitor.Visit("sequence", _sequence);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags();

View File

@@ -1,5 +1,5 @@
/*****************************************************************************
* Copyright (c) 2014-2019 OpenRCT2 developers
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -28,6 +28,13 @@ public:
{
}
void AcceptParameters(GameActionParameterVisitor & visitor) override
{
visitor.Visit(_loc);
visitor.Visit("trackType", _trackType);
visitor.Visit("brakeSpeed", _brakeSpeed);
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;

View File

@@ -900,6 +900,11 @@ public:
{
}
void Visit(const std::string_view& name, bool& param) override
{
param = _dukValue[name].as_bool();
}
void Visit(const std::string_view& name, int32_t& param) override
{
param = _dukValue[name].as_int();
@@ -922,6 +927,12 @@ public:
{
}
void Visit(const std::string_view& name, bool& param) override
{
std::string szName(name);
_dukObject.Set(szName.c_str(), param);
}
void Visit(const std::string_view& name, int32_t& param) override
{
std::string szName(name);
@@ -935,6 +946,48 @@ public:
}
};
const static std::unordered_map<std::string, uint32_t> ActionNameToType = {
{ "guestsetname", GAME_COMMAND_SET_GUEST_NAME },
{ "parksetname", GAME_COMMAND_SET_PARK_NAME },
{ "ridecreate", GAME_COMMAND_CREATE_RIDE },
{ "ridedemolish", GAME_COMMAND_DEMOLISH_RIDE },
{ "rideentranceexitplace", GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT },
{ "rideentranceexitremove", GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT },
{ "ridesetappearance", GAME_COMMAND_SET_RIDE_APPEARANCE },
{ "ridesetcolourscheme.hpp", GAME_COMMAND_SET_COLOUR_SCHEME },
{ "ridesetname", GAME_COMMAND_SET_RIDE_NAME },
{ "ridesetprice", GAME_COMMAND_SET_RIDE_PRICE },
{ "ridesetsetting", GAME_COMMAND_SET_RIDE_SETTING },
{ "ridesetstatus", GAME_COMMAND_SET_RIDE_STATUS },
{ "ridesetvehicles", GAME_COMMAND_SET_RIDE_VEHICLES },
{ "smallsceneryplace", GAME_COMMAND_PLACE_SCENERY },
{ "trackdesign", GAME_COMMAND_PLACE_TRACK_DESIGN },
{ "trackplace", GAME_COMMAND_PLACE_TRACK },
{ "trackremove", GAME_COMMAND_REMOVE_TRACK },
{ "tracksetbrakespeed", GAME_COMMAND_SET_BRAKES_SPEED },
};
static std::string GetActionName(uint32_t commandId)
{
auto it = std::find_if(
ActionNameToType.begin(), ActionNameToType.end(), [commandId](const auto& kvp) { return kvp.second == commandId; });
if (it != ActionNameToType.end())
{
return it->first;
}
return {};
}
static std::unique_ptr<GameAction> CreateGameActionFromActionId(const std::string& actionid)
{
auto result = ActionNameToType.find(actionid);
if (result != ActionNameToType.end())
{
return GameActions::Create(result->second);
}
return nullptr;
}
void ScriptEngine::RunGameActionHooks(const GameAction& action, std::unique_ptr<GameActionResult>& result, bool isExecute)
{
DukStackFrame frame(_context);
@@ -943,15 +996,44 @@ void ScriptEngine::RunGameActionHooks(const GameAction& action, std::unique_ptr<
if (_hookEngine.HasSubscriptions(hookType))
{
DukObject obj(_context);
auto actionId = action.GetType();
if (action.GetType() == GAME_COMMAND_CUSTOM)
{
auto customAction = static_cast<const CustomAction&>(action);
obj.Set("action", customAction.GetId());
auto dukArgs = DuktapeTryParseJson(_context, customAction.GetJson());
if (dukArgs)
{
obj.Set("args", *dukArgs);
}
else
{
DukObject args(_context);
obj.Set("args", args.Take());
}
}
else
{
auto actionName = GetActionName(actionId);
if (!actionName.empty())
{
obj.Set("action", actionName);
}
DukObject args(_context);
DukFromGameActionParameterVisitor visitor(args);
const_cast<GameAction&>(action).AcceptParameters(visitor);
obj.Set("args", args.Take());
}
obj.Set("player", action.GetPlayer());
obj.Set("type", action.GetType());
obj.Set("type", actionId);
auto flags = action.GetActionFlags();
obj.Set("isClientOnly", (flags & GA_FLAGS::CLIENT_ONLY) != 0);
DukFromGameActionParameterVisitor visitor(obj);
const_cast<GameAction&>(action).AcceptParameters(visitor);
obj.Set("result", GameActionResultToDuk(action, result));
auto dukEventArgs = obj.Take();
@@ -974,22 +1056,6 @@ void ScriptEngine::RunGameActionHooks(const GameAction& action, std::unique_ptr<
}
}
static std::unique_ptr<GameAction> CreateGameActionFromActionId(const std::string& actionid)
{
const static std::unordered_map<std::string, uint32_t> ActionNameToType = {
{ "parksetname", GAME_COMMAND_SET_PARK_NAME },
{ "smallsceneryplace", GAME_COMMAND_PLACE_SCENERY },
{ "guestsetname", GAME_COMMAND_SET_GUEST_NAME },
};
auto result = ActionNameToType.find(actionid);
if (result != ActionNameToType.end())
{
return GameActions::Create(result->second);
}
return nullptr;
}
std::unique_ptr<GameAction> ScriptEngine::CreateGameAction(const std::string& actionid, const DukValue& args)
{
auto action = CreateGameActionFromActionId(actionid);