diff --git a/src/openrct2-ui/scripting/CustomMenu.cpp b/src/openrct2-ui/scripting/CustomMenu.cpp index 34333ad903..28c3b9d2bf 100644 --- a/src/openrct2-ui/scripting/CustomMenu.cpp +++ b/src/openrct2-ui/scripting/CustomMenu.cpp @@ -51,22 +51,6 @@ namespace OpenRCT2::Scripting return CURSOR_UNDEFINED; } - template<> DukValue ToDuk(duk_context* ctx, const CoordsXY& coords) - { - DukObject dukCoords(ctx); - dukCoords.Set("x", coords.x); - dukCoords.Set("y", coords.y); - return dukCoords.Take(); - } - - template<> DukValue ToDuk(duk_context* ctx, const ScreenCoordsXY& coords) - { - DukObject dukCoords(ctx); - dukCoords.Set("x", coords.x); - dukCoords.Set("y", coords.y); - return dukCoords.Take(); - } - static void RemoveMenuItemsAndTool(std::shared_ptr owner) { if (ActiveCustomTool) diff --git a/src/openrct2/scripting/Duktape.hpp b/src/openrct2/scripting/Duktape.hpp index c3b0e8bf0a..4057c4d013 100644 --- a/src/openrct2/scripting/Duktape.hpp +++ b/src/openrct2/scripting/Duktape.hpp @@ -11,6 +11,8 @@ #ifdef ENABLE_SCRIPTING +# include "../world/Map.h" + # include # include # include @@ -232,6 +234,39 @@ namespace OpenRCT2::Scripting return value ? ToDuk(ctx, *value) : ToDuk(ctx, nullptr); } + template<> CoordsXY inline FromDuk(const DukValue& d) + { + CoordsXY result; + result.x = AsOrDefault(d["x"], 0); + result.y = AsOrDefault(d["y"], 0); + return result; + } + + template<> DukValue inline ToDuk(duk_context* ctx, const CoordsXY& coords) + { + DukObject dukCoords(ctx); + dukCoords.Set("x", coords.x); + dukCoords.Set("y", coords.y); + return dukCoords.Take(); + } + + template<> DukValue inline ToDuk(duk_context* ctx, const CoordsXYZ& coords) + { + DukObject dukCoords(ctx); + dukCoords.Set("x", coords.x); + dukCoords.Set("y", coords.y); + dukCoords.Set("z", coords.z); + return dukCoords.Take(); + } + + template<> DukValue inline ToDuk(duk_context* ctx, const ScreenCoordsXY& coords) + { + DukObject dukCoords(ctx); + dukCoords.Set("x", coords.x); + dukCoords.Set("y", coords.y); + return dukCoords.Take(); + } + } // namespace OpenRCT2::Scripting #endif diff --git a/src/openrct2/scripting/ScEntity.hpp b/src/openrct2/scripting/ScEntity.hpp index d3c36ab107..4cb3360f9b 100644 --- a/src/openrct2/scripting/ScEntity.hpp +++ b/src/openrct2/scripting/ScEntity.hpp @@ -196,6 +196,72 @@ namespace OpenRCT2::Scripting } } + uint32_t flags_get() const + { + auto peep = GetPeep(); + return peep != nullptr ? peep->peep_flags : 0; + } + + void flags_set(uint32_t value) + { + ThrowIfGameStateNotMutable(); + auto peep = GetPeep(); + if (peep != nullptr) + { + peep->peep_flags = value; + peep->Invalidate(); + } + } + + DukValue destination_get() const + { + auto ctx = GetContext()->GetScriptEngine().GetContext(); + auto peep = GetPeep(); + if (peep != nullptr) + { + return ToDuk(ctx, CoordsXY(peep->destination_x, peep->destination_y)); + } + return ToDuk(ctx, nullptr); + } + + void destination_set(const DukValue& value) + { + ThrowIfGameStateNotMutable(); + auto peep = GetPeep(); + if (peep != nullptr) + { + auto pos = FromDuk(value); + peep->destination_x = pos.x; + peep->destination_y = pos.y; + peep->Invalidate(); + } + } + + DukValue pathfindGoal_get() const + { + auto ctx = GetContext()->GetScriptEngine().GetContext(); + auto peep = GetPeep(); + if (peep != nullptr) + { + return ToDuk(ctx, CoordsXY(peep->destination_x, peep->destination_y)); + } + return ToDuk(ctx, nullptr); + } + + void pathfindGoal_set(const DukValue& value) + { + ThrowIfGameStateNotMutable(); + auto peep = GetPeep(); + if (peep != nullptr) + { + auto pos = FromDuk(value); + peep->pathfind_goal.x = pos.x; + peep->pathfind_goal.y = pos.y; + peep->pathfind_goal.z = pos.z; + peep->Invalidate(); + } + } + uint8_t tshirtColour_get() const { auto peep = GetPeep(); @@ -448,6 +514,8 @@ namespace OpenRCT2::Scripting { dukglue_set_base_class(ctx); dukglue_register_property(ctx, &ScPeep::name_get, &ScPeep::name_set, "name"); + dukglue_register_property(ctx, &ScPeep::flags_get, &ScPeep::flags_set, "flags"); + dukglue_register_property(ctx, &ScPeep::destination_get, &ScPeep::destination_set, "destination"); dukglue_register_property(ctx, &ScPeep::tshirtColour_get, &ScPeep::tshirtColour_set, "tshirtColour"); dukglue_register_property(ctx, &ScPeep::trousersColour_get, &ScPeep::trousersColour_set, "trousersColour"); dukglue_register_property(ctx, &ScPeep::energy_get, &ScPeep::energy_set, "energy"); diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index cecf644e19..4232d4adec 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -772,20 +772,6 @@ std::unique_ptr ScriptEngine::DukToGameActionResult(const DukV return result; } -DukValue ScriptEngine::PositionToDuk(const CoordsXYZ& position) -{ - DukStackFrame frame(_context); - duk_context* ctx = _context; - auto obj = duk_push_object(ctx); - duk_push_int(ctx, position.x); - duk_put_prop_string(ctx, obj, "x"); - duk_push_int(ctx, position.y); - duk_put_prop_string(ctx, obj, "y"); - duk_push_int(ctx, position.z); - duk_put_prop_string(ctx, obj, "z"); - return DukValue::take_from_stack(ctx); -} - constexpr static const char* ExpenditureTypes[] = { "ride_construction", "ride_runningcosts", @@ -839,7 +825,7 @@ DukValue ScriptEngine::GameActionResultToDuk(const GameAction& action, const std } if (!result->Position.isNull()) { - obj.Set("position", PositionToDuk(result->Position)); + obj.Set("position", ToDuk(_context, result->Position)); } if (result->Expenditure != ExpenditureType::Count) diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index 30466bce06..f2d771ef07 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -201,7 +201,6 @@ namespace OpenRCT2::Scripting void RemoveCustomGameActions(const std::shared_ptr& plugin); std::unique_ptr DukToGameActionResult(const DukValue& d); DukValue GameActionResultToDuk(const GameAction& action, const std::unique_ptr& result); - DukValue PositionToDuk(const CoordsXYZ& position); static std::string_view ExpenditureTypeToString(ExpenditureType expenditureType); static ExpenditureType StringToExpenditureType(const std::string_view& expenditureType);