1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Fix #24077: Track Designer crashes when clicking the park fence

This commit is contained in:
Michael Steenbeek
2025-03-25 21:50:37 +01:00
committed by GitHub
parent 6b57ec82ff
commit 5ad0f5b411
5 changed files with 82 additions and 105 deletions

View File

@@ -30,6 +30,7 @@
- Fix: [#23983] Ordering files by size does not work and occasionally crashes the game.
- Fix: [#24009] [Plugin] The object manager API does not identify recently introduced object types.
- Fix: [#24028] Giga and LSM Launched Coaster booster sprites have pixels that draw over transparent pixels.
- Fix: [#24077] Track Designer crashes when clicking the park fence.
0.4.20 (2025-02-25)
------------------------------------------------------------------------

View File

@@ -78,7 +78,7 @@ namespace OpenRCT2::Editor
// Reset loaded objects to just defaults
// Load minimum required objects (like surface and edge)
for (const auto& entry : MinimumRequiredObjects)
for (const auto& entry : kMinimumRequiredObjects)
{
objectManager.LoadObject(entry);
}

View File

@@ -54,8 +54,8 @@ static int32_t _numAvailableObjectsForType[EnumValue(ObjectType::count)];
static void SetupInUseSelectionFlags();
static void SetupTrackDesignerObjects();
static void SetupTrackManagerObjects();
static void WindowEditorObjectSelectionSelectDefaultObjects();
static void SelectDesignerObjects();
static void selectScenarioEditorObjects();
static void selectTrackDesignerObjects();
static void ReplaceSelectedWaterPalette(const ObjectRepositoryItem* item);
/**
@@ -105,7 +105,7 @@ static void SetupTrackDesignerObjects()
{
int32_t numObjects = static_cast<int32_t>(ObjectRepositoryGetItemsCount());
const ObjectRepositoryItem* items = ObjectRepositoryGetItems();
SelectDesignerObjects();
selectTrackDesignerObjects();
for (int32_t i = 0; i < numObjects; i++)
{
uint8_t* selectionFlags = &_objectSelectionFlags[i];
@@ -344,7 +344,7 @@ void Sub6AB211()
// To prevent it breaking in scenario mode.
if (gLegacyScene == LegacyScene::scenarioEditor)
{
WindowEditorObjectSelectionSelectDefaultObjects();
selectScenarioEditorObjects();
}
}
@@ -431,11 +431,19 @@ void UnloadUnselectedObjects()
*
* rct2: 0x006AA805
*/
static void WindowEditorObjectSelectionSelectDefaultObjects()
static void selectScenarioEditorObjects()
{
if (_numSelectedObjectsForType[0] == 0)
{
for (auto defaultSelectedObject : DefaultSelectedObjects)
for (auto designerSelectedObject : kCommonScenarioAndTrackDesignerObjects)
{
WindowEditorObjectSelectionSelectObject(
0,
INPUT_FLAG_EDITOR_OBJECT_SELECT | INPUT_FLAG_EDITOR_OBJECT_1
| INPUT_FLAG_EDITOR_OBJECT_SELECT_OBJECTS_IN_SCENERY_GROUP,
ObjectEntryDescriptor(designerSelectedObject));
}
for (auto defaultSelectedObject : kDefaultScenarioObjects)
{
WindowEditorObjectSelectionSelectObject(
0,
@@ -446,11 +454,11 @@ static void WindowEditorObjectSelectionSelectDefaultObjects()
}
}
static void SelectDesignerObjects()
static void selectTrackDesignerObjects()
{
if (_numSelectedObjectsForType[0] == 0)
{
for (auto designerSelectedObject : DesignerSelectedObjects)
for (auto designerSelectedObject : kCommonScenarioAndTrackDesignerObjects)
{
WindowEditorObjectSelectionSelectObject(
0,

View File

@@ -11,10 +11,14 @@
#include "Object.h"
// clang-format off
const std::string_view MinimumRequiredObjects[] = { "rct2.terrain_surface.grass", "rct2.terrain_edge.rock" };
constexpr std::array<std::string_view, 3> kMinimumRequiredObjects = {
"rct2.terrain_surface.grass",
"rct2.terrain_edge.rock",
const std::string_view DefaultSelectedObjects[] = {
"rct2.station.plain",
};
constexpr std::array<std::string_view, 82> kCommonScenarioAndTrackDesignerObjects = {
// An initial default selection
"rct2.scenery_group.scgtrees", // Scenery: Trees
"rct2.scenery_group.scgshrub", // Scenery: Shrubs and Ornaments
@@ -22,54 +26,12 @@ const std::string_view DefaultSelectedObjects[] = {
"rct2.scenery_group.scgfence", // Scenery: Fences and Walls
"rct2.scenery_group.scgwalls", // Scenery: Walls and Roofs
"rct2.scenery_group.scgpathx", // Scenery: Signs and Items for Footpaths
"rct2.ride.twist1", // Ride: Twist
"rct2.ride.ptct1", // Ride: Wooden Roller Coaster (Wooden Roller Coaster Trains)
"rct2.ride.zldb", // Ride: Junior Roller Coaster (Ladybird Trains)
"rct2.ride.lfb1", // Ride: Log Flume
"rct2.ride.vcr", // Ride: Vintage Cars
"rct2.ride.mgr1", // Ride: Merry-Go-Round
"rct2.ride.tlt1", // Ride: Toilet
"rct2.ride.atm1", // Ride: Cash Machine
"rct2.ride.faid1", // Ride: First Aid Room
"rct2.ride.infok", // Ride: Information Kiosk
"rct2.ride.drnks", // Ride: Drinks Stall
"rct2.ride.cndyf", // Ride: Candyfloss Stall
"rct2.ride.burgb", // Ride: Burger Bar
"rct2.ride.balln", // Ride: Balloon Stall
"rct2.ride.arrt1", // Ride: Corkscrew Roller Coaster
"rct2.ride.rboat", // Ride: Rowing Boats
"rct2.park_entrance.pkent1", // Park Entrance: Traditional Park Entrance
"rct2.water.wtrcyan", // Water: Natural Water
// The following are for all random map generation features to work out the box
"rct2.scenery_group.scgjungl", // Jungle Theming
"rct2.scenery_group.scgsnow", // Snow and Ice Theming
"rct2.scenery_group.scgwater", // Water Feature Theming
"rct2.park_entrance.pkent1", // Park Entrance: Traditional Park Entrance
// Surfaces
"rct2.terrain_surface.grass",
"rct2.terrain_surface.sand",
"rct2.terrain_surface.dirt",
"rct2.terrain_surface.rock",
"rct2.terrain_surface.martian",
"rct2.terrain_surface.chequerboard",
"rct2.terrain_surface.grass_clumps",
"rct2.terrain_surface.ice",
"rct2.terrain_surface.grid_red",
"rct2.terrain_surface.grid_yellow",
"rct2.terrain_surface.grid_purple",
"rct2.terrain_surface.grid_green",
"rct2.terrain_surface.sand_red",
"rct2.terrain_surface.sand_brown",
// Edges
"rct2.terrain_edge.rock",
"rct2.terrain_edge.wood_red",
"rct2.terrain_edge.wood_black",
"rct2.terrain_edge.ice",
"rct2.water.wtrcyan", // Water: Natural Water
// Stations
"rct2.station.plain",
"rct2.station.wooden",
"rct2.station.canvas_tent",
"rct2.station.castle_grey",
@@ -158,53 +120,46 @@ const std::string_view DefaultSelectedObjects[] = {
"rct2.climate.warm",
};
const std::string_view DesignerSelectedObjects[] = {
// An initial default selection + all standard footpaths + all standard stations
"rct2.scenery_group.scgtrees", // Scenery: Trees
"rct2.scenery_group.scgshrub", // Scenery: Shrubs and Ornaments
"rct2.scenery_group.scggardn", // Scenery: Gardens
"rct2.scenery_group.scgfence", // Scenery: Fences and Walls
"rct2.scenery_group.scgwalls", // Scenery: Walls and Roofs
"rct2.scenery_group.scgpathx", // Scenery: Signs and Items for Footpaths
"rct2.water.wtrcyan", // Water: Natural Water
"rct2.park_entrance.pkent1", // Park Entrance: Traditional Park Entrance
"rct2.terrain_surface.grass",
"rct2.terrain_edge.rock",
constexpr std::array<std::string_view, 37> kDefaultScenarioObjects = {
"rct2.ride.twist1", // Ride: Twist
"rct2.ride.ptct1", // Ride: Wooden Roller Coaster (Wooden Roller Coaster Trains)
"rct2.ride.zldb", // Ride: Junior Roller Coaster (Ladybird Trains)
"rct2.ride.lfb1", // Ride: Log Flume
"rct2.ride.vcr", // Ride: Vintage Cars
"rct2.ride.mgr1", // Ride: Merry-Go-Round
"rct2.ride.tlt1", // Ride: Toilet
"rct2.ride.atm1", // Ride: Cash Machine
"rct2.ride.faid1", // Ride: First Aid Room
"rct2.ride.infok", // Ride: Information Kiosk
"rct2.ride.drnks", // Ride: Drinks Stall
"rct2.ride.cndyf", // Ride: Candyfloss Stall
"rct2.ride.burgb", // Ride: Burger Bar
"rct2.ride.balln", // Ride: Balloon Stall
"rct2.ride.arrt1", // Ride: Corkscrew Roller Coaster
"rct2.ride.rboat", // Ride: Rowing Boats
// Footpath surfaces
"rct2.footpath_surface.tarmac",
"rct2.footpath_surface.tarmac_brown",
"rct2.footpath_surface.tarmac_red",
"rct2.footpath_surface.tarmac_green",
"rct2.footpath_surface.dirt",
"rct2.footpath_surface.crazy_paving",
"rct2.footpath_surface.ash",
"rct2.footpath_surface.queue_blue",
"rct2.footpath_surface.queue_green",
"rct2.footpath_surface.queue_red",
"rct2.footpath_surface.queue_yellow",
// The following are for all random map generation features to work out the box
"rct2.scenery_group.scgjungl", // Jungle Theming
"rct2.scenery_group.scgsnow", // Snow and Ice Theming
"rct2.scenery_group.scgwater", // Water Feature Theming
// Footpath railings
"rct2.footpath_railings.bamboo_black",
"rct2.footpath_railings.bamboo_brown",
"rct2.footpath_railings.concrete",
"rct2.footpath_railings.concrete_green",
"rct2.footpath_railings.space",
"rct2.footpath_railings.wood",
// Surfaces
"rct2.terrain_surface.sand",
"rct2.terrain_surface.dirt",
"rct2.terrain_surface.rock",
"rct2.terrain_surface.martian",
"rct2.terrain_surface.chequerboard",
"rct2.terrain_surface.grass_clumps",
"rct2.terrain_surface.ice",
"rct2.terrain_surface.grid_red",
"rct2.terrain_surface.grid_yellow",
"rct2.terrain_surface.grid_purple",
"rct2.terrain_surface.grid_green",
"rct2.terrain_surface.sand_red",
"rct2.terrain_surface.sand_brown",
// Stations
"rct2.station.plain",
"rct2.station.wooden",
"rct2.station.canvas_tent",
"rct2.station.castle_grey",
"rct2.station.castle_brown",
"rct2.station.jungle",
"rct2.station.log",
"rct2.station.classical",
"rct2.station.abstract",
"rct2.station.snow",
"rct2.station.pagoda",
"rct2.station.space",
// Edges
"rct2.terrain_edge.wood_red",
"rct2.terrain_edge.wood_black",
"rct2.terrain_edge.ice",
};
// clang-format on

View File

@@ -11,6 +11,19 @@
#include "Object.h"
extern const std::string_view MinimumRequiredObjects[2];
extern const std::string_view DefaultSelectedObjects[120];
extern const std::string_view DesignerSelectedObjects[39];
#include <array>
/**
* Used by all editor modes: Scenario Editor, Track Designer and Track Designs Manager.
*/
extern const std::array<std::string_view, 3> kMinimumRequiredObjects;
/**
* Used by the Scenario Editor and Track Designer.
*/
extern const std::array<std::string_view, 82> kCommonScenarioAndTrackDesignerObjects;
/**
* Used only by the Scenario Editor.
*/
extern const std::array<std::string_view, 37> kDefaultScenarioObjects;