1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-06 06:32:56 +01:00

remove object entry addresses and use constants

This commit is contained in:
Ted John
2016-07-03 15:13:36 +01:00
parent 3bfa747ce4
commit 6f97ec798e
5 changed files with 48 additions and 39 deletions

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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++;
}