From fc43494d74812b95bc68f8ab6cd51edc63e1aa55 Mon Sep 17 00:00:00 2001 From: Casey Johnson <33426783+caseyjohnsonwv@users.noreply.github.com> Date: Wed, 1 Jul 2020 19:52:33 -0400 Subject: [PATCH] Feature: Add Boosters to Wooden Roller Coaster (#12090) --- resources/g2/sprites.json | 10 +++++++ resources/g2/track/wooden/booster_1.png | Bin 0 -> 1896 bytes resources/g2/track/wooden/booster_2.png | Bin 0 -> 1905 bytes .../ride/coaster/WoodenRollerCoaster.cpp | 27 ++++++++++++++++++ .../ride/coaster/meta/WoodenRollerCoaster.h | 4 +-- src/openrct2/sprites.h | 5 +++- 6 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 resources/g2/track/wooden/booster_1.png create mode 100644 resources/g2/track/wooden/booster_2.png diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index 619472c649..6f5fba1756 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -468,6 +468,16 @@ { "path": "tool/scenery_scatter_high.png" }, + { + "path": "track/wooden/booster_1.png", + "x_offset": -34, + "y_offset": -15 + }, + { + "path": "track/wooden/booster_2.png", + "x_offset": -30, + "y_offset": -15 + }, { "path": "font/latin/ae-uc-small.png", "y_offset": 0, diff --git a/resources/g2/track/wooden/booster_1.png b/resources/g2/track/wooden/booster_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbf2e206141925bc55025a934981831acc335cd GIT binary patch literal 1896 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 literal 0 HcmV?d00001 diff --git a/src/openrct2/ride/coaster/WoodenRollerCoaster.cpp b/src/openrct2/ride/coaster/WoodenRollerCoaster.cpp index 2c068f4774..d414f8446c 100644 --- a/src/openrct2/ride/coaster/WoodenRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/WoodenRollerCoaster.cpp @@ -13104,6 +13104,31 @@ static void wooden_rc_track_right_banked_25_deg_down_to_flat( wooden_rc_track_flat_to_left_banked_25_deg_up(session, rideIndex, trackSequence, (direction + 2) & 3, height, tileElement); } +static void wooden_rc_track_booster( + paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, + const TileElement* tileElement) +{ + static constexpr const uint32_t imageIds[4] = { + SPR_G2_WOODEN_RC_BOOSTER_SW_NE, + SPR_G2_WOODEN_RC_BOOSTER_NW_SE, + SPR_G2_WOODEN_RC_BOOSTER_SW_NE, + SPR_G2_WOODEN_RC_BOOSTER_NW_SE, + }; + static constexpr const uint32_t railsImageIds[4] = { + SPR_WOODEN_RC_FLAT_CHAIN_RAILS_SW_NE, + SPR_WOODEN_RC_FLAT_CHAIN_RAILS_NW_SE, + SPR_WOODEN_RC_FLAT_CHAIN_RAILS_NE_SW, + SPR_WOODEN_RC_FLAT_CHAIN_RAILS_SE_NW, + }; + + wooden_rc_track_paint( + session, imageIds[direction], railsImageIds[direction], direction, 0, 2, 32, 25, 2, height, 0, 3, height); + wooden_a_supports_paint_setup(session, direction & 1, 0, height, session->TrackColours[SCHEME_SUPPORTS], nullptr); + paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT); + paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); + paint_util_set_general_support_height(session, height + 32, 0x20); +} + TRACK_PAINT_FUNCTION get_track_paint_function_wooden_rc(int32_t trackType, int32_t direction) { switch (trackType) @@ -13388,6 +13413,8 @@ TRACK_PAINT_FUNCTION get_track_paint_function_wooden_rc(int32_t trackType, int32 return wooden_rc_track_left_banked_25_deg_down_to_flat; case TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_FLAT: return wooden_rc_track_right_banked_25_deg_down_to_flat; + case TRACK_ELEM_BOOSTER: + return wooden_rc_track_booster; } return nullptr; } diff --git a/src/openrct2/ride/coaster/meta/WoodenRollerCoaster.h b/src/openrct2/ride/coaster/meta/WoodenRollerCoaster.h index 6578371182..c551e0e57b 100644 --- a/src/openrct2/ride/coaster/meta/WoodenRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/WoodenRollerCoaster.h @@ -19,7 +19,7 @@ constexpr const RideTypeDescriptor WoodenRollerCoasterRTD = SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_FLAT) | (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_WATER_SPLASH) | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING)), - SET_FIELD(ExtraTrackPieces, 0), + SET_FIELD(ExtraTrackPieces, (1ULL << TRACK_BOOSTER)), SET_FIELD(CoveredTrackPieces, 0), SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), SET_FIELD(TrackPaintFunction, get_track_paint_function_wooden_rc), @@ -28,7 +28,7 @@ constexpr const RideTypeDescriptor WoodenRollerCoasterRTD = RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS), SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT) | (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED) | (1ULL << RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE) ), SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), - SET_FIELD(OperatingSettings, { 0, 0, 0, 0, 0, 0 }), + SET_FIELD(OperatingSettings, { 0, 0, 0, 0, 68, 0 }), SET_FIELD(Naming, { STR_RIDE_NAME_WOODEN_ROLLER_COASTER, STR_RIDE_DESCRIPTION_WOODEN_ROLLER_COASTER }), SET_FIELD(NameConvention, { RIDE_COMPONENT_TYPE_TRAIN, RIDE_COMPONENT_TYPE_TRACK, RIDE_COMPONENT_TYPE_STATION }), SET_FIELD(EnumName, nameof(RIDE_TYPE_WOODEN_ROLLER_COASTER)), diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h index 86a02eaa00..9b8729b886 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -860,7 +860,10 @@ enum SPR_G2_SCENERY_SCATTER_MEDIUM = SPR_G2_BEGIN + 134, SPR_G2_SCENERY_SCATTER_HIGH = SPR_G2_BEGIN + 135, - SPR_G2_CHAR_BEGIN = SPR_G2_BEGIN + 136, + SPR_G2_WOODEN_RC_BOOSTER_SW_NE = SPR_G2_BEGIN + 136, + SPR_G2_WOODEN_RC_BOOSTER_NW_SE = SPR_G2_BEGIN + 137, + + SPR_G2_CHAR_BEGIN = SPR_G2_BEGIN + 138, SPR_G2_AE_UPPER = SPR_G2_CHAR_BEGIN, SPR_G2_AE_LOWER = SPR_G2_CHAR_BEGIN + 1,