diff --git a/src/ride/ride.c b/src/ride/ride.c index 793344d72b..fd137ae8bc 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -199,7 +199,7 @@ rct_ride *get_ride(int index) rct_ride_entry *get_ride_entry(int index) { - if (index < 0 || index >= object_entry_group_counts[0]) + if (index < 0 || index >= object_entry_group_counts[OBJECT_TYPE_RIDE]) { log_error("invalid index %d for ride type", index); return NULL; @@ -207,6 +207,19 @@ rct_ride_entry *get_ride_entry(int index) return gRideTypeList[index]; } +void get_ride_entry_name(char *name, int index) +{ + if (index < 0 || index >= object_entry_group_counts[OBJECT_TYPE_RIDE]) + { + log_error("invalid index %d for ride type", index); + return; + } + + const char *entryName = object_entry_groups[OBJECT_TYPE_RIDE].entries[index].name; + memcpy(name, entryName, 8); + name[8] = '\0'; +} + rct_ride_measurement *get_ride_measurement(int index) { return &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_MEASUREMENTS, rct_ride_measurement)[index]); diff --git a/src/ride/ride.h b/src/ride/ride.h index e4ab9c6d49..278f0aa4de 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -874,6 +874,7 @@ enum { /** Helper macros until rides are stored in this module. */ rct_ride *get_ride(int index); rct_ride_entry *get_ride_entry(int index); +void get_ride_entry_name(char *name, int index); rct_ride_measurement *get_ride_measurement(int index); /** diff --git a/src/ride/track_design.h b/src/ride/track_design.h index 8323254ab3..d7dad00e36 100644 --- a/src/ride/track_design.h +++ b/src/ride/track_design.h @@ -124,6 +124,7 @@ int sub_6D01B3(rct_track_td6 *td6, uint8 bl, uint8 rideIndex, int x, int y, int int install_track(char* source_path, char* dest_name); void track_design_index_create(); +size_t track_design_index_get_count_for_ride(uint8 rideType, const char *entry); size_t track_design_index_get_for_ride(track_design_file_ref **tdRefs, uint8 rideType, const char *entry); utf8 *track_design_get_name_from_path(const utf8 *path); diff --git a/src/ride/track_list.c b/src/ride/track_list.c index a6e168582f..db12157800 100644 --- a/src/ride/track_list.c +++ b/src/ride/track_list.c @@ -10,6 +10,7 @@ typedef struct { utf8 path[MAX_PATH]; } td_index_item; +static bool track_design_index_read_header(SDL_RWops *file, uint32 *tdidxCount); static void track_design_index_scan(); static int track_design_index_item_compare(const void *a, const void *b); static void track_design_index_include(const utf8 *directory); @@ -47,6 +48,36 @@ void track_design_index_create() } } +size_t track_design_index_get_count_for_ride(uint8 rideType, const char *entry) +{ + log_verbose("reading track design index (tracks.idx)"); + + utf8 path[MAX_PATH]; + track_design_index_get_path(path, sizeof(path)); + + // Return list + size_t refsCount = 0; + SDL_RWops *file = SDL_RWFromFile(path, "rb"); + if (file != NULL) { + uint32 tdidxCount; + if (!track_design_index_read_header(file, &tdidxCount)) { + SDL_RWclose(file); + return 0; + } + + for (uint32 i = 0; i < tdidxCount; i++) { + td_index_item tdItem; + SDL_RWread(file, &tdItem, sizeof(td_index_item), 1); + + if (tdItem.ride_type != rideType) continue; + if (entry != NULL && _strcmpi(entry, tdItem.ride_entry) != 0) continue; + refsCount++; + } + } + + return refsCount; +} + size_t track_design_index_get_for_ride(track_design_file_ref **tdRefs, uint8 rideType, const char *entry) { log_verbose("reading track design index (tracks.idx)"); @@ -61,17 +92,8 @@ size_t track_design_index_get_for_ride(track_design_file_ref **tdRefs, uint8 rid SDL_RWops *file = SDL_RWFromFile(path, "rb"); if (file != NULL) { - uint32 tdidxMagicNumber, tdidxVersion, tdidxCount; - SDL_RWread(file, &tdidxMagicNumber, 4, 1); - SDL_RWread(file, &tdidxVersion, 4, 1); - SDL_RWread(file, &tdidxCount, 4, 1); - if (tdidxMagicNumber != TrackIndexMagicNumber) { - log_error("invalid track index file"); - SDL_RWclose(file); - return 0; - } - if (tdidxVersion != TrackIndexVersion) { - log_error("unsupported track index file version"); + uint32 tdidxCount; + if (!track_design_index_read_header(file, &tdidxCount)) { SDL_RWclose(file); return 0; } @@ -115,6 +137,23 @@ utf8 *track_design_get_name_from_path(const utf8 *path) return strndup(filename, nameLength); } +static bool track_design_index_read_header(SDL_RWops *file, uint32 *tdidxCount) +{ + uint32 tdidxMagicNumber, tdidxVersion; + SDL_RWread(file, &tdidxMagicNumber, 4, 1); + SDL_RWread(file, &tdidxVersion, 4, 1); + SDL_RWread(file, tdidxCount, 4, 1); + if (tdidxMagicNumber != TrackIndexMagicNumber) { + log_error("invalid track index file"); + return false; + } + if (tdidxVersion != TrackIndexVersion) { + log_error("unsupported track index file version"); + return false; + } + return true; +} + static void track_design_index_scan() { utf8 directory[MAX_PATH]; diff --git a/src/windows/install_track.c b/src/windows/install_track.c index 7ee042f31e..d86d4ce8df 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -150,7 +150,7 @@ void window_install_track_open(const char* path) static void window_install_track_select(rct_window *w, int index) { utf8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, utf8); - rct_track_design *trackDesign; + // rct_track_design *trackDesign; w->track_list.var_480 = index; diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 8c1281ca95..30c08b0303 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -842,15 +842,17 @@ static ride_list_item window_new_ride_scroll_get_ride_list_item_at(rct_window *w static int get_num_track_designs(ride_list_item item) { - // track_load_list(item); - - char *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, char); - int count = 0; - while (*trackDesignList != 0 && trackDesignList < (char*)0x00F635EC) { - trackDesignList += 128; - count++; + char entry[9]; + const char *entryPtr = NULL; + if (item.type < 0x80) { + rct_ride_entry *rideEntry = get_ride_entry(item.entry_index); + if ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) && !rideTypeShouldLoseSeparateFlag(rideEntry)) { + get_ride_entry_name(entry, item.entry_index); + entryPtr = entry; + } } - return count; + + return track_design_index_get_count_for_ride(item.type, entryPtr); } /** @@ -943,10 +945,7 @@ static void window_new_ride_select(rct_window *w) #endif if (allowTrackDesigns && ride_type_has_flag(item.type, RIDE_TYPE_FLAG_HAS_TRACK)) { - // track_load_list(item); - - char *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, char); - if (*trackDesignList != 0) { + if (_lastTrackDesignCount > 0) { window_track_list_open(item); return; } diff --git a/src/windows/track_list.c b/src/windows/track_list.c index c3c19484ba..e62fb15a22 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -113,7 +113,16 @@ void window_track_list_open(ride_list_item item) window_close_construction_windows(); _window_track_list_item = item; - _trackDesignsCount = track_design_index_get_for_ride(&_trackDesigns, item.type, NULL); + char entry[9]; + const char *entryPtr = NULL; + if (item.type < 0x80) { + rct_ride_entry *rideEntry = get_ride_entry(item.entry_index); + if ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) && !rideTypeShouldLoseSeparateFlag(rideEntry)) { + get_ride_entry_name(entry, item.entry_index); + entryPtr = entry; + } + } + _trackDesignsCount = track_design_index_get_for_ride(&_trackDesigns, item.type, entryPtr); if (RCT2_GLOBAL(0x00F635ED, uint8) & 1) window_error_open(STR_WARNING, STR_TOO_MANY_TRACK_DESIGNS_OF_THIS_TYPE);