From ab7e1da84e77c63584ca94b8a41e1882db3d469f Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Fri, 26 Jun 2015 17:45:38 +0100 Subject: [PATCH] Implemented object unload. Refactored calls to the function. No need to pass the object type. --- src/editor.c | 4 ++-- src/object.c | 14 ++++++++++++-- src/object.h | 2 +- src/object_list.c | 6 +++--- src/windows/editor_object_selection.c | 2 +- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/editor.c b/src/editor.c index 4e0f050764..25761f88cb 100644 --- a/src/editor.c +++ b/src/editor.c @@ -151,7 +151,7 @@ void editor_convert_save_to_scenario() rct_stex_entry* stex = g_stexEntries[0]; if ((int)stex != 0xFFFFFFFF) { - object_unload(0, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); + object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); reset_loaded_objects(); format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); @@ -501,7 +501,7 @@ static int editor_read_s6(const char *path) rct_stex_entry* stex = g_stexEntries[0]; if ((int)stex != 0xFFFFFFFF) { - object_unload(0, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); + object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); reset_loaded_objects(); format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); diff --git a/src/object.c b/src/object.c index 84004d2ac2..98e8fed918 100644 --- a/src/object.c +++ b/src/object.c @@ -333,9 +333,19 @@ int object_load_packed(FILE *file) * * rct2: 0x006A9CAF */ -void object_unload(int groupIndex, rct_object_entry_extended *entry) +void object_unload(rct_object_entry *entry) { - RCT2_CALLPROC_X(0x006A9CAF, 0, groupIndex, 0, 0, 0, 0, (int)entry); + uint8 object_type, object_index; + if (!find_object_in_entry_group(entry, &object_type, &object_index)){ + return; + } + + uint8* chunk = object_entry_groups[object_type].chunks[object_index]; + + object_paint(object_type, 1, 0, 0, 0, (int)chunk, 0, 0); + + rct2_free(chunk); + object_entry_groups[object_type].chunks[object_index] = (char*)-1; } int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b) diff --git a/src/object.h b/src/object.h index cf5b735d61..83c07855b7 100644 --- a/src/object.h +++ b/src/object.h @@ -101,7 +101,7 @@ void object_unload_all(); int check_object_entry(rct_object_entry *entry); int object_load(int groupIndex, rct_object_entry *entry, int* chunk_size); int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSize, const rct_object_entry *installedObject); -void object_unload(int groupIndex, rct_object_entry_extended *entry); +void object_unload(rct_object_entry *entry); int object_get_scenario_text(rct_object_entry *entry); void object_free_scenario_text(); int object_get_length(rct_object_entry *entry); diff --git a/src/object_list.c b/src/object_list.c index d2a8dc5304..cb2e2834c6 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -576,7 +576,7 @@ void object_unload_all() for (i = 0; i < OBJECT_ENTRY_GROUP_COUNT; i++) for (j = 0; j < object_entry_group_counts[i]; j++) if (object_entry_groups[i].chunks[j] != (uint8*)0xFFFFFFFF) - object_unload(j, &object_entry_groups[i].entries[j]); + object_unload((rct_object_entry*)&object_entry_groups[i].entries[j]); reset_loaded_objects(); } @@ -727,7 +727,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in 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)--; - object_unload(objectType, (rct_object_entry_extended*)entry); + object_unload(entry); return 0; } } @@ -788,7 +788,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in uint32 size_of_object = installed_entry_pointer - (uint8*)installed_entry; - object_unload(objectType, (rct_object_entry_extended*)entry); + object_unload(entry); return size_of_object; } diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index f69aa0ba1c..a3b1e05aa4 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -608,7 +608,7 @@ void unload_unselected_objects(){ for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ if (!(*selection_flags & OBJECT_SELECTION_FLAG_SELECTED)){ remove_selected_objects_from_research(installedObject); - object_unload(0, (rct_object_entry_extended*)installedObject); + object_unload(installedObject); } selection_flags++; installedObject = object_get_next(installedObject);