1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-31 18:55:23 +01:00

Refactored track_load

This commit is contained in:
Duncan Frost
2015-01-22 21:04:53 +00:00
parent a57bf368bb
commit dd97974741
4 changed files with 98 additions and 76 deletions

View File

@@ -253,6 +253,11 @@
#define RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX 0x00F43908
#define RCT2_ADDRESS_TRACK_LIST 0x00F44105
#define RCT2_ADDRESS_TRACK_LIST_CACHE 0x00F44109
#define RCT2_ADDRESS_TRACK_LIST_NEXT_INDEX 0x00F44119
#define RCT2_ADDRESS_CURRENT_MONTH_YEAR 0x00F663A8
#define RCT2_ADDRESS_CURRENT_MONTH_TICKS 0x00F663AA
#define RCT2_ADDRESS_SCENARIO_TICKS 0x00F663AC

View File

@@ -240,26 +240,16 @@ static void read(void *dst, void **src, int length)
* rct2: 0x0067726A
* path: 0x0141EF68
*/
int sub_67726A(const char *path)
rct_track_design* load_track_design(const char *path)
{
FILE *fp;
long fpLength;
const char *ch;
char trackFilename[MAX_PATH], *fpBuffer, *decoded, *src, *dst;
char *fpBuffer, *decoded, *src;
int i, decodedLength;
uint8* edi;
RCT2_GLOBAL(0x009AAC54, uint8) = 1;
// Get filename
ch = strrchr(path, '\\');
ch = ch == NULL ? path : ch + 1;
dst = trackFilename;
while (*ch != 0 && *ch != '.') {
*dst++ = *ch++;
}
*dst = 0;
fp = fopen(path, "rb");
if (fp == NULL)
return 0;
@@ -280,98 +270,111 @@ int sub_67726A(const char *path)
realloc(decoded, decodedLength);
free(fpBuffer);
rct_track_design* track_design = RCT2_ADDRESS(0x009D8178, rct_track_design);
// Read decoded data
src = decoded;
memset((void*)0x009D81D8, 0, 67);
read((void*)0x009D8178, &src, 32);
// Clear top of track_design
memset(&track_design->pad_60, 0, 67);
// Read start of track_design
read(track_design, &src, 32);
uint8 al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
uint8 al = track_design->var_07 >> 2;
if (al >= 2)
read((void*)0x009D8198, &src, 40);
read(&track_design->pad_20, &src, 40);
read((void*)0x009D81C0, &src, 24);
al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
read(&track_design->pad_48, &src, 24);
al = track_design->var_07 >> 2;
if (al != 0)
read((void*)0x009D81D8, &src, al == 1 ? 140 : 67);
read(&track_design->pad_60, &src, al == 1 ? 140 : 67);
read((void*)0x009D821B, &src, 24572);
al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
read(&track_design->preview, &src, 24572);
al = track_design->var_07 >> 2;
if (al < 2) {
if (RCT2_GLOBAL(0x009D8178, uint8) == 20) {
edi = (uint8*)0x009D821B;
if (track_design->type == 20) {
edi = (uint8*)(&track_design->preview);
while (*edi != 0) {
edi += 4;
}
edi += 4;
memset(edi, 255, (uint8*)0x009DE217 - edi);
memset(edi, 255, ((uint8*)&track_design->pad_9F) - edi);
} else {
edi = (uint8*)0x009D821B;
edi = (uint8*)(&track_design->preview);
while (*edi != 255) {
edi += 2;
}
edi++;
memset(edi, 255, (uint8*)0x009DE217 - edi);
memset(edi, 255, ((uint8*)&track_design->pad_9F) - edi);
}
}
free(decoded);
//
al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
al = track_design->var_07 >> 2;
if (al > 2)
return 0;
return NULL;
if (al <= 1) {
edi = (uint8*)0x009D8180;
edi = (uint8*)&track_design->pad_08;
for (i = 0; i < 67; i++)
*edi++ = RCT2_ADDRESS(0x0097F0BC, uint8)[*edi];
edi = (uint8*)0x009D81D8;
edi = (uint8*)&track_design->pad_60;
for (i = 0; i < 12; i++)
*edi++ = RCT2_ADDRESS(0x0097F0BC, uint8)[*edi];
RCT2_GLOBAL(0x009D81D2, uint8) >>= 1;
track_design->highest_drop_height >>= 1;
if (!RCT2_CALLPROC_X(0x00677530, 0, 0, 0, 0, 0, 0, 0))
RCT2_GLOBAL(0x009D8178, uint8) = 255;
track_design->type = 255;
if (RCT2_GLOBAL(0x009D8178, uint8) == 4)
RCT2_GLOBAL(0x009D8178, uint8) = 255;
if (track_design->type == 4)
track_design->type = 255;
if (RCT2_GLOBAL(0x009D8178, uint8) == 0)
RCT2_GLOBAL(0x009D8178, uint8) = 52;
if (track_design->type == 0)
track_design->type = 52;
if (RCT2_GLOBAL(0x009D8178, uint8) == 19) {
if (RCT2_GLOBAL(0x009D817E, uint8) == 3)
RCT2_GLOBAL(0x009D817E, uint8) = 35;
if (RCT2_GLOBAL(0x009D8179, uint8) == 79) {
if (RCT2_GLOBAL(0x009D817E, uint8) == 2)
RCT2_GLOBAL(0x009D817E, uint8) = 1;
if (track_design->type == 19) {
if (track_design->var_06 == 3)
track_design->var_06 = 35;
if (track_design->var_01 == 79) {
if (track_design->var_06 == 2)
track_design->var_06 = 1;
}
}
int unk1 = RCT2_GLOBAL(0x009D8179, uint8);
if (RCT2_GLOBAL(0x009D8178, uint8) == 20) {
int unk1;
if (track_design->type == 20) {
unk1 = 0x0097F66C;
} else {
if (unk1 == 3 && RCT2_GLOBAL(0x009D8178, uint8) == 3)
unk1 = 80;
unk1 = 0x0097F0DC + (unk1 * 16);
int var_01 = track_design->var_01;
if (var_01 == 3 && track_design->type == 3)
var_01 = 80;
unk1 = 0x0097F0DC + (var_01 * 16);
}
memcpy((void*)0x009D81E8, (void*)unk1, 16);
memcpy(&track_design->pad_70, (void*)unk1, 16);
for (i = 0; i < 32; i++)
RCT2_ADDRESS(0x009D81FA, uint8)[i] = RCT2_ADDRESS(0x009D8181, uint8)[i * 2];
track_design->pad_82[i] = track_design->pad_09[i * 2];
RCT2_GLOBAL(0x009D81F8, uint8) = 255;
RCT2_GLOBAL(0x009D81F9, uint8) = 255;
RCT2_GLOBAL(0x009D821A, uint8) = 5;
track_design->space_required_x = 255;
track_design->space_required_y = 255;
track_design->var_A2 = 5;
}
RCT2_GLOBAL(0x009D81C8, uint8) = min(
RCT2_GLOBAL(0x009D81C8, uint8),
RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + 5 + (RCT2_GLOBAL(0x009D8178, uint8) * 8), uint8)
track_design->var_50 = min(
track_design->var_50,
RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + 5 + (track_design->type * 8), uint8)
);
return 1;
return track_design;
}
/* rct2: 0x006D1DCE*/
void reset_track_list_cache(){
int* track_list_cache = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST_CACHE, int);
for (int i = 0; i < 4; ++i){
track_list_cache[i] = -1;
}
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_LIST_NEXT_INDEX, uint32) = 0;
}
/**
@@ -389,30 +392,36 @@ rct_track_design *track_get_info(int index, uint8** preview)
// Check if track design has already been loaded
for (i = 0; i < 4; i++) {
if (index == RCT2_ADDRESS(0x00F44109, uint32)[i]) {
trackDesign = &RCT2_GLOBAL(0x00F44105, rct_track_design*)[i];
if (index == RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST_CACHE, uint32)[i]) {
trackDesign = &RCT2_GLOBAL(RCT2_ADDRESS_TRACK_LIST, rct_track_design*)[i];
break;
}
}
if (trackDesign == NULL) {
// Load track design
i = RCT2_GLOBAL(0x00F44119, uint32);
RCT2_GLOBAL(0x00F44119, uint32)++;
if (RCT2_GLOBAL(0x00F44119, uint32) >= 4)
RCT2_GLOBAL(0x00F44119, uint32) = 0;
i = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_LIST_NEXT_INDEX, uint32)++;
if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_LIST_NEXT_INDEX, uint32) >= 4)
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_LIST_NEXT_INDEX, uint32) = 0;
RCT2_ADDRESS(0x00F44109, uint32)[i] = index;
subsitute_path((char*)0x0141EF68, (char*)RCT2_ADDRESS_TRACKS_PATH, trackDesignList + (index * 128));
if (!sub_67726A((char*)0x0141EF68)) {
RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST_CACHE, uint32)[i] = index;
char track_path[MAX_PATH] = { 0 };
subsitute_path(track_path, (char*)RCT2_ADDRESS_TRACKS_PATH, trackDesignList + (index * 128));
rct_track_design* loaded_design = NULL;
if (!(loaded_design = load_track_design(track_path))) {
if (preview != NULL) *preview = NULL;
return NULL;
}
trackDesign = &RCT2_GLOBAL(0x00F44105, rct_track_design*)[i];
trackDesign = &RCT2_GLOBAL(RCT2_ADDRESS_TRACK_LIST, rct_track_design*)[i];
memcpy(trackDesign, (void*)0x009D8178, 163);
RCT2_CALLPROC_X(0x006D1EF0, 0, 0, 0, 0, 0, (int)trackDesign + 163, 0);
// Copy the track design apart from the preview image
memcpy(trackDesign, loaded_design, 163);
// Load in a new preview image, calculate cost variable, calculate var_06
RCT2_CALLPROC_X(0x006D1EF0, 0, 0, 0, 0, 0, (int)&trackDesign->preview, 0);
trackDesign->cost = RCT2_GLOBAL(0x00F4411D, money32);
trackDesign->var_06 = RCT2_GLOBAL(0x00F44151, uint8) & 7;

View File

@@ -42,13 +42,17 @@ typedef struct {
*/
typedef struct {
uint8 type; // 0x00
uint8 pad_01;
uint8 var_01;
money32 cost; // 0x02
uint8 var_06;
uint8 var_07;
uint8 pad_08[0x42];
uint8 pad_08;
uint8 pad_09[0x17];
uint8 pad_20[40];
uint8 pad_48[2];
uint8 total_air_time; // 0x4A
uint8 pad_4B[0x06];
uint8 pad_4B[0x05];
uint8 var_50;
uint8 max_speed; // 0x51
uint8 average_speed; // 0x52
uint16 ride_length; // 0x53
@@ -64,12 +68,15 @@ typedef struct {
uint8 excitement; // 0x5B
uint8 intensity; // 0x5C
uint8 nausea; // 0x5D
uint8 pad_5E[0x0E];
uint8 pad_5E[2];
uint8 pad_60[0xC];
uint32 var_6C;
uint8 pad_70[0x10];
uint8 space_required_x; // 0x80
uint8 space_required_y; // 0x81
uint8 pad_82[0x21];
uint8 pad_82[0x1D];
uint8 pad_9F[3];
uint8 var_A2;
uint8 preview[4][TRACK_PREVIEW_IMAGE_SIZE]; // 0xA3
} rct_track_design;
@@ -135,5 +142,6 @@ int sub_67726A(const char *path);
rct_track_design *track_get_info(int index, uint8** preview);
int track_rename(const char *text);
int track_delete();
void reset_track_list_cache();
#endif

View File

@@ -126,8 +126,8 @@ void window_track_list_open(ride_list_item item)
if (mem == NULL)
return;
RCT2_GLOBAL(0x00F44105, void*) = mem;
RCT2_CALLPROC_EBPSAFE(0x006D1DCE);
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_LIST, void*) = mem;
reset_track_list_cache();
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) {
x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2 - 300;
@@ -236,7 +236,7 @@ static int window_track_list_get_list_item_index_from_position(int x, int y)
*/
static void window_track_list_close()
{
free(RCT2_GLOBAL(0x00F44105, void*));
free(RCT2_GLOBAL(RCT2_ADDRESS_TRACK_LIST, void*));
}
/**