diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index a4ea761a93..998f3bb311 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -412,6 +412,7 @@ declare global { minWidth?: number; minHeight?: number; widgets?: Widget[]; + colours?: number[]; tabs?: Tab[]; onClose?: () => void; diff --git a/src/openrct2-ui/scripting/CustomWindow.cpp b/src/openrct2-ui/scripting/CustomWindow.cpp index 2d9aebd440..a79cf825db 100644 --- a/src/openrct2-ui/scripting/CustomWindow.cpp +++ b/src/openrct2-ui/scripting/CustomWindow.cpp @@ -207,6 +207,7 @@ namespace OpenRCT2::Ui::Windows std::string Title; std::optional Id; std::vector Widgets; + std::vector Colours; CustomWindowDesc() = default; @@ -238,6 +239,19 @@ namespace OpenRCT2::Ui::Windows }); } + if (desc["colours"].is_array()) + { + auto dukColours = desc["colours"].as_array(); + std::transform(dukColours.begin(), dukColours.end(), std::back_inserter(result.Colours), [](const DukValue& w) { + colour_t c = COLOUR_BLACK; + if (w.type() == DukValue::Type::NUMBER) + { + c = static_cast(std::clamp(w.as_int(), COLOUR_BLACK, COLOUR_COUNT - 1)); + } + return c; + }); + } + return result; } @@ -315,9 +329,17 @@ namespace OpenRCT2::Ui::Windows window->number = GetNewWindowNumber(); window->custom_info = new CustomWindowInfo(owner, desc); window->enabled_widgets = (1 << WIDX_CLOSE); + + // Set window colours window->colours[0] = COLOUR_GREY; window->colours[1] = COLOUR_GREY; window->colours[2] = COLOUR_GREY; + auto numColours = std::min(std::size(window->colours), std::size(desc.Colours)); + for (size_t i = 0; i < numColours; i++) + { + window->colours[i] = desc.Colours[i]; + } + if (desc.IsResizable()) { window->min_width = desc.MinWidth.value_or(0); diff --git a/src/openrct2-ui/scripting/ScWindow.hpp b/src/openrct2-ui/scripting/ScWindow.hpp index 490a38fe08..7c81653972 100644 --- a/src/openrct2-ui/scripting/ScWindow.hpp +++ b/src/openrct2-ui/scripting/ScWindow.hpp @@ -98,6 +98,33 @@ namespace OpenRCT2::Scripting return result; } + std::vector colours_get() + { + std::vector result; + auto w = GetWindow(); + if (w != nullptr) + { + result.reserve(std::size(w->colours)); + for (auto c : w->colours) + { + result.push_back(c); + } + } + return result; + } + void colours_set(std::vector colours) + { + auto w = GetWindow(); + if (w != nullptr) + { + for (int32_t i = 0; i < std::size(w->colours); i++) + { + w->colours[i] = i < colours.size() ? std::clamp(colours[i], COLOUR_BLACK, COLOUR_COUNT - 1) + : COLOUR_BLACK; + } + } + } + void close() { auto w = GetWindow(); @@ -141,6 +168,7 @@ namespace OpenRCT2::Scripting dukglue_register_property(ctx, &ScWindow::height_get, nullptr, "height"); dukglue_register_property(ctx, &ScWindow::isSticky_get, nullptr, "isSticky"); dukglue_register_property(ctx, &ScWindow::widgets_get, nullptr, "widgets"); + dukglue_register_property(ctx, &ScWindow::colours_get, &ScWindow::colours_set, "colours"); dukglue_register_method(ctx, &ScWindow::close, "close"); dukglue_register_method(ctx, &ScWindow::findWidget, "findWidget");