Started .TD6 creation function.

Labelled known offsets from compare to ride structure.
This commit is contained in:
Duncan Frost 2015-04-26 12:33:00 +01:00
parent dde9611343
commit f6f671e27f
8 changed files with 111 additions and 37 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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{

View File

@ -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;

View File

@ -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;

View File

@ -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;