diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt
index ec870eee37..8351bebb4b 100644
--- a/data/language/en-GB.txt
+++ b/data/language/en-GB.txt
@@ -96,6 +96,7 @@ STR_0091 :Unknown Ride (59)
STR_0092 :LIM Launched Roller Coaster
STR_0093 :Hybrid Coaster
STR_0094 :Single Rail Roller Coaster
+STR_0095 :Alpine Coaster
STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops.
STR_0513 :A looping roller coaster where the riders ride in a standing position
STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners
@@ -175,8 +176,9 @@ STR_0598 :Inverted roller coaster trains are accelerated out of the station t
STR_0599 :A compact roller coaster with individual cars and smooth twisting drops
STR_0600 :Powered mine trains career along a smooth and twisted track layout
STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions
-STR_0603 :A wooden style roller coaster with a steel track, allowing for steep drops and inversions.
-STR_0604 :Riders ride single file on a narrow monorail track, as they race through tight inversions and direction changes.
+STR_0603 :A wooden style roller coaster with a steel track, allowing for steep drops and inversions
+STR_0604 :Riders ride single file on a narrow monorail track, as they race through tight inversions and direction changes
+STR_0605 :Riders toboggan down a meandering steel track, braking to control their speed
STR_0767 :Guest {INT32}
STR_0768 :Handyman {INT32}
STR_0769 :Mechanic {INT32}
diff --git a/distribution/changelog.txt b/distribution/changelog.txt
index 7b046258ec..f5d9ae8fb0 100644
--- a/distribution/changelog.txt
+++ b/distribution/changelog.txt
@@ -1,5 +1,6 @@
0.4.1 (in development)
------------------------------------------------------------------------
+- Feature: [#16825] Add Alpine Coaster track type.
- Feature: [#17011] Option to show ride vehicles as separate entries when selecting a ride to construct.
- Improved: [#13966] Music Style dropdown is now sorted by name.
- Improved: [#16978] Tree placement is more natural during map generation.
diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json
index ca5c1fad5d..31fa07ddd7 100644
--- a/resources/g2/sprites.json
+++ b/resources/g2/sprites.json
@@ -11793,5 +11793,2595 @@
"path": "track/raptor/small_steep_to_flat_up_diag_lift_4.png",
"x_offset": -3,
"y_offset": -30
+ },
+ {
+ "path": "track/alpine/preview_track.png",
+ "x_offset": 8,
+ "y_offset": 1
+ },
+ {
+ "path": "track/alpine/preview_support.png",
+ "x_offset": 25,
+ "y_offset": 11
+ },
+ {
+ "path": "track/alpine/flat_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_2.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_1.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_2.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_3.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_4.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_flat_1.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_flat_2.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_flat_3.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_flat_4.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_1.png",
+ "x_offset": -19,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_2.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_3.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_4.png",
+ "x_offset": -19,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_1_1.png",
+ "x_offset": -19,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_1_2.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_1_3.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_2_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_2_2.png",
+ "x_offset": -2,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_2_3.png",
+ "x_offset": -32,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_3_1.png",
+ "x_offset": -4,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_3_2.png",
+ "x_offset": 24,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_3_3.png",
+ "x_offset": -8,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_4_1.png",
+ "x_offset": -26,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_4_2.png",
+ "x_offset": -8,
+ "y_offset": 24,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_4_3.png",
+ "x_offset": -19,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_1_1.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_1_2.png",
+ "x_offset": -28,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_1_3.png",
+ "x_offset": 9,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_1_4.png",
+ "x_offset": -24,
+ "y_offset": 9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_1_5.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_2_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_2_2.png",
+ "x_offset": -8,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_2_3.png",
+ "x_offset": -28,
+ "y_offset": 17,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_2_4.png",
+ "x_offset": -14,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_2_5.png",
+ "x_offset": -30,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_3_1.png",
+ "x_offset": -14,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_3_2.png",
+ "x_offset": 11,
+ "y_offset": 9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_3_3.png",
+ "x_offset": -22,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_3_4.png",
+ "x_offset": 12,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_3_5.png",
+ "x_offset": -10,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_4_1.png",
+ "x_offset": -22,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_4_2.png",
+ "x_offset": -28,
+ "y_offset": 17,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_4_3.png",
+ "x_offset": -14,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_4_4.png",
+ "x_offset": -16,
+ "y_offset": 17,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_4_5.png",
+ "x_offset": -19,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_1_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_1_2.png",
+ "x_offset": -26,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_1_3.png",
+ "x_offset": 17,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_1_4.png",
+ "x_offset": -8,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_2_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_2_2.png",
+ "x_offset": -10,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_2_3.png",
+ "x_offset": -20,
+ "y_offset": 21,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_2_4.png",
+ "x_offset": -28,
+ "y_offset": 9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_3_1.png",
+ "x_offset": -16,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_3_2.png",
+ "x_offset": -1,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_3_3.png",
+ "x_offset": -32,
+ "y_offset": 11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_3_4.png",
+ "x_offset": -4,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_4_1.png",
+ "x_offset": -20,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_4_2.png",
+ "x_offset": -32,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_4_3.png",
+ "x_offset": -3,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_4_4.png",
+ "x_offset": 0,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_1_1.png",
+ "x_offset": -19,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_1_2.png",
+ "x_offset": -18,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_1_3.png",
+ "x_offset": -4,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_1_4.png",
+ "x_offset": -32,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_2_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_2_2.png",
+ "x_offset": -22,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_2_3.png",
+ "x_offset": 23,
+ "y_offset": 11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_2_4.png",
+ "x_offset": -6,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_3_1.png",
+ "x_offset": -28,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_3_2.png",
+ "x_offset": -24,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_3_3.png",
+ "x_offset": -12,
+ "y_offset": 21,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_3_4.png",
+ "x_offset": 0,
+ "y_offset": 9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_4_1.png",
+ "x_offset": -12,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_4_2.png",
+ "x_offset": 1,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_4_3.png",
+ "x_offset": -31,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_4_4.png",
+ "x_offset": -4,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_diag_1.png",
+ "x_offset": -32,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_diag_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_diag_3.png",
+ "x_offset": -32,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_diag_4.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_diag_1.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_diag_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_diag_3.png",
+ "x_offset": -33,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_diag_4.png",
+ "x_offset": -5,
+ "y_offset": -12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_to_flat_up_diag_1.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_to_flat_up_diag_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_to_flat_up_diag_3.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_to_flat_up_diag_4.png",
+ "x_offset": -5,
+ "y_offset": -12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_diag_1.png",
+ "x_offset": -32,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_diag_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_diag_3.png",
+ "x_offset": -32,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_diag_4.png",
+ "x_offset": -5,
+ "y_offset": -20,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_1_1.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_1_2.png",
+ "x_offset": -1,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_2_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_2_2.png",
+ "x_offset": -19,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_3.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_4.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_1.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_2.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_3_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_3_2.png",
+ "x_offset": -15,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_4_1.png",
+ "x_offset": -18,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_4_2.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_1_1.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_1_2.png",
+ "x_offset": -15,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_2_1.png",
+ "x_offset": -18,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_2_2.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_3.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_4.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_1.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_2.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_3_1.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_3_2.png",
+ "x_offset": -5,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_4_1.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_4_2.png",
+ "x_offset": -18,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_1_1.png",
+ "x_offset": -19,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_1_2.png",
+ "x_offset": -1,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_2_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_2_2.png",
+ "x_offset": -16,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_3.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_4.png",
+ "x_offset": -19,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_1.png",
+ "x_offset": -19,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_2.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_3_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_3_2.png",
+ "x_offset": -15,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_4_1.png",
+ "x_offset": -18,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_4_2.png",
+ "x_offset": -19,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_1.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_2.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_3.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_4.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_diag_1_1.png",
+ "x_offset": -32,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_diag_1_2.png",
+ "x_offset": -32,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_diag_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_diag_3.png",
+ "x_offset": -32,
+ "y_offset": 9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_left_bank_diag_4.png",
+ "x_offset": -4,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_diag_1.png",
+ "x_offset": -32,
+ "y_offset": 9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_diag_2.png",
+ "x_offset": -4,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_diag_3_1.png",
+ "x_offset": -32,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_diag_3_2.png",
+ "x_offset": -32,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_right_bank_diag_4.png",
+ "x_offset": -5,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_diag_1_1.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_diag_1_2.png",
+ "x_offset": -32,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_diag_2.png",
+ "x_offset": -5,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_diag_3.png",
+ "x_offset": -33,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_to_gentle_up_diag_4.png",
+ "x_offset": -4,
+ "y_offset": -12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_diag_1.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_diag_2.png",
+ "x_offset": -4,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_diag_3_1.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_diag_3_2.png",
+ "x_offset": -31,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/right_bank_to_gentle_up_diag_4.png",
+ "x_offset": -5,
+ "y_offset": -12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_diag_1_1.png",
+ "x_offset": -32,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_diag_1_2.png",
+ "x_offset": -32,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_diag_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_diag_3.png",
+ "x_offset": -32,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_left_bank_diag_4.png",
+ "x_offset": -4,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_diag_1.png",
+ "x_offset": -32,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_diag_2.png",
+ "x_offset": -4,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_diag_3_1.png",
+ "x_offset": -32,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_diag_3_2.png",
+ "x_offset": -32,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_right_bank_diag_4.png",
+ "x_offset": -5,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_diag_1.png",
+ "x_offset": -32,
+ "y_offset": 11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_diag_2.png",
+ "x_offset": -5,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_diag_3.png",
+ "x_offset": -32,
+ "y_offset": 9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/left_bank_diag_4.png",
+ "x_offset": -4,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_1_1.png",
+ "x_offset": -19,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_1_2.png",
+ "x_offset": -15,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_1_3.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_1_4.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_2_1.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_2_2.png",
+ "x_offset": -2,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_2_3.png",
+ "x_offset": -32,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_3_1.png",
+ "x_offset": -5,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_3_2.png",
+ "x_offset": 23,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_3_3.png",
+ "x_offset": -7,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_3_4.png",
+ "x_offset": -6,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_4_1.png",
+ "x_offset": -28,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_4_2.png",
+ "x_offset": -8,
+ "y_offset": 23,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_4_3.png",
+ "x_offset": -19,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_1_1.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_1_2.png",
+ "x_offset": -15,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_1_3.png",
+ "x_offset": -26,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_1_4.png",
+ "x_offset": 11,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_1_5.png",
+ "x_offset": -25,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_1_6.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_2_1.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_2_2.png",
+ "x_offset": -8,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_2_3.png",
+ "x_offset": -24,
+ "y_offset": 19,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_2_4.png",
+ "x_offset": -14,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_2_5.png",
+ "x_offset": -28,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_3_1.png",
+ "x_offset": -14,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_3_2.png",
+ "x_offset": 11,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_3_3.png",
+ "x_offset": -22,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_3_4.png",
+ "x_offset": 13,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_3_5.png",
+ "x_offset": -9,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_3_6.png",
+ "x_offset": -10,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_4_1.png",
+ "x_offset": -24,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_4_2.png",
+ "x_offset": -30,
+ "y_offset": 16,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_4_3.png",
+ "x_offset": -16,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_4_4.png",
+ "x_offset": -18,
+ "y_offset": 16,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_bank_4_5.png",
+ "x_offset": -19,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_1_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_1_2.png",
+ "x_offset": -24,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_1_3.png",
+ "x_offset": 19,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_1_4.png",
+ "x_offset": -13,
+ "y_offset": 11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_2_1.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_2_2.png",
+ "x_offset": -32,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_2_3.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_2_4.png",
+ "x_offset": -32,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_3_1.png",
+ "x_offset": -17,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_3_2.png",
+ "x_offset": -2,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_3_3.png",
+ "x_offset": -32,
+ "y_offset": 11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_3_4.png",
+ "x_offset": -4,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_4_1.png",
+ "x_offset": -22,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_4_2.png",
+ "x_offset": -32,
+ "y_offset": 11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_4_3.png",
+ "x_offset": -4,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_left_to_diag_bank_4_4.png",
+ "x_offset": 0,
+ "y_offset": 9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_1_1.png",
+ "x_offset": -19,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_1_2.png",
+ "x_offset": -20,
+ "y_offset": 11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_1_3.png",
+ "x_offset": -6,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_1_4.png",
+ "x_offset": -32,
+ "y_offset": 9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_2_1.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_2_2.png",
+ "x_offset": -22,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_2_3.png",
+ "x_offset": 23,
+ "y_offset": 11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_2_4.png",
+ "x_offset": -6,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_3_1.png",
+ "x_offset": -26,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_3_2.png",
+ "x_offset": -32,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_3_3.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_3_4.png",
+ "x_offset": 0,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_4_1.png",
+ "x_offset": -25,
+ "y_offset": -10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_4_2.png",
+ "x_offset": 1,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_4_3.png",
+ "x_offset": -31,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/large_turn_right_to_diag_bank_4_4.png",
+ "x_offset": -4,
+ "y_offset": 11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_gentle_up_1_1.png",
+ "x_offset": -25,
+ "y_offset": -30,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_gentle_up_1_2.png",
+ "x_offset": -13,
+ "y_offset": -16,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_gentle_up_2_1.png",
+ "x_offset": -13,
+ "y_offset": -7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_gentle_up_2_2.png",
+ "x_offset": -38,
+ "y_offset": -16,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_gentle_up_3_1.png",
+ "x_offset": -14,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_gentle_up_3_2.png",
+ "x_offset": -2,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_gentle_up_4_1.png",
+ "x_offset": -26,
+ "y_offset": -11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_gentle_up_4_2.png",
+ "x_offset": -25,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_gentle_up_1_1.png",
+ "x_offset": -25,
+ "y_offset": -11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_gentle_up_1_2.png",
+ "x_offset": -26,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_gentle_up_2_1.png",
+ "x_offset": -13,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_gentle_up_2_2.png",
+ "x_offset": -25,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_gentle_up_3_1.png",
+ "x_offset": -38,
+ "y_offset": -7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_gentle_up_3_2.png",
+ "x_offset": -13,
+ "y_offset": -16,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_gentle_up_4_1.png",
+ "x_offset": -2,
+ "y_offset": -23,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_gentle_up_4_2.png",
+ "x_offset": -14,
+ "y_offset": -16,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_1_1.png",
+ "x_offset": -19,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_1_2.png",
+ "x_offset": -28,
+ "y_offset": -9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_1_3.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_1_4.png",
+ "x_offset": -26,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_1_5.png",
+ "x_offset": -19,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_2_1.png",
+ "x_offset": -19,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_2_2.png",
+ "x_offset": 0,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_2_3.png",
+ "x_offset": 0,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_2_4.png",
+ "x_offset": -12,
+ "y_offset": -20,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_2_5.png",
+ "x_offset": -17,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_3_1.png",
+ "x_offset": -22,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_3_2.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_3_3.png",
+ "x_offset": -20,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_3_4.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_3_5.png",
+ "x_offset": -13,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_4_1.png",
+ "x_offset": -24,
+ "y_offset": -11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_4_2.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_4_3.png",
+ "x_offset": -17,
+ "y_offset": -11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_4_4.png",
+ "x_offset": -16,
+ "y_offset": 5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_left_gentle_up_4_5.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_1_1.png",
+ "x_offset": -19,
+ "y_offset": -11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_1_2.png",
+ "x_offset": -11,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_1_3.png",
+ "x_offset": 0,
+ "y_offset": -11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_1_4.png",
+ "x_offset": -16,
+ "y_offset": 5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_1_5.png",
+ "x_offset": -18,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_2_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_2_2.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_2_3.png",
+ "x_offset": 0,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_2_4.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_2_5.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_3_1.png",
+ "x_offset": -32,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_3_2.png",
+ "x_offset": -32,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_3_3.png",
+ "x_offset": -25,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_3_4.png",
+ "x_offset": -21,
+ "y_offset": -22,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_3_5.png",
+ "x_offset": -19,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_4_1.png",
+ "x_offset": -11,
+ "y_offset": -11,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_4_2.png",
+ "x_offset": 11,
+ "y_offset": -9,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_4_3.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_4_4.png",
+ "x_offset": 10,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_turn_right_gentle_up_4_5.png",
+ "x_offset": -14,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_left_1_1.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_left_1_2.png",
+ "x_offset": -26,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_left_1_3.png",
+ "x_offset": 10,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_left_1_4.png",
+ "x_offset": -15,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_left_2_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_left_2_2.png",
+ "x_offset": -10,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_left_2_3.png",
+ "x_offset": -28,
+ "y_offset": 17,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_left_2_4.png",
+ "x_offset": -20,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_right_1_1.png",
+ "x_offset": -19,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_right_1_2.png",
+ "x_offset": -18,
+ "y_offset": 17,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_right_1_3.png",
+ "x_offset": -14,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_right_1_4.png",
+ "x_offset": -30,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_right_2_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_right_2_2.png",
+ "x_offset": -24,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_right_2_3.png",
+ "x_offset": 12,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/s_bend_right_2_4.png",
+ "x_offset": -12,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_1_1.png",
+ "x_offset": -18,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_1_2.png",
+ "x_offset": -15,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_1_3.png",
+ "x_offset": -32,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_1_4.png",
+ "x_offset": -19,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_2_1.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_2_2.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_2_3.png",
+ "x_offset": -32,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_3_1.png",
+ "x_offset": -6,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_3_2.png",
+ "x_offset": 23,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_3_3.png",
+ "x_offset": -5,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_3_4.png",
+ "x_offset": -5,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_4_1.png",
+ "x_offset": -26,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_4_2.png",
+ "x_offset": -8,
+ "y_offset": 19,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_left_up_4_3.png",
+ "x_offset": -18,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_1_1.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_1_2.png",
+ "x_offset": -6,
+ "y_offset": 19,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_1_3.png",
+ "x_offset": -26,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_2_1.png",
+ "x_offset": -19,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_2_2.png",
+ "x_offset": -32,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_2_3.png",
+ "x_offset": -19,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_2_4.png",
+ "x_offset": -16,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_3_1.png",
+ "x_offset": -32,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_3_2.png",
+ "x_offset": 0,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_3_3.png",
+ "x_offset": -19,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_4_1.png",
+ "x_offset": -6,
+ "y_offset": -1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_4_2.png",
+ "x_offset": -6,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_4_3.png",
+ "x_offset": 23,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_helix_right_up_4_4.png",
+ "x_offset": -7,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_1_1.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_1_2.png",
+ "x_offset": -15,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_1_3.png",
+ "x_offset": -28,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_1_4.png",
+ "x_offset": 9,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_1_5.png",
+ "x_offset": -22,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_1_6.png",
+ "x_offset": -19,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_2_1.png",
+ "x_offset": -19,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_2_2.png",
+ "x_offset": -4,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_2_3.png",
+ "x_offset": -32,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_2_4.png",
+ "x_offset": 1,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_2_5.png",
+ "x_offset": -32,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_3_1.png",
+ "x_offset": -16,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_3_2.png",
+ "x_offset": 10,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_3_3.png",
+ "x_offset": -21,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_3_4.png",
+ "x_offset": 15,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_3_5.png",
+ "x_offset": -3,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_3_6.png",
+ "x_offset": -7,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_4_1.png",
+ "x_offset": -20,
+ "y_offset": 5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_4_2.png",
+ "x_offset": -30,
+ "y_offset": 13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_4_3.png",
+ "x_offset": -8,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_4_4.png",
+ "x_offset": -26,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_left_up_4_5.png",
+ "x_offset": -18,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_1_1.png",
+ "x_offset": -19,
+ "y_offset": 5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_1_2.png",
+ "x_offset": -20,
+ "y_offset": 13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_1_3.png",
+ "x_offset": -8,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_1_4.png",
+ "x_offset": -30,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_1_5.png",
+ "x_offset": -14,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_2_1.png",
+ "x_offset": -19,
+ "y_offset": 1,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_2_2.png",
+ "x_offset": -24,
+ "y_offset": 8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_2_3.png",
+ "x_offset": 5,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_2_4.png",
+ "x_offset": -30,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_2_5.png",
+ "x_offset": -19,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_2_6.png",
+ "x_offset": -15,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_3_1.png",
+ "x_offset": -32,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_3_2.png",
+ "x_offset": -6,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_3_3.png",
+ "x_offset": -32,
+ "y_offset": 12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_3_4.png",
+ "x_offset": -2,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_3_5.png",
+ "x_offset": -19,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_4_1.png",
+ "x_offset": -8,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_4_2.png",
+ "x_offset": -8,
+ "y_offset": 4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_4_3.png",
+ "x_offset": 15,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_4_4.png",
+ "x_offset": -21,
+ "y_offset": 6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_4_5.png",
+ "x_offset": 10,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/medium_helix_right_up_4_6.png",
+ "x_offset": -17,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_to_gentle_up_1_1.png",
+ "x_offset": -24,
+ "y_offset": -14,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_to_gentle_up_1_2.png",
+ "x_offset": -13,
+ "y_offset": -8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_to_gentle_up_2_1.png",
+ "x_offset": -10,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_to_gentle_up_2_2.png",
+ "x_offset": -12,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_to_gentle_up_2_3.png",
+ "x_offset": -38,
+ "y_offset": -8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_to_gentle_up_3_1.png",
+ "x_offset": -15,
+ "y_offset": -2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_to_gentle_up_3_2.png",
+ "x_offset": -3,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_to_gentle_up_4_1.png",
+ "x_offset": -26,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_left_bank_to_gentle_up_4_2.png",
+ "x_offset": -25,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_bank_to_gentle_up_1_1.png",
+ "x_offset": -24,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_bank_to_gentle_up_1_2.png",
+ "x_offset": -26,
+ "y_offset": 7,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_bank_to_gentle_up_2_1.png",
+ "x_offset": -12,
+ "y_offset": -2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_bank_to_gentle_up_2_2.png",
+ "x_offset": -25,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_bank_to_gentle_up_3_1.png",
+ "x_offset": -38,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_bank_to_gentle_up_3_2.png",
+ "x_offset": -38,
+ "y_offset": 0,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_bank_to_gentle_up_3_3.png",
+ "x_offset": -13,
+ "y_offset": -8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_bank_to_gentle_up_4_1.png",
+ "x_offset": -2,
+ "y_offset": -14,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/small_turn_right_bank_to_gentle_up_4_2.png",
+ "x_offset": -15,
+ "y_offset": -8,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_lift_1.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_lift_2.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_lift_3.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_lift_4.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_lift_1.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_lift_2.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_lift_3.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_lift_4.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_flat_lift_1.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_flat_lift_2.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_flat_lift_3.png",
+ "x_offset": -19,
+ "y_offset": 3,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_up_to_flat_lift_4.png",
+ "x_offset": -19,
+ "y_offset": -5,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_lift_1.png",
+ "x_offset": -19,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_lift_2.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_lift_3.png",
+ "x_offset": -19,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_lift_4.png",
+ "x_offset": -19,
+ "y_offset": -13,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_diag_lift_1.png",
+ "x_offset": -32,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_diag_lift_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_diag_lift_3.png",
+ "x_offset": -32,
+ "y_offset": 10,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_diag_lift_4.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_diag_lift_1.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_diag_lift_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_diag_lift_3.png",
+ "x_offset": -33,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/flat_to_gentle_up_diag_lift_4.png",
+ "x_offset": -5,
+ "y_offset": -12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_to_flat_up_diag_lift_1.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_to_flat_up_diag_lift_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_to_flat_up_diag_lift_3.png",
+ "x_offset": -32,
+ "y_offset": 2,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_to_flat_up_diag_lift_4.png",
+ "x_offset": -5,
+ "y_offset": -12,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_diag_lift_1.png",
+ "x_offset": -32,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_diag_lift_2.png",
+ "x_offset": -5,
+ "y_offset": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_diag_lift_3.png",
+ "x_offset": -32,
+ "y_offset": -6,
+ "palette": "keep"
+ },
+ {
+ "path": "track/alpine/gentle_diag_lift_4.png",
+ "x_offset": -5,
+ "y_offset": -20,
+ "palette": "keep"
}
-]
+]
\ No newline at end of file
diff --git a/resources/g2/track/alpine/block_brake_1.png b/resources/g2/track/alpine/block_brake_1.png
new file mode 100644
index 0000000000..16b8a833fb
Binary files /dev/null and b/resources/g2/track/alpine/block_brake_1.png differ
diff --git a/resources/g2/track/alpine/block_brake_2.png b/resources/g2/track/alpine/block_brake_2.png
new file mode 100644
index 0000000000..d7517a681d
Binary files /dev/null and b/resources/g2/track/alpine/block_brake_2.png differ
diff --git a/resources/g2/track/alpine/brake_1.png b/resources/g2/track/alpine/brake_1.png
new file mode 100644
index 0000000000..488d8a15de
Binary files /dev/null and b/resources/g2/track/alpine/brake_1.png differ
diff --git a/resources/g2/track/alpine/brake_2.png b/resources/g2/track/alpine/brake_2.png
new file mode 100644
index 0000000000..5c7fd7636a
Binary files /dev/null and b/resources/g2/track/alpine/brake_2.png differ
diff --git a/resources/g2/track/alpine/flat_1.png b/resources/g2/track/alpine/flat_1.png
new file mode 100644
index 0000000000..6ae3cb0e4d
Binary files /dev/null and b/resources/g2/track/alpine/flat_1.png differ
diff --git a/resources/g2/track/alpine/flat_2.png b/resources/g2/track/alpine/flat_2.png
new file mode 100644
index 0000000000..3ad76eaeb8
Binary files /dev/null and b/resources/g2/track/alpine/flat_2.png differ
diff --git a/resources/g2/track/alpine/flat_diag_1.png b/resources/g2/track/alpine/flat_diag_1.png
new file mode 100644
index 0000000000..61bbd4b959
Binary files /dev/null and b/resources/g2/track/alpine/flat_diag_1.png differ
diff --git a/resources/g2/track/alpine/flat_diag_2.png b/resources/g2/track/alpine/flat_diag_2.png
new file mode 100644
index 0000000000..f184ff5fb3
Binary files /dev/null and b/resources/g2/track/alpine/flat_diag_2.png differ
diff --git a/resources/g2/track/alpine/flat_diag_3.png b/resources/g2/track/alpine/flat_diag_3.png
new file mode 100644
index 0000000000..95135ee35c
Binary files /dev/null and b/resources/g2/track/alpine/flat_diag_3.png differ
diff --git a/resources/g2/track/alpine/flat_diag_4.png b/resources/g2/track/alpine/flat_diag_4.png
new file mode 100644
index 0000000000..eb91b5d0f1
Binary files /dev/null and b/resources/g2/track/alpine/flat_diag_4.png differ
diff --git a/resources/g2/track/alpine/flat_diag_lift_1.png b/resources/g2/track/alpine/flat_diag_lift_1.png
new file mode 100644
index 0000000000..e6ffee868e
Binary files /dev/null and b/resources/g2/track/alpine/flat_diag_lift_1.png differ
diff --git a/resources/g2/track/alpine/flat_diag_lift_2.png b/resources/g2/track/alpine/flat_diag_lift_2.png
new file mode 100644
index 0000000000..17e33c14c0
Binary files /dev/null and b/resources/g2/track/alpine/flat_diag_lift_2.png differ
diff --git a/resources/g2/track/alpine/flat_diag_lift_3.png b/resources/g2/track/alpine/flat_diag_lift_3.png
new file mode 100644
index 0000000000..e68ece0f0e
Binary files /dev/null and b/resources/g2/track/alpine/flat_diag_lift_3.png differ
diff --git a/resources/g2/track/alpine/flat_diag_lift_4.png b/resources/g2/track/alpine/flat_diag_lift_4.png
new file mode 100644
index 0000000000..54ec48a3b2
Binary files /dev/null and b/resources/g2/track/alpine/flat_diag_lift_4.png differ
diff --git a/resources/g2/track/alpine/flat_lift_1.png b/resources/g2/track/alpine/flat_lift_1.png
new file mode 100644
index 0000000000..68b0e2832e
Binary files /dev/null and b/resources/g2/track/alpine/flat_lift_1.png differ
diff --git a/resources/g2/track/alpine/flat_lift_2.png b/resources/g2/track/alpine/flat_lift_2.png
new file mode 100644
index 0000000000..c024d3359d
Binary files /dev/null and b/resources/g2/track/alpine/flat_lift_2.png differ
diff --git a/resources/g2/track/alpine/flat_lift_3.png b/resources/g2/track/alpine/flat_lift_3.png
new file mode 100644
index 0000000000..d3c61e4bf0
Binary files /dev/null and b/resources/g2/track/alpine/flat_lift_3.png differ
diff --git a/resources/g2/track/alpine/flat_lift_4.png b/resources/g2/track/alpine/flat_lift_4.png
new file mode 100644
index 0000000000..87cec5b3ae
Binary files /dev/null and b/resources/g2/track/alpine/flat_lift_4.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_1.png b/resources/g2/track/alpine/flat_to_gentle_up_1.png
new file mode 100644
index 0000000000..98bf881526
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_2.png b/resources/g2/track/alpine/flat_to_gentle_up_2.png
new file mode 100644
index 0000000000..bd5014108c
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_3.png b/resources/g2/track/alpine/flat_to_gentle_up_3.png
new file mode 100644
index 0000000000..e0d7fb6fa9
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_3.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_4.png b/resources/g2/track/alpine/flat_to_gentle_up_4.png
new file mode 100644
index 0000000000..98e0483d9f
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_4.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_diag_1.png b/resources/g2/track/alpine/flat_to_gentle_up_diag_1.png
new file mode 100644
index 0000000000..edbb571e5d
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_diag_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_diag_2.png b/resources/g2/track/alpine/flat_to_gentle_up_diag_2.png
new file mode 100644
index 0000000000..c5059d08b9
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_diag_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_diag_3.png b/resources/g2/track/alpine/flat_to_gentle_up_diag_3.png
new file mode 100644
index 0000000000..d70815a127
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_diag_3.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_diag_4.png b/resources/g2/track/alpine/flat_to_gentle_up_diag_4.png
new file mode 100644
index 0000000000..a547729f5a
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_diag_4.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_1.png b/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_1.png
new file mode 100644
index 0000000000..9abf5bdec1
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_2.png b/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_2.png
new file mode 100644
index 0000000000..50bb6d6625
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_3.png b/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_3.png
new file mode 100644
index 0000000000..3f7105d6fc
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_3.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_4.png b/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_4.png
new file mode 100644
index 0000000000..8c1d7bf2ee
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_diag_lift_4.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_lift_1.png b/resources/g2/track/alpine/flat_to_gentle_up_lift_1.png
new file mode 100644
index 0000000000..a2f906d1f0
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_lift_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_lift_2.png b/resources/g2/track/alpine/flat_to_gentle_up_lift_2.png
new file mode 100644
index 0000000000..1480e140f2
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_lift_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_lift_3.png b/resources/g2/track/alpine/flat_to_gentle_up_lift_3.png
new file mode 100644
index 0000000000..809a4e36ee
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_lift_3.png differ
diff --git a/resources/g2/track/alpine/flat_to_gentle_up_lift_4.png b/resources/g2/track/alpine/flat_to_gentle_up_lift_4.png
new file mode 100644
index 0000000000..8e216de044
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_gentle_up_lift_4.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_1_1.png b/resources/g2/track/alpine/flat_to_left_bank_1_1.png
new file mode 100644
index 0000000000..3a6dbe82bd
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_1_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_1_2.png b/resources/g2/track/alpine/flat_to_left_bank_1_2.png
new file mode 100644
index 0000000000..25d3fbc95d
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_1_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_2_1.png b/resources/g2/track/alpine/flat_to_left_bank_2_1.png
new file mode 100644
index 0000000000..b46ccb1947
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_2_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_2_2.png b/resources/g2/track/alpine/flat_to_left_bank_2_2.png
new file mode 100644
index 0000000000..e1f556bf21
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_2_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_3.png b/resources/g2/track/alpine/flat_to_left_bank_3.png
new file mode 100644
index 0000000000..53188b4a17
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_3.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_4.png b/resources/g2/track/alpine/flat_to_left_bank_4.png
new file mode 100644
index 0000000000..322e942905
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_4.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_diag_1_1.png b/resources/g2/track/alpine/flat_to_left_bank_diag_1_1.png
new file mode 100644
index 0000000000..1456e67d62
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_diag_1_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_diag_1_2.png b/resources/g2/track/alpine/flat_to_left_bank_diag_1_2.png
new file mode 100644
index 0000000000..1ed38d5429
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_diag_1_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_diag_2.png b/resources/g2/track/alpine/flat_to_left_bank_diag_2.png
new file mode 100644
index 0000000000..bdbfdd72ee
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_diag_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_diag_3.png b/resources/g2/track/alpine/flat_to_left_bank_diag_3.png
new file mode 100644
index 0000000000..d8212f5005
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_diag_3.png differ
diff --git a/resources/g2/track/alpine/flat_to_left_bank_diag_4.png b/resources/g2/track/alpine/flat_to_left_bank_diag_4.png
new file mode 100644
index 0000000000..bc7006a75c
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_left_bank_diag_4.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_1.png b/resources/g2/track/alpine/flat_to_right_bank_1.png
new file mode 100644
index 0000000000..ba69cd1074
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_2.png b/resources/g2/track/alpine/flat_to_right_bank_2.png
new file mode 100644
index 0000000000..14e2e8c615
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_3_1.png b/resources/g2/track/alpine/flat_to_right_bank_3_1.png
new file mode 100644
index 0000000000..0e33d8a9be
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_3_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_3_2.png b/resources/g2/track/alpine/flat_to_right_bank_3_2.png
new file mode 100644
index 0000000000..ff50cfc886
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_3_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_4_1.png b/resources/g2/track/alpine/flat_to_right_bank_4_1.png
new file mode 100644
index 0000000000..0786883776
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_4_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_4_2.png b/resources/g2/track/alpine/flat_to_right_bank_4_2.png
new file mode 100644
index 0000000000..bb976214d4
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_4_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_diag_1.png b/resources/g2/track/alpine/flat_to_right_bank_diag_1.png
new file mode 100644
index 0000000000..18d1826a83
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_diag_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_diag_2.png b/resources/g2/track/alpine/flat_to_right_bank_diag_2.png
new file mode 100644
index 0000000000..9bd65b1781
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_diag_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_diag_3_1.png b/resources/g2/track/alpine/flat_to_right_bank_diag_3_1.png
new file mode 100644
index 0000000000..752271bd30
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_diag_3_1.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_diag_3_2.png b/resources/g2/track/alpine/flat_to_right_bank_diag_3_2.png
new file mode 100644
index 0000000000..78e40a637c
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_diag_3_2.png differ
diff --git a/resources/g2/track/alpine/flat_to_right_bank_diag_4.png b/resources/g2/track/alpine/flat_to_right_bank_diag_4.png
new file mode 100644
index 0000000000..28a22340dc
Binary files /dev/null and b/resources/g2/track/alpine/flat_to_right_bank_diag_4.png differ
diff --git a/resources/g2/track/alpine/gentle_1.png b/resources/g2/track/alpine/gentle_1.png
new file mode 100644
index 0000000000..b1fe6aa63d
Binary files /dev/null and b/resources/g2/track/alpine/gentle_1.png differ
diff --git a/resources/g2/track/alpine/gentle_2.png b/resources/g2/track/alpine/gentle_2.png
new file mode 100644
index 0000000000..b8de7ea646
Binary files /dev/null and b/resources/g2/track/alpine/gentle_2.png differ
diff --git a/resources/g2/track/alpine/gentle_3.png b/resources/g2/track/alpine/gentle_3.png
new file mode 100644
index 0000000000..3673f4155a
Binary files /dev/null and b/resources/g2/track/alpine/gentle_3.png differ
diff --git a/resources/g2/track/alpine/gentle_4.png b/resources/g2/track/alpine/gentle_4.png
new file mode 100644
index 0000000000..cdd770a0bf
Binary files /dev/null and b/resources/g2/track/alpine/gentle_4.png differ
diff --git a/resources/g2/track/alpine/gentle_diag_1.png b/resources/g2/track/alpine/gentle_diag_1.png
new file mode 100644
index 0000000000..a63480e930
Binary files /dev/null and b/resources/g2/track/alpine/gentle_diag_1.png differ
diff --git a/resources/g2/track/alpine/gentle_diag_2.png b/resources/g2/track/alpine/gentle_diag_2.png
new file mode 100644
index 0000000000..c045a5399c
Binary files /dev/null and b/resources/g2/track/alpine/gentle_diag_2.png differ
diff --git a/resources/g2/track/alpine/gentle_diag_3.png b/resources/g2/track/alpine/gentle_diag_3.png
new file mode 100644
index 0000000000..d1e5a44a06
Binary files /dev/null and b/resources/g2/track/alpine/gentle_diag_3.png differ
diff --git a/resources/g2/track/alpine/gentle_diag_4.png b/resources/g2/track/alpine/gentle_diag_4.png
new file mode 100644
index 0000000000..33e40aaa6a
Binary files /dev/null and b/resources/g2/track/alpine/gentle_diag_4.png differ
diff --git a/resources/g2/track/alpine/gentle_diag_lift_1.png b/resources/g2/track/alpine/gentle_diag_lift_1.png
new file mode 100644
index 0000000000..09764ec53f
Binary files /dev/null and b/resources/g2/track/alpine/gentle_diag_lift_1.png differ
diff --git a/resources/g2/track/alpine/gentle_diag_lift_2.png b/resources/g2/track/alpine/gentle_diag_lift_2.png
new file mode 100644
index 0000000000..b5dbb00272
Binary files /dev/null and b/resources/g2/track/alpine/gentle_diag_lift_2.png differ
diff --git a/resources/g2/track/alpine/gentle_diag_lift_3.png b/resources/g2/track/alpine/gentle_diag_lift_3.png
new file mode 100644
index 0000000000..303419389a
Binary files /dev/null and b/resources/g2/track/alpine/gentle_diag_lift_3.png differ
diff --git a/resources/g2/track/alpine/gentle_diag_lift_4.png b/resources/g2/track/alpine/gentle_diag_lift_4.png
new file mode 100644
index 0000000000..a9af3e108e
Binary files /dev/null and b/resources/g2/track/alpine/gentle_diag_lift_4.png differ
diff --git a/resources/g2/track/alpine/gentle_lift_1.png b/resources/g2/track/alpine/gentle_lift_1.png
new file mode 100644
index 0000000000..3ee8ecc211
Binary files /dev/null and b/resources/g2/track/alpine/gentle_lift_1.png differ
diff --git a/resources/g2/track/alpine/gentle_lift_2.png b/resources/g2/track/alpine/gentle_lift_2.png
new file mode 100644
index 0000000000..f0a9d2c342
Binary files /dev/null and b/resources/g2/track/alpine/gentle_lift_2.png differ
diff --git a/resources/g2/track/alpine/gentle_lift_3.png b/resources/g2/track/alpine/gentle_lift_3.png
new file mode 100644
index 0000000000..5cc6129c1a
Binary files /dev/null and b/resources/g2/track/alpine/gentle_lift_3.png differ
diff --git a/resources/g2/track/alpine/gentle_lift_4.png b/resources/g2/track/alpine/gentle_lift_4.png
new file mode 100644
index 0000000000..4cf047fb44
Binary files /dev/null and b/resources/g2/track/alpine/gentle_lift_4.png differ
diff --git a/resources/g2/track/alpine/gentle_to_flat_up_diag_1.png b/resources/g2/track/alpine/gentle_to_flat_up_diag_1.png
new file mode 100644
index 0000000000..a1a3a7afe7
Binary files /dev/null and b/resources/g2/track/alpine/gentle_to_flat_up_diag_1.png differ
diff --git a/resources/g2/track/alpine/gentle_to_flat_up_diag_2.png b/resources/g2/track/alpine/gentle_to_flat_up_diag_2.png
new file mode 100644
index 0000000000..6fcd8b729d
Binary files /dev/null and b/resources/g2/track/alpine/gentle_to_flat_up_diag_2.png differ
diff --git a/resources/g2/track/alpine/gentle_to_flat_up_diag_3.png b/resources/g2/track/alpine/gentle_to_flat_up_diag_3.png
new file mode 100644
index 0000000000..4c13372143
Binary files /dev/null and b/resources/g2/track/alpine/gentle_to_flat_up_diag_3.png differ
diff --git a/resources/g2/track/alpine/gentle_to_flat_up_diag_4.png b/resources/g2/track/alpine/gentle_to_flat_up_diag_4.png
new file mode 100644
index 0000000000..de97a80134
Binary files /dev/null and b/resources/g2/track/alpine/gentle_to_flat_up_diag_4.png differ
diff --git a/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_1.png b/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_1.png
new file mode 100644
index 0000000000..0660ce5853
Binary files /dev/null and b/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_1.png differ
diff --git a/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_2.png b/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_2.png
new file mode 100644
index 0000000000..8981616697
Binary files /dev/null and b/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_2.png differ
diff --git a/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_3.png b/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_3.png
new file mode 100644
index 0000000000..3b4cb7e15c
Binary files /dev/null and b/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_3.png differ
diff --git a/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_4.png b/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_4.png
new file mode 100644
index 0000000000..8398d7273d
Binary files /dev/null and b/resources/g2/track/alpine/gentle_to_flat_up_diag_lift_4.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_flat_1.png b/resources/g2/track/alpine/gentle_up_to_flat_1.png
new file mode 100644
index 0000000000..1cc45d87b5
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_flat_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_flat_2.png b/resources/g2/track/alpine/gentle_up_to_flat_2.png
new file mode 100644
index 0000000000..48426fee76
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_flat_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_flat_3.png b/resources/g2/track/alpine/gentle_up_to_flat_3.png
new file mode 100644
index 0000000000..02fb8cd4f4
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_flat_3.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_flat_4.png b/resources/g2/track/alpine/gentle_up_to_flat_4.png
new file mode 100644
index 0000000000..6207e5baaf
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_flat_4.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_flat_lift_1.png b/resources/g2/track/alpine/gentle_up_to_flat_lift_1.png
new file mode 100644
index 0000000000..d66edbe47c
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_flat_lift_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_flat_lift_2.png b/resources/g2/track/alpine/gentle_up_to_flat_lift_2.png
new file mode 100644
index 0000000000..88a0630531
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_flat_lift_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_flat_lift_3.png b/resources/g2/track/alpine/gentle_up_to_flat_lift_3.png
new file mode 100644
index 0000000000..1d701c94e0
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_flat_lift_3.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_flat_lift_4.png b/resources/g2/track/alpine/gentle_up_to_flat_lift_4.png
new file mode 100644
index 0000000000..3e05b6aeb0
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_flat_lift_4.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_1_1.png b/resources/g2/track/alpine/gentle_up_to_left_bank_1_1.png
new file mode 100644
index 0000000000..c152b6dec0
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_1_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_1_2.png b/resources/g2/track/alpine/gentle_up_to_left_bank_1_2.png
new file mode 100644
index 0000000000..4014329bc0
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_1_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_2_1.png b/resources/g2/track/alpine/gentle_up_to_left_bank_2_1.png
new file mode 100644
index 0000000000..3892697cfa
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_2_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_2_2.png b/resources/g2/track/alpine/gentle_up_to_left_bank_2_2.png
new file mode 100644
index 0000000000..359c08828d
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_2_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_3.png b/resources/g2/track/alpine/gentle_up_to_left_bank_3.png
new file mode 100644
index 0000000000..273b5556ab
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_3.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_4.png b/resources/g2/track/alpine/gentle_up_to_left_bank_4.png
new file mode 100644
index 0000000000..9237688bd2
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_4.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_diag_1_1.png b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_1_1.png
new file mode 100644
index 0000000000..97868b4774
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_1_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_diag_1_2.png b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_1_2.png
new file mode 100644
index 0000000000..063585cb85
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_1_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_diag_2.png b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_2.png
new file mode 100644
index 0000000000..c54f9f1a19
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_diag_3.png b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_3.png
new file mode 100644
index 0000000000..3b50256a7a
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_3.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_left_bank_diag_4.png b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_4.png
new file mode 100644
index 0000000000..d0c69863f5
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_left_bank_diag_4.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_1.png b/resources/g2/track/alpine/gentle_up_to_right_bank_1.png
new file mode 100644
index 0000000000..faf4357c7b
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_2.png b/resources/g2/track/alpine/gentle_up_to_right_bank_2.png
new file mode 100644
index 0000000000..8eb3c1ebd3
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_3_1.png b/resources/g2/track/alpine/gentle_up_to_right_bank_3_1.png
new file mode 100644
index 0000000000..22ef705509
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_3_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_3_2.png b/resources/g2/track/alpine/gentle_up_to_right_bank_3_2.png
new file mode 100644
index 0000000000..03fd1d3966
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_3_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_4_1.png b/resources/g2/track/alpine/gentle_up_to_right_bank_4_1.png
new file mode 100644
index 0000000000..6914ea1e2f
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_4_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_4_2.png b/resources/g2/track/alpine/gentle_up_to_right_bank_4_2.png
new file mode 100644
index 0000000000..74f97ed66b
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_4_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_diag_1.png b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_1.png
new file mode 100644
index 0000000000..8e3e425f42
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_diag_2.png b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_2.png
new file mode 100644
index 0000000000..157ce1a4ca
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_diag_3_1.png b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_3_1.png
new file mode 100644
index 0000000000..4236e342e3
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_3_1.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_diag_3_2.png b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_3_2.png
new file mode 100644
index 0000000000..e0525f7062
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_3_2.png differ
diff --git a/resources/g2/track/alpine/gentle_up_to_right_bank_diag_4.png b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_4.png
new file mode 100644
index 0000000000..2018833806
Binary files /dev/null and b/resources/g2/track/alpine/gentle_up_to_right_bank_diag_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_1_1.png b/resources/g2/track/alpine/large_turn_left_to_diag_1_1.png
new file mode 100644
index 0000000000..17deeff0d5
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_1_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_1_2.png b/resources/g2/track/alpine/large_turn_left_to_diag_1_2.png
new file mode 100644
index 0000000000..161a927215
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_1_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_1_3.png b/resources/g2/track/alpine/large_turn_left_to_diag_1_3.png
new file mode 100644
index 0000000000..f112a47716
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_1_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_1_4.png b/resources/g2/track/alpine/large_turn_left_to_diag_1_4.png
new file mode 100644
index 0000000000..d41294e6b9
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_1_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_2_1.png b/resources/g2/track/alpine/large_turn_left_to_diag_2_1.png
new file mode 100644
index 0000000000..79c2f64af6
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_2_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_2_2.png b/resources/g2/track/alpine/large_turn_left_to_diag_2_2.png
new file mode 100644
index 0000000000..2ab5c3667f
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_2_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_2_3.png b/resources/g2/track/alpine/large_turn_left_to_diag_2_3.png
new file mode 100644
index 0000000000..de7d82c9f4
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_2_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_2_4.png b/resources/g2/track/alpine/large_turn_left_to_diag_2_4.png
new file mode 100644
index 0000000000..cdad1d62b7
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_2_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_3_1.png b/resources/g2/track/alpine/large_turn_left_to_diag_3_1.png
new file mode 100644
index 0000000000..c699524b0a
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_3_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_3_2.png b/resources/g2/track/alpine/large_turn_left_to_diag_3_2.png
new file mode 100644
index 0000000000..ccd767aa9f
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_3_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_3_3.png b/resources/g2/track/alpine/large_turn_left_to_diag_3_3.png
new file mode 100644
index 0000000000..7b45066d79
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_3_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_3_4.png b/resources/g2/track/alpine/large_turn_left_to_diag_3_4.png
new file mode 100644
index 0000000000..df8b19f8e6
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_3_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_4_1.png b/resources/g2/track/alpine/large_turn_left_to_diag_4_1.png
new file mode 100644
index 0000000000..30511674e4
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_4_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_4_2.png b/resources/g2/track/alpine/large_turn_left_to_diag_4_2.png
new file mode 100644
index 0000000000..abc2d99ec9
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_4_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_4_3.png b/resources/g2/track/alpine/large_turn_left_to_diag_4_3.png
new file mode 100644
index 0000000000..824438a517
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_4_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_4_4.png b/resources/g2/track/alpine/large_turn_left_to_diag_4_4.png
new file mode 100644
index 0000000000..85cc4ed881
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_4_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_1.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_1.png
new file mode 100644
index 0000000000..f9447a2f3d
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_2.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_2.png
new file mode 100644
index 0000000000..16a6814b40
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_3.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_3.png
new file mode 100644
index 0000000000..35fe685409
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_4.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_4.png
new file mode 100644
index 0000000000..356c79996d
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_1_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_1.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_1.png
new file mode 100644
index 0000000000..363a8e3646
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_2.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_2.png
new file mode 100644
index 0000000000..bd23ce2f28
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_3.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_3.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_4.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_4.png
new file mode 100644
index 0000000000..d4aba2727c
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_2_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_1.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_1.png
new file mode 100644
index 0000000000..7c88d76144
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_2.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_2.png
new file mode 100644
index 0000000000..f81acf91c3
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_3.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_3.png
new file mode 100644
index 0000000000..90217b3eff
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_4.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_4.png
new file mode 100644
index 0000000000..ac381f68f7
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_3_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_1.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_1.png
new file mode 100644
index 0000000000..24d4016c5c
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_2.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_2.png
new file mode 100644
index 0000000000..e34e4de8b6
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_3.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_3.png
new file mode 100644
index 0000000000..c787d2b447
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_4.png b/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_4.png
new file mode 100644
index 0000000000..ebbc588d3a
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_left_to_diag_bank_4_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_1_1.png b/resources/g2/track/alpine/large_turn_right_to_diag_1_1.png
new file mode 100644
index 0000000000..7f9d40a920
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_1_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_1_2.png b/resources/g2/track/alpine/large_turn_right_to_diag_1_2.png
new file mode 100644
index 0000000000..4f0da3be7e
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_1_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_1_3.png b/resources/g2/track/alpine/large_turn_right_to_diag_1_3.png
new file mode 100644
index 0000000000..8ecc72ea94
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_1_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_1_4.png b/resources/g2/track/alpine/large_turn_right_to_diag_1_4.png
new file mode 100644
index 0000000000..6f27f32a14
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_1_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_2_1.png b/resources/g2/track/alpine/large_turn_right_to_diag_2_1.png
new file mode 100644
index 0000000000..1a60fd6787
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_2_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_2_2.png b/resources/g2/track/alpine/large_turn_right_to_diag_2_2.png
new file mode 100644
index 0000000000..7ab96b9ad0
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_2_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_2_3.png b/resources/g2/track/alpine/large_turn_right_to_diag_2_3.png
new file mode 100644
index 0000000000..614c478637
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_2_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_2_4.png b/resources/g2/track/alpine/large_turn_right_to_diag_2_4.png
new file mode 100644
index 0000000000..96d3234757
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_2_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_3_1.png b/resources/g2/track/alpine/large_turn_right_to_diag_3_1.png
new file mode 100644
index 0000000000..4320e4b193
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_3_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_3_2.png b/resources/g2/track/alpine/large_turn_right_to_diag_3_2.png
new file mode 100644
index 0000000000..557e753776
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_3_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_3_3.png b/resources/g2/track/alpine/large_turn_right_to_diag_3_3.png
new file mode 100644
index 0000000000..e9359fe9a6
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_3_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_3_4.png b/resources/g2/track/alpine/large_turn_right_to_diag_3_4.png
new file mode 100644
index 0000000000..7be59850e5
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_3_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_4_1.png b/resources/g2/track/alpine/large_turn_right_to_diag_4_1.png
new file mode 100644
index 0000000000..1f6542358a
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_4_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_4_2.png b/resources/g2/track/alpine/large_turn_right_to_diag_4_2.png
new file mode 100644
index 0000000000..4fd4a4796a
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_4_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_4_3.png b/resources/g2/track/alpine/large_turn_right_to_diag_4_3.png
new file mode 100644
index 0000000000..23e654fd17
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_4_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_4_4.png b/resources/g2/track/alpine/large_turn_right_to_diag_4_4.png
new file mode 100644
index 0000000000..855031a863
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_4_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_1.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_1.png
new file mode 100644
index 0000000000..b46f6d6ec0
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_2.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_2.png
new file mode 100644
index 0000000000..49e2fce0fb
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_3.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_3.png
new file mode 100644
index 0000000000..dbff2d254d
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_4.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_4.png
new file mode 100644
index 0000000000..320bc00aad
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_1_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_1.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_1.png
new file mode 100644
index 0000000000..53767d1b25
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_2.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_2.png
new file mode 100644
index 0000000000..7c22932970
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_3.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_3.png
new file mode 100644
index 0000000000..70b93377eb
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_4.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_4.png
new file mode 100644
index 0000000000..7db3223900
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_2_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_1.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_1.png
new file mode 100644
index 0000000000..305889e567
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_2.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_2.png
new file mode 100644
index 0000000000..aa7e2b7a77
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_3.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_3.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_4.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_4.png
new file mode 100644
index 0000000000..fa2d6ff8ea
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_3_4.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_1.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_1.png
new file mode 100644
index 0000000000..3558ddf132
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_1.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_2.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_2.png
new file mode 100644
index 0000000000..04af735874
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_2.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_3.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_3.png
new file mode 100644
index 0000000000..8d0cf62f3a
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_3.png differ
diff --git a/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_4.png b/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_4.png
new file mode 100644
index 0000000000..12d0ac8a57
Binary files /dev/null and b/resources/g2/track/alpine/large_turn_right_to_diag_bank_4_4.png differ
diff --git a/resources/g2/track/alpine/left_bank_1.png b/resources/g2/track/alpine/left_bank_1.png
new file mode 100644
index 0000000000..9aba7aa64a
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_1.png differ
diff --git a/resources/g2/track/alpine/left_bank_2.png b/resources/g2/track/alpine/left_bank_2.png
new file mode 100644
index 0000000000..49e268d3ab
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_2.png differ
diff --git a/resources/g2/track/alpine/left_bank_3.png b/resources/g2/track/alpine/left_bank_3.png
new file mode 100644
index 0000000000..dfff4af61e
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_3.png differ
diff --git a/resources/g2/track/alpine/left_bank_4.png b/resources/g2/track/alpine/left_bank_4.png
new file mode 100644
index 0000000000..a9d9cb1de9
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_4.png differ
diff --git a/resources/g2/track/alpine/left_bank_diag_1.png b/resources/g2/track/alpine/left_bank_diag_1.png
new file mode 100644
index 0000000000..8f2bd3cac4
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_diag_1.png differ
diff --git a/resources/g2/track/alpine/left_bank_diag_2.png b/resources/g2/track/alpine/left_bank_diag_2.png
new file mode 100644
index 0000000000..a5f9a07fe7
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_diag_2.png differ
diff --git a/resources/g2/track/alpine/left_bank_diag_3.png b/resources/g2/track/alpine/left_bank_diag_3.png
new file mode 100644
index 0000000000..82d45ca62c
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_diag_3.png differ
diff --git a/resources/g2/track/alpine/left_bank_diag_4.png b/resources/g2/track/alpine/left_bank_diag_4.png
new file mode 100644
index 0000000000..ddd162912d
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_diag_4.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_1_1.png b/resources/g2/track/alpine/left_bank_to_gentle_up_1_1.png
new file mode 100644
index 0000000000..4dafe2d827
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_1_1.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_1_2.png b/resources/g2/track/alpine/left_bank_to_gentle_up_1_2.png
new file mode 100644
index 0000000000..4a2154d7f4
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_1_2.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_2_1.png b/resources/g2/track/alpine/left_bank_to_gentle_up_2_1.png
new file mode 100644
index 0000000000..c201e7ea02
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_2_1.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_2_2.png b/resources/g2/track/alpine/left_bank_to_gentle_up_2_2.png
new file mode 100644
index 0000000000..e774ad2fa0
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_2_2.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_3.png b/resources/g2/track/alpine/left_bank_to_gentle_up_3.png
new file mode 100644
index 0000000000..a879bd03fa
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_3.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_4.png b/resources/g2/track/alpine/left_bank_to_gentle_up_4.png
new file mode 100644
index 0000000000..338fc0f856
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_4.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_diag_1_1.png b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_1_1.png
new file mode 100644
index 0000000000..33545835be
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_1_1.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_diag_1_2.png b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_1_2.png
new file mode 100644
index 0000000000..79ccde6c1e
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_1_2.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_diag_2.png b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_2.png
new file mode 100644
index 0000000000..9a4d35961b
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_2.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_diag_3.png b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_3.png
new file mode 100644
index 0000000000..5c3f069e96
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_3.png differ
diff --git a/resources/g2/track/alpine/left_bank_to_gentle_up_diag_4.png b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_4.png
new file mode 100644
index 0000000000..a5c720588c
Binary files /dev/null and b/resources/g2/track/alpine/left_bank_to_gentle_up_diag_4.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_1_1.png b/resources/g2/track/alpine/medium_helix_left_up_1_1.png
new file mode 100644
index 0000000000..eab5d42496
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_1_1.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_1_2.png b/resources/g2/track/alpine/medium_helix_left_up_1_2.png
new file mode 100644
index 0000000000..7ec5e3ea08
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_1_2.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_1_3.png b/resources/g2/track/alpine/medium_helix_left_up_1_3.png
new file mode 100644
index 0000000000..e78b873acd
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_1_3.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_1_4.png b/resources/g2/track/alpine/medium_helix_left_up_1_4.png
new file mode 100644
index 0000000000..df88f382a8
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_1_4.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_1_5.png b/resources/g2/track/alpine/medium_helix_left_up_1_5.png
new file mode 100644
index 0000000000..3388770739
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_1_5.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_1_6.png b/resources/g2/track/alpine/medium_helix_left_up_1_6.png
new file mode 100644
index 0000000000..63eb5ebd2a
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_1_6.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_2_1.png b/resources/g2/track/alpine/medium_helix_left_up_2_1.png
new file mode 100644
index 0000000000..1b8724c15f
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_2_1.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_2_2.png b/resources/g2/track/alpine/medium_helix_left_up_2_2.png
new file mode 100644
index 0000000000..46e1b42e16
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_2_2.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_2_3.png b/resources/g2/track/alpine/medium_helix_left_up_2_3.png
new file mode 100644
index 0000000000..08149c1101
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_2_3.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_2_4.png b/resources/g2/track/alpine/medium_helix_left_up_2_4.png
new file mode 100644
index 0000000000..4e2a5f0cae
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_2_4.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_2_5.png b/resources/g2/track/alpine/medium_helix_left_up_2_5.png
new file mode 100644
index 0000000000..99226a3784
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_2_5.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_3_1.png b/resources/g2/track/alpine/medium_helix_left_up_3_1.png
new file mode 100644
index 0000000000..33a2f2977b
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_3_1.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_3_2.png b/resources/g2/track/alpine/medium_helix_left_up_3_2.png
new file mode 100644
index 0000000000..31e8713362
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_3_2.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_3_3.png b/resources/g2/track/alpine/medium_helix_left_up_3_3.png
new file mode 100644
index 0000000000..23facc68eb
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_3_3.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_3_4.png b/resources/g2/track/alpine/medium_helix_left_up_3_4.png
new file mode 100644
index 0000000000..3cdf2a63aa
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_3_4.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_3_5.png b/resources/g2/track/alpine/medium_helix_left_up_3_5.png
new file mode 100644
index 0000000000..f2eb80dd68
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_3_5.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_3_6.png b/resources/g2/track/alpine/medium_helix_left_up_3_6.png
new file mode 100644
index 0000000000..d536658f82
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_3_6.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_4_1.png b/resources/g2/track/alpine/medium_helix_left_up_4_1.png
new file mode 100644
index 0000000000..124804d8d6
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_4_1.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_4_2.png b/resources/g2/track/alpine/medium_helix_left_up_4_2.png
new file mode 100644
index 0000000000..1c4b304c3c
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_4_2.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_4_3.png b/resources/g2/track/alpine/medium_helix_left_up_4_3.png
new file mode 100644
index 0000000000..6f32a4470f
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_4_3.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_4_4.png b/resources/g2/track/alpine/medium_helix_left_up_4_4.png
new file mode 100644
index 0000000000..1bed2166c6
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_4_4.png differ
diff --git a/resources/g2/track/alpine/medium_helix_left_up_4_5.png b/resources/g2/track/alpine/medium_helix_left_up_4_5.png
new file mode 100644
index 0000000000..6e883c7d95
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_left_up_4_5.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_1_1.png b/resources/g2/track/alpine/medium_helix_right_up_1_1.png
new file mode 100644
index 0000000000..ebff2e0e8e
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_1_1.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_1_2.png b/resources/g2/track/alpine/medium_helix_right_up_1_2.png
new file mode 100644
index 0000000000..1e4de95ca8
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_1_2.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_1_3.png b/resources/g2/track/alpine/medium_helix_right_up_1_3.png
new file mode 100644
index 0000000000..61be612814
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_1_3.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_1_4.png b/resources/g2/track/alpine/medium_helix_right_up_1_4.png
new file mode 100644
index 0000000000..e68709b9f3
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_1_4.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_1_5.png b/resources/g2/track/alpine/medium_helix_right_up_1_5.png
new file mode 100644
index 0000000000..4a816d7b46
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_1_5.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_2_1.png b/resources/g2/track/alpine/medium_helix_right_up_2_1.png
new file mode 100644
index 0000000000..c276c6cac4
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_2_1.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_2_2.png b/resources/g2/track/alpine/medium_helix_right_up_2_2.png
new file mode 100644
index 0000000000..6a45a1f2c2
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_2_2.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_2_3.png b/resources/g2/track/alpine/medium_helix_right_up_2_3.png
new file mode 100644
index 0000000000..e7a7776cbc
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_2_3.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_2_4.png b/resources/g2/track/alpine/medium_helix_right_up_2_4.png
new file mode 100644
index 0000000000..ec2f03176a
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_2_4.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_2_5.png b/resources/g2/track/alpine/medium_helix_right_up_2_5.png
new file mode 100644
index 0000000000..2ea41812d7
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_2_5.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_2_6.png b/resources/g2/track/alpine/medium_helix_right_up_2_6.png
new file mode 100644
index 0000000000..9215d09f9d
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_2_6.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_3_1.png b/resources/g2/track/alpine/medium_helix_right_up_3_1.png
new file mode 100644
index 0000000000..950ad5363a
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_3_1.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_3_2.png b/resources/g2/track/alpine/medium_helix_right_up_3_2.png
new file mode 100644
index 0000000000..53f4cf2104
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_3_2.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_3_3.png b/resources/g2/track/alpine/medium_helix_right_up_3_3.png
new file mode 100644
index 0000000000..82bdbd5ee2
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_3_3.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_3_4.png b/resources/g2/track/alpine/medium_helix_right_up_3_4.png
new file mode 100644
index 0000000000..f491d49316
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_3_4.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_3_5.png b/resources/g2/track/alpine/medium_helix_right_up_3_5.png
new file mode 100644
index 0000000000..ac258484e1
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_3_5.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_4_1.png b/resources/g2/track/alpine/medium_helix_right_up_4_1.png
new file mode 100644
index 0000000000..9fff2c0082
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_4_1.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_4_2.png b/resources/g2/track/alpine/medium_helix_right_up_4_2.png
new file mode 100644
index 0000000000..02e0b3c9f2
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_4_2.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_4_3.png b/resources/g2/track/alpine/medium_helix_right_up_4_3.png
new file mode 100644
index 0000000000..8500f1863b
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_4_3.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_4_4.png b/resources/g2/track/alpine/medium_helix_right_up_4_4.png
new file mode 100644
index 0000000000..e0d6b74901
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_4_4.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_4_5.png b/resources/g2/track/alpine/medium_helix_right_up_4_5.png
new file mode 100644
index 0000000000..167994d668
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_4_5.png differ
diff --git a/resources/g2/track/alpine/medium_helix_right_up_4_6.png b/resources/g2/track/alpine/medium_helix_right_up_4_6.png
new file mode 100644
index 0000000000..52bab07c5f
Binary files /dev/null and b/resources/g2/track/alpine/medium_helix_right_up_4_6.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_1_1.png b/resources/g2/track/alpine/medium_turn_left_1_1.png
new file mode 100644
index 0000000000..86cd4f3e88
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_1_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_1_2.png b/resources/g2/track/alpine/medium_turn_left_1_2.png
new file mode 100644
index 0000000000..c69e9bfe27
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_1_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_1_3.png b/resources/g2/track/alpine/medium_turn_left_1_3.png
new file mode 100644
index 0000000000..d95b93f088
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_1_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_1_4.png b/resources/g2/track/alpine/medium_turn_left_1_4.png
new file mode 100644
index 0000000000..901d71514d
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_1_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_1_5.png b/resources/g2/track/alpine/medium_turn_left_1_5.png
new file mode 100644
index 0000000000..5d4678e9ed
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_1_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_2_1.png b/resources/g2/track/alpine/medium_turn_left_2_1.png
new file mode 100644
index 0000000000..eea7e82bee
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_2_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_2_2.png b/resources/g2/track/alpine/medium_turn_left_2_2.png
new file mode 100644
index 0000000000..5b7c8dadf2
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_2_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_2_3.png b/resources/g2/track/alpine/medium_turn_left_2_3.png
new file mode 100644
index 0000000000..d7440015a5
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_2_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_2_4.png b/resources/g2/track/alpine/medium_turn_left_2_4.png
new file mode 100644
index 0000000000..572da8c2b3
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_2_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_2_5.png b/resources/g2/track/alpine/medium_turn_left_2_5.png
new file mode 100644
index 0000000000..199341c71f
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_2_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_3_1.png b/resources/g2/track/alpine/medium_turn_left_3_1.png
new file mode 100644
index 0000000000..06ee0adfb5
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_3_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_3_2.png b/resources/g2/track/alpine/medium_turn_left_3_2.png
new file mode 100644
index 0000000000..2ac1005347
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_3_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_3_3.png b/resources/g2/track/alpine/medium_turn_left_3_3.png
new file mode 100644
index 0000000000..6bd162546a
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_3_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_3_4.png b/resources/g2/track/alpine/medium_turn_left_3_4.png
new file mode 100644
index 0000000000..dc542ce912
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_3_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_3_5.png b/resources/g2/track/alpine/medium_turn_left_3_5.png
new file mode 100644
index 0000000000..39a4404fbf
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_3_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_4_1.png b/resources/g2/track/alpine/medium_turn_left_4_1.png
new file mode 100644
index 0000000000..80e7d583c6
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_4_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_4_2.png b/resources/g2/track/alpine/medium_turn_left_4_2.png
new file mode 100644
index 0000000000..dfe1dfc325
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_4_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_4_3.png b/resources/g2/track/alpine/medium_turn_left_4_3.png
new file mode 100644
index 0000000000..b38b42a642
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_4_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_4_4.png b/resources/g2/track/alpine/medium_turn_left_4_4.png
new file mode 100644
index 0000000000..f9769e67fa
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_4_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_4_5.png b/resources/g2/track/alpine/medium_turn_left_4_5.png
new file mode 100644
index 0000000000..df299bb51b
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_4_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_1_1.png b/resources/g2/track/alpine/medium_turn_left_bank_1_1.png
new file mode 100644
index 0000000000..685ce4a539
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_1_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_1_2.png b/resources/g2/track/alpine/medium_turn_left_bank_1_2.png
new file mode 100644
index 0000000000..f8cd9f75fb
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_1_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_1_3.png b/resources/g2/track/alpine/medium_turn_left_bank_1_3.png
new file mode 100644
index 0000000000..1f426e8f31
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_1_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_1_4.png b/resources/g2/track/alpine/medium_turn_left_bank_1_4.png
new file mode 100644
index 0000000000..49bb0b48e9
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_1_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_1_5.png b/resources/g2/track/alpine/medium_turn_left_bank_1_5.png
new file mode 100644
index 0000000000..a762111b35
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_1_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_1_6.png b/resources/g2/track/alpine/medium_turn_left_bank_1_6.png
new file mode 100644
index 0000000000..1a998f000c
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_1_6.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_2_1.png b/resources/g2/track/alpine/medium_turn_left_bank_2_1.png
new file mode 100644
index 0000000000..8f4324c4b8
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_2_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_2_2.png b/resources/g2/track/alpine/medium_turn_left_bank_2_2.png
new file mode 100644
index 0000000000..26f8712af1
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_2_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_2_3.png b/resources/g2/track/alpine/medium_turn_left_bank_2_3.png
new file mode 100644
index 0000000000..faf8f3bb43
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_2_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_2_4.png b/resources/g2/track/alpine/medium_turn_left_bank_2_4.png
new file mode 100644
index 0000000000..6eebee2f3e
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_2_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_2_5.png b/resources/g2/track/alpine/medium_turn_left_bank_2_5.png
new file mode 100644
index 0000000000..356cb2ddcc
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_2_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_3_1.png b/resources/g2/track/alpine/medium_turn_left_bank_3_1.png
new file mode 100644
index 0000000000..ba0efb16f9
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_3_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_3_2.png b/resources/g2/track/alpine/medium_turn_left_bank_3_2.png
new file mode 100644
index 0000000000..f046362f85
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_3_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_3_3.png b/resources/g2/track/alpine/medium_turn_left_bank_3_3.png
new file mode 100644
index 0000000000..19e10f3a0f
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_3_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_3_4.png b/resources/g2/track/alpine/medium_turn_left_bank_3_4.png
new file mode 100644
index 0000000000..89a9566de1
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_3_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_3_5.png b/resources/g2/track/alpine/medium_turn_left_bank_3_5.png
new file mode 100644
index 0000000000..eb18256b84
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_3_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_3_6.png b/resources/g2/track/alpine/medium_turn_left_bank_3_6.png
new file mode 100644
index 0000000000..5a3057ca8c
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_3_6.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_4_1.png b/resources/g2/track/alpine/medium_turn_left_bank_4_1.png
new file mode 100644
index 0000000000..129083de7f
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_4_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_4_2.png b/resources/g2/track/alpine/medium_turn_left_bank_4_2.png
new file mode 100644
index 0000000000..1e351cdbc4
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_4_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_4_3.png b/resources/g2/track/alpine/medium_turn_left_bank_4_3.png
new file mode 100644
index 0000000000..0285297e34
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_4_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_4_4.png b/resources/g2/track/alpine/medium_turn_left_bank_4_4.png
new file mode 100644
index 0000000000..fccbb89dac
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_4_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_bank_4_5.png b/resources/g2/track/alpine/medium_turn_left_bank_4_5.png
new file mode 100644
index 0000000000..be124aa67a
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_bank_4_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_1_1.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_1.png
new file mode 100644
index 0000000000..e383842aba
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_1_2.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_2.png
new file mode 100644
index 0000000000..8322df4fd4
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_1_3.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_3.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_1_4.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_4.png
new file mode 100644
index 0000000000..49bfbc4e6c
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_1_5.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_5.png
new file mode 100644
index 0000000000..e6605d73be
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_1_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_2_1.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_1.png
new file mode 100644
index 0000000000..9f33073334
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_2_2.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_2.png
new file mode 100644
index 0000000000..13790c89bc
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_2_3.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_3.png
new file mode 100644
index 0000000000..7f7acac0f0
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_2_4.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_4.png
new file mode 100644
index 0000000000..95614f7fe5
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_2_5.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_5.png
new file mode 100644
index 0000000000..7d20fbddbc
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_2_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_3_1.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_1.png
new file mode 100644
index 0000000000..a24a8f119d
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_3_2.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_2.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_3_3.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_3.png
new file mode 100644
index 0000000000..885f8216a2
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_3_4.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_4.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_3_5.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_5.png
new file mode 100644
index 0000000000..d168751d5d
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_3_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_4_1.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_1.png
new file mode 100644
index 0000000000..5a835edf1a
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_4_2.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_2.png
new file mode 100644
index 0000000000..9a85901e1c
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_4_3.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_3.png
new file mode 100644
index 0000000000..8c0d5fad30
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_4_4.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_4.png
new file mode 100644
index 0000000000..f1832e75c5
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_left_gentle_up_4_5.png b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_5.png
new file mode 100644
index 0000000000..9d9d178a0a
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_left_gentle_up_4_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_1_1.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_1.png
new file mode 100644
index 0000000000..95a2d5f7ee
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_1_2.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_2.png
new file mode 100644
index 0000000000..f38996ad01
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_1_3.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_3.png
new file mode 100644
index 0000000000..7ae89debb2
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_1_4.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_4.png
new file mode 100644
index 0000000000..0ae7c6430c
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_1_5.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_5.png
new file mode 100644
index 0000000000..057d4182f2
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_1_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_2_1.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_1.png
new file mode 100644
index 0000000000..23e0c00d96
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_2_2.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_2.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_2_3.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_3.png
new file mode 100644
index 0000000000..df891c1802
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_2_4.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_4.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_2_5.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_5.png
new file mode 100644
index 0000000000..37c392fbfc
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_2_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_3_1.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_1.png
new file mode 100644
index 0000000000..08a1d546c6
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_3_2.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_2.png
new file mode 100644
index 0000000000..9fc0ac1058
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_3_3.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_3.png
new file mode 100644
index 0000000000..68b318531c
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_3_4.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_4.png
new file mode 100644
index 0000000000..fc30f58df0
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_3_5.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_5.png
new file mode 100644
index 0000000000..5e60d088ea
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_3_5.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_4_1.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_1.png
new file mode 100644
index 0000000000..6ad2c74772
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_1.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_4_2.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_2.png
new file mode 100644
index 0000000000..2a1b922dc3
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_2.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_4_3.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_3.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_3.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_4_4.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_4.png
new file mode 100644
index 0000000000..c25e465aed
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_4.png differ
diff --git a/resources/g2/track/alpine/medium_turn_right_gentle_up_4_5.png b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_5.png
new file mode 100644
index 0000000000..03c36182ed
Binary files /dev/null and b/resources/g2/track/alpine/medium_turn_right_gentle_up_4_5.png differ
diff --git a/resources/g2/track/alpine/preview_support.png b/resources/g2/track/alpine/preview_support.png
new file mode 100644
index 0000000000..ce5c863892
Binary files /dev/null and b/resources/g2/track/alpine/preview_support.png differ
diff --git a/resources/g2/track/alpine/preview_track.png b/resources/g2/track/alpine/preview_track.png
new file mode 100644
index 0000000000..3529af073c
Binary files /dev/null and b/resources/g2/track/alpine/preview_track.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_1.png b/resources/g2/track/alpine/right_bank_to_gentle_up_1.png
new file mode 100644
index 0000000000..497ac705fb
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_1.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_2.png b/resources/g2/track/alpine/right_bank_to_gentle_up_2.png
new file mode 100644
index 0000000000..a0a03245e3
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_2.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_3_1.png b/resources/g2/track/alpine/right_bank_to_gentle_up_3_1.png
new file mode 100644
index 0000000000..4d445b8e77
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_3_1.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_3_2.png b/resources/g2/track/alpine/right_bank_to_gentle_up_3_2.png
new file mode 100644
index 0000000000..6e763d9539
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_3_2.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_4_1.png b/resources/g2/track/alpine/right_bank_to_gentle_up_4_1.png
new file mode 100644
index 0000000000..059dac69e4
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_4_1.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_4_2.png b/resources/g2/track/alpine/right_bank_to_gentle_up_4_2.png
new file mode 100644
index 0000000000..28d21432c8
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_4_2.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_diag_1.png b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_1.png
new file mode 100644
index 0000000000..8eb958c807
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_1.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_diag_2.png b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_2.png
new file mode 100644
index 0000000000..46b3e0c7de
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_2.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_diag_3_1.png b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_3_1.png
new file mode 100644
index 0000000000..b7a8093464
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_3_1.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_diag_3_2.png b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_3_2.png
new file mode 100644
index 0000000000..9a76056ee3
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_3_2.png differ
diff --git a/resources/g2/track/alpine/right_bank_to_gentle_up_diag_4.png b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_4.png
new file mode 100644
index 0000000000..6340650d0b
Binary files /dev/null and b/resources/g2/track/alpine/right_bank_to_gentle_up_diag_4.png differ
diff --git a/resources/g2/track/alpine/s_bend_left_1_1.png b/resources/g2/track/alpine/s_bend_left_1_1.png
new file mode 100644
index 0000000000..9f39005edf
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_left_1_1.png differ
diff --git a/resources/g2/track/alpine/s_bend_left_1_2.png b/resources/g2/track/alpine/s_bend_left_1_2.png
new file mode 100644
index 0000000000..ec3b67c796
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_left_1_2.png differ
diff --git a/resources/g2/track/alpine/s_bend_left_1_3.png b/resources/g2/track/alpine/s_bend_left_1_3.png
new file mode 100644
index 0000000000..5db0c3ef32
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_left_1_3.png differ
diff --git a/resources/g2/track/alpine/s_bend_left_1_4.png b/resources/g2/track/alpine/s_bend_left_1_4.png
new file mode 100644
index 0000000000..ecf6e7662c
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_left_1_4.png differ
diff --git a/resources/g2/track/alpine/s_bend_left_2_1.png b/resources/g2/track/alpine/s_bend_left_2_1.png
new file mode 100644
index 0000000000..0d0cd838c5
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_left_2_1.png differ
diff --git a/resources/g2/track/alpine/s_bend_left_2_2.png b/resources/g2/track/alpine/s_bend_left_2_2.png
new file mode 100644
index 0000000000..15b4850f1d
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_left_2_2.png differ
diff --git a/resources/g2/track/alpine/s_bend_left_2_3.png b/resources/g2/track/alpine/s_bend_left_2_3.png
new file mode 100644
index 0000000000..3bb27e7bbf
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_left_2_3.png differ
diff --git a/resources/g2/track/alpine/s_bend_left_2_4.png b/resources/g2/track/alpine/s_bend_left_2_4.png
new file mode 100644
index 0000000000..6225ed0351
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_left_2_4.png differ
diff --git a/resources/g2/track/alpine/s_bend_right_1_1.png b/resources/g2/track/alpine/s_bend_right_1_1.png
new file mode 100644
index 0000000000..ad073d902d
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_right_1_1.png differ
diff --git a/resources/g2/track/alpine/s_bend_right_1_2.png b/resources/g2/track/alpine/s_bend_right_1_2.png
new file mode 100644
index 0000000000..f62aabcacd
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_right_1_2.png differ
diff --git a/resources/g2/track/alpine/s_bend_right_1_3.png b/resources/g2/track/alpine/s_bend_right_1_3.png
new file mode 100644
index 0000000000..c8fd6e5583
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_right_1_3.png differ
diff --git a/resources/g2/track/alpine/s_bend_right_1_4.png b/resources/g2/track/alpine/s_bend_right_1_4.png
new file mode 100644
index 0000000000..c2917e938a
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_right_1_4.png differ
diff --git a/resources/g2/track/alpine/s_bend_right_2_1.png b/resources/g2/track/alpine/s_bend_right_2_1.png
new file mode 100644
index 0000000000..90be85d757
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_right_2_1.png differ
diff --git a/resources/g2/track/alpine/s_bend_right_2_2.png b/resources/g2/track/alpine/s_bend_right_2_2.png
new file mode 100644
index 0000000000..913e09243f
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_right_2_2.png differ
diff --git a/resources/g2/track/alpine/s_bend_right_2_3.png b/resources/g2/track/alpine/s_bend_right_2_3.png
new file mode 100644
index 0000000000..24b598adf8
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_right_2_3.png differ
diff --git a/resources/g2/track/alpine/s_bend_right_2_4.png b/resources/g2/track/alpine/s_bend_right_2_4.png
new file mode 100644
index 0000000000..98eb05bc7c
Binary files /dev/null and b/resources/g2/track/alpine/s_bend_right_2_4.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_1_1.png b/resources/g2/track/alpine/small_helix_left_up_1_1.png
new file mode 100644
index 0000000000..7dfef2262d
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_1_1.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_1_2.png b/resources/g2/track/alpine/small_helix_left_up_1_2.png
new file mode 100644
index 0000000000..109ce45927
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_1_2.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_1_3.png b/resources/g2/track/alpine/small_helix_left_up_1_3.png
new file mode 100644
index 0000000000..02e7101dcd
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_1_3.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_1_4.png b/resources/g2/track/alpine/small_helix_left_up_1_4.png
new file mode 100644
index 0000000000..640605a3ab
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_1_4.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_2_1.png b/resources/g2/track/alpine/small_helix_left_up_2_1.png
new file mode 100644
index 0000000000..654f8d33ec
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_2_1.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_2_2.png b/resources/g2/track/alpine/small_helix_left_up_2_2.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_2_2.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_2_3.png b/resources/g2/track/alpine/small_helix_left_up_2_3.png
new file mode 100644
index 0000000000..d9a6563657
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_2_3.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_3_1.png b/resources/g2/track/alpine/small_helix_left_up_3_1.png
new file mode 100644
index 0000000000..e8b755813c
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_3_1.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_3_2.png b/resources/g2/track/alpine/small_helix_left_up_3_2.png
new file mode 100644
index 0000000000..84e070b6c2
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_3_2.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_3_3.png b/resources/g2/track/alpine/small_helix_left_up_3_3.png
new file mode 100644
index 0000000000..fbeec21fc3
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_3_3.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_3_4.png b/resources/g2/track/alpine/small_helix_left_up_3_4.png
new file mode 100644
index 0000000000..81760da542
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_3_4.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_4_1.png b/resources/g2/track/alpine/small_helix_left_up_4_1.png
new file mode 100644
index 0000000000..a2ace9f1e2
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_4_1.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_4_2.png b/resources/g2/track/alpine/small_helix_left_up_4_2.png
new file mode 100644
index 0000000000..c15e7f4964
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_4_2.png differ
diff --git a/resources/g2/track/alpine/small_helix_left_up_4_3.png b/resources/g2/track/alpine/small_helix_left_up_4_3.png
new file mode 100644
index 0000000000..c9f1de3a36
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_left_up_4_3.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_1_1.png b/resources/g2/track/alpine/small_helix_right_up_1_1.png
new file mode 100644
index 0000000000..204551fcb4
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_1_1.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_1_2.png b/resources/g2/track/alpine/small_helix_right_up_1_2.png
new file mode 100644
index 0000000000..601312faa1
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_1_2.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_1_3.png b/resources/g2/track/alpine/small_helix_right_up_1_3.png
new file mode 100644
index 0000000000..eecddaba46
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_1_3.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_2_1.png b/resources/g2/track/alpine/small_helix_right_up_2_1.png
new file mode 100644
index 0000000000..5032190573
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_2_1.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_2_2.png b/resources/g2/track/alpine/small_helix_right_up_2_2.png
new file mode 100644
index 0000000000..dc7f53f44c
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_2_2.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_2_3.png b/resources/g2/track/alpine/small_helix_right_up_2_3.png
new file mode 100644
index 0000000000..a47761eb37
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_2_3.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_2_4.png b/resources/g2/track/alpine/small_helix_right_up_2_4.png
new file mode 100644
index 0000000000..51bb07ff97
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_2_4.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_3_1.png b/resources/g2/track/alpine/small_helix_right_up_3_1.png
new file mode 100644
index 0000000000..fe88eed492
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_3_1.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_3_2.png b/resources/g2/track/alpine/small_helix_right_up_3_2.png
new file mode 100644
index 0000000000..251476d353
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_3_2.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_3_3.png b/resources/g2/track/alpine/small_helix_right_up_3_3.png
new file mode 100644
index 0000000000..d29d6ed4df
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_3_3.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_4_1.png b/resources/g2/track/alpine/small_helix_right_up_4_1.png
new file mode 100644
index 0000000000..926145f91e
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_4_1.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_4_2.png b/resources/g2/track/alpine/small_helix_right_up_4_2.png
new file mode 100644
index 0000000000..c7d7745e1c
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_4_2.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_4_3.png b/resources/g2/track/alpine/small_helix_right_up_4_3.png
new file mode 100644
index 0000000000..1e591916de
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_4_3.png differ
diff --git a/resources/g2/track/alpine/small_helix_right_up_4_4.png b/resources/g2/track/alpine/small_helix_right_up_4_4.png
new file mode 100644
index 0000000000..e95cac4da4
Binary files /dev/null and b/resources/g2/track/alpine/small_helix_right_up_4_4.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_1_1.png b/resources/g2/track/alpine/small_turn_left_1_1.png
new file mode 100644
index 0000000000..023c010499
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_1_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_1_2.png b/resources/g2/track/alpine/small_turn_left_1_2.png
new file mode 100644
index 0000000000..5227c8fd52
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_1_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_1_3.png b/resources/g2/track/alpine/small_turn_left_1_3.png
new file mode 100644
index 0000000000..22eb6a49e6
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_1_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_2_1.png b/resources/g2/track/alpine/small_turn_left_2_1.png
new file mode 100644
index 0000000000..4453e4d4a0
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_2_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_2_2.png b/resources/g2/track/alpine/small_turn_left_2_2.png
new file mode 100644
index 0000000000..38562b1e9b
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_2_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_2_3.png b/resources/g2/track/alpine/small_turn_left_2_3.png
new file mode 100644
index 0000000000..07ef7786f1
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_2_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_3_1.png b/resources/g2/track/alpine/small_turn_left_3_1.png
new file mode 100644
index 0000000000..ef875750bc
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_3_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_3_2.png b/resources/g2/track/alpine/small_turn_left_3_2.png
new file mode 100644
index 0000000000..3e41e7f5b5
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_3_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_3_3.png b/resources/g2/track/alpine/small_turn_left_3_3.png
new file mode 100644
index 0000000000..b51dc0c4ec
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_3_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_4_1.png b/resources/g2/track/alpine/small_turn_left_4_1.png
new file mode 100644
index 0000000000..4b079395cd
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_4_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_4_2.png b/resources/g2/track/alpine/small_turn_left_4_2.png
new file mode 100644
index 0000000000..cc07c6f45a
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_4_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_4_3.png b/resources/g2/track/alpine/small_turn_left_4_3.png
new file mode 100644
index 0000000000..5041c0482e
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_4_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_1_1.png b/resources/g2/track/alpine/small_turn_left_bank_1_1.png
new file mode 100644
index 0000000000..bbbb08cf37
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_1_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_1_2.png b/resources/g2/track/alpine/small_turn_left_bank_1_2.png
new file mode 100644
index 0000000000..83c3d21034
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_1_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_1_3.png b/resources/g2/track/alpine/small_turn_left_bank_1_3.png
new file mode 100644
index 0000000000..2f2dda9646
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_1_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_1_4.png b/resources/g2/track/alpine/small_turn_left_bank_1_4.png
new file mode 100644
index 0000000000..0a63445e85
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_1_4.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_2_1.png b/resources/g2/track/alpine/small_turn_left_bank_2_1.png
new file mode 100644
index 0000000000..614d97c9af
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_2_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_2_2.png b/resources/g2/track/alpine/small_turn_left_bank_2_2.png
new file mode 100644
index 0000000000..dea5f88413
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_2_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_2_3.png b/resources/g2/track/alpine/small_turn_left_bank_2_3.png
new file mode 100644
index 0000000000..5b68eed06c
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_2_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_3_1.png b/resources/g2/track/alpine/small_turn_left_bank_3_1.png
new file mode 100644
index 0000000000..737c75d93c
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_3_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_3_2.png b/resources/g2/track/alpine/small_turn_left_bank_3_2.png
new file mode 100644
index 0000000000..b2c63c6949
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_3_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_3_3.png b/resources/g2/track/alpine/small_turn_left_bank_3_3.png
new file mode 100644
index 0000000000..8992033f0a
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_3_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_3_4.png b/resources/g2/track/alpine/small_turn_left_bank_3_4.png
new file mode 100644
index 0000000000..0b0cdd5d48
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_3_4.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_4_1.png b/resources/g2/track/alpine/small_turn_left_bank_4_1.png
new file mode 100644
index 0000000000..1ff56671aa
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_4_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_4_2.png b/resources/g2/track/alpine/small_turn_left_bank_4_2.png
new file mode 100644
index 0000000000..bff2d8a32c
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_4_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_4_3.png b/resources/g2/track/alpine/small_turn_left_bank_4_3.png
new file mode 100644
index 0000000000..90c0942101
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_4_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_1_1.png b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_1_1.png
new file mode 100644
index 0000000000..b4072fe360
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_1_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_1_2.png b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_1_2.png
new file mode 100644
index 0000000000..d075cc4d0d
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_1_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_2_1.png b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_2_1.png
new file mode 100644
index 0000000000..cf5599c413
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_2_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_2_2.png b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_2_2.png
new file mode 100644
index 0000000000..3e60f837ab
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_2_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_2_3.png b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_2_3.png
new file mode 100644
index 0000000000..32041631c0
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_2_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_3_1.png b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_3_1.png
new file mode 100644
index 0000000000..1d32077fc7
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_3_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_3_2.png b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_3_2.png
new file mode 100644
index 0000000000..fbc587357a
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_3_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_4_1.png b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_4_1.png
new file mode 100644
index 0000000000..c438108ed5
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_4_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_4_2.png b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_4_2.png
new file mode 100644
index 0000000000..ba132eda82
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_bank_to_gentle_up_4_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_gentle_up_1_1.png b/resources/g2/track/alpine/small_turn_left_gentle_up_1_1.png
new file mode 100644
index 0000000000..67f5a9f4ed
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_gentle_up_1_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_gentle_up_1_2.png b/resources/g2/track/alpine/small_turn_left_gentle_up_1_2.png
new file mode 100644
index 0000000000..f7f864aa3f
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_gentle_up_1_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_gentle_up_2_1.png b/resources/g2/track/alpine/small_turn_left_gentle_up_2_1.png
new file mode 100644
index 0000000000..3998203e10
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_gentle_up_2_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_gentle_up_2_2.png b/resources/g2/track/alpine/small_turn_left_gentle_up_2_2.png
new file mode 100644
index 0000000000..a4f59da7f0
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_gentle_up_2_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_gentle_up_3_1.png b/resources/g2/track/alpine/small_turn_left_gentle_up_3_1.png
new file mode 100644
index 0000000000..cbf09ef884
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_gentle_up_3_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_gentle_up_3_2.png b/resources/g2/track/alpine/small_turn_left_gentle_up_3_2.png
new file mode 100644
index 0000000000..eb1b2201b7
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_gentle_up_3_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_gentle_up_4_1.png b/resources/g2/track/alpine/small_turn_left_gentle_up_4_1.png
new file mode 100644
index 0000000000..6c346dfd3e
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_gentle_up_4_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_left_gentle_up_4_2.png b/resources/g2/track/alpine/small_turn_left_gentle_up_4_2.png
new file mode 100644
index 0000000000..0774e3a1b6
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_left_gentle_up_4_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_1_1.png b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_1_1.png
new file mode 100644
index 0000000000..82f456d4f6
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_1_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_1_2.png b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_1_2.png
new file mode 100644
index 0000000000..7ac34bc28d
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_1_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_2_1.png b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_2_1.png
new file mode 100644
index 0000000000..ed1bfca430
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_2_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_2_2.png b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_2_2.png
new file mode 100644
index 0000000000..c0944c6fdb
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_2_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_3_1.png b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_3_1.png
new file mode 100644
index 0000000000..2451b7a894
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_3_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_3_2.png b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_3_2.png
new file mode 100644
index 0000000000..786ef79f7e
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_3_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_3_3.png b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_3_3.png
new file mode 100644
index 0000000000..2c5c2557bb
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_3_3.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_4_1.png b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_4_1.png
new file mode 100644
index 0000000000..3c515f3a52
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_4_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_4_2.png b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_4_2.png
new file mode 100644
index 0000000000..880592aad0
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_bank_to_gentle_up_4_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_gentle_up_1_1.png b/resources/g2/track/alpine/small_turn_right_gentle_up_1_1.png
new file mode 100644
index 0000000000..d0186d03ea
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_gentle_up_1_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_gentle_up_1_2.png b/resources/g2/track/alpine/small_turn_right_gentle_up_1_2.png
new file mode 100644
index 0000000000..3c8eea7228
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_gentle_up_1_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_gentle_up_2_1.png b/resources/g2/track/alpine/small_turn_right_gentle_up_2_1.png
new file mode 100644
index 0000000000..0ef40d7ebe
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_gentle_up_2_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_gentle_up_2_2.png b/resources/g2/track/alpine/small_turn_right_gentle_up_2_2.png
new file mode 100644
index 0000000000..100d1e9075
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_gentle_up_2_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_gentle_up_3_1.png b/resources/g2/track/alpine/small_turn_right_gentle_up_3_1.png
new file mode 100644
index 0000000000..78b31ada27
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_gentle_up_3_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_gentle_up_3_2.png b/resources/g2/track/alpine/small_turn_right_gentle_up_3_2.png
new file mode 100644
index 0000000000..a2e7eb7ccc
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_gentle_up_3_2.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_gentle_up_4_1.png b/resources/g2/track/alpine/small_turn_right_gentle_up_4_1.png
new file mode 100644
index 0000000000..0c330b50c0
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_gentle_up_4_1.png differ
diff --git a/resources/g2/track/alpine/small_turn_right_gentle_up_4_2.png b/resources/g2/track/alpine/small_turn_right_gentle_up_4_2.png
new file mode 100644
index 0000000000..9bfe99ef12
Binary files /dev/null and b/resources/g2/track/alpine/small_turn_right_gentle_up_4_2.png differ
diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp
index 94cb2044f2..fc3982b23a 100644
--- a/src/openrct2-ui/windows/NewRide.cpp
+++ b/src/openrct2-ui/windows/NewRide.cpp
@@ -103,6 +103,7 @@ static constexpr const char RideTypeViewOrder[] = {
RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER,
RIDE_TYPE_HYBRID_COASTER,
RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER,
+ RIDE_TYPE_ALPINE_COASTER,
// Gentle rides
RIDE_TYPE_MONORAIL_CYCLES,
diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj
index 85e5e1446c..aa9e302d60 100644
--- a/src/openrct2/libopenrct2.vcxproj
+++ b/src/openrct2/libopenrct2.vcxproj
@@ -350,6 +350,7 @@
+
@@ -828,6 +829,7 @@
+
diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h
index 713016e5f1..7d6dc1fa85 100644
--- a/src/openrct2/localisation/StringIds.h
+++ b/src/openrct2/localisation/StringIds.h
@@ -111,6 +111,7 @@ enum : uint16_t
STR_RIDE_NAME_LIM_LAUNCHED_ROLLER_COASTER = 92,
STR_RIDE_NAME_HYBRID_COASTER = 93,
STR_RIDE_NAME_SINGLE_RAIL_ROLLER_COASTER = 94,
+ STR_RIDE_NAME_ALPINE_COASTER = 95,
STR_RIDE_DESCRIPTION_SPIRAL_ROLLER_COASTER = 512,
STR_RIDE_DESCRIPTION_STAND_UP_ROLLER_COASTER = 513,
@@ -202,6 +203,7 @@ enum : uint16_t
STR_RIDE_DESCRIPTION_LIM_LAUNCHED_ROLLER_COASTER = 602,
STR_RIDE_DESCRIPTION_HYBRID_COASTER = 603,
STR_RIDE_DESCRIPTION_SINGLE_RAIL_ROLLER_COASTER = 604,
+ STR_RIDE_DESCRIPTION_ALPINE_COASTER = 605,
STR_GUEST_X = 767,
STR_HANDYMAN_X = 768,
diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp
index 7c0a2f750f..84a36aac78 100644
--- a/src/openrct2/network/NetworkBase.cpp
+++ b/src/openrct2/network/NetworkBase.cpp
@@ -42,7 +42,7 @@
// This string specifies which version of network stream current build uses.
// It is used for making sure only compatible builds get connected, even within
// single OpenRCT2 version.
-#define NETWORK_STREAM_VERSION "0"
+#define NETWORK_STREAM_VERSION "1"
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
static Peep* _pickup_peep = nullptr;
diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp
index ff818b1235..40b009168a 100644
--- a/src/openrct2/object/RideObject.cpp
+++ b/src/openrct2/object/RideObject.cpp
@@ -1078,6 +1078,7 @@ static const EnumMap RideTypeLookupTable{
{ "classic_mini_rc", RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER },
{ "hybrid_rc", RIDE_TYPE_HYBRID_COASTER },
{ "single_rail_rc", RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER },
+ { "alpine_rc", RIDE_TYPE_ALPINE_COASTER },
};
uint8_t RideObject::ParseRideType(const std::string& s)
diff --git a/src/openrct2/park/ParkFile.h b/src/openrct2/park/ParkFile.h
index e445abefdd..2d3ae4e229 100644
--- a/src/openrct2/park/ParkFile.h
+++ b/src/openrct2/park/ParkFile.h
@@ -8,10 +8,10 @@ struct ObjectRepositoryItem;
namespace OpenRCT2
{
// Current version that is saved.
- constexpr uint32_t PARK_FILE_CURRENT_VERSION = 0xB;
+ constexpr uint32_t PARK_FILE_CURRENT_VERSION = 0xC;
// The minimum version that is forwards compatible with the current version.
- constexpr uint32_t PARK_FILE_MIN_VERSION = 0xB;
+ constexpr uint32_t PARK_FILE_MIN_VERSION = 0xC;
// The minimum version that is backwards compatible with the current version.
// If this is increased beyond 0, uncomment the checks in ParkFile.cpp and Context.cpp!
diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h
index b99e18571b..05bac254d5 100644
--- a/src/openrct2/ride/Ride.h
+++ b/src/openrct2/ride/Ride.h
@@ -580,6 +580,7 @@ enum
RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER,
RIDE_TYPE_HYBRID_COASTER,
RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER,
+ RIDE_TYPE_ALPINE_COASTER,
RIDE_TYPE_COUNT
};
diff --git a/src/openrct2/ride/RideData.cpp b/src/openrct2/ride/RideData.cpp
index 04cfebce6e..5c80115141 100644
--- a/src/openrct2/ride/RideData.cpp
+++ b/src/openrct2/ride/RideData.cpp
@@ -30,6 +30,7 @@
#include "Track.h"
#include "Vehicle.h"
#include "coaster/meta/AirPoweredVerticalCoaster.h"
+#include "coaster/meta/AlpineCoaster.h"
#include "coaster/meta/BobsleighCoaster.h"
#include "coaster/meta/ClassicMiniRollerCoaster.h"
#include "coaster/meta/CompactInvertedCoaster.h"
@@ -313,6 +314,7 @@ constexpr const RideTypeDescriptor RideTypeDescriptors[RIDE_TYPE_COUNT] = {
/* RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER, */ ClassicMiniRollerCoasterRTD,
/* RIDE_TYPE_HYBRID_COASTER */ HybridCoasterRTD,
/* RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER */ SingleRailRollerCoasterRTD,
+ /* RIDE_TYPE_ALPINE_COASTER */ AlpineCoasterRTD,
};
bool RideTypeDescriptor::HasFlag(uint64_t flag) const
diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp
index 19b3f71340..324d72e438 100644
--- a/src/openrct2/ride/RideRatings.cpp
+++ b/src/openrct2/ride/RideRatings.cpp
@@ -4440,6 +4440,43 @@ void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride, RideRatingUpd
ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths;
}
+void ride_ratings_calculate_alpine_coaster(Ride* ride, RideRatingUpdateState& state)
+{
+ if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
+ return;
+
+ ride->unreliability_factor = 7;
+ set_unreliability_factor(ride);
+
+ RatingTuple ratings;
+ ride_ratings_set(&ratings, RIDE_RATING(2, 30), RIDE_RATING(2, 10), RIDE_RATING(1, 4));
+ ride_ratings_apply_length(&ratings, ride, 6000, 873);
+ ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 75), RIDE_RATING(0, 5));
+ ride_ratings_apply_train_length(&ratings, ride, 187245);
+ ride_ratings_apply_max_speed(&ratings, ride, 44281, 88562, 35424);
+ ride_ratings_apply_average_speed(&ratings, ride, 291271, 436906);
+ ride_ratings_apply_duration(&ratings, ride, 300, 26214);
+ ride_ratings_apply_gforces(&ratings, ride, 20480, 23831, 49648);
+ ride_ratings_apply_turns(&ratings, ride, 29721, 34767, 45749);
+ ride_ratings_apply_drops(&ratings, ride, 8738, 5461, 6553);
+ ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108);
+ ride_ratings_apply_proximity(state, &ratings, 22367);
+ ride_ratings_apply_scenery(&ratings, ride, 11155);
+ ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x50000, 2, 2, 2);
+ ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2);
+ ride_ratings_apply_first_length_penalty(&ratings, ride, 0x1720000, 2, 2, 2);
+ ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 40960, 35746, 49648);
+ ride_ratings_apply_intensity_penalty(&ratings);
+ ride_ratings_apply_adjustments(ride, &ratings);
+
+ ride->ratings = ratings;
+
+ ride->upkeep_cost = ride_compute_upkeep(state, ride);
+ ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME;
+
+ ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths;
+}
+
#pragma endregion
#pragma region Ride rating calculation function table
diff --git a/src/openrct2/ride/RideRatings.h b/src/openrct2/ride/RideRatings.h
index a40a335138..3eb340ef55 100644
--- a/src/openrct2/ride/RideRatings.h
+++ b/src/openrct2/ride/RideRatings.h
@@ -142,4 +142,5 @@ void ride_ratings_calculate_mine_ride(Ride* ride, RideRatingUpdateState& state);
void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride, RideRatingUpdateState& state);
void ride_ratings_calculate_hybrid_coaster(Ride* ride, RideRatingUpdateState& state);
void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride, RideRatingUpdateState& state);
+void ride_ratings_calculate_alpine_coaster(Ride* ride, RideRatingUpdateState& state);
void ride_ratings_calculate_drink_stall(Ride* ride, RideRatingUpdateState& state);
diff --git a/src/openrct2/ride/TrackPaint.h b/src/openrct2/ride/TrackPaint.h
index 3f42bc5959..7b2651bfa5 100644
--- a/src/openrct2/ride/TrackPaint.h
+++ b/src/openrct2/ride/TrackPaint.h
@@ -479,3 +479,7 @@ namespace SingleRailRC
{
TRACK_PAINT_FUNCTION GetTrackPaintFunction(int32_t trackType);
}
+namespace AlpineRC
+{
+ TRACK_PAINT_FUNCTION GetTrackPaintFunction(int32_t trackType);
+}
diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h
index aeefd662b9..def7e7fd6b 100644
--- a/src/openrct2/ride/Vehicle.h
+++ b/src/openrct2/ride/Vehicle.h
@@ -143,6 +143,7 @@ struct Vehicle : EntityBase
int8_t ferris_wheel_var_0;
int8_t ferris_wheel_var_1;
};
+ int16_t rider_speed_preference;
};
union
{
diff --git a/src/openrct2/ride/coaster/AlpineCoaster.cpp b/src/openrct2/ride/coaster/AlpineCoaster.cpp
new file mode 100644
index 0000000000..24a42395b6
--- /dev/null
+++ b/src/openrct2/ride/coaster/AlpineCoaster.cpp
@@ -0,0 +1,7296 @@
+#pragma region Copyright(c) 2014 - 2022 OpenRCT2 Developers
+/*****************************************************************************
+ * OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
+ *
+ * OpenRCT2 is the work of many authors, a full list can be found in contributors.md
+ * For more information, visit https://github.com/OpenRCT2/OpenRCT2
+ *
+ * OpenRCT2 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * A full copy of the GNU General Public License can be found in licence.txt
+ *****************************************************************************/
+#pragma endregion
+
+#include "../../drawing/Drawing.h"
+#include "../../interface/Viewport.h"
+#include "../../paint/Paint.h"
+#include "../../paint/Supports.h"
+#include "../../sprites.h"
+#include "../../world/Map.h"
+#include "../RideData.h"
+#include "../TrackData.h"
+#include "../TrackPaint.h"
+
+namespace AlpineRC
+{
+ static void TrackFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_FLAT + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_FLAT + 1),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_FLAT + 2),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_FLAT + 3),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_FLAT + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_FLAT + 1),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ }
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ }
+
+ static void TrackStation(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ static constexpr const uint32_t imageIds[4][3] = {
+ { (SPR_G2_ALPINE_TRACK_FLAT + 0), (SPR_G2_ALPINE_TRACK_FLAT + 0), SPR_STATION_BASE_B_SW_NE },
+ { (SPR_G2_ALPINE_TRACK_FLAT + 1), (SPR_G2_ALPINE_TRACK_FLAT + 1), SPR_STATION_BASE_B_NW_SE },
+ { (SPR_G2_ALPINE_TRACK_FLAT + 0), (SPR_G2_ALPINE_TRACK_FLAT + 0), SPR_STATION_BASE_B_SW_NE },
+ { (SPR_G2_ALPINE_TRACK_FLAT + 1), (SPR_G2_ALPINE_TRACK_FLAT + 1), SPR_STATION_BASE_B_NW_SE },
+ };
+
+ if (trackElement.GetTrackType() == TrackElemType::EndStation)
+ {
+ PaintAddImageAsParentRotated(
+ session, direction, imageIds[direction][1] | session.TrackColours[SCHEME_TRACK], { 0, 0, height },
+ { 32, 20, 1 }, { 0, 6, height + 3 });
+ }
+ else
+ {
+ PaintAddImageAsParentRotated(
+ session, direction, imageIds[direction][0] | session.TrackColours[SCHEME_TRACK], { 0, 0, height },
+ { 32, 20, 1 }, { 0, 6, height + 3 });
+ }
+ PaintAddImageAsParentRotated(
+ session, direction, imageIds[direction][2] | session.TrackColours[SCHEME_MISC], { 0, 0, height - 2 }, { 32, 28, 2 },
+ { 0, 2, height });
+ track_paint_util_draw_station_metal_supports(session, direction, height, session.TrackColours[SCHEME_SUPPORTS]);
+ track_paint_util_draw_station_2(session, ride, direction, height, trackElement, 4, 7);
+ 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);
+ }
+
+ static void Track25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 8),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 9),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 10),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 11),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 8, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 8),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 9),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 10),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 11),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 8, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ }
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_1);
+ }
+ else
+ {
+ paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_2);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ }
+
+ static void TrackFlatTo25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 1),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 2),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 3),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 1),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 2),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 3),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ }
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ else
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_2);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ }
+
+ static void Track25DegUpToFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 4),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 5),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 6),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 7),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 6, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 4),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 5),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 6),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE + 7),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 6, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ }
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_0);
+ }
+ else
+ {
+ paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_14);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 40, 0x20);
+ }
+
+ static void Track25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ Track25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void TrackFlatTo25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ Track25DegUpToFlat(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void Track25DegDownToFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ TrackFlatTo25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void TrackLeftQuarterTurn3(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 3),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 6),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 9),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 1),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 4),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 7),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 10),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 2),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 5),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 8),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE + 11),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightQuarterTurn3(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
+ TrackLeftQuarterTurn3(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
+ }
+
+ static void TrackLeftQuarterTurn5(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 5),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 10),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 15),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 1),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 6),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 11),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 16),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 2),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 7),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 12),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 17),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 5:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 3),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 8),
+ { 0, 0, height }, { 16, 32, 3 }, { 0, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 13),
+ { 0, 0, height }, { 16, 32, 3 }, { 0, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 18),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 6:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 4),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 9),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 14),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 19),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightQuarterTurn5(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
+ TrackLeftQuarterTurn5(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
+ }
+
+ static void TrackLeftEighthToDiag(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 4),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 8),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 12),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 1),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 5),
+ { 0, 0, height }, { 34, 16, 3 }, { 0, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 9),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 13),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 2),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 6),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 10),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 14),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 3),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 7),
+ { 0, 0, height }, { 16, 18, 3 }, { 0, 16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 11),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 15),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightEighthToDiag(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 16),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 20),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 24),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 28),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 17),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 21),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 25),
+ { 0, 0, height }, { 34, 16, 3 }, { 0, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 29),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 18),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 22),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 26),
+ { 0, 0, height }, { 28, 28, 3 }, { 4, 4, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 30),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 19),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 23),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 27),
+ { 0, 0, height }, { 16, 18, 3 }, { 0, 16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE + 31),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackLeftEighthToOrthogonal(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
+ TrackRightEighthToDiag(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void TrackRightEighthToOrthogonal(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
+ TrackLeftEighthToDiag(session, ride, trackSequence, (direction + 3) & 3, height, trackElement);
+ }
+
+ static void TrackDiagFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_FLAT_DIAGONAL + 3),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_FLAT_DIAGONAL + 3),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_FLAT_DIAGONAL + 0),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_FLAT_DIAGONAL + 0),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_FLAT_DIAGONAL + 2),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_FLAT_DIAGONAL + 2),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_FLAT_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_FLAT_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiag25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 11),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 11),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 1:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 8),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 8),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 2:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 10),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 10),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 3:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiag25DegUpToFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 7),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 7),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 1:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 4),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 4),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 2:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 6),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 6),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 3:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 6, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 5),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 6, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 6, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 6, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 6, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 5),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 6, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 6, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 6, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagFlatTo25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 3),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 3),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 1:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 0),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 0),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 2),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 2),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height + 2, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height + 2, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 2, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 2, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 2, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 2, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiag25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 9),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 9),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 1:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 10),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 10),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 2:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 8),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 8),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 3:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 11),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 11),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagFlatTo25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 5),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 5),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ break;
+ case 1:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 6),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 6),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ break;
+ case 2:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 4),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 4),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ break;
+ case 3:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 7),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 7),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ break;
+ }
+
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ }
+
+ static void TrackDiag25DegDownToFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 1:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 2),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 2),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 0),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 0),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ if (trackElement.HasChain())
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 3),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ else
+ {
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 3),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ }
+ }
+
+ static void TrackFlatToLeftBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 1),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 2),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 3),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 4),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 5),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ }
+
+ static void TrackFlatToRightBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 6),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 7),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 8),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 9),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 10),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 11),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ }
+
+ static void TrackLeftBankToFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ TrackFlatToRightBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void TrackRightBankToFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ TrackFlatToLeftBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void TrackLeftBankTo25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 12),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 13),
+ { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 14),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 15),
+ { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 16),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 17),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ else
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_2);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ }
+
+ static void TrackRightBankTo25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 18),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 19),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 20),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 21),
+ { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 22),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 23),
+ { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ else
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_2);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ }
+
+ static void Track25DegUpToLeftBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 24),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 25),
+ { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 26),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 27),
+ { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 28),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 29),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 6, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_0);
+ }
+ else
+ {
+ paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_14);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 40, 0x20);
+ }
+
+ static void Track25DegUpToRightBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 30),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 31),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 32),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 33),
+ { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 34),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 35),
+ { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 6, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_0);
+ }
+ else
+ {
+ paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_14);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 40, 0x20);
+ }
+
+ static void TrackLeftBankTo25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ Track25DegUpToRightBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void TrackRightBankTo25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ Track25DegUpToLeftBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void Track25DegDownToLeftBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ TrackRightBankTo25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void Track25DegDownToRightBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ TrackLeftBankTo25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void TrackLeftBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 36),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 37),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 38),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 39),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ }
+
+ static void TrackRightBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ TrackLeftBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void TrackDiagFlatToLeftBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 4),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 0),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 3),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 2),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagFlatToRightBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 9),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 5),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 7),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 8),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 6),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagLeftBankToFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 6),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 7),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 8),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 5),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 9),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagRightBankToFlat(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 2),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 3),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 0),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 1),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 4),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagLeftBankTo25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 14),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 10),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 11),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 13),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 12),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagRightBankTo25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 19),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 15),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 17),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 18),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 16),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiag25DegUpToLeftBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 24),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 20),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 21),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 23),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 22),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiag25DegUpToRightBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 29),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 25),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 27),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 28),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 26),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagLeftBankTo25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 26),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 27),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 28),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 25),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 29),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ break;
+ }
+
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ }
+
+ static void TrackDiagRightBankTo25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 22),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 23),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 20),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 21),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 24),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 4, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ break;
+ }
+
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ }
+
+ static void TrackDiag25DegDownToLeftBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 16),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 17),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 18),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 15),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 19),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiag25DegDownToRightBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 12),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 13),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 10),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 11),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 14),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_b_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagLeftBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 33),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 30),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 32),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 31),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackDiagRightBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 31),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 32),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 30),
+ { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 33),
+ { -16, -16, height }, { 32, 32, 3 }, { -16, -16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackLeftQuarterTurn3Bank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 0), { 0, 0, height },
+ { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 1), { 0, 0, height },
+ { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 4), { 0, 0, height },
+ { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 7), { 0, 0, height },
+ { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 11),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 2, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 2), { 0, 0, height },
+ { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 5), { 0, 0, height },
+ { 16, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 8), { 0, 0, height },
+ { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 12),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 3), { 0, 0, height },
+ { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 6), { 0, 0, height },
+ { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 9), { 0, 0, height },
+ { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 10),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 13),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 2, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightQuarterTurn3Bank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
+ TrackLeftQuarterTurn3Bank(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
+ }
+
+ static void TrackBankedLeftQuarterTurn5(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 1),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 6),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 11),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 17),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 1, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 2),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 7),
+ { 0, 0, height }, { 32, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 12),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 18),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 3),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 8),
+ { 0, 0, height }, { 16, 16, 1 }, { 16, 16, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 13),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 19),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 5:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 4),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 9),
+ { 0, 0, height }, { 16, 32, 1 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 14),
+ { 0, 0, height }, { 16, 32, 3 }, { 0, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 20),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 6:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 5),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 10),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 15),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 16),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 21),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 1, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackBankedRightQuarterTurn5(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
+ TrackBankedLeftQuarterTurn5(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
+ }
+
+ static void TrackLeftEighthBankToDiag(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 0), { 0, 0, height },
+ { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 4), { 0, 0, height },
+ { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 8), { 0, 0, height },
+ { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 12),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 1), { 0, 0, height },
+ { 32, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 5), { 0, 0, height },
+ { 34, 16, 0 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 9), { 0, 0, height },
+ { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 13),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 2), { 0, 0, height },
+ { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 6), { 0, 0, height },
+ { 16, 16, 0 }, { 16, 16, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 10),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 14),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 3), { 0, 0, height },
+ { 16, 16, 3 }, { 16, 16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 7), { 0, 0, height },
+ { 16, 18, 0 }, { 0, 16, height + 27 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 11),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 15),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightEighthBankToDiag(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 16),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 20),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 24),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 28),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 17),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 21),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 25),
+ { 0, 0, height }, { 34, 16, 0 }, { 0, 0, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 29),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 18),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 22),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 26),
+ { 0, 0, height }, { 28, 28, 0 }, { 4, 4, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 30),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 19),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 1, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 23),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 0, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 27),
+ { 0, 0, height }, { 16, 18, 0 }, { 0, 16, height + 27 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 2, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 31),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 3, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackLeftEighthBankToOrthogonal(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
+ TrackRightEighthBankToDiag(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
+ }
+
+ static void TrackRightEighthBankToOrthogonal(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
+ TrackLeftEighthBankToDiag(session, ride, trackSequence, (direction + 3) & 3, height, trackElement);
+ }
+
+ static void TrackLeftQuarterTurn3Tile25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 0), { 0, 6, height },
+ { 32, 20, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 2), { 0, 6, height },
+ { 32, 20, 3 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 4), { 0, 6, height },
+ { 32, 20, 3 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 6), { 0, 6, height },
+ { 32, 20, 3 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 8, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_1);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 2:
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 1), { 6, 0, height },
+ { 20, 32, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 3), { 6, 0, height },
+ { 20, 32, 3 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 5), { 6, 0, height },
+ { 20, 32, 3 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 7), { 6, 0, height },
+ { 20, 32, 3 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 8, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height + 8, TUNNEL_2);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height + 8, TUNNEL_2);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightQuarterTurn3Tile25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 8), { 0, 6, height },
+ { 32, 20, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 10),
+ { 0, 6, height }, { 32, 20, 3 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 12),
+ { 0, 6, height }, { 32, 20, 3 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 14),
+ { 0, 6, height }, { 32, 20, 3 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 8, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_1);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 2:
+ paint_util_set_general_support_height(session, height + 56, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 9), { 6, 0, height },
+ { 20, 32, 3 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 4, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 11),
+ { 6, 0, height }, { 20, 32, 3 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 4, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 13),
+ { 6, 0, height }, { 20, 32, 3 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 4, 10, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 15),
+ { 6, 0, height }, { 20, 32, 3 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 4, 8, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ switch (direction)
+ {
+ case 0:
+ paint_util_push_tunnel_right(session, height + 8, TUNNEL_2);
+ break;
+ case 1:
+ paint_util_push_tunnel_left(session, height + 8, TUNNEL_2);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ }
+ }
+
+ static void TrackLeftQuarterTurn3Tile25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
+ TrackRightQuarterTurn3Tile25DegUp(session, ride, trackSequence, (direction + 1) & 3, height, trackElement);
+ }
+
+ static void TrackRightQuarterTurn3Tile25DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
+ TrackLeftQuarterTurn3Tile25DegUp(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
+ }
+
+ static void TrackLeftQuarterTurn525DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 5),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 10),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 15),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 8, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_1);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 1),
+ { 0, 0, height }, { 32, 16, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 6),
+ { 0, 0, height }, { 32, 16, 3 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 11),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 16),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 2),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 7),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 12),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 17),
+ { 0, 0, height }, { 16, 16, 3 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ case 4:
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 5:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 3),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 8),
+ { 0, 0, height }, { 16, 32, 3 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 13),
+ { 0, 0, height }, { 16, 32, 3 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 18),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 6:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 4),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 9),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 14),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 19),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 8, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height + 8, TUNNEL_2);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height + 8, TUNNEL_2);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightQuarterTurn525DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 20),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 25),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 30),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 35),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 8, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_1);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 21),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 26),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 31),
+ { 0, 0, height }, { 32, 16, 3 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 36),
+ { 0, 0, height }, { 32, 16, 3 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 22),
+ { 0, 0, height }, { 16, 16, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 27),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 32),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 37),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ case 4:
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 5:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 23),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 28),
+ { 0, 0, height }, { 16, 32, 3 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 33),
+ { 0, 0, height }, { 16, 32, 3 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 38),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ case 6:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 24),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 29),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 34),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 39),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 8, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 0:
+ paint_util_push_tunnel_right(session, height + 8, TUNNEL_2);
+ break;
+ case 1:
+ paint_util_push_tunnel_left(session, height + 8, TUNNEL_2);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 72, 0x20);
+ break;
+ }
+ }
+
+ static void TrackLeftQuarterTurn525DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
+ TrackRightQuarterTurn525DegUp(session, ride, trackSequence, (direction + 1) & 3, height, trackElement);
+ }
+
+ static void TrackRightQuarterTurn525DegDown(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
+ TrackLeftQuarterTurn525DegUp(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
+ }
+
+ static void TrackSBendLeft(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 4),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 3),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 7),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 1),
+ { 0, 0, height }, { 32, 26, 3 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 5, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 5),
+ { 0, 0, height }, { 32, 26, 3 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 6, 1, height - 1, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 2),
+ { 0, 0, height }, { 32, 26, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 6),
+ { 0, 0, height }, { 32, 26, 3 }, { 0, 6, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 2),
+ { 0, 0, height }, { 32, 26, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 6),
+ { 0, 0, height }, { 32, 26, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 1),
+ { 0, 0, height }, { 32, 26, 3 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 5, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 5),
+ { 0, 0, height }, { 32, 26, 3 });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 6, 1, height - 1, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 3),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 7),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 4),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 1:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 2:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackSBendRight(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 8),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 12),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 11),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 15),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 9),
+ { 0, 0, height }, { 32, 26, 3 }, { 0, 6, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 8, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 13),
+ { 0, 0, height }, { 32, 26, 3 }, { 0, 6, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 7, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 10),
+ { 0, 0, height }, { 32, 26, 3 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 14),
+ { 0, 0, height }, { 32, 26, 3 });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 10),
+ { 0, 0, height }, { 32, 26, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 14),
+ { 0, 0, height }, { 32, 26, 3 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 9),
+ { 0, 0, height }, { 32, 26, 3 }, { 0, 6, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 8, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 13),
+ { 0, 0, height }, { 32, 26, 3 }, { 0, 6, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 7, 0, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 11),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 15),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 8),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_S_BEND + 12),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 1:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 2:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackLeftHalfBankedHelixUpSmall(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 1),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 4),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 7),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 11),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 5, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 2),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 5),
+ { 0, 0, height }, { 16, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 8),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 12),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 3),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 6),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 9),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 10),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 13),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 9, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height + 8, TUNNEL_0);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height + 8, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 11),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 0),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 1),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 4),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 7),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 5, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 0:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 1:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 5:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 6:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 12),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 2),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 5),
+ { 0, 0, height }, { 16, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 8),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 7:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 13),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 3),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 6),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 9),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 10),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 9, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightHalfBankedHelixUpSmall(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 14),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 17),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 21),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 24),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 25),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 5, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 15),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 18),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 22),
+ { 0, 0, height }, { 16, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 26),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 16),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 19),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 20),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 23),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 27),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 9, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 0:
+ paint_util_push_tunnel_right(session, height + 8, TUNNEL_0);
+ break;
+ case 1:
+ paint_util_push_tunnel_left(session, height + 8, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 17),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 21),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 24),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 25),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 14),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 5, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 5:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 6:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 18),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 22),
+ { 0, 0, height }, { 16, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 26),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 15),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 7:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 19),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 20),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 23),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 27),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_SMALL_HELIX + 16),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 9, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackLeftHalfBankedHelixDownSmall(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ if (trackSequence >= 4)
+ {
+ trackSequence -= 4;
+ direction = (direction - 1) & 3;
+ }
+ trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
+ TrackRightHalfBankedHelixUpSmall(session, ride, trackSequence, (direction + 1) & 3, height, trackElement);
+ }
+
+ static void TrackRightHalfBankedHelixDownSmall(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ if (trackSequence >= 4)
+ {
+ trackSequence -= 4;
+ direction = (direction + 1) & 3;
+ }
+ trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
+ TrackLeftHalfBankedHelixUpSmall(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
+ }
+
+ static void TrackLeftHalfBankedHelixUpLarge(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 0),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 1),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 6),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 11),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 17),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 2),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 7),
+ { 0, 0, height }, { 32, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 12),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 18),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 3),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 8),
+ { 0, 0, height }, { 16, 16, 1 }, { 16, 16, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 13),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 19),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 5:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 4),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 9),
+ { 0, 0, height }, { 16, 32, 1 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 14),
+ { 0, 0, height }, { 16, 32, 3 }, { 0, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 20),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 6:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 5),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 10),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 15),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 16),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 21),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 9, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height + 8, TUNNEL_0);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height + 8, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 7:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 17),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 0),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 1),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 6),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 11),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 0:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 1:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 8:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 9:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 18),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 2),
+ { 0, 0, height }, { 16, 32, 3 }, { 0, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 7),
+ { 0, 0, height }, { 16, 32, 1 }, { 0, 0, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 12),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 10:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 19),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 3),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 8),
+ { 0, 0, height }, { 16, 16, 1 }, { 16, 16, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 13),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 11:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 12:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 20),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 4),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 9),
+ { 0, 0, height }, { 32, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 14),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 13:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 21),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 5),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 10),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 15),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 16),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 9, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+ static void TrackRightHalfBankedHelixUpLarge(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 22),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 27),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 33),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 38),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 39),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 2:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 23),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 28),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 34),
+ { 0, 0, height }, { 32, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 40),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 24),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 29),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 35),
+ { 0, 0, height }, { 16, 16, 1 }, { 16, 16, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 41),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 4:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 5:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 25),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 30),
+ { 0, 0, height }, { 16, 32, 3 }, { 0, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 36),
+ { 0, 0, height }, { 16, 32, 1 }, { 0, 0, height + 27 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 42),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 6:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 26),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 4, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 31),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 32),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 4, 5, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 37),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 4, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 43),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 4, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ switch (direction)
+ {
+ case 0:
+ paint_util_push_tunnel_right(session, height + 8, TUNNEL_0);
+ break;
+ case 1:
+ paint_util_push_tunnel_left(session, height + 8, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 7:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 27),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 33),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 38),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 39),
+ { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 22),
+ { 0, 0, height }, { 20, 32, 3 }, { 6, 0, height });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 8:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 9:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 28),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 34),
+ { 0, 0, height }, { 16, 32, 1 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 40),
+ { 0, 0, height }, { 16, 32, 3 }, { 0, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 23),
+ { 0, 0, height }, { 16, 32, 3 }, { 16, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 10:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 29),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 16, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 35),
+ { 0, 0, height }, { 16, 16, 1 }, { 16, 16, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 41),
+ { 0, 0, height }, { 16, 16, 3 }, { 16, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 24),
+ { 0, 0, height }, { 16, 16, 3 }, { 0, 0, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 11:
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 12:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 30),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 0, height });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 36),
+ { 0, 0, height }, { 32, 16, 1 }, { 0, 0, height + 27 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 42),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 25),
+ { 0, 0, height }, { 32, 16, 3 }, { 0, 16, height });
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(
+ SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ case 13:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 31),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 32),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 4, 5, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 37),
+ { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 4, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 43),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK, 4, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_LARGE_HELIX + 26),
+ { 0, 0, height }, { 32, 20, 3 }, { 0, 6, height });
+ metal_a_supports_paint_setup(
+ session, METAL_SUPPORTS_FORK_ALT, 4, 9, height, session.TrackColours[SCHEME_SUPPORTS]);
+ break;
+ }
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session,
+ paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
+ 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ break;
+ }
+ }
+
+ static void TrackLeftHalfBankedHelixDownLarge(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ if (trackSequence >= 7)
+ {
+ trackSequence -= 7;
+ direction = (direction - 1) & 3;
+ }
+ trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
+ TrackRightHalfBankedHelixUpLarge(session, ride, trackSequence, (direction + 1) & 3, height, trackElement);
+ }
+
+ static void TrackRightHalfBankedHelixDownLarge(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ if (trackSequence >= 7)
+ {
+ trackSequence -= 7;
+ direction = (direction + 1) & 3;
+ }
+ trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
+ TrackLeftHalfBankedHelixUpLarge(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
+ }
+
+ static void TrackBrakes(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (direction)
+ {
+ case 0:
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_FLAT + 0), { 0, 0, height },
+ { 32, 20, 3 }, { 0, 6, height });
+ break;
+ case 1:
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_FLAT + 1), { 0, 0, height },
+ { 32, 20, 3 }, { 0, 6, height });
+ break;
+ }
+ if (track_paint_util_should_paint_supports(session.MapPosition))
+ {
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ }
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
+ paint_util_set_general_support_height(session, height + 32, 0x20);
+ }
+
+ static void TrackLeftBankToLeftQuarterTurn3Tile25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 0),
+ { 0, 6, height }, { 32, 20, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 2),
+ { 0, 6, height }, { 32, 20, 3 });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 3),
+ { 0, 6, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 5),
+ { 0, 6, height }, { 32, 20, 3 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 7),
+ { 0, 6, height }, { 32, 20, 3 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 1),
+ { 6, 0, height }, { 20, 32, 3 }, { 0, 6, height - 6 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 4),
+ { 6, 0, height }, { 20, 32, 3 }, { 0, 6, height - 6 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 6),
+ { 6, 0, height }, { 20, 32, 3 }, { 0, 6, height - 6 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 8),
+ { 6, 0, height }, { 20, 32, 3 }, { 0, 6, height - 6 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 10, height - 6,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height, TUNNEL_2);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height, TUNNEL_2);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightBankToRightQuarterTurn3Tile25DegUp(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 9),
+ { 0, 6, height }, { 32, 20, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 11),
+ { 0, 6, height }, { 32, 20, 3 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 13),
+ { 0, 6, height }, { 32, 20, 3 });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 14),
+ { 0, 6, height }, { 32, 1, 26 }, { 0, 27, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 16),
+ { 0, 6, height }, { 32, 20, 3 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 3, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 10),
+ { 6, 0, height }, { 20, 32, 3 }, { 0, 6, height - 6 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 12),
+ { 6, 0, height }, { 20, 32, 3 }, { 0, 6, height - 6 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 15),
+ { 6, 0, height }, { 20, 32, 3 }, { 0, 6, height - 6 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 17),
+ { 6, 0, height }, { 20, 32, 3 }, { 0, 6, height - 6 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 10, height - 6,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 0:
+ paint_util_push_tunnel_right(session, height, TUNNEL_2);
+ break;
+ case 1:
+ paint_util_push_tunnel_left(session, height, TUNNEL_2);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ }
+ }
+
+ static void TrackLeftQuarterTurn3Tile25DegDownToLeftBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 12),
+ { 0, 6, height }, { 32, 20, 3 }, { 0, 6, height - 6 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 15),
+ { 0, 6, height }, { 32, 20, 3 }, { 0, 6, height - 6 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 17),
+ { 0, 6, height }, { 32, 20, 3 }, { 0, 6, height - 6 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 10),
+ { 0, 6, height }, { 32, 20, 3 }, { 0, 6, height - 6 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 8, height - 6,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_2);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 11),
+ { 6, 0, height }, { 20, 32, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 13),
+ { 6, 0, height }, { 20, 32, 3 });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 14),
+ { 6, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 16),
+ { 6, 0, height }, { 20, 32, 3 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 9),
+ { 6, 0, height }, { 20, 32, 3 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 5, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 2:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 3:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ }
+ }
+
+ static void TrackRightQuarterTurn3Tile25DegDownToRightBank(
+ paint_session& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement)
+ {
+ switch (trackSequence)
+ {
+ case 0:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 8),
+ { 0, 6, height }, { 32, 20, 3 }, { 0, 6, height - 6 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 1),
+ { 0, 6, height }, { 32, 20, 3 }, { 0, 6, height - 6 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 4),
+ { 0, 6, height }, { 32, 20, 3 }, { 0, 6, height - 6 });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 6),
+ { 0, 6, height }, { 32, 20, 3 }, { 0, 6, height - 6 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 8, height - 6,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ if (direction == 0 || direction == 3)
+ {
+ paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_2);
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ case 1:
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 2:
+ paint_util_set_general_support_height(session, height + 48, 0x20);
+ break;
+ case 3:
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 7),
+ { 6, 0, height }, { 20, 32, 3 });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 0),
+ { 6, 0, height }, { 20, 32, 3 });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 2),
+ { 6, 0, height }, { 20, 32, 3 });
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 3),
+ { 6, 0, height }, { 1, 32, 26 }, { 27, 0, height });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction,
+ session.TrackColours[SCHEME_TRACK] | (SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 5),
+ { 6, 0, height }, { 20, 32, 3 });
+ break;
+ }
+ metal_a_supports_paint_setup(
+ session, direction & 1 ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 5, height,
+ session.TrackColours[SCHEME_SUPPORTS]);
+ switch (direction)
+ {
+ case 0:
+ paint_util_push_tunnel_right(session, height, TUNNEL_0);
+ break;
+ case 1:
+ paint_util_push_tunnel_left(session, height, TUNNEL_0);
+ break;
+ }
+ paint_util_set_segment_support_height(
+ session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF,
+ 0);
+ paint_util_set_general_support_height(session, height + 64, 0x20);
+ break;
+ }
+ }
+
+ TRACK_PAINT_FUNCTION GetTrackPaintFunction(int32_t trackType)
+ {
+ switch (trackType)
+ {
+ case TrackElemType::Flat:
+ return TrackFlat;
+ case TrackElemType::EndStation:
+ case TrackElemType::BeginStation:
+ case TrackElemType::MiddleStation:
+ return TrackStation;
+ case TrackElemType::Up25:
+ return Track25DegUp;
+ case TrackElemType::FlatToUp25:
+ return TrackFlatTo25DegUp;
+ case TrackElemType::Up25ToFlat:
+ return Track25DegUpToFlat;
+ case TrackElemType::Down25:
+ return Track25DegDown;
+ case TrackElemType::FlatToDown25:
+ return TrackFlatTo25DegDown;
+ case TrackElemType::Down25ToFlat:
+ return Track25DegDownToFlat;
+ case TrackElemType::LeftQuarterTurn5Tiles:
+ return TrackLeftQuarterTurn5;
+ case TrackElemType::RightQuarterTurn5Tiles:
+ return TrackRightQuarterTurn5;
+ case TrackElemType::FlatToLeftBank:
+ return TrackFlatToLeftBank;
+ case TrackElemType::FlatToRightBank:
+ return TrackFlatToRightBank;
+ case TrackElemType::LeftBankToFlat:
+ return TrackLeftBankToFlat;
+ case TrackElemType::RightBankToFlat:
+ return TrackRightBankToFlat;
+ case TrackElemType::BankedLeftQuarterTurn5Tiles:
+ return TrackBankedLeftQuarterTurn5;
+ case TrackElemType::BankedRightQuarterTurn5Tiles:
+ return TrackBankedRightQuarterTurn5;
+ case TrackElemType::LeftBankToUp25:
+ return TrackLeftBankTo25DegUp;
+ case TrackElemType::RightBankToUp25:
+ return TrackRightBankTo25DegUp;
+ case TrackElemType::Up25ToLeftBank:
+ return Track25DegUpToLeftBank;
+ case TrackElemType::Up25ToRightBank:
+ return Track25DegUpToRightBank;
+ case TrackElemType::LeftBankToDown25:
+ return TrackLeftBankTo25DegDown;
+ case TrackElemType::RightBankToDown25:
+ return TrackRightBankTo25DegDown;
+ case TrackElemType::Down25ToLeftBank:
+ return Track25DegDownToLeftBank;
+ case TrackElemType::Down25ToRightBank:
+ return Track25DegDownToRightBank;
+ case TrackElemType::LeftBank:
+ return TrackLeftBank;
+ case TrackElemType::RightBank:
+ return TrackRightBank;
+ case TrackElemType::LeftQuarterTurn5TilesUp25:
+ return TrackLeftQuarterTurn525DegUp;
+ case TrackElemType::RightQuarterTurn5TilesUp25:
+ return TrackRightQuarterTurn525DegUp;
+ case TrackElemType::LeftQuarterTurn5TilesDown25:
+ return TrackLeftQuarterTurn525DegDown;
+ case TrackElemType::RightQuarterTurn5TilesDown25:
+ return TrackRightQuarterTurn525DegDown;
+ case TrackElemType::SBendLeft:
+ return TrackSBendLeft;
+ case TrackElemType::SBendRight:
+ return TrackSBendRight;
+ case TrackElemType::LeftQuarterTurn3Tiles:
+ return TrackLeftQuarterTurn3;
+ case TrackElemType::RightQuarterTurn3Tiles:
+ return TrackRightQuarterTurn3;
+ case TrackElemType::LeftBankedQuarterTurn3Tiles:
+ return TrackLeftQuarterTurn3Bank;
+ case TrackElemType::RightBankedQuarterTurn3Tiles:
+ return TrackRightQuarterTurn3Bank;
+ case TrackElemType::LeftQuarterTurn3TilesUp25:
+ return TrackLeftQuarterTurn3Tile25DegUp;
+ case TrackElemType::RightQuarterTurn3TilesUp25:
+ return TrackRightQuarterTurn3Tile25DegUp;
+ case TrackElemType::LeftQuarterTurn3TilesDown25:
+ return TrackLeftQuarterTurn3Tile25DegDown;
+ case TrackElemType::RightQuarterTurn3TilesDown25:
+ return TrackRightQuarterTurn3Tile25DegDown;
+ case TrackElemType::LeftHalfBankedHelixUpSmall:
+ return TrackLeftHalfBankedHelixUpSmall;
+ case TrackElemType::RightHalfBankedHelixUpSmall:
+ return TrackRightHalfBankedHelixUpSmall;
+ case TrackElemType::LeftHalfBankedHelixDownSmall:
+ return TrackLeftHalfBankedHelixDownSmall;
+ case TrackElemType::RightHalfBankedHelixDownSmall:
+ return TrackRightHalfBankedHelixDownSmall;
+ case TrackElemType::LeftHalfBankedHelixUpLarge:
+ return TrackLeftHalfBankedHelixUpLarge;
+ case TrackElemType::RightHalfBankedHelixUpLarge:
+ return TrackRightHalfBankedHelixUpLarge;
+ case TrackElemType::LeftHalfBankedHelixDownLarge:
+ return TrackLeftHalfBankedHelixDownLarge;
+ case TrackElemType::RightHalfBankedHelixDownLarge:
+ return TrackRightHalfBankedHelixDownLarge;
+ case TrackElemType::Brakes:
+ return TrackBrakes;
+ case TrackElemType::LeftEighthToDiag:
+ return TrackLeftEighthToDiag;
+ case TrackElemType::RightEighthToDiag:
+ return TrackRightEighthToDiag;
+ case TrackElemType::LeftEighthToOrthogonal:
+ return TrackLeftEighthToOrthogonal;
+ case TrackElemType::RightEighthToOrthogonal:
+ return TrackRightEighthToOrthogonal;
+ case TrackElemType::LeftEighthBankToDiag:
+ return TrackLeftEighthBankToDiag;
+ case TrackElemType::RightEighthBankToDiag:
+ return TrackRightEighthBankToDiag;
+ case TrackElemType::LeftEighthBankToOrthogonal:
+ return TrackLeftEighthBankToOrthogonal;
+ case TrackElemType::RightEighthBankToOrthogonal:
+ return TrackRightEighthBankToOrthogonal;
+ case TrackElemType::DiagFlat:
+ return TrackDiagFlat;
+ case TrackElemType::DiagUp25:
+ return TrackDiag25DegUp;
+ case TrackElemType::DiagFlatToUp25:
+ return TrackDiagFlatTo25DegUp;
+ case TrackElemType::DiagUp25ToFlat:
+ return TrackDiag25DegUpToFlat;
+ case TrackElemType::DiagDown25:
+ return TrackDiag25DegDown;
+ case TrackElemType::DiagFlatToDown25:
+ return TrackDiagFlatTo25DegDown;
+ case TrackElemType::DiagDown25ToFlat:
+ return TrackDiag25DegDownToFlat;
+ case TrackElemType::DiagFlatToLeftBank:
+ return TrackDiagFlatToLeftBank;
+ case TrackElemType::DiagFlatToRightBank:
+ return TrackDiagFlatToRightBank;
+ case TrackElemType::DiagLeftBankToFlat:
+ return TrackDiagLeftBankToFlat;
+ case TrackElemType::DiagRightBankToFlat:
+ return TrackDiagRightBankToFlat;
+ case TrackElemType::DiagLeftBankToUp25:
+ return TrackDiagLeftBankTo25DegUp;
+ case TrackElemType::DiagRightBankToUp25:
+ return TrackDiagRightBankTo25DegUp;
+ case TrackElemType::DiagUp25ToLeftBank:
+ return TrackDiag25DegUpToLeftBank;
+ case TrackElemType::DiagUp25ToRightBank:
+ return TrackDiag25DegUpToRightBank;
+ case TrackElemType::DiagLeftBankToDown25:
+ return TrackDiagLeftBankTo25DegDown;
+ case TrackElemType::DiagRightBankToDown25:
+ return TrackDiagRightBankTo25DegDown;
+ case TrackElemType::DiagDown25ToLeftBank:
+ return TrackDiag25DegDownToLeftBank;
+ case TrackElemType::DiagDown25ToRightBank:
+ return TrackDiag25DegDownToRightBank;
+ case TrackElemType::DiagLeftBank:
+ return TrackDiagLeftBank;
+ case TrackElemType::DiagRightBank:
+ return TrackDiagRightBank;
+ case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25:
+ return TrackLeftBankToLeftQuarterTurn3Tile25DegUp;
+ case TrackElemType::RightBankToRightQuarterTurn3TilesUp25:
+ return TrackRightBankToRightQuarterTurn3Tile25DegUp;
+ case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank:
+ return TrackLeftQuarterTurn3Tile25DegDownToLeftBank;
+ case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank:
+ return TrackRightQuarterTurn3Tile25DegDownToRightBank;
+ }
+ return nullptr;
+ }
+
+} // namespace AlpineRC
diff --git a/src/openrct2/ride/coaster/meta/AlpineCoaster.h b/src/openrct2/ride/coaster/meta/AlpineCoaster.h
new file mode 100644
index 0000000000..b069decc51
--- /dev/null
+++ b/src/openrct2/ride/coaster/meta/AlpineCoaster.h
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * Copyright (c) 2014-2022 OpenRCT2 developers
+ *
+ * For a complete list of all authors, please refer to contributors.md
+ * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
+ *
+ * OpenRCT2 is licensed under the GNU General Public License version 3.
+ *****************************************************************************/
+
+#pragma once
+
+#include "../../RideData.h"
+#include "../../Track.h"
+
+// clang-format off
+constexpr const RideTypeDescriptor AlpineCoasterRTD =
+{
+ SET_FIELD(AlternateType, RIDE_TYPE_NULL),
+ SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER),
+ SET_FIELD(EnabledTrackPieces, { TRACK_FLAT, TRACK_STRAIGHT, TRACK_STATION_END, TRACK_LIFT_HILL, TRACK_FLAT_ROLL_BANKING, TRACK_SLOPE, TRACK_SLOPE_LONG, TRACK_SLOPE_CURVE, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_HELIX_SMALL}),
+ SET_FIELD(ExtraTrackPieces, {}),
+ SET_FIELD(CoveredTrackPieces, {}),
+ SET_FIELD(StartTrackPiece, TrackElemType::EndStation),
+ SET_FIELD(TrackPaintFunction, AlpineRC::GetTrackPaintFunction),
+ SET_FIELD(Flags, RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS |
+ RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_HAS_LARGE_CURVES |
+ RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_ALLOW_MORE_VEHICLES_THAN_STATION_FITS | RIDE_TYPE_FLAG_UP_INCLINE_REQUIRES_LIFT),
+ SET_FIELD(RideModes, EnumsToFlags(RideMode::ContinuousCircuit)),
+ SET_FIELD(DefaultMode, RideMode::ContinuousCircuit),
+ SET_FIELD(OperatingSettings, { 0, 0, 0, 0, 0, 0 }),
+ SET_FIELD(Naming, { STR_RIDE_NAME_ALPINE_COASTER, STR_RIDE_DESCRIPTION_ALPINE_COASTER }),
+ SET_FIELD(NameConvention, { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }),
+ SET_FIELD(EnumName, nameof(RIDE_TYPE_ALPINE_ROLLER_COASTER)),
+ SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
+ SET_FIELD(Heights, {18, 24, 3, 7}),
+ SET_FIELD(MaxMass, 4),
+ SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 4, 5 }),
+ SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_alpine_coaster),
+ SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
+ SET_FIELD(UpkeepCosts, { 35, 20, 80, 8, 3, 10 }),
+ SET_FIELD(BuildCosts, { 22.50_GBP, 2.50_GBP, 50}),
+ SET_FIELD(DefaultPrices, { 20, 20 }),
+ SET_FIELD(DefaultMusic, MUSIC_OBJECT_GENTLE),
+ SET_FIELD(PhotoItem, ShopItem::Photo),
+ SET_FIELD(BonusValue, 65),
+ SET_FIELD(ColourPresets, TRACK_COLOUR_PRESETS(
+ { COLOUR_GREY, COLOUR_GREY, COLOUR_BLACK },
+ )),
+ SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_ALPINE_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_ALPINE_COASTER_SUPPORTS }),
+ SET_FIELD(ColourKey, RideColourKey::Ride),
+};
+// clang-format on
diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h
index 900efba87a..fee025c4e0 100644
--- a/src/openrct2/sprites.h
+++ b/src/openrct2/sprites.h
@@ -1124,7 +1124,34 @@ enum
SPR_G2_SINGLE_RAIL_LIFT_TRACK_SMALL_FLAT_TO_STEEP = SPR_G2_SINGLE_RAIL_LIFT_TRACK_STEEP_DIAGONAL + 12,
SPR_G2_SINGLE_RAIL_END = SPR_G2_SINGLE_RAIL_LIFT_TRACK_SMALL_FLAT_TO_STEEP + 20,
- SPR_G2_END = SPR_G2_SINGLE_RAIL_END,
+ SPR_RIDE_DESIGN_PREVIEW_ALPINE_COASTER_TRACK = SPR_G2_SINGLE_RAIL_END,
+ SPR_RIDE_DESIGN_PREVIEW_ALPINE_COASTER_SUPPORTS = SPR_RIDE_DESIGN_PREVIEW_ALPINE_COASTER_TRACK + 1,
+ SPR_G2_ALPINE_BEGIN = SPR_RIDE_DESIGN_PREVIEW_ALPINE_COASTER_TRACK + 2,
+ SPR_G2_ALPINE_TRACK_FLAT = SPR_G2_ALPINE_BEGIN,
+ SPR_G2_ALPINE_TRACK_GENTLE = SPR_G2_ALPINE_TRACK_FLAT + 2,
+ SPR_G2_ALPINE_TRACK_SMALL_CURVE = SPR_G2_ALPINE_TRACK_GENTLE + 12,
+ SPR_G2_ALPINE_TRACK_MEDIUM_CURVE = SPR_G2_ALPINE_TRACK_SMALL_CURVE + 12,
+ SPR_G2_ALPINE_TRACK_LARGE_CURVE = SPR_G2_ALPINE_TRACK_MEDIUM_CURVE + 20,
+ SPR_G2_ALPINE_TRACK_FLAT_DIAGONAL = SPR_G2_ALPINE_TRACK_LARGE_CURVE + 32,
+ SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL = SPR_G2_ALPINE_TRACK_FLAT_DIAGONAL + 4,
+ SPR_G2_ALPINE_TRACK_BANK_TRANSITION = SPR_G2_ALPINE_TRACK_GENTLE_DIAGONAL + 12,
+ SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL = SPR_G2_ALPINE_TRACK_BANK_TRANSITION + 40,
+ SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED = SPR_G2_ALPINE_TRACK_BANK_TRANSITION_DIAGONAL + 34,
+ SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED = SPR_G2_ALPINE_TRACK_SMALL_CURVE_BANKED + 14,
+ SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED = SPR_G2_ALPINE_TRACK_MEDIUM_CURVE_BANKED + 22,
+ SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE = SPR_G2_ALPINE_TRACK_LARGE_CURVE_BANKED + 32,
+ SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE = SPR_G2_ALPINE_TRACK_GENTLE_SMALL_CURVE + 16,
+ SPR_G2_ALPINE_TRACK_S_BEND = SPR_G2_ALPINE_TRACK_GENTLE_MEDIUM_CURVE + 40,
+ SPR_G2_ALPINE_TRACK_SMALL_HELIX = SPR_G2_ALPINE_TRACK_S_BEND + 16,
+ SPR_G2_ALPINE_TRACK_LARGE_HELIX = SPR_G2_ALPINE_TRACK_SMALL_HELIX + 28,
+ SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION = SPR_G2_ALPINE_TRACK_LARGE_HELIX + 44,
+ SPR_G2_ALPINE_LIFT_BEGIN = SPR_G2_ALPINE_TRACK_TURN_BANK_TRANSITION + 18,
+ SPR_G2_ALPINE_LIFT_TRACK_FLAT = SPR_G2_ALPINE_LIFT_BEGIN,
+ SPR_G2_ALPINE_LIFT_TRACK_GENTLE = SPR_G2_ALPINE_LIFT_TRACK_FLAT + 4,
+ SPR_G2_ALPINE_LIFT_TRACK_FLAT_DIAGONAL = SPR_G2_ALPINE_LIFT_TRACK_GENTLE + 12,
+ SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL = SPR_G2_ALPINE_LIFT_TRACK_FLAT_DIAGONAL + 4,
+ SPR_G2_ALPINE_END = SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 12,
+ SPR_G2_END = SPR_G2_ALPINE_END,
SPR_CSG_BEGIN = SPR_G2_END,
SPR_CSG_END = SPR_CSG_BEGIN + RCT1::Limits::Num_LL_CSG_Entries,