diff --git a/src/openrct2/scripting/Duktape.hpp b/src/openrct2/scripting/Duktape.hpp index 2c150d9d5a..280f5293fe 100644 --- a/src/openrct2/scripting/Duktape.hpp +++ b/src/openrct2/scripting/Duktape.hpp @@ -14,4 +14,10 @@ # include # include +template DukValue GetObjectAsDukValue(duk_context* ctx, const std::shared_ptr& value) +{ + dukglue::types::DukType>::template push(ctx, value); + return DukValue::take_from_stack(ctx); +} + #endif diff --git a/src/openrct2/scripting/ScMap.hpp b/src/openrct2/scripting/ScMap.hpp index 94badbfb98..66a9a5ad84 100644 --- a/src/openrct2/scripting/ScMap.hpp +++ b/src/openrct2/scripting/ScMap.hpp @@ -98,7 +98,7 @@ namespace OpenRCT2::Scripting return nullptr; } - std::vector> getAllThings(const std::string& type) + std::vector getAllThings(const std::string& type) { SPRITE_LIST targetList{}; uint8_t targetType{}; @@ -109,7 +109,7 @@ namespace OpenRCT2::Scripting } if (type == "car") { - targetList = SPRITE_LIST_VEHICLE; + targetList = SPRITE_LIST_VEHICLE_HEAD; } else if (type == "litter") { @@ -129,17 +129,45 @@ namespace OpenRCT2::Scripting duk_error(_context, DUK_ERR_ERROR, "Invalid thing type."); } - std::vector> result; + std::vector result; auto spriteId = gSpriteListHead[targetList]; while (spriteId != SPRITE_INDEX_NULL) { auto sprite = get_sprite(spriteId); - if (sprite != nullptr) + if (sprite == nullptr) + { + break; + } + else { // Only the misc list checks the type property if (targetList != SPRITE_LIST_MISC || sprite->generic.type == targetType) { - result.push_back(std::make_shared(spriteId)); + if (targetList == SPRITE_LIST_PEEP) + { + result.push_back(GetObjectAsDukValue(_context, std::make_shared(spriteId))); + } + else if (targetList == SPRITE_LIST_VEHICLE_HEAD) + { + auto carId = spriteId; + while (carId != SPRITE_INDEX_NULL) + { + auto car = get_sprite(carId); + if (car == nullptr) + { + break; + } + else + { + result.push_back(GetObjectAsDukValue(_context, std::make_shared(carId))); + carId = car->vehicle.next_vehicle_on_train; + } + } + } + else + { + result.push_back(GetObjectAsDukValue(_context, std::make_shared(spriteId))); + } } spriteId = sprite->generic.next; } diff --git a/src/openrct2/scripting/ScThing.hpp b/src/openrct2/scripting/ScThing.hpp index 73990147b9..5320af6825 100644 --- a/src/openrct2/scripting/ScThing.hpp +++ b/src/openrct2/scripting/ScThing.hpp @@ -20,7 +20,7 @@ namespace OpenRCT2::Scripting { class ScThing { - private: + protected: uint16_t _id = SPRITE_INDEX_NULL; public: @@ -105,6 +105,30 @@ namespace OpenRCT2::Scripting } } + SpriteBase* GetThing() + { + return &get_sprite(_id)->generic; + } + + public: + static void Register(duk_context* ctx) + { + dukglue_register_property(ctx, &ScThing::type_get, nullptr, "type"); + dukglue_register_property(ctx, &ScThing::x_get, &ScThing::x_set, "x"); + dukglue_register_property(ctx, &ScThing::y_get, &ScThing::y_set, "y"); + dukglue_register_property(ctx, &ScThing::z_get, &ScThing::z_set, "z"); + } + }; + + class ScPeep : public ScThing + { + public: + ScPeep(uint16_t id) + : ScThing(id) + { + } + + private: uint8_t tshirtColour_get() { auto peep = GetPeep(); @@ -134,11 +158,6 @@ namespace OpenRCT2::Scripting } } - SpriteBase* GetThing() - { - return &get_sprite(_id)->generic; - } - Peep* GetPeep() { return get_sprite(_id)->AsPeep(); @@ -147,14 +166,12 @@ namespace OpenRCT2::Scripting public: static void Register(duk_context* ctx) { - dukglue_register_property(ctx, &ScThing::type_get, nullptr, "type"); - dukglue_register_property(ctx, &ScThing::x_get, &ScThing::x_set, "x"); - dukglue_register_property(ctx, &ScThing::y_get, &ScThing::y_set, "y"); - dukglue_register_property(ctx, &ScThing::z_get, &ScThing::z_set, "z"); - dukglue_register_property(ctx, &ScThing::tshirtColour_get, &ScThing::tshirtColour_set, "tshirtColour"); - dukglue_register_property(ctx, &ScThing::trousersColour_get, &ScThing::trousersColour_set, "trousersColour"); + dukglue_set_base_class(ctx); + dukglue_register_property(ctx, &ScPeep::tshirtColour_get, &ScPeep::tshirtColour_set, "tshirtColour"); + dukglue_register_property(ctx, &ScPeep::trousersColour_get, &ScPeep::trousersColour_set, "trousersColour"); } }; + } // namespace OpenRCT2::Scripting #endif diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index 6ce31a317a..f7d72ed029 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -377,6 +377,7 @@ void ScriptEngine::Initialise() ScTile::Register(ctx); ScTileElement::Register(ctx); ScThing::Register(ctx); + ScPeep::Register(ctx); dukglue_register_global(ctx, std::make_shared(_console), "console"); dukglue_register_global(ctx, std::make_shared(_execInfo, _hookEngine), "context");