From 5e3913965de31746c33f09eaa8cb18bf81350cdc Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Mon, 2 Aug 2021 03:34:55 +0300 Subject: [PATCH] Add scripting API to create entities --- distribution/openrct2.d.ts | 1 + src/openrct2/scripting/ScMap.hpp | 76 ++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 720b75e9d7..9701d00821 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -577,6 +577,7 @@ declare global { getAllEntities(type: "peep"): Peep[]; getAllEntities(type: "guest"): Guest[]; getAllEntities(type: "staff"): Staff[]; + createEntity(type: EntityType, initializer: object): Entity; } type TileElementType = diff --git a/src/openrct2/scripting/ScMap.hpp b/src/openrct2/scripting/ScMap.hpp index d3be992d42..d4f90f7220 100644 --- a/src/openrct2/scripting/ScMap.hpp +++ b/src/openrct2/scripting/ScMap.hpp @@ -17,7 +17,11 @@ # include "../world/Balloon.h" # include "../world/Duck.h" # include "../world/EntityList.h" +# include "../world/Fountain.h" +# include "../world/Litter.h" # include "../world/Map.h" +# include "../world/MoneyEffect.h" +# include "../world/Particle.h" # include "Duktape.hpp" # include "ScEntity.hpp" # include "ScRide.hpp" @@ -163,6 +167,77 @@ namespace OpenRCT2::Scripting return result; } + template DukValue createEntityType(const DukValue& initializer) + { + TEntityType* entity = CreateEntity(); + + auto entityPos = CoordsXYZ{ AsOrDefault(initializer["x"], 0), AsOrDefault(initializer["y"], 0), + AsOrDefault(initializer["z"], 0) }; + entity->MoveTo(entityPos); + + return GetObjectAsDukValue(_context, std::make_shared(entity->sprite_index)); + } + + DukValue createEntity(const std::string& type, const DukValue& initializer) + { + if (type == "car") + { + return createEntityType(initializer); + } + else if (type == "staff") + { + return createEntityType(initializer); + } + else if (type == "guest") + { + return createEntityType(initializer); + } + else if (type == "steam_particle") + { + return createEntityType(initializer); + } + else if (type == "money_effect") + { + return createEntityType(initializer); + } + else if (type == "crashed_vehicle_particle") + { + return createEntityType(initializer); + } + else if (type == "explosion_cloud") + { + return createEntityType(initializer); + } + else if (type == "crash_splash") + { + return createEntityType(initializer); + } + else if (type == "explosion_flare") + { + return createEntityType(initializer); + } + else if (type == "balloon") + { + return createEntityType(initializer); + } + else if (type == "duck") + { + return createEntityType(initializer); + } + else if (type == "jumping_fountain") + { + return createEntityType(initializer); + } + else if (type == "litter") + { + return createEntityType(initializer); + } + else + { + duk_error(_context, DUK_ERR_ERROR, "Invalid entity type."); + } + } + static void Register(duk_context* ctx) { dukglue_register_property(ctx, &ScMap::size_get, nullptr, "size"); @@ -173,6 +248,7 @@ namespace OpenRCT2::Scripting dukglue_register_method(ctx, &ScMap::getTile, "getTile"); dukglue_register_method(ctx, &ScMap::getEntity, "getEntity"); dukglue_register_method(ctx, &ScMap::getAllEntities, "getAllEntities"); + dukglue_register_method(ctx, &ScMap::createEntity, "createEntity"); } private: