From 604e17007fe1ba024c206d69913fcecdc7ce1d75 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 6 Jan 2017 12:55:50 +0000 Subject: [PATCH] Copy over some properties --- src/openrct2/rct1.h | 84 ++++++++++++++++++++++++++++++++ src/openrct2/rct1/S4Importer.cpp | 64 ++++++++++++++++++++++++ 2 files changed, 148 insertions(+) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 4afa5da472..f5ad5cdee7 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -245,6 +245,90 @@ typedef struct rct1_vehicle { uint8 ride; // 0x30 uint8 vehicle_type; // 0x31 rct_vehicle_colour colours; // 0x32 + union { + uint16 track_progress; // 0x34 + struct { + sint8 var_34; + uint8 var_35; + }; + }; + union { + sint16 track_direction; // 0x36 (0000 0000 0000 0011) + sint16 track_type; // 0x36 (0000 0011 1111 1100) + rct_xy8 boat_location; // 0x36 + }; + uint16 track_x; // 0x38 + uint16 track_y; // 0x3A + uint16 track_z; // 0x3C + uint16 next_vehicle_on_train; // 0x3E + + // The previous vehicle on the same train or the last vehicle on the previous or only train. + uint16 prev_vehicle_on_ride; // 0x40 + + // The next vehicle on the same train or the first vehicle on the next or only train + uint16 next_vehicle_on_ride; // 0x42 + + uint16 var_44; + uint16 friction; // 0x46 + uint16 update_flags; // 0x48 + uint8 var_4A; + uint8 current_station; // 0x4B + union { + sint16 swinging_car_var_0; // 0x4C + sint16 current_time; // 0x4C + struct { + sint8 ferris_wheel_var_0; // 0x4C + sint8 ferris_wheel_var_1; // 0x4D + }; + }; + sint16 var_4E; + uint8 status; // 0x50 + uint8 sub_state; // 0x51 + uint16 peep[32]; // 0x52 + uint8 peep_tshirt_colours[32]; // 0x92 + uint8 num_seats; // 0xB2 + uint8 num_peeps; // 0xB3 + uint8 next_free_seat; // 0xB4 + uint8 restraints_position; // 0xB5 0 == Close, 255 == Open + sint16 var_B6; + uint16 var_B8; + uint8 var_BA; + uint8 sound1_id; // 0xBB + uint8 sound1_volume; // 0xBC + uint8 sound2_id; // 0xBD + uint8 sound2_volume; // 0xBE + sint8 var_BF; + union { + uint16 var_C0; + uint16 time_waiting; // 0xC0 + uint16 cable_lift_target; // 0xC0 + }; + uint8 speed; // 0xC2 + uint8 powered_acceleration; // 0xC3 + uint8 var_C4; + uint8 var_C5; + uint8 pad_C6[0x2]; + uint16 var_C8; + uint16 var_CA; + uint8 scream_sound_id; // 0xCC + uint8 var_CD; + union { + uint8 var_CE; + uint8 num_laps; // 0xCE + }; + union { + uint8 var_CF; + uint8 brake_speed; // 0xCF + }; + uint16 lost_time_out; // 0xD0 + sint8 vertical_drop_countdown; // 0xD1 + uint8 var_D3; + uint8 mini_golf_current_animation; + uint8 mini_golf_flags; // 0xD5 + uint8 ride_subtype; // 0xD6 + uint8 colours_extended; // 0xD7 + uint8 seat_rotation; // 0xD8 + uint8 target_seat_rotation; // 0xD9 } rct1_vehicle; typedef struct rct1_peep { diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index ff205e6c4e..b12379295f 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -812,11 +812,75 @@ private: void ImportVehicle(rct_vehicle * dst, rct1_vehicle * src) { + // TODO perform vehicle type conversion + // this will be whether the vehicle is the head of the train or a seat etc. + uint8 vehicleEntryIndex = 0; + + rct_ride * ride = get_ride(src->ride); + rct_ride_entry * rideEntry = get_ride_entry_by_ride(ride); + rct_ride_entry_vehicle * vehicleEntry = &rideEntry->vehicles[vehicleEntryIndex]; + dst->sprite_identifier = SPRITE_IDENTIFIER_VEHICLE; dst->ride = src->ride; + dst->ride_subtype = ride->subtype; + + dst->vehicle_type = vehicleEntryIndex; + dst->is_child = src->is_child; + dst->var_44 = ror32(vehicleEntry->spacing, 10) & 0xFFFF; + dst->remaining_distance = src->remaining_distance; + + // Properties from vehicle entry + dst->sprite_width = vehicleEntry->sprite_width; + dst->sprite_height_negative = vehicleEntry->sprite_height_negative; + dst->sprite_height_positive = vehicleEntry->sprite_height_positive; + dst->friction = vehicleEntry->car_friction; + dst->num_seats = vehicleEntry->num_seats; + dst->speed = vehicleEntry->powered_max_speed; + dst->powered_acceleration = vehicleEntry->powered_acceleration; + + dst->velocity = src->velocity; + dst->acceleration = src->acceleration; + dst->var_4A = src->var_4A; + dst->swinging_car_var_0 = src->swinging_car_var_0; + dst->var_4E = src->var_4E; + dst->restraints_position = src->restraints_position; + dst->var_BA = src->var_BA; + dst->var_B6 = src->var_B6; + dst->var_B8 = src->var_B8; + dst->sound1_id = 0xFF; + dst->sound2_id = 0xFF; + dst->next_vehicle_on_train = SPRITE_INDEX_NULL; + dst->var_C4 = src->var_C4; + dst->var_C5 = src->var_C5; + dst->var_C8 = src->var_C8; + dst->scream_sound_id = 255; + dst->vehicle_sprite_type = 0; + dst->bank_rotation = src->bank_rotation; + dst->target_seat_rotation = src->target_seat_rotation; + dst->seat_rotation = src->seat_rotation; + + // Guests + for (int i = 0; i < 32; i++) + { + dst->peep[i] = SPRITE_INDEX_NULL; + } + + dst->var_CD = 0; + dst->track_x = src->track_x; + dst->track_y = src->track_y; + dst->track_z = src->track_z; + dst->current_station = src->current_station; + dst->track_type = src->track_type; + dst->track_progress = src->track_progress; + dst->status = src->status; + dst->sub_state = src->sub_state; + dst->update_flags = src->update_flags; sprite_move(src->x, src->y, src->z, (rct_sprite *)dst); invalidate_sprite_2((rct_sprite *)dst); + + dst->num_peeps = 0; + dst->next_free_seat = 0; } void ImportPeeps()