From 7a4ca989ba2354f3d221e7a687c3f2f52585e6fa Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 6 Jan 2017 12:24:40 +0000 Subject: [PATCH 01/48] Add beginnings of vehicle importing --- src/openrct2/rct1.h | 35 ++++++++++++++++++++++++++++++++ src/openrct2/rct1/S4Importer.cpp | 28 +++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 4216a4dfd9..4afa5da472 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -213,6 +213,40 @@ typedef struct rct1_unk_sprite { uint8 var_71; } rct1_unk_sprite; +typedef struct rct1_vehicle { + uint8 sprite_identifier; // 0x00 + uint8 is_child; // 0x01 + uint16 next_in_quadrant; // 0x02 + uint16 next; // 0x04 + uint16 previous; // 0x06 + uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_... + // Height from center of sprite to bottom + uint8 sprite_height_negative; // 0x09 + uint16 sprite_index; // 0x0A + uint16 flags; // 0x0C + sint16 x; // 0x0E + sint16 y; // 0x10 + sint16 z; // 0x12 + // Width from center of sprite to edge + uint8 sprite_width; // 0x14 + // Height from center of sprite to top + uint8 sprite_height_positive; // 0x15 + sint16 sprite_left; // 0x16 + sint16 sprite_top; // 0x18 + sint16 sprite_right; // 0x1A + sint16 sprite_bottom; // 0x1C + uint8 sprite_direction; // 0x1E + uint8 vehicle_sprite_type; // 0x1F + uint8 bank_rotation; // 0x20 + uint8 pad_21[3]; + sint32 remaining_distance; // 0x24 + sint32 velocity; // 0x28 + sint32 acceleration; // 0x2C + uint8 ride; // 0x30 + uint8 vehicle_type; // 0x31 + rct_vehicle_colour colours; // 0x32 +} rct1_vehicle; + typedef struct rct1_peep { uint8 sprite_identifier; // 0x00 uint8 misc_identifier; // 0x01 @@ -405,6 +439,7 @@ enum RCT1_PEEP_SPRITE_TYPE { typedef union rct1_sprite { uint8 pad_00[0x100]; rct1_unk_sprite unknown; + rct1_vehicle vehicle; rct1_peep peep; rct_litter litter; rct_balloon balloon; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 0e7aae7e7c..ff205e6c4e 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -786,11 +786,39 @@ private: void ImportSprites() { + ImportVehicles(); ImportPeeps(); ImportLitter(); ImportMiscSprites(); } + void ImportVehicles() + { + for (int i = 0; i < RCT1_MAX_SPRITES; i++) + { + if (_s4.sprites[i].unknown.sprite_identifier == SPRITE_IDENTIFIER_VEHICLE) + { + rct1_vehicle * srcVehicle = &_s4.sprites[i].vehicle; + if (srcVehicle->x != (sint16)0x8000) + { + rct_vehicle * vehicle = (rct_vehicle *)create_sprite(SPRITE_IDENTIFIER_VEHICLE); + move_sprite_to_list((rct_sprite *)vehicle, SPRITE_LIST_VEHICLE * 2); + + ImportVehicle(vehicle, srcVehicle); + } + } + } + } + + void ImportVehicle(rct_vehicle * dst, rct1_vehicle * src) + { + dst->sprite_identifier = SPRITE_IDENTIFIER_VEHICLE; + dst->ride = src->ride; + + sprite_move(src->x, src->y, src->z, (rct_sprite *)dst); + invalidate_sprite_2((rct_sprite *)dst); + } + void ImportPeeps() { for (size_t i = 0; i < RCT1_MAX_SPRITES; i++) From 604e17007fe1ba024c206d69913fcecdc7ce1d75 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 6 Jan 2017 12:55:50 +0000 Subject: [PATCH 02/48] 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() From f52286a442b0bdcf4d636e1d2a15cd39d4125527 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 6 Jan 2017 18:16:36 +0000 Subject: [PATCH 03/48] Import and fix vehicle links --- src/openrct2/rct1.h | 9 +++-- src/openrct2/rct1/S4Importer.cpp | 64 ++++++++++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index f5ad5cdee7..cad0454ebb 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -27,8 +27,9 @@ #include "world/map.h" #include "world/sprite.h" -#define RCT1_MAX_MAP_ELEMENTS 0xC000 -#define RCT1_MAX_SPRITES 5000 +#define RCT1_MAX_MAP_ELEMENTS 0xC000 +#define RCT1_MAX_SPRITES 5000 +#define RCT1_MAX_VEHICLES_PER_RIDE 12 #pragma pack(push, 1) typedef struct rct1_entrance { @@ -52,7 +53,7 @@ typedef struct rct1_ride { struct { colour_t body; colour_t trim; - } vehicle_colours[12]; + } vehicle_colours[RCT1_MAX_VEHICLES_PER_RIDE]; colour_t track_primary_colour; colour_t track_secondary_colour; colour_t track_support_colour; @@ -70,7 +71,7 @@ typedef struct rct1_ride { uint16 exit[4]; uint16 last_peep_in_queue[4]; uint8 num_peeps_in_queue[4]; - uint16 vehicles[12]; + uint16 vehicles[RCT1_MAX_VEHICLES_PER_RIDE]; uint8 depart_flags; uint8 num_stations; uint8 num_trains; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index b12379295f..373c501b71 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -552,6 +552,7 @@ private: dst->status = RIDE_STATUS_CLOSED; // Flags + if (src->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) dst->lifecycle_flags |= RIDE_LIFECYCLE_ON_TRACK; if (src->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO) dst->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO; if (src->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE) dst->lifecycle_flags |= RIDE_LIFECYCLE_INDESTRUCTIBLE; if (src->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) dst->lifecycle_flags |= RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK; @@ -586,10 +587,16 @@ private: } dst->num_stations = src->num_stations; - for (sint32 i = 0; i < 32; i++) + // Vehicle links (indexes converted later) + for (sint32 i = 0; i < RCT1_MAX_VEHICLES_PER_RIDE; i++) + { + dst->vehicles[i] = src->vehicles[i]; + } + for (sint32 i = RCT1_MAX_VEHICLES_PER_RIDE; i < 32; i++) { dst->vehicles[i] = SPRITE_INDEX_NULL; } + dst->num_vehicles = src->num_trains; dst->num_cars_per_train = src->num_cars_per_train + rideEntry->zero_cars; dst->proposed_num_vehicles = src->num_trains; @@ -751,6 +758,23 @@ private: dst->music_tune_id = 255; } + void FixRideVehicleLinks(const uint16 * spriteIndexMap) + { + uint8 i; + rct_ride * ride; + FOR_ALL_RIDES(i, ride) + { + for (uint8 j = 0; j < Util::CountOf(ride->vehicles); j++) + { + uint16 originalIndex = ride->vehicles[j]; + if (originalIndex != SPRITE_INDEX_NULL) + { + ride->vehicles[j] = spriteIndexMap[originalIndex]; + } + } + } + } + void FixNumPeepsInQueue() { sint32 i; @@ -794,8 +818,11 @@ private: void ImportVehicles() { + std::vector vehicles; + uint16 spriteIndexMap[RCT1_MAX_SPRITES]; for (int i = 0; i < RCT1_MAX_SPRITES; i++) { + spriteIndexMap[i] = SPRITE_INDEX_NULL; if (_s4.sprites[i].unknown.sprite_identifier == SPRITE_IDENTIFIER_VEHICLE) { rct1_vehicle * srcVehicle = &_s4.sprites[i].vehicle; @@ -803,11 +830,18 @@ private: { rct_vehicle * vehicle = (rct_vehicle *)create_sprite(SPRITE_IDENTIFIER_VEHICLE); move_sprite_to_list((rct_sprite *)vehicle, SPRITE_LIST_VEHICLE * 2); + spriteIndexMap[i] = vehicle->sprite_index; + vehicles.push_back(vehicle); ImportVehicle(vehicle, srcVehicle); } } } + for (auto vehicle : vehicles) + { + FixVehicleLinks(vehicle, spriteIndexMap); + } + FixRideVehicleLinks(spriteIndexMap); } void ImportVehicle(rct_vehicle * dst, rct1_vehicle * src) @@ -815,6 +849,10 @@ private: // TODO perform vehicle type conversion // this will be whether the vehicle is the head of the train or a seat etc. uint8 vehicleEntryIndex = 0; + if (src->vehicle_type == 36) + { + vehicleEntryIndex = 1; + } rct_ride * ride = get_ride(src->ride); rct_ride_entry * rideEntry = get_ride_entry_by_ride(ride); @@ -849,7 +887,6 @@ private: 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; @@ -859,13 +896,18 @@ private: dst->target_seat_rotation = src->target_seat_rotation; dst->seat_rotation = src->seat_rotation; + // Vehicle links (indexes converted later) + dst->prev_vehicle_on_ride = src->prev_vehicle_on_ride; + dst->next_vehicle_on_ride = src->next_vehicle_on_ride; + dst->next_vehicle_on_train = src->next_vehicle_on_train; + // Guests for (int i = 0; i < 32; i++) { dst->peep[i] = SPRITE_INDEX_NULL; } - dst->var_CD = 0; + dst->var_CD = src->var_CD; dst->track_x = src->track_x; dst->track_y = src->track_y; dst->track_z = src->track_z; @@ -883,6 +925,22 @@ private: dst->next_free_seat = 0; } + void FixVehicleLinks(rct_vehicle * vehicle, const uint16 * spriteIndexMap) + { + if (vehicle->prev_vehicle_on_ride != SPRITE_INDEX_NULL) + { + vehicle->prev_vehicle_on_ride = spriteIndexMap[vehicle->prev_vehicle_on_ride]; + } + if (vehicle->next_vehicle_on_ride != SPRITE_INDEX_NULL) + { + vehicle->next_vehicle_on_ride = spriteIndexMap[vehicle->next_vehicle_on_ride]; + } + if (vehicle->next_vehicle_on_train != SPRITE_INDEX_NULL) + { + vehicle->next_vehicle_on_train = spriteIndexMap[vehicle->next_vehicle_on_train]; + } + } + void ImportPeeps() { for (size_t i = 0; i < RCT1_MAX_SPRITES; i++) From 390a03a540e0f667e3d5ecb93c1850f37556af95 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 6 Jan 2017 21:53:46 +0000 Subject: [PATCH 04/48] Remove seat rotation from RCT1 vehicle struct --- src/openrct2/rct1.h | 2 -- src/openrct2/rct1/S4Importer.cpp | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index cad0454ebb..19beb30001 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -328,8 +328,6 @@ typedef struct rct1_vehicle { 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 373c501b71..ea1afeabfd 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -893,8 +893,10 @@ private: 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; + + // Seat rotation was not in RCT1 + dst->target_seat_rotation = 4; + dst->seat_rotation = 4; // Vehicle links (indexes converted later) dst->prev_vehicle_on_ride = src->prev_vehicle_on_ride; From 748d82f517ab140a0bdd31d31ae7fc445f56d1c1 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 6 Jan 2017 23:09:37 +0100 Subject: [PATCH 05/48] Import peeps in vehicles as well --- src/openrct2/rct1/S4Importer.cpp | 38 ++++++++++---------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index ea1afeabfd..dbdfe58f27 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -548,8 +548,7 @@ private: args[1] = src->name_argument_number; } - // We can't convert vehicles yet so just close the ride - dst->status = RIDE_STATUS_CLOSED; + dst->status = src->status; // Flags if (src->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) dst->lifecycle_flags |= RIDE_LIFECYCLE_ON_TRACK; @@ -577,12 +576,12 @@ private: dst->station_depart[i] = src->station_light[i]; // Use src->station_depart[i] when we import with guests and vehicles intact - dst->train_at_station[i] = 0xFF; + dst->train_at_station[i] = src->station_depart[i]; dst->entrances[i] = src->entrance[i]; dst->exits[i] = src->exit[i]; dst->queue_time[i] = src->queue_time[i]; - dst->last_peep_in_queue[i] = SPRITE_INDEX_NULL; + dst->last_peep_in_queue[i] = src->last_peep_in_queue[i]; dst->queue_length[i] = src->num_peeps_in_queue[i]; } dst->num_stations = src->num_stations; @@ -600,7 +599,7 @@ private: dst->num_vehicles = src->num_trains; dst->num_cars_per_train = src->num_cars_per_train + rideEntry->zero_cars; dst->proposed_num_vehicles = src->num_trains; - dst->max_trains = 32; + dst->max_trains = src->max_trains; dst->proposed_num_cars_per_train = src->num_cars_per_train + rideEntry->zero_cars; dst->special_track_elements = src->special_track_elements; dst->num_sheltered_sections = src->num_sheltered_sections; @@ -906,7 +905,7 @@ private: // Guests for (int i = 0; i < 32; i++) { - dst->peep[i] = SPRITE_INDEX_NULL; + dst->peep[i] = src->peep[i]; } dst->var_CD = src->var_CD; @@ -923,8 +922,8 @@ private: 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; + dst->num_peeps = src->num_peeps; + dst->next_free_seat = src->next_free_seat; } void FixVehicleLinks(rct_vehicle * vehicle, const uint16 * spriteIndexMap) @@ -950,13 +949,11 @@ private: if (_s4.sprites[i].unknown.sprite_identifier == SPRITE_IDENTIFIER_PEEP) { rct1_peep *srcPeep = &_s4.sprites[i].peep; - if (srcPeep->x != MAP_LOCATION_NULL || srcPeep->state == PEEP_STATE_ON_RIDE) - { - rct_peep *peep = (rct_peep*)create_sprite(SPRITE_IDENTIFIER_PEEP); - move_sprite_to_list((rct_sprite*)peep, SPRITE_LIST_PEEP * 2); - ImportPeep(peep, srcPeep); - } + rct_peep *peep = (rct_peep*)create_sprite(SPRITE_IDENTIFIER_PEEP); + move_sprite_to_list((rct_sprite*)peep, SPRITE_LIST_PEEP * 2); + + ImportPeep(peep, srcPeep); } } } @@ -1001,18 +998,7 @@ private: dst->outside_of_park = src->outside_of_park; - // We cannot yet import peeps that are on a ride properly. Move these to a safe place. - switch(src->state) { - case PEEP_STATE_ON_RIDE: - case PEEP_STATE_QUEUING_FRONT: - case PEEP_STATE_LEAVING_RIDE: - case PEEP_STATE_ENTERING_RIDE: - dst->state = PEEP_STATE_FALLING; - peep_autoposition(dst); - break; - default: - dst->state = src->state; - } + dst->state = src->state; dst->type = src->type; From 6c339787ee97c626838be314bb1ac69e629e87c1 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 6 Jan 2017 22:22:07 +0000 Subject: [PATCH 06/48] Fix peep links in vehicles --- src/openrct2/rct1/S4Importer.cpp | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index dbdfe58f27..a9470f962e 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -902,7 +902,7 @@ private: dst->next_vehicle_on_ride = src->next_vehicle_on_ride; dst->next_vehicle_on_train = src->next_vehicle_on_train; - // Guests + // Guests (indexes converted later) for (int i = 0; i < 32; i++) { dst->peep[i] = src->peep[i]; @@ -942,20 +942,43 @@ private: } } + void FixVehiclePeepLinks(rct_vehicle * vehicle, const uint16 * spriteIndexMap) + { + for (int i = 0; i < 32; i++) + { + uint16 originalSpriteIndex = vehicle->peep[i]; + if (originalSpriteIndex != SPRITE_INDEX_NULL) + { + vehicle->peep[i] = spriteIndexMap[originalSpriteIndex]; + } + } + } + void ImportPeeps() { + uint16 spriteIndexMap[RCT1_MAX_SPRITES]; for (size_t i = 0; i < RCT1_MAX_SPRITES; i++) { + spriteIndexMap[i] = SPRITE_INDEX_NULL; if (_s4.sprites[i].unknown.sprite_identifier == SPRITE_IDENTIFIER_PEEP) { - rct1_peep *srcPeep = &_s4.sprites[i].peep; - - rct_peep *peep = (rct_peep*)create_sprite(SPRITE_IDENTIFIER_PEEP); + rct1_peep * srcPeep = &_s4.sprites[i].peep; + rct_peep * peep = (rct_peep*)create_sprite(SPRITE_IDENTIFIER_PEEP); move_sprite_to_list((rct_sprite*)peep, SPRITE_LIST_PEEP * 2); + spriteIndexMap[i] = peep->sprite_index; ImportPeep(peep, srcPeep); } } + for (size_t i = 0; i < MAX_SPRITES; i++) + { + rct_sprite * sprite = get_sprite(i); + if (sprite->unknown.sprite_identifier == SPRITE_IDENTIFIER_VEHICLE) + { + rct_vehicle * vehicle = (rct_vehicle *)sprite; + FixVehiclePeepLinks(vehicle, spriteIndexMap); + } + } } void ImportPeep(rct_peep * dst, rct1_peep * src) From 8646f5d4ee2285bf451660c49a742dce41893bf7 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 6 Jan 2017 23:30:04 +0100 Subject: [PATCH 07/48] Use speed, friction from source vehicle --- src/openrct2/rct1/S4Importer.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index a9470f962e..91b91bbd64 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -867,13 +867,20 @@ private: 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->sprite_width = src->sprite_width; //vehicleEntry->sprite_width; + dst->sprite_height_negative = src->sprite_height_negative; //vehicleEntry->sprite_height_negative; + dst->sprite_height_positive = src->sprite_height_positive; //vehicleEntry->sprite_height_positive; + + dst->sprite_left = src->sprite_left; + dst->sprite_top = src->sprite_top; + dst->sprite_right = src->sprite_right; + dst->sprite_bottom = src->sprite_bottom; + + + dst->friction = src->friction; //vehicleEntry->car_friction; + dst->num_seats = src->num_seats; //vehicleEntry->num_seats; + dst->speed = src->speed; //vehicleEntry->powered_max_speed; + dst->powered_acceleration = src->powered_acceleration; //vehicleEntry->powered_acceleration; dst->velocity = src->velocity; dst->acceleration = src->acceleration; @@ -890,13 +897,9 @@ private: dst->var_C5 = src->var_C5; dst->var_C8 = src->var_C8; dst->scream_sound_id = 255; - dst->vehicle_sprite_type = 0; + dst->vehicle_sprite_type = src->vehicle_sprite_type; dst->bank_rotation = src->bank_rotation; - // Seat rotation was not in RCT1 - dst->target_seat_rotation = 4; - dst->seat_rotation = 4; - // Vehicle links (indexes converted later) dst->prev_vehicle_on_ride = src->prev_vehicle_on_ride; dst->next_vehicle_on_ride = src->next_vehicle_on_ride; From f7f744f59b6a1edc8836925639a8cebbdab7d843 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 7 Jan 2017 00:01:13 +0100 Subject: [PATCH 08/48] Use a map to convert vehicle subentry and restore seat rotation --- src/openrct2/rct1.h | 7 + src/openrct2/rct1/S4Importer.cpp | 19 ++- src/openrct2/rct1/Tables.h | 1 + src/openrct2/rct1/tables.cpp | 264 +++++++++++++++++++++++++++++++ 4 files changed, 286 insertions(+), 5 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 19beb30001..33f8e0358d 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1121,6 +1121,13 @@ enum { RCT1_PARK_FLAGS_LOCK_REAL_NAMES_OPTION = (1 << 15), }; +enum { + STEEL_RC_FRONT = 0, + STEEL_RC_CARRIAGE = 1, + MINE_TRAIN_FRONT = 35, + MINE_TRAIN_CARRIAGE = 36, +}; + #define RCT1_MAX_STATIONS 4 extern const uint8 gRideCategories[0x60]; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 91b91bbd64..cc92e6c02f 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -847,11 +847,16 @@ private: { // TODO perform vehicle type conversion // this will be whether the vehicle is the head of the train or a seat etc. - uint8 vehicleEntryIndex = 0; - if (src->vehicle_type == 36) - { - vehicleEntryIndex = 1; - } +// uint8 vehicleEntryIndex = 0; +// if (src->vehicle_type == 36) +// { +// vehicleEntryIndex = 1; +// } + char buf[64]; + sprintf(buf, "%d", src->vehicle_type); + log_error(buf); + + uint8 vehicleEntryIndex = RCT1::GetVehicleSubEntryIndex(src->vehicle_type); rct_ride * ride = get_ride(src->ride); rct_ride_entry * rideEntry = get_ride_entry_by_ride(ride); @@ -900,6 +905,10 @@ private: dst->vehicle_sprite_type = src->vehicle_sprite_type; dst->bank_rotation = src->bank_rotation; + // Seat rotation was not in RCT1 + dst->target_seat_rotation = 4; + dst->seat_rotation = 4; + // Vehicle links (indexes converted later) dst->prev_vehicle_on_ride = src->prev_vehicle_on_ride; dst->next_vehicle_on_ride = src->next_vehicle_on_ride; diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index bbe18cae15..5f859eb304 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -33,6 +33,7 @@ namespace RCT1 bool RideTypeUsesVehicles(uint8 rideType); bool PathIsQueue(uint8 pathType); uint8 NormalisePathAddition(uint8 pathAdditionType); + uint8 GetVehicleSubEntryIndex(uint8 vehicleSubEntry); const char * GetRideTypeObject(uint8 rideType); const char * GetVehicleObject(uint8 vehicleType); diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index 98234776fe..7bab63d51b 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -314,6 +314,270 @@ namespace RCT1 return pathAdditionType; } + uint8 GetVehicleSubEntryIndex(uint8 vehicleSubEntry) + { + static const uint8 map[] = + { + 0, // STEEL_RC_FRONT + 1, // STEEL_RC_CARRIAGE + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, //MINE_TRAIN_FRONT + 1, //MINE_TRAIN_CARRIAGE + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }; + return map[vehicleSubEntry]; + } + const char * GetRideTypeObject(uint8 rideType) { static const char * map[] = From e3d197e856c270bec9282567e3ecd7bdbd305d1c Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 7 Jan 2017 00:19:32 +0100 Subject: [PATCH 09/48] Import Corkscrew train correctly, import colours --- src/openrct2/rct1.h | 3 +++ src/openrct2/rct1/S4Importer.cpp | 5 +++++ src/openrct2/rct1/tables.cpp | 8 ++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 33f8e0358d..a3781653e5 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1124,8 +1124,11 @@ enum { enum { STEEL_RC_FRONT = 0, STEEL_RC_CARRIAGE = 1, + WOODEN_RC_TRAIN = 2, MINE_TRAIN_FRONT = 35, MINE_TRAIN_CARRIAGE = 36, + CORKSCREW_RC_FRONT = 38, + CORKSCREW_RC_CARRIAGE = 39, }; #define RCT1_MAX_STATIONS 4 diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index cc92e6c02f..80d4323bcf 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -918,6 +918,7 @@ private: for (int i = 0; i < 32; i++) { dst->peep[i] = src->peep[i]; + dst->peep_tshirt_colours[i] = RCT1::GetColour(src->peep_tshirt_colours[i]); } dst->var_CD = src->var_CD; @@ -930,6 +931,10 @@ private: dst->status = src->status; dst->sub_state = src->sub_state; dst->update_flags = src->update_flags; + dst->colours.body_colour = RCT1::GetColour(src->colours.body_colour); + dst->colours.trim_colour = RCT1::GetColour(src->colours.trim_colour); + dst->colours_extended = RCT1::GetColour(src->colours_extended); + sprite_move(src->x, src->y, src->z, (rct_sprite *)dst); invalidate_sprite_2((rct_sprite *)dst); diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index 7bab63d51b..df325cd15f 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -353,11 +353,11 @@ namespace RCT1 0, 0, 0, - 0, //MINE_TRAIN_FRONT - 1, //MINE_TRAIN_CARRIAGE - 0, - 0, + 0, // MINE_TRAIN_FRONT + 1, // MINE_TRAIN_CARRIAGE 0, + 0, // CORKSCREW_RC_FRONT + 1, // CORKSCREW_RC_CARRIAGE 0, 0, 0, From fc7b03747e322984af22852262a64237fa942ac1 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 7 Jan 2017 00:37:56 +0100 Subject: [PATCH 10/48] Import ride measurements (with bugs) --- src/openrct2/rct1/S4Importer.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 80d4323bcf..ca2c428e4f 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -800,11 +800,14 @@ private: void ImportRideMeasurement(rct_ride_measurement * dst, rct_ride_measurement * src) { // Not yet supported - // *dst = *src; - // for (sint32 i = 0; i < RIDE_MEASUREMENT_MAX_ITEMS; i++) - // { - // dst->altitude[i] /= 2; - // } + *dst = *src; + for (sint32 i = 0; i < RIDE_MEASUREMENT_MAX_ITEMS; i++) + { + dst->velocity[i] /= 2; + dst->altitude[i] /= 2; + dst->vertical[i] /= 2; + dst->lateral[i] /= 2; + } } void ImportSprites() From dacfba9eda2b1667cfffe2755fcae2b388c13e23 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 7 Jan 2017 14:10:28 +0100 Subject: [PATCH 11/48] Import more fields, correct more vehicles --- src/openrct2/rct1.h | 8 + src/openrct2/rct1/S4Importer.cpp | 22 +- src/openrct2/rct1/tables.cpp | 512 +++++++++++++++---------------- 3 files changed, 280 insertions(+), 262 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index a3781653e5..a548c82ea8 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1125,10 +1125,18 @@ enum { STEEL_RC_FRONT = 0, STEEL_RC_CARRIAGE = 1, WOODEN_RC_TRAIN = 2, + MINIATURE_RAILWAY_TENDER = 15, + MINIATURE_RAILWAY_LOCOMOTIVE = 16, + MINIATURE_RAILWAY_CARRIAGE = 17, MINE_TRAIN_FRONT = 35, MINE_TRAIN_CARRIAGE = 36, CORKSCREW_RC_FRONT = 38, CORKSCREW_RC_CARRIAGE = 39, + TWISTER_RC_SPOILER = 64, + TWISTER_RC_CARRIAGE = 65, + STANDUP_TWISTER_RC_CARRIAGE = 72, + HYPERCOASTER_FRONT = 96, + HYPERCOASTER_CARRIAGE = 97, }; #define RCT1_MAX_STATIONS 4 diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index ca2c428e4f..9069ca8d70 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -862,8 +862,8 @@ private: uint8 vehicleEntryIndex = RCT1::GetVehicleSubEntryIndex(src->vehicle_type); 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]; + //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; @@ -871,7 +871,7 @@ private: dst->vehicle_type = vehicleEntryIndex; dst->is_child = src->is_child; - dst->var_44 = ror32(vehicleEntry->spacing, 10) & 0xFFFF; + dst->var_44 = src->var_44; //ror32(vehicleEntry->spacing, 10) & 0xFFFF; dst->remaining_distance = src->remaining_distance; // Properties from vehicle entry @@ -889,6 +889,7 @@ private: dst->num_seats = src->num_seats; //vehicleEntry->num_seats; dst->speed = src->speed; //vehicleEntry->powered_max_speed; dst->powered_acceleration = src->powered_acceleration; //vehicleEntry->powered_acceleration; + dst->brake_speed = src->brake_speed; dst->velocity = src->velocity; dst->acceleration = src->acceleration; @@ -897,13 +898,18 @@ private: dst->var_4E = src->var_4E; dst->restraints_position = src->restraints_position; dst->var_BA = src->var_BA; + dst->var_BF = src->var_BF; dst->var_B6 = src->var_B6; dst->var_B8 = src->var_B8; dst->sound1_id = 0xFF; dst->sound2_id = 0xFF; + dst->var_C0 = src->var_C0; dst->var_C4 = src->var_C4; dst->var_C5 = src->var_C5; dst->var_C8 = src->var_C8; + dst->var_CA = src->var_CA; + dst->var_CE = src->var_CE; + dst->var_D3 = src->var_D3; dst->scream_sound_id = 255; dst->vehicle_sprite_type = src->vehicle_sprite_type; dst->bank_rotation = src->bank_rotation; @@ -931,13 +937,16 @@ private: dst->current_station = src->current_station; dst->track_type = src->track_type; dst->track_progress = src->track_progress; + dst->vertical_drop_countdown = src->vertical_drop_countdown; + dst->lost_time_out = src->lost_time_out; dst->status = src->status; dst->sub_state = src->sub_state; dst->update_flags = src->update_flags; dst->colours.body_colour = RCT1::GetColour(src->colours.body_colour); dst->colours.trim_colour = RCT1::GetColour(src->colours.trim_colour); dst->colours_extended = RCT1::GetColour(src->colours_extended); - + dst->mini_golf_current_animation = src->mini_golf_current_animation; + dst->mini_golf_flags = src->mini_golf_flags; sprite_move(src->x, src->y, src->z, (rct_sprite *)dst); invalidate_sprite_2((rct_sprite *)dst); @@ -1090,7 +1099,7 @@ private: dst->time_on_ride = src->time_on_ride; dst->days_in_queue = src->days_in_queue; - dst->interactionRideIndex = 0xFF; + dst->interactionRideIndex = src->interactionRideIndex; dst->id = src->id; dst->cash_in_pocket = src->cash_in_pocket; @@ -1129,7 +1138,8 @@ private: dst->thoughts[i] = src->thoughts[i]; } - dst->previous_ride = 0xFF; + dst->previous_ride = src->previous_ride; + dst->previous_ride_time_out = src->previous_ride_time_out; dst->var_C4 = 0; dst->guest_heading_to_ride_id = src->guest_heading_to_ride_id; diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index df325cd15f..1ca3a7ca92 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -318,262 +318,262 @@ namespace RCT1 { static const uint8 map[] = { - 0, // STEEL_RC_FRONT - 1, // STEEL_RC_CARRIAGE - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, // MINE_TRAIN_FRONT - 1, // MINE_TRAIN_CARRIAGE - 0, - 0, // CORKSCREW_RC_FRONT - 1, // CORKSCREW_RC_CARRIAGE - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 0, // STEEL_RC_FRONT + 1, // STEEL_RC_CARRIAGE + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, // MINIATURE_RAILWAY_TENDER + 0, // MINIATURE_RAILWAY_LOCOMOTIVE + 2, // MINIATURE_RAILWAY_CARRIAGE + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, // MINE_TRAIN_FRONT + 1, // MINE_TRAIN_CARRIAGE + 0, + 0, // CORKSCREW_RC_FRONT + 1, // CORKSCREW_RC_CARRIAGE + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, // TWISTER_RC_SPOILER + 0, // TWISTER_RC_CARRIAGE + 0, + 0, + 0, + 0, + 0, + 0, + 0, // STANDUP_TWISTER_RC_CARRIAGE + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, // HYPERCOASTER_FRONT + 1, // HYPERCOASTER_CARRIAGE + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, }; return map[vehicleSubEntry]; } From e3e435c9f75a9c0e6ec6a11a9240859e6beeae19 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 7 Jan 2017 14:52:01 +0000 Subject: [PATCH 12/48] Fix trains splitting up into multiple vehicles --- src/openrct2/rct1/S4Importer.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 9069ca8d70..a7ac4bccb5 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -831,11 +831,16 @@ private: if (srcVehicle->x != (sint16)0x8000) { rct_vehicle * vehicle = (rct_vehicle *)create_sprite(SPRITE_IDENTIFIER_VEHICLE); - move_sprite_to_list((rct_sprite *)vehicle, SPRITE_LIST_VEHICLE * 2); spriteIndexMap[i] = vehicle->sprite_index; vehicles.push_back(vehicle); ImportVehicle(vehicle, srcVehicle); + + // If vehicle is the first car on a train add to train list + if (!vehicle->is_child) + { + move_sprite_to_list((rct_sprite *)vehicle, SPRITE_LIST_TRAIN * 2); + } } } } From c1d532be01ac5ce27128f6394c3ad11a7052e59a Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 8 Jan 2017 17:20:10 +0000 Subject: [PATCH 13/48] Fix colour conversion out of range --- src/openrct2/rct1/S4Importer.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index a7ac4bccb5..ed868b779f 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -931,8 +931,12 @@ private: // Guests (indexes converted later) for (int i = 0; i < 32; i++) { - dst->peep[i] = src->peep[i]; - dst->peep_tshirt_colours[i] = RCT1::GetColour(src->peep_tshirt_colours[i]); + uint16 spriteIndex = src->peep[i]; + dst->peep[i] = spriteIndex; + if (spriteIndex != SPRITE_INDEX_NULL) + { + dst->peep_tshirt_colours[i] = RCT1::GetColour(src->peep_tshirt_colours[i]); + } } dst->var_CD = src->var_CD; @@ -949,7 +953,15 @@ private: dst->update_flags = src->update_flags; dst->colours.body_colour = RCT1::GetColour(src->colours.body_colour); dst->colours.trim_colour = RCT1::GetColour(src->colours.trim_colour); - dst->colours_extended = RCT1::GetColour(src->colours_extended); + if (_gameVersion == FILE_VERSION_RCT1) + { + // TODO we might need to use a lookup table here for default colours + dst->colours_extended = 0; + } + else + { + dst->colours_extended = RCT1::GetColour(src->colours_extended); + } dst->mini_golf_current_animation = src->mini_golf_current_animation; dst->mini_golf_flags = src->mini_golf_flags; From 63d639db5db167ada05dcda5b6321a0028cb6480 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Jan 2017 18:49:26 +0100 Subject: [PATCH 14/48] Fix negative queue lengths, fix monorail, fix chairlift crashes --- src/openrct2/rct1.h | 33 +++++++++++++++++--------------- src/openrct2/rct1/S4Importer.cpp | 32 +++++++++++++++++++++++-------- src/openrct2/rct1/tables.cpp | 6 +++--- 3 files changed, 45 insertions(+), 26 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index a548c82ea8..5dfceae5e4 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1122,21 +1122,24 @@ enum { }; enum { - STEEL_RC_FRONT = 0, - STEEL_RC_CARRIAGE = 1, - WOODEN_RC_TRAIN = 2, - MINIATURE_RAILWAY_TENDER = 15, - MINIATURE_RAILWAY_LOCOMOTIVE = 16, - MINIATURE_RAILWAY_CARRIAGE = 17, - MINE_TRAIN_FRONT = 35, - MINE_TRAIN_CARRIAGE = 36, - CORKSCREW_RC_FRONT = 38, - CORKSCREW_RC_CARRIAGE = 39, - TWISTER_RC_SPOILER = 64, - TWISTER_RC_CARRIAGE = 65, - STANDUP_TWISTER_RC_CARRIAGE = 72, - HYPERCOASTER_FRONT = 96, - HYPERCOASTER_CARRIAGE = 97, + STEEL_RC_FRONT = 0, + STEEL_RC_CARRIAGE = 1, + WOODEN_RC_TRAIN = 2, + MONORAIL_CARRIAGE = 10, + MONORAIL_FRONT = 11, + MONORAIL_BACK = 12, + MINIATURE_RAILWAY_TENDER = 15, + MINIATURE_RAILWAY_LOCOMOTIVE = 16, + MINIATURE_RAILWAY_CARRIAGE = 17, + MINE_TRAIN_FRONT = 35, + MINE_TRAIN_CARRIAGE = 36, + CORKSCREW_RC_FRONT = 38, + CORKSCREW_RC_CARRIAGE = 39, + TWISTER_RC_SPOILER = 64, + TWISTER_RC_CARRIAGE = 65, + STANDUP_TWISTER_RC_CARRIAGE = 72, + HYPERCOASTER_FRONT = 96, + HYPERCOASTER_CARRIAGE = 97, }; #define RCT1_MAX_STATIONS 4 diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index ed868b779f..6ebfbca59a 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -799,7 +799,6 @@ private: void ImportRideMeasurement(rct_ride_measurement * dst, rct_ride_measurement * src) { - // Not yet supported *dst = *src; for (sint32 i = 0; i < RIDE_MEASUREMENT_MAX_ITEMS; i++) { @@ -853,13 +852,6 @@ 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; -// if (src->vehicle_type == 36) -// { -// vehicleEntryIndex = 1; -// } char buf[64]; sprintf(buf, "%d", src->vehicle_type); log_error(buf); @@ -1025,6 +1017,20 @@ private: FixVehiclePeepLinks(vehicle, spriteIndexMap); } } + + int i; + rct_ride *ride; + rct_peep *peep; + + FOR_ALL_RIDES(i, ride) + { + FixRidePeepLinks(ride, spriteIndexMap); + } + + FOR_ALL_GUESTS(i, peep) + { + FixPeepNextInQueue(peep, spriteIndexMap); + } } void ImportPeep(rct_peep * dst, rct1_peep * src) @@ -1068,6 +1074,15 @@ private: dst->outside_of_park = src->outside_of_park; dst->state = src->state; + dst->sub_state = src->sub_state; + dst->next_x = src->next_x; + dst->next_y = src->next_y; + dst->next_z = src->next_z / 2; + dst->next_var_29 = src->next_var_29; + dst->var_37 = src->var_37; + dst->var_42 = src->var_42; + dst->var_73 = src->var_73; + dst->var_EF = src->var_EF; dst->type = src->type; @@ -1207,6 +1222,7 @@ private: void ImportLitter() { + for (size_t i = 0; i < RCT1_MAX_SPRITES; i++) { if (_s4.sprites[i].unknown.sprite_identifier == SPRITE_IDENTIFIER_LITTER) diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index 1ca3a7ca92..65fc8e4c95 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -328,9 +328,9 @@ namespace RCT1 0, 0, 0, - 0, - 0, - 0, + 0, // MONORAIL_CARRIAGE + 1, // MONORAIL_FRONT + 2, // MONORAIL_BACK 0, 0, 1, // MINIATURE_RAILWAY_TENDER From d077cd1341853d23977fc5e02886bc78118364b4 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 12 Jan 2017 00:03:09 +0100 Subject: [PATCH 15/48] Create table for converting colour schemes, fix some vehicles, fix river rapids --- src/openrct2/rct1.h | 5 ++ src/openrct2/rct1/S4Importer.cpp | 89 +++++++++++++++++++++++++--- src/openrct2/rct1/Tables.h | 5 ++ src/openrct2/rct1/tables.cpp | 99 ++++++++++++++++++++++++++++++++ 4 files changed, 190 insertions(+), 8 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 5dfceae5e4..38769ee144 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1142,6 +1142,11 @@ enum { HYPERCOASTER_CARRIAGE = 97, }; +enum { + COPY_COLOUR_1 = -1, + COPY_COLOUR_2 = -2, +}; + #define RCT1_MAX_STATIONS 4 extern const uint8 gRideCategories[0x60]; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 6ebfbca59a..7151bfca79 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -661,6 +661,10 @@ private: { dst->track_colour_main[0] = COLOUR_LIGHT_BLUE; } + else if (src->type == RCT1_RIDE_TYPE_RIVER_RAPIDS) + { + dst->track_colour_main[0] = COLOUR_WHITE; + } } else { @@ -684,8 +688,46 @@ private: { for (sint32 i = 0; i < 12; i++) { - dst->vehicle_colours[i].body_colour = RCT1::GetColour(src->vehicle_colours[i].body); - dst->vehicle_colours[i].trim_colour = RCT1::GetColour(src->vehicle_colours[i].trim); + // RCT1 had no third colour + RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor(src->vehicle_type); + if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_1) + { + dst->vehicle_colours[i].body_colour = RCT1::GetColour(src->vehicle_colours[i].body); + } + else if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_2) + { + dst->vehicle_colours[i].body_colour = RCT1::GetColour(src->vehicle_colours[i].trim); + } + else + { + dst->vehicle_colours[i].body_colour = colourSchemeCopyDescriptor.colour1; + } + + if (colourSchemeCopyDescriptor.colour2 == COPY_COLOUR_1) + { + dst->vehicle_colours[i].trim_colour = RCT1::GetColour(src->vehicle_colours[i].body); + } + else if (colourSchemeCopyDescriptor.colour2 == COPY_COLOUR_2) + { + dst->vehicle_colours[i].trim_colour = RCT1::GetColour(src->vehicle_colours[i].trim); + } + else + { + dst->vehicle_colours[i].trim_colour = colourSchemeCopyDescriptor.colour2; + } + + if (colourSchemeCopyDescriptor.colour3 == COPY_COLOUR_1) + { + dst->vehicle_colours_extended[i] = RCT1::GetColour(src->vehicle_colours[i].body); + } + else if (colourSchemeCopyDescriptor.colour3 == COPY_COLOUR_2) + { + dst->vehicle_colours_extended[i] = RCT1::GetColour(src->vehicle_colours[i].trim); + } + else + { + dst->vehicle_colours_extended[i] = colourSchemeCopyDescriptor.colour3; + } } } @@ -943,17 +985,48 @@ private: dst->status = src->status; dst->sub_state = src->sub_state; dst->update_flags = src->update_flags; - dst->colours.body_colour = RCT1::GetColour(src->colours.body_colour); - dst->colours.trim_colour = RCT1::GetColour(src->colours.trim_colour); - if (_gameVersion == FILE_VERSION_RCT1) + + // RCT1 had no third colour + RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor(src->vehicle_type); + if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_1) { - // TODO we might need to use a lookup table here for default colours - dst->colours_extended = 0; + dst->colours.body_colour = RCT1::GetColour(src->colours.body_colour); + } + else if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_2) + { + dst->colours.body_colour = RCT1::GetColour(src->colours.trim_colour); } else { - dst->colours_extended = RCT1::GetColour(src->colours_extended); + dst->colours.body_colour = colourSchemeCopyDescriptor.colour1; } + + if (colourSchemeCopyDescriptor.colour2 == COPY_COLOUR_1) + { + dst->colours.trim_colour = RCT1::GetColour(src->colours.body_colour); + } + else if (colourSchemeCopyDescriptor.colour2 == COPY_COLOUR_2) + { + dst->colours.trim_colour = RCT1::GetColour(src->colours.trim_colour); + } + else + { + dst->colours.trim_colour = colourSchemeCopyDescriptor.colour2; + } + + if (colourSchemeCopyDescriptor.colour3 == COPY_COLOUR_1) + { + dst->colours_extended = RCT1::GetColour(src->colours.body_colour); + } + else if (colourSchemeCopyDescriptor.colour3 == COPY_COLOUR_2) + { + dst->colours_extended = RCT1::GetColour(src->colours.trim_colour); + } + else + { + dst->colours_extended = colourSchemeCopyDescriptor.colour3; + } + dst->mini_golf_current_animation = src->mini_golf_current_animation; dst->mini_golf_flags = src->mini_golf_flags; diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index 5f859eb304..86a5b3d995 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -24,12 +24,17 @@ namespace RCT1 { + typedef struct RCT1VehicleColourSchemeCopyDescriptor { + sint8 colour1, colour2, colour3; + } RCT1VehicleColourSchemeCopyDescriptor; + colour_t GetColour(colour_t colour); uint8 GetPeepSpriteType(uint8 rct1SpriteType); uint8 GetTerrain(uint8 terrain); uint8 GetTerrainEdge(uint8 terrainEdge); uint8 GetRideType(uint8 rideType); + RCT1VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8 vehicleType); bool RideTypeUsesVehicles(uint8 rideType); bool PathIsQueue(uint8 pathType); uint8 NormalisePathAddition(uint8 pathAdditionType); diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index 65fc8e4c95..9ea48dc384 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -256,6 +256,105 @@ namespace RCT1 return map[rideType]; } + RCT1VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8 vehicleType) + { + static RCT1VehicleColourSchemeCopyDescriptor map[89] = + { + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN = 0, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN_BACKWARDS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_WOODEN_ROLLER_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_INVERTED_COASTER_TRAIN, // Not in RCT2 + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SUSPENDED_SWINGING_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_LADYBIRD_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STANDUP_ROLLER_COASTER_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SPINNING_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SINGLE_PERSON_SWINGING_CHAIRS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SWANS_PEDAL_BOATS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_LARGE_MONORAIL_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CANOES, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_ROWING_BOATS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEAM_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COPY_COLOUR_2 }, // RCT1_VEHICLE_TYPE_WOODEN_MOUSE_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_BUMPER_BOATS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_WOODEN_ROLLER_COASTER_TRAIN_BACKWARDS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_ROCKET_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_HORSES, // Steeplechase + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SPORTSCARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_LYING_DOWN_SWINGING_CARS, // Inverted single-rail + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_WOODEN_MINE_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SUSPENDED_SWINGING_AIRPLANE_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SMALL_MONORAIL_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_WATER_TRICYCLES, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_LAUNCHED_FREEFALL_CAR, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_BOBSLEIGH_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_DINGHIES, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_ROTATING_CABIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_MINE_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CHAIRLIFT_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CORKSCREW_ROLLER_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_MOTORBIKES, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_RACING_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_TRUCKS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_GO_KARTS, + { COPY_COLOUR_1, COLOUR_BLACK, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_RAPIDS_BOATS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_LOG_FLUME_BOATS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_DODGEMS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SWINGING_SHIP, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SWINGING_INVERTER_SHIP, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_MERRY_GO_ROUND, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_FERRIS_WHEEL, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SIMULATOR_POD, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CINEMA_BUILDING, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_TOPSPIN_CAR, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SPACE_RINGS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER_CAR, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_VERTICAL_ROLLER_COASTER_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CAT_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_TWIST_ARMS_AND_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_HAUNTED_HOUSE_BUILDING, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_LOG_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CIRCUS_TENT, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_GHOST_TRAIN_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEEL_TWISTER_ROLLER_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_WOODEN_TWISTER_ROLLER_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_WOODEN_SIDE_FRICTION_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_VINTAGE_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEAM_TRAIN_COVERED_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STAND_UP_STEEL_TWISTER_ROLLER_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_FLOORLESS_STEEL_TWISTER_ROLLER_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEEL_MOUSE_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CHAIRLIFT_CARS_ALTERNATIVE, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SUSPENDED_MONORAIL_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_HELICOPTER_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_VIRGINIA_REEL_TUBS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_REVERSER_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_GOLFERS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_RIVER_RIDE_BOATS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_FLYING_ROLLER_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_NON_LOOPING_STEEL_TWISTER_ROLLER_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_HEARTLINE_TWISTER_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_HEARTLINE_TWISTER_CARS_REVERSED, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_RESERVED, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_ROTODROP_CAR, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_FLYING_SAUCERS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CROOKED_HOUSE_BUILDING, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_BICYCLES, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_HYPERCOASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_4_ACROSS_INVERTED_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_WATER_COASTER_BOATS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_FACEOFF_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_JET_SKIS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_RAFT_BOATS, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_AMERICAN_STYLE_STEAM_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_AIR_POWERED_COASTER_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SUSPENDED_WILD_MOUSE_CARS, // Inverted Hairpin in RCT2 + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_ENTERPRISE_WHEEL + }; + + Guard::ArgumentInRange(vehicleType, 0, Util::CountOf(map), "Unsupported RCT1 vehicle type."); + return map[vehicleType]; + } + bool RideTypeUsesVehicles(uint8 rideType) { switch (rideType) { From 51c812458e67afe06b63dc8f6e8f7f782bbd46ea Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 12 Jan 2017 00:17:59 +0100 Subject: [PATCH 16/48] Extract colour lookup functions --- src/openrct2/rct1/S4Importer.cpp | 192 ++++++++++++++++--------------- src/openrct2/rct1/Tables.h | 4 +- 2 files changed, 103 insertions(+), 93 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 7151bfca79..a8b4f483df 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -648,88 +648,7 @@ private: dst->mode = src->operating_mode; } - // Colours - dst->colour_scheme_type = src->colour_scheme; - if (_gameVersion == FILE_VERSION_RCT1) - { - dst->track_colour_main[0] = RCT1::GetColour(src->track_primary_colour); - dst->track_colour_additional[0] = RCT1::GetColour(src->track_secondary_colour); - dst->track_colour_supports[0] = RCT1::GetColour(src->track_support_colour); - - // Balloons were always blue in the original RCT. - if (src->type == RCT1_RIDE_TYPE_BALLOON_STALL) - { - dst->track_colour_main[0] = COLOUR_LIGHT_BLUE; - } - else if (src->type == RCT1_RIDE_TYPE_RIVER_RAPIDS) - { - dst->track_colour_main[0] = COLOUR_WHITE; - } - } - else - { - for (sint32 i = 0; i < 4; i++) - { - dst->track_colour_main[i] = RCT1::GetColour(src->track_colour_main[i]); - dst->track_colour_additional[i] = RCT1::GetColour(src->track_colour_additional[i]); - dst->track_colour_supports[i] = RCT1::GetColour(src->track_colour_supports[i]); - } - // Entrance styles were introduced with AA. They correspond directly with those in RCT2. - dst->entrance_style = src->entrance_style; - } - - if (_gameVersion < FILE_VERSION_RCT1_LL && dst->type == RIDE_TYPE_MERRY_GO_ROUND) - { - // The merry-go-round in pre-LL versions was always yellow with red - dst->vehicle_colours[0].body_colour = COLOUR_YELLOW; - dst->vehicle_colours[0].trim_colour = COLOUR_BRIGHT_RED; - } - else - { - for (sint32 i = 0; i < 12; i++) - { - // RCT1 had no third colour - RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor(src->vehicle_type); - if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_1) - { - dst->vehicle_colours[i].body_colour = RCT1::GetColour(src->vehicle_colours[i].body); - } - else if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_2) - { - dst->vehicle_colours[i].body_colour = RCT1::GetColour(src->vehicle_colours[i].trim); - } - else - { - dst->vehicle_colours[i].body_colour = colourSchemeCopyDescriptor.colour1; - } - - if (colourSchemeCopyDescriptor.colour2 == COPY_COLOUR_1) - { - dst->vehicle_colours[i].trim_colour = RCT1::GetColour(src->vehicle_colours[i].body); - } - else if (colourSchemeCopyDescriptor.colour2 == COPY_COLOUR_2) - { - dst->vehicle_colours[i].trim_colour = RCT1::GetColour(src->vehicle_colours[i].trim); - } - else - { - dst->vehicle_colours[i].trim_colour = colourSchemeCopyDescriptor.colour2; - } - - if (colourSchemeCopyDescriptor.colour3 == COPY_COLOUR_1) - { - dst->vehicle_colours_extended[i] = RCT1::GetColour(src->vehicle_colours[i].body); - } - else if (colourSchemeCopyDescriptor.colour3 == COPY_COLOUR_2) - { - dst->vehicle_colours_extended[i] = RCT1::GetColour(src->vehicle_colours[i].trim); - } - else - { - dst->vehicle_colours_extended[i] = colourSchemeCopyDescriptor.colour3; - } - } - } + SetRideColourScheme(dst, src); // Maintenance dst->build_date = src->build_date; @@ -799,6 +718,92 @@ private: dst->music_tune_id = 255; } + void SetRideColourScheme(rct_ride * dst, rct1_ride * src) + { + // Colours + dst->colour_scheme_type = src->colour_scheme; + if (_gameVersion == FILE_VERSION_RCT1) + { + dst->track_colour_main[0] = RCT1::GetColour(src->track_primary_colour); + dst->track_colour_additional[0] = RCT1::GetColour(src->track_secondary_colour); + dst->track_colour_supports[0] = RCT1::GetColour(src->track_support_colour); + + // Balloons were always blue in the original RCT. + if (src->type == RCT1_RIDE_TYPE_BALLOON_STALL) + { + dst->track_colour_main[0] = COLOUR_LIGHT_BLUE; + } + else if (src->type == RCT1_RIDE_TYPE_RIVER_RAPIDS) + { + dst->track_colour_main[0] = COLOUR_WHITE; + } + } + else + { + for (int i = 0; i < 4; i++) + { + dst->track_colour_main[i] = RCT1::GetColour(src->track_colour_main[i]); + dst->track_colour_additional[i] = RCT1::GetColour(src->track_colour_additional[i]); + dst->track_colour_supports[i] = RCT1::GetColour(src->track_colour_supports[i]); + } + // Entrance styles were introduced with AA. They correspond directly with those in RCT2. + dst->entrance_style = src->entrance_style; + } + + if (_gameVersion < FILE_VERSION_RCT1_LL && dst->type == RIDE_TYPE_MERRY_GO_ROUND) + { + // The merry-go-round in pre-LL versions was always yellow with red + dst->vehicle_colours[0].body_colour = COLOUR_YELLOW; + dst->vehicle_colours[0].trim_colour = COLOUR_BRIGHT_RED; + } + else + { + for (int i = 0; i < 12; i++) + { + // RCT1 had no third colour + RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor(src->vehicle_type); + if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_1) + { + dst->vehicle_colours[i].body_colour = RCT1::GetColour(src->vehicle_colours[i].body); + } + else if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_2) + { + dst->vehicle_colours[i].body_colour = RCT1::GetColour(src->vehicle_colours[i].trim); + } + else + { + dst->vehicle_colours[i].body_colour = colourSchemeCopyDescriptor.colour1; + } + + if (colourSchemeCopyDescriptor.colour2 == COPY_COLOUR_1) + { + dst->vehicle_colours[i].trim_colour = RCT1::GetColour(src->vehicle_colours[i].body); + } + else if (colourSchemeCopyDescriptor.colour2 == COPY_COLOUR_2) + { + dst->vehicle_colours[i].trim_colour = RCT1::GetColour(src->vehicle_colours[i].trim); + } + else + { + dst->vehicle_colours[i].trim_colour = colourSchemeCopyDescriptor.colour2; + } + + if (colourSchemeCopyDescriptor.colour3 == COPY_COLOUR_1) + { + dst->vehicle_colours_extended[i] = RCT1::GetColour(src->vehicle_colours[i].body); + } + else if (colourSchemeCopyDescriptor.colour3 == COPY_COLOUR_2) + { + dst->vehicle_colours_extended[i] = RCT1::GetColour(src->vehicle_colours[i].trim); + } + else + { + dst->vehicle_colours_extended[i] = colourSchemeCopyDescriptor.colour3; + } + } + } + } + void FixRideVehicleLinks(const uint16 * spriteIndexMap) { uint8 i; @@ -986,6 +991,20 @@ private: dst->sub_state = src->sub_state; dst->update_flags = src->update_flags; + SetVehicleColours(dst, src); + + dst->mini_golf_current_animation = src->mini_golf_current_animation; + dst->mini_golf_flags = src->mini_golf_flags; + + sprite_move(src->x, src->y, src->z, (rct_sprite *)dst); + invalidate_sprite_2((rct_sprite *)dst); + + dst->num_peeps = src->num_peeps; + dst->next_free_seat = src->next_free_seat; + } + + void SetVehicleColours(rct_vehicle * dst, rct1_vehicle * src) + { // RCT1 had no third colour RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor(src->vehicle_type); if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_1) @@ -1026,15 +1045,6 @@ private: { dst->colours_extended = colourSchemeCopyDescriptor.colour3; } - - dst->mini_golf_current_animation = src->mini_golf_current_animation; - dst->mini_golf_flags = src->mini_golf_flags; - - sprite_move(src->x, src->y, src->z, (rct_sprite *)dst); - invalidate_sprite_2((rct_sprite *)dst); - - dst->num_peeps = src->num_peeps; - dst->next_free_seat = src->next_free_seat; } void FixVehicleLinks(rct_vehicle * vehicle, const uint16 * spriteIndexMap) diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index 86a5b3d995..d5b7d69aab 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -24,9 +24,9 @@ namespace RCT1 { - typedef struct RCT1VehicleColourSchemeCopyDescriptor { + struct RCT1VehicleColourSchemeCopyDescriptor { sint8 colour1, colour2, colour3; - } RCT1VehicleColourSchemeCopyDescriptor; + }; colour_t GetColour(colour_t colour); uint8 GetPeepSpriteType(uint8 rct1SpriteType); From cc4576b72afc40308f8c7c9f8a4860357986e048 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 12 Jan 2017 19:32:08 +0100 Subject: [PATCH 17/48] Fix colour lookup for vehicle sprites --- src/openrct2/rct1/S4Importer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index a8b4f483df..294f770eec 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1005,8 +1005,11 @@ private: void SetVehicleColours(rct_vehicle * dst, rct1_vehicle * src) { + rct1_ride * srcRide = &_s4.rides[src->ride]; + uint8 vehicleTypeIndex = srcRide->vehicle_type; + RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor(vehicleTypeIndex); + // RCT1 had no third colour - RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor(src->vehicle_type); if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_1) { dst->colours.body_colour = RCT1::GetColour(src->colours.body_colour); From 54c4f0f1f35ee9c4864068d08067307f96589212 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 12 Jan 2017 22:03:23 +0100 Subject: [PATCH 18/48] Fix import of more vehicles, fix some colours --- src/openrct2/rct1.h | 11 +++++++++++ src/openrct2/rct1/tables.cpp | 24 ++++++++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 38769ee144..b1c056350b 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1135,11 +1135,22 @@ enum { MINE_TRAIN_CARRIAGE = 36, CORKSCREW_RC_FRONT = 38, CORKSCREW_RC_CARRIAGE = 39, + GHOST_TRAIN_CAR = 63, TWISTER_RC_SPOILER = 64, TWISTER_RC_CARRIAGE = 65, + GHOST_TRAIN_INVISIBLE = 66, + ARTICULATED_RC_FRONT = 67, + ARTICULATED_RC_CARRIAGE = 68, + MINIATURE_RAILWAY_CARRIAGE_COVERED = 71, STANDUP_TWISTER_RC_CARRIAGE = 72, + REVERSER_RC_CAR = 79, + REVERSER_RC_BOGIE = 80, HYPERCOASTER_FRONT = 96, HYPERCOASTER_CARRIAGE = 97, + INVERTED_4_ACROSS_CARRIAGE = 98, + WATER_COASTER_BOAT = 99, + WATER_COATER_INVISIBLE = 101, + RIVER_RAFT = 103, }; enum { diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index 9ea48dc384..f1ddd1375c 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -320,7 +320,7 @@ namespace RCT1 { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_WOODEN_SIDE_FRICTION_CARS, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_VINTAGE_CARS, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEAM_TRAIN_COVERED_CARS, - { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STAND_UP_STEEL_TWISTER_ROLLER_COASTER_TRAIN, + { COPY_COLOUR_1, COLOUR_BLACK, COPY_COLOUR_2 }, // RCT1_VEHICLE_TYPE_STAND_UP_STEEL_TWISTER_ROLLER_COASTER_TRAIN, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_FLOORLESS_STEEL_TWISTER_ROLLER_COASTER_TRAIN, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEEL_MOUSE_CARS, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CHAIRLIFT_CARS_ALTERNATIVE, @@ -480,15 +480,15 @@ namespace RCT1 0, 0, 0, - 0, + 0, // GHOST_TRAIN_CAR 1, // TWISTER_RC_SPOILER 0, // TWISTER_RC_CARRIAGE + 1, // GHOST_TRAIN_INVISIBLE + 0, // ARTICULATED_RC_FRONT + 1, // ARTICULATED_RC_CARRIAGE 0, 0, - 0, - 0, - 0, - 0, + 2, // MINIATURE_RAILWAY_CARRIAGE_COVERED 0, // STANDUP_TWISTER_RC_CARRIAGE 0, 0, @@ -496,8 +496,8 @@ namespace RCT1 0, 0, 0, - 0, - 0, + 0, // REVERSER_RC_CAR + 2, // REVERSER_RC_BOGIE 0, 0, 0, @@ -515,12 +515,12 @@ namespace RCT1 0, 0, // HYPERCOASTER_FRONT 1, // HYPERCOASTER_CARRIAGE + 0, // INVERTED_4_ACROSS_CARRIAGE + 0, // WATER_COASTER_BOAT 0, + 1, // WATER_COASTER_INVISIBLE 0, - 0, - 0, - 0, - 0, + 0, // RIVER_RAFT 0, 0, 0, From b47694a9f7a521c0a8244cedd94e6e613ed62926 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Fri, 13 Jan 2017 09:52:50 +0100 Subject: [PATCH 19/48] Fix typo --- src/openrct2/rct1.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index b1c056350b..ec3a751106 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1149,7 +1149,7 @@ enum { HYPERCOASTER_CARRIAGE = 97, INVERTED_4_ACROSS_CARRIAGE = 98, WATER_COASTER_BOAT = 99, - WATER_COATER_INVISIBLE = 101, + WATER_COASTER_INVISIBLE = 101, RIVER_RAFT = 103, }; From 3d0c357fbf73c7f85bea9dd9ba8ad090354574ee Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 15 Jan 2017 19:35:51 +0100 Subject: [PATCH 20/48] Fix vehicle direction --- src/openrct2/rct1/S4Importer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 294f770eec..bda5a56d71 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -922,6 +922,7 @@ private: dst->sprite_width = src->sprite_width; //vehicleEntry->sprite_width; dst->sprite_height_negative = src->sprite_height_negative; //vehicleEntry->sprite_height_negative; dst->sprite_height_positive = src->sprite_height_positive; //vehicleEntry->sprite_height_positive; + dst->sprite_direction = src->sprite_direction; dst->sprite_left = src->sprite_left; dst->sprite_top = src->sprite_top; From 69a79fd00a47f16fd0c3129914896044f987a534 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 15 Jan 2017 20:24:08 +0100 Subject: [PATCH 21/48] Import water colour --- src/openrct2/rct1.h | 5 +++++ src/openrct2/rct1/S4Importer.cpp | 21 ++++++++++++++++++++- src/openrct2/rct1/Tables.h | 1 + src/openrct2/rct1/tables.cpp | 2 +- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index ec3a751106..f2261eab44 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1158,6 +1158,11 @@ enum { COPY_COLOUR_2 = -2, }; +enum { + RCT1_WATER_CYAN, + RCT1_WATER_ORANGE +}; + #define RCT1_MAX_STATIONS 4 extern const uint8 gRideCategories[0x60]; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index bda5a56d71..c0b249b432 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -102,6 +102,7 @@ private: EntryList _pathEntries; EntryList _pathAdditionEntries; EntryList _sceneryGroupEntries; + EntryList _waterEntry; // Lookup tables for converting from RCT1 hard coded types to the new dynamic object entries uint8 _rideTypeToRideEntryMap[96]; @@ -198,6 +199,7 @@ private: AddAvailableEntriesFromMap(); AddAvailableEntriesFromRides(); AddAvailableEntriesFromSceneryGroups(); + AddEntryForWater(); } void AddDefaultEntries() @@ -381,6 +383,22 @@ private: } } + void AddEntryForWater() + { + const char * entryName; + + if (_s4.game_version < FILE_VERSION_RCT1_LL) + { + entryName = RCT1::GetWaterObject(RCT1_WATER_CYAN); + } + else + { + entryName = RCT1::GetWaterObject(_s4.water_colour); + } + + _waterEntry.GetOrAddEntry(entryName); + } + void AddEntryForRideType(uint8 rideType) { assert(rideType < Util::CountOf(_rideTypeToRideEntryMap)); @@ -1510,7 +1528,7 @@ private: "BN9 " })); LoadObjects(OBJECT_TYPE_PARK_ENTRANCE, std::vector({ "PKENT1 " })); - LoadObjects(OBJECT_TYPE_WATER, std::vector({ "WTRCYAN " })); + LoadObjects(OBJECT_TYPE_WATER, _waterEntry); } void LoadObjects(uint8 objectType, const EntryList &entries) @@ -2261,6 +2279,7 @@ private: case OBJECT_TYPE_PATHS: return &_pathEntries; case OBJECT_TYPE_PATH_BITS: return &_pathAdditionEntries; case OBJECT_TYPE_SCENERY_SETS: return &_sceneryGroupEntries; + case OBJECT_TYPE_WATER: return &_waterEntry; } return nullptr; } diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index d5b7d69aab..f5963f02e1 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -48,6 +48,7 @@ namespace RCT1 const char * GetPathObject(uint8 pathType); const char * GetPathAddtionObject(uint8 pathAdditionType); const char * GetSceneryGroupObject(uint8 sceneryGroupType); + const char * GetWaterObject(uint8 waterType); const std::vector GetSceneryObjects(uint8 sceneryType); diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index f1ddd1375c..d3f03ca52c 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -1362,7 +1362,7 @@ namespace RCT1 #pragma warning(push) #pragma warning(disable : 4505) // 'identifier' unreferenced local function has been removed - static const char * GetWaterObject(uint8 waterType) + const char * GetWaterObject(uint8 waterType) { static const char * map[] = { From 653be68b98300dd56d5598c4dbb46d9299eb0d52 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 15 Jan 2017 20:44:48 +0100 Subject: [PATCH 22/48] Don't assert on incorrect colour or sprite type --- src/openrct2/rct1/tables.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index d3f03ca52c..1401746c2b 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -67,7 +67,11 @@ namespace RCT1 COLOUR_BRIGHT_YELLOW, COLOUR_ICY_BLUE }; - Guard::ArgumentInRange(colour, 0, Util::CountOf(map), "Unsupported RCT1 colour."); + if (colour < 0 || colour >= Util::CountOf(map)) + { + log_warning("Unsupported RCT1 colour."); + return COLOUR_BLACK; + } return map[colour]; } @@ -107,7 +111,11 @@ namespace RCT1 PEEP_SPRITE_TYPE_TENTACLE, PEEP_SPRITE_TYPE_TOFFEE_APPLE }; - Guard::ArgumentInRange(rct1SpriteType, 0, Util::CountOf(map), "Unsupported RCT1 sprite type."); + if (rct1SpriteType < 0 || rct1SpriteType > Util::CountOf(map)) + { + log_warning("Unsupported RCT1 sprite type."); + return PEEP_SPRITE_TYPE_NORMAL; + } return map[rct1SpriteType]; } From 803c4ddfe5e2d232a6c3c2ee782f13bd7b0140aa Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 15 Jan 2017 20:50:26 +0100 Subject: [PATCH 23/48] Fix minigolf import --- src/openrct2/rct1.h | 2 ++ src/openrct2/rct1/tables.cpp | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index f2261eab44..65284101c2 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1145,6 +1145,8 @@ enum { STANDUP_TWISTER_RC_CARRIAGE = 72, REVERSER_RC_CAR = 79, REVERSER_RC_BOGIE = 80, + MINIGOLF_PLAYER = 81, + MINIGOLF_BALL = 82, HYPERCOASTER_FRONT = 96, HYPERCOASTER_CARRIAGE = 97, INVERTED_4_ACROSS_CARRIAGE = 98, diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index 1401746c2b..817785fdbd 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -506,8 +506,8 @@ namespace RCT1 0, 0, // REVERSER_RC_CAR 2, // REVERSER_RC_BOGIE - 0, - 0, + 1, // MINIGOLF_PLAYER + 0, // MINIGOLF_BALL 0, 0, 0, From 02da9caf5d8aefab03c5b775540140d70f39b3ea Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 23 Jan 2017 21:01:26 +0100 Subject: [PATCH 24/48] Fix formatting and remove warning silencer --- src/openrct2/rct1.h | 4 ++-- src/openrct2/rct1/tables.cpp | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 65284101c2..9d924377f2 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1145,8 +1145,8 @@ enum { STANDUP_TWISTER_RC_CARRIAGE = 72, REVERSER_RC_CAR = 79, REVERSER_RC_BOGIE = 80, - MINIGOLF_PLAYER = 81, - MINIGOLF_BALL = 82, + MINIGOLF_PLAYER = 81, + MINIGOLF_BALL = 82, HYPERCOASTER_FRONT = 96, HYPERCOASTER_CARRIAGE = 97, INVERTED_4_ACROSS_CARRIAGE = 98, diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index 817785fdbd..6f5b3abf80 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -1368,8 +1368,6 @@ namespace RCT1 return map[sceneryGroupType]; } -#pragma warning(push) -#pragma warning(disable : 4505) // 'identifier' unreferenced local function has been removed const char * GetWaterObject(uint8 waterType) { static const char * map[] = @@ -1379,7 +1377,6 @@ namespace RCT1 }; return map[waterType]; } -#pragma warning(pop) const std::vector GetPreferedRideEntryOrder(uint8 rideType) { From 476f1fad2b321a36a19d32bafcdae8553c82dda4 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 24 Jan 2017 19:06:47 +0100 Subject: [PATCH 25/48] Use constants for null sprite location and maximum vehicles --- src/openrct2/rct1.h | 1 + src/openrct2/rct1/S4Importer.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 9d924377f2..b3852e0526 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1166,6 +1166,7 @@ enum { }; #define RCT1_MAX_STATIONS 4 +#define RCT1_MAX_TRAINS_PER_RIDE 12 extern const uint8 gRideCategories[0x60]; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index c0b249b432..280bb1160d 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -776,7 +776,7 @@ private: } else { - for (int i = 0; i < 12; i++) + for (int i = 0; i < RCT1_MAX_TRAINS_PER_RIDE; i++) { // RCT1 had no third colour RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor(src->vehicle_type); @@ -892,7 +892,7 @@ private: if (_s4.sprites[i].unknown.sprite_identifier == SPRITE_IDENTIFIER_VEHICLE) { rct1_vehicle * srcVehicle = &_s4.sprites[i].vehicle; - if (srcVehicle->x != (sint16)0x8000) + if (srcVehicle->x != SPRITE_LOCATION_NULL) { rct_vehicle * vehicle = (rct_vehicle *)create_sprite(SPRITE_IDENTIFIER_VEHICLE); spriteIndexMap[i] = vehicle->sprite_index; From 39d413b781e2fd86607302d16d554debbd606701 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 24 Jan 2017 23:05:01 +0100 Subject: [PATCH 26/48] Fix Megaworld Park crashing on opening, fix some colour schemes --- src/openrct2/rct1/S4Importer.cpp | 7 ++++++- src/openrct2/rct1/tables.cpp | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 280bb1160d..4c1e4d1f22 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1090,7 +1090,12 @@ private: for (int i = 0; i < 32; i++) { uint16 originalSpriteIndex = vehicle->peep[i]; - if (originalSpriteIndex != SPRITE_INDEX_NULL) + if (originalSpriteIndex >= RCT1_MAX_SPRITES) + { + vehicle->peep[i] = SPRITE_INDEX_NULL; + log_warning("Incorrect sprite index: %d", originalSpriteIndex); + } + else if (originalSpriteIndex != SPRITE_INDEX_NULL) { vehicle->peep[i] = spriteIndexMap[originalSpriteIndex]; } diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index 6f5b3abf80..ad1f4313a7 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -272,13 +272,13 @@ namespace RCT1 { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN_BACKWARDS, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_WOODEN_ROLLER_COASTER_TRAIN, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_INVERTED_COASTER_TRAIN, // Not in RCT2 - { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SUSPENDED_SWINGING_CARS, + { COPY_COLOUR_1, COPY_COLOUR_2, COPY_COLOUR_2 }, // RCT1_VEHICLE_TYPE_SUSPENDED_SWINGING_CARS, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_LADYBIRD_CARS, - { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STANDUP_ROLLER_COASTER_CARS, + { COPY_COLOUR_1, COPY_COLOUR_1, COPY_COLOUR_2 }, // RCT1_VEHICLE_TYPE_STANDUP_ROLLER_COASTER_CARS, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SPINNING_CARS, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SINGLE_PERSON_SWINGING_CHAIRS, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_SWANS_PEDAL_BOATS, - { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_LARGE_MONORAIL_TRAIN, + { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_DARK_BLUE }, // RCT1_VEHICLE_TYPE_LARGE_MONORAIL_TRAIN, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_CANOES, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_ROWING_BOATS, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEAM_TRAIN, From d476176d73fca38d29081c427da7fc3ec15efc94 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 24 Jan 2017 23:51:22 +0100 Subject: [PATCH 27/48] Import more fields, name mechanic flags, fix booster behaviour --- src/openrct2/peep/peep.c | 2 +- src/openrct2/rct1.h | 28 +++++++++++++++++++++++----- src/openrct2/rct1/S4Importer.cpp | 31 ++++++++++++++++++++++++++++++- src/openrct2/ride/ride.c | 6 +++--- src/openrct2/ride/ride.h | 2 +- src/openrct2/ride/vehicle.c | 16 +++++----------- 6 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/openrct2/peep/peep.c b/src/openrct2/peep/peep.c index a3036b87e5..06eace2aa3 100644 --- a/src/openrct2/peep/peep.c +++ b/src/openrct2/peep/peep.c @@ -4650,7 +4650,7 @@ static bool peep_update_fixing_sub_state_11(bool firstRun, rct_peep *peep, rct_r peep_update_action(&tmp_x, &tmp_y, &tmp_xy_distance, peep); if (peep->action_frame == 0x28) { - ride->mechanic_status = 4; + ride->mechanic_status = RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES; ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; } diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index b3852e0526..65a54620e9 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -157,11 +157,29 @@ typedef struct rct1_ride { uint8 popularity_time_out; uint8 popularity_next; uint8 num_riders; - uint8 unk_10C[36]; - sint16 build_date; - money16 upkeep_cost; - uint8 unk_134[15]; - uint8 breakdown_reason; + uint8 music_tune_id; // 0x10C + uint8 slide_in_use; // 0x10D + union { + uint16 slide_peep; // 0x10E + uint16 maze_tiles; // 0x10E + }; + uint8 pad_110[0xE]; + uint8 slide_peep_t_shirt_colour;// 0x11E + uint8 pad_11F[0x7]; + uint8 spiral_slide_progress; // 0x126 + uint8 pad_127[0x9]; + sint16 build_date; // 0x130 + money16 upkeep_cost; // 0x131 + uint16 race_winner; // 0x132 + uint8 unk_134[2]; + uint32 music_position; // 0x138 + uint8 breakdown_reason_pending; // 0x13C + uint8 mechanic_status; // 0x13D + uint16 mechanic; // 0x13E + uint8 inspection_station; // 0x140 + uint8 broken_vehicle; // 0x141 + uint8 broken_car; // 0x142 + uint8 breakdown_reason; // 0x143 uint8 unk_144[2]; uint16 reliability; uint8 unreliability_factor; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 4c1e4d1f22..6d8ece8f24 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -675,6 +675,13 @@ private: dst->reliability = src->reliability; dst->unreliability_factor = src->unreliability_factor; dst->breakdown_reason = src->breakdown_reason; + dst->mechanic_status = src->mechanic_status; + dst->mechanic = src->mechanic; + dst->breakdown_reason = src->breakdown_reason; + dst->breakdown_reason_pending = src->breakdown_reason_pending; + dst->inspection_station = src->inspection_station; + //dst->broken_car? + //dst->broken_vehicle? // Measurement data dst->excitement = src->excitement; @@ -714,6 +721,11 @@ private: dst->current_test_segment = src->current_test_segment; dst->current_test_station = 0xFF; dst->average_speed_test_timeout = src->average_speed_test_timeout; + dst->slide_in_use = src->slide_in_use; + dst->slide_peep_t_shirt_colour = RCT1::GetColour(src->slide_peep_t_shirt_colour); + dst->spiral_slide_progress = src->spiral_slide_progress; + // Doubles as slide_peep + dst->maze_tiles = src->maze_tiles; // Finance / customers dst->upkeep_cost = src->upkeep_cost; @@ -1311,14 +1323,31 @@ private: void FixRidePeepLinks(rct_ride * ride, const uint16 * spriteIndexMap) { + uint16 originalSpriteIndex; + for (int i = 0; i < RCT1_MAX_STATIONS; i++) { - uint16 originalSpriteIndex = ride->last_peep_in_queue[i]; + originalSpriteIndex = ride->last_peep_in_queue[i]; if (originalSpriteIndex != SPRITE_INDEX_NULL) { ride->last_peep_in_queue[i] = spriteIndexMap[originalSpriteIndex]; } } + + originalSpriteIndex = ride->mechanic; + if (originalSpriteIndex != SPRITE_INDEX_NULL) + { + ride->mechanic = spriteIndexMap[originalSpriteIndex]; + } + + if (ride->type == RIDE_TYPE_SPIRAL_SLIDE) + { + originalSpriteIndex = ride->slide_peep; + if (originalSpriteIndex != SPRITE_INDEX_NULL && spriteIndexMap[originalSpriteIndex] < RCT1_MAX_SPRITES) + { + ride->slide_peep = spriteIndexMap[originalSpriteIndex]; + } + } } void FixPeepNextInQueue(rct_peep * peep, const uint16 * spriteIndexMap) diff --git a/src/openrct2/ride/ride.c b/src/openrct2/ride/ride.c index b10c492ef6..32b3fb946e 100644 --- a/src/openrct2/ride/ride.c +++ b/src/openrct2/ride/ride.c @@ -2498,7 +2498,7 @@ static void ride_breakdown_status_update(sint32 rideIndex) if ( !(ride->not_fixed_timeout & 15) && ride->mechanic_status != RIDE_MECHANIC_STATUS_FIXING && - ride->mechanic_status != RIDE_MECHANIC_STATUS_4 + ride->mechanic_status != RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES ) { set_format_arg(0, rct_string_id, ride->name); set_format_arg(2, uint32, ride->name_arguments); @@ -2702,8 +2702,8 @@ rct_peep *ride_get_assigned_mechanic(rct_ride *ride) if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) { if ( ride->mechanic_status == RIDE_MECHANIC_STATUS_HEADING || - ride->mechanic_status == 3 || - ride->mechanic_status == 4 + ride->mechanic_status == RIDE_MECHANIC_STATUS_FIXING || + ride->mechanic_status == RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES ) { rct_peep *peep = &(get_sprite(ride->mechanic)->peep); if (peep_is_mechanic(peep)) diff --git a/src/openrct2/ride/ride.h b/src/openrct2/ride/ride.h index bc34559338..5904753bac 100644 --- a/src/openrct2/ride/ride.h +++ b/src/openrct2/ride/ride.h @@ -662,7 +662,7 @@ enum { RIDE_MECHANIC_STATUS_CALLING, RIDE_MECHANIC_STATUS_HEADING, RIDE_MECHANIC_STATUS_FIXING, - RIDE_MECHANIC_STATUS_4 + RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES }; enum { diff --git a/src/openrct2/ride/vehicle.c b/src/openrct2/ride/vehicle.c index f5b614edd3..2bd4d19877 100644 --- a/src/openrct2/ride/vehicle.c +++ b/src/openrct2/ride/vehicle.c @@ -3344,7 +3344,7 @@ static void vehicle_update_arriving(rct_vehicle* vehicle) if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN && ride->breakdown_reason_pending == BREAKDOWN_BRAKES_FAILURE && ride->inspection_station == vehicle->current_station && - ride->mechanic_status != RIDE_MECHANIC_STATUS_4 + ride->mechanic_status != RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES ) { unkF64E35 = 0; } @@ -7492,7 +7492,7 @@ loc_6DAEB9: if (!( ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN && ride->breakdown_reason_pending == BREAKDOWN_BRAKES_FAILURE && - ride->mechanic_status == RIDE_MECHANIC_STATUS_4 + ride->mechanic_status == RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES )) { regs.eax = vehicle->brake_speed << 16; if (regs.eax < _vehicleVelocityF64E08) { @@ -7507,15 +7507,9 @@ loc_6DAEB9: } } else if (trackType == TRACK_ELEM_BOOSTER && ride->type != RIDE_TYPE_WILD_MOUSE) { - if (!( - ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN && - ride->breakdown_reason_pending == BREAKDOWN_BRAKES_FAILURE && - ride->mechanic_status == RIDE_MECHANIC_STATUS_4 - )) { - regs.eax = (vehicle->brake_speed << 16); - if (regs.eax > _vehicleVelocityF64E08) { - vehicle->acceleration = RideProperties[ride->type].acceleration << 16; //_vehicleVelocityF64E08 * 1.2; - } + regs.eax = (vehicle->brake_speed << 16); + if (regs.eax > _vehicleVelocityF64E08) { + vehicle->acceleration = RideProperties[ride->type].acceleration << 16; //_vehicleVelocityF64E08 * 1.2; } } From 91c3b5c592a29bb686af9215db29c437c801dd78 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 25 Jan 2017 00:04:58 +0100 Subject: [PATCH 28/48] Fix lifecycle flags import --- src/openrct2/rct1/S4Importer.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 6d8ece8f24..4e0cbcc887 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -569,20 +569,15 @@ private: dst->status = src->status; // Flags - if (src->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) dst->lifecycle_flags |= RIDE_LIFECYCLE_ON_TRACK; - if (src->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO) dst->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO; - if (src->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE) dst->lifecycle_flags |= RIDE_LIFECYCLE_INDESTRUCTIBLE; - if (src->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) dst->lifecycle_flags |= RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK; - if (src->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED) dst->lifecycle_flags |= RIDE_LIFECYCLE_EVER_BEEN_OPENED; - if (src->lifecycle_flags & RIDE_LIFECYCLE_TEST_IN_PROGRESS) dst->lifecycle_flags |= RIDE_LIFECYCLE_TEST_IN_PROGRESS; - if (src->lifecycle_flags & RIDE_LIFECYCLE_CRASHED) dst->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; - if (src->lifecycle_flags & RIDE_LIFECYCLE_TESTED) dst->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - if (_gameVersion >= FILE_VERSION_RCT1_AA) + dst->lifecycle_flags = src->lifecycle_flags; + // These flags were not in the base game + if (_gameVersion == FILE_VERSION_RCT1) { - if (src->lifecycle_flags & RIDE_LIFECYCLE_MUSIC) dst->lifecycle_flags |= RIDE_LIFECYCLE_MUSIC; + dst->lifecycle_flags &= ~RIDE_LIFECYCLE_MUSIC; + dst->lifecycle_flags &= ~RIDE_LIFECYCLE_INDESTRUCTIBLE; + dst->lifecycle_flags &= ~RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK; } - //dst->lifecycle_flags = src->lifecycle_flags; // Station dst->overall_view = src->overall_view; @@ -593,7 +588,6 @@ private: dst->station_length[i] = src->station_length[i]; dst->station_depart[i] = src->station_light[i]; - // Use src->station_depart[i] when we import with guests and vehicles intact dst->train_at_station[i] = src->station_depart[i]; dst->entrances[i] = src->entrance[i]; From 79f9cf611d006efe985e44b6df0dc515467c5d14 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 25 Jan 2017 18:39:33 +0100 Subject: [PATCH 29/48] Guard better against incorrect subtypes --- src/openrct2/rct1/S4Importer.cpp | 7 ++++++- src/openrct2/ride/shops/facility.c | 6 ++++++ src/openrct2/ride/shops/shop.c | 6 ++++++ src/openrct2/ride/track_design.c | 4 ++-- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 4e0cbcc887..29a0331006 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -541,7 +541,12 @@ private: } rct_ride_entry * rideEntry = get_ride_entry(dst->subtype); - Guard::Assert(rideEntry != nullptr && rideEntry != (rct_ride_entry*)-1); + // This can happen with hacked parks + if (rideEntry == nullptr || rideEntry == (rct_ride_entry*)-1) + { + dst = nullptr; + return; + } // Ride name dst->name = 0; diff --git a/src/openrct2/ride/shops/facility.c b/src/openrct2/ride/shops/facility.c index e8fa0cacb5..6e4bac4514 100644 --- a/src/openrct2/ride/shops/facility.c +++ b/src/openrct2/ride/shops/facility.c @@ -37,6 +37,12 @@ static void facility_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 dir rct_ride_entry *rideEntry = get_ride_entry(ride->subtype); rct_ride_entry_vehicle *firstVehicleEntry = &rideEntry->vehicles[0]; + if (rideEntry == NULL || firstVehicleEntry == NULL) + { + log_error("Error drawing facility, rideEntry or firstVehicleEntry is NULL."); + return; + } + uint32 imageId = gTrackColours[SCHEME_TRACK]; imageId |= firstVehicleEntry->base_image_id; imageId += (direction + 2) & 3; diff --git a/src/openrct2/ride/shops/shop.c b/src/openrct2/ride/shops/shop.c index 39845c7672..e5ad3f7e66 100644 --- a/src/openrct2/ride/shops/shop.c +++ b/src/openrct2/ride/shops/shop.c @@ -37,6 +37,12 @@ static void shop_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 directi rct_ride_entry *rideEntry = get_ride_entry(ride->subtype); rct_ride_entry_vehicle *firstVehicleEntry = &rideEntry->vehicles[0]; + if (rideEntry == NULL || firstVehicleEntry == NULL) + { + log_error("Error drawing shop, rideEntry or firstVehicleEntry is NULL."); + return; + } + uint32 imageId = gTrackColours[SCHEME_TRACK]; if (imageId & 0x80000000) { imageId &= 0x60FFFFFF; diff --git a/src/openrct2/ride/track_design.c b/src/openrct2/ride/track_design.c index 71412d336c..949d011ff5 100644 --- a/src/openrct2/ride/track_design.c +++ b/src/openrct2/ride/track_design.c @@ -188,7 +188,7 @@ static rct_track_td6 * track_design_open_from_td4(uint8 *src, size_t srcLength) td6->version_and_colour_scheme = td4->version_and_colour_scheme; // Vehicle colours - for (sint32 i = 0; i < 12; i++) { + for (sint32 i = 0; i < RCT1_MAX_VEHICLES_PER_RIDE; i++) { td6->vehicle_colours[i].body_colour = rct1_get_colour(td4->vehicle_colours[i].body_colour); td6->vehicle_colours[i].trim_colour = rct1_get_colour(td4->vehicle_colours[i].trim_colour); @@ -198,7 +198,7 @@ static rct_track_td6 * track_design_open_from_td4(uint8 *src, size_t srcLength) } } // Set remaining vehicles to same colour as first vehicle - for (sint32 i = 12; i < 32; i++) { + for (sint32 i = RCT1_MAX_VEHICLES_PER_RIDE; i < 32; i++) { td6->vehicle_colours[i] = td6->vehicle_colours[0]; } // Set additional colour to trim colour for all vehicles From 1a5bec78467b22073355a2a54e0da52d88a1747a Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 25 Jan 2017 17:49:17 +0000 Subject: [PATCH 30/48] Fix and refactor sprite index mapping --- src/openrct2/rct1/S4Importer.cpp | 58 +++++++++++++------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 29a0331006..e4e8d6eb92 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1100,16 +1100,7 @@ private: { for (int i = 0; i < 32; i++) { - uint16 originalSpriteIndex = vehicle->peep[i]; - if (originalSpriteIndex >= RCT1_MAX_SPRITES) - { - vehicle->peep[i] = SPRITE_INDEX_NULL; - log_warning("Incorrect sprite index: %d", originalSpriteIndex); - } - else if (originalSpriteIndex != SPRITE_INDEX_NULL) - { - vehicle->peep[i] = spriteIndexMap[originalSpriteIndex]; - } + vehicle->peep[i] = MapSpriteIndex(vehicle->peep[i], spriteIndexMap); } } @@ -1322,40 +1313,20 @@ private: void FixRidePeepLinks(rct_ride * ride, const uint16 * spriteIndexMap) { - uint16 originalSpriteIndex; - - for (int i = 0; i < RCT1_MAX_STATIONS; i++) + for (sint32 i = 0; i < RCT1_MAX_STATIONS; i++) { - originalSpriteIndex = ride->last_peep_in_queue[i]; - if (originalSpriteIndex != SPRITE_INDEX_NULL) - { - ride->last_peep_in_queue[i] = spriteIndexMap[originalSpriteIndex]; - } + ride->last_peep_in_queue[i] = MapSpriteIndex(ride->last_peep_in_queue[i], spriteIndexMap); } - - originalSpriteIndex = ride->mechanic; - if (originalSpriteIndex != SPRITE_INDEX_NULL) - { - ride->mechanic = spriteIndexMap[originalSpriteIndex]; - } - + ride->mechanic = MapSpriteIndex(ride->mechanic, spriteIndexMap); if (ride->type == RIDE_TYPE_SPIRAL_SLIDE) { - originalSpriteIndex = ride->slide_peep; - if (originalSpriteIndex != SPRITE_INDEX_NULL && spriteIndexMap[originalSpriteIndex] < RCT1_MAX_SPRITES) - { - ride->slide_peep = spriteIndexMap[originalSpriteIndex]; - } + ride->slide_peep = MapSpriteIndex(ride->slide_peep, spriteIndexMap); } } void FixPeepNextInQueue(rct_peep * peep, const uint16 * spriteIndexMap) { - uint16 originalSpriteIndex = peep->next_in_queue; - if (originalSpriteIndex != SPRITE_INDEX_NULL) - { - peep->next_in_queue = spriteIndexMap[originalSpriteIndex]; - } + peep->next_in_queue = MapSpriteIndex(peep->next_in_queue, spriteIndexMap); } void ImportLitter() @@ -1481,6 +1452,23 @@ private: dst->state = src->state; } + uint16 MapSpriteIndex(uint16 originalSpriteIndex, const uint16 * spriteIndexMap) + { + uint16 newSpriteIndex = SPRITE_INDEX_NULL; + if (originalSpriteIndex != SPRITE_INDEX_NULL) + { + if (originalSpriteIndex >= RCT1_MAX_SPRITES) + { + log_warning("Incorrect sprite index: %d", originalSpriteIndex); + } + else + { + newSpriteIndex = spriteIndexMap[originalSpriteIndex]; + } + } + return newSpriteIndex; + } + void ImportPeepSpawns() { for (size_t i = 0; i < 2; i++) From 67b668c54ec3e3f7569b8e7fa65bb3ea31353e5a Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 25 Jan 2017 18:21:26 +0000 Subject: [PATCH 31/48] Use spite_move when importing misc sprites --- src/openrct2/rct1/S4Importer.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index e4e8d6eb92..b93859ef90 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -928,9 +928,9 @@ private: void ImportVehicle(rct_vehicle * dst, rct1_vehicle * src) { - char buf[64]; - sprintf(buf, "%d", src->vehicle_type); - log_error(buf); + // char buf[64]; + // sprintf(buf, "%d", src->vehicle_type); + // log_error(buf); uint8 vehicleEntryIndex = RCT1::GetVehicleSubEntryIndex(src->vehicle_type); @@ -1371,14 +1371,13 @@ private: dst->sprite_identifier = src->sprite_identifier; dst->misc_identifier = src->misc_identifier; dst->flags = src->flags; - dst->x = src->x; - dst->y = src->y; - dst->z = src->z; dst->sprite_direction = src->sprite_direction; dst->sprite_width = src->sprite_width; dst->sprite_height_negative = src->sprite_height_negative; dst->sprite_height_positive = src->sprite_height_positive; + sprite_move(src->x, src->y, src->z, (rct_sprite*)dst); + switch (src->misc_identifier) { case SPRITE_MISC_STEAM_PARTICLE: ImportSteamParticle((rct_steam_particle *) dst, (rct_steam_particle *) src); From 1cb6dbbe1ff9272778a9a4c8cb626ffff98be3c2 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 25 Jan 2017 18:32:02 +0000 Subject: [PATCH 32/48] Convert RCT1 strings to UTF-8 --- src/openrct2/rct1/S4Importer.cpp | 33 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index b93859ef90..4337751de5 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -552,10 +552,10 @@ private: dst->name = 0; if (is_user_string_id(src->name)) { - const char * rideName = GetUserString(src->name); - if (rideName[0] != 0) + std::string rideName = GetUserString(src->name); + if (!rideName.empty()) { - rct_string_id rideNameStringId = user_string_allocate(4, rideName); + rct_string_id rideNameStringId = user_string_allocate(4, rideName.c_str()); if (rideNameStringId != 0) { dst->name = rideNameStringId; @@ -1172,10 +1172,10 @@ private: dst->name_string_idx = src->name_string_idx; if (is_user_string_id(src->name_string_idx)) { - const char * peepName = GetUserString(src->name_string_idx); - if (peepName[0] != 0) + std::string peepName = GetUserString(src->name_string_idx); + if (!peepName.empty()) { - rct_string_id peepNameStringId = user_string_allocate(4, peepName); + rct_string_id peepNameStringId = user_string_allocate(4, peepName.c_str()); if (peepNameStringId != 0) { dst->name_string_idx = peepNameStringId; @@ -1748,17 +1748,17 @@ private: void ImportParkName() { - const char * parkName = _s4.scenario_name; + std::string parkName = std::string(_s4.scenario_name); if (is_user_string_id((rct_string_id)_s4.park_name_string_index)) { - const char * userString = GetUserString(_s4.park_name_string_index); - if (userString[0] != '\0') + std::string userString = GetUserString(_s4.park_name_string_index); + if (!userString.empty()) { parkName = userString; } } - rct_string_id stringId = user_string_allocate(4, parkName); + rct_string_id stringId = user_string_allocate(4, parkName.c_str()); if (stringId != 0) { gParkName = stringId; @@ -2213,10 +2213,10 @@ private: dst->string_idx = STR_DEFAULT_SIGN; if (is_user_string_id(src->string_idx)) { - const char * bannerText = GetUserString(src->string_idx); - if (!String::IsNullOrEmpty(bannerText)) + std::string bannerText = GetUserString(src->string_idx); + if (!bannerText.empty()) { - rct_string_id bannerTextStringId = user_string_allocate(128, bannerText); + rct_string_id bannerTextStringId = user_string_allocate(128, bannerText.c_str()); if (bannerTextStringId != 0) { dst->string_idx = bannerTextStringId; @@ -2349,9 +2349,12 @@ private: } } - const char * GetUserString(rct_string_id stringId) + std::string GetUserString(rct_string_id stringId) { - return _s4.string_table[(stringId - 0x8000) % 1024]; + utf8 buffer[128] = { 0 }; + const char * originalString = _s4.string_table[(stringId - 0x8000) % 1024]; + rct2_to_utf8(buffer, originalString); + return std::string(buffer); } }; From e621cd37ccee12fa8c42e2b75da81398eef75f42 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 25 Jan 2017 21:43:36 +0100 Subject: [PATCH 33/48] Fix mechanics facing the wrong direction --- src/openrct2/rct1/S4Importer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 4337751de5..f947a1194d 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1216,6 +1216,7 @@ private: dst->destination_x = src->destination_x; dst->destination_y = src->destination_y; dst->destination_tolerence = src->destination_tolerence; + dst->direction = src->direction; dst->energy = src->energy; dst->energy_growth_rate = src->energy_growth_rate; From 585e28b67fb17d637beeb7c63fdee40270c83ab6 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 25 Jan 2017 21:50:14 +0100 Subject: [PATCH 34/48] Temporarily fix non-ascii import --- src/openrct2/rct1/S4Importer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index f947a1194d..e92a5c39e0 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -159,7 +159,8 @@ public: ImportScenarioObjective(); ImportSavedView(); - game_convert_strings_to_utf8(); + // Importing the strings is done later on, although that approach needs looking at. + //game_convert_strings_to_utf8(); map_count_remaining_land_rights(); } From 84754ec30f707bee6511c7dc2d023f1e37f532af Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 25 Jan 2017 23:13:44 +0100 Subject: [PATCH 35/48] Correctly import Heide-Parks Compact Inverted Coaster --- src/openrct2/rct1/S4Importer.cpp | 12 +++++++++++- src/openrct2/util/sawyercoding.c | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index e92a5c39e0..d6d136c056 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -531,7 +531,17 @@ private: { memset(dst, 0, sizeof(rct_ride)); - dst->type = RCT1::GetRideType(src->type); + // This is a pecularity of this exact version number, which only Heide-Park seems to use. + if (_s4.game_version == 110018 && src->type == RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER) + { + dst->type = RIDE_TYPE_COMPACT_INVERTED_COASTER; + } + else + { + dst->type = RCT1::GetRideType(src->type); + } + + if (RCT1::RideTypeUsesVehicles(src->type)) { dst->subtype = _vehicleTypeToRideEntryMap[src->vehicle_type]; diff --git a/src/openrct2/util/sawyercoding.c b/src/openrct2/util/sawyercoding.c index 2c7e9cc5fa..80e1867f18 100644 --- a/src/openrct2/util/sawyercoding.c +++ b/src/openrct2/util/sawyercoding.c @@ -553,7 +553,7 @@ sint32 sawyercoding_detect_file_type(const uint8 *src, size_t length) sint32 sawyercoding_detect_rct1_version(sint32 gameVersion) { sint32 fileType = (gameVersion) > 0 ? FILE_TYPE_SV4 : FILE_TYPE_SC4; - gameVersion=abs(gameVersion); + gameVersion = abs(gameVersion); if (gameVersion >= 108000 && gameVersion < 110000) return (FILE_VERSION_RCT1 | fileType); From bd68624c92a3279f5c8934e6fc0818aa216ed50e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 26 Jan 2017 00:03:40 +0100 Subject: [PATCH 36/48] Fix unbuyable land tiles in Katie's Dreamland --- src/openrct2/rct1/S4Importer.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index d6d136c056..a2d354369d 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -158,6 +158,7 @@ public: ImportScenarioNameDetails(); ImportScenarioObjective(); ImportSavedView(); + FixLandOwnership(); // Importing the strings is done later on, although that approach needs looking at. //game_convert_strings_to_utf8(); @@ -2368,6 +2369,28 @@ private: rct2_to_utf8(buffer, originalString); return std::string(buffer); } + + void FixLandOwnership() + { + sint32 scNumber = GetSCNumber(); + rct_map_element * currentElement; + + switch(scNumber) + { + case SC_KATIES_DREAMLAND: + currentElement = map_get_surface_element_at(74, 70); + currentElement->properties.surface.ownership |= OWNERSHIP_AVAILABLE; + currentElement = map_get_surface_element_at(75, 70); + currentElement->properties.surface.ownership |= OWNERSHIP_AVAILABLE; + currentElement = map_get_surface_element_at(76, 70); + currentElement->properties.surface.ownership |= OWNERSHIP_AVAILABLE; + currentElement = map_get_surface_element_at(77, 73); + currentElement->properties.surface.ownership |= OWNERSHIP_AVAILABLE; + currentElement = map_get_surface_element_at(80, 77); + currentElement->properties.surface.ownership |= OWNERSHIP_AVAILABLE; + break; + } + } }; IS4Importer * CreateS4Importer() From a7e91ad5568fe4eeb1323c115a79f3aa499c00c0 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 26 Jan 2017 00:14:05 +0100 Subject: [PATCH 37/48] Use the actual scenario number in the S4 file rather than the file name --- src/openrct2/rct1/S4Importer.cpp | 35 ++------------------------------ 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index a2d354369d..d3ec2cc158 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1871,7 +1871,7 @@ private: String::Set(gS6Info.name, sizeof(gS6Info.name), _s4.scenario_name); String::Set(gS6Info.details, sizeof(gS6Info.details), ""); - sint32 scNumber = GetSCNumber(); + sint32 scNumber = _s4.scenario_slot_index; if (scNumber != -1) { source_desc sourceDesc; @@ -2332,36 +2332,6 @@ private: } } - sint32 GetSCNumber() - { - const utf8 * fileName = Path::GetFileName(_s4Path); - if (tolower(fileName[0]) == 's' && tolower(fileName[1]) == 'c') { - constexpr size_t maxDigits = 7; - utf8 digitBuffer[maxDigits + 1]; - utf8 * dst = digitBuffer; - const utf8 * src = fileName + 2; - for (size_t i = 0; i < maxDigits && *src != '.'; i++) - { - *dst++ = *src++; - } - *dst++ = 0; - - if (digitBuffer[0] == '0' && digitBuffer[1] == '\0') - { - return 0; - } - else - { - sint32 digits = atoi(digitBuffer); - return digits == 0 ? -1 : digits; - } - } - else - { - return -1; - } - } - std::string GetUserString(rct_string_id stringId) { utf8 buffer[128] = { 0 }; @@ -2372,10 +2342,9 @@ private: void FixLandOwnership() { - sint32 scNumber = GetSCNumber(); rct_map_element * currentElement; - switch(scNumber) + switch(_s4.scenario_slot_index) { case SC_KATIES_DREAMLAND: currentElement = map_get_surface_element_at(74, 70); From 6d8a617712c6bffeddaa9437b3d29c6f4010bf09 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 26 Jan 2017 21:50:22 +0100 Subject: [PATCH 38/48] Count block sections when importing an SC4/SV4 file --- src/openrct2/rct1.h | 2 ++ src/openrct2/rct1/S4Importer.cpp | 58 ++++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 65a54620e9..a13654abcc 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -1185,6 +1185,8 @@ enum { #define RCT1_MAX_STATIONS 4 #define RCT1_MAX_TRAINS_PER_RIDE 12 +#define RCT1_MAX_MAP_SIZE 128 +#define RCT1_MAX_RIDES_IN_PARK 128 extern const uint8 gRideCategories[0x60]; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index d3ec2cc158..c8a22eead9 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -44,6 +44,7 @@ extern "C" #include "../peep/peep.h" #include "../peep/staff.h" #include "../rct1.h" + #include "../ride/track.h" #include "../util/sawyercoding.h" #include "../util/util.h" #include "../world/climate.h" @@ -159,6 +160,7 @@ public: ImportScenarioObjective(); ImportSavedView(); FixLandOwnership(); + CountBlockSections(); // Importing the strings is done later on, although that approach needs looking at. //game_convert_strings_to_utf8(); @@ -1928,17 +1930,17 @@ private: rct_map_element * * tilePointer = gMapElementTilePointers; // 128 rows of map data from RCT1 map - for (sint32 x = 0; x < 128; x++) + for (sint32 x = 0; x < RCT1_MAX_MAP_SIZE; x++) { // Assign the first half of this row - for (sint32 y = 0; y < 128; y++) + for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++) { *tilePointer++ = mapElement; do { } while (!map_element_is_last_for_tile(mapElement++)); } // Fill the rest of the row with blank tiles - for (sint32 y = 0; y < 128; y++) + for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++) { nextFreeMapElement->type = MAP_ELEMENT_TYPE_SURFACE; nextFreeMapElement->flags = MAP_ELEMENT_FLAG_LAST_TILE; @@ -2119,9 +2121,9 @@ private: void FixWalls() { - for (sint32 x = 0; x < 128; x++) + for (sint32 x = 0; x < RCT1_MAX_MAP_SIZE; x++) { - for (sint32 y = 0; y < 128; y++) + for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++) { rct_map_element * mapElement = map_get_first_element_at(x, y); do @@ -2198,9 +2200,9 @@ private: void FixBanners() { - for (sint32 x = 0; x < 128; x++) + for (sint32 x = 0; x < RCT1_MAX_MAP_SIZE; x++) { - for (sint32 y = 0; y < 128; y++) + for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++) { rct_map_element * mapElement = map_get_first_element_at(x, y); do @@ -2360,6 +2362,48 @@ private: break; } } + + /** + * Counts the block sections. The reason this iterates over the map is to avoid getting into infinite loops, + * which can happen with hacked parks. + */ + void CountBlockSections() + { + for (sint32 x = 0; x < RCT1_MAX_MAP_SIZE; x++) + { + for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++) + { + rct_map_element * mapElement = map_get_first_element_at(x, y); + do + { + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK) + { + // Lift hill tops are the only pieces present in RCT1 that can count as a block brake. + if (!track_element_is_lift_hill(mapElement)) + continue; + + uint8 trackType = mapElement->properties.track.type; + + switch (trackType) + { + case TRACK_ELEM_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_60_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: + break; + default: + continue; + } + + uint8 rideIndex = mapElement->properties.track.ride_index; + rct_ride * ride = get_ride(rideIndex); + ride->num_block_brakes++; + } + } + while (!map_element_is_last_for_tile(mapElement++)); + } + } + } }; IS4Importer * CreateS4Importer() From c92792a973ac4ef90497d75966d4e78b030e5ef3 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 26 Jan 2017 23:02:29 +0100 Subject: [PATCH 39/48] Also import news items in S4 files correctly --- src/openrct2/game.c | 20 +++++++++++++------- src/openrct2/game.h | 1 + src/openrct2/rct1/S4Importer.cpp | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/openrct2/game.c b/src/openrct2/game.c index 1a0566266a..152be822cb 100644 --- a/src/openrct2/game.c +++ b/src/openrct2/game.c @@ -729,14 +729,20 @@ void game_convert_strings_to_utf8() } } - // News items - for (sint32 i = 0; i < MAX_NEWS_ITEMS; i++) { - NewsItem *newsItem = news_item_get(i); + // News items + game_convert_news_items_to_utf8(); - if (!str_is_null_or_empty(newsItem->Text)) { - rct2_to_utf8_self(newsItem->Text, sizeof(newsItem->Text)); - } - } +} + +void game_convert_news_items_to_utf8() +{ + for (sint32 i = 0; i < MAX_NEWS_ITEMS; i++) { + NewsItem *newsItem = news_item_get(i); + + if (!str_is_null_or_empty(newsItem->Text)) { + rct2_to_utf8_self(newsItem->Text, sizeof(newsItem->Text)); + } + } } /** diff --git a/src/openrct2/game.h b/src/openrct2/game.h index bf13755535..8c70bbb44d 100644 --- a/src/openrct2/game.h +++ b/src/openrct2/game.h @@ -181,6 +181,7 @@ void rct2_exit(); void rct2_exit_reason(rct_string_id title, rct_string_id body); void game_autosave(); void game_convert_strings_to_utf8(); +void game_convert_news_items_to_utf8(); void game_convert_strings_to_rct2(rct_s6_data *s6); void game_fix_save_vars(); bool game_load_save_or_scenario(const utf8 * path); diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index c8a22eead9..3344ddf923 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -164,6 +164,7 @@ public: // Importing the strings is done later on, although that approach needs looking at. //game_convert_strings_to_utf8(); + game_convert_news_items_to_utf8(); map_count_remaining_land_rights(); } From c24127bafe03bc80e6f8942cda3ccae19f3961d2 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 26 Jan 2017 22:19:58 +0000 Subject: [PATCH 40/48] Fix loading scenario details from SV4 --- src/openrct2/rct1/S4Importer.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 3344ddf923..b11504b7c2 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1871,8 +1871,8 @@ private: void ImportScenarioNameDetails() { - String::Set(gS6Info.name, sizeof(gS6Info.name), _s4.scenario_name); - String::Set(gS6Info.details, sizeof(gS6Info.details), ""); + std::string name = String::ToStd(_s4.scenario_name); + std::string details; sint32 scNumber = _s4.scenario_slot_index; if (scNumber != -1) @@ -1885,15 +1885,20 @@ private: { if (localisedStringIds[0] != STR_NONE) { - String::Set(gS6Info.name, sizeof(gS6Info.name), language_get_string(localisedStringIds[0])); + name = String::ToStd(language_get_string(localisedStringIds[0])); } if (localisedStringIds[2] != STR_NONE) { - String::Set(gS6Info.details, sizeof(gS6Info.details), language_get_string(localisedStringIds[2])); + details = String::ToStd(language_get_string(localisedStringIds[2])); } } } } + + String::Set(gS6Info.name, sizeof(gS6Info.name), name.c_str()); + String::Set(gS6Info.details, sizeof(gS6Info.details), details.c_str()); + String::Set(gScenarioName, sizeof(gScenarioName), name.c_str()); + String::Set(gScenarioDetails, sizeof(gScenarioDetails), details.c_str()); } void ImportScenarioObjective() From 2da90b9808b1daad1ee9d461d65f5658acefe507 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 26 Jan 2017 23:23:19 +0100 Subject: [PATCH 41/48] Fix erroneous messages about stalling --- src/openrct2/rct1/S4Importer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index b11504b7c2..0abd206821 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1031,7 +1031,6 @@ private: dst->track_type = src->track_type; dst->track_progress = src->track_progress; dst->vertical_drop_countdown = src->vertical_drop_countdown; - dst->lost_time_out = src->lost_time_out; dst->status = src->status; dst->sub_state = src->sub_state; dst->update_flags = src->update_flags; From 438926c08c9c5796874d895fe9b4eeeb9e969044 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 26 Jan 2017 23:11:20 +0000 Subject: [PATCH 42/48] Protect ride_mechanic_status_update from null mechanic --- src/openrct2/ride/ride.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/openrct2/ride/ride.c b/src/openrct2/ride/ride.c index 32b3fb946e..c270f59550 100644 --- a/src/openrct2/ride/ride.c +++ b/src/openrct2/ride/ride.c @@ -2546,8 +2546,11 @@ static void ride_mechanic_status_update(sint32 rideIndex, sint32 mechanicStatus) ride_call_closest_mechanic(rideIndex); break; case RIDE_MECHANIC_STATUS_HEADING: - mechanic = &(get_sprite(ride->mechanic)->peep); - if ( + mechanic = NULL; + if (ride->mechanic != SPRITE_INDEX_NULL) { + mechanic = &(get_sprite(ride->mechanic)->peep); + } + if (mechanic == NULL || !peep_is_mechanic(mechanic) || (mechanic->state != PEEP_STATE_HEADING_TO_INSPECTION && mechanic->state != PEEP_STATE_ANSWERING) || mechanic->current_ride != rideIndex @@ -2558,8 +2561,11 @@ static void ride_mechanic_status_update(sint32 rideIndex, sint32 mechanicStatus) } break; case RIDE_MECHANIC_STATUS_FIXING: - mechanic = &(get_sprite(ride->mechanic)->peep); - if ( + mechanic = NULL; + if (ride->mechanic != SPRITE_INDEX_NULL) { + mechanic = &(get_sprite(ride->mechanic)->peep); + } + if (mechanic == NULL || !peep_is_mechanic(mechanic) || ( mechanic->state != PEEP_STATE_HEADING_TO_INSPECTION && From 62d1d55ed5416052ebe86473edfc84ae04eb3941 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 26 Jan 2017 23:31:35 +0000 Subject: [PATCH 43/48] Update changelog --- distribution/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index f853c550ea..6ac0d9697b 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -8,6 +8,7 @@ - Feature: [#5113] Entertainers are now hired with a random costume. - Improved: [#4847] Guest / staff pathfinding. - Improved: [#4938] Checksum calculations speeded up. +- Improved: [#5007] Vehicles and functioning rides are now imported when loading SC4 / SV4 parks. - Improved: Guests and staff are now imported when loading SC4 / SV4 parks. - Fix: [#4571] Only start autosave timer after update or game command. - Fix: [#4584] Junior Coaster diagonal flat-to-steep slopes not drawn. From f3fc09cb9a5052741183b7297b6e85a618d06353 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 26 Jan 2017 23:32:46 +0000 Subject: [PATCH 44/48] Fix switch brace syntax --- src/openrct2/rct1/S4Importer.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 0abd206821..9f5011bce4 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2351,8 +2351,7 @@ private: { rct_map_element * currentElement; - switch(_s4.scenario_slot_index) - { + switch(_s4.scenario_slot_index) { case SC_KATIES_DREAMLAND: currentElement = map_get_surface_element_at(74, 70); currentElement->properties.surface.ownership |= OWNERSHIP_AVAILABLE; @@ -2388,9 +2387,7 @@ private: continue; uint8 trackType = mapElement->properties.track.type; - - switch (trackType) - { + switch (trackType) { case TRACK_ELEM_25_DEG_UP_TO_FLAT: case TRACK_ELEM_60_DEG_UP_TO_FLAT: case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: From f019aa5db579a79d9eedffa35bd40cd7d2affb4f Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 26 Jan 2017 23:34:50 +0000 Subject: [PATCH 45/48] Remove commented out code --- src/openrct2/rct1/S4Importer.cpp | 52 ++++++-------------------------- 1 file changed, 9 insertions(+), 43 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 9f5011bce4..67d15ed797 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -943,15 +943,8 @@ private: void ImportVehicle(rct_vehicle * dst, rct1_vehicle * src) { - // char buf[64]; - // sprintf(buf, "%d", src->vehicle_type); - // log_error(buf); - - uint8 vehicleEntryIndex = RCT1::GetVehicleSubEntryIndex(src->vehicle_type); - 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]; + uint8 vehicleEntryIndex = RCT1::GetVehicleSubEntryIndex(src->vehicle_type); dst->sprite_identifier = SPRITE_IDENTIFIER_VEHICLE; dst->ride = src->ride; @@ -959,13 +952,13 @@ private: dst->vehicle_type = vehicleEntryIndex; dst->is_child = src->is_child; - dst->var_44 = src->var_44; //ror32(vehicleEntry->spacing, 10) & 0xFFFF; + dst->var_44 = src->var_44; dst->remaining_distance = src->remaining_distance; // Properties from vehicle entry - dst->sprite_width = src->sprite_width; //vehicleEntry->sprite_width; - dst->sprite_height_negative = src->sprite_height_negative; //vehicleEntry->sprite_height_negative; - dst->sprite_height_positive = src->sprite_height_positive; //vehicleEntry->sprite_height_positive; + dst->sprite_width = src->sprite_width; + dst->sprite_height_negative = src->sprite_height_negative; + dst->sprite_height_positive = src->sprite_height_positive; dst->sprite_direction = src->sprite_direction; dst->sprite_left = src->sprite_left; @@ -973,11 +966,10 @@ private: dst->sprite_right = src->sprite_right; dst->sprite_bottom = src->sprite_bottom; - - dst->friction = src->friction; //vehicleEntry->car_friction; - dst->num_seats = src->num_seats; //vehicleEntry->num_seats; - dst->speed = src->speed; //vehicleEntry->powered_max_speed; - dst->powered_acceleration = src->powered_acceleration; //vehicleEntry->powered_acceleration; + dst->friction = src->friction; + dst->num_seats = src->num_seats; + dst->speed = src->speed; + dst->powered_acceleration = src->powered_acceleration; dst->brake_speed = src->brake_speed; dst->velocity = src->velocity; @@ -1979,32 +1971,6 @@ private: void FixColours() { colour_t colour; - - // The following code would be worth doing if we were able to import sprites - // for (size_t i = 0; i < MAX_SPRITES; i++) - // { - // rct_unk_sprite * sprite = &(g_sprite_list[i].unknown); - // switch (sprite->sprite_identifier) { - // case SPRITE_IDENTIFIER_PEEP: - // { - // rct_peep * peep = (rct_peep*)sprite; - // peep->tshirt_colour = RCT1ColourConversionTable[peep->tshirt_colour]; - // peep->trousers_colour = RCT1ColourConversionTable[peep->trousers_colour]; - // peep->balloon_colour = RCT1ColourConversionTable[peep->balloon_colour]; - // peep->umbrella_colour = RCT1ColourConversionTable[peep->umbrella_colour]; - // peep->hat_colour = RCT1ColourConversionTable[peep->hat_colour]; - // break; - // } - // case SPRITE_IDENTIFIER_MISC: - // { - // rct_balloon * balloon = (rct_balloon*)sprite; - // balloon->colour = RCT1ColourConversionTable[balloon->colour]; - // balloon->var_2D = RCT1ColourConversionTable[balloon->var_2D]; - // break; - // } - // } - // } - rct_map_element * mapElement = gMapElements; while (mapElement < gNextFreeMapElement) { From b5505c9fc9baec2f136aa39a508423d4592d71bf Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 26 Jan 2017 23:36:21 +0000 Subject: [PATCH 46/48] Improve function names --- src/openrct2/rct1/S4Importer.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 67d15ed797..1df6934fba 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1588,10 +1588,10 @@ private: void ImportMapElements() { - memcpy(gMapElements, _s4.map_elements, RCT1_MAX_MAP_ELEMENTS * sizeof(rct_map_element)); + Memory::Copy(gMapElements, _s4.map_elements, RCT1_MAX_MAP_ELEMENTS * sizeof(rct_map_element)); ClearExtraTileEntries(); - FixColours(); - FixZ(); + FixSceneryColours(); + FixMapElementZ(); FixPaths(); FixWalls(); FixBanners(); @@ -1816,7 +1816,7 @@ private: dst->Ticks = src->Ticks; dst->MonthYear = src->MonthYear; dst->Day = src->Day; - memcpy(dst->Text, src->Text, sizeof(src->Text)); + Memory::Copy(dst->Text, src->Text, sizeof(src->Text)); } // Initial guest status @@ -1968,7 +1968,7 @@ private: gNextFreeMapElement = nextFreeMapElement; } - void FixColours() + void FixSceneryColours() { colour_t colour; rct_map_element * mapElement = gMapElements; @@ -2018,7 +2018,7 @@ private: } } - void FixZ() + void FixMapElementZ() { rct_map_element * mapElement = gMapElements; while (mapElement < gNextFreeMapElement) From e115227c08e2d4bfffb5b32ece7768d05bf26070 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 26 Jan 2017 23:36:33 +0000 Subject: [PATCH 47/48] Sort includes --- src/openrct2/rct1/S4Importer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 1df6934fba..c5b70cff60 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -23,8 +23,8 @@ #include "../core/Path.hpp" #include "../core/String.hpp" #include "../core/Util.hpp" -#include "../scenario/ScenarioSources.h" #include "../object/ObjectManager.h" +#include "../scenario/ScenarioSources.h" #include "S4Importer.h" #include "Tables.h" @@ -44,6 +44,7 @@ extern "C" #include "../peep/peep.h" #include "../peep/staff.h" #include "../rct1.h" + #include "../ride/ride_data.h" #include "../ride/track.h" #include "../util/sawyercoding.h" #include "../util/util.h" @@ -52,7 +53,6 @@ extern "C" #include "../world/map_animation.h" #include "../world/park.h" #include "../world/scenery.h" - #include "../ride/ride_data.h" } class EntryList From 24b546b78921e0f3201c6d8aa704cffb4d2daa9f Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 27 Jan 2017 00:48:00 +0100 Subject: [PATCH 48/48] Fix import of peep sprites --- src/openrct2/rct1/tables.cpp | 68 +++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/src/openrct2/rct1/tables.cpp b/src/openrct2/rct1/tables.cpp index ad1f4313a7..4e25f0e716 100644 --- a/src/openrct2/rct1/tables.cpp +++ b/src/openrct2/rct1/tables.cpp @@ -79,41 +79,45 @@ namespace RCT1 { static const uint8 map[] = { - PEEP_SPRITE_TYPE_NORMAL, - PEEP_SPRITE_TYPE_HANDYMAN, - PEEP_SPRITE_TYPE_MECHANIC, - PEEP_SPRITE_TYPE_SECURITY, - PEEP_SPRITE_TYPE_ENTERTAINER_PANDA, - PEEP_SPRITE_TYPE_ENTERTAINER_TIGER, - PEEP_SPRITE_TYPE_ENTERTAINER_ELEPHANT, - PEEP_SPRITE_TYPE_ENTERTAINER_ROMAN, - PEEP_SPRITE_TYPE_ENTERTAINER_GORILLA, - PEEP_SPRITE_TYPE_ENTERTAINER_SNOWMAN, - PEEP_SPRITE_TYPE_ENTERTAINER_KNIGHT, - PEEP_SPRITE_TYPE_ENTERTAINER_ASTRONAUT, - PEEP_SPRITE_TYPE_NORMAL, // Not used - PEEP_SPRITE_TYPE_NORMAL, // Not used - PEEP_SPRITE_TYPE_NORMAL, // Not used - PEEP_SPRITE_TYPE_NORMAL, // Not used - PEEP_SPRITE_TYPE_BALLOON, - PEEP_SPRITE_TYPE_CANDYFLOSS, - PEEP_SPRITE_TYPE_UMBRELLA, - PEEP_SPRITE_TYPE_PIZZA, - PEEP_SPRITE_TYPE_SECURITY_ALT, - PEEP_SPRITE_TYPE_POPCORN, - PEEP_SPRITE_TYPE_ARMS_CROSSED, - PEEP_SPRITE_TYPE_HEAD_DOWN, - PEEP_SPRITE_TYPE_NAUSEOUS, - PEEP_SPRITE_TYPE_VERY_NAUSEOUS, - PEEP_SPRITE_TYPE_REQUIRE_BATHROOM, - PEEP_SPRITE_TYPE_HAT, - PEEP_SPRITE_TYPE_BURGER, - PEEP_SPRITE_TYPE_TENTACLE, - PEEP_SPRITE_TYPE_TOFFEE_APPLE + PEEP_SPRITE_TYPE_NORMAL, // 0x00 + PEEP_SPRITE_TYPE_HANDYMAN, // 0x01 + PEEP_SPRITE_TYPE_MECHANIC, // 0x02 + PEEP_SPRITE_TYPE_SECURITY, // 0x03 + PEEP_SPRITE_TYPE_ENTERTAINER_PANDA, // 0x04 + PEEP_SPRITE_TYPE_ENTERTAINER_TIGER, // 0x05 + PEEP_SPRITE_TYPE_ENTERTAINER_ELEPHANT, // 0x06 + PEEP_SPRITE_TYPE_ENTERTAINER_ROMAN, // 0x07 + PEEP_SPRITE_TYPE_ENTERTAINER_GORILLA, // 0x08 + PEEP_SPRITE_TYPE_ENTERTAINER_SNOWMAN, // 0x09 + PEEP_SPRITE_TYPE_ENTERTAINER_KNIGHT, // 0x0A + PEEP_SPRITE_TYPE_ENTERTAINER_ASTRONAUT, // 0x0B + PEEP_SPRITE_TYPE_ICE_CREAM, // 0x0C + PEEP_SPRITE_TYPE_FRIES, // 0x0D + PEEP_SPRITE_TYPE_BURGER, // 0x0E + PEEP_SPRITE_TYPE_DRINK, // 0x0F + PEEP_SPRITE_TYPE_BALLOON, // 0x10 + PEEP_SPRITE_TYPE_CANDYFLOSS, // 0x11 + PEEP_SPRITE_TYPE_UMBRELLA, // 0x12 + PEEP_SPRITE_TYPE_PIZZA, // 0x13 + PEEP_SPRITE_TYPE_SECURITY_ALT, // 0x14 + PEEP_SPRITE_TYPE_POPCORN, // 0x15 + PEEP_SPRITE_TYPE_ARMS_CROSSED, // 0x16 + PEEP_SPRITE_TYPE_HEAD_DOWN, // 0x17 + PEEP_SPRITE_TYPE_NAUSEOUS, // 0x18 + PEEP_SPRITE_TYPE_VERY_NAUSEOUS, // 0x19 + PEEP_SPRITE_TYPE_REQUIRE_BATHROOM, // 0x1A + PEEP_SPRITE_TYPE_HAT, // 0x1B + PEEP_SPRITE_TYPE_HOT_DOG, // 0x1C + PEEP_SPRITE_TYPE_TENTACLE, // 0x1D + PEEP_SPRITE_TYPE_TOFFEE_APPLE, // 0x1E + PEEP_SPRITE_TYPE_DONUT, // 0x1F + PEEP_SPRITE_TYPE_COFFEE, // 0x20 + PEEP_SPRITE_TYPE_CHICKEN, // 0x21 + PEEP_SPRITE_TYPE_LEMONADE, // 0x22 }; if (rct1SpriteType < 0 || rct1SpriteType > Util::CountOf(map)) { - log_warning("Unsupported RCT1 sprite type."); + log_warning("Unsupported RCT1 peep sprite type: %d.", rct1SpriteType); return PEEP_SPRITE_TYPE_NORMAL; } return map[rct1SpriteType];