Pass name during registration and minor cleanup

This commit is contained in:
ζeh Matt 2021-11-11 15:50:01 +02:00
parent 96e2641d0d
commit c7fa1b44e9
No known key found for this signature in database
GPG Key ID: 18CE582C71A225B0
3 changed files with 114 additions and 277 deletions

View File

@ -158,16 +158,6 @@ namespace GameActions
_actionQueue.clear();
}
void Initialize()
{
static bool initialized = false;
if (initialized)
return;
Register();
initialized = true;
}
GameAction::Ptr Clone(const GameAction* action)
{
std::unique_ptr<GameAction> ga = GameActions::Create(action->GetType());

View File

@ -257,7 +257,6 @@ namespace GameActions
using GameActionFactory = GameAction* (*)();
void Initialize();
void Register();
bool IsValidId(uint32_t id);
const char* GetName(GameCommand id);
@ -285,13 +284,4 @@ namespace GameActions
GameActions::Result::Ptr QueryNested(const GameAction* action);
GameActions::Result::Ptr ExecuteNested(const GameAction* action);
GameActionFactory Register(GameCommand id, GameActionFactory action);
template<typename T> static GameActionFactory Register()
{
GameActionFactory factory = []() -> GameAction* { return new T(); };
Register(T::TYPE, factory);
return factory;
}
} // namespace GameActions

View File

@ -90,11 +90,14 @@
#include "WaterRaiseAction.h"
#include "WaterSetHeightAction.h"
#include <array>
namespace GameActions
{
static GameActionFactory _actions[EnumValue(GameCommand::Count)];
static std::array<GameActionFactory, EnumValue(GameCommand::Count)> _actions{};
static std::array<const char*, EnumValue(GameCommand::Count)> _actionNames{};
GameActionFactory Register(GameCommand id, GameActionFactory factory)
static void Register(GameCommand id, GameActionFactory factory, const char* name)
{
const auto idx = static_cast<size_t>(id);
@ -102,268 +105,114 @@ namespace GameActions
Guard::ArgumentNotNull(factory);
_actions[idx] = factory;
return factory;
_actionNames[idx] = name;
}
template<typename T> static void Register(const char* name)
{
GameActionFactory factory = []() -> GameAction* { return new T(); };
Register(T::TYPE, factory, name);
}
void Register()
{
Register<BalloonPressAction>();
Register<BannerPlaceAction>();
Register<BannerRemoveAction>();
Register<BannerSetColourAction>();
Register<BannerSetNameAction>();
Register<BannerSetStyleAction>();
Register<ClimateSetAction>();
Register<FootpathPlaceAction>();
Register<FootpathPlaceFromTrackAction>();
Register<FootpathRemoveAction>();
Register<FootpathAdditionPlaceAction>();
Register<FootpathAdditionRemoveAction>();
Register<GuestSetNameAction>();
Register<MazePlaceTrackAction>();
Register<MazeSetTrackAction>();
Register<NetworkModifyGroupAction>();
Register<ParkMarketingAction>();
Register<ParkEntranceRemoveAction>();
Register<ParkSetLoanAction>();
Register<ParkSetNameAction>();
Register<ParkSetParameterAction>();
Register<ParkSetResearchFundingAction>();
Register<PeepPickupAction>();
Register<PlaceParkEntranceAction>();
Register<PlacePeepSpawnAction>();
Register<PlayerKickAction>();
Register<PlayerSetGroupAction>();
Register<RideCreateAction>();
Register<RideDemolishAction>();
Register<RideEntranceExitPlaceAction>();
Register<RideEntranceExitRemoveAction>();
Register<RideSetColourSchemeAction>();
Register<RideSetNameAction>();
Register<RideSetPriceAction>();
Register<RideSetStatusAction>();
Register<RideSetAppearanceAction>();
Register<RideSetVehicleAction>();
Register<RideSetSettingAction>();
Register<ScenarioSetSettingAction>();
Register<SetParkEntranceFeeAction>();
Register<SignSetNameAction>();
Register<SignSetStyleAction>();
Register<StaffFireAction>();
Register<StaffHireNewAction>();
Register<StaffSetColourAction>();
Register<StaffSetNameAction>();
Register<StaffSetOrdersAction>();
Register<StaffSetCostumeAction>();
Register<StaffSetPatrolAreaAction>();
Register<SurfaceSetStyleAction>();
Register<WallPlaceAction>();
Register<WallRemoveAction>();
Register<WallSetColourAction>();
Register<SmallSceneryPlaceAction>();
Register<SmallSceneryRemoveAction>();
Register<SmallScenerySetColourAction>();
Register<LargeSceneryPlaceAction>();
Register<LargeSceneryRemoveAction>();
Register<LargeScenerySetColourAction>();
Register<LandBuyRightsAction>();
Register<LandLowerAction>();
Register<LandRaiseAction>();
Register<LandSetHeightAction>();
Register<LandSetRightsAction>();
Register<LandSmoothAction>();
Register<TileModifyAction>();
Register<TrackDesignAction>();
Register<TrackPlaceAction>();
Register<TrackRemoveAction>();
Register<TrackSetBrakeSpeedAction>();
Register<ClearAction>();
Register<PauseToggleAction>();
Register<LoadOrQuitAction>();
Register<WaterSetHeightAction>();
Register<WaterLowerAction>();
Register<WaterRaiseAction>();
Register<GuestSetFlagsAction>();
Register<ParkSetDateAction>();
Register<SetCheatAction>();
Register<ChangeMapSizeAction>();
#define REGISTER_ACTION(type) Register<type>(#type)
REGISTER_ACTION(BalloonPressAction);
REGISTER_ACTION(BannerPlaceAction);
REGISTER_ACTION(BannerRemoveAction);
REGISTER_ACTION(BannerSetColourAction);
REGISTER_ACTION(BannerSetNameAction);
REGISTER_ACTION(BannerSetStyleAction);
REGISTER_ACTION(ClimateSetAction);
REGISTER_ACTION(FootpathPlaceAction);
REGISTER_ACTION(FootpathPlaceFromTrackAction);
REGISTER_ACTION(FootpathRemoveAction);
REGISTER_ACTION(FootpathAdditionPlaceAction);
REGISTER_ACTION(FootpathAdditionRemoveAction);
REGISTER_ACTION(GuestSetNameAction);
REGISTER_ACTION(MazePlaceTrackAction);
REGISTER_ACTION(MazeSetTrackAction);
REGISTER_ACTION(NetworkModifyGroupAction);
REGISTER_ACTION(ParkMarketingAction);
REGISTER_ACTION(ParkEntranceRemoveAction);
REGISTER_ACTION(ParkSetLoanAction);
REGISTER_ACTION(ParkSetNameAction);
REGISTER_ACTION(ParkSetParameterAction);
REGISTER_ACTION(ParkSetResearchFundingAction);
REGISTER_ACTION(PeepPickupAction);
REGISTER_ACTION(PlaceParkEntranceAction);
REGISTER_ACTION(PlacePeepSpawnAction);
REGISTER_ACTION(PlayerKickAction);
REGISTER_ACTION(PlayerSetGroupAction);
REGISTER_ACTION(RideCreateAction);
REGISTER_ACTION(RideDemolishAction);
REGISTER_ACTION(RideEntranceExitPlaceAction);
REGISTER_ACTION(RideEntranceExitRemoveAction);
REGISTER_ACTION(RideSetColourSchemeAction);
REGISTER_ACTION(RideSetNameAction);
REGISTER_ACTION(RideSetPriceAction);
REGISTER_ACTION(RideSetStatusAction);
REGISTER_ACTION(RideSetAppearanceAction);
REGISTER_ACTION(RideSetVehicleAction);
REGISTER_ACTION(RideSetSettingAction);
REGISTER_ACTION(ScenarioSetSettingAction);
REGISTER_ACTION(SetParkEntranceFeeAction);
REGISTER_ACTION(SignSetNameAction);
REGISTER_ACTION(SignSetStyleAction);
REGISTER_ACTION(StaffFireAction);
REGISTER_ACTION(StaffHireNewAction);
REGISTER_ACTION(StaffSetColourAction);
REGISTER_ACTION(StaffSetNameAction);
REGISTER_ACTION(StaffSetOrdersAction);
REGISTER_ACTION(StaffSetCostumeAction);
REGISTER_ACTION(StaffSetPatrolAreaAction);
REGISTER_ACTION(SurfaceSetStyleAction);
REGISTER_ACTION(WallPlaceAction);
REGISTER_ACTION(WallRemoveAction);
REGISTER_ACTION(WallSetColourAction);
REGISTER_ACTION(SmallSceneryPlaceAction);
REGISTER_ACTION(SmallSceneryRemoveAction);
REGISTER_ACTION(SmallScenerySetColourAction);
REGISTER_ACTION(LargeSceneryPlaceAction);
REGISTER_ACTION(LargeSceneryRemoveAction);
REGISTER_ACTION(LargeScenerySetColourAction);
REGISTER_ACTION(LandBuyRightsAction);
REGISTER_ACTION(LandLowerAction);
REGISTER_ACTION(LandRaiseAction);
REGISTER_ACTION(LandSetHeightAction);
REGISTER_ACTION(LandSetRightsAction);
REGISTER_ACTION(LandSmoothAction);
REGISTER_ACTION(TileModifyAction);
REGISTER_ACTION(TrackDesignAction);
REGISTER_ACTION(TrackPlaceAction);
REGISTER_ACTION(TrackRemoveAction);
REGISTER_ACTION(TrackSetBrakeSpeedAction);
REGISTER_ACTION(ClearAction);
REGISTER_ACTION(PauseToggleAction);
REGISTER_ACTION(LoadOrQuitAction);
REGISTER_ACTION(WaterSetHeightAction);
REGISTER_ACTION(WaterLowerAction);
REGISTER_ACTION(WaterRaiseAction);
REGISTER_ACTION(GuestSetFlagsAction);
REGISTER_ACTION(ParkSetDateAction);
REGISTER_ACTION(SetCheatAction);
REGISTER_ACTION(ChangeMapSizeAction);
#ifdef ENABLE_SCRIPTING
Register<CustomAction>();
REGISTER_ACTION(CustomAction);
#endif
#undef REGISTER_ACTION
}
const char* GetName(GameCommand id)
{
switch (id)
{
case GameCommand::SetRideAppearance:
return "SetRideAppearance";
case GameCommand::SetLandHeight:
return "SetLandHeight";
case GameCommand::TogglePause:
return "TogglePause";
case GameCommand::PlaceTrack:
return "PlaceTrack";
case GameCommand::RemoveTrack:
return "RemoveTrack";
case GameCommand::LoadOrQuit:
return "LoadOrQuit";
case GameCommand::CreateRide:
return "CreateRide";
case GameCommand::DemolishRide:
return "DemolishRide";
case GameCommand::SetRideStatus:
return "SetRideStatus";
case GameCommand::SetRideVehicles:
return "SetRideVehicles";
case GameCommand::SetRideName:
return "SetRideName";
case GameCommand::SetRideSetting:
return "SetRideSetting";
case GameCommand::PlaceRideEntranceOrExit:
return "PlaceRideEntranceOrExit";
case GameCommand::RemoveRideEntranceOrExit:
return "RemoveRideEntranceOrExit";
case GameCommand::RemoveScenery:
return "RemoveScenery";
case GameCommand::PlaceScenery:
return "PlaceScenery";
case GameCommand::SetWaterHeight:
return "SetWaterHeight";
case GameCommand::PlacePath:
return "PlacePath";
case GameCommand::PlacePathFromTrack:
return "PlacePathFromTrack";
case GameCommand::RemovePath:
return "RemovePath";
case GameCommand::ChangeSurfaceStyle:
return "ChangeSurfaceStyle";
case GameCommand::SetRidePrice:
return "SetRidePrice";
case GameCommand::SetGuestName:
return "SetGuestName";
case GameCommand::SetStaffName:
return "SetStaffName";
case GameCommand::RaiseLand:
return "RaiseLand";
case GameCommand::LowerLand:
return "LowerLand";
case GameCommand::EditLandSmooth:
return "EditLandSmooth";
case GameCommand::RaiseWater:
return "RaiseWater";
case GameCommand::LowerWater:
return "LowerWater";
case GameCommand::SetBrakesSpeed:
return "SetBrakesSpeed";
case GameCommand::HireNewStaffMember:
return "HireNewStaffMember";
case GameCommand::SetStaffPatrol:
return "SetStaffPatrol";
case GameCommand::FireStaffMember:
return "FireStaffMember";
case GameCommand::SetStaffOrders:
return "SetStaffOrders";
case GameCommand::SetParkName:
return "SetParkName";
case GameCommand::SetParkOpen:
return "SetParkOpen";
case GameCommand::BuyLandRights:
return "BuyLandRights";
case GameCommand::PlaceParkEntrance:
return "PlaceParkEntrance";
case GameCommand::RemoveParkEntrance:
return "RemoveParkEntrance";
case GameCommand::SetMazeTrack:
return "SetMazeTrack";
case GameCommand::SetParkEntranceFee:
return "SetParkEntranceFee";
case GameCommand::SetStaffColour:
return "SetStaffColour";
case GameCommand::PlaceWall:
return "PlaceWall";
case GameCommand::RemoveWall:
return "RemoveWall";
case GameCommand::PlaceLargeScenery:
return "PlaceLargeScenery";
case GameCommand::RemoveLargeScenery:
return "RemoveLargeScenery";
case GameCommand::SetCurrentLoan:
return "SetCurrentLoan";
case GameCommand::SetResearchFunding:
return "SetResearchFunding";
case GameCommand::PlaceTrackDesign:
return "PlaceTrackDesign";
case GameCommand::StartMarketingCampaign:
return "StartMarketingCampaign";
case GameCommand::PlaceMazeDesign:
return "PlaceMazeDesign";
case GameCommand::PlaceBanner:
return "PlaceBanner";
case GameCommand::RemoveBanner:
return "RemoveBanner";
case GameCommand::SetSceneryColour:
return "SetSceneryColour";
case GameCommand::SetWallColour:
return "SetWallColour";
case GameCommand::SetLargeSceneryColour:
return "SetLargeSceneryColour";
case GameCommand::SetBannerColour:
return "SetBannerColour";
case GameCommand::SetLandOwnership:
return "SetLandOwnership";
case GameCommand::ClearScenery:
return "ClearScenery";
case GameCommand::SetBannerName:
return "SetBannerName";
case GameCommand::SetSignName:
return "SetSignName";
case GameCommand::SetBannerStyle:
return "SetBannerStyle";
case GameCommand::SetSignStyle:
return "SetSignStyle";
case GameCommand::SetPlayerGroup:
return "SetPlayerGroup";
case GameCommand::ModifyGroups:
return "ModifyGroups";
case GameCommand::KickPlayer:
return "KickPlayer";
case GameCommand::Cheat:
return "Cheat";
case GameCommand::PickupGuest:
return "PickupGuest";
case GameCommand::PickupStaff:
return "PickupStaff";
case GameCommand::BalloonPress:
return "BalloonPress";
case GameCommand::ModifyTile:
return "ModifyTile";
case GameCommand::EditScenarioOptions:
return "EditScenarioOptions";
case GameCommand::PlacePeepSpawn:
return "PlacePeepSpawn";
case GameCommand::SetClimate:
return "SetClimate";
case GameCommand::SetColourScheme:
return "SetColourScheme";
case GameCommand::SetStaffCostume:
return "SetStaffCostume";
case GameCommand::PlaceFootpathAddition:
return "PlaceFootpathAddition";
case GameCommand::RemoveFootpathAddition:
return "RemoveFootpathAddition";
case GameCommand::GuestSetFlags:
return "GuestSetFlags";
case GameCommand::SetDate:
return "SetDate";
case GameCommand::Custom:
return "Custom";
case GameCommand::ChangeMapSize:
return "ChangeMapSize";
default:
break;
}
return "<error>";
Initialize();
const auto idx = static_cast<size_t>(id);
Guard::IndexInRange(idx, _actionNames);
return _actionNames[idx];
}
std::unique_ptr<GameAction> Create(GameCommand id)
@ -381,9 +230,7 @@ namespace GameActions
result = factory();
}
}
#ifdef _DEBUG
Guard::ArgumentNotNull(result, "Attempting to create unregistered gameaction: %u", id);
#endif
Guard::ArgumentNotNull(result, "Attempting to create unregistered game action: %u", id);
return std::unique_ptr<GameAction>(result);
}
@ -396,4 +243,14 @@ namespace GameActions
return false;
}
void Initialize()
{
static bool initialized = false;
if (initialized)
return;
Register();
initialized = true;
}
} // namespace GameActions