Fix #6294: Refactor Editor::SelectedObjects

This commit is contained in:
Michael Steenbeek 2017-11-28 11:20:55 +01:00
parent 66aa25da81
commit 3f8556c85a
6 changed files with 30 additions and 27 deletions

View File

@ -180,10 +180,10 @@ static sint32 research_item_is_always_researched(rct_research_item *researchItem
*/
static void research_rides_setup(){
// Reset all objects to not required
for (uint8 object_type = OBJECT_TYPE_RIDE; object_type < 11; object_type++){
for (uint8 object_type = OBJECT_TYPE_RIDE; object_type < OBJECT_TYPE_COUNT; object_type++){
uint8* in_use = Editor::SelectedObjects[object_type];
for (uint8 num_objects = object_entry_group_counts[object_type]; num_objects != 0; num_objects--){
*in_use++ = 0;
*in_use++ = OBJECT_SELECTION_NOT_SELECTED_OR_REQUIRED;
}
}
@ -191,7 +191,7 @@ static void research_rides_setup(){
for (uint16 rideIndex = 0; rideIndex < 255; rideIndex++){
Ride * ride = get_ride(rideIndex);
if (ride->type == RIDE_TYPE_NULL)continue;
Editor::SelectedObjects[OBJECT_TYPE_RIDE][ride->subtype] |= 1;
Editor::SelectedObjects[OBJECT_TYPE_RIDE][ride->subtype] |= OBJECT_SELECTION_FLAG_SELECTED;
}
for (rct_research_item* research = gResearchItems; research->entryIndex != RESEARCHED_ITEMS_END; research++)
@ -221,7 +221,7 @@ static void research_rides_setup(){
continue;
// If master ride not in use
if (!(Editor::SelectedObjects[OBJECT_TYPE_RIDE][rideType] & (1 << 0)))
if (!(Editor::SelectedObjects[OBJECT_TYPE_RIDE][rideType] & OBJECT_SELECTION_FLAG_SELECTED))
continue;
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++)
@ -242,7 +242,7 @@ static void research_rides_setup(){
if (!master_found){
// If not in use
if (!(Editor::SelectedObjects[OBJECT_TYPE_RIDE][object_index] & (1 << 0))) {
if (!(Editor::SelectedObjects[OBJECT_TYPE_RIDE][object_index] & OBJECT_SELECTION_FLAG_SELECTED)) {
continue;
}

View File

@ -48,7 +48,7 @@ namespace Editor
static uint8 _editorSelectedWaters[MAX_WATER_OBJECTS];
static uint8 _editorSelectedStexs[MAX_SCENARIO_TEXT_OBJECTS];
uint8 * SelectedObjects[OBJECT_ENTRY_GROUP_COUNT] =
uint8 * SelectedObjects[OBJECT_TYPE_COUNT] =
{
_editorSelectedRides,
_editorSelectedSmallScenery,

View File

@ -25,7 +25,7 @@
namespace Editor
{
extern uint8 * SelectedObjects[OBJECT_ENTRY_GROUP_COUNT];
extern uint8 * SelectedObjects[OBJECT_TYPE_COUNT];
void Load();
void ConvertSaveToScenario();

View File

@ -32,7 +32,9 @@ typedef enum
OBJECT_TYPE_SCENERY_GROUP,
OBJECT_TYPE_PARK_ENTRANCE,
OBJECT_TYPE_WATER,
OBJECT_TYPE_SCENARIO_TEXT
OBJECT_TYPE_SCENARIO_TEXT,
OBJECT_TYPE_COUNT
} OBJECT_TYPE;
typedef enum
@ -47,6 +49,8 @@ typedef enum
OBJECT_SELECTION_FLAG_8 = (1 << 7),
} OBJECT_SELECTION_FLAGS;
#define OBJECT_SELECTION_NOT_SELECTED_OR_REQUIRED 0
typedef enum
{
OBJECT_SOURCE_CUSTOM,
@ -55,7 +59,6 @@ typedef enum
OBJECT_SOURCE_RCT2 = 8
} OBJECT_SOURCE_GAME;
#define OBJECT_ENTRY_GROUP_COUNT 11
#define OBJECT_ENTRY_COUNT 721
#pragma pack(push, 1)

View File

@ -162,7 +162,7 @@ sint32 find_object_in_entry_group(const rct_object_entry* entry, uint8* entry_ty
void get_type_entry_index(size_t index, uint8 * outObjectType, uint8 * outEntryIndex)
{
uint8 objectType = OBJECT_TYPE_RIDE;
for (size_t i = 0; i < OBJECT_ENTRY_GROUP_COUNT; i++) {
for (size_t i = 0; i < OBJECT_TYPE_COUNT; i++) {
size_t groupCount = object_entry_group_counts[i];
if (index >= groupCount) {
index -= groupCount;

View File

@ -280,8 +280,8 @@ static sint32 _listSortType = RIDE_SORT_TYPE;
static bool _listSortDescending = false;
static void * _loadedObject = nullptr;
static uint8 * _objectSelectionFlags = nullptr;
static sint32 _numSelectedObjectsForType[11];
static sint32 _numAvailableObjectsForType[11];
static sint32 _numSelectedObjectsForType[OBJECT_TYPE_COUNT];
static sint32 _numAvailableObjectsForType[OBJECT_TYPE_COUNT];
static bool _maxObjectsWasHit;
static void visible_list_dispose()
@ -502,16 +502,16 @@ static void setup_track_designer_objects()
*/
static void setup_in_use_selection_flags()
{
for (uint8 object_type = 0; object_type < 11; object_type++){
for (uint8 object_type = 0; object_type < OBJECT_TYPE_COUNT; object_type++){
for (uint16 i = 0; i < object_entry_group_counts[object_type]; i++){
Editor::SelectedObjects[object_type][i] = 0;
Editor::SelectedObjects[object_type][i] = OBJECT_SELECTION_NOT_SELECTED_OR_REQUIRED;
}
}
for (uint8 object_type = 0; object_type < 11; object_type++){
for (uint8 object_type = 0; object_type < OBJECT_TYPE_COUNT; object_type++){
for (uint16 i = 0; i < object_entry_group_counts[object_type]; i++){
if (object_entry_groups[object_type].chunks[i] != nullptr) {
Editor::SelectedObjects[object_type][i] |= (1 << 1);
Editor::SelectedObjects[object_type][i] |= OBJECT_SELECTION_FLAG_2;
}
}
}
@ -531,43 +531,43 @@ static void setup_in_use_selection_flags()
type = iter.element->properties.path.type;
type >>= 4;
assert(type < object_entry_group_counts[OBJECT_TYPE_PATHS]);
Editor::SelectedObjects[OBJECT_TYPE_PATHS][type] |= (1 << 0);
Editor::SelectedObjects[OBJECT_TYPE_PATHS][type] |= OBJECT_SELECTION_FLAG_SELECTED;
if (footpath_element_has_path_scenery(iter.element)) {
uint8 path_additions = footpath_element_get_path_scenery_index(iter.element);
Editor::SelectedObjects[OBJECT_TYPE_PATH_BITS][path_additions] |= 1;
Editor::SelectedObjects[OBJECT_TYPE_PATH_BITS][path_additions] |= OBJECT_SELECTION_FLAG_SELECTED;
}
break;
case TILE_ELEMENT_TYPE_SMALL_SCENERY:
type = iter.element->properties.scenery.type;
assert(type < object_entry_group_counts[OBJECT_TYPE_SMALL_SCENERY]);
Editor::SelectedObjects[OBJECT_TYPE_SMALL_SCENERY][type] |= (1 << 0);
Editor::SelectedObjects[OBJECT_TYPE_SMALL_SCENERY][type] |= OBJECT_SELECTION_FLAG_SELECTED;
break;
case TILE_ELEMENT_TYPE_ENTRANCE:
if (iter.element->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE)
break;
Editor::SelectedObjects[OBJECT_TYPE_PARK_ENTRANCE][0] |= (1 << 0);
Editor::SelectedObjects[OBJECT_TYPE_PARK_ENTRANCE][0] |= OBJECT_SELECTION_FLAG_SELECTED;
type = iter.element->properties.entrance.path_type;
assert(type < object_entry_group_counts[OBJECT_TYPE_PATHS]);
Editor::SelectedObjects[OBJECT_TYPE_PATHS][type] |= (1 << 0);
Editor::SelectedObjects[OBJECT_TYPE_PATHS][type] |= OBJECT_SELECTION_FLAG_SELECTED;
break;
case TILE_ELEMENT_TYPE_WALL:
type = iter.element->properties.wall.type;
assert(type < object_entry_group_counts[OBJECT_TYPE_WALLS]);
Editor::SelectedObjects[OBJECT_TYPE_WALLS][type] |= (1 << 0);
Editor::SelectedObjects[OBJECT_TYPE_WALLS][type] |= OBJECT_SELECTION_FLAG_SELECTED;
break;
case TILE_ELEMENT_TYPE_LARGE_SCENERY:
type = scenery_large_get_type(iter.element);
assert(type < object_entry_group_counts[OBJECT_TYPE_LARGE_SCENERY]);
Editor::SelectedObjects[OBJECT_TYPE_LARGE_SCENERY][type] |= (1 << 0);
Editor::SelectedObjects[OBJECT_TYPE_LARGE_SCENERY][type] |= OBJECT_SELECTION_FLAG_SELECTED;
break;
case TILE_ELEMENT_TYPE_BANNER:
banner = &gBanners[iter.element->properties.banner.index];
type = banner->type;
assert(type < object_entry_group_counts[OBJECT_TYPE_BANNERS]);
Editor::SelectedObjects[OBJECT_TYPE_BANNERS][type] |= (1 << 0);
Editor::SelectedObjects[OBJECT_TYPE_BANNERS][type] |= OBJECT_SELECTION_FLAG_SELECTED;
break;
}
} while (tile_element_iterator_next(&iter));
@ -576,7 +576,7 @@ static void setup_in_use_selection_flags()
Ride* ride = get_ride(ride_index);
if (ride->type != RIDE_TYPE_NULL) {
uint8 type = ride->subtype;
Editor::SelectedObjects[OBJECT_TYPE_RIDE][type] |= (1 << 0);
Editor::SelectedObjects[OBJECT_TYPE_RIDE][type] |= OBJECT_SELECTION_FLAG_SELECTED;
}
}
@ -589,12 +589,12 @@ static void setup_in_use_selection_flags()
uint8 entryType, entryIndex;
if (find_object_in_entry_group(&item->ObjectEntry, &entryType, &entryIndex)) {
if (Editor::SelectedObjects[entryType][entryIndex] & (1 << 0)) {
if (Editor::SelectedObjects[entryType][entryIndex] & OBJECT_SELECTION_FLAG_SELECTED) {
*selectionFlags |=
OBJECT_SELECTION_FLAG_IN_USE |
OBJECT_SELECTION_FLAG_SELECTED;
}
if (Editor::SelectedObjects[entryType][entryIndex] & (1 << 1)) {
if (Editor::SelectedObjects[entryType][entryIndex] & OBJECT_SELECTION_FLAG_2) {
*selectionFlags |= OBJECT_SELECTION_FLAG_SELECTED;
}
}