* Allow flag/bitmask coexistence in readers
* Add factory helpers and bulk setters for per-widget flags
* Switch coexistence from OR-both to per-window opt-in
* Migrate seven small windows to per-widget flags
* Migrate seven more windows to per-widget flags
* Migrate Cheats, MapGen and Footpath to per-widget flags
* Fix#26421: scenery tab highlight wraps when there are 64+ groups
* Migrate Ride window to per-widget flags
* Migrate ride and maze construction windows to per-widget flags
* Migrate six more windows to per-widget flags
* Migrate Banner, EditorScenarioOptions and RideList to per-widget flags
* Migrate SceneryScatter and LoadSave to per-widget flags
* Migrate EditorObjectSelection, GameBottomToolbar, Guest, Map, NewRide and Park to per-widget flags
* Migrate TopToolbar, TrackList, Research, Player and Options to per-widget flags
* Opt in remaining windows to per-widget flags
* Narrow getters and setters to per-widget flags
* Remove bitmask fields and useWidgetFlags switch
* Restore switch statements for tab/density pressed state
* Add makeHoldableSpinnerWidgets to drop per-page loops
* Update tests for per-widget flag storage
* Add changelog entry for #26421
* Reword narrative-tense comments from the migration
* Fix clang-format violations
* Remove dead holdable-widget tables from Park and Finances
The scripting engine's `ExecutePluginCall` by default frees its `JSValue` arguments.
When `HookEngine::Call` iterates over multiple subscribers, the first call would free
the argument, leaving subsequent subscribers with an invalid pointer (use-after-free).
This commit fixes the issue by duplicating the `JSValue` for each subscriber and
ensuring the original value is correctly managed based on the `keepArgsAlive` flag.
A new C++ headless test `ScriptingTests.cpp` is added to verify the fix and prevent
future regressions.
Corrupted RCT1/RCT2 save files may contain entities with duplicate or invalid EntityIndex values and when importing these saves, CreateEntityAt returns nullptr for duplicate indices, causing a null pointer dereference crash in ImportEntityCommonProperties, this sanitises each entity's (entities?) EntityIndex to match its array position, so that CreateEntityAt always succeeds. Added unit tests too for just this case, with a crashing save file.
Commit 43f7d2d91 introduced a regression where logicalCmp compared digit starting strings lexicographically instead of numerically, causing folders to sort as "1, 10, 11, 2..." instead of "1, 2... 10, 11". This commit removes the broken special case, the main loop already handles
numeric comparison correctly
* Move Csg unit into OpenRCT2 namespace
* Move G1Element into its own header file
* Clean up SpriteCommands.h
* Add trailing namespace comment to Csg.cpp
* Remove Drawing.h dependency from Graph.h
* Add <memory> include to G1Element.h
* Remove Drawing.h include from ImageTable.h (used by all objects!)
* Drop Drawing.h dependency from OpenGLFramebuffer.h
* Drop Drawing.h dependency from TextureCache.h
* Drop Drawing.h include from TitleScene.h
* Drop Drawing.h dependency from Widget.h
* Add <optional> include to SpriteFile.h
* Add Drawing.h to PlayTests, S6ImportExportTests
* Include <cstdint> in TitleScene.h for SIZE_MAX