From 6c8d199831714f7897277d2cd3cdfd60d02b5de7 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 4 May 2020 22:10:53 +0100 Subject: [PATCH 1/3] Add parameter visitors to ride related actions --- src/openrct2/actions/GameAction.h | 17 ++++++++++- src/openrct2/actions/GuestSetNameAction.hpp | 2 +- src/openrct2/actions/MazePlaceTrackAction.hpp | 9 +++++- src/openrct2/actions/MazeSetTrackAction.hpp | 10 ++++++- src/openrct2/actions/RideDemolishAction.hpp | 8 ++++- .../actions/RideEntranceExitPlaceAction.hpp | 11 ++++++- .../actions/RideEntranceExitRemoveAction.hpp | 10 ++++++- .../actions/RideSetAppearanceAction.hpp | 10 ++++++- src/openrct2/actions/RideSetColourScheme.hpp | 9 +++++- src/openrct2/actions/RideSetName.hpp | 8 ++++- src/openrct2/actions/RideSetPriceAction.hpp | 9 +++++- src/openrct2/actions/RideSetSetting.hpp | 9 +++++- src/openrct2/actions/RideSetStatus.hpp | 8 ++++- .../actions/RideSetVehiclesAction.hpp | 10 ++++++- src/openrct2/actions/TrackDesignAction.h | 7 ++++- src/openrct2/actions/TrackPlaceAction.hpp | 14 ++++++++- src/openrct2/actions/TrackRemoveAction.hpp | 9 +++++- .../actions/TrackSetBrakeSpeedAction.hpp | 9 +++++- src/openrct2/scripting/ScriptEngine.cpp | 30 +++++++++++++++++-- 19 files changed, 179 insertions(+), 20 deletions(-) diff --git a/src/openrct2/actions/GameAction.h b/src/openrct2/actions/GameAction.h index a883485c06..3a86c08890 100644 --- a/src/openrct2/actions/GameAction.h +++ b/src/openrct2/actions/GameAction.h @@ -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(value); } + + template void Visit(const std::string_view& name, NetworkObjectId_t& param) + { + Visit(name, param.id); + } }; struct GameAction diff --git a/src/openrct2/actions/GuestSetNameAction.hpp b/src/openrct2/actions/GuestSetNameAction.hpp index 57d85e0788..fbf295849e 100644 --- a/src/openrct2/actions/GuestSetNameAction.hpp +++ b/src/openrct2/actions/GuestSetNameAction.hpp @@ -39,7 +39,7 @@ public: void AcceptParameters(GameActionParameterVisitor & visitor) override { - visitor.Visit("id", _spriteIndex); + visitor.Visit("peep", _spriteIndex); visitor.Visit("name", _name); } diff --git a/src/openrct2/actions/MazePlaceTrackAction.hpp b/src/openrct2/actions/MazePlaceTrackAction.hpp index f8931d81d0..3197b634c4 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.hpp +++ b/src/openrct2/actions/MazePlaceTrackAction.hpp @@ -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); diff --git a/src/openrct2/actions/MazeSetTrackAction.hpp b/src/openrct2/actions/MazeSetTrackAction.hpp index ed4e3698dd..8b9fa7b102 100644 --- a/src/openrct2/actions/MazeSetTrackAction.hpp +++ b/src/openrct2/actions/MazeSetTrackAction.hpp @@ -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); diff --git a/src/openrct2/actions/RideDemolishAction.hpp b/src/openrct2/actions/RideDemolishAction.hpp index 53612e2a72..0bc5de3bef 100644 --- a/src/openrct2/actions/RideDemolishAction.hpp +++ b/src/openrct2/actions/RideDemolishAction.hpp @@ -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; diff --git a/src/openrct2/actions/RideEntranceExitPlaceAction.hpp b/src/openrct2/actions/RideEntranceExitPlaceAction.hpp index 5118f61a79..da7a5659e6 100644 --- a/src/openrct2/actions/RideEntranceExitPlaceAction.hpp +++ b/src/openrct2/actions/RideEntranceExitPlaceAction.hpp @@ -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(); diff --git a/src/openrct2/actions/RideEntranceExitRemoveAction.hpp b/src/openrct2/actions/RideEntranceExitRemoveAction.hpp index 418c802791..235d632ec1 100644 --- a/src/openrct2/actions/RideEntranceExitRemoveAction.hpp +++ b/src/openrct2/actions/RideEntranceExitRemoveAction.hpp @@ -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(); diff --git a/src/openrct2/actions/RideSetAppearanceAction.hpp b/src/openrct2/actions/RideSetAppearanceAction.hpp index 480c10a33c..48a5dbb0ee 100644 --- a/src/openrct2/actions/RideSetAppearanceAction.hpp +++ b/src/openrct2/actions/RideSetAppearanceAction.hpp @@ -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; diff --git a/src/openrct2/actions/RideSetColourScheme.hpp b/src/openrct2/actions/RideSetColourScheme.hpp index bb95db30d5..8ef66b6184 100644 --- a/src/openrct2/actions/RideSetColourScheme.hpp +++ b/src/openrct2/actions/RideSetColourScheme.hpp @@ -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; diff --git a/src/openrct2/actions/RideSetName.hpp b/src/openrct2/actions/RideSetName.hpp index cfb73dda81..1f12d3aba7 100644 --- a/src/openrct2/actions/RideSetName.hpp +++ b/src/openrct2/actions/RideSetName.hpp @@ -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; diff --git a/src/openrct2/actions/RideSetPriceAction.hpp b/src/openrct2/actions/RideSetPriceAction.hpp index 968b6a8403..b61830f7a8 100644 --- a/src/openrct2/actions/RideSetPriceAction.hpp +++ b/src/openrct2/actions/RideSetPriceAction.hpp @@ -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; diff --git a/src/openrct2/actions/RideSetSetting.hpp b/src/openrct2/actions/RideSetSetting.hpp index 097d0b37fc..ec90231c0a 100644 --- a/src/openrct2/actions/RideSetSetting.hpp +++ b/src/openrct2/actions/RideSetSetting.hpp @@ -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; diff --git a/src/openrct2/actions/RideSetStatus.hpp b/src/openrct2/actions/RideSetStatus.hpp index 2d6a5e61d8..15b5fa716a 100644 --- a/src/openrct2/actions/RideSetStatus.hpp +++ b/src/openrct2/actions/RideSetStatus.hpp @@ -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; diff --git a/src/openrct2/actions/RideSetVehiclesAction.hpp b/src/openrct2/actions/RideSetVehiclesAction.hpp index 299a37f527..8044223f70 100644 --- a/src/openrct2/actions/RideSetVehiclesAction.hpp +++ b/src/openrct2/actions/RideSetVehiclesAction.hpp @@ -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; diff --git a/src/openrct2/actions/TrackDesignAction.h b/src/openrct2/actions/TrackDesignAction.h index 2206959bbc..7575054152 100644 --- a/src/openrct2/actions/TrackDesignAction.h +++ b/src/openrct2/actions/TrackDesignAction.h @@ -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,11 @@ public: { } + void AcceptParameters(GameActionParameterVisitor & visitor) override + { + visitor.Visit(_loc); + } + uint16_t GetActionFlags() const override { return GameActionBase::GetActionFlags(); diff --git a/src/openrct2/actions/TrackPlaceAction.hpp b/src/openrct2/actions/TrackPlaceAction.hpp index ef24a56b4d..41b34a2278 100644 --- a/src/openrct2/actions/TrackPlaceAction.hpp +++ b/src/openrct2/actions/TrackPlaceAction.hpp @@ -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(); diff --git a/src/openrct2/actions/TrackRemoveAction.hpp b/src/openrct2/actions/TrackRemoveAction.hpp index a475e1b933..6c6193dd07 100644 --- a/src/openrct2/actions/TrackRemoveAction.hpp +++ b/src/openrct2/actions/TrackRemoveAction.hpp @@ -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(); diff --git a/src/openrct2/actions/TrackSetBrakeSpeedAction.hpp b/src/openrct2/actions/TrackSetBrakeSpeedAction.hpp index 4764542fd6..c7bb3a5b55 100644 --- a/src/openrct2/actions/TrackSetBrakeSpeedAction.hpp +++ b/src/openrct2/actions/TrackSetBrakeSpeedAction.hpp @@ -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; diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index a52689d934..1a0834f4f8 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -899,6 +899,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(); @@ -921,6 +926,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); @@ -976,9 +987,24 @@ void ScriptEngine::RunGameActionHooks(const GameAction& action, std::unique_ptr< static std::unique_ptr CreateGameActionFromActionId(const std::string& actionid) { const static std::unordered_map ActionNameToType = { - { "parksetname", GAME_COMMAND_SET_PARK_NAME }, - { "smallsceneryplace", GAME_COMMAND_PLACE_SCENERY }, { "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 }, }; auto result = ActionNameToType.find(actionid); From ec7b52d5550a3155304a5e5f62e86c69ea79a425 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 4 May 2020 23:01:17 +0100 Subject: [PATCH 2/3] Add action and args to GameActionResult --- distribution/openrct2.d.ts | 23 +---- src/openrct2/actions/CustomAction.hpp | 10 +++ src/openrct2/scripting/ScriptEngine.cpp | 110 ++++++++++++++++-------- 3 files changed, 86 insertions(+), 57 deletions(-) diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index e68e32010f..37d4e4e48d 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -254,6 +254,7 @@ declare global { readonly player: number; readonly type: string; readonly isClientOnly: boolean; + readonly args: object; result: GameActionResult; } @@ -270,28 +271,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; } diff --git a/src/openrct2/actions/CustomAction.hpp b/src/openrct2/actions/CustomAction.hpp index 3419061a72..0d4b975944 100644 --- a/src/openrct2/actions/CustomAction.hpp +++ b/src/openrct2/actions/CustomAction.hpp @@ -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; diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index 1a0834f4f8..a11b2e92b1 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -945,6 +945,48 @@ public: } }; +const static std::unordered_map 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 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& result, bool isExecute) { DukStackFrame frame(_context); @@ -953,15 +995,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(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(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(action).AcceptParameters(visitor); - obj.Set("result", GameActionResultToDuk(action, result)); auto dukEventArgs = obj.Take(); @@ -984,37 +1055,6 @@ void ScriptEngine::RunGameActionHooks(const GameAction& action, std::unique_ptr< } } -static std::unique_ptr CreateGameActionFromActionId(const std::string& actionid) -{ - const static std::unordered_map 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 }, - }; - - auto result = ActionNameToType.find(actionid); - if (result != ActionNameToType.end()) - { - return GameActions::Create(result->second); - } - return nullptr; -} - std::unique_ptr ScriptEngine::CreateGameAction(const std::string& actionid, const DukValue& args) { auto action = CreateGameActionFromActionId(actionid); From e7a028b3b86c85c930133e630f196dfb4ac37561 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 9 May 2020 14:31:27 +0100 Subject: [PATCH 3/3] Add TODO for Visit track design --- src/openrct2/actions/TrackDesignAction.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/openrct2/actions/TrackDesignAction.h b/src/openrct2/actions/TrackDesignAction.h index 7575054152..a5efc102d3 100644 --- a/src/openrct2/actions/TrackDesignAction.h +++ b/src/openrct2/actions/TrackDesignAction.h @@ -53,6 +53,7 @@ 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