diff --git a/src/rct1.h b/src/rct1.h index c6f4b2fd49..2412eceb06 100644 --- a/src/rct1.h +++ b/src/rct1.h @@ -302,6 +302,11 @@ enum{ RCT1_TRACK_ELEM_BOOSTER = 100 }; +enum{ + RCT1_RIDE_MODE_POWERED_LAUNCH = 3, + +}; + typedef struct{ uint8 type; // 0x00 uint8 vehicle_type; // 0x01 diff --git a/src/ride/ride.c b/src/ride/ride.c index 395223874e..8a8f51c5d4 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -2094,8 +2094,8 @@ track_colour ride_get_track_colour(rct_ride *ride, int colourScheme) vehicle_colour ride_get_vehicle_colour(rct_ride *ride, int vehicleIndex) { vehicle_colour result; - result.main = ride->vehicle_colours[vehicleIndex] & 0xFF; - result.additional_1 = ride->vehicle_colours[vehicleIndex] >> 8; + result.main = ride->vehicle_colours[vehicleIndex].body_colour; + result.additional_1 = ride->vehicle_colours[vehicleIndex].trim_colour; result.additional_2 = ride->vehicle_colours_extended[vehicleIndex]; return result; } diff --git a/src/ride/ride.h b/src/ride/ride.h index ce89235380..64931ecd08 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -24,6 +24,7 @@ #include "../common.h" #include "../peep/peep.h" #include "../world/map.h" +#include "vehicle.h" typedef fixed16_2dp ride_rating; @@ -138,7 +139,7 @@ typedef struct { uint16 pad_002; uint8 mode; // 0x004 uint8 colour_scheme_type; // 0x005 - uint16 vehicle_colours[32]; // 0x006 + rct_vehicle_colour vehicle_colours[32]; // 0x006 uint8 pad_046[0x03]; // 0 = closed, 1 = open, 2 = test uint8 status; // 0x049 diff --git a/src/ride/track.c b/src/ride/track.c index 7fa812690b..cfef660c1e 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -522,7 +522,7 @@ rct_track_td6* load_track_design(const char *path) // Read start of track_design read(track_design, &src, 32); - uint8 version = track_design->var_07 >> 2; + uint8 version = track_design->version_and_colour_scheme >> 2; if (version > 2){ free(decoded); @@ -595,11 +595,11 @@ rct_track_td6* load_track_design(const char *path) track_design->type = RIDE_TYPE_WOODEN_ROLLER_COASTER; if (track_design->type == RIDE_TYPE_CORKSCREW_ROLLER_COASTER) { - if (track_design->var_06 == 3) - track_design->var_06 = 35; + if (track_design->ride_mode == RCT1_RIDE_MODE_POWERED_LAUNCH) + track_design->ride_mode = RIDE_MODE_POWERED_LAUNCH; if (track_design->vehicle_type == 79) { - if (track_design->var_06 == 2) - track_design->var_06 = 1; + if (track_design->ride_mode == 2) + track_design->ride_mode = 1; } } @@ -619,7 +619,7 @@ rct_track_td6* load_track_design(const char *path) track_design->space_required_x = 255; track_design->space_required_y = 255; - track_design->var_A2 = 5; + track_design->lift_hill_speed_num_circuits = 5; } track_design->var_50 = min( @@ -820,7 +820,7 @@ int sub_6D2189(int* cost, uint8* ride_id){ user_string_free(old_name); } - uint8 version = track_design->var_07 >> 2; + uint8 version = track_design->version_and_colour_scheme >> 2; if (version == 2){ ride->entrance_style = track_design->entrance_style; @@ -1066,7 +1066,7 @@ rct_track_design *track_get_info(int index, uint8** preview) //RCT2_CALLPROC_X(0x006D1EF0, 0, 0, 0, 0, 0, (int)&trackDesign->preview, 0); trackDesign->track_td6.cost = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_COST, money32); - trackDesign->track_td6.var_06 = RCT2_GLOBAL(0x00F44151, uint8) & 7; + trackDesign->track_td6.track_flags = RCT2_GLOBAL(0x00F44151, uint8) & 7; } // Set preview to correct preview image based on rotation @@ -1295,6 +1295,61 @@ int copy_scenery_to_track(uint8** track_pointer){ return 1; } +int sub_6CE44F(rct_ride* ride){ + rct_track_td6* track_design = RCT2_ADDRESS(0x009D8178, rct_track_td6); + + track_design->type = ride->type; + rct_object_entry_extended* object = &object_entry_groups[OBJECT_TYPE_RIDE].entries[ride->subtype]; + + // Note we are only copying rct_object_entry in size and + // not the extended as we don't need the chunk size. + memcpy(&track_design->vehicle_object, object, sizeof(rct_object_entry)); + + track_design->ride_mode = ride->mode; + + track_design->version_and_colour_scheme = + (ride->colour_scheme_type & 3) | + (1 << 3); // Version .TD6 + + for (int i = 0; i < 32; ++i){ + track_design->vehicle_colours[i] = ride->vehicle_colours[i]; + track_design->vehicle_additional_colour[i] = ride->vehicle_colours_extended[i]; + } + + for (int i = 0; i < 4; ++i){ + track_design->track_spine_colour[i] = ride->track_colour_main[i]; + track_design->track_rail_colour[i] = ride->track_colour_additional[i]; + track_design->track_support_colour[i] = ride->track_colour_supports[i]; + } + + track_design->depart_flags = ride->depart_flags; + track_design->number_of_trains = ride->num_vehicles; + track_design->number_of_cars_per_train = ride->num_cars_per_train; + track_design->min_waiting_time = ride->min_waiting_time; + track_design->max_waiting_time = ride->max_waiting_time; + track_design->var_50 = ride->var_0D0; + track_design->lift_hill_speed_num_circuits = + ride->lift_hill_speed | + (ride->num_circuits << 5); + + track_design->entrance_style = ride->entrance_style; + track_design->max_speed = (sint8)(ride->max_speed / 65536); + track_design->average_speed = (sint8)(ride->average_speed / 65536); + track_design->ride_length = ride_get_total_length(ride) / 65536; + track_design->max_positive_vertical_g = ride->max_positive_vertical_g / 32; + track_design->max_negative_vertical_g = ride->max_negative_vertical_g / 32; + track_design->max_lateral_g = ride->max_lateral_g / 32; + track_design->inversions = ride->inversions; + track_design->drops = ride->drops; + track_design->highest_drop_height = ride->highest_drop_height; + + uint16 total_air_time = (ride->total_air_time * 123) / 1024; + if (total_air_time > 255) + total_air_time = 0; + track_design->total_air_time = (uint8)total_air_time; + //6ce5fd +} + /* rct2: 0x006D2804 & 0x006D264D */ int save_track_design(uint8 rideIndex){ rct_ride* ride = GET_RIDE(rideIndex); @@ -1314,11 +1369,16 @@ int save_track_design(uint8 rideIndex){ return 0; } - if (RCT2_CALLPROC_X(0x006CE44F, 0, 0, 0, rideIndex, 0, 0, 0) & 0x100){ + if (sub_6CE44F(ride)){ window_error_open(3346, RCT2_GLOBAL(0x141E9AC, rct_string_id)); return 0; } + //if (RCT2_CALLPROC_X(0x006CE44F, 0, 0, 0, rideIndex, 0, 0, 0) & 0x100){ + // window_error_open(3346, RCT2_GLOBAL(0x141E9AC, rct_string_id)); + // return 0; + //} + uint8* track_pointer = RCT2_GLOBAL(0x00F44058, uint8*); if (RCT2_GLOBAL(0x009DEA6F, uint8) & 1){ if (!copy_scenery_to_track(&track_pointer)) @@ -1430,7 +1490,7 @@ rct_track_design *temp_track_get_info(char* path, uint8** preview) //RCT2_CALLPROC_X(0x006D1EF0, 0, 0, 0, 0, 0, (int)&trackDesign->preview, 0); trackDesign->track_td6.cost = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_COST, money32); - trackDesign->track_td6.var_06 = RCT2_GLOBAL(0x00F44151, uint8) & 7; + trackDesign->track_td6.track_flags = RCT2_GLOBAL(0x00F44151, uint8) & 7; } // Set preview to correct preview image based on rotation diff --git a/src/ride/track.h b/src/ride/track.h index 29aad1a2dd..68ee024230 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -92,12 +92,6 @@ enum{ #define TRACK_PREVIEW_IMAGE_SIZE (370 * 217) -/* size: 0x2 */ -typedef struct{ - uint8 body_colour; - uint8 trim_colour; -} rct_track_vehicle_colour; - /** * Track design structure. * size: 0x4E72B @@ -106,9 +100,14 @@ typedef struct { uint8 type; // 0x00 uint8 vehicle_type; money32 cost; // 0x02 - uint8 var_06; - uint8 var_07; - rct_track_vehicle_colour vehicle_colours[32]; // 0x08 + union{ + // After loading the track this is converted to + // a flags register + uint8 ride_mode; // 0x06 + uint8 track_flags; // 0x06 + }; + uint8 version_and_colour_scheme; // 0x07 0b0000_VVCC + rct_vehicle_colour vehicle_colours[32]; // 0x08 union{ uint8 pad_48; uint8 track_spine_colour_rct1; // 0x48 @@ -121,16 +120,17 @@ typedef struct { uint8 total_air_time; // 0x4A uint8 track_support_colour_rct1; // 0x4A }; - uint8 pad_4B; + uint8 depart_flags; // 0x4B uint8 number_of_trains; // 0x4C uint8 number_of_cars_per_train; // 0x4D - uint8 pad_4E[2]; + uint8 min_waiting_time; // 0x4E + uint8 max_waiting_time; // 0x4F uint8 var_50; - uint8 max_speed; // 0x51 - uint8 average_speed; // 0x52 + sint8 max_speed; // 0x51 + sint8 average_speed; // 0x52 uint16 ride_length; // 0x53 uint8 max_positive_vertical_g; // 0x55 - sint8 max_negitive_vertical_g; // 0x56 + sint8 max_negative_vertical_g; // 0x56 uint8 max_lateral_g; // 0x57 union { uint8 inversions; // 0x58 @@ -150,7 +150,7 @@ typedef struct { uint8 space_required_x; // 0x80 uint8 space_required_y; // 0x81 uint8 vehicle_additional_colour[32]; // 0x82 - uint8 var_A2; + uint8 lift_hill_speed_num_circuits; // 0xA2 0bCCCL_LLLL } rct_track_td6; typedef struct{ diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index 28f853ba13..866f52cc08 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -23,6 +23,12 @@ #include "../common.h" +/* size: 0x2 */ +typedef struct{ + uint8 body_colour; + uint8 trim_colour; +} rct_vehicle_colour; + typedef struct { uint8 sprite_identifier; // 0x00 uint8 var_01; diff --git a/src/windows/install_track.c b/src/windows/install_track.c index 7cdb6d7a1e..922ed382f7 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -201,7 +201,7 @@ static void window_install_track_select(rct_window *w, int index) trackDesign = track_get_info(index, NULL); if (trackDesign == NULL) return; - if (trackDesign->track_td6.var_06 & 4) + if (trackDesign->track_td6.track_flags & 4) window_error_open(STR_THIS_DESIGN_WILL_BE_BUILT_WITH_AN_ALTERNATIVE_VEHICLE_TYPE, -1); window_close(w); @@ -339,7 +339,7 @@ static void window_install_track_paint() RCT2_GLOBAL(0x00F44153, uint8) = 0; // Warnings - if (track_td6->var_06 & 1) { + if (track_td6->track_flags & 1) { RCT2_GLOBAL(0x00F44153, uint8) = 1; if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) { // Scenery not available @@ -408,7 +408,7 @@ static void window_install_track_paint() y += 10; // Maximum negative verical Gs - gForces = track_td6->max_negitive_vertical_g * 32; + gForces = track_td6->max_negative_vertical_g * 32; gfx_draw_string_left(dpi, STR_MAX_NEGATIVE_VERTICAL_G, &gForces, 0, x, y); y += 10; @@ -417,7 +417,8 @@ static void window_install_track_paint() gfx_draw_string_left(dpi, STR_MAX_LATERAL_G, &gForces, 0, x, y); y += 10; - if (track_td6->var_07 / 4 >= 2) { + // If .TD6 + if (track_td6->version_and_colour_scheme / 4 >= 2) { if (track_td6->total_air_time != 0) { // Total air time airTime = track_td6->total_air_time * 25; diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 9267c94fc3..f36aa355ea 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -190,7 +190,7 @@ static void window_track_list_select(rct_window *w, int index) trackDesign = track_get_info(index, NULL); if (trackDesign == NULL) return; - if (trackDesign->track_td6.var_06 & 4) + if (trackDesign->track_td6.track_flags & 4) window_error_open(STR_THIS_DESIGN_WILL_BE_BUILT_WITH_AN_ALTERNATIVE_VEHICLE_TYPE, -1); window_close(w); @@ -436,13 +436,13 @@ static void window_track_list_paint() RCT2_GLOBAL(0x00F44153, uint8) = 0; // Warnings - if ((track_td6->var_06 & 4) && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) { + if ((track_td6->track_flags & 4) && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) { // Vehicle design not available gfx_draw_string_centred_clipped(dpi, STR_VEHICLE_DESIGN_UNAVAILABLE, NULL, 0, x, y, 368); y -= 10; } - if (track_td6->var_06 & 1) { + if (track_td6->track_flags & 1) { RCT2_GLOBAL(0x00F44153, uint8) = 1; if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) { // Scenery not available @@ -509,7 +509,7 @@ static void window_track_list_paint() y += 10; // Maximum negative verical Gs - gForces = track_td6->max_negitive_vertical_g * 32; + gForces = track_td6->max_negative_vertical_g * 32; gfx_draw_string_left(dpi, STR_MAX_NEGATIVE_VERTICAL_G, &gForces, 0, x, y); y += 10; @@ -518,7 +518,8 @@ static void window_track_list_paint() gfx_draw_string_left(dpi, STR_MAX_LATERAL_G, &gForces, 0, x, y); y += 10; - if (track_td6->var_07 / 4 >= 2) { + // If .TD6 + if (track_td6->version_and_colour_scheme / 4 >= 2) { if (track_td6->total_air_time != 0) { // Total air time airTime = track_td6->total_air_time * 25;