diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 9701d00821..88ba2f9378 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -1470,6 +1470,34 @@ declare global { type StaffType = "handyman" | "mechanic" | "security" | "entertainer"; + /** + * Represents litter entity. + */ + interface Litter extends Entity { + /** + * The type of the litter. + */ + litterType: LitterType; + + /** + * The tick number this entity was created. + */ + creationTime: number; + } + + type LitterType = "vomit" | + "vomit_alt" | + "empty_can" | + "rubbish" | + "burger_box" | + "empty_cup" | + "empty_box" | + "empty_bottle" | + "empty_bowl_red" | + "empty_drink_carton" | + "empty_juice_cup" | + "empty_bowl_blue"; + /** * Network APIs * Use `network.status` to determine whether the current game is a client, server or in single player mode. diff --git a/src/openrct2/scripting/ScEntity.hpp b/src/openrct2/scripting/ScEntity.hpp index 34e3f4ba12..656efd69c7 100644 --- a/src/openrct2/scripting/ScEntity.hpp +++ b/src/openrct2/scripting/ScEntity.hpp @@ -17,6 +17,7 @@ # include "../peep/Staff.h" # include "../util/Util.h" # include "../world/EntityList.h" +# include "../world/Litter.h" # include "../world/Sprite.h" # include "Duktape.hpp" # include "ScRide.hpp" @@ -1244,6 +1245,71 @@ namespace OpenRCT2::Scripting } }; + static const DukEnumMap LitterTypeMap({ + { "vomit", Litter::Type::Vomit }, + { "vomit_alt", Litter::Type::VomitAlt }, + { "empty_can", Litter::Type::EmptyCan }, + { "rubbish", Litter::Type::Rubbish }, + { "burger_box", Litter::Type::BurgerBox }, + { "empty_cup", Litter::Type::EmptyCup }, + { "empty_box", Litter::Type::EmptyBox }, + { "empty_bottle", Litter::Type::EmptyBottle }, + { "empty_bowl_red", Litter::Type::EmptyBowlRed }, + { "empty_drink_carton", Litter::Type::EmptyDrinkCarton }, + { "empty_juice_cup", Litter::Type::EmptyJuiceCup }, + { "empty_bowl_blue", Litter::Type::EmptyBowlBlue }, + }); + + class ScLitter : public ScEntity + { + public: + ScLitter(uint16_t Id) + : ScEntity(Id) + { + } + + static void Register(duk_context* ctx) + { + dukglue_set_base_class(ctx); + dukglue_register_property(ctx, &ScLitter::litterType_get, &ScLitter::litterType_set, "litterType"); + dukglue_register_property(ctx, &ScLitter::creationTick_get, nullptr, "creationTick"); + } + + private: + Litter* GetLitter() const + { + return ::GetEntity(_id); + } + + std::string litterType_get() const + { + auto* litter = GetLitter(); + auto it = LitterTypeMap.find(litter->SubType); + if (it == LitterTypeMap.end()) + return ""; + return std::string{ it->first }; + } + + void litterType_set(const std::string& litterType) + { + ThrowIfGameStateNotMutable(); + + auto it = LitterTypeMap.find(litterType); + if (it == LitterTypeMap.end()) + return; + auto* litter = GetLitter(); + litter->SubType = it->second; + } + + uint32_t creationTick_get() const + { + auto* litter = GetLitter(); + if (litter == nullptr) + return 0; + return litter->creationTick; + } + }; + } // namespace OpenRCT2::Scripting #endif diff --git a/src/openrct2/scripting/ScMap.hpp b/src/openrct2/scripting/ScMap.hpp index d4f90f7220..78e87b0b22 100644 --- a/src/openrct2/scripting/ScMap.hpp +++ b/src/openrct2/scripting/ScMap.hpp @@ -230,7 +230,7 @@ namespace OpenRCT2::Scripting } else if (type == "litter") { - return createEntityType(initializer); + return createEntityType(initializer); } else { @@ -263,6 +263,8 @@ namespace OpenRCT2::Scripting return GetObjectAsDukValue(_context, std::make_shared(spriteId)); case EntityType::Guest: return GetObjectAsDukValue(_context, std::make_shared(spriteId)); + case EntityType::Litter: + return GetObjectAsDukValue(_context, std::make_shared(spriteId)); default: return GetObjectAsDukValue(_context, std::make_shared(spriteId)); }