Refactor of object_list.c

This commit is contained in:
Duncan Frost 2015-03-07 11:13:10 +00:00
parent ddcf766fea
commit 936f2f127f
10 changed files with 58 additions and 31 deletions

View File

@ -156,7 +156,7 @@ void editor_convert_save_to_scenario()
if ((int)stex != 0xFFFFFFFF) {
object_unload(0, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]);
//RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
sub_6A9FC0();
reset_loaded_objects();
format_string(s6Info->details, STR_NO_DETAILS_YET, NULL);
s6Info->name[0] = 0;
@ -464,7 +464,7 @@ static void sub_6A2B62()
object_unload_all();
RCT2_CALLPROC_EBPSAFE(0x0069F53D);
sub_6A9FC0();//RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
reset_loaded_objects();
RCT2_CALLPROC_EBPSAFE(0x006A2730);
RCT2_CALLPROC_EBPSAFE(0x006A2956);
RCT2_CALLPROC_EBPSAFE(0x006A29B9);
@ -836,7 +836,7 @@ static int editor_read_s6(const char *path)
// Check expansion pack
// RCT2_CALLPROC_EBPSAFE(0x006757E6);
sub_6A9FC0();//RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
reset_loaded_objects();//RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
map_update_tile_pointers();
map_remove_all_rides();
@ -915,7 +915,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]);
sub_6A9FC0();//RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
reset_loaded_objects();//RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
format_string(s6Info->details, STR_NO_DETAILS_YET, NULL);
s6Info->name[0] = 0;

View File

@ -663,7 +663,7 @@ int game_load_save(const char *path)
}
// The rest is the same as in scenario load and play
sub_6A9FC0();//RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
reset_loaded_objects();
map_update_tile_pointers();
reset_0x69EBE4();// RCT2_CALLPROC_EBPSAFE(0x0069EBE4);
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING;
@ -811,6 +811,26 @@ void game_autosave()
scenario_save(path, 0x80000000);
}
/**
*
* rct2: 0x006E3838
*/
void rct2_exit_reason(rct_string_id title, rct_string_id body){
// Before this would set a quit message
char exit_title[255];
format_string(exit_title, title, 0);
char exit_body[255];
format_string(exit_body, body, 0);
log_error(exit_title);
log_error(exit_body);
rct2_exit();
}
/**
*
* rct2: 0x006E3879

View File

@ -21,6 +21,8 @@
#ifndef _GAME_H_
#define _GAME_H_
#include "common.h"
enum GAME_COMMAND {
GAME_COMMAND_0,
GAME_COMMAND_1,
@ -109,6 +111,7 @@ int game_load_save(const char *path);
void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
char save_game();
void rct2_exit();
void rct2_exit_reason(rct_string_id title, rct_string_id body);
void game_autosave();
#endif

View File

@ -87,7 +87,7 @@ int object_calculate_checksum(const rct_object_entry *entry, const char *data, i
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(FILE *file, rct_object_entry* entry);
void sub_6A9FC0();
void reset_loaded_objects();
int find_object_in_entry_group(rct_object_entry* entry, uint8* entry_type, uint8* entry_index);
rct_object_entry *object_list_find(rct_object_entry *entry);

View File

@ -24,6 +24,7 @@
#include "platform/platform.h"
#include "ride/track.h"
#include "util/sawyercoding.h"
#include "game.h"
#define OBJECT_ENTRY_GROUP_COUNT 11
#define OBJECT_ENTRY_COUNT 721
@ -165,19 +166,10 @@ static void object_list_examine()
object_list_create_hash_table();
}
/**
*
* rct2: 0x006DED68
*/
void reset_9E32F8()
/* rct2: 0x006A9FC0 */
void reset_loaded_objects()
{
uint8* edi = RCT2_ADDRESS(0x009E32F8, uint8);
memset(edi, 0xFF, 90);
}
void sub_6A9FC0()
{
reset_9E32F8();
reset_type_to_ride_entry_index_map();
RCT2_GLOBAL(RCT2_ADDRESS_TOTAL_NO_IMAGES, uint32) = 0xF26E;
@ -248,7 +240,7 @@ void object_list_load()
//if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, uint8) != 0)
// RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, uint8) = 0;
sub_6A9FC0();
reset_loaded_objects();
// Dispose installed object list
if (RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, sint32) != -1) {
@ -259,7 +251,8 @@ void object_list_load()
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){
RCT2_CALLPROC_X(0x006E3838, 0x343, 0xC5A, 0, 0, 0, 0, 0);
log_error("Failed to allocate memory for object list");
rct2_exit_reason(835, 3162);
return;
}
@ -280,7 +273,8 @@ void object_list_load()
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){
RCT2_CALLPROC_X(0x006E3838, 0x343, 0xC5A, 0, 0, 0, 0, 0);
log_error("Failed to allocate memory for object list");
rct2_exit_reason(835, 3162);
return;
}
}
@ -288,18 +282,18 @@ void object_list_load()
char path[MAX_PATH];
subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), enumFileInfo.path);
rct_object_entry* entry = RCT2_ADDRESS(0x00F42B74, rct_object_entry);
if (!object_load_entry(path, entry))
rct_object_entry entry;
if (!object_load_entry(path, &entry))
continue;
rct_object_entry* installed_entry = (rct_object_entry*)(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, uint8*) + current_item_offset);
current_item_offset += install_object_entry(entry, installed_entry, enumFileInfo.path);
current_item_offset += install_object_entry(&entry, installed_entry, enumFileInfo.path);
}
platform_enumerate_files_end(enumFileHandle);
}
sub_6A9FC0();
reset_loaded_objects();
object_list_cache_save(fileCount, totalFileSize, fileDateModifiedChecksum, current_item_offset);
@ -349,7 +343,7 @@ static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int file
log_error("Potential mismatch in file numbers. Possible corrupt file. Consider deleting plugin.dat.");
fclose(file);
sub_6A9FC0();
reset_loaded_objects();
object_list_examine();
return 1;
}
@ -493,7 +487,7 @@ void object_unload_all()
if (object_entry_groups[i].chunks[j] != (uint8*)0xFFFFFFFF)
object_unload(j, &object_entry_groups[i].entries[j]);
sub_6A9FC0();
reset_loaded_objects();
}

View File

@ -140,6 +140,15 @@ rct_ride_type *ride_get_entry(rct_ride *ride)
return GET_RIDE_ENTRY(ride->subtype);
}
/**
*
* rct2: 0x006DED68
*/
void reset_type_to_ride_entry_index_map(){
uint8* typeToRideEntryIndexMap = RCT2_ADDRESS(0x009E32F8, uint8);
memset(typeToRideEntryIndexMap, 0xFF, 90);
}
uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType)
{
uint8 *typeToRideEntryIndexMap = (uint8*)0x009E32F8;

View File

@ -674,6 +674,7 @@ track_colour ride_get_track_colour(rct_ride *ride, int colourScheme);
vehicle_colour ride_get_vehicle_colour(rct_ride *ride, int vehicleIndex);
rct_ride_type *ride_get_entry(rct_ride *ride);
uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType);
void reset_type_to_ride_entry_index_map();
void ride_measurement_clear(rct_ride *ride);
void ride_measurements_update();
rct_ride_measurement *ride_get_measurement(int rideIndex, rct_string_id *message);

View File

@ -738,7 +738,7 @@ void load_track_scenery_objects(){
scenery_entry += sizeof(rct_track_scenery);
}
sub_6A9FC0();
reset_loaded_objects();
}
/**

View File

@ -172,7 +172,7 @@ int scenario_load(const char *path)
// Check expansion pack
// RCT2_CALLPROC_EBPSAFE(0x006757E6);
sub_6A9FC0();
reset_loaded_objects();
map_update_tile_pointers();
reset_0x69EBE4();// RCT2_CALLPROC_EBPSAFE(0x0069EBE4);
return 1;
@ -1133,7 +1133,7 @@ int scenario_save(char *path, int flags)
fclose(file);
if (!(flags & 0x80000000))
sub_6A9FC0();//RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
reset_loaded_objects();//RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
gfx_invalidate_screen();
RCT2_GLOBAL(0x009DEA66, uint16) = 0;

View File

@ -252,7 +252,7 @@ static void window_editor_object_selection_close()
RCT2_CALLPROC_EBPSAFE(0x6ABB66);
editor_load_selected_objects();
sub_6A9FC0();
reset_loaded_objects();
object_free_scenario_text();
RCT2_CALLPROC_EBPSAFE(0x6AB316);
RCT2_CALLPROC_EBPSAFE(0x685675);