From 202b754d8d0747648c27a1f922c96539f977932e Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 28 Jun 2016 21:44:39 +0100 Subject: [PATCH] fix ride type to ride entry map --- src/object/ObjectRepository.cpp | 4 ++-- src/rct2/S6Exporter.cpp | 2 +- src/ride/ride.c | 36 +++++++++++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/object/ObjectRepository.cpp b/src/object/ObjectRepository.cpp index be084925f9..46b1b849e7 100644 --- a/src/object/ObjectRepository.cpp +++ b/src/object/ObjectRepository.cpp @@ -622,8 +622,6 @@ extern "C" void reset_loaded_objects() { - reset_type_to_ride_entry_index_map(); - gTotalNoImages = 0xF26E; for (int i = 0; i < 721; i++) @@ -634,6 +632,8 @@ extern "C" object->Load(); } } + + reset_type_to_ride_entry_index_map(); } void object_unload_all() diff --git a/src/rct2/S6Exporter.cpp b/src/rct2/S6Exporter.cpp index 3bbc8cfd92..e83d988234 100644 --- a/src/rct2/S6Exporter.cpp +++ b/src/rct2/S6Exporter.cpp @@ -508,7 +508,7 @@ extern "C" } delete s6exporter; - reset_loaded_objects(); + // reset_loaded_objects(); gfx_invalidate_screen(); if (result && !(flags & S6_SAVE_FLAG_AUTOMATIC)) diff --git a/src/ride/ride.c b/src/ride/ride.c index f77c559b06..3f4cead7f8 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -250,8 +250,40 @@ rct_ride_entry *get_ride_entry_by_ride(rct_ride *ride) * * rct2: 0x006DED68 */ -void reset_type_to_ride_entry_index_map(){ - memset(gTypeToRideEntryIndexMap, 0xFF, 91); +void reset_type_to_ride_entry_index_map() +{ + uint8 maxRideEntries = 128; + uint8 maxRideTypes = 91; + size_t stride = maxRideEntries + 1; + uint8 * entryTypeTable = malloc(maxRideTypes * stride); + memset(entryTypeTable, 0xFF, maxRideTypes * stride); + + for (uint8 i = 0; i < maxRideEntries; i++) { + rct_ride_entry * rideEntry = get_ride_entry(i); + if (rideEntry == (rct_ride_entry *)-1) { + continue; + } + for (uint8 j = 0; j < 3; j++) { + uint8 rideType = rideEntry->ride_type[j]; + if (rideType < maxRideTypes) { + uint8 * entryArray = &entryTypeTable[rideType * stride]; + uint8 * nextEntry = memchr(entryArray, 0xFF, stride); + *nextEntry = i; + } + } + } + + uint8 * dst = gTypeToRideEntryIndexMap; + for (uint8 i = 0; i < maxRideTypes; i++) { + uint8 * entryArray = &entryTypeTable[i * stride]; + uint8 * entry = entryArray; + while (*entry != 0xFF) { + *dst++ = *entry++; + } + *dst++ = 0xFF; + } + + free(entryTypeTable); } uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType)