From 8c33240c385e22e3a9b8b5d207598ae65b23f58f Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 13 Sep 2017 10:40:27 +0200 Subject: [PATCH 1/6] Slightly refactor loading of vehicle entries --- src/openrct2/object/RideObject.cpp | 49 ++++++++++++++---------------- src/openrct2/ride/vehicle.h | 2 +- 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 9211bf1af6..3112bf0846 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -136,54 +136,49 @@ void RideObject::Load() _legacyType.vehicle_preset_list = &_presetColours; sint32 cur_vehicle_images_offset = _legacyType.images_offset + 3; - for (sint32 i = 0; i < 4; i++) + for (sint32 i = 0; i < RCT2_MAX_VEHICLES_PER_RIDE_ENTRY; i++) { rct_ride_entry_vehicle * vehicleEntry = &_legacyType.vehicles[i]; if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT) { - sint32 al = 1; + sint32 newVar03 = 1; if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_SWINGING) { - al = 13; - if ((vehicleEntry->flags & (VEHICLE_ENTRY_FLAG_21 | VEHICLE_ENTRY_FLAG_27)) != (VEHICLE_ENTRY_FLAG_21 | VEHICLE_ENTRY_FLAG_27)) + newVar03 = 13; + + if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) && !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) { - al = 7; - if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21)) + newVar03 = 5; + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_25) { - if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) - { - al = 5; - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_25) - { - al = 3; - } - } + newVar03 = 3; } } + else if ((vehicleEntry->flags & (VEHICLE_ENTRY_FLAG_21 | VEHICLE_ENTRY_FLAG_27)) != (VEHICLE_ENTRY_FLAG_21 | VEHICLE_ENTRY_FLAG_27)) + { + newVar03 = 7; + } } - vehicleEntry->var_03 = al; + vehicleEntry->var_03 = newVar03; // 0x6DE90B - al = 0x20; + sint32 newVar02 = 32; if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_14)) { - al = 1; - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_23) + newVar02 = 1; + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_23 && vehicleEntry->var_11 != 6) { - if (vehicleEntry->var_11 != 6) + newVar02 = 2; + if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_7)) { - al = 2; - if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_7)) - { - al = 4; - } + newVar02 = 4; } } } - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_12) + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_HAS_SPECIAL_FRAMES) { - al = vehicleEntry->special_frames; + newVar02 = vehicleEntry->special_frames; } - vehicleEntry->var_02 = al; + vehicleEntry->var_02 = newVar02; // 0x6DE946 vehicleEntry->var_16 = vehicleEntry->var_02 * vehicleEntry->var_03; diff --git a/src/openrct2/ride/vehicle.h b/src/openrct2/ride/vehicle.h index 311782451f..7b7aa772ee 100644 --- a/src/openrct2/ride/vehicle.h +++ b/src/openrct2/ride/vehicle.h @@ -232,7 +232,7 @@ enum { VEHICLE_ENTRY_FLAG_ENABLE_ADDITIONAL_COLOUR_2 = 1 << 9, VEHICLE_ENTRY_FLAG_10 = 1 << 10, VEHICLE_ENTRY_FLAG_11 = 1 << 11, - VEHICLE_ENTRY_FLAG_12 = 1 << 12, + VEHICLE_ENTRY_FLAG_HAS_SPECIAL_FRAMES = 1 << 12, // Setting this will cause the game to set vehicleEntry->var_02 to vehicleEntry->special_frames, rather than determining it itself. VEHICLE_ENTRY_FLAG_13 = 1 << 13, VEHICLE_ENTRY_FLAG_14 = 1 << 14, VEHICLE_ENTRY_FLAG_15 = 1 << 15, From 98e15f1cd9f5abeb2c736afac68be0531901985a Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 14 Sep 2017 13:48:14 +0200 Subject: [PATCH 2/6] Rewrite confusing if statement --- src/openrct2/object/RideObject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 3112bf0846..2908acaec1 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -154,7 +154,7 @@ void RideObject::Load() newVar03 = 3; } } - else if ((vehicleEntry->flags & (VEHICLE_ENTRY_FLAG_21 | VEHICLE_ENTRY_FLAG_27)) != (VEHICLE_ENTRY_FLAG_21 | VEHICLE_ENTRY_FLAG_27)) + else if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) || !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) { newVar03 = 7; } From 9cba5436e557d9b9d75a7b6a585dbc45cbb7606e Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 14 Sep 2017 14:07:55 +0200 Subject: [PATCH 3/6] Split off frame calculations; don't set var_02 and _03 --- src/openrct2/object/RideObject.cpp | 114 +++++++++++++++++++---------- src/openrct2/object/RideObject.h | 2 + src/openrct2/ride/vehicle.h | 4 +- 3 files changed, 78 insertions(+), 42 deletions(-) diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 2908acaec1..8fa29734e3 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -141,47 +141,11 @@ void RideObject::Load() rct_ride_entry_vehicle * vehicleEntry = &_legacyType.vehicles[i]; if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT) { - sint32 newVar03 = 1; - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_SWINGING) - { - newVar03 = 13; - - if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) && !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) - { - newVar03 = 5; - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_25) - { - newVar03 = 3; - } - } - else if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) || !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) - { - newVar03 = 7; - } - } - vehicleEntry->var_03 = newVar03; - // 0x6DE90B - sint32 newVar02 = 32; - if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_14)) - { - newVar02 = 1; - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_23 && vehicleEntry->var_11 != 6) - { - newVar02 = 2; - if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_7)) - { - newVar02 = 4; - } - } - } - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_HAS_SPECIAL_FRAMES) - { - newVar02 = vehicleEntry->special_frames; - } - vehicleEntry->var_02 = newVar02; + // RCT2 calculates var_02 and var_03 and overwrites these properties on the vehicle entry. + // Immediately afterwards, the two were multiplied in order to calculate var_16 and were never used again. + // This has been changed to use the calculation results directly - var_02 and var_03 are no longer set. // 0x6DE946 - - vehicleEntry->var_16 = vehicleEntry->var_02 * vehicleEntry->var_03; + vehicleEntry->var_16 = CalculateVar02(vehicleEntry) * CalculateVar03(vehicleEntry); vehicleEntry->base_image_id = cur_vehicle_images_offset; sint32 image_index = vehicleEntry->base_image_id; @@ -338,6 +302,76 @@ void RideObject::Load() } } +uint8 RideObject::CalculateVar02(rct_ride_entry_vehicle * vehicleEntry) +{ + // 0x6DE90B + uint8 newVar02; + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_HAS_SPECIAL_FRAMES) + { + newVar02 = vehicleEntry->special_frames; + } + else + { + if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_14)) + { + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_23 && vehicleEntry->var_11 != 6) + { + if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_7)) + { + newVar02 = 4; + } + else + { + newVar02 = 2; + } + } + else + { + newVar02 = 1; + } + } + else + { + newVar02 = 32; + } + } + + return newVar02; +} + +uint8 RideObject::CalculateVar03(rct_ride_entry_vehicle * vehicleEntry) +{ + uint8 newVar03; + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_SWINGING) + { + if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) && !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) + { + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_25) + { + newVar03 = 3; + } + else + { + newVar03 = 5; + } + } + else if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) || !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) + { + newVar03 = 7; + } + else + { + newVar03 = 13; + } + } + else + { + newVar03 = 1; + } + + return newVar03; +} + void RideObject::Unload() { language_free_object_string(_legacyType.name); diff --git a/src/openrct2/object/RideObject.h b/src/openrct2/object/RideObject.h index ef81d74684..f61e5328ab 100644 --- a/src/openrct2/object/RideObject.h +++ b/src/openrct2/object/RideObject.h @@ -39,6 +39,8 @@ public: void ReadLegacy(IReadObjectContext * context, IStream * stream) override; void Load() override; + uint8 CalculateVar02(rct_ride_entry_vehicle * vehicleEntry) override; + uint8 CalculateVar03(rct_ride_entry_vehicle * vehicleEntry) override; void Unload() override; void DrawPreview(rct_drawpixelinfo * dpi, sint32 width, sint32 height) const override; diff --git a/src/openrct2/ride/vehicle.h b/src/openrct2/ride/vehicle.h index 7b7aa772ee..0f96c0af91 100644 --- a/src/openrct2/ride/vehicle.h +++ b/src/openrct2/ride/vehicle.h @@ -34,8 +34,8 @@ assert_struct_size(rct_vehicle_colour, 2); */ typedef struct rct_ride_entry_vehicle { uint16 rotation_frame_mask; // 0x00 , 0x1A - uint8 var_02; // 0x02 , 0x1C - uint8 var_03; // 0x03 , 0x1D + uint8 var_02; // 0x02 , 0x1C, Appears to be unused, except as a temporary variable in RCT2 (not needed for OpenRCT2) + uint8 var_03; // 0x03 , 0x1D, Appears to be unused, except as a temporary variable in RCT2 (not needed for OpenRCT2) uint32 spacing; // 0x04 , 0x1E uint16 car_friction; // 0x08 , 0x22 sint8 tab_height; // 0x0A , 0x24 From 8954303d992b394891dead272c2ffbdb5ea6b145 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 14 Sep 2017 14:10:35 +0200 Subject: [PATCH 4/6] Add comment about special_frames [ci skip] --- src/openrct2/ride/vehicle.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/ride/vehicle.h b/src/openrct2/ride/vehicle.h index 0f96c0af91..f739990204 100644 --- a/src/openrct2/ride/vehicle.h +++ b/src/openrct2/ride/vehicle.h @@ -74,7 +74,7 @@ typedef struct rct_ride_entry_vehicle { uint8 car_visual; // 0x5D , 0x77 uint8 effect_visual; uint8 draw_order; - uint8 special_frames; // 0x60 , 0x7A + uint8 special_frames; // 0x60 , 0x7A, A custom number that can be used rather than letting RCT2 determine it. Needs the VEHICLE_ENTRY_FLAG_HAS_SPECIAL_FRAMES flag set. sint8* peep_loading_positions; // 0x61 , 0x7B #ifdef NO_RCT2 uint16 peep_loading_positions_count; From 4164d3aeddb6bc7db1a4896b7fec96cd8006e7b3 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 14 Sep 2017 14:12:13 +0200 Subject: [PATCH 5/6] Clarify comment [ci skip] --- src/openrct2/ride/vehicle.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/ride/vehicle.h b/src/openrct2/ride/vehicle.h index f739990204..9124a0bc2c 100644 --- a/src/openrct2/ride/vehicle.h +++ b/src/openrct2/ride/vehicle.h @@ -74,7 +74,7 @@ typedef struct rct_ride_entry_vehicle { uint8 car_visual; // 0x5D , 0x77 uint8 effect_visual; uint8 draw_order; - uint8 special_frames; // 0x60 , 0x7A, A custom number that can be used rather than letting RCT2 determine it. Needs the VEHICLE_ENTRY_FLAG_HAS_SPECIAL_FRAMES flag set. + uint8 special_frames; // 0x60 , 0x7A, A custom number that can be used rather than letting RCT2 determine it. Needs the VEHICLE_ENTRY_FLAG_HAS_SPECIAL_FRAMES flag to be set. sint8* peep_loading_positions; // 0x61 , 0x7B #ifdef NO_RCT2 uint16 peep_loading_positions_count; From a4802983c27c6bc5d2b7ede8eb98a1e5b1bb4fcb Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 14 Sep 2017 14:30:09 +0200 Subject: [PATCH 6/6] Make var_02/_03 calculation methods private and static --- src/openrct2/object/RideObject.cpp | 141 +++++++++++++++-------------- src/openrct2/object/RideObject.h | 5 +- 2 files changed, 74 insertions(+), 72 deletions(-) diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 8fa29734e3..25fea6e09a 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -302,76 +302,6 @@ void RideObject::Load() } } -uint8 RideObject::CalculateVar02(rct_ride_entry_vehicle * vehicleEntry) -{ - // 0x6DE90B - uint8 newVar02; - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_HAS_SPECIAL_FRAMES) - { - newVar02 = vehicleEntry->special_frames; - } - else - { - if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_14)) - { - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_23 && vehicleEntry->var_11 != 6) - { - if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_7)) - { - newVar02 = 4; - } - else - { - newVar02 = 2; - } - } - else - { - newVar02 = 1; - } - } - else - { - newVar02 = 32; - } - } - - return newVar02; -} - -uint8 RideObject::CalculateVar03(rct_ride_entry_vehicle * vehicleEntry) -{ - uint8 newVar03; - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_SWINGING) - { - if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) && !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) - { - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_25) - { - newVar03 = 3; - } - else - { - newVar03 = 5; - } - } - else if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) || !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) - { - newVar03 = 7; - } - else - { - newVar03 = 13; - } - } - else - { - newVar03 = 1; - } - - return newVar03; -} - void RideObject::Unload() { language_free_object_string(_legacyType.name); @@ -533,3 +463,74 @@ void RideObject::PerformFixes() _legacyType.enabledTrackPieces &= ~(1ULL << TRACK_SLOPE_STEEP); } } + +uint8 RideObject::CalculateVar02(const rct_ride_entry_vehicle * vehicleEntry) +{ + // 0x6DE90B + uint8 newVar02; + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_HAS_SPECIAL_FRAMES) + { + newVar02 = vehicleEntry->special_frames; + } + else + { + if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_14)) + { + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_23 && vehicleEntry->var_11 != 6) + { + if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_7)) + { + newVar02 = 4; + } + else + { + newVar02 = 2; + } + } + else + { + newVar02 = 1; + } + } + else + { + newVar02 = 32; + } + } + + return newVar02; +} + +uint8 RideObject::CalculateVar03(const rct_ride_entry_vehicle * vehicleEntry) +{ + uint8 newVar03; + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_SWINGING) + { + if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) && !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) + { + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_25) + { + newVar03 = 3; + } + else + { + newVar03 = 5; + } + } + else if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_21) || !(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_27)) + { + newVar03 = 7; + } + else + { + newVar03 = 13; + } + } + else + { + newVar03 = 1; + } + + return newVar03; +} + diff --git a/src/openrct2/object/RideObject.h b/src/openrct2/object/RideObject.h index f61e5328ab..afed8db735 100644 --- a/src/openrct2/object/RideObject.h +++ b/src/openrct2/object/RideObject.h @@ -39,8 +39,6 @@ public: void ReadLegacy(IReadObjectContext * context, IStream * stream) override; void Load() override; - uint8 CalculateVar02(rct_ride_entry_vehicle * vehicleEntry) override; - uint8 CalculateVar03(rct_ride_entry_vehicle * vehicleEntry) override; void Unload() override; void DrawPreview(rct_drawpixelinfo * dpi, sint32 width, sint32 height) const override; @@ -53,4 +51,7 @@ public: private: void ReadLegacyVehicle(IReadObjectContext * context, IStream * stream, rct_ride_entry_vehicle * vehicle); void PerformFixes(); + + static uint8 CalculateVar02(const rct_ride_entry_vehicle * vehicleEntry); + static uint8 CalculateVar03(const rct_ride_entry_vehicle * vehicleEntry); };