integrate object list variables:

- gInstalledObjectsCount
- gInstalledObjects
- gNumInstalledRCT2Objects
- gNumInstalledCustomObjects
- gLastLoadedObjectChunkData
This commit is contained in:
IntelOrca 2016-01-06 20:41:21 +00:00
parent c0eeefa609
commit ab38828e03
7 changed files with 118 additions and 121 deletions

View File

@ -567,8 +567,8 @@ static void editor_finalise_main_view()
static bool editor_check_object_group_at_least_one_selected(int objectType)
{
uint32 numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32);
rct_object_entry *entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
uint32 numObjects = gInstalledObjectsCount;
rct_object_entry *entry = gInstalledObjects;
uint8 *objectFlag = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
for (uint32 i = 0; i < numObjects; i++) {
if ((entry->flags & 0x0F) == objectType && (*objectFlag & 1)) {

View File

@ -724,12 +724,12 @@ static int cc_twitch(const utf8 **argv, int argc)
static void editor_load_selected_objects_console()
{
uint8 *selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
rct_object_entry *installed_entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry *installed_entry = gInstalledObjects;
if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) == 0)
if (gInstalledObjectsCount == 0)
return;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i != 0; i--, selection_flags++) {
for (int i = gInstalledObjectsCount; i != 0; i--, selection_flags++) {
if (*selection_flags & 1) {
uint8 entry_index, entry_type;
if (!find_object_in_entry_group(installed_entry, &entry_type, &entry_index)){

View File

@ -139,10 +139,11 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi
memcpy(extended_entry, &openedEntry, sizeof(rct_object_entry));
extended_entry->chunk_size = *chunkSize;
RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_CHUNK_POINTER, uint8*) = chunk;
gLastLoadedObjectChunkData = chunk;
if (RCT2_GLOBAL(0x9ADAFD, uint8) != 0)
if (RCT2_GLOBAL(0x9ADAFD, uint8) != 0) {
object_paint(objectType, 0, groupIndex, objectType, 0, (int)chunk, 0, 0);
}
return 1;
}
@ -159,7 +160,7 @@ int object_load(int groupIndex, rct_object_entry *entry, int* chunkSize)
RCT2_GLOBAL(0xF42B64, uint32) = groupIndex;
if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) == 0) {
if (gInstalledObjectsCount == 0) {
RCT2_GLOBAL(0xF42BD9, uint8) = 0;
log_error("Object Load failed due to no items installed check.");
return 1;
@ -277,9 +278,9 @@ int object_load_packed(SDL_RWops* rw)
extended_entry->chunk_size = chunkSize;
// Ensure the entry does not already exist.
rct_object_entry *installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32)){
for (uint32 i = 0; i < RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); ++i){
rct_object_entry *installedObject = gInstalledObjects;
if (gInstalledObjectsCount){
for (uint32 i = 0; i < gInstalledObjectsCount; ++i){
if (object_entry_compare(&entry, installedObject)){
object_unload_all();
return 0;
@ -1521,7 +1522,7 @@ int object_paint(int type, int eax, int ebx, int ecx, int edx, int esi, int edi,
*/
int object_get_scenario_text(rct_object_entry *entry)
{
rct_object_entry *installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry *installedObject = gInstalledObjects;
installedObject = object_list_find(entry);

View File

@ -93,6 +93,13 @@ typedef struct {
extern rct_object_entry_group object_entry_groups[];
extern char gTempObjectLoadName[9];
extern uint32 gInstalledObjectsCount;
extern rct_object_entry *gInstalledObjects;
extern uint32 gNumInstalledRCT2Objects;
extern uint32 gNumInstalledCustomObjects;
extern void *gLastLoadedObjectChunkData;
int object_load_entry(const utf8 *path, rct_object_entry *outEntry);
void object_list_load();
void set_load_objects_fail_reason();

View File

@ -98,6 +98,13 @@ static void load_object_filter(rct_object_entry* entry, uint8* chunk, rct_object
static rct_object_filters *_installedObjectFilters = NULL;
uint32 gInstalledObjectsCount;
rct_object_entry *gInstalledObjects;
uint32 gNumInstalledRCT2Objects;
uint32 gNumInstalledCustomObjects;
void *gLastLoadedObjectChunkData;
static void get_plugin_path(utf8 *outPath)
{
platform_get_user_directory(outPath, NULL);
@ -112,8 +119,8 @@ static void object_list_sort()
char *objectName, *lowestString;
uint8 *copied;
objectBuffer = &RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32);
objectBuffer = &gInstalledObjects;
numObjects = gInstalledObjectsCount;
copied = calloc(numObjects, sizeof(uint8));
// Get buffer size
@ -155,7 +162,7 @@ static void object_list_sort()
}
// Replace old buffer
rct2_free(*objectBuffer);
free(*objectBuffer);
*objectBuffer = newBuffer;
if (_installedObjectFilters) {
free(_installedObjectFilters);
@ -165,27 +172,29 @@ static void object_list_sort()
free(copied);
}
static uint32 object_list_count_custom_objects()
{
uint32 numCustomObjects = 0;
rct_object_entry *object = gInstalledObjects;
for (uint32 i = 0; i < gInstalledObjectsCount; i++) {
if ((object->flags & 0xF0) == 0) {
numCustomObjects++;
}
object = object_get_next(object);
}
gNumInstalledCustomObjects = numCustomObjects;
return numCustomObjects;
}
/**
*
* rct2: 0x006A93CD
*/
static void object_list_examine()
{
int i;
rct_object_entry *object;
RCT2_GLOBAL(RCT2_ADDRESS_CUSTOM_OBJECTS_INSTALLED, uint8) = 0;
object = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
for (i = 0; i < RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32); i++) {
if (!(object->flags & 0xF0))
RCT2_GLOBAL(RCT2_ADDRESS_CUSTOM_OBJECTS_INSTALLED, uint8) |= 1;
object = object_get_next(object);
}
object_list_count_custom_objects();
object_list_sort();
// Create a search index
object_list_create_hash_table();
}
@ -256,27 +265,17 @@ void object_list_load()
totalFiles = (totalFiles & ~0xFF) | 1;
totalFiles = rol32(totalFiles, 24);
if (object_list_cache_load(totalFiles, totalFileSize, fileDateModifiedChecksum))
if (object_list_cache_load(totalFiles, totalFileSize, fileDateModifiedChecksum)) {
return;
// Reload object list
// RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS used to control if this was the first time loading objects
// and display the starting RCT2 for the first time message.
//if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, uint8) != 0)
// RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, uint8) = 0;
reset_loaded_objects();
// Dispose installed object list
if (RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, sint32) != -1) {
rct2_free(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*));
RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, sint32) = -1;
}
RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*) = rct2_malloc(4096);
if (RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, int) == -1){
// Dispose installed object list
reset_loaded_objects();
SafeFree(gInstalledObjects);
gInstalledObjectsCount = 0;
gInstalledObjects = (rct_object_entry*)malloc(4096);
if (gInstalledObjects == NULL) {
log_error("Failed to allocate memory for object list");
rct2_exit_reason(835, 3162);
return;
@ -284,9 +283,8 @@ void object_list_load()
uint32 fileCount = 0;
uint32 objectCount = 0;
uint32 current_item_offset = 0;
uint32 next_offset = 0;
RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32) = 0;
size_t currentEntryOffset = 0;
gNumInstalledRCT2Objects = 0;
log_verbose("building cache of available objects...");
@ -297,15 +295,14 @@ void object_list_load()
enumFileHandle = platform_enumerate_files_begin(RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char));
if (enumFileHandle != INVALID_HANDLE) {
uint32 installed_buffer_size = 0x1000;
size_t installedObjectsCapacity = 4096;
while (platform_enumerate_files_next(enumFileHandle, &enumFileInfo)) {
fileCount++;
if ((installed_buffer_size - current_item_offset) <= 2842){
installed_buffer_size += 0x1000;
RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*) = rct2_realloc(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*), installed_buffer_size);
if (RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, int) == -1){
if ((installedObjectsCapacity - currentEntryOffset) <= 2842){
installedObjectsCapacity += 4096;
gInstalledObjects = (rct_object_entry*)realloc(gInstalledObjects, installedObjectsCapacity);
if (gInstalledObjects == NULL) {
log_error("Failed to allocate memory for object list");
rct2_exit_reason(835, 3162);
return;
@ -316,23 +313,17 @@ void object_list_load()
substitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), enumFileInfo.path);
rct_object_entry entry;
if (!object_load_entry(path, &entry))
continue;
if (_installedObjectFilters)
if (object_load_entry(path, &entry)) {
_installedObjectFilters = realloc(_installedObjectFilters, sizeof(rct_object_filters) * (objectCount + 1));
else
_installedObjectFilters = malloc(sizeof(rct_object_filters) * (objectCount + 1));
rct_object_entry* installed_entry = (rct_object_entry*)(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, uint8*) + current_item_offset);
rct_object_filters filter;
next_offset = install_object_entry(&entry, installed_entry, enumFileInfo.path, &filter);
if (next_offset) {
current_item_offset += next_offset;
_installedObjectFilters[objectCount] = filter;
objectCount++;
rct_object_entry *installedEntry = (rct_object_entry*)((size_t)gInstalledObjects + currentEntryOffset);
rct_object_filters filter;
size_t newEntrySize = install_object_entry(&entry, installedEntry, enumFileInfo.path, &filter);
if (newEntrySize != 0) {
_installedObjectFilters[objectCount] = filter;
objectCount++;
currentEntryOffset += newEntrySize;
}
}
}
platform_enumerate_files_end(enumFileHandle);
@ -340,7 +331,7 @@ void object_list_load()
reset_loaded_objects();
object_list_cache_save(fileCount, totalFileSize, fileDateModifiedChecksum, current_item_offset);
object_list_cache_save(fileCount, totalFileSize, fileDateModifiedChecksum, currentEntryOffset);
// Reload track list
ride_list_item ride_list;
@ -375,15 +366,12 @@ static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int file
pluginHeader.date_modified_checksum == fileDateModifiedChecksum
) {
// Dispose installed object list
if (RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, sint32) != -1) {
rct2_free(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*));
RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, sint32) = -1;
}
SafeFree(gInstalledObjects);
// Read installed object list
RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*) = rct2_malloc(pluginHeader.object_list_size);
if (SDL_RWread(file, RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*), pluginHeader.object_list_size, 1) == 1) {
RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) = pluginHeader.object_list_no_items;
gInstalledObjects = (rct_object_entry*)malloc(pluginHeader.object_list_size);
if (SDL_RWread(file, gInstalledObjects, pluginHeader.object_list_size, 1) == 1) {
gInstalledObjectsCount = pluginHeader.object_list_no_items;
if (pluginHeader.object_list_no_items != (pluginHeader.total_files & 0xFFFFFF))
log_error("Potential mismatch in file numbers. Possible corrupt file. Consider deleting plugin.dat.");
@ -441,7 +429,7 @@ static int object_list_cache_save(int fileCount, uint64 totalFileSize, int fileD
pluginHeader.total_file_size = (uint32)totalFileSize;
pluginHeader.date_modified_checksum = fileDateModifiedChecksum;
pluginHeader.object_list_size = currentItemOffset;
pluginHeader.object_list_no_items = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32);
pluginHeader.object_list_no_items = gInstalledObjectsCount;
get_plugin_path(path);
file = SDL_RWFromFile(path,"wb");
@ -451,9 +439,9 @@ static int object_list_cache_save(int fileCount, uint64 totalFileSize, int fileD
}
SDL_RWwrite(file, &pluginHeader, sizeof(rct_plugin_header), 1);
SDL_RWwrite(file, RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, uint8*), pluginHeader.object_list_size, 1);
SDL_RWwrite(file, gInstalledObjects, pluginHeader.object_list_size, 1);
SDL_RWwrite(file, &filterVersion, sizeof(filterVersion), 1);
SDL_RWwrite(file, _installedObjectFilters, sizeof(rct_object_filters) * RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32), 1);
SDL_RWwrite(file, _installedObjectFilters, sizeof(rct_object_filters) * gInstalledObjectsCount, 1);
SDL_RWclose(file);
return 1;
}
@ -468,7 +456,8 @@ int check_object_entry(rct_object_entry *entry)
*
* rct2: 0x006AB344
*/
void object_create_identifier_name(char* string_buffer, const rct_object_entry* object){
void object_create_identifier_name(char* string_buffer, const rct_object_entry* object)
{
for (uint8 i = 0; i < 8; ++i){
if (object->name[i] != ' '){
*string_buffer++ = object->name[i];
@ -617,7 +606,7 @@ uint32 object_get_hash_code(rct_object_entry *object)
void object_list_create_hash_table()
{
rct_object_entry *installedObject;
int numInstalledObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32);
int numInstalledObjects = gInstalledObjectsCount;
if (_installedObjectHashTable != NULL)
free(_installedObjectHashTable);
@ -626,7 +615,7 @@ void object_list_create_hash_table()
_installedObjectHashTable = calloc(_installedObjectHashTableSize, sizeof(rct_object_entry*));
_installedObjectHashTableCollisions = 0;
installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
installedObject = gInstalledObjects;
for (int i = 0; i < numInstalledObjects; i++) {
uint32 hash = object_get_hash_code(installedObject);
uint32 index = hash % _installedObjectHashTableSize;
@ -740,7 +729,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in
RCT2_GLOBAL(RCT2_ADDRESS_TOTAL_NO_IMAGES, uint32) = 0xF26E;
RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32)++;
gInstalledObjectsCount++;
// This is a variable used by object_load to decide if it should
// use object_paint on the entry.
@ -755,7 +744,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in
log_error("Object Load File failed. Potentially corrupt file: %.8s", entry->name);
RCT2_GLOBAL(0x009ADAF4, sint32) = -1;
RCT2_GLOBAL(0x009ADAFD, uint8) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32)--;
gInstalledObjectsCount--;
return 0;
}
@ -766,11 +755,11 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in
RCT2_GLOBAL(0x009ADAFD, uint8) = 0;
if ((entry->flags & 0xF0) == 0x80) {
RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32)++;
if (RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32) > 772){
gNumInstalledRCT2Objects++;
if (gNumInstalledRCT2Objects > 772){
log_error("Incorrect number of vanilla RCT2 objects.");
RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32)--;
RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32)--;
gNumInstalledRCT2Objects--;
gInstalledObjectsCount--;
object_unload(entry);
return 0;
}
@ -778,7 +767,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in
*((sint32*)installed_entry_pointer) = chunk_size;
installed_entry_pointer += 4;
uint8* chunk = RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_CHUNK_POINTER, uint8*); // Loaded in object_load
uint8* chunk = (uint8*)gLastLoadedObjectChunkData; // Loaded in object_load
load_object_filter(entry, chunk, filter);

View File

@ -321,14 +321,14 @@ static int visible_list_sort_ride_type(const void *rawA, const void *rawB)
static void visible_list_refresh(rct_window *w)
{
int numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32);
int numObjects = gInstalledObjectsCount;
visible_list_dispose();
_listItems = malloc(numObjects * sizeof(list_item));
_numListItems = 0;
list_item *currentListItem = &_listItems[0];
rct_object_entry *entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry *entry = gInstalledObjects;
uint8 *itemFlags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
for (int i = 0; i < numObjects; i++) {
rct_object_filters *filter = get_object_filter(i);
@ -436,10 +436,10 @@ void window_editor_object_selection_open()
static void setup_track_manager_objects(){
uint8 ride_list[128] = { 0 };
uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry* installedObject = gInstalledObjects;
uint16 num_objects = 0;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
uint8 object_type = installedObject->flags & 0xF;
if (object_type == OBJECT_TYPE_RIDE){
*selection_flags |= OBJECT_SELECTION_FLAG_6;
@ -503,10 +503,10 @@ static void setup_track_manager_objects(){
*/
static void setup_track_designer_objects(){
uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry* installedObject = gInstalledObjects;
uint16 num_objects = 0;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
uint8 object_type = installedObject->flags & 0xF;
if (object_type == OBJECT_TYPE_RIDE){
*selection_flags |= OBJECT_SELECTION_FLAG_6;
@ -640,9 +640,9 @@ static void setup_in_use_selection_flags(){
}
uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry* installedObject = gInstalledObjects;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
*selection_flags &= ~OBJECT_SELECTION_FLAG_IN_USE;
uint8 entry_type, entry_index;
@ -666,7 +666,7 @@ static void setup_in_use_selection_flags(){
* rct2: 0x006AB211
*/
static int sub_6AB211(){
uint32 total_objects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32);
uint32 total_objects = gInstalledObjectsCount;
RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*) = rct2_malloc(total_objects);
@ -681,9 +681,9 @@ static int sub_6AB211(){
RCT2_ADDRESS(0x00F433E1, uint16)[object_type] = 0;
}
rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry* installedObject = gInstalledObjects;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
uint8 object_type = installedObject->flags & 0xF;
RCT2_ADDRESS(0x00F433E1, uint16)[object_type]++;
@ -752,9 +752,9 @@ void remove_selected_objects_from_research(rct_object_entry* installedObject){
*/
void unload_unselected_objects(){
uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry* installedObject = gInstalledObjects;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
if (!(*selection_flags & OBJECT_SELECTION_FLAG_SELECTED)){
remove_selected_objects_from_research(installedObject);
object_unload(installedObject);
@ -1577,9 +1577,9 @@ void reset_selected_object_count_and_size(){
uint32 total_object_size = 0;
uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry* installedObject = gInstalledObjects;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
uint8 object_type = installedObject->flags & 0xF;
if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED){
@ -1613,9 +1613,9 @@ void reset_selected_object_count_and_size(){
*/
void set_required_object_flags(rct_object_entry* required_object){
uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry* installedObject = gInstalledObjects;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
if (object_entry_compare(required_object, installedObject)){
*selection_flags |= OBJECT_SELECTION_FLAG_REQUIRED;
@ -1656,15 +1656,15 @@ void set_required_object_flags(rct_object_entry* required_object){
*/
void reset_required_object_flags(){
uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
*selection_flags &= ~OBJECT_SELECTION_FLAG_REQUIRED;
selection_flags++;
}
selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry* installedObject = gInstalledObjects;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED){
uint8* pos = (uint8*)installedObject;
// Skip sizeof(rct_object_entry)
@ -1734,10 +1734,10 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct
selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
// There was previously a check to make sure the object list had an item
rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry* installedObject = gInstalledObjects;
uint8 not_found = 1;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
for (int i = gInstalledObjectsCount; i > 0; --i){
if (object_entry_compare(entry, installedObject)){
not_found = 0;
break;
@ -1971,12 +1971,12 @@ static void window_editor_object_selection_manage_tracks()
static void editor_load_selected_objects()
{
uint8 *selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
rct_object_entry *installed_entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry *installed_entry = gInstalledObjects;
if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) == 0)
if (gInstalledObjectsCount == 0)
return;
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i != 0; i--, selection_flags++) {
for (int i = gInstalledObjectsCount; i != 0; i--, selection_flags++) {
if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED) {
uint8 entry_index, entry_type;
if (!find_object_in_entry_group(installed_entry, &entry_type, &entry_index)){
@ -2100,14 +2100,14 @@ static bool filter_chunks(rct_object_entry *entry, rct_object_filters *filter)
static void filter_update_counts()
{
if (!_FILTER_ALL || strlen(_filter_string) > 0) {
rct_object_entry *installed_entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
rct_object_entry *installed_entry = gInstalledObjects;
rct_object_filters *filter;
uint8 type;
for (int i = 0; i < 11; i++) {
_filter_object_counts[i] = 0;
}
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i) {
filter = get_object_filter(RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) - i);
for (int i = gInstalledObjectsCount; i > 0; --i) {
filter = get_object_filter(gInstalledObjectsCount - i);
type = installed_entry->flags & 0xF;
if (filter_source(installed_entry) && filter_string(installed_entry, filter) && filter_chunks(installed_entry, filter)) {
_filter_object_counts[type]++;

View File

@ -1390,7 +1390,7 @@ static void window_options_invalidate(rct_window *w)
w->disabled_widgets |= (1ULL << WIDX_REAL_NAME_CHECKBOX);
// save plugin data checkbox: visible or not
if (RCT2_GLOBAL(RCT2_ADDRESS_CUSTOM_OBJECTS_INSTALLED, uint8) == 1)
if (gNumInstalledCustomObjects == 0)
window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_EMPTY;
else
window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX;