diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 701aa934af..390921365f 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -2247,12 +2247,47 @@ declare global { type: TitleSequenceCommandType; } + interface LoadTitleSequenceCommand extends TitleSequenceCommand { + type: 'load'; + index: number; + } + interface LocationTitleSequenceCommand extends TitleSequenceCommand { type: 'location'; x: number; y: number; } + interface RotateTitleSequenceCommand extends TitleSequenceCommand { + type: 'rotate'; + rotations: number; + } + + interface ZoomTitleSequenceCommand extends TitleSequenceCommand { + type: 'zoom'; + zoom: number; + } + + interface FollowTitleSequenceCommand extends TitleSequenceCommand { + type: 'follow'; + id: number | null; + } + + interface SpeedTitleSequenceCommand extends TitleSequenceCommand { + type: 'speed'; + speed: number; + } + + interface WaitTitleSequenceCommand extends TitleSequenceCommand { + type: 'wait'; + duration: number; + } + + interface LoadScenarioTitleSequenceCommand extends TitleSequenceCommand { + type: 'loadsc'; + scenario: string; + } + interface TitleSequenceManager { /** * Gets all the available title sequences. diff --git a/src/openrct2-ui/scripting/ScTitleSequence.hpp b/src/openrct2-ui/scripting/ScTitleSequence.hpp index 7ad050d932..42ef8e20f0 100644 --- a/src/openrct2-ui/scripting/ScTitleSequence.hpp +++ b/src/openrct2-ui/scripting/ScTitleSequence.hpp @@ -12,12 +12,77 @@ #ifdef ENABLE_SCRIPTING # include +# include # include # include # include +# include namespace OpenRCT2::Scripting { + template<> DukValue ToDuk(duk_context* ctx, const TitleScript& value) + { + switch (value) + { + case TitleScript::Load: + return ToDuk(ctx, "load"); + case TitleScript::Location: + return ToDuk(ctx, "location"); + case TitleScript::Rotate: + return ToDuk(ctx, "rotate"); + case TitleScript::Zoom: + return ToDuk(ctx, "zoom"); + case TitleScript::Follow: + return ToDuk(ctx, "follow"); + case TitleScript::Speed: + return ToDuk(ctx, "speed"); + case TitleScript::Wait: + return ToDuk(ctx, "wait"); + case TitleScript::LoadSc: + return ToDuk(ctx, "loadsc"); + default: + return ToDuk(ctx, ""); + } + } + + template<> DukValue ToDuk(duk_context* ctx, const TitleCommand& value) + { + DukObject obj(ctx); + obj.Set("type", ToDuk(ctx, value.Type)); + switch (value.Type) + { + case TitleScript::Load: + obj.Set("index", value.SaveIndex); + break; + case TitleScript::Location: + obj.Set("x", value.X); + obj.Set("y", value.Y); + break; + case TitleScript::Rotate: + obj.Set("rotations", value.Rotations); + break; + case TitleScript::Zoom: + obj.Set("zoom", value.Rotations); + break; + case TitleScript::Follow: + if (value.SpriteIndex == SPRITE_INDEX_NULL) + obj.Set("id", nullptr); + else + obj.Set("id", value.SpriteIndex); + break; + case TitleScript::Speed: + obj.Set("speed", value.Speed); + break; + case TitleScript::Wait: + obj.Set("duration", value.Milliseconds); + break; + case TitleScript::LoadSc: + obj.Set("scenario", String::ToStringView(value.Scenario, sizeof(value.Scenario))); + break; + } + return obj.Take(); + } + class ScTitleSequencePark { private: @@ -173,6 +238,23 @@ namespace OpenRCT2::Scripting return result; } + std::vector commands_get() const + { + auto& scriptEngine = GetContext()->GetScriptEngine(); + auto ctx = scriptEngine.GetContext(); + + std::vector result; + auto titleSeq = LoadTitleSequence(_path); + if (titleSeq != nullptr) + { + for (const auto& command : titleSeq->Commands) + { + result.push_back(ToDuk(ctx, command)); + } + } + return result; + } + void addPark(const std::string& path, const std::string& fileName) { auto titleSeq = LoadTitleSequence(_path); @@ -213,6 +295,7 @@ namespace OpenRCT2::Scripting dukglue_register_property(ctx, &ScTitleSequence::isDirectory_get, nullptr, "isDirectory"); dukglue_register_property(ctx, &ScTitleSequence::isReadOnly_get, nullptr, "isReadOnly"); dukglue_register_property(ctx, &ScTitleSequence::parks_get, nullptr, "parks"); + dukglue_register_property(ctx, &ScTitleSequence::commands_get, nullptr, "commands"); dukglue_register_method(ctx, &ScTitleSequence::addPark, "addPark"); dukglue_register_method(ctx, &ScTitleSequence::clone, "clone"); dukglue_register_method(ctx, &ScTitleSequence::delete_, "delete");