diff --git a/src/object/ObjectRepository.cpp b/src/object/ObjectRepository.cpp index 07a35523bb..d337356692 100644 --- a/src/object/ObjectRepository.cpp +++ b/src/object/ObjectRepository.cpp @@ -561,7 +561,7 @@ IObjectRepository * GetObjectRepository() return _objectRepository; } -Object * _loadedObjects[721] = { nullptr }; +Object * _loadedObjects[OBJECT_ENTRY_COUNT] = { nullptr }; int GetObjectEntryIndex(uint8 objectType, uint8 entryIndex) { @@ -640,7 +640,7 @@ extern "C" void reset_loaded_objects() { - for (int i = 0; i < 721; i++) + for (int i = 0; i < OBJECT_ENTRY_COUNT; i++) { Object * object = _loadedObjects[i]; if (object != nullptr) @@ -662,7 +662,7 @@ extern "C" void * object_repository_find_loaded_object(const rct_object_entry * objectEntry) { - for (size_t i = 0; i < 721; i++) + for (size_t i = 0; i < OBJECT_ENTRY_COUNT; i++) { Object * object = _loadedObjects[i]; if (object != nullptr) @@ -690,7 +690,7 @@ extern "C" void object_unload_all() { - for (int i = 0; i < 721; i++) + for (int i = 0; i < OBJECT_ENTRY_COUNT; i++) { Object * object = _loadedObjects[i]; if (object != nullptr) diff --git a/src/object_list.c b/src/object_list.c index 28ac2f5bf1..e70a314049 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -259,19 +259,37 @@ void object_list_init() } } -void *get_loaded_object_entry(size_t index) +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++) { size_t groupCount = object_entry_group_counts[i]; if (index >= groupCount) { - index -= object_entry_group_counts[i]; + index -= groupCount; objectType++; } else { break; } } - void *entry = object_entry_groups[objectType].chunks[index]; + if (outObjectType != NULL) *outObjectType = objectType; + if (outEntryIndex != NULL) *outEntryIndex = (uint8)index; +} + +const rct_object_entry * get_loaded_object_entry(size_t index) +{ + uint8 objectType, entryIndex; + get_type_entry_index(index, &objectType, &entryIndex); + + rct_object_entry * entry = (rct_object_entry *)&(object_entry_groups[objectType].entries[entryIndex]); + return entry; +} + +void * get_loaded_object_chunk(size_t index) +{ + uint8 objectType, entryIndex; + get_type_entry_index(index, &objectType, &entryIndex); + + void *entry = object_entry_groups[objectType].chunks[entryIndex]; return entry; } diff --git a/src/object_list.h b/src/object_list.h index 6e1e6a3463..4277cb569e 100644 --- a/src/object_list.h +++ b/src/object_list.h @@ -34,4 +34,5 @@ #endif void object_list_init(); -void *get_loaded_object_entry(size_t index); +const rct_object_entry * get_loaded_object_entry(size_t index); +void * get_loaded_object_chunk(size_t index); diff --git a/src/rct2/S6Exporter.cpp b/src/rct2/S6Exporter.cpp index e83d988234..77e97b2fb5 100644 --- a/src/rct2/S6Exporter.cpp +++ b/src/rct2/S6Exporter.cpp @@ -132,7 +132,7 @@ void S6Exporter::Save(SDL_RWops * rw, bool isScenario) // 3: Write available objects chunk chunkHeader.encoding = CHUNK_ENCODING_ROTATE; - chunkHeader.length = 721 * sizeof(rct_object_entry); + chunkHeader.length = OBJECT_ENTRY_COUNT * sizeof(rct_object_entry); encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)_s6.objects, chunkHeader); SDL_RWwrite(rw, buffer, encodedLength, 1); @@ -228,19 +228,18 @@ void S6Exporter::Export() { _s6.info = *gS6Info; - for (int i = 0; i < 721; i++) + for (int i = 0; i < OBJECT_ENTRY_COUNT; i++) { - rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); - void *entryData = get_loaded_object_entry(i); + const rct_object_entry * entry = get_loaded_object_entry(i); + void * entryData = get_loaded_object_chunk(i); if (entryData == (void *)0xFFFFFFFF) { - memset(&_s6.objects[i], 0xFF, sizeof(rct_object_entry)); + Memory::Set(&_s6.objects[i], 0xFF, sizeof(rct_object_entry)); } else { _s6.objects[i] = *((rct_object_entry*)entry); } - } _s6.elapsed_months = gDateMonthsElapsed; diff --git a/src/scenario.c b/src/scenario.c index a51628ec76..996e5921b9 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -700,17 +700,14 @@ int scenario_prepare_for_save() */ int scenario_get_num_packed_objects_to_write() { - int i, count = 0; - rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; - - for (i = 0; i < OBJECT_ENTRY_COUNT; i++, entry++) { - void *entryData = get_loaded_object_entry(i); - if (entryData == (void*)0xFFFFFFFF || (entry->flags & 0xF0)) { - continue; + int count = 0; + for (int i = 0; i < OBJECT_ENTRY_COUNT; i++) { + const rct_object_entry *entry = get_loaded_object_entry(i); + void *entryData = get_loaded_object_chunk(i); + if (entryData != (void*)0xFFFFFFFF && !(entry->flags & 0xF0)) { + count++; } - count++; } - return count; } @@ -720,18 +717,15 @@ int scenario_get_num_packed_objects_to_write() */ int scenario_write_packed_objects(SDL_RWops* rw) { - int i; - rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; - for (i = 0; i < OBJECT_ENTRY_COUNT; i++, entry++) { - void *entryData = get_loaded_object_entry(i); - if (entryData == (void*)0xFFFFFFFF || (entry->flags & 0xF0)) { - continue; - } - if (!object_saved_packed(rw, (rct_object_entry*)entry)) { - return 0; + for (int i = 0; i < OBJECT_ENTRY_COUNT; i++) { + const rct_object_entry *entry = get_loaded_object_entry(i); + void *entryData = get_loaded_object_chunk(i); + if (entryData != (void*)0xFFFFFFFF && !(entry->flags & 0xF0)) { + if (!object_saved_packed(rw, entry)) { + return 0; + } } } - return 1; } @@ -745,7 +739,7 @@ int scenario_write_available_objects(FILE *file) int i, encodedLength; sawyercoding_chunk_header chunkHeader; - const int totalEntries = 721; + const int totalEntries = OBJECT_ENTRY_COUNT; const int bufferLength = totalEntries * sizeof(rct_object_entry); // Initialise buffers @@ -762,17 +756,14 @@ int scenario_write_available_objects(FILE *file) } // Write entries - rct_object_entry_extended *srcEntry = (rct_object_entry_extended*)0x00F3F03C; rct_object_entry *dstEntry = (rct_object_entry*)buffer; for (i = 0; i < OBJECT_ENTRY_COUNT; i++) { - void *entryData = get_loaded_object_entry(i); + void *entryData = get_loaded_object_chunk(i); if (entryData == (void*)0xFFFFFFFF) { memset(dstEntry, 0xFF, sizeof(rct_object_entry)); } else { - *dstEntry = *((rct_object_entry*)srcEntry); + *dstEntry = *get_loaded_object_entry(i); } - - srcEntry++; dstEntry++; }