mirror of https://github.com/OpenRCT2/OpenRCT2.git
Started .TD6 creation function.
Labelled known offsets from compare to ride structure.
This commit is contained in:
parent
dde9611343
commit
f6f671e27f
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue