diff --git a/src/editor.c b/src/editor.c index e6a303b308..15235dd280 100644 --- a/src/editor.c +++ b/src/editor.c @@ -129,7 +129,7 @@ void editor_convert_save_to_scenario_callback(int result) rct_stex_entry* stex = g_stexEntries[0]; if ((int)stex != 0xFFFFFFFF) { - object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); + object_unload_chunk((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); reset_loaded_objects(); format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); @@ -464,7 +464,7 @@ static int editor_read_s6(const char *path) rct_stex_entry* stex = g_stexEntries[0]; if ((int)stex != 0xFFFFFFFF) { - object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); + object_unload_chunk((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/interface/console.c b/src/interface/console.c index 813b0067a3..17f52a47c5 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -734,7 +734,7 @@ static void editor_load_selected_objects_console() uint8 entry_index, entry_type; if (!find_object_in_entry_group(installed_entry, &entry_type, &entry_index)){ int chunk_size; - if (!object_load(-1, installed_entry, &chunk_size)) { + if (!object_load_chunk(-1, installed_entry, &chunk_size)) { log_error("Failed to load entry %.8s", installed_entry->name); } } @@ -773,7 +773,7 @@ static int cc_load_object(const utf8 **argv, int argc) { } else { // Load the obect - if (!object_load(entryGroupIndex, &entry, NULL)) { + if (!object_load_chunk(entryGroupIndex, &entry, NULL)) { console_writeline_error("Could not load object file."); } else { diff --git a/src/object.c b/src/object.c index eaf9639559..f76f01bc5b 100644 --- a/src/object.c +++ b/src/object.c @@ -107,7 +107,7 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi objectType = openedEntry.flags & 0x0F; - if (object_paint(objectType, 2, 0, objectType, 0, (int)chunk, 0, 0)) { + if (!object_test(objectType, chunk)) { log_error("Object Load failed due to paint failure."); RCT2_GLOBAL(0x00F42BD9, uint8) = 3; rct2_free(chunk); @@ -142,7 +142,7 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi gLastLoadedObjectChunkData = chunk; if (RCT2_GLOBAL(0x9ADAFD, uint8) != 0) { - object_paint(objectType, 0, groupIndex, objectType, 0, (int)chunk, 0, 0); + object_load(objectType, chunk, groupIndex); } return 1; } @@ -151,7 +151,7 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi * * rct2: 0x006A985D */ -int object_load(int groupIndex, rct_object_entry *entry, int* chunkSize) +int object_load_chunk(int groupIndex, rct_object_entry *entry, int* chunkSize) { // Alow chunkSize to be null int tempChunkSize; @@ -184,7 +184,8 @@ int object_load(int groupIndex, rct_object_entry *entry, int* chunkSize) * ebx: file * ebp: entry */ -int write_object_file(SDL_RWops *rw, rct_object_entry* entry){ +int write_object_file(SDL_RWops *rw, rct_object_entry* entry) +{ uint8 entryGroupIndex = 0, type = 0; uint8* chunk = 0; @@ -192,7 +193,7 @@ int write_object_file(SDL_RWops *rw, rct_object_entry* entry){ chunk = object_entry_groups[type].chunks[entryGroupIndex]; - object_paint(type, 1, entryGroupIndex, type, 0, (int)chunk, 0, 0); + object_unload(type, chunk); rct_object_entry_extended* installed_entry = &object_entry_groups[type].entries[entryGroupIndex]; uint8* dst_buffer = malloc(0x600000); @@ -243,7 +244,7 @@ int object_load_packed(SDL_RWops* rw) int type = entry.flags & 0x0F; - if (object_paint(type, 2, 0, type, 0, (int)chunk, 0, 0)) { + if (!object_test(type, chunk)) { log_error("Packed object failed paint test."); rct2_free(chunk); return 0; @@ -340,7 +341,7 @@ int object_load_packed(SDL_RWops* rw) * * rct2: 0x006A9CAF */ -void object_unload(rct_object_entry *entry) +void object_unload_chunk(rct_object_entry *entry) { uint8 object_type, object_index; if (!find_object_in_entry_group(entry, &object_type, &object_index)){ @@ -349,7 +350,7 @@ void object_unload(rct_object_entry *entry) uint8* chunk = object_entry_groups[object_type].chunks[object_index]; - object_paint(object_type, 1, 0, 0, 0, (int)chunk, 0, 0); + object_unload(object_type, chunk); rct2_free(chunk); object_entry_groups[object_type].chunks[object_index] = (uint8*)-1; @@ -434,7 +435,7 @@ int object_chunk_load_image_directory(uint8_t** chunk) typedef bool (*object_load_func)(void *objectEntry, uint32 entryIndex); typedef void (*object_unload_func)(void *objectEntry); typedef bool (*object_test_func)(void *objectEntry); -typedef void (*object_paint_func)(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y); +typedef void (*object_paint_func)(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y); typedef void (*object_desc_func)(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y); /** @@ -452,7 +453,7 @@ typedef struct { // Ride (rct2: 0x006E6E2A) /////////////////////////////////////////////////////////////////////////////// -bool object_type_ride_load(void *objectEntry, uint32 entryIndex) +static bool object_type_ride_load(void *objectEntry, uint32 entryIndex) { rct_ride_type *rideEntry = (rct_ride_type*)objectEntry; @@ -706,7 +707,7 @@ bool object_type_ride_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_ride_unload(void *objectEntry) +static void object_type_ride_unload(void *objectEntry) { rct_ride_type *rideEntry = (rct_ride_type*)objectEntry; rideEntry->name = 0; @@ -746,7 +747,7 @@ void object_type_ride_unload(void *objectEntry) rideEntry->vehicle_preset_list = NULL; } -bool object_type_ride_test(void *objectEntry) +static bool object_type_ride_test(void *objectEntry) { rct_ride_type* rideEntry = (rct_ride_type*)objectEntry; if (rideEntry->excitement_multipler > 75) return false; @@ -755,7 +756,7 @@ bool object_type_ride_test(void *objectEntry) return true; } -void object_type_ride_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_ride_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_ride_type *rideEntry = (rct_ride_type*)objectEntry; int imageId = rideEntry->images_offset; @@ -768,7 +769,7 @@ void object_type_ride_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo gfx_draw_sprite(dpi, imageId, x - 56, y - 56, 0); } -void object_type_ride_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_ride_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_ride_type *rideEntry = (rct_ride_type*)objectEntry; @@ -790,7 +791,7 @@ void object_type_ride_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo * gfx_draw_string_left_wrapped(dpi, &stringId, x, y + 5, width, 1191, 0); } -const object_type_vtable object_type_ride_vtable[] = { +static const object_type_vtable object_type_ride_vtable[] = { object_type_ride_load, object_type_ride_unload, object_type_ride_test, @@ -802,7 +803,7 @@ const object_type_vtable object_type_ride_vtable[] = { // Small Scenery (rct2: 0x006E3466) /////////////////////////////////////////////////////////////////////////////// -bool object_type_small_scenery_load(void *objectEntry, uint32 entryIndex) +static bool object_type_small_scenery_load(void *objectEntry, uint32 entryIndex) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; uint8 *extendedEntryData = (uint8*)((size_t)objectEntry + (size_t)0x1C); @@ -831,7 +832,7 @@ bool object_type_small_scenery_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_small_scenery_unload(void *objectEntry) +static void object_type_small_scenery_unload(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; sceneryEntry->name = 0; @@ -840,7 +841,7 @@ void object_type_small_scenery_unload(void *objectEntry) sceneryEntry->small_scenery.scenery_tab_id = 0; } -bool object_type_small_scenery_test(void *objectEntry) +static bool object_type_small_scenery_test(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; @@ -853,7 +854,7 @@ bool object_type_small_scenery_test(void *objectEntry) return true; } -void object_type_small_scenery_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_small_scenery_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; dpi = clip_drawpixelinfo(dpi, x - 56, 112, y - 56, 112); @@ -899,12 +900,12 @@ void object_type_small_scenery_paint(void *objectEntry, rct_window *w, rct_drawp rct2_free(dpi); } -void object_type_small_scenery_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_small_scenery_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Not required } -const object_type_vtable object_type_small_scenery_vtable[] = { +static const object_type_vtable object_type_small_scenery_vtable[] = { object_type_small_scenery_load, object_type_small_scenery_unload, object_type_small_scenery_test, @@ -916,7 +917,7 @@ const object_type_vtable object_type_small_scenery_vtable[] = { // Large Scenery (rct2: 0x006B92A7) /////////////////////////////////////////////////////////////////////////////// -bool object_type_large_scenery_load(void *objectEntry, uint32 entryIndex) +static bool object_type_large_scenery_load(void *objectEntry, uint32 entryIndex) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; uint8 *extendedEntryData = (uint8*)((size_t)objectEntry + (size_t)0x1A); @@ -964,7 +965,7 @@ bool object_type_large_scenery_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_large_scenery_unload(void *objectEntry) +static void object_type_large_scenery_unload(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; sceneryEntry->name = 0; @@ -975,7 +976,7 @@ void object_type_large_scenery_unload(void *objectEntry) sceneryEntry->large_scenery.var_16 = 0; } -bool object_type_large_scenery_test(void *objectEntry) +static bool object_type_large_scenery_test(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; @@ -988,7 +989,7 @@ bool object_type_large_scenery_test(void *objectEntry) return true; } -void object_type_large_scenery_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_large_scenery_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; @@ -996,12 +997,12 @@ void object_type_large_scenery_paint(void *objectEntry, rct_window *w, rct_drawp gfx_draw_sprite(dpi, imageId, x, y - 39, 0); } -void object_type_large_scenery_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_large_scenery_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Not required } -const object_type_vtable object_type_large_scenery_vtable[] = { +static const object_type_vtable object_type_large_scenery_vtable[] = { object_type_large_scenery_load, object_type_large_scenery_unload, object_type_large_scenery_test, @@ -1013,7 +1014,7 @@ const object_type_vtable object_type_large_scenery_vtable[] = { // Wall (rct2: 0x006E5A25) /////////////////////////////////////////////////////////////////////////////// -bool object_type_wall_load(void *objectEntry, uint32 entryIndex) +static bool object_type_wall_load(void *objectEntry, uint32 entryIndex) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; uint8 *extendedEntryData = (uint8*)((size_t)objectEntry + (size_t)0x0E); @@ -1038,7 +1039,7 @@ bool object_type_wall_load(void *objectEntry, uint32 entryIndex) } -void object_type_wall_unload(void *objectEntry) +static void object_type_wall_unload(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; sceneryEntry->name = 0; @@ -1046,14 +1047,14 @@ void object_type_wall_unload(void *objectEntry) sceneryEntry->wall.scenery_tab_id = 0; } -bool object_type_wall_test(void *objectEntry) +static bool object_type_wall_test(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; if (sceneryEntry->wall.price <= 0) return false; return true; } -void object_type_wall_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_wall_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; dpi = clip_drawpixelinfo(dpi, x - 56, 112, y - 56, 112); @@ -1082,12 +1083,12 @@ void object_type_wall_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo rct2_free(dpi); } -void object_type_wall_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_wall_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Not required } -const object_type_vtable object_type_wall_vtable[] = { +static const object_type_vtable object_type_wall_vtable[] = { object_type_wall_load, object_type_wall_unload, object_type_wall_test, @@ -1099,7 +1100,7 @@ const object_type_vtable object_type_wall_vtable[] = { // Banner (rct2: 0x006BA84E) /////////////////////////////////////////////////////////////////////////////// -bool object_type_banner_load(void *objectEntry, uint32 entryIndex) +static bool object_type_banner_load(void *objectEntry, uint32 entryIndex) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; uint8 *extendedEntryData = (uint8*)((size_t)objectEntry + (size_t)0x0C); @@ -1123,7 +1124,7 @@ bool object_type_banner_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_banner_unload(void *objectEntry) +static void object_type_banner_unload(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; sceneryEntry->name = 0; @@ -1131,14 +1132,14 @@ void object_type_banner_unload(void *objectEntry) sceneryEntry->banner.scenery_tab_id = 0; } -bool object_type_banner_test(void *objectEntry) +static bool object_type_banner_test(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; if (sceneryEntry->banner.price <= 0) return false; return true; } -void object_type_banner_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_banner_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; @@ -1147,12 +1148,12 @@ void object_type_banner_paint(void *objectEntry, rct_window *w, rct_drawpixelinf gfx_draw_sprite(dpi, imageId + 1, x, y, 0); } -void object_type_banner_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_banner_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Not required } -const object_type_vtable object_type_banner_vtable[] = { +static const object_type_vtable object_type_banner_vtable[] = { object_type_banner_load, object_type_banner_unload, object_type_banner_test, @@ -1164,7 +1165,7 @@ const object_type_vtable object_type_banner_vtable[] = { // Path (rct2: 0x006A8621) /////////////////////////////////////////////////////////////////////////////// -bool object_type_path_load(void *objectEntry, uint32 entryIndex) +static bool object_type_path_load(void *objectEntry, uint32 entryIndex) { rct_path_type *pathEntry = (rct_path_type*)objectEntry; uint8 *extendedEntryData = (uint8*)((size_t)objectEntry + (size_t)0x0E); @@ -1196,7 +1197,7 @@ bool object_type_path_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_path_unload(void *objectEntry) +static void object_type_path_unload(void *objectEntry) { rct_path_type *pathEntry = (rct_path_type*)objectEntry; pathEntry->string_idx = 0; @@ -1204,26 +1205,26 @@ void object_type_path_unload(void *objectEntry) pathEntry->bridge_image = 0; } -bool object_type_path_test(void *objectEntry) +static bool object_type_path_test(void *objectEntry) { rct_path_type *pathEntry = (rct_path_type*)objectEntry; if (pathEntry->var_0A >= 2) return false; return true; } -void object_type_path_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_path_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_path_type *pathEntry = (rct_path_type*)objectEntry; gfx_draw_sprite(dpi, pathEntry->image + 71, x - 49, y - 17, 0); gfx_draw_sprite(dpi, pathEntry->image + 72, x + 4, y - 17, 0); } -void object_type_path_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_path_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Not required } -const object_type_vtable object_type_path_vtable[] = { +static const object_type_vtable object_type_path_vtable[] = { object_type_path_load, object_type_path_unload, object_type_path_test, @@ -1235,7 +1236,7 @@ const object_type_vtable object_type_path_vtable[] = { // Path Item (rct2: 0x006A86E2) /////////////////////////////////////////////////////////////////////////////// -bool object_type_path_bit_load(void *objectEntry, uint32 entryIndex) +static bool object_type_path_bit_load(void *objectEntry, uint32 entryIndex) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; uint8 *extendedEntryData = (uint8*)((size_t)objectEntry + (size_t)0x0E); @@ -1259,7 +1260,7 @@ bool object_type_path_bit_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_path_bit_unload(void *objectEntry) +static void object_type_path_bit_unload(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; sceneryEntry->name = 0; @@ -1267,25 +1268,25 @@ void object_type_path_bit_unload(void *objectEntry) sceneryEntry->path_bit.scenery_tab_id = 0; } -bool object_type_path_bit_test(void *objectEntry) +static bool object_type_path_bit_test(void *objectEntry) { rct_scenery_entry *sceneryEntry = (rct_scenery_entry*)objectEntry; if (sceneryEntry->path_bit.price <= 0) return false; return true; } -void object_type_path_bit_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_path_bit_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_scenery_entry* sceneryEntry = (rct_scenery_entry*)objectEntry; gfx_draw_sprite(dpi, sceneryEntry->image, x - 22, y - 24, 0); } -void object_type_path_bit_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_path_bit_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Not required } -const object_type_vtable object_type_path_bit_vtable[] = { +static const object_type_vtable object_type_path_bit_vtable[] = { object_type_path_bit_load, object_type_path_bit_unload, object_type_path_bit_test, @@ -1297,7 +1298,7 @@ const object_type_vtable object_type_path_bit_vtable[] = { // Scenery Set (rct2: 0x006B93AA) /////////////////////////////////////////////////////////////////////////////// -bool object_type_scenery_set_load(void *objectEntry, uint32 entryIndex) +static bool object_type_scenery_set_load(void *objectEntry, uint32 entryIndex) { rct_scenery_set_entry *scenerySetEntry = (rct_scenery_set_entry*)objectEntry; uint8 *extendedEntryData = (uint8*)((size_t)objectEntry + sizeof(rct_scenery_set_entry)); @@ -1355,7 +1356,7 @@ bool object_type_scenery_set_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_scenery_set_unload(void *objectEntry) +static void object_type_scenery_set_unload(void *objectEntry) { rct_scenery_set_entry *scenerySetEntry = (rct_scenery_set_entry*)objectEntry; scenerySetEntry->name = 0; @@ -1365,24 +1366,24 @@ void object_type_scenery_set_unload(void *objectEntry) memset(scenerySetEntry->scenery_entries, 0, 256); } -bool object_type_scenery_set_test(void *objectEntry) +static bool object_type_scenery_set_test(void *objectEntry) { return true; } -void object_type_scenery_set_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_scenery_set_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_scenery_set_entry *scenerySetEntry = (rct_scenery_set_entry*)objectEntry; int imageId = scenerySetEntry->image + 0x20600001; gfx_draw_sprite(dpi, imageId, x - 15, y - 14, 0); } -void object_type_scenery_set_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_scenery_set_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Not required } -const object_type_vtable object_type_scenery_set_vtable[] = { +static const object_type_vtable object_type_scenery_set_vtable[] = { object_type_scenery_set_load, object_type_scenery_set_unload, object_type_scenery_set_test, @@ -1409,19 +1410,19 @@ bool object_type_park_entrance_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_park_entrance_unload(void *objectEntry) +static void object_type_park_entrance_unload(void *objectEntry) { rct_entrance_type *entranceType = (rct_entrance_type*)objectEntry; entranceType->string_idx = 0; entranceType->image_id = 0; } -bool object_type_park_entrance_test(void *objectEntry) +static bool object_type_park_entrance_test(void *objectEntry) { return true; } -void object_type_park_entrance_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_park_entrance_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_entrance_type *entranceType = (rct_entrance_type*)objectEntry; @@ -1438,12 +1439,12 @@ void object_type_park_entrance_paint(void *objectEntry, rct_window *w, rct_drawp rct2_free(dpi); } -void object_type_park_entrance_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_park_entrance_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Not required } -const object_type_vtable object_type_park_entrance_vtable[] = { +static const object_type_vtable object_type_park_entrance_vtable[] = { object_type_park_entrance_load, object_type_park_entrance_unload, object_type_park_entrance_test, @@ -1455,7 +1456,7 @@ const object_type_vtable object_type_park_entrance_vtable[] = { // Water (rct2: 0x006E6E2A) /////////////////////////////////////////////////////////////////////////////// -bool object_type_water_load(void *objectEntry, uint32 entryIndex) +static bool object_type_water_load(void *objectEntry, uint32 entryIndex) { rct_water_type *waterEntry = (rct_water_type*)objectEntry; @@ -1479,7 +1480,7 @@ bool object_type_water_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_water_unload(void *objectEntry) +static void object_type_water_unload(void *objectEntry) { rct_water_type *waterEntry = (rct_water_type*)objectEntry; waterEntry->string_idx = 0; @@ -1488,23 +1489,23 @@ void object_type_water_unload(void *objectEntry) waterEntry->var_0A = 0; } -bool object_type_water_test(void *objectEntry) +static bool object_type_water_test(void *objectEntry) { return true; } -void object_type_water_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_water_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Write (no image) gfx_draw_string_centred(dpi, 3326, x, y, 0, NULL); } -void object_type_water_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_water_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Not required } -const object_type_vtable object_type_water_vtable[] = { +static const object_type_vtable object_type_water_vtable[] = { object_type_water_load, object_type_water_unload, object_type_water_test, @@ -1516,7 +1517,7 @@ const object_type_vtable object_type_water_vtable[] = { // Stex (rct2: 0x0066B355) /////////////////////////////////////////////////////////////////////////////// -bool object_type_stex_load(void *objectEntry, uint32 entryIndex) +static bool object_type_stex_load(void *objectEntry, uint32 entryIndex) { rct_stex_entry *stexEntry = (rct_stex_entry*)objectEntry; uint8 *stringTable = (uint8*)((size_t)objectEntry + (size_t)0x08); @@ -1532,7 +1533,7 @@ bool object_type_stex_load(void *objectEntry, uint32 entryIndex) return true; } -void object_type_stex_unload(void *objectEntry) +static void object_type_stex_unload(void *objectEntry) { rct_stex_entry *stexEntry = (rct_stex_entry*)objectEntry; stexEntry->scenario_name = 0; @@ -1540,18 +1541,18 @@ void object_type_stex_unload(void *objectEntry) stexEntry->details = 0; } -bool object_type_stex_test(void *objectEntry) +static bool object_type_stex_test(void *objectEntry) { return true; } -void object_type_stex_paint(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_stex_paint(void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { // Write (no image) gfx_draw_string_centred(dpi, 3326, x, y, 0, NULL); } -void object_type_stex_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +static void object_type_stex_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) { rct_stex_entry *stexEntry = (rct_stex_entry*)objectEntry; rct_string_id stringId = stexEntry->details; @@ -1559,7 +1560,7 @@ void object_type_stex_desc(void *objectEntry, rct_window *w, rct_drawpixelinfo * gfx_draw_string_left_wrapped(dpi, &stringId, x, y, width, 3168, 0); } -const object_type_vtable object_type_stex_vtable[] = { +static const object_type_vtable object_type_stex_vtable[] = { object_type_stex_load, object_type_stex_unload, object_type_stex_test, @@ -1569,7 +1570,7 @@ const object_type_vtable object_type_stex_vtable[] = { /////////////////////////////////////////////////////////////////////////////// -const object_type_vtable * const object_type_vtables[] = { +static const object_type_vtable * const object_type_vtables[] = { object_type_ride_vtable, object_type_small_scenery_vtable, object_type_large_scenery_vtable, @@ -1583,30 +1584,39 @@ const object_type_vtable * const object_type_vtables[] = { object_type_stex_vtable }; -int object_paint(int type, int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) +bool object_load(int type, void *objectEntry, uint32 entryIndex) { assert(type >= OBJECT_TYPE_RIDE && type <= OBJECT_TYPE_SCENARIO_TEXT); - const object_type_vtable *vtable = object_type_vtables[type]; - switch (eax & 0xFF) { - case 0: - return vtable->load((void*)esi, ebx) ? 0 : 1; - case 1: - vtable->unload((void*)esi); - return 0; - case 2: - return vtable->test((void*)esi) ? 0 : 1; - case 3: - if (((eax >> 8) & 0xFF) == 0) { - vtable->paint((void*)ebp, (rct_window*)esi, (rct_drawpixelinfo*)edi, ecx, edx); - } else { - vtable->desc((void*)ebp, (rct_window*)esi, (rct_drawpixelinfo*)edi, ecx, edx); - } - return 0; - default: - assert(false); - return 0; - } + return vtable->load(objectEntry, entryIndex) ? 0 : 1; +} + +void object_unload(int type, void *objectEntry) +{ + assert(type >= OBJECT_TYPE_RIDE && type <= OBJECT_TYPE_SCENARIO_TEXT); + const object_type_vtable *vtable = object_type_vtables[type]; + vtable->unload(objectEntry); +} + +bool object_test(int type, void *objectEntry) +{ + assert(type >= OBJECT_TYPE_RIDE && type <= OBJECT_TYPE_SCENARIO_TEXT); + const object_type_vtable *vtable = object_type_vtables[type]; + return vtable->test(objectEntry); +} + +void object_paint(int type, void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +{ + assert(type >= OBJECT_TYPE_RIDE && type <= OBJECT_TYPE_SCENARIO_TEXT); + const object_type_vtable *vtable = object_type_vtables[type]; + vtable->paint(objectEntry, dpi, x, y); +} + +void object_desc(int type, void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y) +{ + assert(type >= OBJECT_TYPE_RIDE && type <= OBJECT_TYPE_SCENARIO_TEXT); + const object_type_vtable *vtable = object_type_vtables[type]; + vtable->desc(objectEntry, w, dpi, x, y); } /** @@ -1663,7 +1673,7 @@ int object_get_scenario_text(rct_object_entry *entry) return 0; } - if (object_paint(openedEntry.flags & 0x0F, 2, 0, 0, 0, (int)chunk, 0, 0)) { + if (!object_test(openedEntry.flags & 0x0F, chunk)) { // This is impossible for STEX entries to fail. log_error("Opened object failed paint test."); RCT2_GLOBAL(0x00F42BD9, uint8) = 3; @@ -1686,7 +1696,7 @@ int object_get_scenario_text(rct_object_entry *entry) memcpy(gTempObjectLoadName, openedEntry.name, 8); // Not used?? RCT2_GLOBAL(0x009ADAFD, uint8) = 1; - object_paint(openedEntry.flags & 0x0F, 0, 0, 0, 0, (int)chunk, 0, 0); + object_load(openedEntry.flags & 0x0F, chunk, 0); // Tell text to be loaded into normal address RCT2_GLOBAL(0x009ADAFC, uint8) = 0; // Not used?? diff --git a/src/object.h b/src/object.h index 050f84d529..9171fe78e0 100644 --- a/src/object.h +++ b/src/object.h @@ -22,6 +22,7 @@ #define _OBJECT_H_ #include "common.h" +#include "drawing/drawing.h" #include "platform/platform.h" // First 0xF of rct_object_entry->flags @@ -108,15 +109,14 @@ int object_load_packed(SDL_RWops* rw); 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(rct_object_entry *entry); +int object_load_chunk(int groupIndex, rct_object_entry *entry, int* chunk_size); +void object_unload_chunk(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); int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b); int object_calculate_checksum(const rct_object_entry *entry, const uint8 *data, int dataLength); -int object_paint(int type, int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); rct_object_entry *object_get_next(rct_object_entry *entry); int write_object_file(SDL_RWops* rw, rct_object_entry* entry); void reset_loaded_objects(); @@ -129,4 +129,9 @@ char *object_get_name(rct_object_entry *entry); rct_object_filters *get_object_filter(int index); +bool object_load(int type, void *objectEntry, uint32 entryIndex); +void object_unload(int type, void *objectEntry); +bool object_test(int type, void *objectEntry); +void object_paint(int type, void *objectEntry, rct_drawpixelinfo *dpi, sint32 x, sint32 y); + #endif diff --git a/src/object_list.c b/src/object_list.c index 8481c04131..0b5964d6f8 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -212,7 +212,7 @@ void reset_loaded_objects() for (int j = 0; j < object_entry_group_counts[type]; j++){ uint8* chunk = object_entry_groups[type].chunks[j]; if (chunk != (uint8*)-1) - object_paint(type, 0, j, type, 0, (int)chunk, 0, 0); + object_load(type, chunk, j); } } } @@ -548,7 +548,7 @@ int object_read_and_load_entries(SDL_RWops* rw) } // Load the obect - if (!object_load(entryGroupIndex, &entries[i], NULL)) { + if (!object_load_chunk(entryGroupIndex, &entries[i], NULL)) { log_error("failed to load entry: %.8s", entries[i].name); memcpy((char*)0x13CE952, &entries[i], sizeof(rct_object_entry)); load_fail = 1; @@ -579,7 +579,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((rct_object_entry*)&object_entry_groups[i].entries[j]); + object_unload_chunk((rct_object_entry*)&object_entry_groups[i].entries[j]); reset_loaded_objects(); } @@ -760,7 +760,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in log_error("Incorrect number of vanilla RCT2 objects."); gNumInstalledRCT2Objects--; gInstalledObjectsCount--; - object_unload(entry); + object_unload_chunk(entry); return 0; } } @@ -806,7 +806,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(entry); + object_unload_chunk(entry); return size_of_object; } diff --git a/src/rct1.c b/src/rct1.c index 8cca8fbe1a..203aa18465 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -349,7 +349,7 @@ static void rct1_load_default_objects() continue; } - if (!object_load(j, &entries[j], NULL)) { + if (!object_load_chunk(j, &entries[j], NULL)) { error_string_quit(0x99990000 + (i * 0x100) + j, -1); return; } @@ -359,7 +359,7 @@ static void rct1_load_default_objects() // Water is a special case rct_object_entry *waterEntries = (rct_object_entry*)RCT1DefaultObjects[9].entries; rct_object_entry *waterEntry = &waterEntries[RCT2_GLOBAL(0x01358841, uint8) == 0 ? 0 : 1]; - if (!object_load(0, waterEntry, NULL)) { + if (!object_load_chunk(0, waterEntry, NULL)) { error_string_quit(0x99990900, -1); return; } diff --git a/src/ride/track.c b/src/ride/track.c index 9bc4be1acb..1079794daf 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3173,7 +3173,7 @@ rct_track_design *temp_track_get_info(char* path, uint8** preview) return NULL; } - if (!object_load(0, &loaded_track->vehicle_object, NULL)){ + if (!object_load_chunk(0, &loaded_track->vehicle_object, NULL)){ if (preview != NULL) *preview = NULL; log_error("Failed to load track (vehicle load fail): %s", path); return NULL; diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 9c2a6bba55..608dfb2e13 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -787,7 +787,7 @@ static void window_editor_inventions_list_paint(rct_window *w, rct_drawpixelinfo if (chunk == NULL || chunk == (void*)0xFFFFFFFF) return; - object_paint(objectEntryType, 3, objectEntryType, x, y, 0, (int)dpi, (int)chunk); + object_paint(objectEntryType, chunk, dpi, x, y); // Item name x = w->x + ((widget->left + widget->right) / 2) + 1; diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index c560ca0e62..2b74487ab3 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -38,6 +38,7 @@ #include "../util/util.h" #include "../world/footpath.h" +void object_desc(int type, void *objectEntry, rct_window *w, rct_drawpixelinfo *dpi, sint32 x, sint32 y); enum { FILTER_RCT2 = (1 << 0), @@ -757,7 +758,7 @@ void unload_unselected_objects(){ for (int i = gInstalledObjectsCount; i > 0; --i){ if (!(*selection_flags & OBJECT_SELECTION_FLAG_SELECTED)){ remove_selected_objects_from_research(installedObject); - object_unload(installedObject); + object_unload_chunk(installedObject); } selection_flags++; installedObject = object_get_next(installedObject); @@ -1348,7 +1349,7 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf widget = &w->widgets[WIDX_PREVIEW]; x = w->x + (widget->left + widget->right) / 2 + 1; y = w->y + (widget->top + widget->bottom) / 2 + 1; - object_paint(type, 3, type, x, y, 0, (int)dpi, (int)stex_entry); + object_paint(type, stex_entry, dpi, x, y); // Draw name of object x = w->x + (widget->left + widget->right) / 2 + 1; @@ -1396,7 +1397,7 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf // Draw description of object x = w->x + w->widgets[WIDX_LIST].right + 4; y += 15; - object_paint(type, 259, type, x, y, (int)w, (int)dpi, (int)stex_entry); + object_desc(type, stex_entry, w, dpi, x, y); // Draw object source source = (highlightedEntry->flags & 0xF0) >> 4; @@ -1981,7 +1982,7 @@ static void editor_load_selected_objects() uint8 entry_index, entry_type; if (!find_object_in_entry_group(installed_entry, &entry_type, &entry_index)){ int chunk_size; - if (!object_load(-1, installed_entry, &chunk_size)) { + if (!object_load_chunk(-1, installed_entry, &chunk_size)) { log_error("Failed to load entry %.8s", installed_entry->name); } }