diff --git a/distribution/changelog.txt b/distribution/changelog.txt index be76fc6ce6..8d1d041a3e 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,5 +1,6 @@ 0.4.17 (in development) ------------------------------------------------------------------------ +- Improved: [#23051] Add large sloped turns and new inversions to the Twister, Vertical Drop, Hyper and Flying Roller Coasters. - Improved: [#23123] Improve sorting of roller coasters in build new ride menu. 0.4.16 (2024-11-03) diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index 7105f9b22a..7b2079f8a4 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -6535,6 +6535,2094 @@ "x": -25, "y": -5 }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_1_1.png", + "x": -26, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_1_2.png", + "x": -32, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_1_3.png", + "x": 8, + "y": 8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_1_4.png", + "x": -18, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_2_1.png", + "x": -27, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_2_2.png", + "x": -16, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_2_3.png", + "x": -24, + "y": 12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_2_4.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_3_1.png", + "x": -6, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_3_2.png", + "x": 6, + "y": -5, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_3_3.png", + "x": -32, + "y": -2, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_3_4.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_4_1.png", + "x": -27, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_4_2.png", + "x": -27, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_4_3.png", + "x": 0, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_4_4.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_1_1.png", + "x": -26, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_1_2.png", + "x": -19, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_1_3.png", + "x": -13, + "y": -18, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_1_4.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_2_1.png", + "x": -27, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_2_2.png", + "x": -34, + "y": -5, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_2_3.png", + "x": -2, + "y": -2, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_2_4.png", + "x": -14, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_3_1.png", + "x": -16, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_3_2.png", + "x": -8, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_3_3.png", + "x": 0, + "y": 13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_3_4.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_4_1.png", + "x": -17, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_4_2.png", + "x": -8, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_4_3.png", + "x": -32, + "y": 8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_4_4.png", + "x": -13, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_1_1.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_1_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_1_3.png", + "x": -32, + "y": -18, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_1_4.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_2_1.png", + "x": -12, + "y": 7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_2_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_2_3.png", + "x": -10, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_2_4.png", + "x": -19, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_3_1.png", + "x": -32, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_3_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_3_3.png", + "x": -19, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_3_4.png", + "x": -24, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_4_1.png", + "x": -14, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_4_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_4_3.png", + "x": -25, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_4_4.png", + "x": -24, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_1_1.png", + "x": 0, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_1_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_1_3.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_1_4.png", + "x": -32, + "y": -5, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_2_1.png", + "x": 5, + "y": 7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_2_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_2_3.png", + "x": -16, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_2_4.png", + "x": -24, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_3_1.png", + "x": -32, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_3_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_3_3.png", + "x": -13, + "y": -18, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_3_4.png", + "x": -24, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_4_1.png", + "x": -13, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_4_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_4_3.png", + "x": -11, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_4_4.png", + "x": -28, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_1_1.png", + "x": -32, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_1_2.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_2.png", + "x": -12, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_3.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_4.png", + "x": -13, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_1.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_2.png", + "x": -12, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_3_1.png", + "x": -32, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_3_2.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_4.png", + "x": -13, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_1_1.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_1_2.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_2.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_3.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_4.png", + "x": -13, + "y": -25, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_1.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_2.png", + "x": -12, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_3_1.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_3_2.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_4.png", + "x": -13, + "y": -25, + "palette": "keep" + }, + { + "path": "track/bm/left_bank_to_gentle_up_left_bank_diag_1.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/left_bank_to_gentle_up_left_bank_diag_2.png", + "x": -13, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/left_bank_to_gentle_up_left_bank_diag_3.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/left_bank_to_gentle_up_left_bank_diag_4.png", + "x": -9, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/right_bank_to_gentle_up_right_bank_diag_1.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/right_bank_to_gentle_up_right_bank_diag_2.png", + "x": -9, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/right_bank_to_gentle_up_right_bank_diag_3.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/right_bank_to_gentle_up_right_bank_diag_4.png", + "x": -13, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_left_bank_diag_1.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_left_bank_diag_2.png", + "x": -13, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_left_bank_diag_3.png", + "x": -32, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_left_bank_diag_4.png", + "x": -9, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_right_bank_diag_1.png", + "x": -32, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_right_bank_diag_2.png", + "x": -9, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_right_bank_diag_3.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_right_bank_diag_4.png", + "x": -13, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_diag_1.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_diag_2.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_diag_3.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_diag_4.png", + "x": -9, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_diag_1.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_diag_2.png", + "x": -9, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_diag_3.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_diag_4.png", + "x": -12, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_1_1.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_1_2.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_2.png", + "x": -12, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_3.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_4.png", + "x": -12, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_1.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_2.png", + "x": -12, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_3_1.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_3_2.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_4.png", + "x": -12, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_1_1.png", + "x": -32, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_1_2.png", + "x": -32, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_2.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_3.png", + "x": -32, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_4.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_1.png", + "x": -32, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_2.png", + "x": -12, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_3_1.png", + "x": -31, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_3_2.png", + "x": -32, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_4.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_1_1.png", + "x": -20, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_1_2.png", + "x": -28, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_1_3.png", + "x": 15, + "y": 8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_1_4.png", + "x": -12, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_2_1.png", + "x": -27, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_2_2.png", + "x": -32, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_2_3.png", + "x": -24, + "y": 13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_2_4.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_3_1.png", + "x": -9, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_3_2.png", + "x": 0, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_3_3.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_3_4.png", + "x": -12, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_4_1.png", + "x": -26, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_4_2.png", + "x": -27, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_4_3.png", + "x": 0, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_4_4.png", + "x": 0, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_1_1.png", + "x": -26, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_1_2.png", + "x": -23, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_1_3.png", + "x": -15, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_1_4.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_2_1.png", + "x": -20, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_2_2.png", + "x": -33, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_2_3.png", + "x": 2, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_2_4.png", + "x": -13, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_3_1.png", + "x": -9, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_3_2.png", + "x": -8, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_3_3.png", + "x": 0, + "y": 13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_3_4.png", + "x": 0, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_4_1.png", + "x": -18, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_4_2.png", + "x": -8, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_4_3.png", + "x": -32, + "y": 8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_4_4.png", + "x": -12, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_1.png", + "x": 0, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_3.png", + "x": -32, + "y": -33, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_4.png", + "x": -3, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_1.png", + "x": -12, + "y": -1, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_3.png", + "x": -12, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_4.png", + "x": -19, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_1.png", + "x": -32, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_3.png", + "x": -26, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_4.png", + "x": -28, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_1.png", + "x": -12, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_3.png", + "x": -25, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_4.png", + "x": -26, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_1.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_3.png", + "x": -32, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_4.png", + "x": -20, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_1.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_3.png", + "x": -16, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_4.png", + "x": -26, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_1.png", + "x": -32, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_3.png", + "x": -29, + "y": -32, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_4.png", + "x": -27, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_1.png", + "x": -12, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_3.png", + "x": -10, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_4.png", + "x": -29, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_1.png", + "x": -24, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_2.png", + "x": -24, + "y": -72, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_3.png", + "x": -28, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_4.png", + "x": -24, + "y": -50, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_5.png", + "x": -24, + "y": -37, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_1.png", + "x": -24, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_2.png", + "x": -32, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_3.png", + "x": -25, + "y": -52, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_4.png", + "x": -22, + "y": -58, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_5.png", + "x": -17, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_1.png", + "x": -16, + "y": -5, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_2.png", + "x": -18, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_3.png", + "x": 10, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_4.png", + "x": -8, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_5.png", + "x": -16, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_1.png", + "x": -26, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_2.png", + "x": -26, + "y": -28, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_3.png", + "x": -16, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_4.png", + "x": -45, + "y": -39, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_5.png", + "x": -25, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_1.png", + "x": -24, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_2.png", + "x": -26, + "y": -28, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_3.png", + "x": -23, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_4.png", + "x": -31, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_5.png", + "x": -32, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_1.png", + "x": -24, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_2.png", + "x": -16, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_3.png", + "x": -24, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_4.png", + "x": -16, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_5.png", + "x": -26, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_1.png", + "x": -42, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_2.png", + "x": -16, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_3.png", + "x": -28, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_4.png", + "x": -31, + "y": -57, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_5.png", + "x": -25, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_1.png", + "x": -26, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_2.png", + "x": -11, + "y": -73, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_3.png", + "x": 9, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_4.png", + "x": -18, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_5.png", + "x": -25, + "y": -37, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_1.png", + "x": -26, + "y": -34, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_2.png", + "x": -33, + "y": -55, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_3.png", + "x": -32, + "y": -95, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_4.png", + "x": -44, + "y": -123, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_5.png", + "x": -26, + "y": -35, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_1.png", + "x": -27, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_2.png", + "x": -16, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_3.png", + "x": -16, + "y": -85, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_4.png", + "x": -33, + "y": -148, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_5.png", + "x": -25, + "y": -45, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_1.png", + "x": -29, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_2.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_3.png", + "x": -6, + "y": -69, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_4.png", + "x": -32, + "y": -154, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_5.png", + "x": -19, + "y": -45, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_1.png", + "x": -24, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_2.png", + "x": -26, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_3.png", + "x": -32, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_4.png", + "x": -12, + "y": -126, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_5.png", + "x": -27, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_1.png", + "x": -27, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_2.png", + "x": -22, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_3.png", + "x": -21, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_4.png", + "x": -46, + "y": -125, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_5.png", + "x": -27, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_1.png", + "x": -27, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_2.png", + "x": -32, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_3.png", + "x": -32, + "y": -62, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_4.png", + "x": -27, + "y": -153, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_5.png", + "x": -24, + "y": -45, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_1.png", + "x": -32, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_2.png", + "x": -32, + "y": -35, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_3.png", + "x": -32, + "y": -85, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_4.png", + "x": -13, + "y": -149, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_5.png", + "x": -14, + "y": -45, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_1.png", + "x": -23, + "y": -33, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_2.png", + "x": -17, + "y": -52, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_3.png", + "x": -5, + "y": -102, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_4.png", + "x": -32, + "y": -125, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_5.png", + "x": -32, + "y": -35, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_2_2.png", + "x": -16, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_2_2.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_2_2.png", + "x": -32, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_2_2.png", + "x": -32, + "y": -35, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_1_1.png", + "x": -26, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_1_2.png", + "x": -13, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_1_3.png", + "x": -12, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_1_4.png", + "x": -23, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_2_1.png", + "x": -27, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_2_2.png", + "x": -28, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_2_3.png", + "x": -23, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_2_4.png", + "x": -21, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_3_1.png", + "x": -22, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_3_2.png", + "x": -23, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_3_3.png", + "x": -8, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_3_4.png", + "x": -27, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_4_1.png", + "x": -18, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_4_2.png", + "x": -11, + "y": -42, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_4_3.png", + "x": -22, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_4_4.png", + "x": -23, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_1_1.png", + "x": -26, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_1_2.png", + "x": -30, + "y": -43, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_1_3.png", + "x": -22, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_1_4.png", + "x": -27, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_2_1.png", + "x": -27, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_2_2.png", + "x": -16, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_2_3.png", + "x": -14, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_2_4.png", + "x": -12, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_3_1.png", + "x": -9, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_3_2.png", + "x": -9, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_3_3.png", + "x": -11, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_3_4.png", + "x": -24, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_4_1.png", + "x": -19, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_4_2.png", + "x": -33, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_4_3.png", + "x": -26, + "y": -26, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_4_4.png", + "x": -26, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_1.png", + "x": -25, + "y": -47, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_2.png", + "x": -26, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_3.png", + "x": -17, + "y": -52, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_4.png", + "x": -17, + "y": -42, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_5.png", + "x": -21, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_2_1.png", + "x": -25, + "y": -44, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_2_2.png", + "x": -28, + "y": -34, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_2_3.png", + "x": -32, + "y": -26, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_2_4.png", + "x": -30, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_1.png", + "x": -9, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_2.png", + "x": -17, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_3.png", + "x": -31, + "y": -41, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_4.png", + "x": -24, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_5.png", + "x": -9, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_6.png", + "x": -27, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_1.png", + "x": -18, + "y": -55, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_2.png", + "x": -17, + "y": -48, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_3.png", + "x": -10, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_4.png", + "x": -9, + "y": -39, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_5.png", + "x": -23, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_1.png", + "x": -25, + "y": -57, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_2.png", + "x": -32, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_3.png", + "x": -32, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_4.png", + "x": -32, + "y": -40, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_5.png", + "x": -32, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_1.png", + "x": -24, + "y": -32, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_2.png", + "x": -25, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_3.png", + "x": -24, + "y": -41, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_4.png", + "x": -19, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_5.png", + "x": -8, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_6.png", + "x": -8, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_3_1.png", + "x": -19, + "y": -43, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_3_2.png", + "x": -14, + "y": -33, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_3_3.png", + "x": -5, + "y": -26, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_3_4.png", + "x": -25, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_1.png", + "x": -23, + "y": -46, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_2.png", + "x": -21, + "y": -50, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_3.png", + "x": -32, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_4.png", + "x": -29, + "y": -42, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_5.png", + "x": -25, + "y": -29, + "palette": "keep" + }, { "path": "track/railway/quarter_turn_3_tiles_sw_se_part_3.png", "x": -8, diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_1.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_1.png new file mode 100644 index 0000000000..1330edd67b Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_1.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_2.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_2.png new file mode 100644 index 0000000000..4d9dc99466 Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_2.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_2.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_2.png new file mode 100644 index 0000000000..863557ffca Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_3.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_3.png new file mode 100644 index 0000000000..557291536a Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_4.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_4.png new file mode 100644 index 0000000000..93060086cb Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_1.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_1.png new file mode 100644 index 0000000000..5496857bde Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_2.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_2.png new file mode 100644 index 0000000000..76266459a8 Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_1.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_1.png new file mode 100644 index 0000000000..ac7c02203b Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_1.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_2.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_2.png new file mode 100644 index 0000000000..a567e63bab Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_2.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_4.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_4.png new file mode 100644 index 0000000000..4ce40a5e4c Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_diag_1.png b/resources/g2/track/bm/gentle_up_left_bank_diag_1.png new file mode 100644 index 0000000000..b137a4861e Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_diag_2.png b/resources/g2/track/bm/gentle_up_left_bank_diag_2.png new file mode 100644 index 0000000000..048c1714c8 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_diag_3.png b/resources/g2/track/bm/gentle_up_left_bank_diag_3.png new file mode 100644 index 0000000000..0fbc3a7937 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_diag_4.png b/resources/g2/track/bm/gentle_up_left_bank_diag_4.png new file mode 100644 index 0000000000..8eee915fd0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_1.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_1.png new file mode 100644 index 0000000000..f82bf610b4 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_1.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_2.png new file mode 100644 index 0000000000..2bcb61bb49 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_2.png new file mode 100644 index 0000000000..c4d8a863b6 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_3.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_3.png new file mode 100644 index 0000000000..53ca24b47d Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_4.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_4.png new file mode 100644 index 0000000000..05ec980b34 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_1.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_1.png new file mode 100644 index 0000000000..71790c7670 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_1.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_2.png new file mode 100644 index 0000000000..04845ac2ee Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_2.png new file mode 100644 index 0000000000..50094f0393 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_3.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_3.png new file mode 100644 index 0000000000..a239572df7 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_4.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_4.png new file mode 100644 index 0000000000..bd1c876578 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_1.png b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_1.png new file mode 100644 index 0000000000..abf22cb7ae Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_2.png new file mode 100644 index 0000000000..564af32b3c Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_3.png b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_3.png new file mode 100644 index 0000000000..90a07d96c0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_4.png b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_4.png new file mode 100644 index 0000000000..288fccc0f0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_diag_1.png b/resources/g2/track/bm/gentle_up_right_bank_diag_1.png new file mode 100644 index 0000000000..93f6647223 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_diag_2.png b/resources/g2/track/bm/gentle_up_right_bank_diag_2.png new file mode 100644 index 0000000000..2e48e0bcf0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_diag_3.png b/resources/g2/track/bm/gentle_up_right_bank_diag_3.png new file mode 100644 index 0000000000..154857b6f2 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_diag_4.png b/resources/g2/track/bm/gentle_up_right_bank_diag_4.png new file mode 100644 index 0000000000..39bedc50ae Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_1.png new file mode 100644 index 0000000000..1889ac2359 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_2.png new file mode 100644 index 0000000000..2b7bfa5a94 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_1.png new file mode 100644 index 0000000000..324fa0ab7b Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_2.png new file mode 100644 index 0000000000..5dae45dc2b Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_4.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_4.png new file mode 100644 index 0000000000..56c8b77bb2 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_1.png new file mode 100644 index 0000000000..6e2e36d4d1 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_2.png new file mode 100644 index 0000000000..689c8cdadb Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_1.png new file mode 100644 index 0000000000..9820ffd2f0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_2.png new file mode 100644 index 0000000000..53defdfd1a Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_4.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_4.png new file mode 100644 index 0000000000..c26972b6d3 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_1.png new file mode 100644 index 0000000000..3d11c088dd Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_2.png new file mode 100644 index 0000000000..b44dc387c4 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_3.png b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_3.png new file mode 100644 index 0000000000..b1d1841783 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_4.png b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_4.png new file mode 100644 index 0000000000..1842de3fca Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_1.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_1.png new file mode 100644 index 0000000000..053bff4c7f Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_1.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_2.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_2.png new file mode 100644 index 0000000000..bd5033ed63 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_2.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_2.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_2.png new file mode 100644 index 0000000000..f5d3d219d9 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_3.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_3.png new file mode 100644 index 0000000000..bf75e23b57 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_4.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_4.png new file mode 100644 index 0000000000..a97983c19e Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_1.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_1.png new file mode 100644 index 0000000000..26368ac582 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_2.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_2.png new file mode 100644 index 0000000000..c93071b433 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_1.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_1.png new file mode 100644 index 0000000000..701953fe99 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_1.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_2.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_2.png new file mode 100644 index 0000000000..0996c34dd5 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_2.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_4.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_4.png new file mode 100644 index 0000000000..125c48f498 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_1.png b/resources/g2/track/bm/large_corkscrew_left_1_1.png new file mode 100644 index 0000000000..b937ad056d Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_2.png b/resources/g2/track/bm/large_corkscrew_left_1_2.png new file mode 100644 index 0000000000..d6e0841d5a Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_3.png b/resources/g2/track/bm/large_corkscrew_left_1_3.png new file mode 100644 index 0000000000..e47904d100 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_4.png b/resources/g2/track/bm/large_corkscrew_left_1_4.png new file mode 100644 index 0000000000..f4dfc39086 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_5.png b/resources/g2/track/bm/large_corkscrew_left_1_5.png new file mode 100644 index 0000000000..4014f0976e Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_1.png b/resources/g2/track/bm/large_corkscrew_left_2_1.png new file mode 100644 index 0000000000..46c8168400 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_2.png b/resources/g2/track/bm/large_corkscrew_left_2_2.png new file mode 100644 index 0000000000..267bd68fb9 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_3.png b/resources/g2/track/bm/large_corkscrew_left_2_3.png new file mode 100644 index 0000000000..62b43ff094 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_4.png b/resources/g2/track/bm/large_corkscrew_left_2_4.png new file mode 100644 index 0000000000..462697c346 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_5.png b/resources/g2/track/bm/large_corkscrew_left_2_5.png new file mode 100644 index 0000000000..8722af6b72 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_1.png b/resources/g2/track/bm/large_corkscrew_left_3_1.png new file mode 100644 index 0000000000..ebcc865602 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_2.png b/resources/g2/track/bm/large_corkscrew_left_3_2.png new file mode 100644 index 0000000000..fd757e21f4 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_3.png b/resources/g2/track/bm/large_corkscrew_left_3_3.png new file mode 100644 index 0000000000..b04b68d9d0 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_4.png b/resources/g2/track/bm/large_corkscrew_left_3_4.png new file mode 100644 index 0000000000..96e2458635 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_5.png b/resources/g2/track/bm/large_corkscrew_left_3_5.png new file mode 100644 index 0000000000..1a81938aa2 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_1.png b/resources/g2/track/bm/large_corkscrew_left_4_1.png new file mode 100644 index 0000000000..f041c29e87 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_2.png b/resources/g2/track/bm/large_corkscrew_left_4_2.png new file mode 100644 index 0000000000..bd44b2b32f Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_3.png b/resources/g2/track/bm/large_corkscrew_left_4_3.png new file mode 100644 index 0000000000..6dbd298591 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_4.png b/resources/g2/track/bm/large_corkscrew_left_4_4.png new file mode 100644 index 0000000000..9500e7fa17 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_5.png b/resources/g2/track/bm/large_corkscrew_left_4_5.png new file mode 100644 index 0000000000..b53d083246 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_1.png b/resources/g2/track/bm/large_corkscrew_right_1_1.png new file mode 100644 index 0000000000..30971a185b Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_2.png b/resources/g2/track/bm/large_corkscrew_right_1_2.png new file mode 100644 index 0000000000..040838d28f Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_3.png b/resources/g2/track/bm/large_corkscrew_right_1_3.png new file mode 100644 index 0000000000..d3e9b08ec7 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_4.png b/resources/g2/track/bm/large_corkscrew_right_1_4.png new file mode 100644 index 0000000000..1c1589c5b8 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_5.png b/resources/g2/track/bm/large_corkscrew_right_1_5.png new file mode 100644 index 0000000000..b3041ef5d7 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_1.png b/resources/g2/track/bm/large_corkscrew_right_2_1.png new file mode 100644 index 0000000000..4f30664251 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_2.png b/resources/g2/track/bm/large_corkscrew_right_2_2.png new file mode 100644 index 0000000000..1dab5438ec Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_3.png b/resources/g2/track/bm/large_corkscrew_right_2_3.png new file mode 100644 index 0000000000..5f95313384 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_4.png b/resources/g2/track/bm/large_corkscrew_right_2_4.png new file mode 100644 index 0000000000..6a12983643 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_5.png b/resources/g2/track/bm/large_corkscrew_right_2_5.png new file mode 100644 index 0000000000..0f5ae1de43 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_1.png b/resources/g2/track/bm/large_corkscrew_right_3_1.png new file mode 100644 index 0000000000..c1b7b42f8b Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_2.png b/resources/g2/track/bm/large_corkscrew_right_3_2.png new file mode 100644 index 0000000000..9c70daf17d Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_3.png b/resources/g2/track/bm/large_corkscrew_right_3_3.png new file mode 100644 index 0000000000..31440f8c96 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_4.png b/resources/g2/track/bm/large_corkscrew_right_3_4.png new file mode 100644 index 0000000000..7ca6485de3 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_5.png b/resources/g2/track/bm/large_corkscrew_right_3_5.png new file mode 100644 index 0000000000..2e3b6f7ad3 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_1.png b/resources/g2/track/bm/large_corkscrew_right_4_1.png new file mode 100644 index 0000000000..23cbf7e7c2 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_2.png b/resources/g2/track/bm/large_corkscrew_right_4_2.png new file mode 100644 index 0000000000..571036237a Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_3.png b/resources/g2/track/bm/large_corkscrew_right_4_3.png new file mode 100644 index 0000000000..6e283d5260 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_4.png b/resources/g2/track/bm/large_corkscrew_right_4_4.png new file mode 100644 index 0000000000..a75a2ecb91 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_5.png b/resources/g2/track/bm/large_corkscrew_right_4_5.png new file mode 100644 index 0000000000..886e59b616 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_5.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_1.png new file mode 100644 index 0000000000..07a3333c49 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_2.png new file mode 100644 index 0000000000..934de1995a Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_3.png new file mode 100644 index 0000000000..f5eb0565c8 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_4.png new file mode 100644 index 0000000000..b82e906182 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_1.png new file mode 100644 index 0000000000..0841c3ae95 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_2.png new file mode 100644 index 0000000000..a9a6769e6b Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_3.png new file mode 100644 index 0000000000..60ca129964 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_4.png new file mode 100644 index 0000000000..52a22fa1d2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_1.png new file mode 100644 index 0000000000..8f80fe318f Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_2.png new file mode 100644 index 0000000000..f34090bee1 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_3.png new file mode 100644 index 0000000000..b3af42abfa Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_4.png new file mode 100644 index 0000000000..9e6d96a487 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_1.png new file mode 100644 index 0000000000..93e19d50b7 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_2.png new file mode 100644 index 0000000000..ba0ad07323 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_3.png new file mode 100644 index 0000000000..b4c207b685 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_4.png new file mode 100644 index 0000000000..f19688d365 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_1.png new file mode 100644 index 0000000000..e22b52928e Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_3.png new file mode 100644 index 0000000000..fb125a9a0e Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_4.png new file mode 100644 index 0000000000..dcd90c0eae Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_1.png new file mode 100644 index 0000000000..980df5151d Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_3.png new file mode 100644 index 0000000000..242cb02b90 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_4.png new file mode 100644 index 0000000000..c77fc1f26a Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_1.png new file mode 100644 index 0000000000..4e83215176 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_3.png new file mode 100644 index 0000000000..a68968b1cf Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_4.png new file mode 100644 index 0000000000..076632dbf4 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_1.png new file mode 100644 index 0000000000..ba49b9186e Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_3.png new file mode 100644 index 0000000000..bc0b19abc8 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_4.png new file mode 100644 index 0000000000..b21d1e65b1 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_1.png new file mode 100644 index 0000000000..bea103aeee Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_2.png new file mode 100644 index 0000000000..bc65d9bd7b Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_3.png new file mode 100644 index 0000000000..9e33894d4d Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_4.png new file mode 100644 index 0000000000..a77bddedef Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_1.png new file mode 100644 index 0000000000..68f84e8787 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_2.png new file mode 100644 index 0000000000..ea21ab3fc4 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_3.png new file mode 100644 index 0000000000..37c576dcbc Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_4.png new file mode 100644 index 0000000000..6131a2b982 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_1.png new file mode 100644 index 0000000000..b46205e74e Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_2.png new file mode 100644 index 0000000000..015b44d34a Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_3.png new file mode 100644 index 0000000000..4b85d438ae Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_4.png new file mode 100644 index 0000000000..1ef94b9451 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_1.png new file mode 100644 index 0000000000..db2826b4d9 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_2.png new file mode 100644 index 0000000000..9d1de1a741 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_3.png new file mode 100644 index 0000000000..6f4b37482b Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_4.png new file mode 100644 index 0000000000..e305c400f2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_1.png new file mode 100644 index 0000000000..9b89751709 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_3.png new file mode 100644 index 0000000000..c97b87dc12 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_4.png new file mode 100644 index 0000000000..c841413958 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_1.png new file mode 100644 index 0000000000..8847bad5eb Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_3.png new file mode 100644 index 0000000000..631774c76f Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_4.png new file mode 100644 index 0000000000..21f43870f3 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_1.png new file mode 100644 index 0000000000..9a27787066 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_3.png new file mode 100644 index 0000000000..df532007af Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_4.png new file mode 100644 index 0000000000..605a875b31 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_1.png new file mode 100644 index 0000000000..28e1ccce5d Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_3.png new file mode 100644 index 0000000000..7f38c16dd9 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_4.png new file mode 100644 index 0000000000..bc1351b168 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_1.png new file mode 100644 index 0000000000..94a66b81b2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_2.png new file mode 100644 index 0000000000..b017f22fc6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_3.png new file mode 100644 index 0000000000..04ed948b27 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_4.png new file mode 100644 index 0000000000..ecd6d8fdfa Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_1.png new file mode 100644 index 0000000000..28559cd57e Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_2.png new file mode 100644 index 0000000000..5314e915ab Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_3.png new file mode 100644 index 0000000000..7f3a1bb0c9 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_4.png new file mode 100644 index 0000000000..c6935a54b7 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_1.png new file mode 100644 index 0000000000..15795d8cb5 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_2.png new file mode 100644 index 0000000000..0a186983f2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_3.png new file mode 100644 index 0000000000..f7b56c53e6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_4.png new file mode 100644 index 0000000000..32a9f723e9 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_1.png new file mode 100644 index 0000000000..33f550dbe7 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_2.png new file mode 100644 index 0000000000..a24e35b77d Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_3.png new file mode 100644 index 0000000000..9fdcdb46e5 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_4.png new file mode 100644 index 0000000000..bffa7da90d Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_1.png new file mode 100644 index 0000000000..79e57ce8c6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_3.png new file mode 100644 index 0000000000..ef2827cc51 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_4.png new file mode 100644 index 0000000000..9b066b073e Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_1.png new file mode 100644 index 0000000000..b85a39fcad Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_3.png new file mode 100644 index 0000000000..24509ea9c8 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_4.png new file mode 100644 index 0000000000..0f6643533b Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_1.png new file mode 100644 index 0000000000..7f2837d7c8 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_3.png new file mode 100644 index 0000000000..29cd1e87e3 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_4.png new file mode 100644 index 0000000000..ada0ff145f Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_1.png new file mode 100644 index 0000000000..985eb27d20 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_3.png new file mode 100644 index 0000000000..9076f6af53 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_4.png new file mode 100644 index 0000000000..40e7321686 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_1.png new file mode 100644 index 0000000000..88a64053fe Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_2.png new file mode 100644 index 0000000000..39fe5903a6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_3.png new file mode 100644 index 0000000000..f63dda7ac4 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_4.png new file mode 100644 index 0000000000..c098ff2d68 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_1.png new file mode 100644 index 0000000000..f02de850ae Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_2.png new file mode 100644 index 0000000000..7f22eda49c Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_3.png new file mode 100644 index 0000000000..1342d5a469 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_4.png new file mode 100644 index 0000000000..acf9d6bafe Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_1.png new file mode 100644 index 0000000000..2b4d62009c Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_2.png new file mode 100644 index 0000000000..dff7f5ef7c Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_3.png new file mode 100644 index 0000000000..cecbf735dd Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_4.png new file mode 100644 index 0000000000..7b5392091a Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_1.png new file mode 100644 index 0000000000..d87c823475 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_2.png new file mode 100644 index 0000000000..2d45a130fd Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_3.png new file mode 100644 index 0000000000..b93d191292 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_4.png new file mode 100644 index 0000000000..f10f781762 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_1.png new file mode 100644 index 0000000000..ec3c4c09d4 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_3.png new file mode 100644 index 0000000000..10f53e8bca Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_4.png new file mode 100644 index 0000000000..714e1c7cf6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_1.png new file mode 100644 index 0000000000..7ef7c850d2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_3.png new file mode 100644 index 0000000000..07cffe6c16 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_4.png new file mode 100644 index 0000000000..af22fab390 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_1.png new file mode 100644 index 0000000000..1bc591d792 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_3.png new file mode 100644 index 0000000000..26a4d0ee42 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_4.png new file mode 100644 index 0000000000..0f83e8e619 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_1.png new file mode 100644 index 0000000000..6d3511c987 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_3.png new file mode 100644 index 0000000000..901c87e437 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_4.png new file mode 100644 index 0000000000..5301553d21 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_1.png b/resources/g2/track/bm/large_zero_g_roll_left_1_1.png new file mode 100644 index 0000000000..583894dde0 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_2.png b/resources/g2/track/bm/large_zero_g_roll_left_1_2.png new file mode 100644 index 0000000000..39e123df82 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_3.png b/resources/g2/track/bm/large_zero_g_roll_left_1_3.png new file mode 100644 index 0000000000..f793ae76b5 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_4.png b/resources/g2/track/bm/large_zero_g_roll_left_1_4.png new file mode 100644 index 0000000000..150aec64a2 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_5.png b/resources/g2/track/bm/large_zero_g_roll_left_1_5.png new file mode 100644 index 0000000000..c07aa7f432 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_2_1.png b/resources/g2/track/bm/large_zero_g_roll_left_2_1.png new file mode 100644 index 0000000000..3fcfec8f4d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_2_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_2_2.png b/resources/g2/track/bm/large_zero_g_roll_left_2_2.png new file mode 100644 index 0000000000..2e6d0dd1d3 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_2_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_2_3.png b/resources/g2/track/bm/large_zero_g_roll_left_2_3.png new file mode 100644 index 0000000000..d959c97cc6 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_2_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_2_4.png b/resources/g2/track/bm/large_zero_g_roll_left_2_4.png new file mode 100644 index 0000000000..604d2f4143 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_2_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_1.png b/resources/g2/track/bm/large_zero_g_roll_left_3_1.png new file mode 100644 index 0000000000..808a681081 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_2.png b/resources/g2/track/bm/large_zero_g_roll_left_3_2.png new file mode 100644 index 0000000000..e6a2ccf09f Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_3.png b/resources/g2/track/bm/large_zero_g_roll_left_3_3.png new file mode 100644 index 0000000000..d5203f8216 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_4.png b/resources/g2/track/bm/large_zero_g_roll_left_3_4.png new file mode 100644 index 0000000000..32e54b4a21 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_5.png b/resources/g2/track/bm/large_zero_g_roll_left_3_5.png new file mode 100644 index 0000000000..f62f82740d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_6.png b/resources/g2/track/bm/large_zero_g_roll_left_3_6.png new file mode 100644 index 0000000000..cb1caa331d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_6.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_1.png b/resources/g2/track/bm/large_zero_g_roll_left_4_1.png new file mode 100644 index 0000000000..222bc08d99 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_2.png b/resources/g2/track/bm/large_zero_g_roll_left_4_2.png new file mode 100644 index 0000000000..b76cb1e205 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_3.png b/resources/g2/track/bm/large_zero_g_roll_left_4_3.png new file mode 100644 index 0000000000..e73b45b87c Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_4.png b/resources/g2/track/bm/large_zero_g_roll_left_4_4.png new file mode 100644 index 0000000000..e8dbb2f18a Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_5.png b/resources/g2/track/bm/large_zero_g_roll_left_4_5.png new file mode 100644 index 0000000000..1f4fd496bc Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_1.png b/resources/g2/track/bm/large_zero_g_roll_right_1_1.png new file mode 100644 index 0000000000..77bfa85594 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_2.png b/resources/g2/track/bm/large_zero_g_roll_right_1_2.png new file mode 100644 index 0000000000..f635df1b5c Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_3.png b/resources/g2/track/bm/large_zero_g_roll_right_1_3.png new file mode 100644 index 0000000000..6a60203ec2 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_4.png b/resources/g2/track/bm/large_zero_g_roll_right_1_4.png new file mode 100644 index 0000000000..ca3715a209 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_5.png b/resources/g2/track/bm/large_zero_g_roll_right_1_5.png new file mode 100644 index 0000000000..2900f8586f Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_1.png b/resources/g2/track/bm/large_zero_g_roll_right_2_1.png new file mode 100644 index 0000000000..2ab00a9f28 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_2.png b/resources/g2/track/bm/large_zero_g_roll_right_2_2.png new file mode 100644 index 0000000000..7bee0039e6 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_3.png b/resources/g2/track/bm/large_zero_g_roll_right_2_3.png new file mode 100644 index 0000000000..9ae6c454fa Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_4.png b/resources/g2/track/bm/large_zero_g_roll_right_2_4.png new file mode 100644 index 0000000000..5f264c23e6 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_5.png b/resources/g2/track/bm/large_zero_g_roll_right_2_5.png new file mode 100644 index 0000000000..9ee4ba0c92 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_6.png b/resources/g2/track/bm/large_zero_g_roll_right_2_6.png new file mode 100644 index 0000000000..908cad8ed5 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_6.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_3_1.png b/resources/g2/track/bm/large_zero_g_roll_right_3_1.png new file mode 100644 index 0000000000..6e25339f5d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_3_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_3_2.png b/resources/g2/track/bm/large_zero_g_roll_right_3_2.png new file mode 100644 index 0000000000..1e5038341a Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_3_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_3_3.png b/resources/g2/track/bm/large_zero_g_roll_right_3_3.png new file mode 100644 index 0000000000..475427a44d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_3_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_3_4.png b/resources/g2/track/bm/large_zero_g_roll_right_3_4.png new file mode 100644 index 0000000000..cb4089fca5 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_3_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_1.png b/resources/g2/track/bm/large_zero_g_roll_right_4_1.png new file mode 100644 index 0000000000..211edd895c Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_2.png b/resources/g2/track/bm/large_zero_g_roll_right_4_2.png new file mode 100644 index 0000000000..83e7d366db Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_3.png b/resources/g2/track/bm/large_zero_g_roll_right_4_3.png new file mode 100644 index 0000000000..399bf4f5e6 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_4.png b/resources/g2/track/bm/large_zero_g_roll_right_4_4.png new file mode 100644 index 0000000000..a80a818ce7 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_5.png b/resources/g2/track/bm/large_zero_g_roll_right_4_5.png new file mode 100644 index 0000000000..79546f9954 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_5.png differ diff --git a/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_1.png b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_1.png new file mode 100644 index 0000000000..fe1bd7aef5 Binary files /dev/null and b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_1.png differ diff --git a/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_2.png b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_2.png new file mode 100644 index 0000000000..b508c1c835 Binary files /dev/null and b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_3.png b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_3.png new file mode 100644 index 0000000000..eb0476708a Binary files /dev/null and b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_4.png b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_4.png new file mode 100644 index 0000000000..c3621238f8 Binary files /dev/null and b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_1.png b/resources/g2/track/bm/medium_half_loop_left_1_1.png new file mode 100644 index 0000000000..2f3759ab87 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_2.png b/resources/g2/track/bm/medium_half_loop_left_1_2.png new file mode 100644 index 0000000000..b230401b3e Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_3.png b/resources/g2/track/bm/medium_half_loop_left_1_3.png new file mode 100644 index 0000000000..9065c70cb8 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_4.png b/resources/g2/track/bm/medium_half_loop_left_1_4.png new file mode 100644 index 0000000000..f502821ecf Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_5.png b/resources/g2/track/bm/medium_half_loop_left_1_5.png new file mode 100644 index 0000000000..f242002ca6 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_1.png b/resources/g2/track/bm/medium_half_loop_left_2_1.png new file mode 100644 index 0000000000..5597987545 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_2.png b/resources/g2/track/bm/medium_half_loop_left_2_2.png new file mode 100644 index 0000000000..bcd075348c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_2_2.png b/resources/g2/track/bm/medium_half_loop_left_2_2_2.png new file mode 100644 index 0000000000..d2f4d5e75c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_3.png b/resources/g2/track/bm/medium_half_loop_left_2_3.png new file mode 100644 index 0000000000..ac74431884 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_4.png b/resources/g2/track/bm/medium_half_loop_left_2_4.png new file mode 100644 index 0000000000..e32da6135f Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_5.png b/resources/g2/track/bm/medium_half_loop_left_2_5.png new file mode 100644 index 0000000000..9856862ded Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_1.png b/resources/g2/track/bm/medium_half_loop_left_3_1.png new file mode 100644 index 0000000000..e6d8c1bf07 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_2.png b/resources/g2/track/bm/medium_half_loop_left_3_2.png new file mode 100644 index 0000000000..e0e7dc4cbd Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_2_2.png b/resources/g2/track/bm/medium_half_loop_left_3_2_2.png new file mode 100644 index 0000000000..1a8bbf2a65 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_3.png b/resources/g2/track/bm/medium_half_loop_left_3_3.png new file mode 100644 index 0000000000..60d4b5bcd1 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_4.png b/resources/g2/track/bm/medium_half_loop_left_3_4.png new file mode 100644 index 0000000000..2180a7dd8c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_5.png b/resources/g2/track/bm/medium_half_loop_left_3_5.png new file mode 100644 index 0000000000..f540fb0134 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_1.png b/resources/g2/track/bm/medium_half_loop_left_4_1.png new file mode 100644 index 0000000000..c160e3ebf3 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_2.png b/resources/g2/track/bm/medium_half_loop_left_4_2.png new file mode 100644 index 0000000000..4eb61a6f77 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_3.png b/resources/g2/track/bm/medium_half_loop_left_4_3.png new file mode 100644 index 0000000000..d06c373561 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_4.png b/resources/g2/track/bm/medium_half_loop_left_4_4.png new file mode 100644 index 0000000000..9b564d5391 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_5.png b/resources/g2/track/bm/medium_half_loop_left_4_5.png new file mode 100644 index 0000000000..405b9c4293 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_1.png b/resources/g2/track/bm/medium_half_loop_right_1_1.png new file mode 100644 index 0000000000..f1c382ddcf Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_2.png b/resources/g2/track/bm/medium_half_loop_right_1_2.png new file mode 100644 index 0000000000..47039a93ca Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_3.png b/resources/g2/track/bm/medium_half_loop_right_1_3.png new file mode 100644 index 0000000000..266a859da7 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_4.png b/resources/g2/track/bm/medium_half_loop_right_1_4.png new file mode 100644 index 0000000000..933d722bd1 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_5.png b/resources/g2/track/bm/medium_half_loop_right_1_5.png new file mode 100644 index 0000000000..55c4e2e21d Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_1.png b/resources/g2/track/bm/medium_half_loop_right_2_1.png new file mode 100644 index 0000000000..870a429c48 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_2.png b/resources/g2/track/bm/medium_half_loop_right_2_2.png new file mode 100644 index 0000000000..a56320146e Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_2_2.png b/resources/g2/track/bm/medium_half_loop_right_2_2_2.png new file mode 100644 index 0000000000..203167b45b Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_3.png b/resources/g2/track/bm/medium_half_loop_right_2_3.png new file mode 100644 index 0000000000..41f2df9e3c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_4.png b/resources/g2/track/bm/medium_half_loop_right_2_4.png new file mode 100644 index 0000000000..e8fc033ef4 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_5.png b/resources/g2/track/bm/medium_half_loop_right_2_5.png new file mode 100644 index 0000000000..9be584ff56 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_1.png b/resources/g2/track/bm/medium_half_loop_right_3_1.png new file mode 100644 index 0000000000..49c7fc9b07 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_2.png b/resources/g2/track/bm/medium_half_loop_right_3_2.png new file mode 100644 index 0000000000..5eda37d62f Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_2_2.png b/resources/g2/track/bm/medium_half_loop_right_3_2_2.png new file mode 100644 index 0000000000..565747b91b Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_3.png b/resources/g2/track/bm/medium_half_loop_right_3_3.png new file mode 100644 index 0000000000..3c6b2a778c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_4.png b/resources/g2/track/bm/medium_half_loop_right_3_4.png new file mode 100644 index 0000000000..71dd87e1ed Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_5.png b/resources/g2/track/bm/medium_half_loop_right_3_5.png new file mode 100644 index 0000000000..f130b6a5bb Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_1.png b/resources/g2/track/bm/medium_half_loop_right_4_1.png new file mode 100644 index 0000000000..a2b8d5e299 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_2.png b/resources/g2/track/bm/medium_half_loop_right_4_2.png new file mode 100644 index 0000000000..7e824fab68 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_3.png b/resources/g2/track/bm/medium_half_loop_right_4_3.png new file mode 100644 index 0000000000..feea7cff21 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_4.png b/resources/g2/track/bm/medium_half_loop_right_4_4.png new file mode 100644 index 0000000000..d865fa3ab7 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_5.png b/resources/g2/track/bm/medium_half_loop_right_4_5.png new file mode 100644 index 0000000000..012cfc0e84 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_5.png differ diff --git a/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_1.png b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_1.png new file mode 100644 index 0000000000..cbadc20f5a Binary files /dev/null and b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_2.png b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_2.png new file mode 100644 index 0000000000..38ed74398b Binary files /dev/null and b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_3.png b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_3.png new file mode 100644 index 0000000000..cfea637c67 Binary files /dev/null and b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_3.png differ diff --git a/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_4.png b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_4.png new file mode 100644 index 0000000000..6c8fc34152 Binary files /dev/null and b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_1_1.png b/resources/g2/track/bm/zero_g_roll_left_1_1.png new file mode 100644 index 0000000000..c01f156f08 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_1_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_1_2.png b/resources/g2/track/bm/zero_g_roll_left_1_2.png new file mode 100644 index 0000000000..20258378f0 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_1_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_1_3.png b/resources/g2/track/bm/zero_g_roll_left_1_3.png new file mode 100644 index 0000000000..c6eecb30c4 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_1_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_1_4.png b/resources/g2/track/bm/zero_g_roll_left_1_4.png new file mode 100644 index 0000000000..791a4d0589 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_1_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_2_1.png b/resources/g2/track/bm/zero_g_roll_left_2_1.png new file mode 100644 index 0000000000..94d1e3695c Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_2_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_2_2.png b/resources/g2/track/bm/zero_g_roll_left_2_2.png new file mode 100644 index 0000000000..4313b70eda Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_2_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_2_3.png b/resources/g2/track/bm/zero_g_roll_left_2_3.png new file mode 100644 index 0000000000..0642f846ab Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_2_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_2_4.png b/resources/g2/track/bm/zero_g_roll_left_2_4.png new file mode 100644 index 0000000000..a104413974 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_2_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_3_1.png b/resources/g2/track/bm/zero_g_roll_left_3_1.png new file mode 100644 index 0000000000..2ab8fb172f Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_3_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_3_2.png b/resources/g2/track/bm/zero_g_roll_left_3_2.png new file mode 100644 index 0000000000..1bcce0d160 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_3_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_3_3.png b/resources/g2/track/bm/zero_g_roll_left_3_3.png new file mode 100644 index 0000000000..656fa26668 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_3_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_3_4.png b/resources/g2/track/bm/zero_g_roll_left_3_4.png new file mode 100644 index 0000000000..ab30c1352e Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_3_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_4_1.png b/resources/g2/track/bm/zero_g_roll_left_4_1.png new file mode 100644 index 0000000000..47d93ab45e Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_4_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_4_2.png b/resources/g2/track/bm/zero_g_roll_left_4_2.png new file mode 100644 index 0000000000..a55877d811 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_4_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_4_3.png b/resources/g2/track/bm/zero_g_roll_left_4_3.png new file mode 100644 index 0000000000..9d4b6ccdf8 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_4_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_4_4.png b/resources/g2/track/bm/zero_g_roll_left_4_4.png new file mode 100644 index 0000000000..4f65dc867b Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_4_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_1_1.png b/resources/g2/track/bm/zero_g_roll_right_1_1.png new file mode 100644 index 0000000000..172e6e9ae0 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_1_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_1_2.png b/resources/g2/track/bm/zero_g_roll_right_1_2.png new file mode 100644 index 0000000000..0c361f4699 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_1_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_1_3.png b/resources/g2/track/bm/zero_g_roll_right_1_3.png new file mode 100644 index 0000000000..e25ea83f1a Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_1_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_1_4.png b/resources/g2/track/bm/zero_g_roll_right_1_4.png new file mode 100644 index 0000000000..df21e5782b Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_1_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_2_1.png b/resources/g2/track/bm/zero_g_roll_right_2_1.png new file mode 100644 index 0000000000..a24bd77c98 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_2_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_2_2.png b/resources/g2/track/bm/zero_g_roll_right_2_2.png new file mode 100644 index 0000000000..dc56c5b854 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_2_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_2_3.png b/resources/g2/track/bm/zero_g_roll_right_2_3.png new file mode 100644 index 0000000000..5060ed25a9 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_2_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_2_4.png b/resources/g2/track/bm/zero_g_roll_right_2_4.png new file mode 100644 index 0000000000..80c2bae88b Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_2_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_3_1.png b/resources/g2/track/bm/zero_g_roll_right_3_1.png new file mode 100644 index 0000000000..895a1e3388 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_3_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_3_2.png b/resources/g2/track/bm/zero_g_roll_right_3_2.png new file mode 100644 index 0000000000..79683a3990 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_3_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_3_3.png b/resources/g2/track/bm/zero_g_roll_right_3_3.png new file mode 100644 index 0000000000..0d523fc053 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_3_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_3_4.png b/resources/g2/track/bm/zero_g_roll_right_3_4.png new file mode 100644 index 0000000000..ec3f45229e Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_3_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_4_1.png b/resources/g2/track/bm/zero_g_roll_right_4_1.png new file mode 100644 index 0000000000..5ee95e4206 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_4_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_4_2.png b/resources/g2/track/bm/zero_g_roll_right_4_2.png new file mode 100644 index 0000000000..d78be9e9c7 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_4_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_4_3.png b/resources/g2/track/bm/zero_g_roll_right_4_3.png new file mode 100644 index 0000000000..831d109e06 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_4_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_4_4.png b/resources/g2/track/bm/zero_g_roll_right_4_4.png new file mode 100644 index 0000000000..7dc9a5450e Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_4_4.png differ diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 0c9016e54a..d8095e0b6e 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -49,7 +49,7 @@ using namespace OpenRCT2; // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -constexpr uint8_t kNetworkStreamVersion = 0; +constexpr uint8_t kNetworkStreamVersion = 1; const std::string kNetworkStreamID = std::string(OPENRCT2_VERSION) + "-" + std::to_string(kNetworkStreamVersion); diff --git a/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp b/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp index de70dc8eab..3bab58bd50 100644 --- a/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp @@ -14582,6 +14582,4433 @@ static void TwisterRCTrackFlyerHalfLoopUp( } } +static void TwisterRCTrackLeftEighthToDiagUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 4)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 8)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 12)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 1)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 5)), + { 0, 0, height }, { { 0, 0, height }, { 34, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 9)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 13)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 2)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 6)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 10)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 14)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 3)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 2, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 7)), + { 0, 0, height }, { { 0, 16, height }, { 16, 18, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 3, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 11)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 2, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 15)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 1, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackRightEighthToDiagUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 20)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 24)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 28)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 17)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 21)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 25)), + { 0, 0, height }, { { 0, 0, height }, { 34, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 29)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 18)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 22)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 26)), + { 0, 0, height }, { { 4, 4, height }, { 28, 28, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 30)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 19)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 1, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 23)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 2, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 27)), + { 0, 0, height }, { { 0, 16, height }, { 16, 18, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 3, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 31)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 2, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackLeftEighthToOrthogonalUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 32)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 5, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 36)), + { 0, 0, height }, { { 16, 16, height }, { 16, 18, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 5, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 40)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 3, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 44)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 33)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 37)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 41)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 45)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 34)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 38)), + { 0, 0, height }, { { 0, 0, height }, { 34, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 42)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 46)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 35)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 39)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 43)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 10 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 47)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); + + if (direction == 1 || direction == 2) + { + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::SlopeEnd); + } + + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackRightEighthToOrthogonalUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 48)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 3, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 52)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 5, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 56)), + { 0, 0, height }, { { 16, 0, height }, { 16, 18, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 5, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 60)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 49)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 53)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 57)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 61)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 50)), + { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 54)), + { 0, 0, height }, { { 0, 0, height }, { 16, 32, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 58)), + { 0, 0, height }, { { 0, 0, height }, { 16, 32, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 62)), + { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 51)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 10 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 55)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 59)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 63)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); + if (direction == 0 || direction == 1) + { + PaintUtilPushTunnelRotated(session, direction + 1, height + 8, kTunnelGroup, TunnelSubType::SlopeEnd); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide), direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackLeftEighthToDiagDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + uint8_t map[5] = { 4, 3, 1, 2, 0 }; + trackSequence = map[trackSequence]; + TwisterRCTrackRightEighthToOrthogonalUp25( + session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightEighthToDiagDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + uint8_t map[5] = { 4, 3, 1, 2, 0 }; + trackSequence = map[trackSequence]; + TwisterRCTrackLeftEighthToOrthogonalUp25( + session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftEighthToOrthogonalDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + TwisterRCTrackRightEighthToDiagUp25(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightEighthToOrthogonalDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + TwisterRCTrackLeftEighthToDiagUp25(session, ride, trackSequence, (direction + 3) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagUp25ToLeftBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 4)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 0)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 1)), + { -16, -16, height }, { { -16, -16, height + 48 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 3)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 5, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 2)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 10, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 10, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 10, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackDiagUp25ToRightBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 9)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 5)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 7)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 8)), + { -16, -16, height }, { { -16, -16, height + 48 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 10, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 6)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 10, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 5, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 10, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackDiagLeftBankedUp25ToUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 14)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 10)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 11)), + { -16, -16, height }, { { -16, -16, height + 48 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 13)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 5, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 12)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 9, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 9, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 9, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagRightBankedUp25ToUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 19)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 15)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 17)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 18)), + { -16, -16, height }, { { -16, -16, height + 48 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 9, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 16)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 9, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 5, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 9, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagDown25ToLeftBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagRightBankedUp25ToUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagDown25ToRightBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagLeftBankedUp25ToUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagLeftBankedDown25ToDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagUp25ToRightBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagRightBankedDown25ToDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagUp25ToLeftBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagLeftBankedFlatToLeftBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 23)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 20)), + { -16, -16, height }, { { -16, -16, height + 34 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 22)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 21)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackDiagRightBankedFlatToRightBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 27)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 24)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 26)), + { -16, -16, height }, { { -16, -16, height + 34 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 25)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackDiagLeftBankedUp25ToLeftBankedFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 31)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 28)), + { -16, -16, height }, { { -16, -16, height + 32 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 30)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 29)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 8, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 8, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagRightBankedUp25ToRightBankedFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 35)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 32)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 34)), + { -16, -16, height }, { { -16, -16, height + 32 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 8, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 33)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 8, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagLeftBankedFlatToLeftBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagRightBankedUp25ToRightBankedFlat( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagRightBankedFlatToRightBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagLeftBankedUp25ToLeftBankedFlat( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagLeftBankedDown25ToLeftBankedFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagRightBankedFlatToRightBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagRightBankedDown25ToRightBankedFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagLeftBankedFlatToLeftBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagUp25LeftBanked( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 39)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 36)), + { -16, -16, height }, { { -16, -16, height + 42 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 38)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 6, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 37)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 11, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 11, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 11, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagUp25RightBanked( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 43)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 40)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 42)), + { -16, -16, height }, { { -16, -16, height + 42 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 11, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 41)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 11, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 6, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 11, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagDown25LeftBanked( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagUp25RightBanked(session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagDown25RightBanked( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagUp25LeftBanked(session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagFlatToLeftBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 48)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 44)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 45)), + { -16, -16, height }, { { -16, -16, height + 34 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 47)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 46)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackDiagFlatToRightBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 53)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 49)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 51)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 52)), + { -16, -16, height }, { { -16, -16, height + 34 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 50)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackDiagLeftBankedUp25ToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 58)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 54)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 55)), + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 57)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 56)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 6, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 6, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 6, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagRightBankedUp25ToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 63)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 59)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 61)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 62)), + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 6, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 60)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 6, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 6, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagFlatToLeftBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagRightBankedUp25ToFlat( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagFlatToRightBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagLeftBankedUp25ToFlat( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagLeftBankedDown25ToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagFlatToRightBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagRightBankedDown25ToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagFlatToLeftBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftEighthBankToDiagUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 64)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height - 4, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 68)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 72)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 76)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 12, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 65)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 69)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 73)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 77)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 66)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 70)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 40, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 74)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 78)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 67)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 1, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 71)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 75)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 7, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 79)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 7, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackRightEighthBankToDiagUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 80)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 12, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 84)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 88)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 92)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height - 4, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 81)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 85)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 89)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 93)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 82)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 86)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 90)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 40, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 94)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 83)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 7, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 87)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 7, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 91)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 95)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 1, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackLeftEighthBankToOrthogonalUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 96)), + { 0, 0, height }, { { 0, 0, height + 40 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 5, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 100)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 7, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 104)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 9, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 108)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 97)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 101)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 105)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 109)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 98)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 102)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 106)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 110)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 99)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 103)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 107)), + { 0, 0, height }, { { 0, 0, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 111)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + break; + } + if (direction == 1 || direction == 2) + { + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::SlopeEnd); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackRightEighthBankToOrthogonalUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 112)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 9, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 116)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 7, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 120)), + { 0, 0, height }, { { 0, 0, height + 40 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 5, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 124)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 113)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 117)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 121)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 125)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 114)), + { 0, 0, height }, { { 0, 0, height }, { 16, 32, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 118)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 32 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 122)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 32 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 126)), + { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 115)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 119)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 123)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 127)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 1) + { + PaintUtilPushTunnelRotated(session, direction + 1, height + 8, kTunnelGroup, TunnelSubType::SlopeEnd); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide), direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackLeftEighthBankToDiagDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + uint8_t map[5] = { 4, 3, 1, 2, 0 }; + trackSequence = map[trackSequence]; + TwisterRCTrackRightEighthBankToOrthogonalUp25( + session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightEighthBankToDiagDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + uint8_t map[5] = { 4, 3, 1, 2, 0 }; + trackSequence = map[trackSequence]; + TwisterRCTrackLeftEighthBankToOrthogonalUp25( + session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftEighthBankToOrthogonalDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + TwisterRCTrackRightEighthBankToDiagUp25( + session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightEighthBankToOrthogonalDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + TwisterRCTrackLeftEighthBankToDiagUp25( + session, ride, trackSequence, (direction + 3) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftLargeCorkscrewUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 0)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 5)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 10)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 15)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + } + + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 1)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 21, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 6)), + { 0, 0, height }, { { 0, 6, height + 48 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 19, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 11)), + { 0, 0, height }, { { 0, 6, height }, { 30, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 20, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 16, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 2)), + { 0, 0, height }, { { 0, 31, height }, { 48, 1, 64 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 7)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 12)), + { 0, 0, height }, { { 2, 2, height + 48 }, { 28, 28, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 17)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 4: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomLeftSide, PaintSegment::bottomCorner, + PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 3)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 28, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 0, height + 63, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 8)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 28, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 0, height + 63, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 13)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 24, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 0, height + 63, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 18)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 0, height + 63, session.SupportColours); + break; + } + + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 5: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 4)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 9)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 14)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 26, 28, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 19)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 26, 28, 1 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomLeftSide, PaintSegment::bottomCorner, + PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 2: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 3: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackRightLargeCorkscrewUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 20)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 25)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 30)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 35)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + } + + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomRightSide, PaintSegment::centre, PaintSegment::rightCorner, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 21)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 16, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 26)), + { 0, 0, height }, { { 0, 6, height }, { 30, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 20, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 31)), + { 0, 0, height }, { { 0, 6, height + 48 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 19, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 36)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 21, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, + PaintSegment::bottomRightSide, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 22)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 27)), + { 0, 0, height }, { { 2, 2, height + 48 }, { 28, 28, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 32)), + { 0, 0, height }, { { 2, 2, height + 48 }, { 28, 28, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 37)), + { 0, 0, height }, { { 0, 31, height }, { 48, 1, 64 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomRightSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 4: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomLeftSide, PaintSegment::bottomCorner, + PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 23)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 0, height + 63, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 28)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 24, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 0, height + 63, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 33)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 28, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 0, height + 63, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 38)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 28, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 0, height + 63, session.SupportColours); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 5: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 24)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 26, 28, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 29)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 26, 28, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 34)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 39)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomLeftSide, PaintSegment::bottomCorner, + PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 1: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackLeftLargeCorkscrewDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackRightLargeCorkscrewUp( + session, ride, 5 - trackSequence, (direction + 1) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightLargeCorkscrewDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackLeftLargeCorkscrewUp( + session, ride, 5 - trackSequence, (direction - 1) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftMediumHalfLoopUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 5)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 10)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 15)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 1)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 6)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 0 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 40)), + { 0, 0, height }, { { 0, 31, height }, { 0, 32, 64 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 11)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 41)), + { 0, 0, height }, { { 0, 32, height }, { 32, 0, 64 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::topCorner), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 2)), + { 0, 0, height }, { { 0, 0, height + 2 }, { 32, 32, 0 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 14, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 7)), + { 0, 0, height }, { { 29, 0, height }, { 1, 32, 96 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 16, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 12)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 96 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 18, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 17)), + { 0, 0, height }, { { 0, 0, height }, { 32, 32, 0 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 14, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::centre, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 144); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 3), + { 0, 0, height }, { { 2, 0, height }, { 1, 32, 160 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 8), + { 0, 0, height }, { { 0, 0, height + 140 }, { 32, 32, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 13), + { 0, 0, height }, { { 29, 0, height }, { 1, 32, 160 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 18), + { 0, 0, height }, { { 0, 0, height }, { 1, 32, 160 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::centre, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 144); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 4)), + { 0, 0, height }, { { 0, 2, height + 48 }, { 32, 32, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 9)), + { 0, 0, height }, { { 0, 2, height + 48 }, { 32, 32, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 14)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 19)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topRightSide, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::rightCorner), + direction), + 0xFFFF, 0); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height + 16, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackRightMediumHalfLoopUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 20)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 25)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 30)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 35)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 21)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 26)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 42)), + { 0, 0, height }, { { 0, 32, height }, { 32, 0, 64 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 31)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 43)), + { 0, 0, height }, { { 0, 31, height }, { 0, 32, 64 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 36)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topRightSide, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::rightCorner), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 22)), + { 0, 0, height }, { { 0, 0, height }, { 32, 32, 0 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 14, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 27)), + { 0, 0, height }, { { 30, 16, height }, { 0, 32, 96 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 18, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 32)), + { 0, 0, height }, { { 29, 0, height }, { 0, 32, 96 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 16, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 37)), + { 0, 0, height }, { { 0, 0, height + 2 }, { 32, 32, 0 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 14, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::centre, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 144); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 23), + { 0, 0, height }, { { 0, 0, height }, { 1, 32, 160 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 28), + { 0, 0, height }, { { 29, 16, height }, { 0, 16, 160 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 33), + { 0, 0, height }, { { 0, 0, height + 140 }, { 32, 32, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 38), + { 0, 0, height }, { { 2, 0, height }, { 1, 32, 160 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 144); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 24)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 29)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 34)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 39)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::topCorner), + direction), + 0xFFFF, 0); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height + 16, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackLeftMediumHalfLoopDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackRightMediumHalfLoopUp(session, ride, 4 - trackSequence, direction, height, trackElement, supportType); +} + +static void TwisterRCTrackRightMediumHalfLoopDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackLeftMediumHalfLoopUp(session, ride, 4 - trackSequence, direction, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftZeroGRollUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 0)), { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 1)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 32, 20, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 4)), { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 5)), { 0, 0, height }, + { { 0, 31, height }, { 40, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 8)), { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 12)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 14, height, session.SupportColours); + break; + } + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 2)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 32, 20, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 6)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 40, 20, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 9)), { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 13)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::topCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 3)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 40, 20, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 7)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 32, 20, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 10)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 11)), + { 0, 0, height }, { { 0, 6, height + 36 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 14)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 15)), + { 0, 0, height }, { { 0, 6, height + 36 }, { 32, 20, 0 } }); + break; + } + switch (direction) + { + case 1: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 2: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::topCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height + 42, session.SupportColours); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + } +} + +static void TwisterRCTrackRightZeroGRollUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 14, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 20)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 24)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 25)), + { 0, 0, height }, { { 0, 31, height }, { 40, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 28)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 29)), + { 0, 0, height }, { { 0, 6, height + 32 }, { 32, 20, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 17)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 21)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 26)), + { 0, 0, height }, { { 0, 31, height }, { 44, 1, 32 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 30)), + { 0, 0, height }, { { 0, 6, height + 32 }, { 32, 20, 1 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::rightCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 18)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 19)), + { 0, 0, height }, { { 0, 6, height + 36 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 22)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 23)), + { 0, 0, height }, { { 0, 6, height + 36 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 27)), + { 0, 0, height }, { { 0, 6, height + 32 }, { 32, 20, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 31)), + { 0, 0, height }, { { 0, 6, height + 32 }, { 40, 20, 1 } }); + break; + } + switch (direction) + { + case 1: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 2: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::rightCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height + 42, session.SupportColours); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + } +} + +static void TwisterRCTrackLeftZeroGRollDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackLeftZeroGRollUp(session, ride, 2 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightZeroGRollDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackRightZeroGRollUp(session, ride, 2 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftLargeZeroGRollUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 5)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 9)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 10)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 15)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 21, height, session.SupportColours); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 88); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 1)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 2)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 6)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 64 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 11)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 64 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 3)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 64 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 7)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 48 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 12)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 48 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 17)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 32 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 18)), + { 0, 0, height }, { { 0, 6, height + 40 }, { 32, 20, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::topCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::topCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 4)), + { 0, 0, height }, { { 0, 26, height }, { 32, 0, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 0, height + 25, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 8)), + { 0, 0, height }, { { 0, 26, height }, { 32, 0, 20 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 0, height + 32, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 13)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 32 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 14)), + { 0, 0, height }, { { 0, 6, height + 40 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 0, height + 36, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 19)), + { 0, 0, height }, { { 0, 18, height }, { 32, 1, 30 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 0, height + 37, session.SupportColours); + break; + } + switch (direction) + { + case 1: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 2: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + } +} + +static void TwisterRCTrackRightLargeZeroGRollUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 20)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 25)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 26)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 31)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 35)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 21, height, session.SupportColours); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 88); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 21)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 27)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 64 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 32)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 64 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 36)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 37)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 22)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 32 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 23)), + { 0, 0, height }, { { 0, 6, height + 40 }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 28)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 48 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 33)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 48 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 38)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 64 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 24)), + { 0, 0, height }, { { 0, 18, height }, { 32, 1, 30 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 0, height + 37, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 29)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 32 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 30)), + { 0, 0, height }, { { 0, 6, height + 40 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 0, height + 36, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 34)), + { 0, 0, height }, { { 0, 26, height }, { 32, 0, 20 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 0, height + 32, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 39)), + { 0, 0, height }, { { 0, 26, height }, { 40, 0, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 0, height + 25, session.SupportColours); + break; + } + switch (direction) + { + case 1: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 2: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + } +} + +static void TwisterRCTrackLeftLargeZeroGRollDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackLeftLargeZeroGRollUp( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightLargeZeroGRollDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackRightLargeZeroGRollUp( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + TRACK_PAINT_FUNCTION GetTrackPaintFunctionTwisterRC(OpenRCT2::TrackElemType trackType) { switch (trackType) @@ -14968,6 +19395,141 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionTwisterRC(OpenRCT2::TrackElemType trac return TwisterRCTrackRightFlyerTwistUp; case TrackElemType::FlyerHalfLoopUninvertedUp: return TwisterRCTrackFlyerHalfLoopUp; + + // Large curved slopes + case TrackElemType::LeftEighthToDiagUp25: + return TwisterRCTrackLeftEighthToDiagUp25; + case TrackElemType::RightEighthToDiagUp25: + return TwisterRCTrackRightEighthToDiagUp25; + case TrackElemType::LeftEighthToDiagDown25: + return TwisterRCTrackLeftEighthToDiagDown25; + case TrackElemType::RightEighthToDiagDown25: + return TwisterRCTrackRightEighthToDiagDown25; + case TrackElemType::LeftEighthToOrthogonalUp25: + return TwisterRCTrackLeftEighthToOrthogonalUp25; + case TrackElemType::RightEighthToOrthogonalUp25: + return TwisterRCTrackRightEighthToOrthogonalUp25; + case TrackElemType::LeftEighthToOrthogonalDown25: + return TwisterRCTrackLeftEighthToOrthogonalDown25; + case TrackElemType::RightEighthToOrthogonalDown25: + return TwisterRCTrackRightEighthToOrthogonalDown25; + + // Diagonal unbanked to banked + case TrackElemType::DiagUp25ToLeftBankedUp25: + return TwisterRCTrackDiagUp25ToLeftBankedUp25; + case TrackElemType::DiagUp25ToRightBankedUp25: + return TwisterRCTrackDiagUp25ToRightBankedUp25; + case TrackElemType::DiagLeftBankedUp25ToUp25: + return TwisterRCTrackDiagLeftBankedUp25ToUp25; + case TrackElemType::DiagRightBankedUp25ToUp25: + return TwisterRCTrackDiagRightBankedUp25ToUp25; + case TrackElemType::DiagDown25ToLeftBankedDown25: + return TwisterRCTrackDiagDown25ToLeftBankedDown25; + case TrackElemType::DiagDown25ToRightBankedDown25: + return TwisterRCTrackDiagDown25ToRightBankedDown25; + case TrackElemType::DiagLeftBankedDown25ToDown25: + return TwisterRCTrackDiagLeftBankedDown25ToDown25; + case TrackElemType::DiagRightBankedDown25ToDown25: + return TwisterRCTrackDiagRightBankedDown25ToDown25; + case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + return TwisterRCTrackDiagLeftBankedFlatToLeftBankedUp25; + case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + return TwisterRCTrackDiagRightBankedFlatToRightBankedUp25; + case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + return TwisterRCTrackDiagLeftBankedUp25ToLeftBankedFlat; + case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + return TwisterRCTrackDiagRightBankedUp25ToRightBankedFlat; + case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + return TwisterRCTrackDiagLeftBankedFlatToLeftBankedDown25; + case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + return TwisterRCTrackDiagRightBankedFlatToRightBankedDown25; + case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + return TwisterRCTrackDiagLeftBankedDown25ToLeftBankedFlat; + case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + return TwisterRCTrackDiagRightBankedDown25ToRightBankedFlat; + case TrackElemType::DiagUp25LeftBanked: + return TwisterRCTrackDiagUp25LeftBanked; + case TrackElemType::DiagUp25RightBanked: + return TwisterRCTrackDiagUp25RightBanked; + case TrackElemType::DiagDown25LeftBanked: + return TwisterRCTrackDiagDown25LeftBanked; + case TrackElemType::DiagDown25RightBanked: + return TwisterRCTrackDiagDown25RightBanked; + case TrackElemType::DiagFlatToLeftBankedUp25: + return TwisterRCTrackDiagFlatToLeftBankedUp25; + case TrackElemType::DiagFlatToRightBankedUp25: + return TwisterRCTrackDiagFlatToRightBankedUp25; + case TrackElemType::DiagLeftBankedUp25ToFlat: + return TwisterRCTrackDiagLeftBankedUp25ToFlat; + case TrackElemType::DiagRightBankedUp25ToFlat: + return TwisterRCTrackDiagRightBankedUp25ToFlat; + case TrackElemType::DiagFlatToLeftBankedDown25: + return TwisterRCTrackDiagFlatToLeftBankedDown25; + case TrackElemType::DiagFlatToRightBankedDown25: + return TwisterRCTrackDiagFlatToRightBankedDown25; + case TrackElemType::DiagLeftBankedDown25ToFlat: + return TwisterRCTrackDiagLeftBankedDown25ToFlat; + case TrackElemType::DiagRightBankedDown25ToFlat: + return TwisterRCTrackDiagRightBankedDown25ToFlat; + + // Large banked curved slopes + case TrackElemType::LeftEighthBankToDiagUp25: + return TwisterRCTrackLeftEighthBankToDiagUp25; + case TrackElemType::RightEighthBankToDiagUp25: + return TwisterRCTrackRightEighthBankToDiagUp25; + case TrackElemType::LeftEighthBankToDiagDown25: + return TwisterRCTrackLeftEighthBankToDiagDown25; + case TrackElemType::RightEighthBankToDiagDown25: + return TwisterRCTrackRightEighthBankToDiagDown25; + case TrackElemType::LeftEighthBankToOrthogonalUp25: + return TwisterRCTrackLeftEighthBankToOrthogonalUp25; + case TrackElemType::RightEighthBankToOrthogonalUp25: + return TwisterRCTrackRightEighthBankToOrthogonalUp25; + case TrackElemType::LeftEighthBankToOrthogonalDown25: + return TwisterRCTrackLeftEighthBankToOrthogonalDown25; + case TrackElemType::RightEighthBankToOrthogonalDown25: + return TwisterRCTrackRightEighthBankToOrthogonalDown25; + + // Large corkscrews + case TrackElemType::LeftLargeCorkscrewUp: + return TwisterRCTrackLeftLargeCorkscrewUp; + case TrackElemType::RightLargeCorkscrewUp: + return TwisterRCTrackRightLargeCorkscrewUp; + case TrackElemType::LeftLargeCorkscrewDown: + return TwisterRCTrackLeftLargeCorkscrewDown; + case TrackElemType::RightLargeCorkscrewDown: + return TwisterRCTrackRightLargeCorkscrewDown; + + // Medium half loops + case TrackElemType::LeftMediumHalfLoopUp: + return TwisterRCTrackLeftMediumHalfLoopUp; + case TrackElemType::RightMediumHalfLoopUp: + return TwisterRCTrackRightMediumHalfLoopUp; + case TrackElemType::LeftMediumHalfLoopDown: + return TwisterRCTrackLeftMediumHalfLoopDown; + case TrackElemType::RightMediumHalfLoopDown: + return TwisterRCTrackRightMediumHalfLoopDown; + + // Zero g rolls + case TrackElemType::LeftZeroGRollUp: + return TwisterRCTrackLeftZeroGRollUp; + case TrackElemType::RightZeroGRollUp: + return TwisterRCTrackRightZeroGRollUp; + case TrackElemType::LeftZeroGRollDown: + return TwisterRCTrackLeftZeroGRollDown; + case TrackElemType::RightZeroGRollDown: + return TwisterRCTrackRightZeroGRollDown; + + // Large zero g rolls + case TrackElemType::LeftLargeZeroGRollUp: + return TwisterRCTrackLeftLargeZeroGRollUp; + case TrackElemType::RightLargeZeroGRollUp: + return TwisterRCTrackRightLargeZeroGRollUp; + case TrackElemType::LeftLargeZeroGRollDown: + return TwisterRCTrackLeftLargeZeroGRollDown; + case TrackElemType::RightLargeZeroGRollDown: + return TwisterRCTrackRightLargeZeroGRollDown; + default: return nullptr; } diff --git a/src/openrct2/park/Legacy.cpp b/src/openrct2/park/Legacy.cpp index fa05855f0f..7bd6716041 100644 --- a/src/openrct2/park/Legacy.cpp +++ b/src/openrct2/park/Legacy.cpp @@ -2563,6 +2563,82 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType break; } } + else if ( + (rideType == RIDE_TYPE_TWISTER_ROLLER_COASTER || rideType == RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER + || rideType == RIDE_TYPE_HYPER_TWISTER || rideType == RIDE_TYPE_FLYING_ROLLER_COASTER) + && parkFileVersion < kExtendedTwisterCoasterVersion) + { + switch (trackType) + { + case TrackElemType::LeftEighthToDiagUp25: + case TrackElemType::RightEighthToDiagUp25: + case TrackElemType::LeftEighthToDiagDown25: + case TrackElemType::RightEighthToDiagDown25: + case TrackElemType::LeftEighthToOrthogonalUp25: + case TrackElemType::RightEighthToOrthogonalUp25: + case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::DiagUp25ToLeftBankedUp25: + case TrackElemType::DiagUp25ToRightBankedUp25: + case TrackElemType::DiagLeftBankedUp25ToUp25: + case TrackElemType::DiagRightBankedUp25ToUp25: + case TrackElemType::DiagDown25ToLeftBankedDown25: + case TrackElemType::DiagDown25ToRightBankedDown25: + case TrackElemType::DiagLeftBankedDown25ToDown25: + case TrackElemType::DiagRightBankedDown25ToDown25: + case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + case TrackElemType::DiagUp25LeftBanked: + case TrackElemType::DiagUp25RightBanked: + case TrackElemType::DiagDown25LeftBanked: + case TrackElemType::DiagDown25RightBanked: + case TrackElemType::DiagFlatToLeftBankedUp25: + case TrackElemType::DiagFlatToRightBankedUp25: + case TrackElemType::DiagLeftBankedUp25ToFlat: + case TrackElemType::DiagRightBankedUp25ToFlat: + case TrackElemType::DiagFlatToLeftBankedDown25: + case TrackElemType::DiagFlatToRightBankedDown25: + case TrackElemType::DiagLeftBankedDown25ToFlat: + case TrackElemType::DiagRightBankedDown25ToFlat: + case TrackElemType::LeftEighthBankToDiagUp25: + case TrackElemType::RightEighthBankToDiagUp25: + case TrackElemType::LeftEighthBankToDiagDown25: + case TrackElemType::RightEighthBankToDiagDown25: + case TrackElemType::LeftEighthBankToOrthogonalUp25: + case TrackElemType::RightEighthBankToOrthogonalUp25: + case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::LeftLargeCorkscrewUp: + case TrackElemType::RightLargeCorkscrewUp: + case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::LeftMediumHalfLoopUp: + case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::RightMediumHalfLoopDown: + case TrackElemType::LeftLargeHalfLoopUp: + case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::LeftLargeHalfLoopDown: + case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::LeftZeroGRollUp: + case TrackElemType::RightZeroGRollUp: + case TrackElemType::LeftZeroGRollDown: + case TrackElemType::RightZeroGRollDown: + case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::RightLargeZeroGRollDown: + return true; + default: + break; + } + } return false; } diff --git a/src/openrct2/park/ParkFile.h b/src/openrct2/park/ParkFile.h index 61c19360ed..69cb1289a6 100644 --- a/src/openrct2/park/ParkFile.h +++ b/src/openrct2/park/ParkFile.h @@ -11,7 +11,7 @@ namespace OpenRCT2 struct GameState_t; // Current version that is saved. - constexpr uint32_t PARK_FILE_CURRENT_VERSION = 42; + constexpr uint32_t PARK_FILE_CURRENT_VERSION = 43; // The minimum version that is forwards compatible with the current version. constexpr uint32_t PARK_FILE_MIN_VERSION = 42; @@ -33,6 +33,7 @@ namespace OpenRCT2 constexpr uint16_t kPeepNamesObjectsVersion = 39; constexpr uint16_t kWoodenRollerCoasterMediumLargeHalfLoopsVersion = 41; constexpr uint16_t kExtendedCorkscrewCoasterVersion = 42; + constexpr uint16_t kExtendedTwisterCoasterVersion = 43; } // namespace OpenRCT2 class ParkFileExporter diff --git a/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h b/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h index 3a8ef02700..e1b61c3e99 100644 --- a/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h @@ -23,7 +23,7 @@ constexpr RideTypeDescriptor FlyingRollerCoasterRTD = .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionFlyingRC, .supportType = MetalSupportType::TubesInverted, - .enabledTrackGroups = {TrackGroup::straight, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::inlineTwistUninverted, TrackGroup::flyingHalfLoopUninvertedUp, TrackGroup::quarterLoopUninvertedUp, TrackGroup::flyingLargeHalfLoopUninvertedUp, TrackGroup::slopeVertical, TrackGroup::slopeCurveBanked, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes}, + .enabledTrackGroups = {TrackGroup::straight, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::inlineTwistUninverted, TrackGroup::flyingHalfLoopUninvertedUp, TrackGroup::quarterLoopUninvertedUp, TrackGroup::flyingLargeHalfLoopUninvertedUp, TrackGroup::slopeVertical, TrackGroup::slopeCurveBanked, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeCurveLarge}, .extraTrackGroups = {TrackGroup::booster, TrackGroup::slopeSteepLong, TrackGroup::flyingLargeHalfLoopUninvertedDown, TrackGroup::flyingHalfLoopUninvertedDown, TrackGroup::stationEnd, TrackGroup::verticalLoop, TrackGroup::poweredLift}, }), .InvertedTrackPaintFunctions = TrackDrawerDescriptor({ diff --git a/src/openrct2/ride/rtd/coaster/HyperTwister.h b/src/openrct2/ride/rtd/coaster/HyperTwister.h index f1d950cdfc..7a34b8c36b 100644 --- a/src/openrct2/ride/rtd/coaster/HyperTwister.h +++ b/src/openrct2/ride/rtd/coaster/HyperTwister.h @@ -23,7 +23,7 @@ constexpr RideTypeDescriptor HyperTwisterRTD = .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionTwisterRC, .supportType = MetalSupportType::Tubes, - .enabledTrackGroups = { TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::slopeVertical, TrackGroup::curveVertical, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes}, + .enabledTrackGroups = { TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::slopeVertical, TrackGroup::curveVertical, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeCurveLarge}, .extraTrackGroups = { TrackGroup::liftHillSteep, TrackGroup::brakeForDrop, TrackGroup::booster, TrackGroup::poweredLift }, }), .InvertedTrackPaintFunctions = {}, diff --git a/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h b/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h index 31ecb9ca85..e69594d296 100644 --- a/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h @@ -23,7 +23,7 @@ constexpr RideTypeDescriptor TwisterRollerCoasterRTD = .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionTwisterRC, .supportType = MetalSupportType::Tubes, - .enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::halfLoop, TrackGroup::corkscrew, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeVertical, TrackGroup::barrelRoll, TrackGroup::poweredLift, TrackGroup::halfLoopLarge, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::curveVertical, TrackGroup::quarterLoop, TrackGroup::booster, TrackGroup::twist, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes}, + .enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::halfLoop, TrackGroup::corkscrew, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeVertical, TrackGroup::barrelRoll, TrackGroup::poweredLift, TrackGroup::halfLoopLarge, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::curveVertical, TrackGroup::quarterLoop, TrackGroup::booster, TrackGroup::twist, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeCurveLarge, TrackGroup::corkscrewLarge, TrackGroup::halfLoopMedium, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge}, .extraTrackGroups = {TrackGroup::liftHillSteep, TrackGroup::brakeForDrop}, }), .InvertedTrackPaintFunctions = {}, diff --git a/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h b/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h index 1ece6430ff..a24af87074 100644 --- a/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h +++ b/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h @@ -23,8 +23,8 @@ constexpr RideTypeDescriptor VerticalDropCoasterRTD = .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionTwisterRC, .supportType = MetalSupportType::Boxed, - .enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::liftHillSteep, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::flatToSteepSlope, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeVertical, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::curveVertical, TrackGroup::halfLoopLarge, TrackGroup::brakeForDrop, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes}, - .extraTrackGroups = {TrackGroup::halfLoop, TrackGroup::corkscrew, TrackGroup::barrelRoll, TrackGroup::poweredLift, TrackGroup::halfLoopLarge, TrackGroup::quarterLoop, TrackGroup::booster, TrackGroup::twist}, + .enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::liftHillSteep, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::flatToSteepSlope, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeVertical, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::curveVertical, TrackGroup::halfLoopLarge, TrackGroup::brakeForDrop, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeCurveLarge, TrackGroup::halfLoopMedium, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge, TrackGroup::corkscrew, TrackGroup::corkscrewLarge}, + .extraTrackGroups = {TrackGroup::halfLoop, TrackGroup::barrelRoll, TrackGroup::poweredLift, TrackGroup::halfLoopLarge, TrackGroup::quarterLoop, TrackGroup::booster, TrackGroup::twist}, }), .InvertedTrackPaintFunctions = {}, .Flags = kRtdFlagsHasThreeColours | kRtdFlagsCommonCoaster | kRtdFlagsCommonCoasterNonAlt | diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h index a51ea9ca72..f1c63a15dc 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -1286,7 +1286,13 @@ enum : ImageIndex SPR_G2_BM_DIAG_BRAKES = SPR_G2_BM_RC_BEGIN, SPR_G2_BM_BOOSTER_NE_SW = SPR_G2_BM_DIAG_BRAKES + 6, SPR_G2_BM_BOOSTER_NW_SE, - SPR_G2_BM_RC_END, + SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE, + SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED = SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 64, + SPR_G2_BM_TRACK_LARGE_CORKSCREW = SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 128, + SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP = SPR_G2_BM_TRACK_LARGE_CORKSCREW + 40, + SPR_G2_BM_TRACK_ZERO_G_ROLL = SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 44, + SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL = SPR_G2_BM_TRACK_ZERO_G_ROLL + 32, + SPR_G2_BM_RC_END = SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 40, SPR_G2_MINIATURE_RAILWAY_BEGIN = SPR_G2_BM_RC_END, SPR_G2_MINIATURE_RAILWAY_QUARTER_TURN_3_TILES_SW_SE_PART_3 = SPR_G2_MINIATURE_RAILWAY_BEGIN,