diff --git a/contributors.md b/contributors.md
index 7ef94f24ca..d26dadee44 100644
--- a/contributors.md
+++ b/contributors.md
@@ -65,9 +65,11 @@ Includes all git commit authors. Aliases are GitHub user names.
## Translation
* English (UK) - Ted John (IntelOrca), (Tinytimrob)
-* French - (fbourigault)
-* German - (atmaxinger), (Yepoleb)
+* English (US) - Ted John (IntelOrca), Michael Steenbeek (Gymnasiast)
+* French - (fbourigault), Michael Steenbeek (Gymnasiast)
+* German - (danidoedel), (atmaxinger), (Yepoleb)
* Dutch - Michael Steenbeek (Gymnasiast), (hostbrute), (mrtnptrs), (xzbobzx)
+* Portuguese (BR) - (kaudy)
* Spanish - (mdtrooper)
* Swedish - (Jinxit), (mharrys)
diff --git a/data/language/dutch.txt b/data/language/dutch.txt
index bc5d1937eb..f8df060fd2 100644
--- a/data/language/dutch.txt
+++ b/data/language/dutch.txt
@@ -42,7 +42,7 @@ STR_0040 :Bewegingssimulator
STR_0041 :3D-bioscoop
STR_0042 :Topspin
STR_0043 :Ruimteringen
-STR_0044 :Omgekeerde vrijevalachtbaan
+STR_0044 :Achterwaartsevrijevalachtbaan
STR_0045 :Lift
STR_0046 :Verticale achtbaan
STR_0047 :Geldautomaat
@@ -51,7 +51,7 @@ STR_0049 :Spookhuis
STR_0050 :Eerste hulp
STR_0051 :Circus
STR_0052 :Spooktrein
-STR_0053 :Hyper-twisterachtbaan
+STR_0053 :Twisterachtbaan
STR_0054 :Houten achtbaan
STR_0055 :Zijfrictie-achtbaan
STR_0056 :Wilde muis
@@ -522,9 +522,9 @@ STR_0520 :Een aanlegsteiger waar bezoekers in een bootje kunnen gaan om over
STR_0521 :Een intense, snelle en kronkelende achtbaan met scherpe bochten en afdalingen.
STR_0522 :Een kleinere achtbaan waar de passagiers boven de baan en op het karretje zitten.
STR_0523 :Bezoekers rijden langzaam over een baan in aangedreven karretjes.
-STR_0524 :
+STR_0524 :Een vrijevalwagen wordt pneumatisch langs een hoge stalen toren gelanceerd en gaat daarna in een vrije val weer naar beneden.
STR_0525 :Passagiers rijden over een kronkelende baan, waarbij ze enkel worden geleid door de ronding en banking van de halfronde baan.
-STR_0526 :Een vrijvalwagen wordt pneumatisch langs een hoge stalen toren gelanceerd en gaat daarna in een vrije val weer naar beneden.
+STR_0526 :Bezoekers gaan in een roterende observatiecabine langs een toren omhoog
STR_0527 :Een soepele stalen achtbaan die verticale loopings kan maken.
STR_0528 :Passagiers varen in opblaasboten door een kronkelende halfopen of compleet gesloten glijbaan.
STR_0529 :Achtbaantreinen in de vorm van een mijntrein razen over stalen achtbaanrails die er uitziet als een oude spoorbaan.
@@ -894,7 +894,7 @@ STR_0892 :Screenshot opgeslagen als '{STRINGID}'
STR_0893 :Screenshot maken mislukt!
STR_0894 :"Landscape data area" zit vol!
STR_0895 :Kan niet gedeeltelijk onder en boven de grond bouwen
-STR_0896 :{POP16}{POP16}{STRINGID} Constructie
+STR_0896 :{POP16}{POP16}Constructie {STRINGID}
STR_0897 :Richting
STR_0898 :{SMALLFONT}{BLACK}Bocht naar links
STR_0899 :{SMALLFONT}{BLACK}Bocht naar rechts
@@ -903,7 +903,7 @@ STR_0901 :{SMALLFONT}{BLACK}Bocht naar rechts (kleine straal)
STR_0902 :{SMALLFONT}{BLACK}Bocht naar links (zeer kleine straal)
STR_0903 :{SMALLFONT}{BLACK}Bocht naar rechts (zeer kleine straal)
STR_0904 :{SMALLFONT}{BLACK}Bocht naar links (grote straal)
-STR_0905 :{SMALLFONT}{BLACK}Bocht naar rechts (straal)
+STR_0905 :{SMALLFONT}{BLACK}Bocht naar rechts (grote straal)
STR_0906 :{SMALLFONT}{BLACK}Recht stuk
STR_0907 :Helling
STR_0908 :Roll/Banking
diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt
index 0a2e5fd020..24f2a80331 100644
--- a/data/language/english_uk.txt
+++ b/data/language/english_uk.txt
@@ -3780,3 +3780,5 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID}
STR_5444 :Speed:
STR_5445 :Speed
STR_5446 :Get
+STR_5447 :Type {STRINGID}
+STR_5448 :Ride / Vehicle {STRINGID}
diff --git a/data/language/english_us.txt b/data/language/english_us.txt
index 8e5b3551cc..c2883e1794 100644
--- a/data/language/english_us.txt
+++ b/data/language/english_us.txt
@@ -525,9 +525,9 @@ STR_0520 :A dock platform where guests can drive/row personal watercraft on a
STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high.
STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them
STR_0523 :Riders travel slowly in powered vehicles along a track-based route
-STR_0524 :
+STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down
STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track
-STR_0526 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down
+STR_0526 :Passengers travel in an rotating observation cabin which travels up a tall tower
STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops
STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track
STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track
diff --git a/data/language/german.txt b/data/language/german.txt
index 1da26e6c23..0ad49e4e4f 100644
--- a/data/language/german.txt
+++ b/data/language/german.txt
@@ -1160,7 +1160,7 @@ STR_1155 :Höhenmarkierungen an Fußwegen
STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID}
STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID}
STR_1158 :Kann nicht entfernt werden...
-STR_1159 :{SMALLFONT}{BLACK}Platzieren Sie Szenerien, Beete und andere Objekte
+STR_1159 :{SMALLFONT}{BLACK}Platzieren Sie Szenerien, Beete und{NEWLINE}andere Objekte
STR_1160 :{SMALLFONT}{BLACK}Seen & Wasseranlagen erstellen/anpassen
STR_1161 :Kann hier nicht positioniert werden...
STR_1162 :{OUTLINE}{TOPAZ}{STRINGID}
@@ -1709,7 +1709,7 @@ STR_1704 :Es kann kein neuer Mitarbeiter eingestellt werden...
STR_1705 :{SMALLFONT}{BLACK}Diesen Mitarbeiter entlassen
STR_1706 :{SMALLFONT}{BLACK}Diese Person an einen anderen Ort befördern
STR_1707 :Zu viele Mitarbeiter im Spiel
-STR_1708 :{SMALLFONT}{BLACK}Patrouillenbereich für diesen Mitarbeiter festlegen
+STR_1708 :{SMALLFONT}{BLACK}Patrouillenbereich für diesen{NEWLINE}Mitarbeiter festlegen
STR_1709 :Mitarbeiter entlassen
STR_1710 :Ja
STR_1711 :{WINDOW_COLOUR_1}Möchten Sie {STRINGID} wirklich entlassen?
@@ -1791,7 +1791,7 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronautenkostüm
STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Banditenkostüm
STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriffkostüm
STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenkostüm
-STR_1790 :{SMALLFONT}{BLACK}Uniformfarbe für diesen Mitarbeiter auswählen
+STR_1790 :{SMALLFONT}{BLACK}Uniformfarbe für diesen{NEWLINE}Mitarbeiter auswählen
STR_1791 :{WINDOW_COLOUR_2}Uniformfarbe:
STR_1792 :Antwortet auf {STRINGID} -Störungsruf
STR_1793 :Unterwegs zu {STRINGID} für eine Inspektion
@@ -1817,16 +1817,16 @@ STR_1812 :{SMALLFONT}{BLACK}{STRINGID}
STR_1813 :Verschiedene Objekte
STR_1814 :Aktionen
STR_1815 :Gedanken
-STR_1816 :{SMALLFONT}{BLACK}Informationsart auswählen,{NEWLINE}die in Besucherliste angezeigt{NEWLINE}werden soll
+STR_1816 :{SMALLFONT}{BLACK}Informationsart auswählen, die{NEWLINE}in Besucherliste angezeigt{NEWLINE}werden soll
STR_1817 :({COMMA16})
STR_1818 :{WINDOW_COLOUR_2}Alle Besucher
STR_1819 :{WINDOW_COLOUR_2}Alle Besucher (zusammengefasst)
STR_1820 :{WINDOW_COLOUR_2}Besucher {STRINGID}
STR_1821 :{WINDOW_COLOUR_2}Besucher denken {STRINGID}
STR_1822 :{WINDOW_COLOUR_2}Besucher denken an {POP16}{STRINGID}
-STR_1823 :{SMALLFONT}{BLACK}Gedanken der Besucher zu dieser Attraktion anzeigen
+STR_1823 :{SMALLFONT}{BLACK}Gedanken der Besucher zu dieser{NEWLINE}Attraktion anzeigen
STR_1824 :{SMALLFONT}{BLACK}Besucher dieser Attraktion anzeigen
-STR_1825 :{SMALLFONT}{BLACK}Anstehende Besucher für diese Attraktion anzeigen
+STR_1825 :{SMALLFONT}{BLACK}Anstehende Besucher für diese{NEWLINE}Attraktion anzeigen
STR_1826 :Status
STR_1827 :Popularität
STR_1828 :Zufriedenheit
@@ -1845,13 +1845,13 @@ STR_1840 :Ausfallzeit: {COMMA16}%
STR_1841 :Gewinn: {CURRENCY2DP} pro Stunde
STR_1842 :Favorit von: {COMMA16} Besucher
STR_1843 :Favorit von: {COMMA16} Besuchern
-STR_1844 :{SMALLFONT}{BLACK}Informationsart auswählen,{NEWLINE}die in Attraktionsliste angezeigt{NEWLINE}werden soll
+STR_1844 :{SMALLFONT}{BLACK}Informationsart auswählen, die{NEWLINE}in Attraktionsliste angezeigt{NEWLINE}werden soll
STR_1845 :{MONTHYEAR}
STR_1846 :{COMMA16} Besucher
STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} Besucher
STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} Besucher
STR_1849 :{WINDOW_COLOUR_2}Musikwiedergabe
-STR_1850 :{SMALLFONT}{BLACK}Auswählen, ob Musik für diese Bahn abgespielt werden soll
+STR_1850 :{SMALLFONT}{BLACK}Auswählen, ob Musik für diese{NEWLINE}Bahn abgespielt werden soll
STR_1851 :{WINDOW_COLOUR_2}Betriebskosten: {BLACK}{CURRENCY2DP} pro Stunde
STR_1852 :{WINDOW_COLOUR_2}Betriebskosten: {BLACK}Unbekannt
STR_1853 :{WINDOW_COLOUR_2}Erbaut: {BLACK}Dieses Jahr
@@ -1891,7 +1891,7 @@ STR_1886 :Inspektion bei {STRINGID}
STR_1887 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}{COMMA16} Minuten
STR_1888 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}mehr als 4 Stunden
STR_1889 :{WINDOW_COLOUR_2}Ausfallzeit: {MOVE_X}{255}{BLACK}{COMMA16}%
-STR_1890 :{SMALLFONT}{BLACK}Auswählen, wie oft ein Mechaniker diese Bahn überprüfen soll
+STR_1890 :{SMALLFONT}{BLACK}Auswählen, wie oft ein Mechaniker{NEWLINE}diese Bahn überprüfen soll
STR_1891 :Noch kein {STRINGID} im Park
STR_1892 :RollerCoaster Tycoon 2
STR_1893 :Legen Sie die RollerCoaster Tycoon 2-CD in folgendes Laufwerk ein:
@@ -1941,15 +1941,15 @@ STR_1936 :{STRINGID} hat {STRINGID} gekauft
STR_1937 :{SMALLFONT}{BLACK}Informationen zum Thema dieser Nachricht anzeigen
STR_1938 :{SMALLFONT}{BLACK}Ansicht des Besuchers anzeigen
STR_1939 :{SMALLFONT}{BLACK}Ansicht des Mitarbeiters anzeigen
-STR_1940 :{SMALLFONT}{BLACK}Vergnügen, Energie, Hunger, usw. dieses Besuchers anzeigen
+STR_1940 :{SMALLFONT}{BLACK}Vergnügen, Energie, Hunger, usw.{NEWLINE}dieses Besuchers anzeigen
STR_1941 :{SMALLFONT}{BLACK}Gefahrene Bahnen dieses Besuchers anzeigen
-STR_1942 :{SMALLFONT}{BLACK}Finanzinformationen zu diesem Besucher anzeigen
+STR_1942 :{SMALLFONT}{BLACK}Finanzinformationen zu diesem{NEWLINE}Besucher anzeigen
STR_1943 :{SMALLFONT}{BLACK}Aktuelle Gedanken dieses Besuchers anzeigen
-STR_1944 :{SMALLFONT}{BLACK}Objekte anzeigen, die der Besucher bei sich trägt
+STR_1944 :{SMALLFONT}{BLACK}Objekte anzeigen, die der{NEWLINE}Besucher bei sich trägt
STR_1945 :{SMALLFONT}{BLACK}Anweisungen und Optionen für diesen Mitarbeiter anzeigen
STR_1946 :{SMALLFONT}{BLACK}Kostüm für diesen Animateur auswählen
STR_1947 :{SMALLFONT}{BLACK}Vom Mitarbeitertyp abgelaufene{NEWLINE}Bereiche anzeigen und den nächsten{NEWLINE}Mitarbeiter suchen
-STR_1948 :{SMALLFONT}{BLACK}Neuen Mitarbeiter für den ausgewählten Typ einstellen
+STR_1948 :{SMALLFONT}{BLACK}Neuen Mitarbeiter für den ausgewählten{NEWLINE}Typ einstellen
STR_1949 :Finanzübersicht
STR_1950 :Finanzdiagramm
STR_1951 :Verkehrswertdiagramm
@@ -2459,17 +2459,17 @@ STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} -
STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} -
STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} -
STR_2457 :{SMALLFONT}{BLACK}Finanzkonten anzeigen
-STR_2458 :{SMALLFONT}{BLACK}Gelddiagramm (abzüglich Darlehen) im Zeitverlauf anzeigen
-STR_2459 :{SMALLFONT}{BLACK}Verkehrswertdiagramm im Zeitverlauf anzeigen
+STR_2458 :{SMALLFONT}{BLACK}Gelddiagramm (abzüglich Darlehen){NEWLINE}im Zeitverlauf anzeigen
+STR_2459 :{SMALLFONT}{BLACK}Verkehrswertdiagramm im{NEWLINE}Zeitverlauf anzeigen
STR_2460 :{SMALLFONT}{BLACK}Diagramm zu Wochengewinn anzeigen
STR_2461 :{SMALLFONT}{BLACK}Marketingkampagnen anzeigen
STR_2462 :{SMALLFONT}{BLACK}Ansicht von Parkeingang anzeigen
-STR_2463 :{SMALLFONT}{BLACK}Parkbewertungsdiagramm im Zeitverlauf anzeigen
-STR_2464 :{SMALLFONT}{BLACK}Besucherzahlendiagramm im Zeitverlauf anzeigen
+STR_2463 :{SMALLFONT}{BLACK}Parkbewertungsdiagramm{NEWLINE}im Zeitverlauf anzeigen
+STR_2464 :{SMALLFONT}{BLACK}Besucherzahlendiagramm{NEWLINE}im Zeitverlauf anzeigen
STR_2465 :{SMALLFONT}{BLACK}Parkeintrittspreis und -informationen anzeigen
STR_2466 :{SMALLFONT}{BLACK}Parkstatistiken anzeigen
STR_2467 :{SMALLFONT}{BLACK}Ziele für dieses Spiel anzeigen
-STR_2468 :{SMALLFONT}{BLACK}Aktuelle Auszeichnungen anzeigen, die dieser Park erhalten hat
+STR_2468 :{SMALLFONT}{BLACK}Aktuelle Auszeichnungen anzeigen,{NEWLINE}die dieser Park erhalten hat
STR_2469 :{SMALLFONT}{BLACK}Forschungs- & Entwicklungsgrad auswählen
STR_2470 :{SMALLFONT}{BLACK}Nach neuen Transportbahnen forschen
STR_2471 :{SMALLFONT}{BLACK}Nach neuen gemäßigten Bahnen forschen
@@ -2478,7 +2478,7 @@ STR_2473 :{SMALLFONT}{BLACK}Nach neuen aufregenden Fahrten forschen
STR_2474 :{SMALLFONT}{BLACK}Nach neuen Wasserbahnen forschen
STR_2475 :{SMALLFONT}{BLACK}Nach neuen Läden und Ständen forschen
STR_2476 :{SMALLFONT}{BLACK}Nach neuen Szenerien und Themen forschen
-STR_2477 :{SMALLFONT}{BLACK}Betriebsmodus für diese Attraktion auswählen
+STR_2477 :{SMALLFONT}{BLACK}Betriebsmodus für diese{NEWLINE}Attraktion auswählen
STR_2478 :{SMALLFONT}{BLACK}Geschwindigkeitsdiagramm im Zeitverlauf anzeigen
STR_2479 :{SMALLFONT}{BLACK}Höhendiagramm im Zeitverlauf anzeigen
STR_2480 :{SMALLFONT}{BLACK}Diagramm der vertikalen Beschleunigung im Zeitverlauf anzeigen
@@ -2795,9 +2795,9 @@ STR_2786 :{SMALLFONT}{BLACK}Klicken Sie auf die Kürzelbeschreibung, um eine
STR_2787 :{WINDOW_COLOUR_2}Verkehrswert: {BLACK}{CURRENCY}
STR_2788 :{WINDOW_COLOUR_2}Glückwunsch!{NEWLINE}{BLACK}Sie haben Ihr Ziel mit einem Firmenwert von {CURRENCY} erreicht!
STR_2789 :{WINDOW_COLOUR_2}Sie haben Ihr Ziel nicht erreicht!
-STR_2790 :Geben Sie einen Namen in das Szenariodiagramm ein
+STR_2790 :Namen für die Szenarioübers. eingeben
STR_2791 :Namen eingeben
-STR_2792 :Geben Sie Ihren Namen für das Szenariodiagramm ein:
+STR_2792 :Namen für die Szenarioübersicht eingeben:
STR_2793 :{SMALLFONT}(Durchgeführt von {STRINGID})
STR_2794 :{WINDOW_COLOUR_2}Durchgeführt von: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} mit einem Firmenwert von: {BLACK}{CURRENCY}
STR_2795 :Sortieren
@@ -3095,7 +3095,7 @@ STR_3086 :Abstrakter Eingang
STR_3087 :Schnee-/Eis-Eingang
STR_3088 :Pagodeneingang
STR_3089 :Weltraumeingang
-STR_3090 :{SMALLFONT}{BLACK}Wählen Sie Stil für den Eingang, Ausgang und die Station aus
+STR_3090 :{SMALLFONT}{BLACK}Wählen Sie Stil für den Eingang,{NEWLINE}Ausgang und die Station aus
STR_3091 :Sie dürfen diesen Abschnitt nicht entfernen!
STR_3092 :Sie dürfen die Station für diese Bahn nicht verschieben oder verändern!
STR_3093 :{WINDOW_COLOUR_2}Favorit: {BLACK}{STRINGID}
@@ -3111,7 +3111,7 @@ STR_3102 :{SMALLFONT}{BLACK}Farbige Szenerie auf Gelände neu streichen
STR_3103 :Dies kann nicht neu gestrichen werden...
STR_3104 :{SMALLFONT}{BLACK}Bahnen auflisten
STR_3105 :{SMALLFONT}{BLACK}Läden und Stände auflisten
-STR_3106 :{SMALLFONT}{BLACK}Informationsstände und andere Besuchereinrichtungen auflisten
+STR_3106 :{SMALLFONT}{BLACK}Informationsstände und andere Besuchereinrichtungen{NEWLINE}auflisten
STR_3107 :Schließen
STR_3108 :Testen
STR_3109 :Öffnen
@@ -3226,14 +3226,14 @@ STR_3217 :Gelände im Besitz
STR_3218 :Baurechte
STR_3219 :Gelände zum Verkauf
STR_3220 :Baurechte zum Verkauf
-STR_3221 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das dem Park gehören soll
+STR_3221 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest,{NEWLINE}das dem Park gehören soll
STR_3222 :{SMALLFONT}{BLACK}Wählen Sie die Baurechte aus, die exklusiv dem Park gehören sollen
-STR_3223 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das vom Park gekauft werden kann
-STR_3224 :{SMALLFONT}{BLACK}Legen Sie die Baurechte fest, die vom Park erworben werden können
+STR_3223 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das vom{NEWLINE}Park gekauft werden kann
+STR_3224 :{SMALLFONT}{BLACK}Legen Sie die Baurechte fest, die vom{NEWLINE}Park erworben werden können
STR_3225 :{SMALLFONT}{BLACK}Bau einer zufälligen Objektgruppe{NEWLINE}um ausgewählte Position herum ein-/ausschalten
STR_3226 :{SMALLFONT}{BLACK}Parkeingang bauen
STR_3227 :Zu viele Parkeingänge!
-STR_3228 :{SMALLFONT}{BLACK}Legen Sie die Startpositionen für Personen fest
+STR_3228 :{SMALLFONT}{BLACK}Legen Sie die Startpositionen{NEWLINE}für Personen fest
STR_3229 :Blockbremsen können nicht unmittelbar nach der Station eingesetzt werden
STR_3230 :Blockbremsen können nicht unmittelbar hintereinander eingesetzt werden
STR_3231 :Blockbremsen können nicht unmittelbar nach der Anstiegsspitze eingesetzt werden
@@ -3262,26 +3262,26 @@ STR_3253 :Max. Darlehensgröße kann nicht weiter reduziert werden!
STR_3254 :Zinsrate kann nicht weiter erhöht werden!
STR_3255 :Zinsrate kann nicht weiter reduziert werden!
STR_3256 :Weniger aufregendere Bahnen bevorzugt
-STR_3257 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen weniger aufregende Bahnen vorziehen
+STR_3257 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen weniger aufregende{NEWLINE}Bahnen vorziehen
STR_3258 :Aufregendere Bahnen bevorzugt
-STR_3259 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen aufregendere Bahnen vorziehen
+STR_3259 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen aufregendere{NEWLINE}Bahnen vorziehen
STR_3260 :{WINDOW_COLOUR_2}Durchschnittliches Geld pro Besucher:
STR_3261 :{WINDOW_COLOUR_2}Anfangsvergnügen der Besucher:
STR_3262 :{WINDOW_COLOUR_2}Anfangshunger der Besucher:
STR_3263 :{WINDOW_COLOUR_2}Anfangsdurst der Besucher:
STR_3264 :Dies kann nicht weiter erhöht werden!
STR_3265 :Dies kann nicht weiter reduziert werden!
-STR_3266 :{SMALLFONT}{BLACK}Wählen Sie aus, was der Park für Eintritt und Fahrten verlangt
+STR_3266 :{SMALLFONT}{BLACK}Wählen Sie aus, was der Park für{NEWLINE}Eintritt und Fahrten verlangt
STR_3267 :Entfernen von Bäumen verbieten
STR_3268 :{SMALLFONT}{BLACK}Entfernen von hohen Bäumen verbieten
STR_3269 :Landschaftsänderungen verbieten
-STR_3270 :{SMALLFONT}{BLACK}Jegliche Änderungen an der Landschaft verbieten
+STR_3270 :{SMALLFONT}{BLACK}Jegliche Änderungen an der{NEWLINE}Landschaft verbieten
STR_3271 :Hohe Bauten verbieten
STR_3272 :{SMALLFONT}{BLACK}Jegliche hohe Bauten verbieten
STR_3273 :Höhere Schwierigkeitsstufe für Parkbewertung
STR_3274 :{SMALLFONT}{BLACK}Machen Sie die Parkbewertung schwieriger
STR_3275 :Höhere Schwierigkeitsstufe für Besuchergewinnung
-STR_3276 :{SMALLFONT}{BLACK}Machen Sie das Anlocken von Besuchern schwieriger
+STR_3276 :{SMALLFONT}{BLACK}Machen Sie das Anlocken von{NEWLINE}Besuchern schwieriger
STR_3277 :{WINDOW_COLOUR_2}Kosten für Landkauf:
STR_3278 :{WINDOW_COLOUR_2}Kosten für Erwerb v. Baurechten:
STR_3279 :Freier Eintritt/Bezahlen pro Fahrt
@@ -3323,7 +3323,7 @@ STR_3314 :Namen für Szenario eingeben:
STR_3315 :Park-/Szenariodetails
STR_3316 :Beschreibung für dieses Szenario eingeben:
STR_3317 :Noch keine Details
-STR_3318 :{SMALLFONT}{BLACK}Wählen Sie aus, in welcher Gruppe dieses Szenario vorkommt
+STR_3318 :{SMALLFONT}{BLACK}Wählen Sie aus, in welcher Gruppe{NEWLINE}dieses Szenario vorkommt
STR_3319 :{WINDOW_COLOUR_2}Szenariogruppe:
STR_3320 :Szenariodatei kann nicht gespeichert werden...
STR_3321 :Neue Objekte erfolgreich installiert
@@ -3587,10 +3587,10 @@ STR_5250 :Hauptmenü Beenden-Schaltfläche
STR_5251 :Hauptmenü Optionen-Schaltfläche
STR_5252 :Hauptmenü Szenarioauswahl
STR_5253 :Parkinformationen
-STR_5254 :Übelkeit hinzufügen
-STR_5255 :{MEDIUMFONT}{BLACK}Allen Besuchern wird übel
+STR_5254 :Erstellen
+STR_5255 :{SMALLFONT}{BLACK}Eine neue Titelsequenz von{NEWLINE}Grund auf neu erstellen
STR_5256 :Neues Thema zum bearbeiten erstellen
-STR_5257 :{SMALLFONT}{BLACK}Neues Thema durch duplizieren des aktuellen Themas erstellen
+STR_5257 :{SMALLFONT}{BLACK}Neues Thema durch duplizieren des{NEWLINE}aktuellen Themas erstellen
STR_5258 :{SMALLFONT}{BLACK}Aktuelles Thema löschen
STR_5259 :{SMALLFONT}{BLACK}Aktuelles Thema umbenennen
STR_5260 :Riesiger Screenshot
@@ -3758,7 +3758,7 @@ STR_5421 :Zoom
STR_5422 :Zoom{MOVE_X}{87}{COMMA16}
STR_5423 :Warten
STR_5424 :Warten{MOVE_X}{87}{COMMA16}
-STR_5425 :Neu starten
+STR_5425 :Neustart
STR_5426 :Ende
STR_5427 :Koordinaten:
STR_5428 :Drehungen gegen Uhrzeigersinn:
@@ -3772,6 +3772,13 @@ STR_5435 :Spielstand umbenennen
STR_5436 :Titelsequenzen bearbeiten...
STR_5437 :Kein Spielstand ausgewählt
STR_5438 :Es können keine Änderungen vorgenommen werden, solange der Befehlseditor geöffnet ist
-STR_5439 :Ein Neustart wird ohne `Warten'-Befehl verwendet
+STR_5439 :Zusammen mit einem `Neustart'-Befehl muss ein mindestens 4 Sekunden langer `Warten'-Befehl verwendet werden
STR_5440 :Vollbild minimieren, wenn Spiel nicht im Vordergrund
-STR_5441 :{SMALLFONT}{BLACK}Identifiziert Bahnen durch Streckentyp, sodass wie in RCT1 Fahrzeuge anschließend geändert werden können. Nur im Titelbildschirm auswählbar
+STR_5441 :{SMALLFONT}{BLACK}Identifiziert Bahnen durch Streckentyp, sodass wie in RCT1 Fahrzeuge anschließend geändert werden können
+STR_5442 :reserviert
+STR_5443 :Geschwind.{MOVE_X}{87}{STRINGID}
+STR_5444 :Geschwindigkeit:
+STR_5445 :Geschwindigkeit
+STR_5446 :Erhalten
+STR_5447 :Typ {STRINGID}
+STR_5448 :Bahn / Fahrzeug {STRINGID}
diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj
index c9f50a1a2a..84309b2bcf 100644
--- a/projects/openrct2.vcxproj
+++ b/projects/openrct2.vcxproj
@@ -96,6 +96,7 @@
+
diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters
index 24bc550445..d2f78bd6b4 100644
--- a/projects/openrct2.vcxproj.filters
+++ b/projects/openrct2.vcxproj.filters
@@ -489,6 +489,9 @@
Source\Windows
+
+ Source\Windows
+
diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h
index 55217eff9c..65ccb9267e 100644
--- a/src/drawing/drawing.h
+++ b/src/drawing/drawing.h
@@ -131,6 +131,7 @@ void draw_string_centred_raw(rct_drawpixelinfo *dpi, int x, int y, int numLines,
void gfx_draw_string_right(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y);
void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y);
int string_get_height_raw(char *buffer);
+void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks);
// rain
void update_rain_animation();
diff --git a/src/drawing/string.c b/src/drawing/string.c
index d0c575f963..ebf4c47f23 100644
--- a/src/drawing/string.c
+++ b/src/drawing/string.c
@@ -1218,4 +1218,31 @@ int string_get_height_raw(char *buffer)
}
return height;
+}
+
+/**
+ *
+ * rct2: 0x006C1F57
+ *
+ * colour : al
+ * format : bx
+ * x : cx
+ * y : dx
+ * text : esi
+ * dpi : edi
+ * width : bp
+ * ticks : ebp >> 16
+ */
+void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks)
+{
+ RCT2_CALLPROC_X(
+ 0x006C1F57,
+ colour,
+ format,
+ x,
+ y,
+ (int)args,
+ (int)dpi,
+ (width & 0xFFFF) | (ticks << 16)
+ );
}
\ No newline at end of file
diff --git a/src/editor.c b/src/editor.c
index 4e0f050764..25761f88cb 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -151,7 +151,7 @@ void editor_convert_save_to_scenario()
rct_stex_entry* stex = g_stexEntries[0];
if ((int)stex != 0xFFFFFFFF) {
- object_unload(0, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]);
+ object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]);
reset_loaded_objects();
format_string(s6Info->details, STR_NO_DETAILS_YET, NULL);
@@ -501,7 +501,7 @@ static int editor_read_s6(const char *path)
rct_stex_entry* stex = g_stexEntries[0];
if ((int)stex != 0xFFFFFFFF) {
- object_unload(0, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]);
+ object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]);
reset_loaded_objects();
format_string(s6Info->details, STR_NO_DETAILS_YET, NULL);
diff --git a/src/game.c b/src/game.c
index 2a032562e7..cfd8ba82b1 100644
--- a/src/game.c
+++ b/src/game.c
@@ -909,8 +909,8 @@ static uint32 game_do_command_table[58] = {
0,
0x0066397F,
0,
- 0x006C511D,
- 0x006C5B69,
+ 0,
+ 0,
0,
0x006B3F0F,
0,
@@ -972,8 +972,8 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = {
game_command_set_ride_appearance,
game_command_emptysub,
game_pause_toggle,
- game_command_emptysub,
- game_command_emptysub,
+ game_command_place_track,
+ game_command_remove_track,
game_load_or_quit,
game_command_emptysub,
game_command_demolish_ride,
@@ -1016,7 +1016,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = {
game_command_remove_large_scenery,
game_command_set_current_loan,
game_command_set_research_funding,
- game_command_place_track,
+ game_command_place_track_design,
game_command_start_campaign,
game_command_emptysub,
game_command_place_banner, // 50
diff --git a/src/game.h b/src/game.h
index 0695d91595..91c3212236 100644
--- a/src/game.h
+++ b/src/game.h
@@ -27,8 +27,8 @@ enum GAME_COMMAND {
GAME_COMMAND_SET_RIDE_APPEARANCE,
GAME_COMMAND_1,
GAME_COMMAND_TOGGLE_PAUSE, // 2
- GAME_COMMAND_3, //Has something to do with ride construction
- GAME_COMMAND_4,
+ GAME_COMMAND_PLACE_TRACK,
+ GAME_COMMAND_REMOVE_TRACK,
GAME_COMMAND_LOAD_OR_QUIT, // 5
GAME_COMMAND_6,
GAME_COMMAND_7,
@@ -36,8 +36,8 @@ enum GAME_COMMAND {
GAME_COMMAND_9,
GAME_COMMAND_SET_RIDE_NAME,
GAME_COMMAND_SET_RIDE_SETTING,
- GAME_COMMAND_12,
- GAME_COMMAND_13,
+ GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT,
+ GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT,
GAME_COMMAND_REMOVE_SCENERY,
GAME_COMMAND_PLACE_SCENERY,
GAME_COMMAND_16,
@@ -71,7 +71,7 @@ enum GAME_COMMAND {
GAME_COMMAND_REMOVE_LARGE_SCENERY,
GAME_COMMAND_SET_CURRENT_LOAN, // 45
GAME_COMMAND_SET_RESEARCH_FUNDING, // 46
- GAME_COMMAND_PLACE_TRACK,
+ GAME_COMMAND_PLACE_TRACK_DESIGN,
GAME_COMMAND_START_MARKETING_CAMPAIGN, // 48
GAME_COMMAND_49,
GAME_COMMAND_PLACE_BANNER, // New banner? (possibly scenery)
diff --git a/src/interface/viewport.h b/src/interface/viewport.h
index f38f7adc33..5836314b0a 100644
--- a/src/interface/viewport.h
+++ b/src/interface/viewport.h
@@ -126,4 +126,8 @@ void sub_68A15E(int screenX, int screenY, short *x, short *y, int *direction, rc
void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y);
+void sub_0x68615B(int ebp);
+void sub_688485();
+void sub_688217();
+
#endif
diff --git a/src/interface/window.h b/src/interface/window.h
index 9aee92e59a..e571e2f312 100644
--- a/src/interface/window.h
+++ b/src/interface/window.h
@@ -564,7 +564,8 @@ rct_window *window_ride_open_vehicle(rct_vehicle *vehicle);
void window_ride_demolish_prompt_open(int rideIndex);
void window_ride_construct(rct_window *w);
void window_ride_list_open();
-rct_window * window_construction_open();
+rct_window *window_ride_construction_open();
+rct_window *window_maze_construction_open();
void window_track_place_open();
rct_window *window_new_ride_open();
rct_window *window_new_ride_open_research();
diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h
index a1029e0da5..464d3f454d 100644
--- a/src/localisation/string_ids.h
+++ b/src/localisation/string_ids.h
@@ -73,7 +73,7 @@ enum {
STR_CLOSE_X = 824,
STR_CHOSEN_NAME_IN_USE_ALREADY = 825,
STR_TOO_MANY_NAMES_DEFINED = 826,
-
+ STR_NOT_ENOUGH_CASH_REQUIRES = 827,
STR_CLOSE_WINDOW_TIP = 828,
STR_WINDOW_TITLE_TIP = 829,
@@ -124,6 +124,45 @@ enum {
STR_SCREENSHOT_FAILED = 893,
STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND = 895,
+ STR_RIDE_CONSTRUCTION_DIRECTION = 897,
+ STR_RIDE_CONSTRUCTION_LEFT_CURVE_TIP = 898,
+ STR_RIDE_CONSTRUCTION_RIGHT_CURVE_TIP = 899,
+ STR_RIDE_CONSTRUCTION_LEFT_CURVE_SMALL_TIP = 900,
+ STR_RIDE_CONSTRUCTION_RIGHT_CURVE_SMALL_TIP = 901,
+ STR_RIDE_CONSTRUCTION_LEFT_CURVE_VERY_SMALL_TIP = 902,
+ STR_RIDE_CONSTRUCTION_RIGHT_CURVE_VERY_SMALL_TIP = 903,
+ STR_RIDE_CONSTRUCTION_LEFT_CURVE_LARGE_TIP = 904,
+ STR_RIDE_CONSTRUCTION_RIGHT_CURVE_LARGE_TIP = 905,
+ STR_RIDE_CONSTRUCTION_STRAIGHT_TIP = 906,
+ STR_RIDE_CONSTRUCTION_SLOPE = 907,
+ STR_RIDE_CONSTRUCTION_ROLL_BANKING = 908,
+ STR_RIDE_CONSTRUCTION_SEAT_ROT = 909,
+
+ STR_RIDE_CONSTRUCTION_ROLL_FOR_LEFT_CURVE_TIP = 910,
+ STR_RIDE_CONSTRUCTION_ROLL_FOR_RIGHT_CURVE_TIP = 911,
+ STR_RIDE_CONSTRUCTION_NO_ROLL_TIP = 912,
+ STR_RIDE_CONSTRUCTION_MOVE_TO_PREVIOUS_SECTION_TIP = 913,
+ STR_RIDE_CONSTRUCTION_MOVE_TO_NEXT_SECTION_TIP = 914,
+ STR_RIDE_CONSTRUCTION_CONSTRUCT_SELECTED_SECTION_TIP = 915,
+ STR_RIDE_CONSTRUCTION_REMOVE_HIGHLIGHTED_SECTION_TIP = 916,
+ STR_RIDE_CONSTRUCTION_VERTICAL_DROP_TIP = 917,
+ STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP = 918,
+ STR_RIDE_CONSTRUCTION_SLOPE_DOWN_TIP = 919,
+ STR_RIDE_CONSTRUCTION_LEVEL_TIP = 920,
+ STR_RIDE_CONSTRUCTION_SLOPE_UP_TIP = 921,
+ STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP = 922,
+ STR_RIDE_CONSTRUCTION_VERTICAL_RISE_TIP = 923,
+ STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP = 924,
+ STR_RIDE_CONSTRUCTION_HELIX_UP_TIP = 925,
+ STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS = 926,
+ STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE = 927,
+ STR_RIDE_CONSTRUCTION_CHAIN_LIFT_TIP = 928,
+
+ STR_S_BEND_LEFT = 929,
+ STR_S_BEND_RIGHT = 930,
+ STR_VERTICAL_LOOP_LEFT = 931,
+ STR_VERTICAL_LOOP_RIGHT = 932,
+
STR_VIEW_OPTIONS_TIP = 937,
STR_ADJUST_LAND_TIP = 938,
STR_UNDERGROUND_VIEW = 939,
@@ -145,6 +184,24 @@ enum {
STR_QUIT_GAME_2_PROMPT_TITLE = 952,
STR_LOAD_LANDSCAPE_PROMPT_TITLE = 953,
+ STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP = 955,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_180 = 956,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_135 = 957,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_90 = 958,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_45 = 959,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_0 = 960,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_45 = 961,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_90 = 962,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_135 = 963,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_180 = 964,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_225 = 965,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_270 = 966,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_315 = 967,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_360 = 968,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_405 = 969,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_450 = 970,
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_495 = 971,
+
STR_CANCEL = 972,
STR_OK = 973,
@@ -166,6 +223,8 @@ enum {
STR_CONSTRUCTION = 990,
+ STR_STATION_PLATFORM = 991,
+
STR_DEMOLISH_RIDE_TIP = 992,
STR_DEMOLISH_RIDE = 993,
STR_DEMOLISH = 994,
@@ -197,6 +256,11 @@ enum {
STR_LOCATE_SUBJECT_TIP = 1027,
STR_OFF_EDGE_OF_MAP = 1028,
+ STR_CANNOT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_WATER = 1029,
+ STR_CAN_ONLY_BUILD_THIS_UNDERWATER = 1030,
+ STR_RIDE_CANT_BUILD_THIS_UNDERWATER = 1031,
+ STR_CAN_ONLY_BUILD_THIS_ON_WATER = 1032,
+ STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND = 1033,
STR_CAN_ONLY_BUILD_THIS_ON_LAND = 1034,
STR_LOAD_GAME_DIALOG_TITLE = 1036,
@@ -304,6 +368,11 @@ enum {
STR_SELECT_VEHICLE_COLOUR_SCHEME_TIP = 1140,
STR_SELECT_VEHICLE_TO_MODIFY_TIP = 1141,
+ STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION = 1144,
+ STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION = 1145,
+ STR_ENTRANCE_NOT_YET_BUILT = 1146,
+ STR_EXIT_NOT_YET_BUILT = 1147,
+
STR_QUARTER_LOAD = 1148,
STR_HALF_LOAD = 1149,
STR_THREE_QUARTER_LOAD = 1150,
@@ -411,6 +480,31 @@ enum {
STR_QUEUE_TIME_MINUTE = 1359,
STR_QUEUE_TIME_MINUTES = 1360,
+ STR_TOO_HIGH_FOR_SUPPORTS = 1363,
+
+ STR_IN_LINE_TWIST_LEFT = 1365,
+ STR_IN_LINE_TWIST_RIGHT = 1366,
+ STR_HALF_LOOP = 1367,
+ STR_HALF_CORKSCREW_LEFT = 1368,
+ STR_HALF_CORKSCREW_RIGHT = 1369,
+ STR_BARREL_ROLL_LEFT = 1370,
+ STR_BARREL_ROLL_RIGHT = 1371,
+ STR_LAUNCHED_LIFT_HILL = 1372,
+ STR_LARGE_HALF_LOOP_LEFT = 1373,
+ STR_LARGE_HALF_LOOP_RIGHT = 1374,
+ STR_UPPER_TRANSFER = 1375,
+ STR_LOWER_TRANSFER = 1376,
+ STR_HEARTLINE_ROLL_LEFT = 1377,
+ STR_HEARTLINE_ROLL_RIGHT = 1378,
+ STR_REVERSER_LEFT = 1379,
+ STR_REVERSER_RIGHT = 1380,
+ STR_CURVED_LIFT_HILL_LEFT = 1381,
+ STR_CURVED_LIFT_HILL_RIGHT = 1382,
+ STR_QUARTER_LOOP = 1383,
+
+ STR_RIDE_CONSTRUCTION_OTHER_TRACK_CONFIGURATIONS_TIP = 1385,
+ STR_RIDE_CONSTRUCTION_SPECIAL = 1386,
+
STR_VIEW_OF_RIDE_ATTRACTION_TIP = 1392,
STR_VEHICLE_DETAILS_AND_OPTIONS_TIP = 1393,
STR_OPERATING_OPTIONS_TIP = 1394,
@@ -420,6 +514,10 @@ enum {
STR_MEASUREMENTS_AND_TEST_DATA_TIP = 1398,
STR_GRAPHS_TIP = 1399,
+ STR_RIDE_CONSTRUCTION_ENTRANCE = 1400,
+ STR_RIDE_CONSTRUCTION_EXIT = 1401,
+ STR_RIDE_CONSTRUCTION_ENTRANCE_TIP = 1402,
+ STR_RIDE_CONSTRUCTION_EXIT_TIP = 1403,
STR_ROTATE_90_TIP = 1404,
STR_MIRROR_IMAGE_TIP = 1405,
STR_TOGGLE_SCENERY_TIP = 1406,
@@ -427,6 +525,9 @@ enum {
STR_BUILD_THIS = 1407,
STR_COST_LABEL = 1408,
+ STR_ENTRY_EXIT_PLATFORM = 1409,
+ STR_VERTICAL_TOWER = 1410,
+
STR_DATA_LOGGING_NOT_AVAILABLE_FOR_THIS_TYPE_OF_RIDE = 1412,
STR_DATA_LOGGING_WILL_START_WHEN_NEXT_LEAVES = 1413,
STR_LOGGING_DATA_FROM_TIP = 1422,
@@ -455,9 +556,20 @@ enum {
STR_LOOKING_AT_SCENERY = 1446,
STR_LEAVING_PARK = 1447,
STR_WATCHING_NEW_RIDE_BEING_CONSTRUCTED = 1448,
-
+
+ STR_RIDE_CONSTRUCTION_TRACK_STYLE = 1459,
+ STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP = 1460,
+ STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP = 1461,
+
+ STR_TOO_STEEP_FOR_LIFT_HILL = 1462,
+
STR_GUESTS = 1463,
+ STR_HELIX_UP_SMALL = 1464,
+ STR_HELIX_UP_LARGE = 1465,
+ STR_HELIX_DOWN_SMALL = 1466,
+ STR_HELIX_DOWN_LARGE = 1467,
+
STR_STAFF = 1468,
STR_RIDE_MUST_START_AND_END_WITH_STATIONS = 1469,
@@ -484,9 +596,27 @@ enum {
STR_TOTAL_CUSTOMERS = 1670,
STR_TOTAL_PROFIT = 1671,
+ STR_BRAKES = 1672,
+ STR_SPINNING_CONTROL_TOGGLE_TRACK = 1673,
+
+ STR_RIDE_CONSTRUCTION_BRAKE_SPEED = 1674,
+ STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP = 1676,
+
STR_POPULARITY_UNKNOWN = 1677,
STR_POPULARITY_PERCENT = 1678,
+ STR_HELIX_UP_LEFT = 1679,
+ STR_HELIX_UP_RIGHT = 1680,
+ STR_HELIX_DOWN_LEFT = 1681,
+ STR_HELIX_DOWN_RIGHT = 1682,
+ STR_BASE_SIZE_2_X_2 = 1683,
+ STR_BASE_SIZE_4_X_4 = 1684,
+ STR_BASE_SIZE_2_X_4 = 1685,
+ STR_BASE_SIZE_5_X_1 = 1686,
+ STR_WATER_SPLASH = 1687,
+ STR_BASE_SIZE_4_X_1 = 1688,
+ STR_BLOCK_BRAKES = 1689,
+
STR_GUESTS_TIP = 1693,
STR_STAFF_TIP = 1694,
@@ -523,6 +653,9 @@ enum {
STR_BANNER_TEXT = 1731,
+ STR_RIDE_CONSTRUCTION_BUILD = 1732,
+ STR_RIDE_CONSTRUCTION_MODE = 1733,
+
STR_NUMBER_OF_LAPS = 1734,
STR_NUMBER_OF_LAPS_TIP = 1735,
@@ -542,9 +675,24 @@ enum {
STR_ADMISSION_PRICE = 1756,
STR_RELIABILITY_LABEL_1757 = 1757,
+ STR_RIDE_CONSTRUCTION_BUILD_MODE = 1758,
+ STR_RIDE_CONSTRUCTION_MOVE_MODE = 1759,
+ STR_RIDE_CONSTRUCTION_FILL_IN_MODE = 1760,
+ STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP = 1761,
+
+ STR_WATERFALLS = 1762,
+ STR_RAPIDS = 1763,
+ STR_LOG_BUMPS = 1764,
+ STR_ON_RIDE_PHOTO_SECTION = 1765,
+ STR_REVERSER_TURNTABLE = 1766,
+ STR_SPINNING_TUNNEL = 1767,
+
STR_NUMBER_OF_SWINGS = 1769,
STR_NUMBER_OF_SWINGS_TIP = 1770,
+ STR_ONLY_ONE_ON_RIDE_PHOTO_PER_RIDE = 1773,
+ STR_ONLY_ONE_CABLE_LIFT_HILL_PER_RIDE = 1774,
+
STR_OFF = 1775,
STR_ON = 1776,
STR_MUSIC = 1777,
@@ -557,6 +705,8 @@ enum {
STR_ANSWERING_RADIO_CALL = 1795,
STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING = 1796,
+ STR_WHIRLPOOL = 1798,
+
STR_SAFETY_CUT_OUT = 1800,
STR_RESTRAINTS_STUCK_CLOSED = 1801,
STR_RESTRAINTS_STUCK_OPEN = 1802,
@@ -735,6 +885,11 @@ enum {
STR_COMPANY_VALUE_LABEL = 2227,
STR_LAST_MONTH_PROFIT_FROM_FOOD_DRINK_MERCHANDISE_SALES_LABEL = 2228,
+ STR_SLOPE_UP_TO_VERTICAL = 2229,
+ STR_VERTICAL_TRACK = 2230,
+ STR_HOLDING_BRAKE_FOR_DROP = 2231,
+ STR_CABLE_LIFT_HILL = 2232,
+
STR_PARK_INFORMATION_TIP = 2233,
STR_RECENT_MESSAGES = 2234,
@@ -995,6 +1150,17 @@ enum {
STR_SHORTCUT_DESCRIPTION_31 = 2524,
STR_INDIVIDUAL_KEYS_BASE = 2525,
+ STR_GOLF_HOLE_A = 3049,
+ STR_GOLF_HOLE_B = 3050,
+ STR_GOLF_HOLE_C = 3051,
+ STR_GOLF_HOLE_D = 3052,
+ STR_GOLF_HOLE_E = 3053,
+
+ STR_TOP_SECTION = 3069,
+ STR_SLOPE_TO_LEVEL = 3070,
+
+ STR_NOT_ALLOWED_TO_MODIFY_STATION = 3092,
+
// Cheats
STR_CHEAT_TITLE = 5217,
STR_CHEAT_TITLE_FINANCIAL = 5345,
@@ -1220,6 +1386,9 @@ enum {
STR_HEDGES = 3059,
STR_ICE_BLOCKS = 3060,
STR_WOODEN_FENCES = 3061,
+
+ STR_RIDE_CONSTRUCTION_STANDARD_RC_TRACK_TIP = 3062,
+ STR_RIDE_CONSTRUCTION_WATER_CHANNEL_TIP = 3063,
STR_BEGINNER_PARKS = 3064,
STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1,
@@ -1550,6 +1719,9 @@ enum {
STR_UP = 5375,
STR_DOWN = 5376,
+ STR_OBJECTS_SORT_TYPE = 5447,
+ STR_OBJECTS_SORT_RIDE = 5448,
+
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
STR_COUNT = 32768
};
diff --git a/src/object.c b/src/object.c
index 84004d2ac2..2056562cff 100644
--- a/src/object.c
+++ b/src/object.c
@@ -333,9 +333,19 @@ int object_load_packed(FILE *file)
*
* rct2: 0x006A9CAF
*/
-void object_unload(int groupIndex, rct_object_entry_extended *entry)
+void object_unload(rct_object_entry *entry)
{
- RCT2_CALLPROC_X(0x006A9CAF, 0, groupIndex, 0, 0, 0, 0, (int)entry);
+ uint8 object_type, object_index;
+ if (!find_object_in_entry_group(entry, &object_type, &object_index)){
+ return;
+ }
+
+ uint8* chunk = object_entry_groups[object_type].chunks[object_index];
+
+ object_paint(object_type, 1, 0, 0, 0, (int)chunk, 0, 0);
+
+ rct2_free(chunk);
+ object_entry_groups[object_type].chunks[object_index] = (char*)-1;
}
int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b)
@@ -1583,7 +1593,7 @@ int object_get_scenario_text(rct_object_entry *entry)
void object_free_scenario_text()
{
if (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*) != NULL) {
- rct2_free(RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*));
+ free(RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*));
RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*) = NULL;
}
}
diff --git a/src/object.h b/src/object.h
index cf5b735d61..7d80e1841a 100644
--- a/src/object.h
+++ b/src/object.h
@@ -80,7 +80,7 @@ typedef struct {
typedef struct {
uint8 category[2];
-
+ uint8 ride_type;
} rct_ride_filters;
typedef struct {
@@ -101,7 +101,7 @@ void object_unload_all();
int check_object_entry(rct_object_entry *entry);
int object_load(int groupIndex, rct_object_entry *entry, int* chunk_size);
int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSize, const rct_object_entry *installedObject);
-void object_unload(int groupIndex, rct_object_entry_extended *entry);
+void object_unload(rct_object_entry *entry);
int object_get_scenario_text(rct_object_entry *entry);
void object_free_scenario_text();
int object_get_length(rct_object_entry *entry);
diff --git a/src/object_list.c b/src/object_list.c
index d2a8dc5304..de0ac3f4c7 100644
--- a/src/object_list.c
+++ b/src/object_list.c
@@ -19,6 +19,7 @@
*****************************************************************************/
#include "addresses.h"
+#include "config.h"
#include "localisation/localisation.h"
#include "object.h"
#include "platform/platform.h"
@@ -576,7 +577,7 @@ void object_unload_all()
for (i = 0; i < OBJECT_ENTRY_GROUP_COUNT; i++)
for (j = 0; j < object_entry_group_counts[i]; j++)
if (object_entry_groups[i].chunks[j] != (uint8*)0xFFFFFFFF)
- object_unload(j, &object_entry_groups[i].entries[j]);
+ object_unload((rct_object_entry*)&object_entry_groups[i].entries[j]);
reset_loaded_objects();
}
@@ -727,7 +728,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in
log_error("Incorrect number of vanilla RCT2 objects.");
RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32)--;
RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32)--;
- object_unload(objectType, (rct_object_entry_extended*)entry);
+ object_unload(entry);
return 0;
}
}
@@ -738,29 +739,9 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in
load_object_filter(entry, chunk, filter);
-
- // When made of two parts i.e Wooden Roller Coaster (Dream Woodie Cars)
- if ((objectType == OBJECT_TYPE_RIDE) && (!((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) ||
- rideTypeShouldLoseSeparateFlag((rct_ride_type*)chunk))) {
- rct_ride_type* ride_type = (rct_ride_type*)chunk;
- rct_string_id obj_string = ride_type->ride_type[0];
- if (obj_string == 0xFF){
- obj_string = ride_type->ride_type[1];
- if (obj_string == 0xFF) {
- obj_string = ride_type->ride_type[2];
- }
- }
-
- format_string(installed_entry_pointer, obj_string + 2, 0);
- strcat(installed_entry_pointer, "\t (");
- strcat(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32)));
- strcat(installed_entry_pointer, ")");
- while (*installed_entry_pointer++);
- }
- else{
- strcpy(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32)));
- while (*installed_entry_pointer++);
- }
+ // Always extract only the vehicle type, since the track type is always displayed in the left column, to prevent duplicate track names.
+ strcpy(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32)));
+ while (*installed_entry_pointer++);
// This is deceptive. Due to setting the total no images earlier to 0xF26E
// this is actually the no_images in this entry.
@@ -788,17 +769,29 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in
uint32 size_of_object = installed_entry_pointer - (uint8*)installed_entry;
- object_unload(objectType, (rct_object_entry_extended*)entry);
+ object_unload(entry);
return size_of_object;
}
static void load_object_filter(rct_object_entry* entry, uint8* chunk, rct_object_filters* filter)
{
+ rct_ride_type *rideType;
+ rct_ride_filters *rideFilter;
+
switch (entry->flags & 0xF) {
case OBJECT_TYPE_RIDE:
- filter->ride.category[0] = ((rct_ride_type*)chunk)->category[0];
- filter->ride.category[1] = ((rct_ride_type*)chunk)->category[1];
+ rideType = ((rct_ride_type*)chunk);
+ rideFilter = &(filter->ride);
+
+ rideFilter->category[0] = rideType->category[0];
+ rideFilter->category[1] = rideType->category[1];
+
+ for (int i = 0; i < 3; i++) {
+ rideFilter->ride_type = rideType->ride_type[i];
+ if (rideFilter->ride_type != 255)
+ break;
+ }
break;
case OBJECT_TYPE_SMALL_SCENERY:
case OBJECT_TYPE_LARGE_SCENERY:
diff --git a/src/rct2.c b/src/rct2.c
index 0b3068ebe5..c2efdc4e92 100644
--- a/src/rct2.c
+++ b/src/rct2.c
@@ -512,9 +512,9 @@ void *rct2_realloc(void *block, size_t numBytes)
/**
* RCT2 and this DLL can not free each other's allocated memory blocks. Use this to free memory that was allocated by RCT2.
- * rct2: 0x004068DE
+ * rct2: 0x004068CD
*/
void rct2_free(void *block)
{
- RCT2_CALLPROC_1(0x004068DE, void*, block);
+ RCT2_CALLPROC_1(0x004068CD, void*, block);
}
diff --git a/src/ride/ride.c b/src/ride/ride.c
index 47f5fb312f..6d557a5082 100644
--- a/src/ride/ride.c
+++ b/src/ride/ride.c
@@ -328,7 +328,7 @@ int sub_6CAF80(int rideIndex, rct_xy_element *output)
*
* rct2: 0x006C60C2
*/
-int track_get_next(rct_xy_element *input, rct_xy_element *output)
+bool track_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction)
{
int eax, ebx, ecx, edx, esi, edi, ebp, result;
@@ -339,10 +339,37 @@ int track_get_next(rct_xy_element *input, rct_xy_element *output)
output->x = *((uint16*)&eax);
output->y = *((uint16*)&ecx);
output->element = (rct_map_element*)esi;
+ if (z != NULL) *z = (edx & 0xFFFF);
+ if (direction != NULL) *direction = (ebx & 0xFF);
return (result & 0x100) == 0;
}
+/**
+ *
+ * rct2: 0x006C6402
+ */
+bool track_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd)
+{
+ int eax, ebx, ecx, edx, esi, edi, ebp;
+
+ eax = x;
+ ecx = y;
+ esi = (int)mapElement;
+ int result = RCT2_CALLFUNC_X(0x006C6402, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
+ if (outTrackBeginEnd != NULL) {
+ outTrackBeginEnd->begin_x = ((eax >> 16) & 0xFFFF);
+ outTrackBeginEnd->begin_y = ((ecx >> 16) & 0xFFFF);
+ outTrackBeginEnd->begin_z = (edx & 0xFFFF);
+ outTrackBeginEnd->begin_direction = ((ebx >> 8) & 0xFF);
+ outTrackBeginEnd->begin_element = (rct_map_element*)esi;
+ outTrackBeginEnd->end_x = (eax & 0xFFFF);
+ outTrackBeginEnd->end_y = (ecx & 0xFFFF);
+ outTrackBeginEnd->end_direction = (ebx & 0xFF);
+ }
+ return (result & 0x100) == 0;
+}
+
/**
*
* Make sure to pass in the x and y of the start track element too.
@@ -367,12 +394,12 @@ int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output)
return 0;
w = window_find_by_class(WC_RIDE_CONSTRUCTION);
- if (w != NULL && RCT2_GLOBAL(0x00F440A6, uint8) != 0 && RCT2_GLOBAL(0x00F440A7, uint8) == rideIndex)
+ if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex)
sub_6C9627();
loopTrackElement = NULL;
while (1) {
- if (!track_get_next(&trackElement, &nextTrackElement)) {
+ if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) {
*output = trackElement;
return 1;
}
@@ -544,11 +571,11 @@ static rct_window *ride_create_or_find_construction_window(int rideIndex)
w = window_find_by_class(WC_RIDE_CONSTRUCTION);
if (w == NULL || w->number != rideIndex) {
window_close_construction_windows();
- RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex;
- w = window_construction_open(rideIndex);
+ _currentRideIndex = rideIndex;
+ w = window_ride_construction_open(rideIndex);
} else {
sub_6C9627();
- RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex;
+ _currentRideIndex = rideIndex;
}
return w;
@@ -604,15 +631,6 @@ void ride_construct(int rideIndex)
}
}
-/**
- *
- * rct2: 0x006C84CE
- */
-static void sub_6C84CE()
-{
- RCT2_CALLPROC_X(0x006C84CE, 0, 0, 0, 0, 0, 0, 0);
-}
-
/**
*
* rct2: 0x006DD4D5
@@ -779,7 +797,9 @@ void ride_remove_peeps(int rideIndex)
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN;
}
-/* rct2: 0x006C683D
+/**
+ * Gets the origin track element (sequence 0). Seems to do more than that though and even invalidates track.
+ * rct2: 0x006C683D
* ax : x
* bx : direction << 8, type
* cx : y
@@ -790,49 +810,38 @@ void ride_remove_peeps(int rideIndex)
*/
int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_params, rct_map_element** output_element, uint16 flags)
{
- rct_map_element* map_element = map_get_first_element_at(*x / 32, *y / 32);
- rct_map_element* success_map = NULL;
+ rct_map_element *mapElement = map_get_first_element_at(*x / 32, *y / 32);
+ rct_map_element *successMapElement = NULL;
- do{
- if (map_element->base_height != *z / 8)
+ do {
+ if (mapElement->base_height != *z / 8)
continue;
- if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_TRACK)
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK)
continue;
- if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != direction)
+ if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction)
continue;
- if (type != map_element->properties.track.type)
+ if (type != mapElement->properties.track.type)
continue;
- success_map = map_element;
- if (!(map_element->properties.track.sequence & 0xF))
+ successMapElement = mapElement;
+ if ((mapElement->properties.track.sequence & 0x0F) == 0)
break;
- }while(!map_element_is_last_for_tile(map_element++));
+ } while (!map_element_is_last_for_tile(mapElement++));
- map_element = success_map;
-
- if (map_element == NULL){
+ mapElement = successMapElement;
+ if (mapElement == NULL)
return 1;
- }
- // Possibly z should be &0xF8
- rct_ride* ride = GET_RIDE(map_element->properties.track.ride_index);
- rct_preview_track *trackBlock;
+ // Possibly z should be & 0xF8
+ const rct_preview_track *trackBlock = get_track_def_from_ride_index(mapElement->properties.track.ride_index, type);
- if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_FLAT_RIDE){
- trackBlock = RCT2_ADDRESS(0x00994A38, rct_preview_track*)[type];
- }
- else{
- trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[type];
- }
+ int sequence = mapElement->properties.track.sequence & 0x0F;
+ uint8 mapDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK;
- int sequence = map_element->properties.track.sequence & 0xF;
-
- uint8 map_direction = map_element->type & MAP_ELEMENT_DIRECTION_MASK;
-
- switch (map_direction){
+ switch (mapDirection){
case MAP_ELEMENT_DIRECTION_WEST:
*x -= trackBlock[sequence].x;
*y -= trackBlock[sequence].y;
@@ -850,17 +859,13 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par
*y -= trackBlock[sequence].x;
break;
}
-
*z -= trackBlock[sequence].z;
int start_x = *x, start_y = *y, start_z = *z;
-
*z += trackBlock[0].z;
-
- for (int i = 0; trackBlock[i].var_00 != 0xFF; ++i){
+ for (int i = 0; trackBlock[i].index != 0xFF; ++i){
int cur_x = start_x, cur_y = start_y, cur_z = start_z;
-
- switch (map_direction){
+ switch (mapDirection){
case MAP_ELEMENT_DIRECTION_WEST:
cur_x += trackBlock[i].x;
cur_y += trackBlock[i].y;
@@ -878,134 +883,334 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par
cur_y += trackBlock[i].x;
break;
}
-
cur_z += trackBlock[i].z;
map_invalidate_tile_full(cur_x, cur_y);
- map_element = map_get_first_element_at(cur_x / 32, cur_y / 32);
- success_map = NULL;
-
- do{
- if (map_element->base_height != cur_z / 8)
+ mapElement = map_get_first_element_at(cur_x / 32, cur_y / 32);
+ successMapElement = NULL;
+ do {
+ if (mapElement->base_height != cur_z / 8)
continue;
- if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_TRACK)
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK)
continue;
- if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != direction)
+ if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction)
continue;
- if ((map_element->properties.track.sequence & 0xF) != trackBlock[i].var_00)
+ if ((mapElement->properties.track.sequence & 0xF) != trackBlock[i].index)
continue;
- if (type == map_element->properties.track.type)
- {
- success_map = map_element;
+ if (type == mapElement->properties.track.type) {
+ successMapElement = mapElement;
break;
}
- } while (!map_element_is_last_for_tile(map_element++));
+ } while (!map_element_is_last_for_tile(mapElement++));
- if (success_map == NULL){
+ if (successMapElement == NULL) {
return 1;
}
-
- if (i == 0 && output_element != NULL)
- *output_element = map_element;
-
- if (flags & (1 << 0)){
- // Quadrant related ??
- map_element->type &= ~(1 << 6);
+ if (i == 0 && output_element != NULL) {
+ *output_element = mapElement;
}
-
- if (flags & (1 << 1)){
- // Quadrant related ??
- map_element->type |= (1 << 6);
+ if (flags & (1 << 0)) {
+ // Switch highlight off
+ mapElement->type &= ~MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT;
}
-
- if (flags & (1 << 2)){
- map_element->properties.track.colour &= 0xFC;
- map_element->properties.track.colour |= extra_params & 0xFF;
+ if (flags & (1 << 1)) {
+ // Switch highlight on
+ mapElement->type |= MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT;
}
-
- if (flags & (1 << 5)){
- map_element->properties.track.colour &= 0x0F;
- map_element->properties.track.colour |= (extra_params & 0xFF) << 4;
+ if (flags & (1 << 2)) {
+ mapElement->properties.track.colour &= 0xFC;
+ mapElement->properties.track.colour |= extra_params & 0xFF;
}
-
- if (flags & (1 << 3)){
- map_element->properties.track.colour |= (1 << 3);
+ if (flags & (1 << 5)) {
+ // Seat rotation
+ mapElement->properties.track.colour &= 0x0F;
+ mapElement->properties.track.colour |= (extra_params & 0xFF) << 4;
}
-
- if (flags & (1 << 4)){
- map_element->properties.track.colour &= 0xF7;
+ if (flags & (1 << 3)) {
+ mapElement->properties.track.colour |= (1 << 3);
+ }
+ if (flags & (1 << 4)) {
+ mapElement->properties.track.colour &= 0xF7;
}
}
return 0;
}
+/**
+ *
+ * rct2: 0x006C6096
+ */
+rct_map_element *sub_6C6096(int *x, int *y, int *z, int *direction, int *direction2)
+{
+ int eax, ebx, ecx, edx, esi, edi, ebp;
+ eax = *x;
+ ecx = *y;
+ edx = *z;
+ ebx = *direction;
+ if (RCT2_CALLFUNC_X(0x006C6096, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100)
+ return NULL;
+
+ *x = (eax & 0xFFFF);
+ *y = (ecx & 0xFFFF);
+ *z = (edx & 0xFFFF);
+ *direction = (ebx & 0xFF);
+ if (direction2 != NULL) *direction2 = ((ebx >> 8) & 0xFF);
+
+ return (rct_map_element*)esi;
+}
+
+/**
+ * Returns the begin position / direction and end position / direction of the track piece that procedes the given location.
+ * rct2: 0x006C63D6
+ */
+bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *outTrackBeginEnd)
+{
+ int eax, ebx, ecx, edx, esi, edi, ebp;
+ eax = inX;
+ ecx = inY;
+ edx = inZ;
+ ebx = inDirection;
+ if (RCT2_CALLFUNC_X(0x006C63D6, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100)
+ return false;
+
+ if (outTrackBeginEnd != NULL) {
+ outTrackBeginEnd->begin_x = ((eax >> 16) & 0xFFFF);
+ outTrackBeginEnd->begin_y = ((ecx >> 16) & 0xFFFF);
+ outTrackBeginEnd->begin_z = (edx & 0xFFFF);
+ outTrackBeginEnd->begin_direction = ((ebx >> 8) & 0xFF);
+ outTrackBeginEnd->begin_element = (rct_map_element*)esi;
+ outTrackBeginEnd->end_x = (eax & 0xFFFF);
+ outTrackBeginEnd->end_y = (ecx & 0xFFFF);
+ outTrackBeginEnd->end_direction = (ebx & 0xFF);
+ }
+ return true;
+}
+
+/**
+ *
+ * rct2: 0x006C96C0
+ */
void sub_6C96C0()
{
- RCT2_CALLPROC_X(0x006C96C0, 0, 0, 0, 0, 0, 0, 0);
+ // RCT2_CALLPROC_X(0x006C96C0, 0, 0, 0, 0, 0, 0, 0); return;
+
+ rct_ride *ride;
+ rct_map_element *trackElement;
+ int rideIndex, x, y, z, direction;
+
+ if (_currentTrackSelectionFlags & 4) {
+ _currentTrackSelectionFlags &= ~4;
+ game_do_command(
+ RCT2_GLOBAL(0x00F440BF, uint16),
+ 41,
+ RCT2_GLOBAL(0x00F440C1, uint16),
+ _currentRideIndex,
+ GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT,
+ RCT2_GLOBAL(0x00F440C4, uint8),
+ 0
+ );
+ }
+ if (_currentTrackSelectionFlags & 2) {
+ _currentTrackSelectionFlags &= ~2;
+
+ rideIndex = _currentRideIndex;
+ RCT2_GLOBAL(0x00F441D2, uint8) = rideIndex;
+
+ x = RCT2_GLOBAL(0x00F440C5, uint16);
+ y = RCT2_GLOBAL(0x00F440C7, uint16);
+ z = RCT2_GLOBAL(0x00F440C9, uint16);
+
+ ride = GET_RIDE(rideIndex);
+ if (ride->type == RIDE_TYPE_MAZE) {
+ game_do_command(x , 41 | (0 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_38, z, 0);
+ game_do_command(x , 41 | (1 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_38, z, 0);
+ game_do_command(x + 16, 41 | (2 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_38, z, 0);
+ game_do_command(x + 16, 41 | (3 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_38, z, 0);
+ } else {
+ direction = RCT2_GLOBAL(0x00F440CB, uint8);
+ if (!(direction & 4)) {
+ x -= TileDirectionDelta[direction].x;
+ y -= TileDirectionDelta[direction].y;
+ }
+ trackElement = sub_6C6096(&x, &y, &z, &direction, NULL);
+ if (trackElement != NULL) {
+ game_do_command(
+ x,
+ 105 | ((direction & 3) << 8),
+ y,
+ trackElement->properties.track.type | ((trackElement->properties.track.sequence & 0x0F) << 8),
+ GAME_COMMAND_REMOVE_TRACK,
+ z,
+ 0
+ );
+ }
+ }
+ }
}
void sub_6C9627()
{
- switch (RCT2_GLOBAL(0x00F440A6, uint8)) {
- case 3:
- {
- int x = RCT2_GLOBAL(0x00F440A8, uint16), y = RCT2_GLOBAL(0x00F440AA, uint16), z = RCT2_GLOBAL(0x00F440AC, uint16);
+ int x, y, z;
+
+ switch (_rideConstructionState) {
+ case RIDE_CONSTRUCTION_STATE_SELECTED:
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
sub_6C683D(
&x,
&y,
&z,
- RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) & 3,
- RCT2_GLOBAL(0x00F440AF, uint8),
- 0,
+ _currentTrackPieceDirection & 3,
+ _currentTrackPieceType,
0,
+ NULL,
1
- );
- }
+ );
break;
- case 6:
- case 7:
- case 8:
- if (RCT2_GLOBAL(0x00F440B0, uint8) & 1) {
+ case RIDE_CONSTRUCTION_STATE_6:
+ case RIDE_CONSTRUCTION_STATE_7:
+ case RIDE_CONSTRUCTION_STATE_8:
+ if (_currentTrackSelectionFlags & 1) {
map_invalidate_tile_full(
- RCT2_GLOBAL(0x00F440A8, uint16) & 0xFFE0,
- RCT2_GLOBAL(0x00F440AA, uint16) & 0xFFE0
+ _currentTrackBeginX & 0xFFE0,
+ _currentTrackBeginY & 0xFFE0
);
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~4;
}
break;
default:
- if (RCT2_GLOBAL(0x00F440B0, uint8) & 1) {
- RCT2_GLOBAL(0x00F440B0, uint8) &= ~1;
+ if (_currentTrackSelectionFlags & 1) {
+ _currentTrackSelectionFlags &= ~1;
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint8) &= ~4;
- map_invalidate_tile_full(RCT2_GLOBAL(0x00F440A8, uint16), RCT2_GLOBAL(0x00F440AA, uint16));
+ map_invalidate_tile_full(_currentTrackBeginX, _currentTrackBeginY);
}
sub_6C96C0();
break;
}
}
+/**
+ *
+ * rct2: 0x006C9800
+ */
+void sub_6C9800()
+{
+ RCT2_CALLPROC_EBPSAFE(0x006C9800);
+}
+
/**
*
* rct2: 0x006C9296
*/
-static void sub_6C9296()
+void ride_select_next_section()
{
- RCT2_CALLPROC_X(0x006C9296, 0, 0, 0, 0, 0, 0, 0);
+ int x, y, z, direction, type;
+ rct_map_element *mapElement;
+ rct_xy_element inputElement, outputElement;
+
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ sub_6C9627();
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ direction = _currentTrackPieceDirection;
+ type = _currentTrackPieceType;
+ if (sub_6C683D(&x, &y, &z, direction & 3, type, 0, &mapElement, 0)) {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_0;
+ sub_6C84CE();
+ return;
+ }
+ inputElement.x = x;
+ inputElement.y = y;
+ inputElement.element = mapElement;
+ if (track_get_next(&inputElement, &outputElement, &z, &direction)) {
+ x = outputElement.x;
+ y = outputElement.y;
+ mapElement = outputElement.element;
+ } else {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT;
+ _currentTrackBeginX = outputElement.x;
+ _currentTrackBeginY = outputElement.y;
+ _currentTrackBeginZ = z;
+ _currentTrackPieceDirection = direction;
+ _currentTrackPieceType = mapElement->properties.track.type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ sub_6C9800();
+ sub_6C84CE();
+ return;
+ }
+
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = z;
+ _currentTrackPieceDirection = (mapElement->type & MAP_ELEMENT_DIRECTION_MASK);
+ _currentTrackPieceType = mapElement->properties.track.type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ sub_6C84CE();
+ } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) {
+ if (ride_select_forwards_from_back()) {
+ sub_6C84CE();
+ }
+ }
}
/**
*
* rct2: 0x006C93B8
*/
-static void sub_6C93B8()
+void ride_select_previous_section()
{
- RCT2_CALLPROC_X(0x006C93B8, 0, 0, 0, 0, 0, 0, 0);
+ int x, y, z, direction, type;
+ rct_map_element *mapElement;
+ track_begin_end trackBeginEnd;
+
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ sub_6C9627();
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ direction = _currentTrackPieceDirection;
+ type = _currentTrackPieceType;
+ if (sub_6C683D(&x, &y, &z, direction & 3, type, 0, &mapElement, 0)) {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_0;
+ sub_6C84CE();
+ return;
+ }
+ if (track_get_previous(x, y, mapElement, &trackBeginEnd)) {
+ _currentTrackBeginX = trackBeginEnd.begin_x;
+ _currentTrackBeginY = trackBeginEnd.begin_y;
+ _currentTrackBeginZ = trackBeginEnd.begin_z;
+ _currentTrackPieceDirection = trackBeginEnd.begin_direction;
+ _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ sub_6C84CE();
+ } else {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_BACK;
+ _currentTrackBeginX = trackBeginEnd.end_x;
+ _currentTrackBeginY = trackBeginEnd.end_y;
+ _currentTrackBeginZ = trackBeginEnd.begin_z;
+ _currentTrackPieceDirection = trackBeginEnd.end_direction;
+ _currentTrackPieceType = mapElement->properties.track.type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ sub_6C9800();
+ sub_6C84CE();
+ }
+ } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) {
+ if (ride_select_backwards_from_front()) {
+ sub_6C84CE();
+ }
+ }
}
/**
@@ -1038,7 +1243,7 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int
sub_6C9627();
if (
- RCT2_GLOBAL(0x00F440A6, uint8) != 5 ||
+ _rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT ||
!(RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) & INPUT_FLAG_TOOL_ACTIVE) ||
RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) != WC_RIDE_CONSTRUCTION
) {
@@ -1048,17 +1253,16 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int
RCT2_GLOBAL(0x00F44192, uint8) = rideIndex;
RCT2_GLOBAL(0x00F44193, uint8) = bl;
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) |= INPUT_FLAG_6;
- int al = RCT2_GLOBAL(0x00F440A6, uint8);
- if (al != 5) {
- RCT2_GLOBAL(0x00F440A6, uint8) = 5;
- RCT2_GLOBAL(0x00F440CC, uint8) = al;
+ if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) {
+ RCT2_GLOBAL(0x00F440CC, uint8) = _rideConstructionState;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT;
}
sub_6C84CE();
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2;
} else {
// Remove entrance / exit
- game_do_command(x, 9, y, rideIndex, GAME_COMMAND_13, bl, 0);
+ game_do_command(x, 9, y, rideIndex, GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, bl, 0);
RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) = entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE ? 29 : 30;
RCT2_GLOBAL(0x00F44191, uint8) = entranceType;
}
@@ -1073,13 +1277,13 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int
*/
int ride_modify_maze(rct_map_element *mapElement, int x, int y)
{
- RCT2_GLOBAL(0x00F440A7, uint8) = mapElement->properties.track.ride_index;
- RCT2_GLOBAL(0x00F440A6, uint8) = 6;
- RCT2_GLOBAL(0x00F440A8, uint16) = x;
- RCT2_GLOBAL(0x00F440AA, uint16) = y;
- RCT2_GLOBAL(0x00F440AC, uint16) = mapElement->base_height * 8;
- RCT2_GLOBAL(0x00F440B0, uint8) = 0;
- RCT2_GLOBAL(0x00F440B1, uint8) = 0;
+ _currentRideIndex = mapElement->properties.track.ride_index;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_6;
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = mapElement->base_height * 8;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
RCT2_CALLPROC_X(0x006CD887, 0, 0, 0, 0, 0, 0, 0);
return 1;
}
@@ -1139,50 +1343,50 @@ int ride_modify(rct_xy_element *input)
direction = mapElement.element->type & 3;
type = mapElement.element->properties.track.type;
- if (sub_6C683D(&x, &y, &z, direction, type, 0, 0, 0))
+ if (sub_6C683D(&x, &y, &z, direction, type, 0, NULL, 0))
return 0;
- RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex;
- RCT2_GLOBAL(0x00F440A6, uint8) = 3;
- RCT2_GLOBAL(0x00F440A8, uint16) = x;
- RCT2_GLOBAL(0x00F440AA, uint16) = y;
- RCT2_GLOBAL(0x00F440AC, uint16) = z;
- RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction;
- RCT2_GLOBAL(0x00F440AF, uint8) = type;
- RCT2_GLOBAL(0x00F440B0, uint8) = 0;
- RCT2_GLOBAL(0x00F440B1, uint8) = 0;
+ _currentRideIndex = rideIndex;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED;
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = z;
+ _currentTrackPieceDirection = direction;
+ _currentTrackPieceType = type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15)) {
sub_6C84CE();
return 1;
}
- sub_6C9296();
- if (RCT2_GLOBAL(0x00F440A6, uint8) == 1) {
+ ride_select_next_section();
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) {
sub_6C84CE();
return 1;
}
- RCT2_GLOBAL(0x00F440A6, uint8) = 3;
- RCT2_GLOBAL(0x00F440A8, uint16) = x;
- RCT2_GLOBAL(0x00F440AA, uint16) = y;
- RCT2_GLOBAL(0x00F440AC, uint16) = z;
- RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction;
- RCT2_GLOBAL(0x00F440AF, uint8) = type;
- RCT2_GLOBAL(0x00F440B0, uint8) = 0;
- RCT2_GLOBAL(0x00F440B1, uint8) = 0;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED;
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = z;
+ _currentTrackPieceDirection = direction;
+ _currentTrackPieceType = type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
- sub_6C93B8();
+ ride_select_previous_section();
- if (RCT2_GLOBAL(0x00F440A6, uint8) != 2) {
- RCT2_GLOBAL(0x00F440A6, uint8) = 3;
- RCT2_GLOBAL(0x00F440A8, uint16) = x;
- RCT2_GLOBAL(0x00F440AA, uint16) = y;
- RCT2_GLOBAL(0x00F440AC, uint16) = z;
- RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction;
- RCT2_GLOBAL(0x00F440AF, uint8) = type;
- RCT2_GLOBAL(0x00F440B0, uint8) = 0;
- RCT2_GLOBAL(0x00F440B1, uint8) = 0;
+ if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_BACK) {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED;
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = z;
+ _currentTrackPieceDirection = direction;
+ _currentTrackPieceType = type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
}
sub_6C84CE();
@@ -1212,24 +1416,24 @@ int sub_6CC3FB(int rideIndex)
tool_set(w, 23, 12);
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6;
- ride = GET_RIDE(RCT2_GLOBAL(0x00F440A7, uint8));
+ ride = GET_RIDE(_currentRideIndex);
- RCT2_GLOBAL(0x00F440A0, uint16) = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100;
- RCT2_GLOBAL(0x00F440B2, uint8) = 0;
+ _currentTrackCurve = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100;
+ _currentTrackSlopeEnd = 0;
RCT2_GLOBAL(0x00F440B3, uint8) = 0;
- RCT2_GLOBAL(0x00F440B4, uint8) = 0;
- RCT2_GLOBAL(0x00F440B5, uint8) = 0;
+ _currentTrackLiftHill = 0;
+ _currentTrackCovered = 0;
if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x8000)
- RCT2_GLOBAL(0x00F440B5, uint8) |= 2;
+ _currentTrackCovered |= 2;
- RCT2_GLOBAL(0x00F440B6, uint8) = 0;
- RCT2_GLOBAL(0x00F440B7, uint8) = 0;
+ _previousTrackBankEnd = 0;
+ _previousTrackSlopeEnd = 0;
- RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 0;
- RCT2_GLOBAL(0x00F440A6, uint8) = 4;
- RCT2_GLOBAL(0x00F440B0, uint8) = 0;
- RCT2_GLOBAL(0x00F440B1, uint8) = 0;
+ _currentTrackPieceDirection = 0;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_PLACE;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
RCT2_GLOBAL(0x00F44159, uint8) = 0;
RCT2_GLOBAL(0x00F4415C, uint8) = 0;
@@ -3339,12 +3543,12 @@ int ride_check_block_brakes(rct_xy_element *input, rct_xy_element *output)
trackElement = *input;
rideIndex = trackElement.element->properties.track.ride_index;
w = window_find_by_class(WC_RIDE_CONSTRUCTION);
- if (w != NULL && RCT2_GLOBAL(0x00F440A6, uint8) != 0 && RCT2_GLOBAL(0x00F440A7, uint8) == rideIndex)
+ if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex)
sub_6C9627();
loopTrackElement = NULL;
while (1) {
- if (!track_get_next(&trackElement, &nextTrackElement)) {
+ if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) {
// Not sure why this is the case...
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_STATION;
*output = trackElement;
@@ -3502,7 +3706,7 @@ void sub_6B4D26(int rideIndex, rct_xy_element *startElement)
currentElement.element->flags &= ~(1 << 5);
break;
}
- } while (track_get_next(¤tElement, ¤tElement) && currentElement.element != startElement->element);
+ } while (track_get_next(¤tElement, ¤tElement, NULL, NULL) && currentElement.element != startElement->element);
}
}
@@ -4091,7 +4295,7 @@ int ride_get_refund_price(int ride_id)
}else{
edx |= 0xFF << 8;
edx &= ((map_element->properties.track.sequence & 0xF) << 8) | 0xFF;
- RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_4, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
+ RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_REMOVE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
}
y -= 32;
break;
@@ -4509,7 +4713,6 @@ void ride_all_has_any_track_elements(bool *rideIndexArray)
}
}
-
/* rct2: 0x006847BA */
void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images){
char bitmap[200][200] = { 0 };
@@ -4590,4 +4793,115 @@ void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int n
vehicle_type->var_0E = al;
vehicle_type->var_0F = bl;
vehicle_type->var_10 = bh;
+}
+
+/**
+ *
+ * rct2: 0x006CA28C
+ */
+money32 ride_get_entrance_or_exit_price(int rideIndex, int x, int y, int direction, int dh, int di)
+{
+ int eax, ebx, ecx, edx, esi, edi, ebp;
+ eax = x;
+ ebx = direction << 8;
+ ecx = y;
+ edx = rideIndex | (dh << 8);
+ edi = di;
+ RCT2_CALLFUNC_X(0x006CA28C, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
+ return ebx;
+
+}
+
+/**
+ *
+ * rct2: 0x006CCF70
+ */
+void ride_get_entrance_or_exit_position_from_screen_position(int x, int y, int *outX, int *outY, int *outDirection)
+{
+ int eax, ebx, ecx, edx, esi, edi, ebp;
+ eax = x;
+ ebx = y;
+ RCT2_CALLFUNC_X(0x006CCF70, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
+
+ if (outX != NULL) *outX = eax & 0xFFFF;
+ if (outY != NULL) *outY = ecx & 0xFFFF;
+ if (outDirection != NULL) *outDirection = ebx & 0xFF;
+}
+
+bool ride_select_backwards_from_front()
+{
+ track_begin_end trackBeginEnd;
+
+ sub_6C9627();
+ RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex;
+ if (sub_6C63D6(_currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ, _currentTrackPieceDirection, &trackBeginEnd)) {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED;
+ _currentTrackBeginX = trackBeginEnd.begin_x;
+ _currentTrackBeginY = trackBeginEnd.begin_y;
+ _currentTrackBeginZ = trackBeginEnd.begin_z;
+ _currentTrackPieceDirection = trackBeginEnd.begin_direction;
+ _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool ride_select_forwards_from_back()
+{
+ rct_map_element *mapElement;
+ int x, y, z, direction;
+
+ sub_6C9627();
+ RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex;
+
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ direction = _currentTrackPieceDirection ^ 2;
+ mapElement = sub_6C6096(&x, &y, &z, &direction, NULL);
+ if (mapElement != NULL) {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED;
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = z;
+ _currentTrackPieceDirection = (mapElement->type & MAP_ELEMENT_DIRECTION_MASK);
+ _currentTrackPieceType = mapElement->properties.track.type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+money32 ride_remove_track_piece(int x, int y, int z, int direction, int type)
+{
+ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS;
+ return game_do_command(x, (GAME_COMMAND_FLAG_APPLY) | ((direction & 3) << 8), y, type, GAME_COMMAND_REMOVE_TRACK, z, 0);
+}
+
+/**
+ *
+ * rct2: 0x006B58EF
+ */
+bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride)
+{
+ if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP))
+ return true;
+
+ for (int i = 0; i < 4; i++) {
+ if (ride->station_starts[i] == 0xFFFF) continue;
+ if (ride->entrances[i] == 0xFFFF) {
+ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_ENTRANCE_NOT_YET_BUILT;
+ return false;
+ }
+ if (ride->exits[i] == 0xFFFF) {
+ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_EXIT_NOT_YET_BUILT;
+ return false;
+ }
+ }
+ return true;
}
\ No newline at end of file
diff --git a/src/ride/ride.h b/src/ride/ride.h
index 89e4217418..c367858517 100644
--- a/src/ride/ride.h
+++ b/src/ride/ride.h
@@ -21,6 +21,7 @@
#ifndef _RIDE_H_
#define _RIDE_H_
+#include "../addresses.h"
#include "../common.h"
#include "../peep/peep.h"
#include "../world/map.h"
@@ -343,6 +344,18 @@ typedef struct {
uint8 altitude[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x384C
} rct_ride_measurement;
+typedef struct {
+ int begin_x;
+ int begin_y;
+ int begin_z;
+ int begin_direction;
+ rct_map_element *begin_element;
+ int end_x;
+ int end_y;
+ int end_direction;
+ rct_map_element *end_element;
+} track_begin_end;
+
enum {
RIDE_CLASS_RIDE,
RIDE_CLASS_SHOP_OR_STALL,
@@ -747,6 +760,18 @@ enum {
RIDE_CRASH_TYPE_FATALITIES = 8
};
+enum {
+ RIDE_CONSTRUCTION_STATE_0,
+ RIDE_CONSTRUCTION_STATE_FRONT,
+ RIDE_CONSTRUCTION_STATE_BACK,
+ RIDE_CONSTRUCTION_STATE_SELECTED,
+ RIDE_CONSTRUCTION_STATE_PLACE,
+ RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT,
+ RIDE_CONSTRUCTION_STATE_6,
+ RIDE_CONSTRUCTION_STATE_7,
+ RIDE_CONSTRUCTION_STATE_8
+};
+
#define MAX_RIDES 255
#define MAX_RIDE_MEASUREMENTS 8
@@ -776,6 +801,43 @@ extern rct_ride* g_ride_list;
extern const uint8 gRideClassifications[255];
+
+// Macros for very commonly used varaibles, eventually will be changed to locals or globals
+#define _enabledRidePieces RCT2_GLOBAL(0x00F44048, uint64)
+#define _enabledRidePiecesA RCT2_GLOBAL(0x00F44048, uint32)
+#define _enabledRidePiecesB RCT2_GLOBAL(0x00F4404C, uint32)
+
+#define _currentTrackPrice RCT2_GLOBAL(0x00F44070, money32)
+
+#define _numCurrentPossibleRideConfigurations RCT2_GLOBAL(0x00F44078, uint16)
+#define _numCurrentPossibleSpecialTrackPieces RCT2_GLOBAL(0x00F4407A, uint16)
+
+#define _currentTrackCurve RCT2_GLOBAL(0x00F440A0, uint16)
+#define _currentTrackEndX RCT2_GLOBAL(0x00F440A2, uint16)
+#define _currentTrackEndY RCT2_GLOBAL(0x00F440A4, uint16)
+#define _rideConstructionState RCT2_GLOBAL(0x00F440A6, uint8)
+#define _currentRideIndex RCT2_GLOBAL(0x00F440A7, uint8)
+#define _currentTrackBeginX RCT2_GLOBAL(0x00F440A8, uint16)
+#define _currentTrackBeginY RCT2_GLOBAL(0x00F440AA, uint16)
+#define _currentTrackBeginZ RCT2_GLOBAL(0x00F440AC, uint16)
+#define _currentTrackPieceDirection RCT2_GLOBAL(0x00F440AE, uint8)
+#define _currentTrackPieceType RCT2_GLOBAL(0x00F440AF, uint8)
+#define _currentTrackSelectionFlags RCT2_GLOBAL(0x00F440B0, uint8)
+#define _rideConstructionArrowPulseTime RCT2_GLOBAL(0x00F440B1, sint8)
+#define _currentTrackSlopeEnd RCT2_GLOBAL(0x00F440B2, uint8)
+#define _currentTrackBankEnd RCT2_GLOBAL(0x00F440B3, uint8)
+#define _currentTrackLiftHill RCT2_GLOBAL(0x00F440B4, uint8)
+#define _currentTrackCovered RCT2_GLOBAL(0x00F440B5, uint8)
+
+#define _previousTrackBankEnd RCT2_GLOBAL(0x00F440B6, uint8)
+#define _previousTrackSlopeEnd RCT2_GLOBAL(0x00F440B7, uint8)
+
+#define _previousTrackPieceX RCT2_GLOBAL(0x00F440B9, uint16)
+#define _previousTrackPieceY RCT2_GLOBAL(0x00F440BB, uint16)
+#define _previousTrackPieceZ RCT2_GLOBAL(0x00F440BD, uint16)
+
+#define _currentSeatRotationAngle RCT2_GLOBAL(0x00F440CF, uint8)
+
int ride_get_count();
int ride_get_total_queue_length(rct_ride *ride);
int ride_get_max_queue_time(rct_ride *ride);
@@ -787,7 +849,6 @@ void ride_check_all_reachable();
void ride_update_satisfaction(rct_ride* ride, uint8 happiness);
void ride_update_popularity(rct_ride* ride, uint8 pop_amount);
int sub_6CAF80(int rideIndex, rct_xy_element *output);
-int track_get_next(rct_xy_element *input, rct_xy_element *output);
int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output);
void ride_construct_new(ride_list_item listItem);
void ride_construct(int rideIndex);
@@ -828,6 +889,9 @@ void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *es
void ride_clear_for_construction(int rideIndex);
void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images);
+void ride_select_next_section();
+void ride_select_previous_section();
+
int get_var_10E_unk_1(rct_ride* ride);
int get_var_10E_unk_2(rct_ride* ride);
int get_var_10E_unk_3(rct_ride* ride);
@@ -852,4 +916,24 @@ bool ride_is_powered_launched(rct_ride *ride);
bool ride_has_any_track_elements(int rideIndex);
void ride_all_has_any_track_elements(bool *rideIndexArray);
+void sub_6C9800();
+
+bool track_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction);
+bool track_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd);
+
+rct_map_element *sub_6C6096(int *x, int *y, int *z, int *direction, int *direction2);
+bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *outTrackBeginEnd);
+
+void sub_6C84CE();
+void sub_6C96C0();
+money32 ride_get_entrance_or_exit_price(int rideIndex, int x, int y, int direction, int dh, int di);
+void ride_get_entrance_or_exit_position_from_screen_position(int x, int y, int *outX, int *outY, int *outDirection);
+
+bool ride_select_backwards_from_front();
+bool ride_select_forwards_from_back();
+
+money32 ride_remove_track_piece(int x, int y, int z, int direction, int type);
+
+bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride);
+
#endif
diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c
index ed26aac9d2..a74aa81263 100644
--- a/src/ride/ride_ratings.c
+++ b/src/ride/ride_ratings.c
@@ -51,21 +51,6 @@ static void loc_6B5BB2();
static void ride_ratings_calculate(rct_ride *ride);
static void ride_ratings_calculate_value(rct_ride *ride);
-int sub_6C6402(rct_map_element **mapElement, int *x, int *y, int *z)
-{
- int eax, ebx, ecx, edx, esi, edi, ebp;
-
- eax = *x;
- ecx = *y;
- esi = (int)*mapElement;
- int result = RCT2_CALLFUNC_X(0x006C6402, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
- *x = *((uint16*)&eax);
- *y = *((uint16*)&ecx);
- *z = *((uint8*)&edx);
- *mapElement = (rct_map_element*)esi;
- return result & (0x100);
-}
-
/**
*
* rct2: 0x006B5A2A
@@ -245,7 +230,7 @@ static void ride_ratings_update_state_2()
trackElement.x = RCT2_GLOBAL(0x0138B584, uint16);
trackElement.y = RCT2_GLOBAL(0x0138B586, uint16);
trackElement.element = mapElement;
- if (!track_get_next(&trackElement, &nextTrackElement)) {
+ if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) {
_rideRatingsState = RIDE_RATINGS_STATE_4;
return;
}
@@ -339,7 +324,7 @@ static void ride_ratings_update_state_5()
x = RCT2_GLOBAL(0x0138B584, uint16);
y = RCT2_GLOBAL(0x0138B586, uint16);
- if (!sub_6C6402(&mapElement, &x, &y, &z)) {
+ if (!track_get_previous(x, y, mapElement, NULL)) {
_rideRatingsState = RIDE_RATINGS_STATE_CALCULATE;
return;
}
diff --git a/src/ride/ride_ratings.h b/src/ride/ride_ratings.h
index 467b2c23a8..5baa99e2e9 100644
--- a/src/ride/ride_ratings.h
+++ b/src/ride/ride_ratings.h
@@ -25,6 +25,5 @@
#include "ride.h"
void ride_ratings_update_all();
-int sub_6C6402(rct_map_element **mapElement, int *x, int *y, int *z);
#endif
\ No newline at end of file
diff --git a/src/ride/track.c b/src/ride/track.c
index 38cc18f3b9..ae0de4c416 100644
--- a/src/ride/track.c
+++ b/src/ride/track.c
@@ -20,23 +20,25 @@
#include "../addresses.h"
#include "../audio/audio.h"
+#include "../cheats.h"
#include "../config.h"
#include "../game.h"
#include "../interface/viewport.h"
#include "../localisation/localisation.h"
+#include "../management/finance.h"
#include "../platform/platform.h"
#include "../rct1.h"
#include "../util/sawyercoding.h"
#include "../util/util.h"
+#include "../world/map_animation.h"
#include "../world/park.h"
#include "../world/scenery.h"
#include "../world/footpath.h"
#include "../windows/error.h"
-#include "ride_ratings.h"
#include "ride.h"
+#include "ride_ratings.h"
#include "track.h"
#include "track_data.h"
-#include "../rct1.h"
/**
*
@@ -47,193 +49,193 @@ const rct_trackdefinition *gTrackDefinitions = (rct_trackdefinition*)0x00997C9D;
// TODO This table is incorrect or at least missing 69 elements. There should be 256 in total!
const rct_trackdefinition gTrackDefinitions_INCORRECT[] = {
// TYPE VANGLE END VANGLE START BANK END BANK START SPECIAL
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_END_STATION
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BEGIN_STATION
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_MIDDLE_STATION
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP
- { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP
- { TRACK_FLAT, TRACK_UP_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_LEFT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_RIGHT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_FLAT
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_FLAT
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES
- { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_UP
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_LEFT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_RIGHT_BANK
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN
- { TRACK_S_BEND, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT
- { TRACK_S_BEND, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT
- { TRACK_VERTICAL_LOOP, TRACK_DOWN_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_LEFT_VERTICAL_LOOP
- { TRACK_VERTICAL_LOOP, TRACK_DOWN_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_RIGHT_VERTICAL_LOOP
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE
- { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_TWIST_DOWN_TO_UP
- { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_TWIST_DOWN_TO_UP
- { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_TWIST_UP_TO_DOWN
- { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_TWIST_UP_TO_DOWN
- { TRACK_HALF_LOOP, TRACK_NONE, TRACK_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_HALF_LOOP_UP
- { TRACK_HALF_LOOP, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_HALF_LOOP_DOWN
- { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_CORKSCREW_UP
- { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_CORKSCREW_UP
- { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_LEFT_CORKSCREW_DOWN
- { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_RIGHT_CORKSCREW_DOWN
- { TRACK_FLAT, TRACK_UP_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_END_STATION
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BEGIN_STATION
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_MIDDLE_STATION
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_LEFT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_RIGHT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_LEFT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_RIGHT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN
+ { TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT
+ { TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT
+ { TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_LEFT_VERTICAL_LOOP
+ { TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_RIGHT_VERTICAL_LOOP
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE
+ { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_TWIST_DOWN_TO_UP
+ { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_TWIST_DOWN_TO_UP
+ { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_TWIST_UP_TO_DOWN
+ { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_TWIST_UP_TO_DOWN
+ { TRACK_HALF_LOOP, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_HALF_LOOP_UP
+ { TRACK_HALF_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_HALF_LOOP_DOWN
+ { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_CORKSCREW_UP
+ { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_CORKSCREW_UP
+ { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_LEFT_CORKSCREW_DOWN
+ { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_RIGHT_CORKSCREW_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_FLAT
{ TRACK_TOWER_BASE, TRACK_VANGLE_TOWER, TRACK_VANGLE_TOWER, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_TOWER_BASE
{ TRACK_TOWER_BASE, TRACK_VANGLE_TOWER, TRACK_VANGLE_TOWER, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_TOWER_SECTION
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_COVERED
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_COVERED
- { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_COVERED
- { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP_COVERED
- { TRACK_FLAT, TRACK_UP_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT_COVERED
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_COVERED
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_COVERED
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT_COVERED
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT_COVERED
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED
- { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL
- { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL
- { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL
- { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL
- { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE
- { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE
- { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE
- { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE
- { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP
- { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN
- { TRACK_BRAKES, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKES
- { TRACK_ROTATION_CONTROL_TOGGLE,TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ROTATION_CONTROL_TOGGLE
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP
- { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP
- { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP
- { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN
- { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN
- { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_UP
- { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_UP
- { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN
- { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_UP_LEFT_BANKED
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_UP_RIGHT_BANKED
- { TRACK_WATERFALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATERFALL
- { TRACK_RAPIDS, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RAPIDS
- { TRACK_ON_RIDE_PHOTO, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ON_RIDE_PHOTO
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_DOWN_LEFT_BANKED
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_DOWN_RIGHT_BANKED
- { TRACK_WATER_SPLASH, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATER_SPLASH
- { TRACK_FLAT, TRACK_UP_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP_LONG_BASE
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE
- { TRACK_WHIRLPOOL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WHIRLPOOL
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE
- { TRACK_LIFT_HILL, TRACK_DOWN_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_CABLE_LIFT_HILL
- { TRACK_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_REVERSE_WHOA_BELLY_SLOPE
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED
+ { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL
+ { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL
+ { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL
+ { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL
+ { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE
+ { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE
+ { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE
+ { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN
+ { TRACK_BRAKES, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKES
+ { TRACK_ROTATION_CONTROL_TOGGLE,TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ROTATION_CONTROL_TOGGLE
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP
+ { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP
+ { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP
+ { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN
+ { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN
+ { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_UP
+ { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_UP
+ { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN
+ { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_UP_LEFT_BANKED
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_UP_RIGHT_BANKED
+ { TRACK_WATERFALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATERFALL
+ { TRACK_RAPIDS, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RAPIDS
+ { TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ON_RIDE_PHOTO
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_DOWN_LEFT_BANKED
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_DOWN_RIGHT_BANKED
+ { TRACK_WATER_SPLASH, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATER_SPLASH
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP_LONG_BASE
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE
+ { TRACK_WHIRLPOOL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WHIRLPOOL
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE
+ { TRACK_LIFT_HILL, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_CABLE_LIFT_HILL
+ { TRACK_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_REVERSE_WHOA_BELLY_SLOPE
{ TRACK_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_REVERSE_WHOA_BELLY_VERTICAL
- { TRACK_FLAT, TRACK_UP_90, TRACK_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP
- { TRACK_FLAT, TRACK_DOWN_90, TRACK_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN
- { TRACK_FLAT, TRACK_UP_90, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_90_DEG_UP
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN
- { TRACK_FLAT, TRACK_UP_60, TRACK_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP_TO_60_DEG_UP
- { TRACK_FLAT, TRACK_DOWN_90, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN
- { TRACK_BRAKE_FOR_DROP, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKE_FOR_DROP
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_DIAG
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_DIAG
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_ORTHOGONAL
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_DIAG
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_DIAG
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP
- { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_UP
- { TRACK_FLAT, TRACK_UP_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_FLAT
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_FLAT
- { TRACK_FLAT, TRACK_UP_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_UP
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_FLAT
- { TRACK_FLAT, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_DOWN
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_FLAT
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_LEFT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_RIGHT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_FLAT
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_FLAT
- { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN
- { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK
- { TRACK_LOG_FLUME_REVERSER, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LOG_FLUME_REVERSER
- { TRACK_SPINNING_TUNNEL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_SPINNING_TUNNEL
- { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN
- { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN
- { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP
- { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP
- { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK
- { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK
- { TRACK_POWERED_LIFT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_POWERED_LIFT
- { TRACK_HALF_LOOP_2, TRACK_NONE, TRACK_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_LEFT_LARGE_HALF_LOOP_UP
- { TRACK_HALF_LOOP_2, TRACK_NONE, TRACK_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_RIGHT_LARGE_HALF_LOOP_UP
- { TRACK_HALF_LOOP_2, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_RIGHT_LARGE_HALF_LOOP_DOWN
- { TRACK_HALF_LOOP_2, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_90_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP_TO_60_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN
+ { TRACK_BRAKE_FOR_DROP, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKE_FOR_DROP
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_DIAG
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_DIAG
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_ORTHOGONAL
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_DIAG
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_DIAG
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_LEFT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_RIGHT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_FLAT
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK
+ { TRACK_LOG_FLUME_REVERSER, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LOG_FLUME_REVERSER
+ { TRACK_SPINNING_TUNNEL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_SPINNING_TUNNEL
+ { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN
+ { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN
+ { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP
+ { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK
+ { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK
+ { TRACK_POWERED_LIFT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_POWERED_LIFT
+ { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_LEFT_LARGE_HALF_LOOP_UP
+ { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_RIGHT_LARGE_HALF_LOOP_UP
+ { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_RIGHT_LARGE_HALF_LOOP_DOWN
+ { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN
};
static bool track_save_should_select_scenery_around(int rideIndex, rct_map_element *mapElement);
@@ -1404,10 +1406,10 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac
bl = 1;
if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69;
if (RCT2_GLOBAL(0x00F440D4, uint8) == 1){
- cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, (z / 16) & 0xFF, GAME_COMMAND_12, -1, 0);
+ cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, (z / 16) & 0xFF, GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0);
}
else{
- cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex, GAME_COMMAND_12, 0, 0);
+ cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex, GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, 0, 0);
}
if (cost != MONEY32_UNDEFINED){
RCT2_GLOBAL(0x00F4414E, uint8) |= (1 << 0);
@@ -1423,10 +1425,10 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac
bl = 1;
if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69;
if (RCT2_GLOBAL(0x00F440D4, uint8) == 1){
- cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, ((z / 16) & 0xFF) | (1 << 8), GAME_COMMAND_12, -1, 0);
+ cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, ((z / 16) & 0xFF) | (1 << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0);
}
else{
- cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex | (1 << 8), GAME_COMMAND_12, 0, 0);
+ cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex | (1 << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, 0, 0);
}
if (cost != MONEY32_UNDEFINED){
RCT2_GLOBAL(0x00F4414E, uint8) |= (1 << 0);
@@ -1528,8 +1530,8 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac
track_update_max_min_coordinates(x, y, z);
if (RCT2_GLOBAL(0x00F440D4, uint8) == 0){
- for (rct_preview_track* trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[track_type];
- trackBlock->var_00 != 0xFF;
+ for (const rct_preview_track* trackBlock = TrackBlocks[track_type];
+ trackBlock->index != 0xFF;
trackBlock++){
rct_xy16 tile;
tile.x = x;
@@ -1583,12 +1585,12 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac
//di
int temp_z = z;
temp_z -= track_coordinates->z_negative;
- rct_preview_track* trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[track_type];
+ const rct_preview_track* trackBlock = TrackBlocks[track_type];
temp_z += trackBlock->z;
// rotation in bh
// track_type in dl
- game_do_command(x, 0x69 | ((rotation & 3) << 8), y, track_type, GAME_COMMAND_4, temp_z, 0);
+ game_do_command(x, 0x69 | ((rotation & 3) << 8), y, track_type, GAME_COMMAND_REMOVE_TRACK, temp_z, 0);
}
if (RCT2_GLOBAL(0x00F440D4, uint8) == 1 ||
@@ -1616,7 +1618,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac
if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0;
RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927;
- money32 cost = game_do_command(x, bl | (rotation << 8), y, edx, GAME_COMMAND_3, edi, 0);
+ money32 cost = game_do_command(x, bl | (rotation << 8), y, edx, GAME_COMMAND_PLACE_TRACK, edi, 0);
RCT2_GLOBAL(0x00F440D5, money32) += cost;
if (cost == MONEY32_UNDEFINED){
@@ -1626,8 +1628,8 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac
}
if (RCT2_GLOBAL(0x00F440D4, uint8) == 3){
- for (rct_preview_track* trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[track_type];
- trackBlock->var_00 != 0xFF;
+ for (const rct_preview_track* trackBlock = TrackBlocks[track_type];
+ trackBlock->index != 0xFF;
trackBlock++){
rct_xy16 tile;
tile.x = x;
@@ -1822,7 +1824,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac
if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0;
RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927;
- money32 cost = game_do_command(x, bl | (rotation << 8), y, rideIndex | (is_exit << 8), GAME_COMMAND_12, di, 0);
+ money32 cost = game_do_command(x, bl | (rotation << 8), y, rideIndex | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, di, 0);
RCT2_GLOBAL(0x00F440D5, money32) += cost;
if (cost == MONEY32_UNDEFINED){
@@ -1841,7 +1843,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac
z /= 16;
RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927;
- money32 cost = game_do_command(x, 0 | (rotation << 8), y, z | (is_exit << 8), GAME_COMMAND_12, -1, 0);
+ money32 cost = game_do_command(x, 0 | (rotation << 8), y, z | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0);
RCT2_GLOBAL(0x00F440D5, money32) += cost;
if (cost == MONEY32_UNDEFINED){
@@ -2617,10 +2619,11 @@ int maze_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_
}
/* rct2: 0x006CE68D */
-int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_elements){
+int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_elements)
+{
rct_ride* ride = GET_RIDE(rideIndex);
-
rct_xy_element trackElement;
+ track_begin_end trackBeginEnd;
if (sub_6CAF80(rideIndex, &trackElement) == 0){
RCT2_GLOBAL(0x00141E9AC, uint16) = 3347;
@@ -2629,18 +2632,12 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra
int z = 0;
//6ce69e
- if (!(sub_6C6402(&trackElement.element, &trackElement.x, &trackElement.y, &z))){
+ if (track_get_previous(trackElement.x, trackElement.y, trackElement.element, &trackBeginEnd)) {
rct_map_element* initial_map = trackElement.element;
do {
- int x = trackElement.x;
- int y = trackElement.y;
- rct_map_element* map_element = trackElement.element;
- if (sub_6C6402(&map_element, &x, &y, &z)){
+ if (!track_get_previous(trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_element, &trackBeginEnd)) {
break;
}
- trackElement.x = x;
- trackElement.y = y;
- trackElement.element = map_element;
} while (initial_map != trackElement.element);
}
@@ -2733,7 +2730,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra
track->flags = flags;
track++;
- if (!track_get_next(&trackElement, &trackElement))
+ if (!track_get_next(&trackElement, &trackElement, NULL, NULL))
break;
z = trackElement.element->base_height * 8;
@@ -3175,7 +3172,7 @@ int install_track(char* source_path, char* dest_name){
}
/* rct2: 0x006D13FE */
-void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp){
+void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp){
int x = *eax;
int y = *ecx;
int z = *edi;
@@ -3432,3 +3429,33 @@ static void track_save_add_map_element(int mapElementSelectType, int x, int y, r
{
RCT2_CALLPROC_X(0x006D2B3C, x, mapElementSelectType, y, (int)mapElement, 0, 0, 0);
}
+
+const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType)
+{
+ return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ?
+ FlatRideTrackBlocks[trackType] :
+ TrackBlocks[trackType];
+}
+
+const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType)
+{
+ return get_track_def_from_ride(GET_RIDE(rideIndex), trackType);
+}
+
+/**
+ *
+ * rct2: 0x006C511D
+ */
+void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp)
+{
+ RCT2_CALLFUNC_X(0x006C511D, eax, ebx, ecx, edx, esi, edi, ebp);
+}
+
+/**
+ *
+ * rct2: 0x006C5B69
+ */
+void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp)
+{
+ RCT2_CALLFUNC_X(0x006C5B69, eax, ebx, ecx, edx, esi, edi, ebp);
+}
\ No newline at end of file
diff --git a/src/ride/track.h b/src/ride/track.h
index dc5e8acb64..197a516d59 100644
--- a/src/ride/track.h
+++ b/src/ride/track.h
@@ -39,11 +39,11 @@ typedef struct {
* Size: 0x0A
*/
typedef struct {
- uint8 var_00;
+ uint8 index; // 0x00
sint16 x; // 0x01
sint16 y; // 0x03
- sint16 z;
- uint8 pad_07;
+ sint16 z; // 0x05
+ uint8 var_07;
uint8 var_08;
uint8 var_09;
} rct_preview_track;
@@ -181,40 +181,86 @@ enum {
TRACK_NONE = 0,
TRACK_FLAT = 0,
- TRACK_STATION_END = 2,
- TRACK_VERTICAL_LOOP = 7,
- TRACK_S_BEND = 13,
- TRACK_TWIST = 17,
- TRACK_HALF_LOOP = 18,
- TRACK_CORKSCREW = 19,
- TRACK_TOWER_BASE = 20,
- TRACK_HELIX_SMALL= 21,
- TRACK_HELIX_LARGE= 22,
- TRACK_HELIX_LARGE_UNBANKED = 23,
- TRACK_BRAKES = 24,
- TRACK_ON_RIDE_PHOTO = 26,
- TRACK_WATER_SPLASH = 27,
- TRACK_BARREL_ROLL = 29,
- TRACK_POWERED_LIFT = 30,
- TRACK_HALF_LOOP_2 = 31, // ?
- TRACK_LOG_FLUME_REVERSER = 33,
- TRACK_WHOA_BELLY = 36,
- TRACK_LIFT_HILL = 43,
- TRACK_SPINNING_TUNNEL = 46,
- TRACK_ROTATION_CONTROL_TOGGLE = 47,
- TRACK_RAPIDS = 52,
+ TRACK_STRAIGHT,
+ TRACK_STATION_END,
+ TRACK_LIFT_HILL,
+ TRACK_LIFT_HILL_STEEP,
+ TRACK_LIFT_HILL_CURVE,
+ TRACK_FLAT_ROLL_BANKING,
+ TRACK_VERTICAL_LOOP,
+ TRACK_SLOPE,
+ TRACK_SLOPE_STEEP,
+ TRACK_SLOPE_LONG,
+ TRACK_SLOPE_CURVE,
+ TRACK_SLOPE_CURVE_STEEP,
+ TRACK_S_BEND,
+ TRACK_CURVE_VERY_SMALL,
+ TRACK_CURVE_SMALL,
+ TRACK_CURVE,
+ TRACK_TWIST,
+ TRACK_HALF_LOOP,
+ TRACK_CORKSCREW,
+ TRACK_TOWER_BASE,
+ TRACK_HELIX_SMALL,
+ TRACK_HELIX_LARGE,
+ TRACK_HELIX_LARGE_UNBANKED,
+ TRACK_BRAKES,
+ TRACK_25,
+ TRACK_ON_RIDE_PHOTO,
+ TRACK_WATER_SPLASH,
+ TRACK_SLOPE_VERTICAL,
+ TRACK_BARREL_ROLL,
+ TRACK_POWERED_LIFT,
+ TRACK_HALF_LOOP_LARGE,
+ TRACK_SLOPE_CURVE_BANKED,
+ TRACK_LOG_FLUME_REVERSER,
+ TRACK_HEARTLINE_ROLL,
+ TRACK_REVERSER,
+ TRACK_WHOA_BELLY,
+ TRACK_SLOPE_TO_FLAT,
+ TRACK_BLOCK_BRAKES,
+ TRACK_SLOPE_ROLL_BANKING,
+ TRACK_SLOPE_STEEP_LONG,
+ TRACK_CURVE_VERTICAL,
+ TRACK_42,
+ TRACK_LIFT_HILL_CABLE,
+ TRACK_LIFT_HILL_CURVED,
+ TRACK_QUARTER_LOOP,
+ TRACK_SPINNING_TUNNEL,
+ TRACK_ROTATION_CONTROL_TOGGLE,
+ TRACK_INLINE_TWIST_UNINVERTED,
+ TRACK_INLINE_TWIST_INVERTED,
+ TRACK_QUARTER_LOOP_UNINVERTED,
+ TRACK_QUARTER_LOOP_INVERTED,
+ TRACK_RAPIDS,
+ TRACK_HALF_LOOP_UNINVERTED,
+ TRACK_HALF_LOOP_INVERTED,
+
TRACK_WATERFALL = 152,
TRACK_WHIRLPOOL = 152,
TRACK_BRAKE_FOR_DROP = 172
};
enum {
- TRACK_UP_25 = 2,
- TRACK_UP_60 = 4,
- TRACK_DOWN_25 = 6,
- TRACK_DOWN_60 = 8,
- TRACK_UP_90 = 10,
- TRACK_DOWN_90 = 18,
+ TRACK_CURVE_LEFT_VERY_SMALL = 5,
+ TRACK_CURVE_LEFT_SMALL = 3,
+ TRACK_CURVE_LEFT = 1,
+ TRACK_CURVE_LEFT_LARGE = 7,
+ TRACK_CURVE_NONE = 0,
+ TRACK_CURVE_RIGHT_LARGE = 8,
+ TRACK_CURVE_RIGHT = 2,
+ TRACK_CURVE_RIGHT_SMALL = 4,
+ TRACK_CURVE_RIGHT_VERY_SMALL = 6
+};
+
+enum {
+ TRACK_SLOPE_NONE = 0,
+ TRACK_SLOPE_UP_25 = 2,
+ TRACK_SLOPE_UP_60 = 4,
+ TRACK_SLOPE_DOWN_25 = 6,
+ TRACK_SLOPE_DOWN_60 = 8,
+ TRACK_SLOPE_UP_90 = 10,
+ TRACK_SLOPE_DOWN_90 = 18,
TRACK_VANGLE_TOWER = 10,
TRACK_VANGLE_WHOA_BELLY = 10
@@ -440,9 +486,15 @@ int sub_6D01B3(uint8 bl, uint8 rideIndex, int x, int y, int z);
int save_track_design(uint8 rideIndex);
int install_track(char* source_path, char* dest_name);
void window_track_list_format_name(char *dst, const char *src, char colour, char quotes);
-void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
+void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
void track_save_reset_scenery();
void track_save_select_nearby_scenery(int rideIndex);
+const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType);
+const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType);
+
+void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
+void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
+
#endif
diff --git a/src/ride/track_data.c b/src/ride/track_data.c
index 636cb95522..5a3759230b 100644
--- a/src/ride/track_data.c
+++ b/src/ride/track_data.c
@@ -18,6 +18,7 @@
* along with this program. If not, see .
*****************************************************************************/
+#include "track.h"
#include "track_data.h"
const rct_track_coordinates TrackCoordinates[256] = {
@@ -277,4 +278,4412 @@ const rct_track_coordinates TrackCoordinates[256] = {
{ 0, 2, 0, 96, 64, 0 },
{ 0, 2, 0, -128, -96, 0 },
{ 0, 2, 0, 128, 64, 0 }
-};
\ No newline at end of file
+};
+
+// rct2: 0x0097C468 (0 - 31) and 0x0097C5D4 (32 - 63)
+const uint64 RideTypePossibleTrackConfigurations[91] = {
+ /* RIDE_TYPE_SPIRAL_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_STAND_UP_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_SUSPENDED_SWINGING_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_LARGE_UNBANKED | TRACK_BRAKES,
+ /* RIDE_TYPE_INVERTED_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_HALF_LOOP_LARGE,
+ /* RIDE_TYPE_JUNIOR_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_CURVE | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES,
+ /* RIDE_TYPE_MINIATURE_RAILWAY */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE,
+ /* RIDE_TYPE_MONORAIL */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE,
+ /* RIDE_TYPE_MINI_SUSPENDED_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE,
+ /* RIDE_TYPE_BOAT_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_CURVE_VERY_SMALL,
+ /* RIDE_TYPE_WOODEN_WILD_MOUSE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL,
+ /* RIDE_TYPE_STEEPLECHASE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_BRAKES,
+ /* RIDE_TYPE_CAR_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_TOWER_BASE,
+ /* RIDE_TYPE_LAUNCHED_FREEFALL */ TRACK_TOWER_BASE,
+ /* RIDE_TYPE_BOBSLEIGH_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES,
+ /* RIDE_TYPE_OBSERVATION_TOWER */ TRACK_TOWER_BASE,
+ /* RIDE_TYPE_LOOPING_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_DINGHY_SLIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE,
+ /* RIDE_TYPE_MINE_TRAIN_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_CHAIRLIFT */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL,
+ /* RIDE_TYPE_CORKSCREW_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_MAZE */ 0,
+ /* RIDE_TYPE_SPIRAL_SLIDE */ 0,
+ /* RIDE_TYPE_GO_KARTS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL,
+ /* RIDE_TYPE_LOG_FLUME */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_RIVER_RAPIDS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_TOWER_BASE | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_DODGEMS */ 0,
+ /* RIDE_TYPE_PIRATE_SHIP */ 0,
+ /* RIDE_TYPE_SWINGING_INVERTER_SHIP */ 0,
+ /* RIDE_TYPE_FOOD_STALL */ 0,
+ /* RIDE_TYPE_1D */ 0,
+ /* RIDE_TYPE_DRINK_STALL */ 0,
+ /* RIDE_TYPE_1F */ 0,
+ /* RIDE_TYPE_SHOP */ 0,
+ /* RIDE_TYPE_MERRY_GO_ROUND */ 0,
+ /* RIDE_TYPE_22 */ 0,
+ /* RIDE_TYPE_INFORMATION_KIOSK */ 0,
+ /* RIDE_TYPE_TOILETS */ 0,
+ /* RIDE_TYPE_FERRIS_WHEEL */ 0,
+ /* RIDE_TYPE_MOTION_SIMULATOR */ 0,
+ /* RIDE_TYPE_3D_CINEMA */ 0,
+ /* RIDE_TYPE_TOP_SPIN */ 0,
+ /* RIDE_TYPE_SPACE_RINGS */ 0,
+ /* RIDE_TYPE_REVERSE_FREEFALL_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL_STEEP,
+ /* RIDE_TYPE_LIFT */ TRACK_TOWER_BASE,
+ /* RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER */ TRACK_FLAT | TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL,
+ /* RIDE_TYPE_CASH_MACHINE */ 0,
+ /* RIDE_TYPE_TWIST */ 0,
+ /* RIDE_TYPE_HAUNTED_HOUSE */ 0,
+ /* RIDE_TYPE_FIRST_AID */ 0,
+ /* RIDE_TYPE_CIRCUS_SHOW */ 0,
+ /* RIDE_TYPE_GHOST_TRAIN */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES,
+ /* RIDE_TYPE_TWISTER_ROLLER_COASTER */ TRACK_FLAT | TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL | TRACK_BARREL_ROLL | TRACK_POWERED_LIFT | TRACK_HALF_LOOP_LARGE,
+ /* RIDE_TYPE_WOODEN_ROLLER_COASTER */ TRACK_FLAT | TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_WATER_SPLASH,
+ /* RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_BRAKES,
+ /* RIDE_TYPE_WILD_MOUSE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_SLOPE_CURVE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES,
+ /* RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL,
+ /* RIDE_TYPE_38 */ TRACK_STRAIGHT | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_CORKSCREW | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL,
+ /* RIDE_TYPE_FLYING_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_3A */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_VIRGINIA_REEL */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL,
+ /* RIDE_TYPE_SPLASH_BOATS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE,
+ /* RIDE_TYPE_MINI_HELICOPTERS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL,
+ /* RIDE_TYPE_LAY_DOWN_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_SUSPENDED_MONORAIL */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE,
+ /* RIDE_TYPE_40 */ TRACK_STRAIGHT | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_REVERSER_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_BRAKES,
+ /* RIDE_TYPE_HEARTLINE_TWISTER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_SLOPE | TRACK_SLOPE_STEEP,
+ /* RIDE_TYPE_MINI_GOLF */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL,
+ /* RIDE_TYPE_GIGA_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_ROTO_DROP */ TRACK_TOWER_BASE,
+ /* RIDE_TYPE_FLYING_SAUCERS */ 0,
+ /* RIDE_TYPE_CROOKED_HOUSE */ 0,
+ /* RIDE_TYPE_MONORAIL_CYCLES */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE,
+ /* RIDE_TYPE_COMPACT_INVERTED_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL,
+ /* RIDE_TYPE_WATER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES,
+ /* RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL_STEEP | TRACK_LIFT_HILL_CURVE | TRACK_FLAT_ROLL_BANKING | TRACK_CURVE | TRACK_BRAKES,
+ /* RIDE_TYPE_INVERTED_HAIRPIN_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_SLOPE_CURVE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES,
+ /* RIDE_TYPE_MAGIC_CARPET */ 0,
+ /* RIDE_TYPE_SUBMARINE_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL,
+ /* RIDE_TYPE_RIVER_RAFTS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_S_BEND | TRACK_CURVE,
+ /* RIDE_TYPE_50 */ 0,
+ /* RIDE_TYPE_ENTERPRISE */ 0,
+ /* RIDE_TYPE_52 */ 0,
+ /* RIDE_TYPE_53 */ 0,
+ /* RIDE_TYPE_54 */ 0,
+ /* RIDE_TYPE_55 */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_INVERTED_IMPULSE_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_VERTICAL,
+ /* RIDE_TYPE_MINI_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES,
+ /* RIDE_TYPE_MINE_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_ON_RIDE_PHOTO,
+ /* RIDE_TYPE_59 */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES,
+ /* RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL
+};
+
+#define TRACK_BLOCK_END { 255, 255, 255, 255, 255, 255, 255 }
+
+static const rct_preview_track TrackBlocks000[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks001[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks002[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks003[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks004[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks005[] = {
+ { 0, 0, 0, 0, 64, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks006[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks007[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks008[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks009[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks010[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks011[] = {
+ { 0, 0, 0, 0, 64, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks012[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks013[] = {
+ { 0, 0, 0, 0, 32, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks014[] = {
+ { 0, 0, 0, 0, 32, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks015[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks016[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks017[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks018[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks019[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks020[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks021[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks022[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks023[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks024[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks025[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks026[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks027[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks028[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks029[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks030[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks031[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks032[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks033[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks034[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 16, 71, 0 },
+ { 3, -32, -32, 24, 16, 13, 0 },
+ { 4, -32, -64, 48, 0, 8, 1 },
+ { 5, -64, -32, 32, 16, 71, 0 },
+ { 6, -64, -64, 48, 16, 111, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks035[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 16, 139, 0 },
+ { 3, -32, 32, 24, 16, 14, 0 },
+ { 4, -32, 64, 48, 0, 4, 1 },
+ { 5, -64, 32, 32, 16, 139, 0 },
+ { 6, -64, 64, 48, 16, 159, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks036[] = {
+ { 0, 0, 0, 48, 16, 63, 0 },
+ { 1, 0, -32, 48, 0, 8, 1 },
+ { 2, -32, 0, 32, 16, 23, 0 },
+ { 3, -32, -32, 24, 16, 13, 0 },
+ { 4, -32, -64, 16, 0, 8, 1 },
+ { 5, -64, -32, 16, 16, 23, 0 },
+ { 6, -64, -64, 0, 16, 159, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks037[] = {
+ { 0, 0, 0, 48, 16, 63, 0 },
+ { 1, 0, 32, 48, 0, 4, 1 },
+ { 2, -32, 0, 32, 16, 43, 0 },
+ { 3, -32, 32, 24, 16, 14, 0 },
+ { 4, -32, 64, 16, 0, 4, 1 },
+ { 5, -64, 32, 16, 16, 43, 0 },
+ { 6, -64, 64, 0, 16, 111, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks038[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 7, 0 },
+ { 2, -32, -32, 0, 0, 13, 0 },
+ { 3, -64, -32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks039[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 11, 0 },
+ { 2, -32, 32, 0, 0, 14, 0 },
+ { 3, -64, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks040[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, -32, 0, 16, 16, 207, 0 },
+ { 2, -64, 0, 32, 96, 2, 0 },
+ { 3, -32, 0, 120, 16, 6, 0 },
+ { 4, -32, -32, 120, 0, 0, 0 },
+ { 5, 0, 0, 120, 0, 0, 0 },
+ { 6, 0, -32, 120, 16, 9, 0 },
+ { 7, 32, -32, 32, 96, 8, 0 },
+ { 8, 0, -32, 16, 16, 63, 0 },
+ { 9, -32, -32, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks041[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, -32, 0, 16, 16, 207, 0 },
+ { 2, -64, 0, 32, 96, 1, 0 },
+ { 3, -32, 0, 120, 16, 9, 0 },
+ { 4, -32, 32, 120, 0, 0, 0 },
+ { 5, 0, 0, 120, 0, 0, 0 },
+ { 6, 0, 32, 120, 16, 6, 0 },
+ { 7, 32, 32, 32, 96, 4, 0 },
+ { 8, 0, 32, 16, 16, 63, 0 },
+ { 9, -32, 32, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks042[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 2, 0 },
+ { 3, -32, -32, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks043[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 0 },
+ { 3, -32, 32, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks044[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 2, 0 },
+ { 3, -32, -32, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks045[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 0 },
+ { 3, -32, 32, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks046[] = {
+ { 0, 0, 0, 0, 16, 71, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 0, 2, 0 },
+ { 3, -32, -32, 16, 16, 103, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks047[] = {
+ { 0, 0, 0, 0, 16, 139, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 0, 1, 0 },
+ { 3, -32, 32, 16, 16, 155, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks048[] = {
+ { 0, 0, 0, 16, 16, 55, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 0, 2, 0 },
+ { 3, -32, -32, 0, 16, 23, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks049[] = {
+ { 0, 0, 0, 16, 16, 59, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 0, 1, 0 },
+ { 3, -32, 32, 0, 16, 43, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks050[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks051[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks052[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks053[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks054[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -16, 16, 15, 0 },
+ { 2, -64, 0, -16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks055[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -16, 16, 15, 0 },
+ { 2, -64, 0, -16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks056[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ { 1, -32, 0, 16, 16, 207, 0 },
+ { 2, -64, 0, 32, 96, 3, 0 },
+ { 3, -32, 0, 120, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks057[] = {
+ { 0, 0, 0, -32, 32, 15, 0 },
+ { 1, -32, 0, -120, 96, 3, 0 },
+ { 2, 0, 0, -136, 16, 207, 0 },
+ { 3, 32, 0, -152, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks058[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 24, 32, 7, 0 },
+ { 2, -32, -32, 48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks059[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 24, 32, 11, 0 },
+ { 2, -32, 32, 48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks060[] = {
+ { 0, 0, 0, -32, 16, 15, 0 },
+ { 1, -32, 0, -56, 32, 7, 0 },
+ { 2, -32, -32, -80, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks061[] = {
+ { 0, 0, 0, -32, 16, 15, 0 },
+ { 1, -32, 0, -56, 32, 11, 0 },
+ { 2, -32, 32, -80, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks062[] = {
+ { 0, 0, 0, 0, 24, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks063[] = {
+ { 0, 0, 0, 0, 24, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks064[] = {
+ { 0, 0, 0, 0, 24, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks065[] = {
+ { 0, 0, 0, 0, 24, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks066[] = {
+ { 0, 0, 0, 0, 64, 15, 0 },
+ { 1, -32, -32, 0, 0, 15, 0 },
+ { 2, -32, 0, 0, 0, 15, 0 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, 0, -32, 0, 0, 15, 0 },
+ { 5, 0, 32, 0, 0, 15, 0 },
+ { 6, 32, -32, 0, 0, 15, 0 },
+ { 7, 32, 32, 0, 0, 15, 0 },
+ { 8, 32, 0, 0, 0, 15, 2 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks067[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 32, 0, 0, 0, 0, 3 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks068[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks069[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks070[] = {
+ { 0, 0, 0, 0, 64, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks071[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks072[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks073[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks074[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks075[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks076[] = {
+ { 0, 0, 0, 0, 64, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks077[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks078[] = {
+ { 0, 0, 0, 0, 32, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks079[] = {
+ { 0, 0, 0, 0, 32, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks080[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks081[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks082[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks083[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 7, 0 },
+ { 2, -32, -32, 0, 0, 13, 0 },
+ { 3, -64, -32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks084[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 11, 0 },
+ { 2, -32, 32, 0, 0, 14, 0 },
+ { 3, -64, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks085[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 2, 0 },
+ { 3, -32, -32, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks086[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 0 },
+ { 3, -32, 32, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks087[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 4, 2, 0 },
+ { 3, -32, -32, 0, 4, 7, 0 },
+ { 4, -32, -64, 8, 0, 11, 0 },
+ { 5, 0, -64, 8, 0, 4, 1 },
+ { 6, -32, -96, 8, 4, 1, 0 },
+ { 7, 0, -96, 8, 4, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks088[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 4, 1, 0 },
+ { 3, -32, 32, 0, 4, 11, 0 },
+ { 4, -32, 64, 8, 0, 7, 0 },
+ { 5, 0, 64, 8, 0, 8, 1 },
+ { 6, -32, 96, 8, 4, 2, 0 },
+ { 7, 0, 96, 8, 4, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks089[] = {
+ { 0, 0, 0, 8, 4, 7, 0 },
+ { 1, 0, -32, 8, 4, 8, 1 },
+ { 2, -32, 0, 8, 0, 2, 0 },
+ { 3, -32, -32, 8, 0, 7, 0 },
+ { 4, -32, -64, 0, 4, 11, 0 },
+ { 5, 0, -64, 0, 4, 4, 1 },
+ { 6, -32, -96, 0, 0, 1, 0 },
+ { 7, 0, -96, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks090[] = {
+ { 0, 0, 0, 8, 4, 11, 0 },
+ { 1, 0, 32, 8, 4, 4, 1 },
+ { 2, -32, 0, 8, 0, 1, 0 },
+ { 3, -32, 32, 8, 0, 11, 0 },
+ { 4, -32, 64, 0, 4, 7, 0 },
+ { 5, 0, 64, 0, 4, 8, 1 },
+ { 6, -32, 96, 0, 0, 2, 0 },
+ { 7, 0, 96, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks091[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 4, 8, 1 },
+ { 5, -64, -32, 0, 4, 7, 0 },
+ { 6, -64, -64, 0, 4, 15, 0 },
+ { 7, -64, -96, 8, 0, 15, 0 },
+ { 8, -32, -96, 8, 0, 4, 1 },
+ { 9, -64, -128, 8, 0, 11, 0 },
+ { 10, -32, -128, 8, 0, 14, 0 },
+ { 11, 0, -128, 8, 4, 4, 1 },
+ { 12, -32, -160, 8, 4, 11, 0 },
+ { 13, 0, -160, 8, 4, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks092[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 4, 4, 1 },
+ { 5, -64, 32, 0, 4, 11, 0 },
+ { 6, -64, 64, 0, 4, 15, 0 },
+ { 7, -64, 96, 8, 0, 15, 0 },
+ { 8, -32, 96, 8, 0, 8, 1 },
+ { 9, -64, 128, 8, 0, 7, 0 },
+ { 10, -32, 128, 8, 0, 13, 0 },
+ { 11, 0, 128, 8, 4, 8, 1 },
+ { 12, -32, 160, 8, 4, 7, 0 },
+ { 13, 0, 160, 8, 4, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks093[] = {
+ { 0, 0, 0, 8, 4, 15, 0 },
+ { 1, 0, -32, 8, 4, 8, 1 },
+ { 2, -32, 0, 8, 4, 7, 0 },
+ { 3, -32, -32, 8, 0, 13, 0 },
+ { 4, -32, -64, 8, 0, 8, 1 },
+ { 5, -64, -32, 8, 0, 7, 0 },
+ { 6, -64, -64, 8, 0, 15, 0 },
+ { 7, -64, -96, 0, 4, 15, 0 },
+ { 8, -32, -96, 0, 4, 4, 1 },
+ { 9, -64, -128, 0, 4, 11, 0 },
+ { 10, -32, -128, 0, 0, 14, 0 },
+ { 11, 0, -128, 0, 0, 4, 1 },
+ { 12, -32, -160, 0, 0, 11, 0 },
+ { 13, 0, -160, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks094[] = {
+ { 0, 0, 0, 8, 4, 15, 0 },
+ { 1, 0, 32, 8, 4, 4, 1 },
+ { 2, -32, 0, 8, 4, 11, 0 },
+ { 3, -32, 32, 8, 0, 14, 0 },
+ { 4, -32, 64, 8, 0, 4, 1 },
+ { 5, -64, 32, 8, 0, 11, 0 },
+ { 6, -64, 64, 8, 0, 15, 0 },
+ { 7, -64, 96, 0, 4, 15, 0 },
+ { 8, -32, 96, 0, 4, 8, 1 },
+ { 9, -64, 128, 0, 4, 7, 0 },
+ { 10, -32, 128, 0, 0, 13, 0 },
+ { 11, 0, 128, 0, 0, 8, 1 },
+ { 12, -32, 160, 0, 0, 7, 0 },
+ { 13, 0, 160, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks095[] = {
+ { 0, 0, 0, 0, 64, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks096[] = {
+ { 0, 0, 0, 0, 64, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks097[] = {
+ { 0, 0, 0, 0, 64, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks098[] = {
+ { 0, 0, 0, 0, 64, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks099[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks100[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks101[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks102[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 12, 8, 1 },
+ { 5, -64, -32, 0, 12, 7, 0 },
+ { 6, -64, -64, 0, 12, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks103[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 12, 4, 1 },
+ { 5, -64, 32, 0, 12, 11, 0 },
+ { 6, -64, 64, 0, 12, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks104[] = {
+ { 0, 0, 0, 0, 12, 15, 0 },
+ { 1, 0, -32, 0, 12, 8, 1 },
+ { 2, -32, 0, 0, 12, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks105[] = {
+ { 0, 0, 0, 0, 12, 15, 0 },
+ { 1, 0, 32, 0, 12, 4, 1 },
+ { 2, -32, 0, 0, 12, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks106[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 12, 8, 1 },
+ { 5, -64, -32, 0, 12, 7, 0 },
+ { 6, -64, -64, 0, 12, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks107[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 12, 4, 1 },
+ { 5, -64, 32, 0, 12, 11, 0 },
+ { 6, -64, 64, 0, 12, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks108[] = {
+ { 0, 0, 0, 0, 12, 15, 0 },
+ { 1, 0, -32, 0, 12, 8, 1 },
+ { 2, -32, 0, 0, 12, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks109[] = {
+ { 0, 0, 0, 0, 12, 15, 0 },
+ { 1, 0, 32, 0, 12, 4, 1 },
+ { 2, -32, 0, 0, 12, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks110[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks111[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks112[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks113[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks114[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks115[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks116[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks117[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 0, 16, 15, 0 },
+ { 3, -96, 0, 0, 16, 15, 0 },
+ { 4, -128, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks118[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 16, 24, 15, 0 },
+ { 3, -96, 0, 40, 48, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks119[] = {
+ { 0, 0, 0, 0, 48, 15, 0 },
+ { 1, -32, 0, 40, 48, 15, 0 },
+ { 2, -64, 0, 64, 24, 15, 0 },
+ { 3, -96, 0, 80, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks120[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks121[] = {
+ { 0, 0, 0, 40, 48, 15, 0 },
+ { 1, -32, 0, 16, 24, 15, 0 },
+ { 2, -64, 0, 0, 16, 15, 0 },
+ { 3, -96, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks122[] = {
+ { 0, 0, 0, 80, 8, 15, 0 },
+ { 1, -32, 0, 64, 24, 15, 0 },
+ { 2, -64, 0, 40, 48, 15, 0 },
+ { 3, -96, 0, 0, 48, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks123[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ { 1, -32, 0, 0, 8, 63, 0 },
+ { 2, -64, 0, -32, 32, 63, 0 },
+ { 3, -96, 0, -96, 64, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks124[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 0, 32, 15, 0 },
+ { 2, -64, 0, 0, 48, 15, 0 },
+ { 3, -96, 0, 0, 80, 15, 0 },
+ { 4, -128, 0, 0, 160, 15, 0 },
+ { 5, -192, 0, 0, 208, 15, 0 },
+ { 6, -160, 0, 0, 208, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks125[] = {
+ { 0, 0, 0, 0, 48, 15, 0 },
+ { 1, 32, 0, 0, 48, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks126[] = {
+ { 0, 0, 0, 0, 8, 15, 4 },
+ { 1, 32, 0, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks127[] = {
+ { 0, 0, 0, 0, 8, 15, 4 },
+ { 1, 32, 0, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks128[] = {
+ { 0, 0, 0, 0, 32, 207, 4 },
+ { 1, 32, 0, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks129[] = {
+ { 0, 0, 0, 0, 32, 63, 4 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks130[] = {
+ { 0, 0, 0, 0, 56, 15, 4 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks131[] = {
+ { 0, 0, 0, 0, 56, 15, 4 },
+ { 1, 32, 0, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks132[] = {
+ { 0, 0, 0, 0, 24, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks133[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, -32, 0, 0, 8, 0 },
+ { 3, -64, 0, 0, 0, 2, 1 },
+ { 4, -64, -32, 0, 0, 1, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks134[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, 32, 0, 0, 4, 0 },
+ { 3, -64, 0, 0, 0, 1, 1 },
+ { 4, -64, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks135[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, -32, 0, 0, 0, 1, 0 },
+ { 2, 0, 32, 0, 0, 4, 1 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, -64, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks136[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 0 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, -32, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks137[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, -32, 0, 0, 8, 0 },
+ { 3, -64, 0, 0, 0, 2, 1 },
+ { 4, -64, -32, 0, 0, 1, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks138[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, 32, 0, 0, 4, 0 },
+ { 3, -64, 0, 0, 0, 1, 1 },
+ { 4, -64, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks139[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, -32, 0, 0, 0, 1, 0 },
+ { 2, 0, 32, 0, 0, 4, 1 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, -64, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks140[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 0 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, -32, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks141[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks142[] = {
+ { 0, 0, 0, 0, 16, 13, 0 },
+ { 1, 0, 32, 0, 16, 4, 1 },
+ { 2, -32, 0, 0, 16, 1, 1 },
+ { 3, -32, 32, 0, 16, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks143[] = {
+ { 0, 0, 0, 0, 64, 13, 0 },
+ { 1, 0, 32, 0, 64, 4, 1 },
+ { 2, -32, 0, 0, 64, 1, 1 },
+ { 3, -32, 32, 0, 64, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks144[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks145[] = {
+ { 0, 0, 0, 0, 32, 13, 0 },
+ { 1, 0, 32, 0, 32, 4, 1 },
+ { 2, -32, 0, 0, 32, 1, 1 },
+ { 3, -32, 32, 0, 32, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks146[] = {
+ { 0, 0, 0, 0, 32, 13, 0 },
+ { 1, 0, 32, 0, 32, 4, 1 },
+ { 2, -32, 0, 0, 32, 1, 1 },
+ { 3, -32, 32, 0, 32, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks147[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks148[] = {
+ { 0, 0, 0, 0, 16, 13, 0 },
+ { 1, 0, 32, 0, 16, 4, 1 },
+ { 2, -32, 0, 0, 16, 1, 1 },
+ { 3, -32, 32, 0, 16, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks149[] = {
+ { 0, 0, 0, 0, 64, 13, 0 },
+ { 1, 0, 32, 0, 64, 4, 1 },
+ { 2, -32, 0, 0, 64, 1, 1 },
+ { 3, -32, 32, 0, 64, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks150[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks151[] = {
+ { 0, 0, 0, 0, 32, 13, 0 },
+ { 1, 0, 32, 0, 32, 4, 1 },
+ { 2, -32, 0, 0, 32, 1, 1 },
+ { 3, -32, 32, 0, 32, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks152[] = {
+ { 0, 0, 0, 0, 32, 13, 0 },
+ { 1, 0, 32, 0, 32, 4, 1 },
+ { 2, -32, 0, 0, 32, 1, 1 },
+ { 3, -32, 32, 0, 32, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks153[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks154[] = {
+ { 0, 0, 0, 0, 24, 13, 0 },
+ { 1, 0, 32, 0, 24, 4, 1 },
+ { 2, -32, 0, 0, 24, 1, 1 },
+ { 3, -32, 32, 0, 24, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks155[] = {
+ { 0, 0, 0, 0, 24, 13, 0 },
+ { 1, 0, 32, 0, 24, 4, 1 },
+ { 2, -32, 0, 0, 24, 1, 1 },
+ { 3, -32, 32, 0, 24, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks156[] = {
+ { 0, 0, 0, 0, 24, 13, 0 },
+ { 1, 0, 32, 0, 24, 4, 1 },
+ { 2, -32, 0, 0, 24, 1, 1 },
+ { 3, -32, 32, 0, 24, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks157[] = {
+ { 0, 0, 0, 0, 24, 13, 0 },
+ { 1, 0, 32, 0, 24, 4, 1 },
+ { 2, -32, 0, 0, 24, 1, 1 },
+ { 3, -32, 32, 0, 24, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks158[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks159[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks160[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks161[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks162[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks163[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks164[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks165[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks166[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks167[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks168[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks169[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks170[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks171[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks172[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks173[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks174[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks175[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks176[] = {
+ { 0, 0, 0, -32, 16, 15, 0 },
+ { 1, -32, 0, -32, 16, 15, 0 },
+ { 2, -64, 0, -32, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks177[] = {
+ { 0, 0, 0, -32, 16, 15, 0 },
+ { 1, -32, 0, -32, 16, 15, 0 },
+ { 2, -64, 0, -32, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks178[] = {
+ { 0, 0, 0, 0, 0, 71, 0 },
+ { 1, 0, -32, 0, 16, 8, 1 },
+ { 2, -32, 0, 0, 16, 2, 0 },
+ { 3, -32, -32, 16, 16, 103, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks179[] = {
+ { 0, 0, 0, 0, 16, 139, 0 },
+ { 1, 0, 32, 0, 16, 4, 1 },
+ { 2, -32, 0, 0, 16, 1, 0 },
+ { 3, -32, 32, 16, 16, 155, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks180[] = {
+ { 0, 0, 0, 16, 16, 55, 0 },
+ { 1, 0, -32, 0, 16, 8, 1 },
+ { 2, -32, 0, 0, 16, 2, 0 },
+ { 3, -32, -32, 0, 0, 23, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks181[] = {
+ { 0, 0, 0, 16, 16, 59, 0 },
+ { 1, 0, 32, 0, 16, 4, 1 },
+ { 2, -32, 0, 0, 16, 1, 0 },
+ { 3, -32, 32, 0, 0, 43, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks182[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks183[] = {
+ { 0, 0, 0, 0, 24, 207, 0 },
+ { 1, -32, 0, 16, 40, 207, 0 },
+ { 2, -64, 0, 32, 56, 15, 0 },
+ { 3, -96, 0, 64, 192, 15, 0 },
+ { 4, -128, -32, 120, 96, 15, 0 },
+ { 5, -96, -32, 64, 192, 15, 0 },
+ { 6, -64, -32, 248, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks184[] = {
+ { 0, 0, 0, 0, 24, 207, 0 },
+ { 1, -32, 0, 16, 40, 207, 0 },
+ { 2, -64, 0, 32, 56, 15, 0 },
+ { 3, -96, 0, 64, 192, 15, 0 },
+ { 4, -128, 32, 120, 96, 15, 0 },
+ { 5, -96, 32, 64, 192, 15, 0 },
+ { 6, -64, 32, 248, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks185[] = {
+ { 0, 0, 0, -32, 24, 15, 0 },
+ { 1, -32, 0, -216, 192, 15, 0 },
+ { 2, -64, 0, -160, 96, 15, 0 },
+ { 3, -32, -32, -216, 192, 15, 0 },
+ { 4, 0, -32, -248, 56, 15, 0 },
+ { 5, 32, -32, -264, 40, 207, 0 },
+ { 6, 64, -32, -280, 24, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks186[] = {
+ { 0, 0, 0, -32, 24, 15, 0 },
+ { 1, -32, 0, -216, 192, 15, 0 },
+ { 2, -64, 0, -160, 96, 15, 0 },
+ { 3, -32, 32, -216, 192, 15, 0 },
+ { 4, 0, 32, -248, 56, 15, 0 },
+ { 5, 32, 32, -264, 40, 207, 0 },
+ { 6, 64, 32, -280, 24, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks187[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -16, 16, 15, 0 },
+ { 2, -64, 0, -16, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks188[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -16, 16, 15, 0 },
+ { 2, -64, 0, -16, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks189[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks190[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks191[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ { 1, -32, 0, 16, 16, 207, 0 },
+ { 2, -64, 0, 32, 96, 3, 0 },
+ { 3, -32, 0, 120, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks192[] = {
+ { 0, 0, 0, 0, 32, 15, 0 },
+ { 1, -32, 0, -88, 96, 3, 0 },
+ { 2, 0, 0, -104, 16, 207, 0 },
+ { 3, 32, 0, -120, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks193[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 24, 32, 7, 0 },
+ { 2, -32, -32, 48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks194[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 24, 32, 11, 0 },
+ { 2, -32, 32, 48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks195[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, -24, 32, 7, 0 },
+ { 2, -32, -32, -48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks196[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, -24, 32, 11, 0 },
+ { 2, -32, 32, -48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks197[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 32, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ { 3, 0, 0, 32, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks198[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -32, 32, 15, 0 },
+ { 2, -64, 0, -16, 0, 15, 0 },
+ { 3, 0, 0, -32, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks199[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -64, 0, 0, 0, 15, 0 },
+ { 3, -96, 0, 0, 0, 15, 0 },
+ { 4, -128, 0, 0, 0, 15, 0 },
+ { 5, -160, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks200[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -64, 0, 0, 0, 15, 0 },
+ { 3, -96, 0, 0, 0, 15, 0 },
+ { 4, -128, 0, 0, 0, 15, 0 },
+ { 5, -160, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks201[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks202[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks203[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks204[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks205[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, -32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks206[] = {
+ { 0, 0, 0, 0, 16, 15, 4 },
+ { 1, -32, 0, -40, 32, 15, 4 },
+ { 2, -64, 0, -96, 56, 15, 4 },
+ { 3, -96, 0, -96, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks207[] = {
+ { 0, 0, 0, 0, 56, 15, 4 },
+ { 1, 32, 0, 56, 32, 15, 4 },
+ { 2, 64, 0, 96, 16, 15, 4 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks208[] = {
+ { 0, 0, 0, -32, 16, 15, 4 },
+ { 1, -32, 0, -72, 32, 15, 4 },
+ { 2, -64, 0, -128, 56, 15, 4 },
+ { 3, -96, 0, -128, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks209[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 8, 2, 0 },
+ { 3, -32, -32, 0, 8, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks210[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 0 },
+ { 3, -32, 32, 0, 8, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks211[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 15, 0 },
+ { 2, -32, -32, 0, 0, 15, 0 },
+ { 3, -64, -32, 0, 0, 15, 0 },
+ { 4, -32, 0, 0, 0, 15, 0 },
+ { 5, -64, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks212[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 15, 0 },
+ { 2, -32, 32, 0, 0, 15, 0 },
+ { 3, -64, 32, 0, 0, 15, 0 },
+ { 4, -32, 0, 0, 0, 15, 0 },
+ { 5, -64, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks213[] = {
+ { 0, 0, 0, 0, 32, 15, 0 },
+ { 1, 32, 0, 0, 32, 15, 0 },
+ { 2, -64, 0, 0, 32, 15, 0 },
+ { 3, -32, 0, 0, 32, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks214[] = {
+ { 0, 0, 0, 0, 48, 15, 0 },
+ { 1, 32, 0, 0, 48, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks215[] = {
+ { 0, 0, 0, 0, 208, 15, 0 },
+ { 1, 32, 0, 0, 208, 15, 0 },
+ { 2, -32, 0, 0, 160, 15, 0 },
+ { 3, -64, 0, 0, 80, 15, 0 },
+ { 4, -96, 0, 0, 48, 15, 0 },
+ { 5, -128, 0, 0, 32, 15, 0 },
+ { 6, -160, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks216[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks217[] = {
+ { 0, 0, 0, 0, 16, 71, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 0, 2, 0 },
+ { 3, -32, -32, 16, 16, 103, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks218[] = {
+ { 0, 0, 0, 0, 16, 139, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 0, 1, 0 },
+ { 3, -32, 32, 16, 16, 155, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks219[] = {
+ { 0, 0, 0, 16, 16, 55, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 0, 2, 0 },
+ { 3, -32, -32, 0, 16, 23, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks220[] = {
+ { 0, 0, 0, 16, 16, 59, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 0, 1, 0 },
+ { 3, -32, 32, 0, 16, 43, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks221[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 16, 71, 0 },
+ { 3, -32, -32, 24, 16, 13, 0 },
+ { 4, -32, -64, 48, 0, 8, 1 },
+ { 5, -64, -32, 32, 16, 71, 0 },
+ { 6, -64, -64, 48, 16, 111, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks222[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 16, 139, 0 },
+ { 3, -32, 32, 24, 16, 14, 0 },
+ { 4, -32, 64, 48, 0, 4, 1 },
+ { 5, -64, 32, 32, 16, 139, 0 },
+ { 6, -64, 64, 48, 16, 159, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks223[] = {
+ { 0, 0, 0, 48, 16, 63, 0 },
+ { 1, 0, -32, 48, 0, 8, 1 },
+ { 2, -32, 0, 32, 16, 23, 0 },
+ { 3, -32, -32, 24, 16, 13, 0 },
+ { 4, -32, -64, 16, 0, 8, 1 },
+ { 5, -64, -32, 16, 16, 23, 0 },
+ { 6, -64, -64, 0, 16, 159, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks224[] = {
+ { 0, 0, 0, 48, 16, 63, 0 },
+ { 1, 0, 32, 48, 0, 4, 1 },
+ { 2, -32, 0, 32, 16, 43, 0 },
+ { 3, -32, 32, 24, 16, 14, 0 },
+ { 4, -32, 64, 16, 0, 4, 1 },
+ { 5, -64, 32, 16, 16, 43, 0 },
+ { 6, -64, 64, 0, 16, 111, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks225[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks226[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks227[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks228[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks229[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks230[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks231[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks232[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks233[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks234[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks235[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks236[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks237[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks238[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks239[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks240[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks241[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks242[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks243[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks244[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks245[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks246[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks247[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks248[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks249[] = {
+ { 0, 0, 0, 0, 72, 15, 4 },
+ { 1, 0, 32, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks250[] = {
+ { 0, 0, 0, 0, 72, 15, 4 },
+ { 1, 0, -32, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks251[] = {
+ { 0, 0, 0, 0, 72, 15, 4 },
+ { 1, 0, 32, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks252[] = {
+ { 0, 0, 0, 0, 72, 15, 4 },
+ { 1, 0, -32, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks253[] = {
+ { 0, 0, 0, 0, 56, 15, 4 },
+ { 1, 32, 0, 56, 32, 15, 4 },
+ { 2, 64, 0, 96, 16, 15, 4 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks254[] = {
+ { 0, 0, 0, -32, 16, 15, 4 },
+ { 1, -32, 0, -72, 32, 15, 4 },
+ { 2, -64, 0, -128, 56, 15, 4 },
+ { 3, -96, 0, -128, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track TrackBlocks255[] = {
+ { 0, 0, 0, 32, 56, 15, 4 },
+ { 1, 32, 0, 88, 32, 15, 4 },
+ { 2, 64, 0, 128, 16, 15, 4 },
+ TRACK_BLOCK_END
+};
+
+// rct2: 0x00994638
+const rct_preview_track *TrackBlocks[256] = {
+ TrackBlocks000,
+ TrackBlocks001,
+ TrackBlocks002,
+ TrackBlocks003,
+ TrackBlocks004,
+ TrackBlocks005,
+ TrackBlocks006,
+ TrackBlocks007,
+ TrackBlocks008,
+ TrackBlocks009,
+ TrackBlocks010,
+ TrackBlocks011,
+ TrackBlocks012,
+ TrackBlocks013,
+ TrackBlocks014,
+ TrackBlocks015,
+ TrackBlocks016,
+ TrackBlocks017,
+ TrackBlocks018,
+ TrackBlocks019,
+ TrackBlocks020,
+ TrackBlocks021,
+ TrackBlocks022,
+ TrackBlocks023,
+ TrackBlocks024,
+ TrackBlocks025,
+ TrackBlocks026,
+ TrackBlocks027,
+ TrackBlocks028,
+ TrackBlocks029,
+ TrackBlocks030,
+ TrackBlocks031,
+ TrackBlocks032,
+ TrackBlocks033,
+ TrackBlocks034,
+ TrackBlocks035,
+ TrackBlocks036,
+ TrackBlocks037,
+ TrackBlocks038,
+ TrackBlocks039,
+ TrackBlocks040,
+ TrackBlocks041,
+ TrackBlocks042,
+ TrackBlocks043,
+ TrackBlocks044,
+ TrackBlocks045,
+ TrackBlocks046,
+ TrackBlocks047,
+ TrackBlocks048,
+ TrackBlocks049,
+ TrackBlocks050,
+ TrackBlocks051,
+ TrackBlocks052,
+ TrackBlocks053,
+ TrackBlocks054,
+ TrackBlocks055,
+ TrackBlocks056,
+ TrackBlocks057,
+ TrackBlocks058,
+ TrackBlocks059,
+ TrackBlocks060,
+ TrackBlocks061,
+ TrackBlocks062,
+ TrackBlocks063,
+ TrackBlocks064,
+ TrackBlocks065,
+ TrackBlocks066,
+ TrackBlocks067,
+ TrackBlocks068,
+ TrackBlocks069,
+ TrackBlocks070,
+ TrackBlocks071,
+ TrackBlocks072,
+ TrackBlocks073,
+ TrackBlocks074,
+ TrackBlocks075,
+ TrackBlocks076,
+ TrackBlocks077,
+ TrackBlocks078,
+ TrackBlocks079,
+ TrackBlocks080,
+ TrackBlocks081,
+ TrackBlocks082,
+ TrackBlocks083,
+ TrackBlocks084,
+ TrackBlocks085,
+ TrackBlocks086,
+ TrackBlocks087,
+ TrackBlocks088,
+ TrackBlocks089,
+ TrackBlocks090,
+ TrackBlocks091,
+ TrackBlocks092,
+ TrackBlocks093,
+ TrackBlocks094,
+ TrackBlocks095,
+ TrackBlocks096,
+ TrackBlocks097,
+ TrackBlocks098,
+ TrackBlocks099,
+ TrackBlocks100,
+ TrackBlocks101,
+ TrackBlocks102,
+ TrackBlocks103,
+ TrackBlocks104,
+ TrackBlocks105,
+ TrackBlocks106,
+ TrackBlocks107,
+ TrackBlocks108,
+ TrackBlocks109,
+ TrackBlocks110,
+ TrackBlocks111,
+ TrackBlocks112,
+ TrackBlocks113,
+ TrackBlocks114,
+ TrackBlocks115,
+ TrackBlocks116,
+ TrackBlocks117,
+ TrackBlocks118,
+ TrackBlocks119,
+ TrackBlocks120,
+ TrackBlocks121,
+ TrackBlocks122,
+ TrackBlocks123,
+ TrackBlocks124,
+ TrackBlocks125,
+ TrackBlocks126,
+ TrackBlocks127,
+ TrackBlocks128,
+ TrackBlocks129,
+ TrackBlocks130,
+ TrackBlocks131,
+ TrackBlocks132,
+ TrackBlocks133,
+ TrackBlocks134,
+ TrackBlocks135,
+ TrackBlocks136,
+ TrackBlocks137,
+ TrackBlocks138,
+ TrackBlocks139,
+ TrackBlocks140,
+ TrackBlocks141,
+ TrackBlocks142,
+ TrackBlocks143,
+ TrackBlocks144,
+ TrackBlocks145,
+ TrackBlocks146,
+ TrackBlocks147,
+ TrackBlocks148,
+ TrackBlocks149,
+ TrackBlocks150,
+ TrackBlocks151,
+ TrackBlocks152,
+ TrackBlocks153,
+ TrackBlocks154,
+ TrackBlocks155,
+ TrackBlocks156,
+ TrackBlocks157,
+ TrackBlocks158,
+ TrackBlocks159,
+ TrackBlocks160,
+ TrackBlocks161,
+ TrackBlocks162,
+ TrackBlocks163,
+ TrackBlocks164,
+ TrackBlocks165,
+ TrackBlocks166,
+ TrackBlocks167,
+ TrackBlocks168,
+ TrackBlocks169,
+ TrackBlocks170,
+ TrackBlocks171,
+ TrackBlocks172,
+ TrackBlocks173,
+ TrackBlocks174,
+ TrackBlocks175,
+ TrackBlocks176,
+ TrackBlocks177,
+ TrackBlocks178,
+ TrackBlocks179,
+ TrackBlocks180,
+ TrackBlocks181,
+ TrackBlocks182,
+ TrackBlocks183,
+ TrackBlocks184,
+ TrackBlocks185,
+ TrackBlocks186,
+ TrackBlocks187,
+ TrackBlocks188,
+ TrackBlocks189,
+ TrackBlocks190,
+ TrackBlocks191,
+ TrackBlocks192,
+ TrackBlocks193,
+ TrackBlocks194,
+ TrackBlocks195,
+ TrackBlocks196,
+ TrackBlocks197,
+ TrackBlocks198,
+ TrackBlocks199,
+ TrackBlocks200,
+ TrackBlocks201,
+ TrackBlocks202,
+ TrackBlocks203,
+ TrackBlocks204,
+ TrackBlocks205,
+ TrackBlocks206,
+ TrackBlocks207,
+ TrackBlocks208,
+ TrackBlocks209,
+ TrackBlocks210,
+ TrackBlocks211,
+ TrackBlocks212,
+ TrackBlocks213,
+ TrackBlocks214,
+ TrackBlocks215,
+ TrackBlocks216,
+ TrackBlocks217,
+ TrackBlocks218,
+ TrackBlocks219,
+ TrackBlocks220,
+ TrackBlocks221,
+ TrackBlocks222,
+ TrackBlocks223,
+ TrackBlocks224,
+ TrackBlocks225,
+ TrackBlocks226,
+ TrackBlocks227,
+ TrackBlocks228,
+ TrackBlocks229,
+ TrackBlocks230,
+ TrackBlocks231,
+ TrackBlocks232,
+ TrackBlocks233,
+ TrackBlocks234,
+ TrackBlocks235,
+ TrackBlocks236,
+ TrackBlocks237,
+ TrackBlocks238,
+ TrackBlocks239,
+ TrackBlocks240,
+ TrackBlocks241,
+ TrackBlocks242,
+ TrackBlocks243,
+ TrackBlocks244,
+ TrackBlocks245,
+ TrackBlocks246,
+ TrackBlocks247,
+ TrackBlocks248,
+ TrackBlocks249,
+ TrackBlocks250,
+ TrackBlocks251,
+ TrackBlocks252,
+ TrackBlocks253,
+ TrackBlocks254,
+ TrackBlocks255
+};
+
+static const rct_preview_track FlatRideTrackBlocks000[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks001[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks002[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks003[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks004[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks005[] = {
+ { 0, 0, 0, 0, 64, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks006[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks007[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks008[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks009[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks010[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks011[] = {
+ { 0, 0, 0, 0, 64, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks012[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks013[] = {
+ { 0, 0, 0, 0, 32, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks014[] = {
+ { 0, 0, 0, 0, 32, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks015[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks016[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks017[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks018[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks019[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks020[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks021[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks022[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks023[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks024[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks025[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks026[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks027[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks028[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks029[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks030[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks031[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks032[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks033[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks034[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 16, 71, 0 },
+ { 3, -32, -32, 24, 16, 13, 0 },
+ { 4, -32, -64, 48, 0, 8, 1 },
+ { 5, -64, -32, 32, 16, 71, 0 },
+ { 6, -64, -64, 48, 16, 111, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks035[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 16, 139, 0 },
+ { 3, -32, 32, 24, 16, 14, 0 },
+ { 4, -32, 64, 48, 0, 4, 1 },
+ { 5, -64, 32, 32, 16, 139, 0 },
+ { 6, -64, 64, 48, 16, 159, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks036[] = {
+ { 0, 0, 0, 48, 16, 63, 0 },
+ { 1, 0, -32, 48, 0, 8, 1 },
+ { 2, -32, 0, 32, 16, 23, 0 },
+ { 3, -32, -32, 24, 16, 13, 0 },
+ { 4, -32, -64, 16, 0, 8, 1 },
+ { 5, -64, -32, 16, 16, 23, 0 },
+ { 6, -64, -64, 0, 16, 159, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks037[] = {
+ { 0, 0, 0, 48, 16, 63, 0 },
+ { 1, 0, 32, 48, 0, 4, 1 },
+ { 2, -32, 0, 32, 16, 43, 0 },
+ { 3, -32, 32, 24, 16, 14, 0 },
+ { 4, -32, 64, 16, 0, 4, 1 },
+ { 5, -64, 32, 16, 16, 43, 0 },
+ { 6, -64, 64, 0, 16, 111, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks038[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 7, 0 },
+ { 2, -32, -32, 0, 0, 13, 0 },
+ { 3, -64, -32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks039[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 11, 0 },
+ { 2, -32, 32, 0, 0, 14, 0 },
+ { 3, -64, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks040[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, -32, 0, 16, 16, 207, 0 },
+ { 2, -64, 0, 32, 96, 2, 0 },
+ { 3, -32, 0, 120, 16, 6, 0 },
+ { 4, -32, -32, 120, 0, 0, 0 },
+ { 5, 0, 0, 120, 0, 0, 0 },
+ { 6, 0, -32, 120, 16, 9, 0 },
+ { 7, 32, -32, 32, 96, 8, 0 },
+ { 8, 0, -32, 16, 16, 63, 0 },
+ { 9, -32, -32, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks041[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, -32, 0, 16, 16, 207, 0 },
+ { 2, -64, 0, 32, 96, 1, 0 },
+ { 3, -32, 0, 120, 16, 9, 0 },
+ { 4, -32, 32, 120, 0, 0, 0 },
+ { 5, 0, 0, 120, 0, 0, 0 },
+ { 6, 0, 32, 120, 16, 6, 0 },
+ { 7, 32, 32, 32, 96, 4, 0 },
+ { 8, 0, 32, 16, 16, 63, 0 },
+ { 9, -32, 32, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks042[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 2, 0 },
+ { 3, -32, -32, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks043[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 0 },
+ { 3, -32, 32, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks044[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 2, 0 },
+ { 3, -32, -32, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks045[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 0 },
+ { 3, -32, 32, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks046[] = {
+ { 0, 0, 0, 0, 16, 71, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 0, 2, 0 },
+ { 3, -32, -32, 16, 16, 103, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks047[] = {
+ { 0, 0, 0, 0, 16, 139, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 0, 1, 0 },
+ { 3, -32, 32, 16, 16, 155, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks048[] = {
+ { 0, 0, 0, 16, 16, 55, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 0, 2, 0 },
+ { 3, -32, -32, 0, 16, 23, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks049[] = {
+ { 0, 0, 0, 16, 16, 59, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 0, 1, 0 },
+ { 3, -32, 32, 0, 16, 43, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks050[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks051[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks052[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks053[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks054[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -16, 16, 15, 0 },
+ { 2, -64, 0, -16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks055[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -16, 16, 15, 0 },
+ { 2, -64, 0, -16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks056[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ { 1, -32, 0, 16, 16, 207, 0 },
+ { 2, -64, 0, 32, 96, 3, 0 },
+ { 3, -32, 0, 120, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks057[] = {
+ { 0, 0, 0, -32, 32, 15, 0 },
+ { 1, -32, 0, -120, 96, 3, 0 },
+ { 2, 0, 0, -136, 16, 207, 0 },
+ { 3, 32, 0, -152, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks058[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 24, 32, 7, 0 },
+ { 2, -32, -32, 48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks059[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 24, 32, 11, 0 },
+ { 2, -32, 32, 48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks060[] = {
+ { 0, 0, 0, -32, 16, 15, 0 },
+ { 1, -32, 0, -56, 32, 7, 0 },
+ { 2, -32, -32, -80, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks061[] = {
+ { 0, 0, 0, -32, 16, 15, 0 },
+ { 1, -32, 0, -56, 32, 11, 0 },
+ { 2, -32, 32, -80, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks062[] = {
+ { 0, 0, 0, 0, 24, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks063[] = {
+ { 0, 0, 0, 0, 24, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks064[] = {
+ { 0, 0, 0, 0, 24, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks065[] = {
+ { 0, 0, 0, 0, 24, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks066[] = {
+ { 0, 0, 0, 0, 64, 15, 0 },
+ { 1, -32, -32, 0, 0, 15, 0 },
+ { 2, -32, 0, 0, 0, 15, 0 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, 0, -32, 0, 0, 15, 0 },
+ { 5, 0, 32, 0, 0, 15, 0 },
+ { 6, 32, -32, 0, 0, 15, 0 },
+ { 7, 32, 32, 0, 0, 15, 0 },
+ { 8, 32, 0, 0, 0, 15, 2 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks067[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 32, 0, 0, 0, 0, 3 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks068[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks069[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks070[] = {
+ { 0, 0, 0, 0, 64, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks071[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks072[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks073[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks074[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks075[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks076[] = {
+ { 0, 0, 0, 0, 64, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks077[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks078[] = {
+ { 0, 0, 0, 0, 32, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks079[] = {
+ { 0, 0, 0, 0, 32, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks080[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks081[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks082[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks083[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 7, 0 },
+ { 2, -32, -32, 0, 0, 13, 0 },
+ { 3, -64, -32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks084[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 11, 0 },
+ { 2, -32, 32, 0, 0, 14, 0 },
+ { 3, -64, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks085[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 2, 0 },
+ { 3, -32, -32, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks086[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 0 },
+ { 3, -32, 32, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks087[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 4, 2, 0 },
+ { 3, -32, -32, 0, 4, 7, 0 },
+ { 4, -32, -64, 8, 0, 11, 0 },
+ { 5, 0, -64, 8, 0, 4, 1 },
+ { 6, -32, -96, 8, 4, 1, 0 },
+ { 7, 0, -96, 8, 4, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks088[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 4, 1, 0 },
+ { 3, -32, 32, 0, 4, 11, 0 },
+ { 4, -32, 64, 8, 0, 7, 0 },
+ { 5, 0, 64, 8, 0, 8, 1 },
+ { 6, -32, 96, 8, 4, 2, 0 },
+ { 7, 0, 96, 8, 4, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks089[] = {
+ { 0, 0, 0, 8, 4, 7, 0 },
+ { 1, 0, -32, 8, 4, 8, 1 },
+ { 2, -32, 0, 8, 0, 2, 0 },
+ { 3, -32, -32, 8, 0, 7, 0 },
+ { 4, -32, -64, 0, 4, 11, 0 },
+ { 5, 0, -64, 0, 4, 4, 1 },
+ { 6, -32, -96, 0, 0, 1, 0 },
+ { 7, 0, -96, 0, 0, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks090[] = {
+ { 0, 0, 0, 8, 4, 11, 0 },
+ { 1, 0, 32, 8, 4, 4, 1 },
+ { 2, -32, 0, 8, 0, 1, 0 },
+ { 3, -32, 32, 8, 0, 11, 0 },
+ { 4, -32, 64, 0, 4, 7, 0 },
+ { 5, 0, 64, 0, 4, 8, 1 },
+ { 6, -32, 96, 0, 0, 2, 0 },
+ { 7, 0, 96, 0, 0, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks091[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 4, 8, 1 },
+ { 5, -64, -32, 0, 4, 7, 0 },
+ { 6, -64, -64, 0, 4, 15, 0 },
+ { 7, -64, -96, 8, 0, 15, 0 },
+ { 8, -32, -96, 8, 0, 4, 1 },
+ { 9, -64, -128, 8, 0, 11, 0 },
+ { 10, -32, -128, 8, 0, 14, 0 },
+ { 11, 0, -128, 8, 4, 4, 1 },
+ { 12, -32, -160, 8, 4, 11, 0 },
+ { 13, 0, -160, 8, 4, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks092[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 4, 4, 1 },
+ { 5, -64, 32, 0, 4, 11, 0 },
+ { 6, -64, 64, 0, 4, 15, 0 },
+ { 7, -64, 96, 8, 0, 15, 0 },
+ { 8, -32, 96, 8, 0, 8, 1 },
+ { 9, -64, 128, 8, 0, 7, 0 },
+ { 10, -32, 128, 8, 0, 13, 0 },
+ { 11, 0, 128, 8, 4, 8, 1 },
+ { 12, -32, 160, 8, 4, 7, 0 },
+ { 13, 0, 160, 8, 4, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks093[] = {
+ { 0, 0, 0, 8, 4, 15, 0 },
+ { 1, 0, -32, 8, 4, 8, 1 },
+ { 2, -32, 0, 8, 4, 7, 0 },
+ { 3, -32, -32, 8, 0, 13, 0 },
+ { 4, -32, -64, 8, 0, 8, 1 },
+ { 5, -64, -32, 8, 0, 7, 0 },
+ { 6, -64, -64, 8, 0, 15, 0 },
+ { 7, -64, -96, 0, 4, 15, 0 },
+ { 8, -32, -96, 0, 4, 4, 1 },
+ { 9, -64, -128, 0, 4, 11, 0 },
+ { 10, -32, -128, 0, 0, 14, 0 },
+ { 11, 0, -128, 0, 0, 4, 1 },
+ { 12, -32, -160, 0, 0, 11, 0 },
+ { 13, 0, -160, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks094[] = {
+ { 0, 0, 0, 8, 4, 15, 0 },
+ { 1, 0, 32, 8, 4, 4, 1 },
+ { 2, -32, 0, 8, 4, 11, 0 },
+ { 3, -32, 32, 8, 0, 14, 0 },
+ { 4, -32, 64, 8, 0, 4, 1 },
+ { 5, -64, 32, 8, 0, 11, 0 },
+ { 6, -64, 64, 8, 0, 15, 0 },
+ { 7, -64, 96, 0, 4, 15, 0 },
+ { 8, -32, 96, 0, 4, 8, 1 },
+ { 9, -64, 128, 0, 4, 7, 0 },
+ { 10, -32, 128, 0, 0, 13, 0 },
+ { 11, 0, 128, 0, 0, 8, 1 },
+ { 12, -32, 160, 0, 0, 7, 0 },
+ { 13, 0, 160, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks095[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -64, 0, 0, 0, 15, 0 },
+ { 2, -32, 0, 0, 0, 15, 0 },
+ { 3, 32, 0, 0, 0, 15, 2 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks096[] = {
+ { 0, 0, 0, 0, 64, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks097[] = {
+ { 0, 0, 0, 0, 64, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks098[] = {
+ { 0, 0, 0, 0, 64, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks099[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks100[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks101[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks102[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 12, 8, 1 },
+ { 5, -64, -32, 0, 12, 7, 0 },
+ { 6, -64, -64, 0, 12, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks103[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 12, 4, 1 },
+ { 5, -64, 32, 0, 12, 11, 0 },
+ { 6, -64, 64, 0, 12, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks104[] = {
+ { 0, 0, 0, 0, 12, 15, 0 },
+ { 1, 0, -32, 0, 12, 8, 1 },
+ { 2, -32, 0, 0, 12, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks105[] = {
+ { 0, 0, 0, 0, 12, 15, 0 },
+ { 1, 0, 32, 0, 12, 4, 1 },
+ { 2, -32, 0, 0, 12, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks106[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 0, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 12, 8, 1 },
+ { 5, -64, -32, 0, 12, 7, 0 },
+ { 6, -64, -64, 0, 12, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks107[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 12, 4, 1 },
+ { 5, -64, 32, 0, 12, 11, 0 },
+ { 6, -64, 64, 0, 12, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks108[] = {
+ { 0, 0, 0, 0, 12, 15, 0 },
+ { 1, 0, -32, 0, 12, 8, 1 },
+ { 2, -32, 0, 0, 12, 7, 0 },
+ { 3, -32, -32, 0, 0, 13, 0 },
+ { 4, -32, -64, 0, 0, 8, 1 },
+ { 5, -64, -32, 0, 0, 7, 0 },
+ { 6, -64, -64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks109[] = {
+ { 0, 0, 0, 0, 12, 15, 0 },
+ { 1, 0, 32, 0, 12, 4, 1 },
+ { 2, -32, 0, 0, 12, 11, 0 },
+ { 3, -32, 32, 0, 0, 14, 0 },
+ { 4, -32, 64, 0, 0, 4, 1 },
+ { 5, -64, 32, 0, 0, 11, 0 },
+ { 6, -64, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks110[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 15, 0 },
+ { 2, 32, 0, 0, 0, 15, 0 },
+ { 3, 32, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks111[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 15, 0 },
+ { 2, 0, 64, 0, 0, 15, 0 },
+ { 3, 0, 96, 0, 0, 15, 0 },
+ { 4, 32, 0, 0, 0, 15, 0 },
+ { 5, 32, 32, 0, 0, 15, 0 },
+ { 6, 32, 64, 0, 0, 15, 0 },
+ { 7, 32, 96, 0, 0, 15, 0 },
+ { 8, 64, 0, 0, 0, 15, 0 },
+ { 9, 64, 32, 0, 0, 15, 0 },
+ { 10, 64, 64, 0, 0, 15, 0 },
+ { 11, 64, 96, 0, 0, 15, 0 },
+ { 12, 96, 0, 0, 0, 15, 0 },
+ { 13, 96, 32, 0, 0, 15, 0 },
+ { 14, 96, 64, 0, 0, 15, 0 },
+ { 15, 96, 96, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks112[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks113[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks114[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks115[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 15, 0 },
+ { 2, 0, 64, 0, 0, 15, 0 },
+ { 3, 0, 96, 0, 0, 15, 0 },
+ { 4, 32, 0, 0, 0, 15, 0 },
+ { 5, 32, 32, 0, 0, 15, 0 },
+ { 6, 32, 64, 0, 0, 15, 0 },
+ { 7, 32, 96, 0, 0, 15, 2 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks116[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -64, 0, 0, 0, 15, 0 },
+ { 2, -32, 0, 0, 0, 15, 0 },
+ { 3, 32, 0, 0, 0, 15, 0 },
+ { 4, 64, 0, 0, 0, 15, 2 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks117[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 0, 16, 15, 0 },
+ { 3, -96, 0, 0, 16, 15, 0 },
+ { 4, -128, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks118[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks119[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -64, 0, 0, 0, 15, 0 },
+ { 2, -32, 0, 0, 0, 15, 0 },
+ { 3, 32, 0, 0, 0, 15, 2 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks120[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks121[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks122[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -64, 0, 0, 0, 15, 0 },
+ { 2, -32, 0, 0, 0, 15, 0 },
+ { 3, 32, 0, 0, 0, 15, 2 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks123[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, -32, 0, 0, 15, 0 },
+ { 2, -32, 0, 0, 0, 15, 0 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, 0, -32, 0, 0, 15, 0 },
+ { 5, 0, 32, 0, 0, 15, 0 },
+ { 6, 32, -32, 0, 0, 15, 0 },
+ { 7, 32, 32, 0, 0, 15, 0 },
+ { 8, 32, 0, 0, 0, 15, 2 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks124[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 0, 32, 15, 0 },
+ { 2, -64, 0, 0, 48, 15, 0 },
+ { 3, -96, 0, 0, 80, 15, 0 },
+ { 4, -128, 0, 0, 160, 15, 0 },
+ { 5, -192, 0, 0, 208, 15, 0 },
+ { 6, -160, 0, 0, 208, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks125[] = {
+ { 0, 0, 0, 0, 48, 15, 0 },
+ { 1, 32, 0, 0, 48, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks126[] = {
+ { 0, 0, 0, 0, 8, 15, 4 },
+ { 1, 32, 0, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks127[] = {
+ { 0, 0, 0, 0, 8, 15, 4 },
+ { 1, 32, 0, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks128[] = {
+ { 0, 0, 0, 0, 32, 207, 4 },
+ { 1, 32, 0, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks129[] = {
+ { 0, 0, 0, 0, 32, 63, 4 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks130[] = {
+ { 0, 0, 0, 0, 56, 15, 4 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks131[] = {
+ { 0, 0, 0, 0, 56, 15, 4 },
+ { 1, 32, 0, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks132[] = {
+ { 0, 0, 0, 0, 24, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks133[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, -32, 0, 0, 8, 0 },
+ { 3, -64, 0, 0, 0, 2, 1 },
+ { 4, -64, -32, 0, 0, 1, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks134[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, 32, 0, 0, 4, 0 },
+ { 3, -64, 0, 0, 0, 1, 1 },
+ { 4, -64, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks135[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, -32, 0, 0, 0, 1, 0 },
+ { 2, 0, 32, 0, 0, 4, 1 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, -64, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks136[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 0 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, -32, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks137[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, -32, 0, 0, 8, 0 },
+ { 3, -64, 0, 0, 0, 2, 1 },
+ { 4, -64, -32, 0, 0, 1, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks138[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, 32, 0, 0, 4, 0 },
+ { 3, -64, 0, 0, 0, 1, 1 },
+ { 4, -64, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks139[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, -32, 0, 0, 0, 1, 0 },
+ { 2, 0, 32, 0, 0, 4, 1 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, -64, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks140[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 0 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 15, 0 },
+ { 4, -32, 64, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks141[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks142[] = {
+ { 0, 0, 0, 0, 16, 13, 0 },
+ { 1, 0, 32, 0, 16, 4, 1 },
+ { 2, -32, 0, 0, 16, 1, 1 },
+ { 3, -32, 32, 0, 16, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks143[] = {
+ { 0, 0, 0, 0, 64, 13, 0 },
+ { 1, 0, 32, 0, 64, 4, 1 },
+ { 2, -32, 0, 0, 64, 1, 1 },
+ { 3, -32, 32, 0, 64, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks144[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks145[] = {
+ { 0, 0, 0, 0, 32, 13, 0 },
+ { 1, 0, 32, 0, 32, 4, 1 },
+ { 2, -32, 0, 0, 32, 1, 1 },
+ { 3, -32, 32, 0, 32, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks146[] = {
+ { 0, 0, 0, 0, 32, 13, 0 },
+ { 1, 0, 32, 0, 32, 4, 1 },
+ { 2, -32, 0, 0, 32, 1, 1 },
+ { 3, -32, 32, 0, 32, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks147[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks148[] = {
+ { 0, 0, 0, 0, 16, 13, 0 },
+ { 1, 0, 32, 0, 16, 4, 1 },
+ { 2, -32, 0, 0, 16, 1, 1 },
+ { 3, -32, 32, 0, 16, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks149[] = {
+ { 0, 0, 0, 0, 64, 13, 0 },
+ { 1, 0, 32, 0, 64, 4, 1 },
+ { 2, -32, 0, 0, 64, 1, 1 },
+ { 3, -32, 32, 0, 64, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks150[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks151[] = {
+ { 0, 0, 0, 0, 32, 13, 0 },
+ { 1, 0, 32, 0, 32, 4, 1 },
+ { 2, -32, 0, 0, 32, 1, 1 },
+ { 3, -32, 32, 0, 32, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks152[] = {
+ { 0, 0, 0, 0, 32, 13, 0 },
+ { 1, 0, 32, 0, 32, 4, 1 },
+ { 2, -32, 0, 0, 32, 1, 1 },
+ { 3, -32, 32, 0, 32, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks153[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks154[] = {
+ { 0, 0, 0, 0, 24, 13, 0 },
+ { 1, 0, 32, 0, 24, 4, 1 },
+ { 2, -32, 0, 0, 24, 1, 1 },
+ { 3, -32, 32, 0, 24, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks155[] = {
+ { 0, 0, 0, 0, 24, 13, 0 },
+ { 1, 0, 32, 0, 24, 4, 1 },
+ { 2, -32, 0, 0, 24, 1, 1 },
+ { 3, -32, 32, 0, 24, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks156[] = {
+ { 0, 0, 0, 0, 24, 13, 0 },
+ { 1, 0, 32, 0, 24, 4, 1 },
+ { 2, -32, 0, 0, 24, 1, 1 },
+ { 3, -32, 32, 0, 24, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks157[] = {
+ { 0, 0, 0, 0, 24, 13, 0 },
+ { 1, 0, 32, 0, 24, 4, 1 },
+ { 2, -32, 0, 0, 24, 1, 1 },
+ { 3, -32, 32, 0, 24, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks158[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks159[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks160[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks161[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks162[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks163[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks164[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks165[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks166[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks167[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks168[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks169[] = {
+ { 0, 0, 0, 0, 8, 13, 0 },
+ { 1, 0, 32, 0, 8, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 1 },
+ { 3, -32, 32, 0, 8, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks170[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks171[] = {
+ { 0, 0, 0, 0, 0, 13, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 0, 1, 1 },
+ { 3, -32, 32, 0, 0, 2, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks172[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks173[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks174[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks175[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks176[] = {
+ { 0, 0, 0, -32, 16, 15, 0 },
+ { 1, -32, 0, -32, 16, 15, 0 },
+ { 2, -64, 0, -32, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks177[] = {
+ { 0, 0, 0, -32, 16, 15, 0 },
+ { 1, -32, 0, -32, 16, 15, 0 },
+ { 2, -64, 0, -32, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks178[] = {
+ { 0, 0, 0, 0, 0, 71, 0 },
+ { 1, 0, -32, 0, 16, 8, 1 },
+ { 2, -32, 0, 0, 16, 2, 0 },
+ { 3, -32, -32, 16, 16, 103, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks179[] = {
+ { 0, 0, 0, 0, 16, 139, 0 },
+ { 1, 0, 32, 0, 16, 4, 1 },
+ { 2, -32, 0, 0, 16, 1, 0 },
+ { 3, -32, 32, 16, 16, 155, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks180[] = {
+ { 0, 0, 0, 16, 16, 55, 0 },
+ { 1, 0, -32, 0, 16, 8, 1 },
+ { 2, -32, 0, 0, 16, 2, 0 },
+ { 3, -32, -32, 0, 0, 23, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks181[] = {
+ { 0, 0, 0, 16, 16, 59, 0 },
+ { 1, 0, 32, 0, 16, 4, 1 },
+ { 2, -32, 0, 0, 16, 1, 0 },
+ { 3, -32, 32, 0, 0, 43, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks182[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks183[] = {
+ { 0, 0, 0, 0, 24, 207, 0 },
+ { 1, -32, 0, 16, 40, 207, 0 },
+ { 2, -64, 0, 32, 56, 15, 0 },
+ { 3, -96, 0, 64, 192, 15, 0 },
+ { 4, -128, -32, 120, 96, 15, 0 },
+ { 5, -96, -32, 64, 192, 15, 0 },
+ { 6, -64, -32, 248, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks184[] = {
+ { 0, 0, 0, 0, 24, 207, 0 },
+ { 1, -32, 0, 16, 40, 207, 0 },
+ { 2, -64, 0, 32, 56, 15, 0 },
+ { 3, -96, 0, 64, 192, 15, 0 },
+ { 4, -128, 32, 120, 96, 15, 0 },
+ { 5, -96, 32, 64, 192, 15, 0 },
+ { 6, -64, 32, 248, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks185[] = {
+ { 0, 0, 0, -32, 24, 15, 0 },
+ { 1, -32, 0, -216, 192, 15, 0 },
+ { 2, -64, 0, -160, 96, 15, 0 },
+ { 3, -32, -32, -216, 192, 15, 0 },
+ { 4, 0, -32, -248, 56, 15, 0 },
+ { 5, 32, -32, -264, 40, 207, 0 },
+ { 6, 64, -32, -280, 24, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks186[] = {
+ { 0, 0, 0, -32, 24, 15, 0 },
+ { 1, -32, 0, -216, 192, 15, 0 },
+ { 2, -64, 0, -160, 96, 15, 0 },
+ { 3, -32, 32, -216, 192, 15, 0 },
+ { 4, 0, 32, -248, 56, 15, 0 },
+ { 5, 32, 32, -264, 40, 207, 0 },
+ { 6, 64, 32, -280, 24, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks187[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -16, 16, 15, 0 },
+ { 2, -64, 0, -16, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks188[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -16, 16, 15, 0 },
+ { 2, -64, 0, -16, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks189[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks190[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 0, 16, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks191[] = {
+ { 0, 0, 0, 0, 32, 207, 0 },
+ { 1, -32, 0, 16, 16, 207, 0 },
+ { 2, -64, 0, 32, 96, 3, 0 },
+ { 3, -32, 0, 120, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks192[] = {
+ { 0, 0, 0, 0, 32, 15, 0 },
+ { 1, -32, 0, -88, 96, 3, 0 },
+ { 2, 0, 0, -104, 16, 207, 0 },
+ { 3, 32, 0, -120, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks193[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 24, 32, 7, 0 },
+ { 2, -32, -32, 48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks194[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, 24, 32, 11, 0 },
+ { 2, -32, 32, 48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks195[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, -24, 32, 7, 0 },
+ { 2, -32, -32, -48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks196[] = {
+ { 0, 0, 0, 0, 16, 15, 0 },
+ { 1, -32, 0, -24, 32, 11, 0 },
+ { 2, -32, 32, -48, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks197[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 32, 15, 0 },
+ { 2, -64, 0, 16, 0, 15, 0 },
+ { 3, 0, 0, 32, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks198[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, -32, 32, 15, 0 },
+ { 2, -64, 0, -16, 0, 15, 0 },
+ { 3, 0, 0, -32, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks199[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -64, 0, 0, 0, 15, 0 },
+ { 3, -96, 0, 0, 0, 15, 0 },
+ { 4, -128, 0, 0, 0, 15, 0 },
+ { 5, -160, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks200[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -64, 0, 0, 0, 15, 0 },
+ { 3, -96, 0, 0, 0, 15, 0 },
+ { 4, -128, 0, 0, 0, 15, 0 },
+ { 5, -160, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks201[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks202[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks203[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks204[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, 32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks205[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, -32, 0, 0, 0, 15, 0 },
+ { 2, -32, -32, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks206[] = {
+ { 0, 0, 0, 0, 16, 15, 4 },
+ { 1, -32, 0, -40, 32, 15, 4 },
+ { 2, -64, 0, -96, 56, 15, 4 },
+ { 3, -96, 0, -96, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks207[] = {
+ { 0, 0, 0, 0, 56, 15, 4 },
+ { 1, 32, 0, 56, 32, 15, 4 },
+ { 2, 64, 0, 96, 16, 15, 4 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks208[] = {
+ { 0, 0, 0, -32, 16, 15, 4 },
+ { 1, -32, 0, -72, 32, 15, 4 },
+ { 2, -64, 0, -128, 56, 15, 4 },
+ { 3, -96, 0, -128, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks209[] = {
+ { 0, 0, 0, 0, 0, 7, 0 },
+ { 1, 0, -32, 0, 0, 8, 1 },
+ { 2, -32, 0, 0, 8, 2, 0 },
+ { 3, -32, -32, 0, 8, 7, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks210[] = {
+ { 0, 0, 0, 0, 0, 11, 0 },
+ { 1, 0, 32, 0, 0, 4, 1 },
+ { 2, -32, 0, 0, 8, 1, 0 },
+ { 3, -32, 32, 0, 8, 11, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks211[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, -32, 0, 0, 15, 0 },
+ { 2, -32, -32, 0, 0, 15, 0 },
+ { 3, -64, -32, 0, 0, 15, 0 },
+ { 4, -32, 0, 0, 0, 15, 0 },
+ { 5, -64, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks212[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ { 1, 0, 32, 0, 0, 15, 0 },
+ { 2, -32, 32, 0, 0, 15, 0 },
+ { 3, -64, 32, 0, 0, 15, 0 },
+ { 4, -32, 0, 0, 0, 15, 0 },
+ { 5, -64, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks213[] = {
+ { 0, 0, 0, 0, 32, 15, 0 },
+ { 1, 32, 0, 0, 32, 15, 0 },
+ { 2, -64, 0, 0, 32, 15, 0 },
+ { 3, -32, 0, 0, 32, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks214[] = {
+ { 0, 0, 0, 0, 48, 15, 0 },
+ { 1, 32, 0, 0, 48, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks215[] = {
+ { 0, 0, 0, 0, 208, 15, 0 },
+ { 1, 32, 0, 0, 208, 15, 0 },
+ { 2, -32, 0, 0, 160, 15, 0 },
+ { 3, -64, 0, 0, 80, 15, 0 },
+ { 4, -96, 0, 0, 48, 15, 0 },
+ { 5, -128, 0, 0, 32, 15, 0 },
+ { 6, -160, 0, 0, 16, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks216[] = {
+ { 0, 0, 0, 0, 0, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks217[] = {
+ { 0, 0, 0, 0, 16, 71, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 0, 2, 0 },
+ { 3, -32, -32, 16, 16, 103, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks218[] = {
+ { 0, 0, 0, 0, 16, 139, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 0, 1, 0 },
+ { 3, -32, 32, 16, 16, 155, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks219[] = {
+ { 0, 0, 0, 16, 16, 55, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 0, 2, 0 },
+ { 3, -32, -32, 0, 16, 23, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks220[] = {
+ { 0, 0, 0, 16, 16, 59, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 0, 1, 0 },
+ { 3, -32, 32, 0, 16, 43, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks221[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, 0, -32, 16, 0, 8, 1 },
+ { 2, -32, 0, 16, 16, 71, 0 },
+ { 3, -32, -32, 24, 16, 13, 0 },
+ { 4, -32, -64, 48, 0, 8, 1 },
+ { 5, -64, -32, 32, 16, 71, 0 },
+ { 6, -64, -64, 48, 16, 111, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks222[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ { 1, 0, 32, 16, 0, 4, 1 },
+ { 2, -32, 0, 16, 16, 139, 0 },
+ { 3, -32, 32, 24, 16, 14, 0 },
+ { 4, -32, 64, 48, 0, 4, 1 },
+ { 5, -64, 32, 32, 16, 139, 0 },
+ { 6, -64, 64, 48, 16, 159, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks223[] = {
+ { 0, 0, 0, 48, 16, 63, 0 },
+ { 1, 0, -32, 48, 0, 8, 1 },
+ { 2, -32, 0, 32, 16, 23, 0 },
+ { 3, -32, -32, 24, 16, 13, 0 },
+ { 4, -32, -64, 16, 0, 8, 1 },
+ { 5, -64, -32, 16, 16, 23, 0 },
+ { 6, -64, -64, 0, 16, 159, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks224[] = {
+ { 0, 0, 0, 48, 16, 63, 0 },
+ { 1, 0, 32, 48, 0, 4, 1 },
+ { 2, -32, 0, 32, 16, 43, 0 },
+ { 3, -32, 32, 24, 16, 14, 0 },
+ { 4, -32, 64, 16, 0, 4, 1 },
+ { 5, -64, 32, 16, 16, 43, 0 },
+ { 6, -64, 64, 0, 16, 111, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks225[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks226[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks227[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks228[] = {
+ { 0, 0, 0, 0, 16, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks229[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks230[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks231[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks232[] = {
+ { 0, 0, 0, 0, 16, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks233[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks234[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks235[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks236[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks237[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks238[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks239[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks240[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks241[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks242[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks243[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks244[] = {
+ { 0, 0, 0, 0, 8, 207, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks245[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks246[] = {
+ { 0, 0, 0, 0, 8, 63, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks247[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks248[] = {
+ { 0, 0, 0, 0, 8, 15, 0 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks249[] = {
+ { 0, 0, 0, 0, 72, 15, 4 },
+ { 1, 0, 32, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks250[] = {
+ { 0, 0, 0, 0, 72, 15, 4 },
+ { 1, 0, -32, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks251[] = {
+ { 0, 0, 0, 0, 72, 15, 4 },
+ { 1, 0, 32, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks252[] = {
+ { 0, 0, 0, 0, 72, 15, 4 },
+ { 1, 0, -32, 0, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks253[] = {
+ { 0, 0, 0, 0, 56, 15, 4 },
+ { 1, 32, 0, 56, 32, 15, 4 },
+ { 2, 64, 0, 96, 16, 15, 4 },
+ TRACK_BLOCK_END
+};
+
+static const rct_preview_track FlatRideTrackBlocks254[] = {
+ { 0, 0, 0, -32, 16, 15, 4 },
+ { 1, -32, 0, -72, 32, 15, 4 },
+ { 2, -64, 0, -128, 56, 15, 4 },
+ { 3, -96, 0, -128, 0, 0, 5 },
+ TRACK_BLOCK_END
+};
+
+// rct2: 0x00994A38
+const rct_preview_track *FlatRideTrackBlocks[255] = {
+ FlatRideTrackBlocks000,
+ FlatRideTrackBlocks001,
+ FlatRideTrackBlocks002,
+ FlatRideTrackBlocks003,
+ FlatRideTrackBlocks004,
+ FlatRideTrackBlocks005,
+ FlatRideTrackBlocks006,
+ FlatRideTrackBlocks007,
+ FlatRideTrackBlocks008,
+ FlatRideTrackBlocks009,
+ FlatRideTrackBlocks010,
+ FlatRideTrackBlocks011,
+ FlatRideTrackBlocks012,
+ FlatRideTrackBlocks013,
+ FlatRideTrackBlocks014,
+ FlatRideTrackBlocks015,
+ FlatRideTrackBlocks016,
+ FlatRideTrackBlocks017,
+ FlatRideTrackBlocks018,
+ FlatRideTrackBlocks019,
+ FlatRideTrackBlocks020,
+ FlatRideTrackBlocks021,
+ FlatRideTrackBlocks022,
+ FlatRideTrackBlocks023,
+ FlatRideTrackBlocks024,
+ FlatRideTrackBlocks025,
+ FlatRideTrackBlocks026,
+ FlatRideTrackBlocks027,
+ FlatRideTrackBlocks028,
+ FlatRideTrackBlocks029,
+ FlatRideTrackBlocks030,
+ FlatRideTrackBlocks031,
+ FlatRideTrackBlocks032,
+ FlatRideTrackBlocks033,
+ FlatRideTrackBlocks034,
+ FlatRideTrackBlocks035,
+ FlatRideTrackBlocks036,
+ FlatRideTrackBlocks037,
+ FlatRideTrackBlocks038,
+ FlatRideTrackBlocks039,
+ FlatRideTrackBlocks040,
+ FlatRideTrackBlocks041,
+ FlatRideTrackBlocks042,
+ FlatRideTrackBlocks043,
+ FlatRideTrackBlocks044,
+ FlatRideTrackBlocks045,
+ FlatRideTrackBlocks046,
+ FlatRideTrackBlocks047,
+ FlatRideTrackBlocks048,
+ FlatRideTrackBlocks049,
+ FlatRideTrackBlocks050,
+ FlatRideTrackBlocks051,
+ FlatRideTrackBlocks052,
+ FlatRideTrackBlocks053,
+ FlatRideTrackBlocks054,
+ FlatRideTrackBlocks055,
+ FlatRideTrackBlocks056,
+ FlatRideTrackBlocks057,
+ FlatRideTrackBlocks058,
+ FlatRideTrackBlocks059,
+ FlatRideTrackBlocks060,
+ FlatRideTrackBlocks061,
+ FlatRideTrackBlocks062,
+ FlatRideTrackBlocks063,
+ FlatRideTrackBlocks064,
+ FlatRideTrackBlocks065,
+ FlatRideTrackBlocks066,
+ FlatRideTrackBlocks067,
+ FlatRideTrackBlocks068,
+ FlatRideTrackBlocks069,
+ FlatRideTrackBlocks070,
+ FlatRideTrackBlocks071,
+ FlatRideTrackBlocks072,
+ FlatRideTrackBlocks073,
+ FlatRideTrackBlocks074,
+ FlatRideTrackBlocks075,
+ FlatRideTrackBlocks076,
+ FlatRideTrackBlocks077,
+ FlatRideTrackBlocks078,
+ FlatRideTrackBlocks079,
+ FlatRideTrackBlocks080,
+ FlatRideTrackBlocks081,
+ FlatRideTrackBlocks082,
+ FlatRideTrackBlocks083,
+ FlatRideTrackBlocks084,
+ FlatRideTrackBlocks085,
+ FlatRideTrackBlocks086,
+ FlatRideTrackBlocks087,
+ FlatRideTrackBlocks088,
+ FlatRideTrackBlocks089,
+ FlatRideTrackBlocks090,
+ FlatRideTrackBlocks091,
+ FlatRideTrackBlocks092,
+ FlatRideTrackBlocks093,
+ FlatRideTrackBlocks094,
+ FlatRideTrackBlocks095,
+ FlatRideTrackBlocks096,
+ FlatRideTrackBlocks097,
+ FlatRideTrackBlocks098,
+ FlatRideTrackBlocks099,
+ FlatRideTrackBlocks100,
+ FlatRideTrackBlocks101,
+ FlatRideTrackBlocks102,
+ FlatRideTrackBlocks103,
+ FlatRideTrackBlocks104,
+ FlatRideTrackBlocks105,
+ FlatRideTrackBlocks106,
+ FlatRideTrackBlocks107,
+ FlatRideTrackBlocks108,
+ FlatRideTrackBlocks109,
+ FlatRideTrackBlocks110,
+ FlatRideTrackBlocks111,
+ FlatRideTrackBlocks112,
+ FlatRideTrackBlocks113,
+ FlatRideTrackBlocks114,
+ FlatRideTrackBlocks115,
+ FlatRideTrackBlocks116,
+ FlatRideTrackBlocks117,
+ FlatRideTrackBlocks118,
+ FlatRideTrackBlocks119,
+ FlatRideTrackBlocks120,
+ FlatRideTrackBlocks121,
+ FlatRideTrackBlocks122,
+ FlatRideTrackBlocks123,
+ FlatRideTrackBlocks124,
+ FlatRideTrackBlocks125,
+ FlatRideTrackBlocks126,
+ FlatRideTrackBlocks127,
+ FlatRideTrackBlocks128,
+ FlatRideTrackBlocks129,
+ FlatRideTrackBlocks130,
+ FlatRideTrackBlocks131,
+ FlatRideTrackBlocks132,
+ FlatRideTrackBlocks133,
+ FlatRideTrackBlocks134,
+ FlatRideTrackBlocks135,
+ FlatRideTrackBlocks136,
+ FlatRideTrackBlocks137,
+ FlatRideTrackBlocks138,
+ FlatRideTrackBlocks139,
+ FlatRideTrackBlocks140,
+ FlatRideTrackBlocks141,
+ FlatRideTrackBlocks142,
+ FlatRideTrackBlocks143,
+ FlatRideTrackBlocks144,
+ FlatRideTrackBlocks145,
+ FlatRideTrackBlocks146,
+ FlatRideTrackBlocks147,
+ FlatRideTrackBlocks148,
+ FlatRideTrackBlocks149,
+ FlatRideTrackBlocks150,
+ FlatRideTrackBlocks151,
+ FlatRideTrackBlocks152,
+ FlatRideTrackBlocks153,
+ FlatRideTrackBlocks154,
+ FlatRideTrackBlocks155,
+ FlatRideTrackBlocks156,
+ FlatRideTrackBlocks157,
+ FlatRideTrackBlocks158,
+ FlatRideTrackBlocks159,
+ FlatRideTrackBlocks160,
+ FlatRideTrackBlocks161,
+ FlatRideTrackBlocks162,
+ FlatRideTrackBlocks163,
+ FlatRideTrackBlocks164,
+ FlatRideTrackBlocks165,
+ FlatRideTrackBlocks166,
+ FlatRideTrackBlocks167,
+ FlatRideTrackBlocks168,
+ FlatRideTrackBlocks169,
+ FlatRideTrackBlocks170,
+ FlatRideTrackBlocks171,
+ FlatRideTrackBlocks172,
+ FlatRideTrackBlocks173,
+ FlatRideTrackBlocks174,
+ FlatRideTrackBlocks175,
+ FlatRideTrackBlocks176,
+ FlatRideTrackBlocks177,
+ FlatRideTrackBlocks178,
+ FlatRideTrackBlocks179,
+ FlatRideTrackBlocks180,
+ FlatRideTrackBlocks181,
+ FlatRideTrackBlocks182,
+ FlatRideTrackBlocks183,
+ FlatRideTrackBlocks184,
+ FlatRideTrackBlocks185,
+ FlatRideTrackBlocks186,
+ FlatRideTrackBlocks187,
+ FlatRideTrackBlocks188,
+ FlatRideTrackBlocks189,
+ FlatRideTrackBlocks190,
+ FlatRideTrackBlocks191,
+ FlatRideTrackBlocks192,
+ FlatRideTrackBlocks193,
+ FlatRideTrackBlocks194,
+ FlatRideTrackBlocks195,
+ FlatRideTrackBlocks196,
+ FlatRideTrackBlocks197,
+ FlatRideTrackBlocks198,
+ FlatRideTrackBlocks199,
+ FlatRideTrackBlocks200,
+ FlatRideTrackBlocks201,
+ FlatRideTrackBlocks202,
+ FlatRideTrackBlocks203,
+ FlatRideTrackBlocks204,
+ FlatRideTrackBlocks205,
+ FlatRideTrackBlocks206,
+ FlatRideTrackBlocks207,
+ FlatRideTrackBlocks208,
+ FlatRideTrackBlocks209,
+ FlatRideTrackBlocks210,
+ FlatRideTrackBlocks211,
+ FlatRideTrackBlocks212,
+ FlatRideTrackBlocks213,
+ FlatRideTrackBlocks214,
+ FlatRideTrackBlocks215,
+ FlatRideTrackBlocks216,
+ FlatRideTrackBlocks217,
+ FlatRideTrackBlocks218,
+ FlatRideTrackBlocks219,
+ FlatRideTrackBlocks220,
+ FlatRideTrackBlocks221,
+ FlatRideTrackBlocks222,
+ FlatRideTrackBlocks223,
+ FlatRideTrackBlocks224,
+ FlatRideTrackBlocks225,
+ FlatRideTrackBlocks226,
+ FlatRideTrackBlocks227,
+ FlatRideTrackBlocks228,
+ FlatRideTrackBlocks229,
+ FlatRideTrackBlocks230,
+ FlatRideTrackBlocks231,
+ FlatRideTrackBlocks232,
+ FlatRideTrackBlocks233,
+ FlatRideTrackBlocks234,
+ FlatRideTrackBlocks235,
+ FlatRideTrackBlocks236,
+ FlatRideTrackBlocks237,
+ FlatRideTrackBlocks238,
+ FlatRideTrackBlocks239,
+ FlatRideTrackBlocks240,
+ FlatRideTrackBlocks241,
+ FlatRideTrackBlocks242,
+ FlatRideTrackBlocks243,
+ FlatRideTrackBlocks244,
+ FlatRideTrackBlocks245,
+ FlatRideTrackBlocks246,
+ FlatRideTrackBlocks247,
+ FlatRideTrackBlocks248,
+ FlatRideTrackBlocks249,
+ FlatRideTrackBlocks250,
+ FlatRideTrackBlocks251,
+ FlatRideTrackBlocks252,
+ FlatRideTrackBlocks253,
+ FlatRideTrackBlocks254
+};
diff --git a/src/ride/track_data.h b/src/ride/track_data.h
index c10ad9bd3d..e4da7a149f 100644
--- a/src/ride/track_data.h
+++ b/src/ride/track_data.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*****************************************************************************/
+
#include "../common.h"
/* size 0x0A */
@@ -30,4 +31,8 @@ typedef struct{
}rct_track_coordinates;
// 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3
-extern const rct_track_coordinates TrackCoordinates[256];
\ No newline at end of file
+extern const rct_track_coordinates TrackCoordinates[256];
+
+extern const uint64 RideTypePossibleTrackConfigurations[91];
+extern const rct_preview_track *TrackBlocks[256];
+extern const rct_preview_track *FlatRideTrackBlocks[255];
diff --git a/src/title.c b/src/title.c
index 160de8c665..b8c9e715ab 100644
--- a/src/title.c
+++ b/src/title.c
@@ -720,7 +720,7 @@ bool title_refresh_sequence()
if (_loadedScript != _magicMountainScript)
SafeFree(_loadedScript);
_scriptCurrentPreset = 0;
- _loadedScript = _magicMountainScript;
+ _loadedScript = (uint8*)_magicMountainScript;
_currentScript = _magicMountainScript;
_scriptWaitCounter = 0;
gTitleScriptCommand = -1;
diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c
index f69aa0ba1c..bfbbc7d543 100644
--- a/src/windows/editor_object_selection.c
+++ b/src/windows/editor_object_selection.c
@@ -31,7 +31,7 @@
#include "error.h"
#include "../interface/themes.h"
#include "dropdown.h"
-
+#include "../rct1.h"
enum {
FILTER_RCT2 = (1 << 0),
@@ -95,10 +95,10 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX {
WIDX_TAB_9, // 12, 1000
WIDX_TAB_10, // 13, 2000
WIDX_TAB_11, // 14, 4000
- WIDX_DROPDOWN1, // 15, 8000
+ WIDX_ADVANCED, // 15, 8000
WIDX_LIST, // 16, 10000
WIDX_PREVIEW, // 17, 20000
- WIDX_DROPDOWN2, // 18, 40000
+ WIDX_INSTALL_TRACK, // 18, 40000
WIDX_FILTER_DROPDOWN, // 19, 80000
WIDX_FILTER_STRING_BUTTON, // 20, 100000
WIDX_FILTER_CLEAR_BUTTON, // 21, 200000
@@ -109,7 +109,9 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX {
WIDX_FILTER_RIDE_TAB_COASTER,
WIDX_FILTER_RIDE_TAB_THRILL,
WIDX_FILTER_RIDE_TAB_WATER,
- WIDX_FILTER_RIDE_TAB_STALL
+ WIDX_FILTER_RIDE_TAB_STALL,
+ WIDX_LIST_SORT_TYPE,
+ WIDX_LIST_SORT_RIDE,
};
static rct_widget window_editor_object_selection_widgets[] = {
@@ -135,7 +137,7 @@ static rct_widget window_editor_object_selection_widgets[] = {
{ WWT_DROPDOWN_BUTTON, 0, 350, 463, 23, 34, 5261, 5265 },
{ WWT_TEXT_BOX, 1, 4, 214, 46, 57, (uint32)_filter_string, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 218, 287, 46, 57, 5277, STR_NONE },
- { WWT_RESIZE, 1, 3, 287, 73, 76, 0xFFFFFFFF, STR_NONE },
+ { WWT_IMGBTN, 1, 3, 287, 73, 76, 0xFFFFFFFF, STR_NONE },
{ WWT_TAB, 1, 3, 33, 47, 73, 0x2000144E, 5349 },
{ WWT_TAB, 1, 34, 64, 47, 73, 0x2000144E, 1223 },
{ WWT_TAB, 1, 65, 95, 47, 73, 0x2000144E, 1224 },
@@ -143,6 +145,8 @@ static rct_widget window_editor_object_selection_widgets[] = {
{ WWT_TAB, 1, 127, 157, 47, 73, 0x2000144E, 1226 },
{ WWT_TAB, 1, 158, 188, 47, 73, 0x2000144E, 1227 },
{ WWT_TAB, 1, 189, 219, 47, 73, 0x2000144E, 1228 },
+ { WWT_13, 1, 4, 204, 80, 93, STR_NONE, STR_NONE },
+ { WWT_13, 1, 205, 291, 80, 93, STR_NONE, STR_NONE },
{ WIDGETS_END }
};
@@ -154,6 +158,7 @@ static void window_editor_object_selection_emptysub() { }
static void window_editor_object_selection_close();
static void window_editor_object_selection_mouseup();
+static void window_editor_object_selection_resize();
static void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct_widget* widget);
static void window_editor_object_selection_dropdown();
static void window_editor_object_selection_update(rct_window *w);
@@ -169,7 +174,7 @@ static void window_editor_object_selection_textinput();
static void* window_editor_object_selection_events[] = {
window_editor_object_selection_close,
(void*)window_editor_object_selection_mouseup,
- (void*)window_editor_object_selection_emptysub,
+ (void*)window_editor_object_selection_resize,
(void*)window_editor_object_selection_mousedown,
(void*)window_editor_object_selection_dropdown,
(void*)window_editor_object_selection_emptysub,
@@ -199,6 +204,9 @@ static void* window_editor_object_selection_events[] = {
#pragma endregion
+const int window_editor_object_selection_animation_loops[] = { 20, 32, 10, 72, 24, 28, 16 };
+const int window_editor_object_selection_animation_divisor[] = { 4, 8, 2, 4, 4, 4, 2 };
+
static void window_editor_object_set_page(rct_window *w, int page);
static void window_editor_object_selection_set_pressed_tab(rct_window *w);
static void window_editor_object_selection_select_default_objects();
@@ -218,13 +226,13 @@ static int sub_6AB211();
static rct_object_entry RequiredSelectedObjects[] = {
// Objects that are always required
- { 0x00000087, { "SCGTREES" }, 0 }, // Scenery: Trees
- { 0x00000087, { "SCGSHRUB" }, 0 }, // Scenery: Shrubs and Ornaments
- { 0x00000087, { "SCGGARDN" }, 0 }, // Scenery: Gardens
- { 0x00000087, { "SCGFENCE" }, 0 }, // Scenery: Fences and Walls
- { 0x00000087, { "SCGWALLS" }, 0 }, // Scenery: Walls and Roofs
- { 0x00000087, { "SCGPATHX" }, 0 }, // Scenery: Signs and Items for Footpaths
- { 0x00000085, { "TARMAC " }, 0 }, // Footpath: Tarmac
+ { 0x00000087, { "SCGTREES" }, 0 }, // Scenery: Trees
+ { 0x00000087, { "SCGSHRUB" }, 0 }, // Scenery: Shrubs and Ornaments
+ { 0x00000087, { "SCGGARDN" }, 0 }, // Scenery: Gardens
+ { 0x00000087, { "SCGFENCE" }, 0 }, // Scenery: Fences and Walls
+ { 0x00000087, { "SCGWALLS" }, 0 }, // Scenery: Walls and Roofs
+ { 0x00000087, { "SCGPATHX" }, 0 }, // Scenery: Signs and Items for Footpaths
+ { 0x00000085, { "TARMAC " }, 0 }, // Footpath: Tarmac
};
static rct_object_entry DefaultSelectedObjects[] = {
@@ -259,6 +267,106 @@ static rct_object_entry DefaultSelectedObjects[] = {
{ 0x00000087, { "SCGWATER" }, 0 } // Water Feature Themeing
};
+enum {
+ RIDE_SORT_TYPE,
+ RIDE_SORT_RIDE
+};
+
+typedef struct {
+ rct_object_entry *entry;
+ rct_object_filters *filter;
+ uint8 *flags;
+} list_item;
+
+typedef int (*sortFunc)(const void *, const void *);
+
+static int _numListItems = 0;
+static list_item *_listItems = NULL;
+static int _listSortType = RIDE_SORT_TYPE;
+static bool _listSortDescending = false;
+
+static void visible_list_dispose()
+{
+ SafeFree(_listItems);
+ _numListItems = 0;
+}
+
+static int visible_list_sort_ride_name(const void *rawA, const void *rawB)
+{
+ list_item *a = (list_item*)rawA;
+ list_item *b = (list_item*)rawB;
+
+ const char *nameA = object_get_name(a->entry);
+ const char *nameB = object_get_name(b->entry);
+ return strcmp(nameA, nameB);
+}
+
+static int visible_list_sort_ride_type(const void *rawA, const void *rawB)
+{
+ list_item *a = (list_item*)rawA;
+ list_item *b = (list_item*)rawB;
+
+ const char *rideTypeA = language_get_string(2 + a->filter->ride.ride_type);
+ const char *rideTypeB = language_get_string(2 + b->filter->ride.ride_type);
+ int result = strcmp(rideTypeA, rideTypeB);
+ if (result != 0)
+ return result;
+
+ return visible_list_sort_ride_name(rawA, rawB);
+}
+
+static void visible_list_refresh(rct_window *w)
+{
+ int numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32);
+
+ visible_list_dispose();
+ _listItems = malloc(numObjects * sizeof(list_item));
+ _numListItems = 0;
+
+ list_item *currentListItem = &_listItems[0];
+ rct_object_entry *entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
+ uint8 *itemFlags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
+ for (int i = 0; i < numObjects; i++) {
+ rct_object_filters *filter = get_object_filter(i);
+ int type = entry->flags & 0x0F;
+ int source = (entry->flags & 0xF0) >> 4;
+ if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry) && filter_chunks(entry, filter)) {
+ currentListItem->entry = entry;
+ currentListItem->filter = filter;
+ currentListItem->flags = itemFlags;
+ currentListItem++;
+ _numListItems++;
+ }
+
+ entry = object_get_next(entry);
+ itemFlags++;
+ }
+
+ _listItems = realloc(_listItems, _numListItems * sizeof(list_item));
+
+ sortFunc sortFunc;
+ switch (_listSortType) {
+ case RIDE_SORT_TYPE:
+ sortFunc = visible_list_sort_ride_type;
+ break;
+ case RIDE_SORT_RIDE:
+ sortFunc = visible_list_sort_ride_name;
+ break;
+ }
+ qsort(_listItems, _numListItems, sizeof(list_item), sortFunc);
+
+ if (_listSortDescending) {
+ for (int i = 0; i < _numListItems / 2; i++) {
+ int ri = _numListItems - i - 1;
+ list_item temp = _listItems[i];
+ _listItems[i] = _listItems[ri];
+ _listItems[ri] = temp;
+ }
+ }
+
+ window_invalidate(w);
+}
+
/**
*
* rct2: 0x006AA64E
@@ -280,17 +388,19 @@ void window_editor_object_selection_open()
400,
(uint32*)window_editor_object_selection_events,
WC_EDITOR_OBJECT_SELECTION,
- WF_10
+ WF_10 | WF_RESIZABLE
);
window->widgets = window_editor_object_selection_widgets;
window->enabled_widgets =
- (1 << WIDX_DROPDOWN1) |
- (1 << WIDX_DROPDOWN2) |
+ (1 << WIDX_ADVANCED) |
+ (1 << WIDX_INSTALL_TRACK) |
(1 << WIDX_FILTER_DROPDOWN) |
(1 << WIDX_FILTER_STRING_BUTTON) |
(1 << WIDX_FILTER_CLEAR_BUTTON) |
- (1 << WIDX_CLOSE);
+ (1 << WIDX_CLOSE) |
+ (1 << WIDX_LIST_SORT_TYPE) |
+ (1 << WIDX_LIST_SORT_RIDE);
_filter_flags = FILTER_ALL;
memset(_filter_string, 0, sizeof(_filter_string));
@@ -303,6 +413,12 @@ void window_editor_object_selection_open()
window->selected_tab = 0;
window->selected_list_item = -1;
window->var_494 = 0xFFFFFFFF;
+ window->min_width = 600;
+ window->min_height = 400;
+ window->max_width = 1200;
+ window->max_height = 1000;
+
+ visible_list_refresh(window);
}
/* rct2: 0x006ABCD1 */
@@ -608,7 +724,7 @@ void unload_unselected_objects(){
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
if (!(*selection_flags & OBJECT_SELECTION_FLAG_SELECTED)){
remove_selected_objects_from_research(installedObject);
- object_unload(0, (rct_object_entry_extended*)installedObject);
+ object_unload(installedObject);
}
selection_flags++;
installedObject = object_get_next(installedObject);
@@ -646,6 +762,8 @@ static void window_editor_object_selection_close()
gSilentResearch = false;
}
window_new_ride_init_vars();
+
+ visible_list_dispose();
}
/**
@@ -686,6 +804,7 @@ static void window_editor_object_selection_mouseup()
case WIDX_FILTER_RIDE_TAB_ALL:
_filter_flags |= 0x7E0;
filter_update_counts();
+ visible_list_refresh(w);
w->selected_list_item = -1;
w->var_494 = 0xFFFFFFFF;
@@ -703,6 +822,7 @@ static void window_editor_object_selection_mouseup()
_filter_flags |= (1 << (widgetIndex - WIDX_FILTER_RIDE_TAB_TRANSPORT + 5));
filter_update_counts();
+ visible_list_refresh(w);
w->selected_list_item = -1;
w->var_494 = 0xFFFFFFFF;
@@ -711,12 +831,12 @@ static void window_editor_object_selection_mouseup()
window_invalidate(w);
break;
- case WIDX_DROPDOWN1:
+ case WIDX_ADVANCED:
w->list_information_type ^= 1;
window_invalidate(w);
break;
- case WIDX_DROPDOWN2:
+ case WIDX_INSTALL_TRACK:
if (w->selected_list_item != -1) {
w->selected_list_item = -1;
object_free_scenario_text();
@@ -736,9 +856,36 @@ static void window_editor_object_selection_mouseup()
window_invalidate(w);
break;
+ case WIDX_LIST_SORT_TYPE:
+ if (_listSortType == RIDE_SORT_TYPE) {
+ _listSortDescending = !_listSortDescending;
+ } else {
+ _listSortType = RIDE_SORT_TYPE;
+ _listSortDescending = false;
+ }
+ visible_list_refresh(w);
+ break;
+ case WIDX_LIST_SORT_RIDE:
+ if (_listSortType == RIDE_SORT_RIDE) {
+ _listSortDescending = !_listSortDescending;
+ } else {
+ _listSortType = RIDE_SORT_RIDE;
+ _listSortDescending = false;
+ }
+ visible_list_refresh(w);
+ break;
}
}
+static void window_editor_object_selection_resize()
+{
+ rct_window *w;
+
+ window_get_register(w);
+
+ window_set_resize(w, 600, 400, 1200, 1000);
+}
+
void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct_widget* widget)
{
int num_items;
@@ -790,6 +937,7 @@ static void window_editor_object_selection_dropdown()
filter_update_counts();
w->scrolls->v_top = 0;
+ visible_list_refresh(w);
window_invalidate(w);
break;
}
@@ -803,18 +951,13 @@ static void window_editor_object_selection_scrollgetsize()
{
rct_window *w;
short scrollIndex;
- int numItems, width, height;
+ int width, height;
window_scroll_get_registers(w, scrollIndex);
- numItems = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER) ?
- RCT2_GLOBAL(0x00F43412, uint16) :
- ((_FILTER_ALL && _filter_string[0] == 0) ?
- RCT2_ADDRESS(0x00F433E1, uint16)[w->selected_tab] :
- _filter_object_counts[w->selected_tab]);
-
width = 0;
- height = numItems * 12;
+ height = _numListItems * 12;
+
window_scrollsize_set_registers(width, height);
}
@@ -953,30 +1096,50 @@ static void window_editor_object_selection_invalidate()
rct_widget *widget;
window_get_register(w);
+
colour_scheme_update(w);
+ // Resize widgets
+ w->widgets[WIDX_BACKGROUND].right = w->width - 1;
+ w->widgets[WIDX_BACKGROUND].bottom = w->height - 1;
+ w->widgets[WIDX_TITLE].right = w->width - 2;
+ w->widgets[WIDX_CLOSE].left = w->width - 13;
+ w->widgets[WIDX_CLOSE].right = w->width - 3;
+ w->widgets[WIDX_TAB_CONTENT_PANEL].right = w->width - 1;
+ w->widgets[WIDX_TAB_CONTENT_PANEL].bottom = w->height - 1;
+ w->widgets[WIDX_ADVANCED].left = w->width - 130;
+ w->widgets[WIDX_ADVANCED].right = w->width - 9;
+ w->widgets[WIDX_LIST].right = w->width - 309;
+ w->widgets[WIDX_LIST].bottom = w->height - 14;
+ w->widgets[WIDX_PREVIEW].left = w->width - 209;
+ w->widgets[WIDX_PREVIEW].right = w->width - 96;
+ w->widgets[WIDX_INSTALL_TRACK].left = w->width - 216;
+ w->widgets[WIDX_INSTALL_TRACK].right = w->width - 130;
+ w->widgets[WIDX_FILTER_DROPDOWN].left = w->width - 250;
+ w->widgets[WIDX_FILTER_DROPDOWN].right = w->width - 137;
+
// Set pressed widgets
w->pressed_widgets |= 1 << WIDX_PREVIEW;
window_editor_object_selection_set_pressed_tab(w);
if (w->list_information_type & 1)
- w->pressed_widgets |= (1 << WIDX_DROPDOWN1);
+ w->pressed_widgets |= (1 << WIDX_ADVANCED);
else
- w->pressed_widgets &= ~(1 << WIDX_DROPDOWN1);
+ w->pressed_widgets &= ~(1 << WIDX_ADVANCED);
// Set window title and buttons
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = STR_OBJECT_SELECTION_RIDE_VEHICLES_ATTRACTIONS + w->selected_tab;
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) {
w->widgets[WIDX_TITLE].image = STR_TRACK_DESIGNS_MANAGER_SELECT_RIDE_TYPE;
w->widgets[WIDX_CLOSE].type = WWT_EMPTY;
- w->widgets[WIDX_DROPDOWN2].type = WWT_DROPDOWN_BUTTON;
+ w->widgets[WIDX_INSTALL_TRACK].type = WWT_DROPDOWN_BUTTON;
} else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) {
w->widgets[WIDX_TITLE].image = STR_ROLLER_COASTER_DESIGNER_SELECT_RIDE_TYPES_VEHICLES;
w->widgets[WIDX_CLOSE].type = WWT_CLOSEBOX;
- w->widgets[WIDX_DROPDOWN2].type = WWT_EMPTY;
+ w->widgets[WIDX_INSTALL_TRACK].type = WWT_EMPTY;
} else {
w->widgets[WIDX_TITLE].image = STR_OBJECT_SELECTION;
w->widgets[WIDX_CLOSE].type = WWT_CLOSEBOX;
- w->widgets[WIDX_DROPDOWN2].type = WWT_EMPTY;
+ w->widgets[WIDX_INSTALL_TRACK].type = WWT_EMPTY;
}
// Align tabs, hide advanced ones
@@ -995,25 +1158,29 @@ static void window_editor_object_selection_invalidate()
}
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_MANAGER | SCREEN_FLAGS_TRACK_DESIGNER)) {
- w->widgets[WIDX_DROPDOWN1].type = WWT_EMPTY;
+ w->widgets[WIDX_ADVANCED].type = WWT_EMPTY;
w->widgets[WIDX_FILTER_DROPDOWN].type = WWT_EMPTY;
for (i = 1; i < WINDOW_OBJECT_SELECTION_PAGE_COUNT; i++)
w->widgets[WIDX_TAB_1 + i].type = WWT_EMPTY;
x = 150;
} else {
- w->widgets[WIDX_DROPDOWN1].type = WWT_DROPDOWN_BUTTON;
+ w->widgets[WIDX_ADVANCED].type = WWT_DROPDOWN_BUTTON;
w->widgets[WIDX_FILTER_DROPDOWN].type = WWT_DROPDOWN_BUTTON;
x = 300;
}
- w->widgets[WIDX_LIST].right = 587 - x;
- w->widgets[WIDX_PREVIEW].left = 537 - (x >> 1);
+ w->widgets[WIDX_LIST].right = w->width - (600 - 587) - x;
+ w->widgets[WIDX_PREVIEW].left = w->width - (600 - 537) - (x / 2);
w->widgets[WIDX_PREVIEW].right = w->widgets[WIDX_PREVIEW].left + 113;
+ w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].right = w->widgets[WIDX_LIST].right;
bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS);
- w->widgets[WIDX_LIST].top = (ridePage ? 94 : 60);
+ w->widgets[WIDX_LIST].top = (ridePage ? 118 : 60);
+ w->widgets[WIDX_FILTER_STRING_BUTTON].right = w->widgets[WIDX_LIST].right - 77;
w->widgets[WIDX_FILTER_STRING_BUTTON].top = (ridePage ? 80 : 46);
w->widgets[WIDX_FILTER_STRING_BUTTON].bottom = (ridePage ? 91 : 57);
+ w->widgets[WIDX_FILTER_CLEAR_BUTTON].left = w->widgets[WIDX_LIST].right - 73;
+ w->widgets[WIDX_FILTER_CLEAR_BUTTON].right = w->widgets[WIDX_LIST].right;
w->widgets[WIDX_FILTER_CLEAR_BUTTON].top = (ridePage ? 80 : 46);
w->widgets[WIDX_FILTER_CLEAR_BUTTON].bottom = (ridePage ? 91 : 57);
@@ -1031,16 +1198,27 @@ static void window_editor_object_selection_invalidate()
w->pressed_widgets |= (uint64)(1 << (WIDX_FILTER_RIDE_TAB_TRANSPORT + i));
}
}
- w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].type = WWT_RESIZE;
+ w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].type = WWT_IMGBTN;
for (int i = WIDX_FILTER_RIDE_TAB_ALL; i <= WIDX_FILTER_RIDE_TAB_STALL; i++)
w->widgets[i].type = WWT_TAB;
- }
- else {
+
+ w->widgets[WIDX_LIST_SORT_TYPE].type = WWT_13;
+ w->widgets[WIDX_LIST_SORT_TYPE].top = w->widgets[WIDX_FILTER_STRING_BUTTON].bottom + 3;
+ w->widgets[WIDX_LIST_SORT_TYPE].bottom = w->widgets[WIDX_LIST_SORT_TYPE].top + 13;
+ w->widgets[WIDX_LIST_SORT_RIDE].type = WWT_13;
+ w->widgets[WIDX_LIST_SORT_RIDE].top = w->widgets[WIDX_LIST_SORT_TYPE].top;
+ w->widgets[WIDX_LIST_SORT_RIDE].bottom = w->widgets[WIDX_LIST_SORT_TYPE].bottom;
+ w->widgets[WIDX_LIST_SORT_RIDE].right = w->widgets[WIDX_LIST].right;
+ w->widgets[WIDX_LIST].top = w->widgets[WIDX_LIST_SORT_TYPE].bottom + 2;
+ } else {
w->enabled_widgets &= ~((1 << WIDX_FILTER_RIDE_TAB_ALL) | (1 << WIDX_FILTER_RIDE_TAB_TRANSPORT) |
(1 << WIDX_FILTER_RIDE_TAB_GENTLE) | (1 << WIDX_FILTER_RIDE_TAB_COASTER) | (1 << WIDX_FILTER_RIDE_TAB_THRILL) |
(1 << WIDX_FILTER_RIDE_TAB_WATER) | (1 << WIDX_FILTER_RIDE_TAB_STALL));
for (int i = WIDX_FILTER_RIDE_TAB_FRAME; i <= WIDX_FILTER_RIDE_TAB_STALL; i++)
w->widgets[i].type = WWT_EMPTY;
+
+ w->widgets[WIDX_LIST_SORT_TYPE].type = WWT_EMPTY;
+ w->widgets[WIDX_LIST_SORT_RIDE].type = WWT_EMPTY;
}
}
@@ -1085,18 +1263,28 @@ static void window_editor_object_selection_paint()
gfx_draw_sprite(dpi, 5458 + i, x, y, 0);
}
- const int ride_tabs[] = { 5458, 0x200015A1, 5542, 0x200015AA, 5557 + 5, 5551, 5530, 5327 };
+ const int ride_tabs[] = { 5458, 0x200015A1, 5542, 0x200015AA, 5557, 5551, 5530, 5327 };
+ const int ThrillRidesTabAnimationSequence[] = {
+ 5, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0
+ };
// Draw ride tabs
if (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS) {
for (i = 0; i < 7; i++) {
- widget = &w->widgets[WIDX_FILTER_RIDE_TAB_ALL + i];
+ widget = &w->widgets[WIDX_FILTER_RIDE_TAB_ALL + i];
if (widget->type == WWT_EMPTY)
continue;
+ int spriteIndex = ride_tabs[i];
+ int frame = 0;
+ if (w->pressed_widgets & (1ULL << (WIDX_FILTER_RIDE_TAB_ALL + i))) {
+ frame = w->frame_no / window_editor_object_selection_animation_divisor[i - 1];
+ }
+ spriteIndex += (i == 4 ? ThrillRidesTabAnimationSequence[frame] : frame);
+
x = w->x + widget->left;
y = w->y + widget->top;
- gfx_draw_sprite(dpi, ride_tabs[i] | (w->colours[1] << 19), x, y, 0);
+ gfx_draw_sprite(dpi, spriteIndex | (w->colours[1] << 19), x, y, 0);
}
}
@@ -1149,6 +1337,18 @@ static void window_editor_object_selection_paint()
w->x + window_editor_object_selection_widgets[WIDX_FILTER_STRING_BUTTON].right
);*/
+ // Draw sort button text
+ widget = &w->widgets[WIDX_LIST_SORT_TYPE];
+ if (widget->type != WWT_EMPTY) {
+ stringId = _listSortType == RIDE_SORT_TYPE ? (_listSortDescending ? STR_DOWN : STR_UP) : STR_NONE;
+ gfx_draw_string_left_clipped(dpi, STR_OBJECTS_SORT_TYPE, &stringId, w->colours[1], w->x + widget->left + 1, w->y + widget->top + 1, widget->right - widget->left);
+ }
+ widget = &w->widgets[WIDX_LIST_SORT_RIDE];
+ if (widget->type != WWT_EMPTY) {
+ stringId = _listSortType == RIDE_SORT_RIDE ? (_listSortDescending ? STR_DOWN : STR_UP) : STR_NONE;
+ gfx_draw_string_left_clipped(dpi, STR_OBJECTS_SORT_RIDE, &stringId, w->colours[1], w->x + widget->left + 1, w->y + widget->top + 1, widget->right - widget->left);
+ }
+
if (w->selected_list_item == -1 || stex_entry == NULL)
return;
@@ -1249,80 +1449,78 @@ static void window_editor_object_selection_paint()
*/
static void window_editor_object_selection_scrollpaint()
{
- int x, y, i, colour, colour2, numObjects, type;
+ int x, y, i, colour, colour2;
short scrollIndex;
- rct_object_entry *entry;
- rct_object_filters *filter;
rct_window *w;
rct_drawpixelinfo *dpi;
- uint8 *itemFlags;
- uint8 source;
window_scrollpaint_get_registers(w, dpi, scrollIndex);
+ bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS);
+
colour = RCT2_ADDRESS(0x0141FC48, uint8)[w->colours[1] * 8];
colour = (colour << 24) | (colour << 16) | (colour << 8) | colour;
gfx_clear(dpi, colour);
- numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32);
- entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
- itemFlags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
y = 0;
- for (i = 0; i < numObjects; i++) {
- filter = get_object_filter(i);
- type = entry->flags & 0x0F;
- source = (entry->flags & 0xF0) >> 4;
- if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry) && filter_chunks(entry, filter)) {
- if (y + 12 >= dpi->y && y <= dpi->y + dpi->height) {
- // Draw checkbox
- if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && !(*itemFlags & 0x20))
- gfx_fill_rect_inset(dpi, 2, y, 11, y + 10, w->colours[1], 0xE0);
+ for (i = 0; i < _numListItems; i++) {
+ list_item *listItem = &_listItems[i];
- // Highlight background
- colour = 142;
- if (entry == (rct_object_entry*)w->var_494 && !(*itemFlags & OBJECT_SELECTION_FLAG_6)) {
- gfx_fill_rect(dpi, 0, y, w->width, y + 11, 0x2000031);
- colour = 14;
- }
+ if (y + 12 >= dpi->y && y <= dpi->y + dpi->height) {
+ // Draw checkbox
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && !(*listItem->flags & 0x20))
+ gfx_fill_rect_inset(dpi, 2, y, 11, y + 10, w->colours[1], 0xE0);
- // Draw checkmark
- if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && (*itemFlags & OBJECT_SELECTION_FLAG_SELECTED)) {
- x = 2;
- RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = colour == 14 ? -2 : -1;
- colour2 = w->colours[1] & 0x7F;
- if (*itemFlags & (OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_REQUIRED | OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED))
- colour2 |= 0x40;
-
- gfx_draw_string(dpi, (char*)0x009DED72, colour2, x, y);
- }
-
- // Draw text
- char *buffer = (char*)0x0141ED68;
- *buffer = colour;
- strcpy(buffer + 1, object_get_name(entry));
- if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) {
- while (*buffer != 0 && *buffer != 9)
- buffer++;
-
- *buffer = 0;
- }
-
- if (*itemFlags & OBJECT_SELECTION_FLAG_6) {
- colour = w->colours[1] & 0x7F;
- RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1;
- }
- else {
- colour = 0;
- RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224;
- }
- x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15;
- gfx_draw_string(dpi, (char*)0x0141ED68, colour, x, y);
+ // Highlight background
+ colour = 142;
+ if (listItem->entry == (rct_object_entry*)w->var_494 && !(*listItem->flags & OBJECT_SELECTION_FLAG_6)) {
+ gfx_fill_rect(dpi, 0, y, w->width, y + 11, 0x2000031);
+ colour = 14;
}
- y += 12;
- }
- entry = object_get_next(entry);
- itemFlags++;
+ // Draw checkmark
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && (*listItem->flags & OBJECT_SELECTION_FLAG_SELECTED)) {
+ x = 2;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = colour == 14 ? -2 : -1;
+ colour2 = w->colours[1] & 0x7F;
+ if (*listItem->flags & (OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_REQUIRED | OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED))
+ colour2 |= 0x40;
+
+ gfx_draw_string(dpi, (char*)0x009DED72, colour2, x, y);
+ }
+
+ x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15;
+
+ char *bufferWithColour = (char*)0x0141ED68;
+ char *buffer = bufferWithColour + 1;
+ bufferWithColour[0] = colour;
+ if (*listItem->flags & OBJECT_SELECTION_FLAG_6) {
+ colour = w->colours[1] & 0x7F;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1;
+ }
+ else {
+ colour = 0;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224;
+ }
+
+ if (ridePage) {
+ // Draw ride type
+ strcpy(buffer, language_get_string(2 + listItem->filter->ride.ride_type));
+ gfx_draw_string(dpi, bufferWithColour, colour, x, y);
+ x = w->widgets[WIDX_LIST_SORT_RIDE].left - w->widgets[WIDX_LIST].left;
+ }
+
+ // Draw text
+ strcpy(buffer, object_get_name(listItem->entry));
+ if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) {
+ while (*buffer != 0 && *buffer != 9)
+ buffer++;
+
+ *buffer = 0;
+ }
+ gfx_draw_string(dpi, bufferWithColour, colour, x, y);
+ }
+ y += 12;
}
}
@@ -1336,6 +1534,16 @@ static void window_editor_object_set_page(rct_window *w, int page)
w->var_494 = 0xFFFFFFFF;
w->scrolls[0].v_top = 0;
object_free_scenario_text();
+
+ if (page == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS) {
+ _listSortType = RIDE_SORT_TYPE;
+ _listSortDescending = false;
+ } else {
+ _listSortType = RIDE_SORT_RIDE;
+ _listSortDescending = false;
+ }
+
+ visible_list_refresh(w);
window_invalidate(w);
}
@@ -1715,27 +1923,14 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct
*/
static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry)
{
- rct_object_filters *filter;
- *installed_entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
- uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
- uint8 source;
- int object_count = 0;
- for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
- filter = get_object_filter(RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) - i);
- source = ((*installed_entry)->flags & 0xF0) >> 4;
- if (((*installed_entry)->flags & 0xF) == object_type && filter_source(*installed_entry) && filter_string(*installed_entry) && filter_chunks(*installed_entry, filter)){
- if (!(*selection_flags & OBJECT_SELECTION_FLAG_6)){
- y -= 12;
- *object_selection_flags = *selection_flags;
- if (y < 0)return object_count;
- object_count++;
- }
- }
+ int listItemIndex = y / 12;
+ if (listItemIndex < 0 || listItemIndex >= _numListItems)
+ return -1;
- *installed_entry = object_get_next(*installed_entry);
- selection_flags++;
- }
- return -1;
+ list_item *listItem = &_listItems[listItemIndex];
+ *object_selection_flags = *listItem->flags;
+ *installed_entry = listItem->entry;
+ return listItemIndex;
}
/**
@@ -1811,6 +2006,18 @@ static void window_editor_object_selection_update(rct_window *w)
window_update_textbox_caret();
widget_invalidate(w, WIDX_FILTER_STRING_BUTTON);
}
+
+ for (int i = WIDX_FILTER_RIDE_TAB_TRANSPORT; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) {
+ if (!(w->pressed_widgets & (1ULL << i)))
+ continue;
+
+ w->frame_no++;
+ if (w->frame_no >= window_editor_object_selection_animation_loops[i - WIDX_FILTER_RIDE_TAB_TRANSPORT])
+ w->frame_no = 0;
+
+ widget_invalidate(w, i);
+ break;
+ }
}
static void window_editor_object_selection_textinput()
@@ -1840,6 +2047,7 @@ static void window_editor_object_selection_textinput()
w->scrolls->v_top = 0;
+ visible_list_refresh(w);
window_invalidate(w);
}
@@ -1878,11 +2086,16 @@ static bool filter_chunks(rct_object_entry *entry, rct_object_filters *filter)
{
switch (entry->flags & 0x0F) {
case OBJECT_TYPE_RIDE:
- if (_filter_flags & (1 << (filter->ride.category[0] + 5)))
- return true;
- if (_filter_flags & (1 << (filter->ride.category[1] + 5)))
- return true;
-
+ if(!gConfigInterface.select_by_track_type) {
+ if (_filter_flags & (1 << (filter->ride.category[0] + 5)))
+ return true;
+ if (_filter_flags & (1 << (filter->ride.category[1] + 5)))
+ return true;
+ }
+ else {
+ if (_filter_flags & (1 << (gRideCategories[filter->ride.ride_type] + 5)))
+ return true;
+ }
return false;
}
return true;
diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c
index 52071d8287..32bf8d52ab 100644
--- a/src/windows/editor_objective_options.c
+++ b/src/windows/editor_objective_options.c
@@ -243,6 +243,8 @@ static uint64 window_editor_objective_options_page_hold_down_widgets[] = {
#pragma endregion
+static void window_editor_objective_options_update_disabled_widgets(rct_window *w);
+
/**
*
* rct2: 0x0067137D
@@ -271,7 +273,7 @@ void window_editor_objective_options_open()
w->selected_tab = WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN;
w->no_list_items = 0;
w->selected_list_item = -1;
- RCT2_CALLPROC_X(0x00672609, 0, 0, 0, 0, (int)w, 0, 0);
+ window_editor_objective_options_update_disabled_widgets(w);
}
static void window_editor_objective_options_set_pressed_tab(rct_window *w)
@@ -337,7 +339,7 @@ static void window_editor_objective_options_set_page(rct_window *w, int page)
w->event_handlers = window_editor_objective_options_page_events[page];
w->widgets = window_editor_objective_options_widgets[page];
window_invalidate(w);
- RCT2_CALLPROC_X(0x00672609, 0, 0, 0, 0, (int)w, 0, 0);
+ window_editor_objective_options_update_disabled_widgets(w);
window_event_resize_call(w);
window_event_invalidate_call(w);
window_init_scroll_widgets(w);
@@ -1284,4 +1286,28 @@ static void window_editor_objective_options_rides_scrollpaint()
// Ride name
gfx_draw_string_left(dpi, stringId, &ride->name, 0, 15, y);
}
+}
+
+/**
+ *
+ * rct2: 0x00672609
+ */
+static void window_editor_objective_options_update_disabled_widgets(rct_window *w)
+{
+ rct_ride *ride;
+ int i, numRides;
+
+ // Check if there are any rides (not shops or facilities)
+ numRides = 0;
+ FOR_ALL_RIDES(i, ride) {
+ if (gRideClassifications[ride->type] == RIDE_CLASS_RIDE) {
+ numRides++;
+ }
+ }
+
+ if (numRides == 0) {
+ w->disabled_widgets &= ~(1 << WIDX_TAB_2);
+ } else {
+ w->disabled_widgets |= (1 << WIDX_TAB_2);
+ }
}
\ No newline at end of file
diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c
index b82b44e553..16c01ce4b9 100644
--- a/src/windows/game_bottom_toolbar.c
+++ b/src/windows/game_bottom_toolbar.c
@@ -120,6 +120,8 @@ static void* window_game_bottom_toolbar_events[] = {
window_game_bottom_toolbar_emptysub
};
+static void window_game_bottom_toolbar_invalidate_dirty_widgets(rct_window *w);
+
/**
* Creates the main game bottom toolbar window.
* rct2: 0x0066B52F (part of 0x0066B3E8)
@@ -521,34 +523,32 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi,
*/
static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rct_window *w)
{
- int x, y;
+ int x, y, width;
+ rct_string_id stringId;
rct_news_item *newsItem;
+ rct_widget *middleOutsetWidget;
+ middleOutsetWidget = &window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET];
newsItem = &(RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0]);
// Current news item
gfx_fill_rect_inset(
dpi,
- w->x + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left + 1,
- w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].top + 1,
- w->x + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right - 1,
- w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].bottom - 1,
+ w->x + middleOutsetWidget->left + 1,
+ w->y + middleOutsetWidget->top + 1,
+ w->x + middleOutsetWidget->right - 1,
+ w->y + middleOutsetWidget->bottom - 1,
w->colours[2],
48
);
// Text
+ stringId = 1926;
+ // memcpy((char*)language_get_string(1926), &newsItem->colour, 256);
memcpy((void*)0x009B5F2C, &newsItem->colour, 256);
- RCT2_CALLPROC_X(
- 0x006C1F57,
- 14,
- 1926,
- (window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right) / 2 + w->x,
- w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].top + 11,
- 0,
- (int)dpi,
- (newsItem->ticks << 16) | (window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right - window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left - 62)
- );
+ x = w->x + (middleOutsetWidget->left + middleOutsetWidget->right) / 2;
+ y = w->y + middleOutsetWidget->top + 11;
+ sub_6C1F57(dpi, x, y, width, 14, stringId, NULL, newsItem->ticks);
x = w->x + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].left;
y = w->y + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].top;
@@ -635,10 +635,10 @@ static void window_game_bottom_toolbar_draw_tutorial_text(rct_drawpixelinfo *dpi
static void window_game_bottom_toolbar_update(rct_window* w){
w->frame_no++;
- if (w->frame_no >= 24)w->frame_no = 0;
+ if (w->frame_no >= 24)
+ w->frame_no = 0;
- // Due to windows not fully finished use callproc to save on duplicate code.
- RCT2_CALLPROC_X((int)window_game_bottom_toolbar_unknown05, 0, 0, 0, 0, (int)w, 0, 0);
+ window_game_bottom_toolbar_invalidate_dirty_widgets(w);
}
/* rct2: 0x006C644 */
@@ -664,6 +664,12 @@ static void window_game_bottom_toolbar_unknown05(){
window_get_register(w);
+ window_game_bottom_toolbar_invalidate_dirty_widgets(w);
+}
+
+/* rct2: 0x0066C6F2 */
+static void window_game_bottom_toolbar_invalidate_dirty_widgets(rct_window *w)
+{
if (RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) & BTM_TB_DIRTY_FLAG_MONEY){
RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) &= ~BTM_TB_DIRTY_FLAG_MONEY;
widget_invalidate(w, WIDX_LEFT_INSET);
diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c
new file mode 100644
index 0000000000..ee801a53bc
--- /dev/null
+++ b/src/windows/maze_construction.c
@@ -0,0 +1,211 @@
+/*****************************************************************************
+ * Copyright (c) 2014 Ted John
+ * OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
+ *
+ * This file is part of OpenRCT2.
+ *
+ * OpenRCT2 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *****************************************************************************/
+
+#include "../addresses.h"
+#include "../audio/audio.h"
+#include "../drawing/drawing.h"
+#include "../game.h"
+#include "../input.h"
+#include "../interface/themes.h"
+#include "../interface/viewport.h"
+#include "../interface/widget.h"
+#include "../interface/window.h"
+#include "../localisation/localisation.h"
+#include "../ride/track.h"
+#include "dropdown.h"
+
+#pragma region Widgets
+
+enum {
+ WIDX_BACKGROUND,
+ WIDX_TITLE,
+ WIDX_CLOSE,
+ WIDX_MAZE_MODE_GROUPBOX,
+ WIDX_MAZE_BUILD_MODE = 6,
+ WIDX_MAZE_MOVE_MODE,
+ WIDX_MAZE_FILL_MODE,
+ WIDX_MAZE_DIRECTION_GROUPBOX = 23,
+ WIDX_MAZE_DIRECTION_NW,
+ WIDX_MAZE_DIRECTION_NE,
+ WIDX_MAZE_DIRECTION_SW,
+ WIDX_MAZE_DIRECTION_SE,
+};
+
+static rct_widget window_maze_construction_widgets[] = {
+ { WWT_FRAME, 0, 0, 165, 0, 199, 0xFFFFFFFF, STR_NONE },
+ { WWT_CAPTION, 0, 1, 164, 1, 14, 896, STR_WINDOW_TITLE_TIP },
+ { WWT_CLOSEBOX, 0, 153, 163, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
+ { WWT_GROUPBOX, 0, 3, 162, 17, 71, STR_RIDE_CONSTRUCTION_MODE, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_FLATBTN, 1, 35, 66, 29, 60, 0x15C8, STR_RIDE_CONSTRUCTION_BUILD_MODE },
+ { WWT_FLATBTN, 1, 67, 98, 29, 60, 0x15C9, STR_RIDE_CONSTRUCTION_MOVE_MODE },
+ { WWT_FLATBTN, 1, 99, 130, 29, 60, 0x15CA, STR_RIDE_CONSTRUCTION_FILL_IN_MODE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_GROUPBOX, 0, 3, 162, 80, 166, STR_RIDE_CONSTRUCTION_BUILD, STR_NONE },
+ { WWT_FLATBTN, 1, 83, 127, 96, 124, 0x1603, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP },
+ { WWT_FLATBTN, 1, 83, 127, 125, 153, 0x1604, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP },
+ { WWT_FLATBTN, 1, 38, 82, 125, 153, 0x1605, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP },
+ { WWT_FLATBTN, 1, 38, 82, 96, 124, 0x1606, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP },
+ { WWT_GROUPBOX, 0, 3, 162, 168, 195, 0xFFFFFFFF, STR_NONE },
+ { WWT_DROPDOWN_BUTTON, 1, 9, 78, 178, 189, STR_RIDE_CONSTRUCTION_ENTRANCE, STR_RIDE_CONSTRUCTION_ENTRANCE_TIP },
+ { WWT_DROPDOWN_BUTTON, 1, 87, 156, 178, 189, STR_RIDE_CONSTRUCTION_EXIT, STR_RIDE_CONSTRUCTION_EXIT_TIP },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE },
+ { WIDGETS_END }
+};
+
+#pragma endregion
+
+#pragma region Events
+
+static void window_maze_construction_emptysub() {}
+
+static void window_maze_construction_close();
+static void window_maze_construction_invalidate();
+static void window_maze_construction_paint();
+
+// 0x993F6C
+static void* window_maze_construction_events[] = {
+ window_maze_construction_close,
+ (void*)0x006CD461,
+ (void*)0x006CD623,
+ (void*)0x006CD48C,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ (void*)0x006CD767,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ (void*)0x006CD63E,
+ (void*)0x006CD65D,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_emptysub,
+ window_maze_construction_invalidate,
+ window_maze_construction_paint,
+ window_maze_construction_emptysub
+};
+
+#pragma endregion
+
+/**
+ *
+ * rct2: 0x006CB481
+ */
+rct_window *window_maze_construction_open()
+{
+ rct_window *w = window_create(0, 29, 166, 200, (uint32*)window_maze_construction_events, WC_RIDE_CONSTRUCTION, WF_9);
+ w->widgets = window_maze_construction_widgets;
+ w->enabled_widgets = 0x6F0001C4;
+
+ window_init_scroll_widgets(w);
+ colour_scheme_update(w);
+
+ w->number = _currentRideIndex;
+
+ window_push_others_right(w);
+ show_gridlines();
+ return w;
+}
+
+/**
+ *
+ * rct2: 0x006CD811
+ */
+static void window_maze_construction_close()
+{
+ rct_window *w;
+
+ window_get_register(w);
+
+ sub_6C9627();
+ viewport_set_visibility(0);
+
+ map_invalidate_map_selection_tiles();
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 1);
+
+ // In order to cancel the yellow arrow correctly the
+ // selection tool should be cancelled.
+ tool_cancel();
+
+ hide_gridlines();
+
+ uint8 rideIndex = _currentRideIndex;
+ rct_ride* ride = GET_RIDE(rideIndex);
+ if (ride->overall_view == 0xFFFF) {
+ int savedPausedState = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8);
+ RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0;
+ game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_7, 0, 0);
+ RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = savedPausedState;
+ } else {
+ window_ride_main_open(rideIndex);
+ }
+}
+
+/**
+ *
+ * rct2: 0x006CD435
+ */
+static void window_maze_construction_invalidate()
+{
+ rct_ride *ride = GET_RIDE(_currentRideIndex);
+
+ // Set window title arguments
+ RCT2_GLOBAL(0x013CE956, rct_string_id) = ride->name;
+ RCT2_GLOBAL(0x013CE958, uint32) = ride->name_arguments;
+}
+
+/**
+ *
+ * rct2: 0x006CD45B
+ */
+static void window_maze_construction_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+
+ window_paint_get_registers(w, dpi);
+
+ window_draw_widgets(w, dpi);
+}
diff --git a/src/windows/park.c b/src/windows/park.c
index 27318ce991..c22e6c127c 100644
--- a/src/windows/park.c
+++ b/src/windows/park.c
@@ -1176,7 +1176,8 @@ static void window_park_init_viewport(rct_window *w)
void toggle_land_rights_window(rct_window *parkWindow, int widgetIndex)
{
- if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == 1 && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) == 14) {
+ if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == WC_PARK_INFORMATION &&
+ RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) == WIDX_BUY_LAND_RIGHTS) {
tool_cancel();
}
else {
diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c
index 7cb6c54658..1149e47c0a 100644
--- a/src/windows/ride_construction.c
+++ b/src/windows/ride_construction.c
@@ -19,138 +19,497 @@
*****************************************************************************/
#include "../addresses.h"
-#include "../interface/window.h"
-#include "../interface/viewport.h"
-#include "../game.h"
-#include "../ride/track.h"
+#include "../audio/audio.h"
#include "../drawing/drawing.h"
+#include "../game.h"
+#include "../input.h"
#include "../interface/themes.h"
+#include "../interface/viewport.h"
+#include "../interface/widget.h"
+#include "../interface/window.h"
+#include "../localisation/localisation.h"
+#include "../ride/track.h"
+#include "dropdown.h"
/* move to ride.c */
-void sub_6b2fa9(rct_windownumber number){
+void sub_6B2FA9(rct_windownumber number)
+{
rct_window* w;
w = window_find_by_number(WC_RIDE, number);
- if (w){
- if (w->page == 1){
- window_close(w);
- }
- }
+ if (w != NULL && w->page == 1)
+ window_close(w);
}
+#pragma region Widgets
+
enum {
WIDX_BACKGROUND,
WIDX_TITLE,
WIDX_CLOSE,
- WIDX_PAGE_BACKGROUND,
-
- WIDX_DEMOLISH = 24
+ WIDX_DIRECTION_GROUPBOX,
+ WIDX_SLOPE_GROUPBOX,
+ WIDX_BANKING_GROUPBOX,
+ WIDX_LEFT_CURVE_VERY_SMALL,
+ WIDX_LEFT_CURVE_SMALL,
+ WIDX_LEFT_CURVE,
+ WIDX_STRAIGHT,
+ WIDX_RIGHT_CURVE,
+ WIDX_RIGHT_CURVE_SMALL,
+ WIDX_RIGHT_CURVE_VERY_SMALL,
+ WIDX_SPECIAL_TRACK_DROPDOWN,
+ WIDX_SLOPE_DOWN_STEEP,
+ WIDX_SLOPE_DOWN,
+ WIDX_LEVEL,
+ WIDX_SLOPE_UP,
+ WIDX_SLOPE_UP_STEEP,
+ WIDX_CHAIN_LIFT,
+ WIDX_BANK_LEFT,
+ WIDX_BANK_STRAIGHT,
+ WIDX_BANK_RIGHT,
+ WIDX_CONSTRUCT,
+ WIDX_DEMOLISH,
+ WIDX_LEFT_CURVE_LARGE,
+ WIDX_PREVIOUS_SECTION,
+ WIDX_NEXT_SECTION,
+ WIDX_ENTRANCE_EXIT_GROUPBOX,
+ WIDX_ENTRANCE,
+ WIDX_EXIT,
+ WIDX_RIGHT_CURVE_LARGE,
+ WIDX_ROTATE,
+ WIDX_U_TRACK,
+ WIDX_O_TRACK,
+ WIDX_SEAT_ROTATION_GROUPBOX,
+ WIDX_SEAT_ROTATION_ANGLE_SPINNER,
+ WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP,
+ WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN,
};
-void window_construction_emptysub(){}
-void window_construction_close();
-void window_construction_mouseup();
-void window_construction_paint();
-
-void window_construction_maze_close();
-void window_construction_maze_invalidate();
-void window_construction_maze_paint();
-
-// 0x993F6C
-static void* window_construction_maze_events[] = {
- window_construction_maze_close,
- (void*)0x6CD461,
- (void*)0x6CD623,
- (void*)0x6CD48C,
- window_construction_emptysub,
- window_construction_emptysub,
- (void*)0x6CD767,
- window_construction_emptysub,
- window_construction_emptysub,
- (void*)0x6CD63E,
- (void*)0x6CD65D,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_maze_invalidate,
- window_construction_maze_paint,
- window_construction_emptysub
+static rct_widget window_ride_construction_widgets[] = {
+ { WWT_FRAME, 0, 0, 165, 0, 393, 0xFFFFFFFF, STR_NONE },
+ { WWT_CAPTION, 0, 1, 164, 1, 14, 896, STR_WINDOW_TITLE_TIP },
+ { WWT_CLOSEBOX, 0, 153, 163, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
+ { WWT_GROUPBOX, 0, 3, 162, 17, 73, STR_RIDE_CONSTRUCTION_DIRECTION, STR_NONE },
+ { WWT_GROUPBOX, 0, 3, 162, 76, 116, STR_RIDE_CONSTRUCTION_SLOPE, STR_NONE },
+ { WWT_GROUPBOX, 0, 3, 162, 120, 160, STR_RIDE_CONSTRUCTION_ROLL_BANKING, STR_NONE },
+ { WWT_FLATBTN, 1, 6, 27, 29, 52, 0x1414, STR_RIDE_CONSTRUCTION_LEFT_CURVE_VERY_SMALL_TIP },
+ { WWT_FLATBTN, 1, 6, 27, 29, 52, 0x1414, STR_RIDE_CONSTRUCTION_LEFT_CURVE_SMALL_TIP },
+ { WWT_FLATBTN, 1, 28, 49, 29, 52, 0x1412, STR_RIDE_CONSTRUCTION_LEFT_CURVE_TIP },
+ { WWT_FLATBTN, 1, 72, 93, 29, 52, 0x1411, STR_RIDE_CONSTRUCTION_STRAIGHT_TIP },
+ { WWT_FLATBTN, 1, 116, 137, 29, 52, 0x1413, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_TIP },
+ { WWT_FLATBTN, 1, 138, 159, 29, 52, 0x1415, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_SMALL_TIP },
+ { WWT_FLATBTN, 1, 138, 159, 29, 52, 0x1415, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_VERY_SMALL_TIP },
+ { WWT_DROPDOWN_BUTTON, 1, 17, 148, 55, 68, 1384, STR_RIDE_CONSTRUCTION_OTHER_TRACK_CONFIGURATIONS_TIP },
+ { WWT_FLATBTN, 1, 23, 46, 88, 111, 0x1418, STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP },
+ { WWT_FLATBTN, 1, 47, 70, 88, 111, 0x1419, STR_RIDE_CONSTRUCTION_SLOPE_DOWN_TIP },
+ { WWT_FLATBTN, 1, 71, 94, 88, 111, 0x141A, STR_RIDE_CONSTRUCTION_LEVEL_TIP },
+ { WWT_FLATBTN, 1, 95, 118, 88, 111, 0x141B, STR_RIDE_CONSTRUCTION_SLOPE_UP_TIP },
+ { WWT_FLATBTN, 1, 119, 142, 88, 111, 0x141C, STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP },
+ { WWT_FLATBTN, 1, 134, 157, 88, 111, 0x142B, STR_RIDE_CONSTRUCTION_CHAIN_LIFT_TIP },
+ { WWT_FLATBTN, 1, 47, 70, 132, 155, 0x1421, STR_RIDE_CONSTRUCTION_ROLL_FOR_LEFT_CURVE_TIP },
+ { WWT_FLATBTN, 1, 71, 94, 132, 155, 0x1422, STR_RIDE_CONSTRUCTION_NO_ROLL_TIP },
+ { WWT_FLATBTN, 1, 95, 118, 132, 155, 0x1423, STR_RIDE_CONSTRUCTION_ROLL_FOR_RIGHT_CURVE_TIP },
+ { WWT_IMGBTN, 1, 3, 162, 164, 333, 0xFFFFFFFF, STR_RIDE_CONSTRUCTION_CONSTRUCT_SELECTED_SECTION_TIP },
+ { WWT_FLATBTN, 1, 60, 105, 338, 361, 0x142A, STR_RIDE_CONSTRUCTION_REMOVE_HIGHLIGHTED_SECTION_TIP },
+ { WWT_FLATBTN, 1, 50, 71, 29, 52, 0x1416, STR_RIDE_CONSTRUCTION_LEFT_CURVE_LARGE_TIP },
+ { WWT_FLATBTN, 1, 20, 43, 338, 361, 0x1428, STR_RIDE_CONSTRUCTION_MOVE_TO_PREVIOUS_SECTION_TIP },
+ { WWT_FLATBTN, 1, 122, 145, 338, 361, 0x1429, STR_RIDE_CONSTRUCTION_MOVE_TO_NEXT_SECTION_TIP },
+ { WWT_GROUPBOX, 0, 3, 162, 362, 389, 0xFFFFFFFF, STR_NONE },
+ { WWT_DROPDOWN_BUTTON, 1, 9, 78, 372, 383, STR_RIDE_CONSTRUCTION_ENTRANCE, STR_RIDE_CONSTRUCTION_ENTRANCE_TIP },
+ { WWT_DROPDOWN_BUTTON, 1, 87, 156, 372, 383, STR_RIDE_CONSTRUCTION_EXIT, STR_RIDE_CONSTRUCTION_EXIT_TIP },
+ { WWT_FLATBTN, 1, 94, 115, 29, 52, 0x1417, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_LARGE_TIP },
+ { WWT_FLATBTN, 1, 72, 95, 338, 361, 0x1431, STR_ROTATE_90_TIP },
+ { WWT_FLATBTN, 1, 19, 42, 132, 155, 0x1424, STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP },
+ { WWT_FLATBTN, 1, 123, 146, 132, 155, 0x1425, STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP },
+ { WWT_GROUPBOX, 0, 96, 162, 120, 160, STR_RIDE_CONSTRUCTION_SEAT_ROT, STR_NONE },
+ { WWT_SPINNER, 1, 101, 158, 138, 149, 0, STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP },
+ { WWT_DROPDOWN_BUTTON, 1, 147, 157, 139, 143, STR_NUMERIC_UP, STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP },
+ { WWT_DROPDOWN_BUTTON, 1, 147, 157, 144, 148, STR_NUMERIC_DOWN, STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP },
+ { WIDGETS_END }
};
+#pragma endregion
+
+#pragma region Events
+
+static void window_ride_construction_emptysub() {}
+
+static void window_ride_construction_close();
+static void window_ride_construction_mouseup();
+static void window_ride_construction_resize();
+static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget);
+static void window_ride_construction_dropdown();
+static void window_ride_construction_update(rct_window *w);
+static void window_ride_construction_toolupdate();
+static void window_ride_construction_tooldown();
+static void window_ride_construction_invalidate();
+static void window_ride_construction_paint();
+
//0x993EEC
-static void* window_construction_events[] = {
- window_construction_close,
- window_construction_mouseup,
- (void*)0x6C7934,
- (void*)0x6C6E6A,
- (void*)0x6C78CD,
- window_construction_emptysub,
- (void*)0x6C8374,
- window_construction_emptysub,
- window_construction_emptysub,
- (void*)0x6C8229,
- (void*)0x6C8248,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- window_construction_emptysub,
- (void*)0x6C6AD5,
- window_construction_paint,//(void*)0x6C6B86,
- window_construction_emptysub
+static void* window_ride_construction_events[] = {
+ window_ride_construction_close,
+ window_ride_construction_mouseup,
+ window_ride_construction_resize,
+ window_ride_construction_mousedown,
+ window_ride_construction_dropdown,
+ window_ride_construction_emptysub,
+ window_ride_construction_update,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_toolupdate,
+ window_ride_construction_tooldown,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_emptysub,
+ window_ride_construction_invalidate,
+ window_ride_construction_paint,
+ window_ride_construction_emptysub
};
+#pragma endregion
+
+#pragma region RideConfigurationStringIds
+
+// rct2: 0x00999492
+rct_string_id RideConfigurationStringIds[] = {
+ 0, // 0
+ STR_STATION_PLATFORM, // 1
+ 0, // 2
+ 0, // 3
+ 0, // 4
+ 0, // 5
+ 0, // 6
+ 0, // 7
+ 0, // 8
+ 0, // 9
+ 0, // 10
+ 0, // 11
+ 0, // 12
+ 0, // 13
+ 0, // 14
+ 0, // 15
+ 0, // 16
+ 0, // 17
+ 0, // 18
+ 0, // 19
+ 0, // 20
+ 0, // 21
+ 0, // 22
+ 0, // 23
+ 0, // 24
+ 0, // 25
+ 0, // 26
+ 0, // 27
+ 0, // 28
+ 0, // 29
+ 0, // 30
+ 0, // 31
+ 0, // 32
+ 0, // 33
+ 0, // 34
+ 0, // 35
+ 0, // 36
+ 0, // 37
+ STR_S_BEND_LEFT, // 38
+ STR_S_BEND_RIGHT, // 39
+ STR_VERTICAL_LOOP_LEFT, // 40
+ STR_VERTICAL_LOOP_RIGHT, // 41
+ 0, // 42
+ 0, // 43
+ 0, // 44
+ 0, // 45
+ 0, // 46
+ 0, // 47
+ 0, // 48
+ 0, // 49
+ 0, // 50
+ 0, // 51
+ STR_IN_LINE_TWIST_LEFT, // 52
+ STR_IN_LINE_TWIST_RIGHT, // 53
+ STR_IN_LINE_TWIST_LEFT, // 54
+ STR_IN_LINE_TWIST_RIGHT, // 55
+ STR_HALF_LOOP, // 56
+ STR_HALF_LOOP, // 57
+ STR_HALF_CORKSCREW_LEFT, // 58
+ STR_HALF_CORKSCREW_RIGHT, // 59
+ STR_HALF_CORKSCREW_LEFT, // 60
+ STR_HALF_CORKSCREW_RIGHT, // 61
+ 0, // 62
+ 0, // 63
+ 0, // 64
+ 0, // 65
+ STR_ENTRY_EXIT_PLATFORM, // 66
+ STR_VERTICAL_TOWER, // 67
+ 0, // 68
+ 0, // 69
+ 0, // 70
+ 0, // 71
+ 0, // 72
+ 0, // 73
+ 0, // 74
+ 0, // 75
+ 0, // 76
+ 0, // 77
+ 0, // 78
+ 0, // 79
+ 0, // 80
+ 0, // 81
+ 0, // 82
+ STR_S_BEND_LEFT, // 83
+ STR_S_BEND_RIGHT, // 84
+ 0, // 85
+ 0, // 86
+ STR_HELIX_UP_SMALL, // 87
+ STR_HELIX_UP_SMALL, // 88
+ STR_HELIX_DOWN_SMALL, // 89
+ STR_HELIX_DOWN_SMALL, // 90
+ STR_HELIX_UP_LARGE, // 91
+ STR_HELIX_UP_LARGE, // 92
+ STR_HELIX_DOWN_LARGE, // 93
+ STR_HELIX_DOWN_LARGE, // 94
+ 0, // 95
+ 0, // 96
+ 0, // 97
+ 0, // 98
+ STR_BRAKES, // 99
+ STR_SPINNING_CONTROL_TOGGLE_TRACK, // 100
+ 0, // 101
+ STR_HELIX_UP_LARGE, // 102
+ STR_HELIX_UP_LARGE, // 103
+ STR_HELIX_DOWN_LARGE, // 104
+ STR_HELIX_DOWN_LARGE, // 105
+ STR_HELIX_UP_LEFT, // 106
+ STR_HELIX_UP_RIGHT, // 107
+ STR_HELIX_DOWN_LEFT, // 108
+ STR_HELIX_DOWN_RIGHT, // 109
+ STR_BASE_SIZE_2_X_2, // 110
+ STR_BASE_SIZE_4_X_4, // 111
+ STR_WATERFALLS, // 112
+ STR_RAPIDS, // 113
+ STR_ON_RIDE_PHOTO_SECTION, // 114
+ STR_BASE_SIZE_2_X_4, // 115
+ STR_BASE_SIZE_5_X_1, // 116
+ STR_WATER_SPLASH, // 117
+ 0, // 118
+ 0, // 119
+ STR_WHIRLPOOL, // 120
+ 0, // 121
+ 0, // 122
+ STR_CABLE_LIFT_HILL, // 123
+ STR_SLOPE_UP_TO_VERTICAL, // 124
+ STR_VERTICAL_TRACK, // 125
+ 0, // 126
+ 0, // 127
+ 0, // 128
+ 0, // 129
+ 0, // 130
+ 0, // 131
+ STR_HOLDING_BRAKE_FOR_DROP, // 132
+ 0, // 133
+ 0, // 134
+ 0, // 135
+ 0, // 136
+ 0, // 137
+ 0, // 138
+ 0, // 139
+ 0, // 140
+ 0, // 141
+ 0, // 142
+ 0, // 143
+ 0, // 144
+ 0, // 145
+ 0, // 146
+ 0, // 147
+ 0, // 148
+ 0, // 149
+ 0, // 150
+ 0, // 151
+ 0, // 152
+ 0, // 153
+ 0, // 154
+ 0, // 155
+ 0, // 156
+ 0, // 157
+ 0, // 158
+ 0, // 159
+ 0, // 160
+ 0, // 161
+ 0, // 162
+ 0, // 163
+ 0, // 164
+ 0, // 165
+ 0, // 166
+ 0, // 167
+ 0, // 168
+ 0, // 169
+ 0, // 170
+ 0, // 171
+ STR_REVERSER_TURNTABLE, // 172
+ STR_SPINNING_TUNNEL, // 173
+ STR_BARREL_ROLL_LEFT, // 174
+ STR_BARREL_ROLL_RIGHT, // 175
+ STR_BARREL_ROLL_LEFT, // 176
+ STR_BARREL_ROLL_RIGHT, // 177
+ 0, // 178
+ 0, // 179
+ 0, // 180
+ 0, // 181
+ STR_LAUNCHED_LIFT_HILL, // 182
+ STR_LARGE_HALF_LOOP_LEFT, // 183
+ STR_LARGE_HALF_LOOP_RIGHT, // 184
+ STR_LARGE_HALF_LOOP_LEFT, // 185
+ STR_LARGE_HALF_LOOP_RIGHT, // 186
+ STR_IN_LINE_TWIST_LEFT, // 187
+ STR_IN_LINE_TWIST_RIGHT, // 188
+ STR_IN_LINE_TWIST_LEFT, // 189
+ STR_IN_LINE_TWIST_RIGHT, // 190
+ STR_HALF_LOOP, // 191
+ STR_HALF_LOOP, // 192
+ STR_HALF_CORKSCREW_LEFT, // 193
+ STR_HALF_CORKSCREW_RIGHT, // 194
+ STR_HALF_CORKSCREW_LEFT, // 195
+ STR_HALF_CORKSCREW_RIGHT, // 196
+ STR_UPPER_TRANSFER, // 197
+ STR_LOWER_TRANSFER, // 198
+ STR_HEARTLINE_ROLL_LEFT, // 199
+ STR_HEARTLINE_ROLL_RIGHT, // 200
+ STR_GOLF_HOLE_A, // 201
+ STR_GOLF_HOLE_B, // 202
+ STR_GOLF_HOLE_C, // 203
+ STR_GOLF_HOLE_D, // 204
+ STR_GOLF_HOLE_E, // 205
+ STR_QUARTER_LOOP, // 206
+ STR_QUARTER_LOOP, // 207
+ STR_QUARTER_LOOP, // 208
+ STR_CURVED_LIFT_HILL_LEFT, // 209
+ STR_CURVED_LIFT_HILL_RIGHT, // 210
+ STR_REVERSER_LEFT, // 211
+ STR_REVERSER_RIGHT, // 212
+ STR_TOP_SECTION, // 213
+ STR_VERTICAL_TRACK, // 214
+ STR_SLOPE_TO_LEVEL, // 215
+ STR_BLOCK_BRAKES, // 216
+ 0, // 217
+ 0, // 218
+ 0, // 219
+ 0, // 220
+ 0, // 221
+ 0, // 222
+ 0, // 223
+ 0, // 224
+ 0, // 225
+ 0, // 226
+ 0, // 227
+ 0, // 228
+ 0, // 229
+ 0, // 230
+ 0, // 231
+ 0, // 232
+ 0, // 233
+ 0, // 234
+ 0, // 235
+ 0, // 236
+ 0, // 237
+ 0, // 238
+ 0, // 239
+ 0, // 240
+ 0, // 241
+ 0, // 242
+ 0, // 243
+ 0, // 244
+ 0, // 245
+ 0, // 246
+ 0, // 247
+ 0, // 248
+ 0, // 249
+ 0, // 250
+ 0, // 251
+ 0, // 252
+ STR_QUARTER_LOOP, // 253
+ STR_QUARTER_LOOP, // 254
+ STR_QUARTER_LOOP // 255
+};
+
+#pragma endregion
+
+static void window_ride_construction_next_section(rct_window *w);
+static void window_ride_construction_previous_section(rct_window *w);
+static void window_ride_construction_construct(rct_window *w);
+static void window_ride_construction_mouseup_demolish(rct_window* w);
+static void window_ride_construction_rotate(rct_window *w);
+static void window_ride_construction_entrance_click(rct_window *w);
+static void window_ride_construction_exit_click(rct_window *w);
+
+static void window_ride_construction_draw_track_piece(
+ rct_window *w, rct_drawpixelinfo *dpi,
+ int rideIndex, int trackType, int trackRotation, int unknown,
+ int width, int height
+);
+static void window_ride_construction_update_enabled_track_pieces();
+void sub_6C94D8();
+static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *seatRotation);
+static void sub_6CBCE2(
+ int rideIndex, int trackType, int trackDirection, int edx,
+ int originX, int originY, int originZ
+);
+static void window_ride_construction_update_map_selection();
+static void window_ride_construction_update_possible_ride_configurations();
+static void window_ride_construction_update_widgets(rct_window *w);
+static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackType, int trackDirection, int x, int y);
+money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16, int x, int y, int z);
+static void window_ride_construction_show_special_track_dropdown(rct_window *w, rct_widget *widget);
+static void ride_selected_track_set_seat_rotation(int seatRotation);
+static void loc_6C7502(int al);
+static void loc_6C76E9();
+
+static void ride_construction_toolupdate_construct(int screenX, int screenY);
+static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY);
+static void ride_construction_tooldown_construct(int screenX, int screenY);
+static void ride_construction_tooldown_entrance_exit(int screenX, int screenY);
+
+uint8 *_currentPossibleRideConfigurations = (uint8*)0x00F4407C;
+
+static bool is_track_enabled(int trackFlagIndex)
+{
+ return _enabledRidePieces & (1ULL << trackFlagIndex);
+}
+
+static int ride_get_alternative_type(rct_ride *ride)
+{
+ return _currentTrackCovered & 2 ?
+ RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] :
+ ride->type;;
+}
+
/**
*
* rct2: 0x006CB481
*/
-rct_window *window_construction_open()
+rct_window *window_ride_construction_open()
{
- int ride_id = RCT2_GLOBAL(0xF440A7, uint8);
- sub_6b2fa9(ride_id);
+ int rideIndex = _currentRideIndex;
+ sub_6B2FA9(rideIndex);
rct_window *w;
- rct_ride* ride = GET_RIDE(ride_id);
- if (ride->type == RIDE_TYPE_MAZE){
- w = window_create(0, 29, 166, 200, (uint32*)window_construction_maze_events, WC_RIDE_CONSTRUCTION, WF_9);
+ rct_ride* ride = GET_RIDE(rideIndex);
- w->widgets = (rct_widget*)0x9D7D04;
- w->enabled_widgets = 0x6F0001C4;
+ if (ride->type == RIDE_TYPE_MAZE)
+ return window_maze_construction_open();
- window_init_scroll_widgets(w);
+ w = window_create(0, 29, 166, 394, (uint32*)window_ride_construction_events, WC_RIDE_CONSTRUCTION, WF_9);
- colour_scheme_update(w);
-
- w->number = ride_id;
-
- window_push_others_right(w);
- show_gridlines();
- return w;
- }
-
- w = window_create(0, 29, 166, 394, (uint32*)window_construction_events, WC_RIDE_CONSTRUCTION, WF_9);
-
- w->widgets = (rct_widget*)0x9D7A90;
+ w->widgets = window_ride_construction_widgets;
w->enabled_widgets = 0x67EFFFFFC4;
window_init_scroll_widgets(w);
@@ -159,48 +518,49 @@ rct_window *window_construction_open()
w->colours[1] = 24;
w->colours[2] = 24;
- w->number = ride_id;
+ w->number = rideIndex;
window_push_others_right(w);
show_gridlines();
- RCT2_GLOBAL(0xF44070, uint32) = MONEY32_UNDEFINED;
- RCT2_GLOBAL(0xF440CD, uint8) = 8;
- RCT2_GLOBAL(0xF440CE, uint8) = 18;
- RCT2_GLOBAL(0xF440CF, uint8) = 4;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ RCT2_GLOBAL(0x00F440CD, uint8) = 8;
+ RCT2_GLOBAL(0x00F440CE, uint8) = 18;
+ RCT2_GLOBAL(0x00F440CF, uint8) = 4;
- if (ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER){
- RCT2_GLOBAL(0xF440CE, uint8) = 30;
- }
+ if (ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER)
+ RCT2_GLOBAL(0x00F440CE, uint8) = 30;
- if (ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER){
- RCT2_GLOBAL(0xF440CE, uint8) = 30;
- }
+ if (ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER)
+ RCT2_GLOBAL(0x00F440CE, uint8) = 30;
- RCT2_GLOBAL(0xF440A0, uint16) = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100;
- RCT2_GLOBAL(0x00F440B2, uint8) = 0;
+ _currentTrackCurve = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100;
+ _currentTrackSlopeEnd = 0;
RCT2_GLOBAL(0x00F440B3, uint8) = 0;
- RCT2_GLOBAL(0x00F440B4, uint8) = 0;
- RCT2_GLOBAL(0x00F440B5, uint8) = 0;
+ _currentTrackLiftHill = 0;
+ _currentTrackCovered = 0;
if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 4] & 0x8000)
- RCT2_GLOBAL(0x00F440B5, uint8) |= 2;
+ _currentTrackCovered |= 2;
RCT2_GLOBAL(0x00F440B6, uint8) = 0;
RCT2_GLOBAL(0x00F440B7, uint8) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 0;
- RCT2_GLOBAL(0x00F440A6, uint8) = 4;
- RCT2_GLOBAL(0x00F440B0, uint8) = 0;
- RCT2_GLOBAL(0x00F440B1, uint8) = 0;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_PLACE;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
RCT2_GLOBAL(0x00F44159, uint8) = 0;
RCT2_GLOBAL(0x00F4415C, uint8) = 0;
colour_scheme_update(w);
return w;
}
-/* rct2: 0x006C845D */
-void window_construction_close()
+/**
+ *
+ * rct2: 0x006C845D
+ */
+static void window_ride_construction_close()
{
rct_window *w;
rct_xy_element mapElement;
@@ -219,241 +579,2970 @@ void window_construction_close()
hide_gridlines();
- uint8 rideIndex = RCT2_GLOBAL(0x00F440A7, uint8);
- if (!sub_6CAF80(rideIndex, &mapElement)) {
+ uint8 rideIndex = _currentRideIndex;
+ if (sub_6CAF80(rideIndex, &mapElement)) {
+ window_ride_main_open(rideIndex);
+ } else {
int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8);
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0;
game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_7, 0, 0);
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax;
- return;
}
-
- window_ride_main_open(rideIndex);
}
-
-void window_construction_maze_close(){
- rct_window *w;
-
- window_get_register(w);
-
- sub_6C9627();
- viewport_set_visibility(0);
-
- map_invalidate_map_selection_tiles();
- RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 1);
-
- // In order to cancel the yellow arrow correctly the
- // selection tool should be cancelled.
- tool_cancel();
-
- hide_gridlines();
-
- uint8 ride_id = RCT2_GLOBAL(0xF440A7, uint8);
-
- rct_ride* ride = GET_RIDE(ride_id);
-
- if (ride->overall_view == 0xFFFF){
- int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8);
-
- RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0;
- game_do_command(0, 9, 0, ride_id, GAME_COMMAND_7, 0, 0);
-
- RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax;
- return;
- }
-
- window_ride_main_open(ride_id);
-}
-
-void window_construction_mouseup_demolish(rct_window* w);
-
-/* rct2: 0x006C6E14 */
-void window_construction_mouseup(){
+/**
+ *
+ * rct2: 0x006C6E14
+ */
+static void window_ride_construction_mouseup()
+{
short widgetIndex;
rct_window *w;
window_widget_get_registers(w, widgetIndex);
- RCT2_CALLPROC_X(0x6C6A77, 0, 0, 0, 0, 0, 0, 0);
-
+ window_ride_construction_update_enabled_track_pieces();
switch (widgetIndex){
case WIDX_CLOSE:
window_close(w);
break;
- case 27:
- RCT2_CALLPROC_X(0x6C9296, 0, 0, 0, widgetIndex, (int)w, 0, 0);
+ case WIDX_NEXT_SECTION:
+ ride_select_next_section();
break;
- case 26:
- RCT2_CALLPROC_X(0x6C93B8, 0, 0, 0, widgetIndex, (int)w, 0, 0);
+ case WIDX_PREVIOUS_SECTION:
+ ride_select_previous_section();
break;
- case 23:
- RCT2_CALLPROC_X(0x6C9F72, 0, 0, 0, widgetIndex, (int)w, 0, 0);
+ case WIDX_CONSTRUCT:
+ window_ride_construction_construct(w);
break;
case WIDX_DEMOLISH:
- window_construction_mouseup_demolish(w);
+ window_ride_construction_mouseup_demolish(w);
break;
- case 32:
- RCT2_CALLPROC_X(0x6C78AA, 0, 0, 0, widgetIndex, (int)w, 0, 0);
+ case WIDX_ROTATE:
+ window_ride_construction_rotate(w);
break;
- case 29:
- RCT2_CALLPROC_X(0x6C7802, 0, 0, 0, widgetIndex, (int)w, 0, 0);
+ case WIDX_ENTRANCE:
+ window_ride_construction_entrance_click(w);
break;
- case 30:
- RCT2_CALLPROC_X(0x6C7866, 0, 0, 0, widgetIndex, (int)w, 0, 0);
+ case WIDX_EXIT:
+ window_ride_construction_exit_click(w);
break;
}
}
-/* rct2: 0x006C9BA5 */
-void window_construction_mouseup_demolish(rct_window* w){
- RCT2_CALLPROC_X(0x6C9BA5, 0, 0, 0, 0, (int)w, 0, 0);
- return;
+/**
+ *
+ * rct2: 0x006C7934
+ */
+static void window_ride_construction_resize()
+{
+ rct_window *w;
- RCT2_GLOBAL(0xF44070, uint32) = MONEY32_UNDEFINED;
+ window_get_register(w);
+
+ window_ride_construction_update_enabled_track_pieces();
+ w->enabled_widgets &= ~(1 << WIDX_CONSTRUCT);
+ if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_PLACE) {
+ w->enabled_widgets |= (1 << WIDX_CONSTRUCT);
+ }
+
+ rct_ride *ride = GET_RIDE(_currentRideIndex);
+ int rideType = ride_get_alternative_type(ride);
+
+ uint64 disabledWidgets = 0;
+
+ if (_currentTrackCurve >= 256) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_GROUPBOX) |
+ (1ULL << WIDX_BANKING_GROUPBOX) |
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_SLOPE_DOWN) |
+ (1ULL << WIDX_LEVEL) |
+ (1ULL << WIDX_SLOPE_UP) |
+ (1ULL << WIDX_SLOPE_UP_STEEP) |
+ (1ULL << WIDX_CHAIN_LIFT) |
+ (1ULL << WIDX_BANK_LEFT) |
+ (1ULL << WIDX_BANK_STRAIGHT) |
+ (1ULL << WIDX_BANK_RIGHT);
+ }
+
+ // Disable large curves if the start or end of the track is sloped.
+ if (_previousTrackSlopeEnd != TRACK_SLOPE_NONE || _currentTrackSlopeEnd != TRACK_SLOPE_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_LARGE) |
+ (1ULL << WIDX_RIGHT_CURVE_LARGE);
+ }
+ if (is_track_enabled(TRACK_SLOPE_CURVE) && is_track_enabled(TRACK_CURVE_VERY_SMALL)) {
+ // Disable small curves if the start or end of the track is sloped.
+ if (_previousTrackSlopeEnd != TRACK_SLOPE_NONE || _currentTrackSlopeEnd != TRACK_SLOPE_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL);
+ }
+ }
+ if (!is_track_enabled(TRACK_SLOPE_CURVE)) {
+ if (is_track_enabled(TRACK_CURVE_VERTICAL)) {
+ // Disable all curves only on vertical track
+ if (_previousTrackSlopeEnd != TRACK_SLOPE_UP_90 || _currentTrackSlopeEnd != TRACK_SLOPE_UP_90) {
+ if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_90) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL);
+ }
+ }
+ } else {
+ // Disable all curves on sloped track
+ if (_previousTrackSlopeEnd != TRACK_SLOPE_NONE || _currentTrackSlopeEnd != TRACK_SLOPE_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL);
+ }
+ }
+ }
+ if (!is_track_enabled(TRACK_FLAT_ROLL_BANKING)) {
+ // Disable banking
+ disabledWidgets |=
+ (1ULL << WIDX_BANKING_GROUPBOX) |
+ (1ULL << WIDX_BANK_LEFT) |
+ (1ULL << WIDX_BANK_STRAIGHT) |
+ (1ULL << WIDX_BANK_RIGHT);
+ }
+ if (!is_track_enabled(TRACK_SLOPE) && !is_track_enabled(TRACK_SLOPE_STEEP)) {
+ if (rideType != RIDE_TYPE_REVERSE_FREEFALL_COASTER && rideType != RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) {
+ // Disable all slopes
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_GROUPBOX) |
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_SLOPE_DOWN) |
+ (1ULL << WIDX_LEVEL) |
+ (1ULL << WIDX_SLOPE_UP) |
+ (1ULL << WIDX_SLOPE_UP_STEEP);
+ }
+ }
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_0) {
+ disabledWidgets |=
+ (1ULL << WIDX_CONSTRUCT) |
+ (1ULL << WIDX_DEMOLISH) |
+ (1ULL << WIDX_PREVIOUS_SECTION) |
+ (1ULL << WIDX_NEXT_SECTION);
+ }
+ switch (_currentTrackCurve) {
+ case TRACK_CURVE_LEFT_VERY_SMALL:
+ case TRACK_CURVE_LEFT_SMALL:
+ case TRACK_CURVE_LEFT:
+ case TRACK_CURVE_LEFT_LARGE:
+ disabledWidgets |= (1ULL << WIDX_BANK_RIGHT);
+ if (_previousTrackBankEnd == TRACK_BANK_NONE) {
+ disabledWidgets |= (1ULL << WIDX_BANK_LEFT);
+ } else {
+ disabledWidgets |= (1ULL << WIDX_BANK_STRAIGHT);
+ }
+ break;
+ case TRACK_CURVE_RIGHT_LARGE:
+ case TRACK_CURVE_RIGHT:
+ case TRACK_CURVE_RIGHT_SMALL:
+ case TRACK_CURVE_RIGHT_VERY_SMALL:
+ disabledWidgets |= (1ULL << WIDX_BANK_LEFT);
+ if (_previousTrackBankEnd == TRACK_BANK_NONE) {
+ disabledWidgets |= (1ULL << WIDX_BANK_RIGHT);
+ } else {
+ disabledWidgets |= (1ULL << WIDX_BANK_STRAIGHT);
+ }
+ break;
+ }
+ if (!is_track_enabled(TRACK_SLOPE_ROLL_BANKING)) {
+ if (_currentTrackBankEnd != TRACK_BANK_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN) |
+ (1ULL << WIDX_SLOPE_UP);
+ }
+ }
+ if (_previousTrackSlopeEnd == _currentTrackSlopeEnd) {
+ switch (_currentTrackSlopeEnd) {
+ case TRACK_SLOPE_UP_60:
+ case TRACK_SLOPE_DOWN_60:
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL);
+ if (!is_track_enabled(TRACK_SLOPE_CURVE_STEEP)) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL);
+ }
+ break;
+ case TRACK_SLOPE_UP_90:
+ case TRACK_SLOPE_DOWN_90:
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL);
+ if (!is_track_enabled(TRACK_CURVE_VERTICAL)) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL);
+ }
+ break;
+ }
+ } else {
+ // Disable all curves
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL);
+ }
+
+ switch (_previousTrackSlopeEnd) {
+ case TRACK_SLOPE_NONE:
+ if (_currentTrackCurve != TRACK_CURVE_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_SLOPE_UP_STEEP);
+ }
+ break;
+ case TRACK_SLOPE_DOWN_25:
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_UP) |
+ (1ULL << WIDX_SLOPE_UP_STEEP);
+ break;
+ case TRACK_SLOPE_DOWN_60:
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_UP) |
+ (1ULL << WIDX_SLOPE_UP_STEEP);
+ if (!is_track_enabled(TRACK_SLOPE_LONG) && !is_track_enabled(TRACK_SLOPE_STEEP_LONG)) {
+ disabledWidgets |= (1ULL << WIDX_LEVEL);
+ }
+ break;
+ case TRACK_SLOPE_UP_25:
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_SLOPE_DOWN);
+ break;
+ case TRACK_SLOPE_UP_60:
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_SLOPE_DOWN);
+ if (!is_track_enabled(TRACK_SLOPE_LONG) && !is_track_enabled(TRACK_SLOPE_STEEP_LONG)) {
+ disabledWidgets |= (1ULL << WIDX_LEVEL);
+ }
+ break;
+ case TRACK_SLOPE_DOWN_90:
+ case TRACK_SLOPE_UP_90:
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN) |
+ (1ULL << WIDX_LEVEL) |
+ (1ULL << WIDX_SLOPE_UP);
+ break;
+ }
+ if (_previousTrackSlopeEnd == TRACK_SLOPE_NONE) {
+ if (!is_track_enabled(TRACK_SLOPE_LONG) && !is_track_enabled(TRACK_SLOPE_STEEP_LONG)) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_SLOPE_UP_STEEP);
+ }
+ }
+ if (is_track_enabled(TRACK_SLOPE_VERTICAL)) {
+ if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_60 && _currentTrackPieceDirection < 4) {
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP);
+ }
+ if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_90) {
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP);
+ }
+ if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_60 && _currentTrackPieceDirection < 4) {
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP_STEEP);
+ }
+ }
+ if (_previousTrackBankEnd == TRACK_BANK_LEFT) {
+ disabledWidgets |=
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_LARGE) |
+ (1ULL << WIDX_BANK_RIGHT);
+ }
+ if (_previousTrackBankEnd == TRACK_BANK_RIGHT) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_LEFT_CURVE_LARGE) |
+ (1ULL << WIDX_BANK_LEFT);
+ }
+ if (_currentTrackBankEnd != _previousTrackBankEnd) {
+ disabledWidgets |=
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_LARGE) |
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_LEFT_CURVE_LARGE);
+ }
+ if (_currentTrackSlopeEnd != TRACK_SLOPE_NONE) {
+ if (is_track_enabled(TRACK_SLOPE_ROLL_BANKING)) {
+ if (_previousTrackSlopeEnd == TRACK_SLOPE_NONE) {
+ if (_currentTrackSlopeEnd != TRACK_SLOPE_UP_25 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_25) {
+ disabledWidgets |=
+ (1ULL << WIDX_BANK_LEFT) |
+ (1ULL << WIDX_BANK_RIGHT);
+ }
+ } else {
+ if (_currentTrackSlopeEnd != _previousTrackSlopeEnd) {
+ disabledWidgets |=
+ (1ULL << WIDX_BANK_LEFT) |
+ (1ULL << WIDX_BANK_RIGHT);
+ } else {
+ if (_currentTrackSlopeEnd != TRACK_SLOPE_UP_25 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_25) {
+ disabledWidgets |=
+ (1ULL << WIDX_BANK_LEFT) |
+ (1ULL << WIDX_BANK_RIGHT);
+ }
+ }
+ }
+ } else {
+ disabledWidgets |=
+ (1ULL << WIDX_BANK_LEFT) |
+ (1ULL << WIDX_BANK_RIGHT);
+ }
+ }
+ if (_currentTrackBankEnd != TRACK_BANK_NONE || _previousTrackBankEnd != TRACK_BANK_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_SLOPE_UP_STEEP) |
+ (1ULL << WIDX_CHAIN_LIFT);
+ }
+ if (_currentTrackCurve != TRACK_CURVE_NONE) {
+ if (!is_track_enabled(TRACK_LIFT_HILL_CURVE)) {
+ disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT);
+ }
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE) {
+ disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT);
+ }
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_60) {
+ disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT);
+ }
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_60) {
+ disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT);
+ }
+ }
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_90 || _previousTrackSlopeEnd == TRACK_SLOPE_UP_90) {
+ disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT);
+ }
+ if (_previousTrackBankEnd == TRACK_BANK_UPSIDE_DOWN) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_LEFT_CURVE_LARGE) |
+ (1ULL << WIDX_STRAIGHT) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_LARGE);
+ }
+ if (_currentTrackCurve != TRACK_CURVE_NONE) {
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN) |
+ (1ULL << WIDX_SLOPE_UP);
+ }
+ if (_currentTrackSlopeEnd == _previousTrackSlopeEnd) {
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_25) {
+ disabledWidgets |= (1ULL << WIDX_SLOPE_UP_STEEP);
+ if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL || _rideConstructionState != RIDE_CONSTRUCTION_STATE_BACK || !is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) {
+ disabledWidgets |= (1ULL << WIDX_LEVEL);
+ }
+ }
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_25) {
+ disabledWidgets |= (1ULL << WIDX_SLOPE_DOWN_STEEP);
+ if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL || _rideConstructionState != RIDE_CONSTRUCTION_STATE_FRONT || !is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) {
+ disabledWidgets |= (1ULL << WIDX_LEVEL);
+ }
+ }
+ } else if (is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_SLOPE_UP_STEEP);
+ if (_currentTrackBankEnd == TRACK_BANK_LEFT) {
+ disabledWidgets |=
+ (1ULL << WIDX_BANK_STRAIGHT) |
+ (1ULL << WIDX_BANK_RIGHT);
+ disabledWidgets &= ~(1ULL << WIDX_BANK_LEFT);
+ }
+ if (_currentTrackBankEnd == TRACK_BANK_RIGHT) {
+ disabledWidgets |=
+ (1ULL << WIDX_BANK_LEFT) |
+ (1ULL << WIDX_BANK_STRAIGHT);
+ disabledWidgets &= ~(1ULL << WIDX_BANK_RIGHT);
+ }
+ if (_currentTrackBankEnd == TRACK_BANK_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_BANK_LEFT) |
+ (1ULL << WIDX_BANK_RIGHT);
+ disabledWidgets &= ~(1ULL << WIDX_BANK_STRAIGHT);
+ }
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN) |
+ (1ULL << WIDX_SLOPE_UP);
+ disabledWidgets &= ~(1ULL << WIDX_LEVEL);
+ }
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_25) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN) |
+ (1ULL << WIDX_LEVEL);
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP);
+ }
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_25) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEVEL) |
+ (1ULL << WIDX_SLOPE_UP);
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN);
+ }
+ if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL) {
+ disabledWidgets &= ~(1ULL << WIDX_LEFT_CURVE_SMALL);
+ }
+ if (_currentTrackCurve == TRACK_CURVE_RIGHT_SMALL) {
+ disabledWidgets &= ~(1ULL << WIDX_RIGHT_CURVE_SMALL);
+ }
+ }
+ }
+ if (_currentTrackCurve != TRACK_CURVE_NONE && _currentTrackSlopeEnd == TRACK_SLOPE_UP_60) {
+ disabledWidgets |= (1ULL << WIDX_SLOPE_UP);
+ }
+ if (_currentTrackCurve != TRACK_CURVE_NONE && _currentTrackSlopeEnd == TRACK_SLOPE_DOWN_60) {
+ disabledWidgets |= (1ULL << WIDX_SLOPE_DOWN);
+ }
+ if (_currentTrackLiftHill & 1) {
+ if (_currentTrackSlopeEnd != TRACK_SLOPE_NONE && !is_track_enabled(TRACK_LIFT_HILL_CURVE)) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_LEFT_CURVE_LARGE) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_LARGE);
+ }
+ if (!is_track_enabled(TRACK_LIFT_HILL_STEEP)) {
+ if (w->widgets[WIDX_SLOPE_UP_STEEP].tooltip == STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP) {
+ disabledWidgets |= (1ULL << WIDX_SLOPE_UP_STEEP);
+ }
+ }
+ }
+ if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_60 && _currentTrackCurve != TRACK_CURVE_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_LEVEL);
+ }
+ if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_60 && _currentTrackCurve != TRACK_CURVE_NONE) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEVEL) |
+ (1ULL << WIDX_SLOPE_UP_STEEP);
+ }
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_90 || _previousTrackSlopeEnd == TRACK_SLOPE_UP_90) {
+ if (_currentTrackCurve != TRACK_CURVE_NONE) {
+ disabledWidgets |= (1ULL << WIDX_SLOPE_UP_STEEP);
+ }
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_LARGE) |
+ (1ULL << WIDX_RIGHT_CURVE_LARGE);
+ if (rideType == RIDE_TYPE_REVERSE_FREEFALL_COASTER || rideType == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) {
+ disabledWidgets |=
+ (1ULL << WIDX_STRAIGHT) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE);
+ }
+ } else if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_90 || _previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90) {
+ if (_currentTrackCurve != TRACK_CURVE_NONE) {
+ disabledWidgets |= (1ULL << WIDX_SLOPE_DOWN_STEEP);
+ }
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_LARGE) |
+ (1ULL << WIDX_RIGHT_CURVE_LARGE);
+ if (rideType == RIDE_TYPE_REVERSE_FREEFALL_COASTER || rideType == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) {
+ disabledWidgets |=
+ (1ULL << WIDX_STRAIGHT) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE);
+ }
+ }
+ if (is_track_enabled(TRACK_HELIX_LARGE_UNBANKED)) {
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _currentTrackBankEnd == TRACK_SLOPE_NONE) {
+ if (_currentTrackCurve == TRACK_CURVE_LEFT || _currentTrackCurve == TRACK_CURVE_RIGHT) {
+ if (_currentTrackSlopeEnd == _previousTrackSlopeEnd) {
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP);
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP_STEEP);
+ }
+ }
+ }
+ } else if (
+ (
+ is_track_enabled(TRACK_HELIX_SMALL) ||
+ (_currentTrackCurve != TRACK_CURVE_LEFT_SMALL && _currentTrackCurve != TRACK_CURVE_RIGHT_SMALL && !is_track_enabled(TRACK_HELIX_LARGE))
+ ) &&
+ (
+ _currentTrackCurve == TRACK_CURVE_LEFT ||
+ _currentTrackCurve == TRACK_CURVE_RIGHT ||
+ _currentTrackCurve == TRACK_CURVE_LEFT_SMALL ||
+ _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL
+ ) &&
+ (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _currentTrackBankEnd != TRACK_BANK_NONE)
+ ) {
+ if (_previousTrackSlopeEnd == _currentTrackSlopeEnd) {
+ // Enable helix
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP);
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP_STEEP);
+ }
+ }
+ if (is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) {
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) {
+ if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL) {
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _previousTrackBankEnd != TRACK_BANK_NONE) {
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP);
+ }
+ }
+ } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) {
+ if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL) {
+ if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _previousTrackBankEnd != TRACK_BANK_NONE) {
+ disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN);
+ }
+ }
+ }
+ }
+ if (_currentTrackPieceDirection >= 4) {
+ disabledWidgets |=
+ (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL);
+ }
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) {
+ disabledWidgets |= (1ULL << WIDX_NEXT_SECTION);
+ if (sub_6CA2DF(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) {
+ disabledWidgets |= (1ULL << WIDX_CONSTRUCT);
+ }
+ } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) {
+ disabledWidgets |= (1ULL << WIDX_PREVIOUS_SECTION);
+ if (sub_6CA2DF(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) {
+ disabledWidgets |= (1ULL << WIDX_CONSTRUCT);
+ }
+ }
+ if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) {
+ disabledWidgets &= ~(1ULL << WIDX_BANKING_GROUPBOX);
+ }
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT || _rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ disabledWidgets |=
+ (1ULL << WIDX_DIRECTION_GROUPBOX) |
+ (1ULL << WIDX_SLOPE_GROUPBOX) |
+ (1ULL << WIDX_BANKING_GROUPBOX) |
+ (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE_SMALL) |
+ (1ULL << WIDX_LEFT_CURVE) |
+ (1ULL << WIDX_STRAIGHT) |
+ (1ULL << WIDX_RIGHT_CURVE) |
+ (1ULL << WIDX_RIGHT_CURVE_SMALL) |
+ (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL) |
+ (1ULL << WIDX_SPECIAL_TRACK_DROPDOWN) |
+ (1ULL << WIDX_SLOPE_DOWN_STEEP) |
+ (1ULL << WIDX_SLOPE_DOWN) |
+ (1ULL << WIDX_LEVEL) |
+ (1ULL << WIDX_SLOPE_UP) |
+ (1ULL << WIDX_SLOPE_UP_STEEP) |
+ (1ULL << WIDX_CHAIN_LIFT) |
+ (1ULL << WIDX_BANK_LEFT) |
+ (1ULL << WIDX_BANK_STRAIGHT) |
+ (1ULL << WIDX_BANK_RIGHT) |
+ (1ULL << WIDX_LEFT_CURVE_LARGE) |
+ (1ULL << WIDX_RIGHT_CURVE_LARGE);
+ }
+ if (RCT2_GLOBAL(0x00F440D3, uint8) != 0) {
+ disabledWidgets &= ~(1ULL << WIDX_BANKING_GROUPBOX);
+ disabledWidgets &= ~(1ULL << WIDX_BANK_LEFT);
+ disabledWidgets &= ~(1ULL << WIDX_BANK_STRAIGHT);
+ disabledWidgets &= ~(1ULL << WIDX_BANK_RIGHT);
+ }
+
+ // Set and invalidate the changed widgets
+ uint64 currentDisabledWidgets = w->disabled_widgets;
+ if (currentDisabledWidgets == disabledWidgets)
+ return;
+
+ for (int i = 0; i < 64; i++) {
+ if ((disabledWidgets & (1ULL << i)) != (currentDisabledWidgets & (1ULL << i))) {
+ widget_invalidate(w, i);
+ }
+ }
+ w->disabled_widgets = disabledWidgets;
+}
+
+/**
+ *
+ * rct2: 0x006C6E6A
+ */
+static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget)
+{
+ rct_ride *ride = GET_RIDE(_currentRideIndex);
+ int rideType;
+
+ window_ride_construction_update_enabled_track_pieces();
+ switch (widgetIndex) {
+ case WIDX_LEFT_CURVE:
+ sub_6C9627();
+ _currentTrackCurve = 1;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_RIGHT_CURVE:
+ sub_6C9627();
+ _currentTrackCurve = 2;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_LEFT_CURVE_SMALL:
+ sub_6C9627();
+ _currentTrackCurve = 3;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_RIGHT_CURVE_SMALL:
+ sub_6C9627();
+ _currentTrackCurve = 4;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_LEFT_CURVE_VERY_SMALL:
+ sub_6C9627();
+ _currentTrackCurve = 5;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_RIGHT_CURVE_VERY_SMALL:
+ sub_6C9627();
+ _currentTrackCurve = 6;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_LEFT_CURVE_LARGE:
+ sub_6C9627();
+ _currentTrackCurve = 7;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_RIGHT_CURVE_LARGE:
+ sub_6C9627();
+ _currentTrackCurve = 8;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_STRAIGHT:
+ sub_6C9627();
+ if (_currentTrackCurve != 0)
+ _currentTrackBankEnd = TRACK_BANK_NONE;
+ _currentTrackCurve = 0;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_SLOPE_DOWN_STEEP:
+ sub_6C9627();
+ rideType = _currentTrackCovered & 2 ? RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : ride->type;
+ if (is_track_enabled(TRACK_HELIX_SMALL)) {
+ if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) {
+ _currentTrackCurve = 349;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) {
+ _currentTrackCurve = 350;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 3 && _currentTrackBankEnd == TRACK_BANK_LEFT) {
+ _currentTrackCurve = 345;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 4 && _currentTrackBankEnd == TRACK_BANK_RIGHT) {
+ _currentTrackCurve = 346;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ }
+ }
+ if (is_track_enabled(TRACK_HELIX_LARGE)) {
+ if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) {
+ _currentTrackCurve = 360;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) {
+ _currentTrackCurve = 361;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ }
+ }
+ if (is_track_enabled(TRACK_HELIX_LARGE_UNBANKED)) {
+ if (_currentTrackBankEnd == TRACK_BANK_NONE) {
+ if (_currentTrackCurve == 1) {
+ _currentTrackCurve = 364;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 2) {
+ _currentTrackCurve = 365;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ }
+ }
+ }
+ if (w->widgets[WIDX_SLOPE_DOWN_STEEP].tooltip == STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP) {
+ loc_6C7502(8);
+ } else {
+ loc_6C7502(10);
+ }
+ break;
+ case WIDX_SLOPE_DOWN:
+ sub_6C9627();
+ if (_rideConstructionState == 2 && _currentTrackBankEnd != TRACK_BANK_NONE) {
+ _currentTrackBankEnd = TRACK_BANK_NONE;
+ }
+ loc_6C7502(6);
+ break;
+ case WIDX_LEVEL:
+ sub_6C9627();
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT && _previousTrackSlopeEnd == 6) {
+ if (_currentTrackCurve == 3) {
+ _currentTrackBankEnd = TRACK_BANK_LEFT;
+ } else if (_currentTrackCurve == 4) {
+ _currentTrackBankEnd = TRACK_BANK_RIGHT;
+ }
+ } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK && _previousTrackSlopeEnd == 2) {
+ if (_currentTrackCurve == 3) {
+ _currentTrackBankEnd = TRACK_BANK_LEFT;
+ } else if (_currentTrackCurve == 4) {
+ _currentTrackBankEnd = TRACK_BANK_RIGHT;
+ }
+ }
+ loc_6C7502(0);
+ break;
+ case WIDX_SLOPE_UP:
+ sub_6C9627();
+ if (_rideConstructionState == 1 && _currentTrackBankEnd != TRACK_BANK_NONE) {
+ _currentTrackBankEnd = TRACK_BANK_NONE;
+ }
+ if (ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER || ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) {
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT && _currentTrackCurve == 0) {
+ _currentTrackCurve = 124 | 0x100;
+ sub_6C84CE();
+ }
+ } else {
+ loc_6C7502(2);
+ }
+ break;
+ case WIDX_SLOPE_UP_STEEP:
+ sub_6C9627();
+ rideType = _currentTrackCovered & 2 ? RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : ride->type;
+ if (is_track_enabled(TRACK_HELIX_SMALL)) {
+ if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) {
+ _currentTrackCurve = 347;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) {
+ _currentTrackCurve = 348;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 3 && _currentTrackBankEnd == TRACK_BANK_LEFT) {
+ _currentTrackCurve = 343;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 4 && _currentTrackBankEnd == TRACK_BANK_RIGHT) {
+ _currentTrackCurve = 344;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ }
+ }
+ if (is_track_enabled(TRACK_HELIX_LARGE)) {
+ if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) {
+ _currentTrackCurve = 358;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) {
+ _currentTrackCurve = 359;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ }
+ }
+ if (is_track_enabled(TRACK_HELIX_LARGE_UNBANKED)) {
+ if (_currentTrackBankEnd == TRACK_BANK_NONE) {
+ if (_currentTrackCurve == 1) {
+ _currentTrackCurve = 362;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ } else if (_currentTrackCurve == 2) {
+ _currentTrackCurve = 363;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ }
+ }
+ }
+ if (w->widgets[WIDX_SLOPE_UP_STEEP].tooltip == STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP) {
+ loc_6C7502(4);
+ } else {
+ loc_6C7502(18);
+ }
+ break;
+ case WIDX_CHAIN_LIFT:
+ sub_6C9627();
+ _currentTrackLiftHill ^= 1;
+ if (_currentTrackLiftHill & 1) {
+ _currentTrackCovered &= ~1;
+ }
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_BANK_LEFT:
+ sub_6C9627();
+ if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) {
+ _currentTrackBankEnd = TRACK_BANK_LEFT;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ }
+ break;
+ case WIDX_BANK_STRAIGHT:
+ sub_6C9627();
+ if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) {
+ _currentTrackBankEnd = TRACK_BANK_NONE;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ } else {
+ uint8 *ebp = (uint8*)0x00F440CD;
+ uint8 bl = 30;
+ if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) {
+ ebp = (uint8*)0x00F440CE;
+ bl = RCT2_GLOBAL(0x0097CF40 + 6 + (ride->type * 8), uint8);
+ }
+ uint8 bh = *ebp + 2;
+ if (bh <= bl) {
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ loc_6C76E9();
+ } else {
+ *ebp = bh;
+ sub_6C84CE();
+ }
+ }
+ }
+ break;
+ case WIDX_BANK_RIGHT:
+ sub_6C9627();
+ if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) {
+ _currentTrackBankEnd = TRACK_BANK_RIGHT;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ } else {
+ uint8 *ebp = (uint8*)0x00F440CD;
+ if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) {
+ ebp = (uint8*)0x00F440CE;
+ }
+ uint8 bh = *ebp - 2;
+ if (bh >= 2) {
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ loc_6C76E9();
+ } else {
+ *ebp = bh;
+ sub_6C84CE();
+ }
+ }
+ }
+ break;
+ case WIDX_SPECIAL_TRACK_DROPDOWN:
+ window_ride_construction_show_special_track_dropdown(w, widget);
+ break;
+ case WIDX_U_TRACK:
+ sub_6C9627();
+ _currentTrackCovered &= ~1;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_O_TRACK:
+ sub_6C9627();
+ _currentTrackCovered |= 1;
+ _currentTrackLiftHill &= ~1;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
+ break;
+ case WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP:
+ if (_currentSeatRotationAngle < 15) {
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ ride_selected_track_set_seat_rotation(_currentSeatRotationAngle + 1);
+ } else {
+ _currentSeatRotationAngle++;
+ sub_6C84CE();
+ }
+ }
+ break;
+ case WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN:
+ if (_currentSeatRotationAngle > 0) {
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ ride_selected_track_set_seat_rotation(_currentSeatRotationAngle - 1);
+ } else {
+ _currentSeatRotationAngle--;
+ sub_6C84CE();
+ }
+ }
+ break;
+ }
+}
+
+/**
+ *
+ * rct2: 0x006C78CD
+ */
+static void window_ride_construction_dropdown()
+{
+ short dropdownIndex, widgetIndex;
+ rct_window *w;
+
+ window_dropdown_get_registers(w, widgetIndex, dropdownIndex);
+
+ if (widgetIndex != WIDX_SPECIAL_TRACK_DROPDOWN)
+ return;
+ if (dropdownIndex == -1)
+ return;
+
+ sub_6C9627();
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ int trackPiece = _currentPossibleRideConfigurations[dropdownIndex];
+ switch (trackPiece) {
+ case TRACK_ELEM_END_STATION:
+ case TRACK_ELEM_S_BEND_LEFT:
+ case TRACK_ELEM_S_BEND_RIGHT:
+ _currentTrackSlopeEnd = 0;
+ break;
+ case TRACK_ELEM_LEFT_VERTICAL_LOOP:
+ case TRACK_ELEM_RIGHT_VERTICAL_LOOP:
+ _currentTrackBankEnd = TRACK_BANK_NONE;
+ _currentTrackLiftHill &= ~1;
+ break;
+ }
+ _currentTrackCurve = trackPiece | 0x100;
+ sub_6C84CE();
+}
+
+/**
+ *
+ * rct2: 0x006C9F72
+ */
+static void window_ride_construction_construct(rct_window *w)
+{
+ int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation;
+ track_begin_end trackBeginEnd;
+
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ RCT2_GLOBAL(0x00F44074, money32) = MONEY32_UNDEFINED;
+ sub_6C9627();
+ if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &seatRotation)) {
+ sub_6C84CE();
+ return;
+ }
+
+ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE;
+ RCT2_GLOBAL(0x00F44074, money32) = game_do_command(
+ x,
+ (GAME_COMMAND_FLAG_APPLY) | (trackDirection << 8),
+ y,
+ rideIndex | (trackType << 8) | (edxRS16 << 16),
+ GAME_COMMAND_PLACE_TRACK,
+ z | (seatRotation << 28),
+ 0
+ );
+ if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) {
+ sub_6C84CE();
+ return;
+ }
+
+ sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z);
+
+ if (RCT2_GLOBAL(0x00F441D4, uint8) & 2) {
+ viewport_set_visibility(1);
+ }
+
+ if (
+ (_currentTrackCurve >= 343 && _currentTrackCurve <= 350) ||
+ (_currentTrackCurve >= 358 && _currentTrackCurve <= 365) ||
+ (_currentTrackSlopeEnd != TRACK_SLOPE_NONE)
+ ) {
+ viewport_set_visibility(2);
+ }
+
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) {
+ RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex;
+ trackDirection = _currentTrackPieceDirection ^ 2;
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ if (!(trackDirection & 4)) {
+ x += TileDirectionDelta[trackDirection].x;
+ y += TileDirectionDelta[trackDirection].y;
+ }
+
+ if (sub_6C63D6(x, y, z, trackDirection, &trackBeginEnd)) {
+ _currentTrackBeginX = trackBeginEnd.begin_x;
+ _currentTrackBeginY = trackBeginEnd.begin_y;
+ _currentTrackBeginZ = trackBeginEnd.begin_z;
+ _currentTrackPieceDirection = trackBeginEnd.begin_direction;
+ _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED;
+ ride_select_previous_section();
+ } else {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_0;
+ }
+ } else {
+ RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex;
+ trackDirection = _currentTrackPieceDirection;
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ if (!(trackDirection & 4)) {
+ x -= TileDirectionDelta[trackDirection].x;
+ y -= TileDirectionDelta[trackDirection].y;
+ }
+
+ int dir2;
+ rct_map_element *mapElement = sub_6C6096(&x, &y, &z, &trackDirection, &dir2);
+ if (mapElement != NULL) {
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = z;
+ _currentTrackPieceDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK;
+ _currentTrackPieceType = mapElement->properties.track.type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED;
+ ride_select_next_section();
+ } else {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_0;
+ }
+ }
+
+ sub_6C84CE();
+}
+
+/**
+ *
+ * rct2: 0x006C9BA5
+ */
+static void window_ride_construction_mouseup_demolish(rct_window* w)
+{
+ int x, y, z, direction, type, slope, slopeEnd, b2, bankEnd, bankStart, b5, b4;
+ rct_map_element *mapElement;
+ rct_xy_element inputElement, outputElement;
+ track_begin_end trackBeginEnd;
+ bool gotoStartPlacementMode;
+
+ _currentTrackPrice = MONEY32_UNDEFINED;
sub_6C9627();
- RCT2_GLOBAL(0xF440B8, uint8) = 3;
- if (RCT2_GLOBAL(0xF440A6, uint8) == 1){
- //6C9C4F
+ // Select the track element that is to be deleted
+ RCT2_GLOBAL(0x00F440B8, uint8) = 3;
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) {
+ if (!ride_select_backwards_from_front()) {
+ sub_6C84CE();
+ return;
+ }
+ RCT2_GLOBAL(0x00F440B8, uint8) = 1;
+ } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) {
+ if (!ride_select_forwards_from_back()) {
+ sub_6C84CE();
+ return;
+ }
+ RCT2_GLOBAL(0x00F440B8, uint8) = 2;
}
- if (RCT2_GLOBAL(0xF440A6, uint8) != 2){
- //6c9cc4
- int eax = RCT2_GLOBAL(0xF440A8, uint16),
- ebx = RCT2_GLOBAL(0xF440AF, uint8) || (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) << 8),
- ecx = RCT2_GLOBAL(0xF440AA, uint16),
- edx = RCT2_GLOBAL(0xF440AC, uint16);
-
- sub_6C683D(&eax, &ecx, &edx, RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8), RCT2_GLOBAL(0xF440AF, uint8) & 0x3FF, 0, 0, 0);
+ // Invalidate the selected track element or make sure its at origin???
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ direction = _currentTrackPieceDirection;
+ type = _currentTrackPieceType;
+ if (sub_6C683D(&x, &y, &z, direction & 3, type, 0, &mapElement, 0)) {
+ sub_6C84CE();
+ return;
}
- int ride_id = RCT2_GLOBAL(0xF440A7, uint8);
- RCT2_GLOBAL(0xF441D2, uint8) = ride_id;
- //6c9BFE
+ // Get the previous track element to go to after the selected track element is deleted
+ inputElement.x = x;
+ inputElement.y = y;
+ inputElement.element = mapElement;
+ if (track_get_previous(x, y, mapElement, &trackBeginEnd)) {
+ x = trackBeginEnd.begin_x;
+ y = trackBeginEnd.begin_y;
+ z = trackBeginEnd.begin_z;
+ direction = trackBeginEnd.begin_direction;
+ type = trackBeginEnd.begin_element->properties.track.type;
+ gotoStartPlacementMode = false;
+ } else if (track_get_next(&inputElement, &outputElement, &z, &direction)) {
+ x = outputElement.x;
+ y = outputElement.y;
+ direction = outputElement.element->type & MAP_ELEMENT_DIRECTION_MASK;
+ type = outputElement.element->properties.track.type;
+ gotoStartPlacementMode = false;
+ } else {
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ direction = _currentTrackPieceDirection;
+ type = _currentTrackPieceType;
+
+ if (sub_6C683D(&x, &y, &z, direction, type, 0, &mapElement, 0)) {
+ sub_6C84CE();
+ return;
+ }
+
+ const rct_preview_track *trackBlock = get_track_def_from_ride_index(_currentRideIndex, mapElement->properties.track.type);
+ z = (mapElement->base_height * 8) - trackBlock->z;
+ gotoStartPlacementMode = true;
+ }
+
+ money32 cost = ride_remove_track_piece(
+ _currentTrackBeginX,
+ _currentTrackBeginY,
+ _currentTrackBeginZ,
+ _currentTrackPieceDirection,
+ _currentTrackPieceType
+ );
+ if (cost == MONEY32_UNDEFINED) {
+ sub_6C84CE();
+ return;
+ }
+
+ if (gotoStartPlacementMode) {
+ z &= 0xFFF0;
+ _currentTrackBeginZ = z;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT;
+ _currentTrackSlopeEnd = 0;
+ _rideConstructionArrowPulseTime = 0;
+ direction = _currentTrackPieceDirection;
+ slope = _currentTrackCurve;
+ slopeEnd = _previousTrackSlopeEnd;
+ b2 = _currentTrackSlopeEnd;
+ bankEnd = _previousTrackBankEnd;
+ bankStart = _currentTrackBankEnd;
+ b5 = _currentTrackCovered;
+ b4 = _currentTrackLiftHill;
+ sub_6C9800();
+ sub_6C84CE();
+ if (!sub_6CAF80(_currentRideIndex, &outputElement)) {
+ sub_6CC3FB(_currentRideIndex);
+ _currentTrackPieceDirection = _currentTrackPieceDirection;
+ if (slope & 0x100) {
+ _currentTrackCurve = slope;
+ _previousTrackSlopeEnd = slopeEnd;
+ _currentTrackSlopeEnd = b2;
+ _previousTrackBankEnd = bankEnd;
+ _currentTrackBankEnd = bankStart;
+ _currentTrackCovered = b5;
+ _currentTrackLiftHill = b4;
+ sub_6C84CE();
+ }
+ }
+ } else {
+ if (RCT2_GLOBAL(0x00F440B8, uint8) == 3 || RCT2_GLOBAL(0x00F440B8, uint8) == 1) {
+ if (type == TRACK_ELEM_MIDDLE_STATION || type == TRACK_ELEM_BEGIN_STATION) {
+ type = TRACK_ELEM_END_STATION;
+ }
+ }
+ if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) {
+ if (type == TRACK_ELEM_MIDDLE_STATION) {
+ type = TRACK_ELEM_BEGIN_STATION;
+ }
+ }
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = z;
+ _currentTrackPieceDirection = direction;
+ _currentTrackPieceType = type;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ if (RCT2_GLOBAL(0x00F440B8, uint8) == 1) {
+ ride_select_next_section();
+ } else if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) {
+ ride_select_previous_section();
+ }
+ sub_6C84CE();
+ }
}
-void window_construction_maze_invalidate()
+/**
+ *
+ * rct2: 0x006C78AA
+ */
+static void window_ride_construction_rotate(rct_window *w)
{
- int ride_idx = RCT2_GLOBAL(0x00F440A7, uint8);
- RCT2_GLOBAL(0x13CE958, uint32_t) = RCT2_GLOBAL(0x1362944 + ride_idx * 0x260, uint32_t);
- RCT2_GLOBAL(0x13CE956, uint16_t) = RCT2_GLOBAL(0x1362942 + ride_idx * 0x260, uint16_t);
+ _currentTrackPieceDirection = (_currentTrackPieceDirection + 1) & 3;
+ sub_6C9627();
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ sub_6C84CE();
}
-//0x6C6B86
-void window_construction_paint()
+/**
+ *
+ * rct2: 0x006C7802
+ */
+static void window_ride_construction_entrance_click(rct_window *w)
+{
+ if (tool_set(w, WIDX_ENTRANCE, 12)) {
+ if (!sub_6CAF80(_currentRideIndex, NULL)) {
+ sub_6CC3FB(_currentRideIndex);
+ }
+ } else {
+ RCT2_GLOBAL(0x00F44191, uint8) = 0;
+ RCT2_GLOBAL(0x00F44192, uint8) = w->number & 0xFF;
+ RCT2_GLOBAL(0x00F44193, uint8) = 0;
+ RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) |= INPUT_FLAG_6;
+ sub_6C9627();
+ if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) {
+ RCT2_GLOBAL(0x00F440CC, uint8) = _rideConstructionState;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT;
+ }
+ sub_6C84CE();
+ }
+}
+
+/**
+ *
+ * rct2: 0x006C7866
+ */
+static void window_ride_construction_exit_click(rct_window *w)
+{
+ if (tool_set(w, WIDX_EXIT, 12)) {
+ if (!sub_6CAF80(_currentRideIndex, NULL)) {
+ sub_6CC3FB(_currentRideIndex);
+ }
+ } else {
+ RCT2_GLOBAL(0x00F44191, uint8) = 1;
+ RCT2_GLOBAL(0x00F44192, uint8) = w->number & 0xFF;
+ RCT2_GLOBAL(0x00F44193, uint8) = 0;
+ RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) |= INPUT_FLAG_6;
+ sub_6C9627();
+ if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) {
+ RCT2_GLOBAL(0x00F440CC, uint8) = _rideConstructionState;
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT;
+ }
+ sub_6C84CE();
+ }
+}
+
+/**
+ *
+ * rct2: 0x006C8374
+ */
+static void window_ride_construction_update(rct_window *w)
+{
+ switch (_currentTrackCurve) {
+ case 429:
+ case 376:
+ case 369:
+ case 368:
+ widget_invalidate(w, WIDX_CONSTRUCT);
+ break;
+ }
+
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_PLACE) {
+ if (!widget_is_active_tool(w, WIDX_CONSTRUCT)) {
+ window_close(w);
+ return;
+ }
+ }
+
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) {
+ if (!widget_is_active_tool(w, WIDX_ENTRANCE) && !widget_is_active_tool(w, WIDX_EXIT)) {
+ _rideConstructionState = RCT2_GLOBAL(0x00F440CC, uint8);
+ sub_6C84CE();
+ }
+ }
+
+ switch (_rideConstructionState) {
+ case RIDE_CONSTRUCTION_STATE_FRONT:
+ case RIDE_CONSTRUCTION_STATE_BACK:
+ case RIDE_CONSTRUCTION_STATE_SELECTED:
+ if (
+ (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) &&
+ RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) == WC_RIDE_CONSTRUCTION
+ ) {
+ tool_cancel();
+ }
+ break;
+ }
+
+ sub_6C94D8();
+}
+
+/**
+ *
+ * rct2: 0x006CC538
+ */
+static bool ride_get_place_position_from_screen_position(int screenX, int screenY, int *outX, int *outY)
+{
+ int eax, ebx, ecx, edx, esi, edi, ebp;
+ eax = screenX;
+ ebx = screenY;
+ RCT2_CALLFUNC_X(0x006CC538, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
+
+ if (outX != NULL) *outX = eax & 0xFFFF;
+ if (outY != NULL) *outY = ebx & 0xFFFF;
+
+ return (eax & 0xFFFF) != 0x8000;
+}
+
+/**
+ *
+ * rct2: 0x006C8229
+ */
+static void window_ride_construction_toolupdate()
{
rct_window *w;
- rct_drawpixelinfo *dpi;
+ short screenX, screenY, widgetIndex;
+
+ window_tool_get_registers(w, widgetIndex, screenX, screenY);
+
+ switch (widgetIndex) {
+ case WIDX_CONSTRUCT:
+ ride_construction_toolupdate_construct(screenX, screenY);
+ break;
+ case WIDX_ENTRANCE:
+ case WIDX_EXIT:
+ ride_construction_toolupdate_entrance_exit(screenX, screenY);
+ break;
+ }
+}
+
+/**
+ *
+ * rct2: 0x006C8248
+ */
+static void window_ride_construction_tooldown()
+{
+ rct_window *w;
+ short screenX, screenY, widgetIndex;
+
+ window_tool_get_registers(w, widgetIndex, screenX, screenY);
+
+ switch (widgetIndex) {
+ case WIDX_CONSTRUCT:
+ ride_construction_tooldown_construct(screenX, screenY);
+ break;
+ case WIDX_ENTRANCE:
+ case WIDX_EXIT:
+ ride_construction_tooldown_entrance_exit(screenX, screenY);
+ break;
+ }
+}
+
+/**
+ *
+ * rct2: 0x006C6AD5
+ */
+static void window_ride_construction_invalidate()
+{
+ rct_window *w;
+ rct_ride *ride;
+ rct_string_id stringId;
+
+ window_get_register(w);
+
+ ride = GET_RIDE(_currentRideIndex);
+
+ stringId = STR_RIDE_CONSTRUCTION_SPECIAL;
+ if (_currentTrackCurve >= 256) {
+ stringId = RCT2_ADDRESS(0x00999492, rct_string_id)[_currentTrackCurve - 256];
+ if (stringId == STR_RAPIDS && ride->type == RIDE_TYPE_CAR_RIDE)
+ stringId = STR_LOG_BUMPS;
+ }
+ RCT2_GLOBAL(0x013CE952, uint16) = stringId;
+
+ if (RCT2_GLOBAL(0x00F440D3, uint8) == 1)
+ RCT2_GLOBAL(0x013CE952 + 2, uint16) = ((RCT2_GLOBAL(0x00F440CD, uint8) * 9) >> 2) & 0xFFFF;
+
+ window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER].image =
+ STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_180 + RCT2_GLOBAL(0x00F440CF, uint8);
+
+ if (RCT2_GLOBAL(0x00F440D3, uint8) == 2)
+ RCT2_GLOBAL(0x013CE952 + 2, uint16) = ((RCT2_GLOBAL(0x00F440CE, uint8) * 9) >> 2) & 0xFFFF;
+
+ // Set window title arguments
+ RCT2_GLOBAL(0x013CE952 + 4, uint16) = ride->name;
+ RCT2_GLOBAL(0x013CE952 + 6, uint32) = ride->name_arguments;
+}
+
+/**
+ *
+ * rct2: 0x006C6B86
+ */
+static void window_ride_construction_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi, *clipdpi;
+ rct_widget *widget;
+ int x, y, width, height;
+
window_paint_get_registers(w, dpi);
+
window_draw_widgets(w, dpi);
- if (RCT2_GLOBAL(0x9D7C00, uint8_t) == 0) return;
- uint32_t eax = 0, esi = (uint32_t)w, ebp = 0;//nothing
- uint32_t ebx = 0, ecx = 0, edx = 0, edi = (uint32_t)dpi;//returns
- if (RCT2_CALLFUNC_X(0x6CA2DF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) return;
- RCT2_GLOBAL(0xF44133, uint8_t) = edx & 0xFF;
- RCT2_GLOBAL(0xF44134, uint8_t) = (ebx >> 8) & 0xFF;
- RCT2_GLOBAL(0xF44135, uint8_t) = (edx >> 8) & 0xFF;
- edx >>= 16;
- RCT2_GLOBAL(0xF44136, int16_t) = edx;
- rct_ride* ride = GET_RIDE(RCT2_GLOBAL(0xF44133, uint8));
- RCT2_GLOBAL(0xF44064, uint32_t) = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + ride->type * 8, uint32_t);
- // 0x009D7C04 is a widget address remember to change when widget implemented
- short width = RCT2_GLOBAL(0x9D7C04, int16_t) - RCT2_GLOBAL(0x9D7C02, int16_t) - 1;
- short height = RCT2_GLOBAL(0x9D7C08, int16_t) - RCT2_GLOBAL(0x9D7C06, int16_t) - 1;
- rct_drawpixelinfo* clip_dpi = clip_drawpixelinfo(
- dpi,
- // 0x009D7C02 is a widget address remember to change when widget implemented
- w->x + RCT2_GLOBAL(0x9D7C02, int16_t) + 1,
- width,
- w->y + RCT2_GLOBAL(0x9D7C06, int16_t) + 1,
- height);
- if (clip_dpi != NULL)
- {
- rct_preview_track *trackBlock;
- ecx = RCT2_GLOBAL(0xF44135, uint8_t);
- if (RCT2_GLOBAL(0xF44064, uint32_t) & 0x80000) trackBlock = RCT2_ADDRESS(0x994A38, rct_preview_track*)[ecx];//RCT2_GLOBAL(0x994A38 + ecx * 4, rct_preview_track*);
- else trackBlock = RCT2_ADDRESS(0x994638, rct_preview_track*)[ecx];//RCT2_GLOBAL(0x994638 + ecx * 4, rct_preview_track*);
- while ((trackBlock + 1)->var_00 != 0xFF) trackBlock++;
- short x = trackBlock->x;
- short z = trackBlock->z;
- short y = trackBlock->y;
- if (trackBlock->var_09 & 2) x = y = 0;
- short tmp;
- switch (RCT2_GLOBAL(0xF44134, uint8_t) & 3)
- {
+
+ widget = &window_ride_construction_widgets[WIDX_CONSTRUCT];
+ if (widget->type == WWT_EMPTY)
+ return;
+
+ int trackType, trackDirection, rideIndex, edxRS16;
+ if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, NULL, NULL, NULL, NULL))
+ return;
+
+ // Draw track piece
+ x = w->x + widget->left + 1;
+ y = w->y + widget->top + 1;
+ width = widget->right - widget->left - 1;
+ height = widget->bottom - widget->top - 1;
+ clipdpi = clip_drawpixelinfo(dpi, x, width, y, height);
+ if (clipdpi != NULL) {
+ window_ride_construction_draw_track_piece(w, clipdpi, rideIndex, trackType, trackDirection, edxRS16, width, height);
+ rct2_free(clipdpi);
+ }
+
+ // Draw cost
+ x = w->x + (widget->left + widget->right) / 2;
+ y = w->y + widget->bottom - 23;
+ if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_PLACE)
+ gfx_draw_string_centred(dpi, 1407, x, y, 0, w);
+
+ y += 11;
+ if (
+ _currentTrackPrice != MONEY32_UNDEFINED &&
+ !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)
+ ) {
+ gfx_draw_string_centred(dpi, 1408, x, y, 0, (void*)&_currentTrackPrice);
+ }
+}
+
+/**
+ *
+ * rct2: 0x0068B2B7
+ */
+static void sub_68B2B7(int x, int y)
+{
+ RCT2_CALLPROC_X(0x0068B2B7, x, 0, y, 0, 0, 0, 0);
+}
+
+static void window_ride_construction_draw_track_piece(
+ rct_window *w, rct_drawpixelinfo *dpi,
+ int rideIndex, int trackType, int trackDirection, int unknown,
+ int width, int height
+) {
+ const rct_preview_track *trackBlock;
+ rct_ride *ride;
+
+ ride = GET_RIDE(rideIndex);
+
+ trackBlock = get_track_def_from_ride(ride, trackType);
+ while ((trackBlock + 1)->index != 0xFF)
+ trackBlock++;
+
+ short x = trackBlock->x;
+ short z = trackBlock->z;
+ short y = trackBlock->y;
+ if (trackBlock->var_09 & 2) {
+ x = 0;
+ y = 0;
+ }
+
+ short tmp;
+ switch (trackDirection & 3) {
+ case 1:
+ tmp = x;
+ x = y;
+ y = -tmp;
+ break;
+ case 2:
+ x = -x;
+ y = -y;
+ break;
+ case 3:
+ tmp = x;
+ x = -y;
+ y = tmp;
+ break;
+ case 0:
+ break;
+ }
+ //this is actually case 0, but the other cases all jump to it
+ x = 4112 + (x / 2);
+ y = 4112 + (y / 2);
+ z = 1024 + z;
+
+ short bx = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ?
+ RCT2_GLOBAL(0x009984A2 + trackType * 8, sint8) :
+ RCT2_GLOBAL(0x00997CA2 + trackType * 8, sint8);
+
+ z -= bx;
+ int start_x = x;
+ switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) {
+ case 0:
+ x = y - x;
+ y = (y + start_x) / 2 - z;
+ break;
+ case 1:
+ x = -x - y;
+ y = (y - start_x) / 2 - z;
+ break;
+ case 2:
+ x -= y;
+ y = (-y - start_x) / 2 - z;
+ break;
+ case 3:
+ x += y;
+ y = (-y + start_x) / 2 - z;
+ break;
+ }
+ dpi->x += x - width / 2;
+ dpi->y += y - height / 2 - 16;
+ RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*) = dpi;
+ uint32_t d = unknown << 16;
+ d |= rideIndex;
+ d |= trackType << 8;
+
+ sub_6CBCE2(rideIndex, trackType, trackDirection, d, 4096, 4096, 1024);
+}
+
+static rct_map_element _tempTrackMapElement;
+static rct_map_element _tempSideTrackMapElement = { 0x80, 0x8F, 128, 128, 0, 0, 0, 0 };
+static rct_map_element *_backupMapElementArrays[5];
+
+/**
+ *
+ * rct2: 0x006CBCE2
+ * bh: trackDirection
+ * dl: rideIndex
+ * dh: trackType
+ */
+static void sub_6CBCE2(
+ int rideIndex, int trackType, int trackDirection, int edx,
+ int originX, int originY, int originZ
+) {
+ rct_ride *ride;
+ const rct_preview_track *trackBlock;
+ int preserve_word_141E9E4;
+ int x, y, baseZ, clearanceZ, offsetX, offsetY;
+ uint64 preserve_map_size_vars;
+
+ preserve_word_141E9E4 = RCT2_GLOBAL(0x0141E9E4, uint16);
+ RCT2_GLOBAL(0x0141E9E4, uint16) = 0;
+ trackDirection &= 3;
+
+ RCT2_GLOBAL(0x00EE7880, uint32) = 0x00F1A4CC;
+ sub_0x68615B(0x00EE788C);
+
+ ride = GET_RIDE(rideIndex);
+
+ preserve_map_size_vars = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint64);
+
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = 255 * 32;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_MINUS_2, uint16) = (255 * 32) + 286;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) = 256;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16) = (256 * 32) - 1;
+
+ trackBlock = get_track_def_from_ride(ride, trackType);
+ while (trackBlock->index != 255) {
+ int bl = trackBlock->var_08;
+ int bh;
+ switch (trackDirection) {
+ case 0:
+ offsetX = trackBlock->x;
+ offsetY = trackBlock->y;
+ break;
case 1:
- tmp = x;
- x = y;
- y = -tmp;
+ offsetX = trackBlock->y;
+ offsetY = -trackBlock->x;
+ bl = rol8(bl, 1);
+ bh = bl;
+ bh = ror8(bh, 4);
+ bl &= 0xEE;
+ bh &= 0x11;
+ bl |= bh;
break;
case 2:
- x = -x;
- y = -y;
+ offsetX = -trackBlock->x;
+ offsetY = -trackBlock->y;
+ bl = rol8(bl, 2);
+ bh = bl;
+ bh = ror8(bh, 4);
+ bl &= 0xCC;
+ bh &= 0x33;
+ bl |= bh;
break;
case 3:
- tmp = x;
- x = -y;
- y = tmp;
- break;
- case 0:
+ offsetX = -trackBlock->y;
+ offsetY = trackBlock->x;
+ bl = rol8(bl, 3);
+ bh |= bl;
+ bh = ror8(bh, 4);
+ bl &= 0x88;
+ bh &= 0x77;
+ bl |= bh;
break;
}
- //this is actually case 0, but the other cases all jump to it
- x /= 2;
- y /= 2;
- x += 4112;
- y += 4112;
- z += 1024;
- ebx = RCT2_GLOBAL(0xF44135, uint8_t);
- short bx;
- if (RCT2_GLOBAL(0xF44064, uint32_t) & 0x80000) bx = RCT2_GLOBAL(0x9984A2 + ebx * 8, sint8);
- else bx = RCT2_GLOBAL(0x997CA2 + ebx * 8, sint8);
+ x = originX + offsetX;
+ y = originY + offsetY;
+ baseZ = (originZ + trackBlock->z) >> 3;
+ clearanceZ = ((trackBlock->var_07 + RCT2_GLOBAL(0x0097D219 + (ride->type * 8), uint8)) >> 3) + baseZ + 4;
+
+ int tileX = x >> 5;
+ int tileY = y >> 5;
+
+ // Replace map elements with temporary ones containing track
+ _backupMapElementArrays[0] = map_get_first_element_at(tileX + 0, tileY + 0);
+ _backupMapElementArrays[1] = map_get_first_element_at(tileX + 1, tileY + 0);
+ _backupMapElementArrays[2] = map_get_first_element_at(tileX - 1, tileY + 0);
+ _backupMapElementArrays[3] = map_get_first_element_at(tileX + 0, tileY + 1);
+ _backupMapElementArrays[4] = map_get_first_element_at(tileX + 0, tileY - 1);
+ map_set_tile_elements(tileX + 0, tileY + 0, &_tempTrackMapElement);
+ map_set_tile_elements(tileX + 1, tileY + 0, &_tempSideTrackMapElement);
+ map_set_tile_elements(tileX - 1, tileY + 0, &_tempSideTrackMapElement);
+ map_set_tile_elements(tileX + 0, tileY + 1, &_tempSideTrackMapElement);
+ map_set_tile_elements(tileX + 0, tileY - 1, &_tempSideTrackMapElement);
+
+ // Set the temporary track element
+ _tempTrackMapElement.type = trackDirection | MAP_ELEMENT_TYPE_TRACK | (edx & 0x10000 ? 0x80 : 0);
+ _tempTrackMapElement.flags = (bl & 0x0F) | MAP_ELEMENT_FLAG_LAST_TILE;
+ _tempTrackMapElement.base_height = baseZ;
+ _tempTrackMapElement.clearance_height = clearanceZ;
+ _tempTrackMapElement.properties.track.type = trackType;
+ _tempTrackMapElement.properties.track.sequence = trackBlock->index;
+ _tempTrackMapElement.properties.track.colour = (edx & 0x20000 ? 4 : 0);
+ _tempTrackMapElement.properties.track.ride_index = rideIndex;
+
+ // Draw this map tile
+ sub_68B2B7(x, y);
+
+ // Restore map elements
+ map_set_tile_elements(tileX + 0, tileY + 0, _backupMapElementArrays[0]);
+ map_set_tile_elements(tileX + 1, tileY + 0, _backupMapElementArrays[1]);
+ map_set_tile_elements(tileX - 1, tileY + 0, _backupMapElementArrays[2]);
+ map_set_tile_elements(tileX + 0, tileY + 1, _backupMapElementArrays[3]);
+ map_set_tile_elements(tileX + 0, tileY - 1, _backupMapElementArrays[4]);
+
+ trackBlock++;
+ }
+
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint64) = preserve_map_size_vars;
+
+ sub_688217();
+ sub_688485();
+
+ RCT2_GLOBAL(0x0141E9E4, uint16) = preserve_word_141E9E4;
+}
+
+/**
+ *
+ * rct2: 0x006C84CE
+ */
+void sub_6C84CE()
+{
+ rct_window *w;
+ rct_map_element *mapElement;
+
+ window_ride_construction_update_enabled_track_pieces();
+ w = window_find_by_class(WC_RIDE_CONSTRUCTION);
+ if (w == NULL)
+ return;
+
+ window_ride_construction_update_map_selection();
+
+ RCT2_GLOBAL(0x00F440D0, uint8) = 255;
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ int x = _currentTrackBeginX;
+ int y = _currentTrackBeginY;
+ int z = _currentTrackBeginZ;
+ if (!sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) {
+ RCT2_GLOBAL(0x00F440D0, uint8) = mapElement->properties.track.type;
+ if (mapElement->properties.track.type == 99)
+ RCT2_GLOBAL(0x00F440CD, uint8) = (mapElement->properties.track.sequence >> 4) << 1;
+ _currentSeatRotationAngle = mapElement->properties.track.colour >> 4;
+ }
+ }
+
+ window_ride_construction_update_possible_ride_configurations();
+ window_ride_construction_update_widgets(w);
+}
+
+/**
+ *
+ * rct2: 0x006CA2DF
+ * bh: trackRotation (out)
+ * dl: ??? (out)
+ * dh: trackType (out)
+ * edx >> 16: ??? (out)
+ */
+static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *seatRotation)
+{
+ int eax, ebx, ecx, edx, esi, edi, ebp;
+ if (RCT2_CALLFUNC_X(0x006CA2DF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100)
+ return true;
+
+ if (trackType != NULL) *trackType = (edx >> 8) & 0xFF;
+ if (trackDirection != NULL) *trackDirection = (ebx >> 8) & 0xFF;
+ if (rideIndex != NULL) *rideIndex = edx & 0xFF;
+ if (edxRS16 != NULL) *edxRS16 = (edx >> 16) & 0xFFFF;
+ if (x != NULL) *x = eax & 0xFFFF;
+ if (y != NULL) *y = ecx & 0xFFFF;
+ if (z != NULL) *z = edi & 0xFFFF;
+ if (seatRotation != NULL) *seatRotation = (edi >> 28) & 0xF;
+ return false;
+}
+
+/**
+ *
+ * rct2: 0x006C6A77
+ */
+static void window_ride_construction_update_enabled_track_pieces()
+{
+ rct_ride *ride = GET_RIDE(_currentRideIndex);
+ rct_ride_type *rideEntry = ride_get_entry(ride);
+
+ int rideType = _currentTrackCovered & 2 ? RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : ride->type;
+ _enabledRidePiecesA = rideEntry->enabledTrackPiecesA & RCT2_ADDRESS(0x01357444, uint32)[rideType];
+ _enabledRidePiecesB = rideEntry->enabledTrackPiecesB & RCT2_ADDRESS(0x01357644, uint32)[rideType];
+}
+
+/**
+ *
+ * rct2: 0x006CA162
+ */
+money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16, int x, int y, int z)
+{
+ rct_ride *ride;
+ money32 result;
+
+ sub_6C96C0();
+ ride = GET_RIDE(rideIndex);
+ if (ride->type == RIDE_TYPE_MAZE) {
+ result = game_do_command(x, 105 | (4 << 8), y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_38, z, 0);
+ if (result == MONEY32_UNDEFINED)
+ return result;
+
+ RCT2_GLOBAL(0x00F440C5, uint16) = x;
+ RCT2_GLOBAL(0x00F440C7, uint16) = y;
+ RCT2_GLOBAL(0x00F440C9, uint16) = z;
+ RCT2_GLOBAL(0x00F440CB, uint8) = trackDirection;
+ _currentTrackSelectionFlags |= 2;
+ viewport_set_visibility(RCT2_GLOBAL(0x00F441D4, uint8) & 2 ? 1 : 3);
+ if (_currentTrackSlopeEnd != 0)
+ viewport_set_visibility(2);
+
+ return result;
+ } else {
+ result = game_do_command(x, 105 | (trackDirection << 8), y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_PLACE_TRACK, z, 0);
+ if (result == MONEY32_UNDEFINED)
+ return result;
+
+ RCT2_GLOBAL(0x00F440C5, uint16) = x;
+ RCT2_GLOBAL(0x00F440C7, uint16) = y;
+ z += ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ?
+ RCT2_GLOBAL(0x009972BD + (trackType * 10), uint16) :
+ RCT2_GLOBAL(0x009968BD + (trackType * 10), uint16);
+
+ RCT2_GLOBAL(0x00F440C9, uint16) = z;
+ RCT2_GLOBAL(0x00F440CB, uint8) = trackDirection;
+ _currentTrackSelectionFlags |= 2;
+ viewport_set_visibility(RCT2_GLOBAL(0x00F441D4, uint8) & 2 ? 1 : 3);
+ if (_currentTrackSlopeEnd != 0)
+ viewport_set_visibility(2);
+
+ return result;
+ }
+}
+
+/**
+ *
+ * rct2: 0x006C94D8
+ */
+void sub_6C94D8()
+{
+ int x, y, z, direction, type, rideIndex, edxRS16;
+
+ switch (_rideConstructionState) {
+ case RIDE_CONSTRUCTION_STATE_FRONT:
+ case RIDE_CONSTRUCTION_STATE_BACK:
+ if (!(_currentTrackSelectionFlags & 2)) {
+ if (sub_6CA2DF(&type, &direction, &rideIndex, &edxRS16, &x, &y, &z, NULL)) {
+ sub_6C96C0();
+ } else {
+ _currentTrackPrice = sub_6CA162(rideIndex, type, direction, edxRS16, x, y, z);
+ sub_6C84CE();
+ }
+ }
+ _rideConstructionArrowPulseTime--;
+ if (_rideConstructionArrowPulseTime >= 0)
+ break;
+
+ _rideConstructionArrowPulseTime = 5;
+ _currentTrackSelectionFlags ^= 1;
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ direction = _currentTrackPieceDirection;
+ type = _currentTrackPieceType;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z;
+ if (direction >= 4)
+ direction += 4;
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK)
+ direction ^= 2;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = direction;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~4;
+ if (_currentTrackSelectionFlags & 1)
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 4;
+ map_invalidate_tile_full(x, y);
+ break;
+ case RIDE_CONSTRUCTION_STATE_SELECTED:
+ _rideConstructionArrowPulseTime--;
+ if (_rideConstructionArrowPulseTime >= 0)
+ break;
+
+ _rideConstructionArrowPulseTime = 5;
+ _currentTrackSelectionFlags ^= 1;
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ direction = _currentTrackPieceDirection & 3;
+ type = _currentTrackPieceType;
+ if (sub_6C683D(&x, &y, &z, direction, type, 0, NULL, _currentTrackSelectionFlags & 1 ? 2 : 1)) {
+ sub_6C96C0();
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_0;
+ }
+ break;
+ case 6:
+ case 7:
+ case 8:
+ _rideConstructionArrowPulseTime--;
+ if (_rideConstructionArrowPulseTime >= 0)
+ break;
+
+ _rideConstructionArrowPulseTime = 5;
+ _currentTrackSelectionFlags ^= 1;
+ x = _currentTrackBeginX & 0xFFE0;
+ y = _currentTrackBeginY & 0xFFE0;
+ z = _currentTrackBeginZ + 15;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 4;
+ if (((_currentTrackBeginX & 0x1F) | (_currentTrackBeginY & 0x1F)) != 0) {
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 6;
+ if (((_currentTrackBeginX & 0x1F) & (_currentTrackBeginY & 0x1F)) == 0) {
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 5;
+ if ((_currentTrackBeginY & 0x1F) == 0)
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 7;
+ }
+ }
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~4;
+ if (_currentTrackSelectionFlags & 1)
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 4;
+ map_invalidate_tile_full(x, y);
+ break;
+ }
+}
+
+/**
+ *
+ * rct2: 0x006C84E2
+ */
+static void window_ride_construction_update_map_selection()
+{
+ rct_ride *ride;
+ int trackType, trackDirection, x, y;
+
+ map_invalidate_map_selection_tiles();
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 10;
+
+ switch (_rideConstructionState) {
+ case RIDE_CONSTRUCTION_STATE_0:
+ trackDirection = _currentTrackPieceDirection;
+ trackType = 0;
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ break;
+ case RIDE_CONSTRUCTION_STATE_SELECTED:
+ trackDirection = _currentTrackPieceDirection;
+ trackType = _currentTrackPieceType;
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ break;
+ default:
+ if (sub_6CA2DF(&trackType, &trackDirection, NULL, NULL, &x, &y, NULL, NULL)) {
+ trackDirection = _currentTrackPieceDirection;
+ trackType = 0;
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ }
+ break;
+ }
+
+ ride = GET_RIDE(_currentRideIndex);
+ window_ride_construction_select_map_tiles(ride, trackType, trackDirection, x, y);
+ map_invalidate_map_selection_tiles();
+}
+
+/**
+ *
+ * rct2: 0x006C8648
+ */
+static void window_ride_construction_update_possible_ride_configurations()
+{
+ rct_ride *ride;
+ int trackType;
+ int edx, edi;
+
+ ride = GET_RIDE(_currentRideIndex);
+
+ RCT2_GLOBAL(0x00F440D3, uint8) = 0;
+ if (_currentTrackCovered & 2)
+ edi = RCT2_GLOBAL(0x0097D4F5 + (ride->type * 8), uint8);
+ else
+ edi = ride->type;
+
+ int currentPossibleRideConfigurationIndex = 0;
+ _numCurrentPossibleSpecialTrackPieces = 0;
+ for (trackType = 0; trackType < 256; trackType++) {
+ edx = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ?
+ RCT2_GLOBAL(0x0099849D + (trackType * 8), uint8) :
+ RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8);
+
+ if (edx == 0)
+ continue;
+
+ if (edx & 0x80) {
+ edx &= 0x7F;
+ if (edx != edi)
+ continue;
+ } else if (!is_track_enabled(edx)) {
+ continue;
+ }
+
+ int slope, bank;
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT || _rideConstructionState == RIDE_CONSTRUCTION_STATE_PLACE) {
+ if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) {
+ slope = RCT2_GLOBAL(0x0099849F + (trackType * 8), uint8);
+ bank = RCT2_GLOBAL(0x009984A1 + (trackType * 8), uint8);
+ } else {
+ slope = RCT2_GLOBAL(0x00997C9F + (trackType * 8), uint8);
+ bank = RCT2_GLOBAL(0x00997CA1 + (trackType * 8), uint8);
+ }
+ } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) {
+ if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) {
+ slope = RCT2_GLOBAL(0x0099849E + (trackType * 8), uint8);
+ bank = RCT2_GLOBAL(0x009984A0 + (trackType * 8), uint8);
+ } else {
+ slope = RCT2_GLOBAL(0x00997C9E + (trackType * 8), uint8);
+ bank = RCT2_GLOBAL(0x00997CA0 + (trackType * 8), uint8);
+ }
+ } else {
+ continue;
+ }
+
+ if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) {
+ if (
+ RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == 21 ||
+ RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) != 22
+ ) {
+ if (bank != _previousTrackBankEnd) {
+ if (_previousTrackBankEnd != 0)
+ continue;
+
+ if (bank != TRACK_BANK_LEFT)
+ continue;
+ }
+ }
+ }
+
+ if (bank == TRACK_BANK_UPSIDE_DOWN && bank != _previousTrackBankEnd)
+ continue;
+
+ _currentPossibleRideConfigurations[currentPossibleRideConfigurationIndex] = trackType;
+ RCT2_GLOBAL(0x00F4409C, uint32) |= (1 << currentPossibleRideConfigurationIndex);
+ if (
+ _currentTrackPieceDirection < 4 &&
+ slope == _previousTrackSlopeEnd &&
+ bank == _previousTrackBankEnd &&
+ (trackType != 66 || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_29))
+ ) {
+ RCT2_GLOBAL(0x00F4409C, uint32) &= ~(1 << currentPossibleRideConfigurationIndex);
+ _numCurrentPossibleSpecialTrackPieces++;
+ }
+ currentPossibleRideConfigurationIndex++;
+ }
+ _numCurrentPossibleRideConfigurations = currentPossibleRideConfigurationIndex;
+}
+
+/**
+ *
+ * rct2: 0x006C87F5
+ */
+static void window_ride_construction_update_widgets(rct_window *w)
+{
+ uint8 rideIndex = _currentRideIndex;
+ rct_ride *ride = GET_RIDE(rideIndex);
+ int rideType = ride_get_alternative_type(ride);
+
+ w->hold_down_widgets = 0;
+ if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_IS_SHOP)) {
+ window_ride_construction_widgets[WIDX_ENTRANCE_EXIT_GROUPBOX].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_ENTRANCE].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_EXIT].type = WWT_EMPTY;
+ } else {
+ window_ride_construction_widgets[WIDX_ENTRANCE_EXIT_GROUPBOX].type = WWT_GROUPBOX;
+ window_ride_construction_widgets[WIDX_ENTRANCE].type = WWT_DROPDOWN_BUTTON;
+ window_ride_construction_widgets[WIDX_EXIT].type = WWT_DROPDOWN_BUTTON;
+ }
+
+ if (_numCurrentPossibleSpecialTrackPieces == 0) {
+ window_ride_construction_widgets[WIDX_SPECIAL_TRACK_DROPDOWN].type = WWT_EMPTY;
+ } else {
+ window_ride_construction_widgets[WIDX_SPECIAL_TRACK_DROPDOWN].type = WWT_DROPDOWN_BUTTON;
+ }
+
+ if (is_track_enabled(TRACK_STRAIGHT)) {
+ window_ride_construction_widgets[WIDX_STRAIGHT].type = WWT_FLATBTN;
+ } else {
+ window_ride_construction_widgets[WIDX_STRAIGHT].type = WWT_EMPTY;
+ }
+
+ if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_30)) {
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_LARGE].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_LARGE].type = WWT_FLATBTN;
+ } else {
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_LARGE].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_LARGE].type = WWT_EMPTY;
+ }
+
+ window_ride_construction_widgets[WIDX_LEFT_CURVE].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_VERY_SMALL].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_VERY_SMALL].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 28;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 49;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].left = 116;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 137;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5138;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5139;
+ if (is_track_enabled(TRACK_SLOPE_STEEP_LONG)) {
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 6;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 27;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5140;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].left = 138;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 159;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5141;
+ }
+ if (is_track_enabled(TRACK_CURVE)) {
+ window_ride_construction_widgets[WIDX_LEFT_CURVE].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 6;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 27;
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5140;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].left = 138;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 159;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5141;
+ }
+ if (is_track_enabled(TRACK_CURVE_SMALL)) {
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].type = WWT_FLATBTN;
+ }
+ if (is_track_enabled(TRACK_CURVE_VERY_SMALL)) {
+ window_ride_construction_widgets[WIDX_LEFT_CURVE_VERY_SMALL].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_RIGHT_CURVE_VERY_SMALL].type = WWT_FLATBTN;
+ }
+
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_LEVEL].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_SLOPE_UP].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5144;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5148;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP;
+ if (rideType == RIDE_TYPE_REVERSE_FREEFALL_COASTER || rideType == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) {
+ window_ride_construction_widgets[WIDX_LEVEL].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_SLOPE_UP].type = WWT_FLATBTN;
+ }
+ if (is_track_enabled(TRACK_SLOPE) || is_track_enabled(TRACK_SLOPE_STEEP)) {
+ window_ride_construction_widgets[WIDX_LEVEL].type = WWT_FLATBTN;
+ }
+ if (is_track_enabled(TRACK_SLOPE)) {
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_SLOPE_UP].type = WWT_FLATBTN;
+ }
+ if (
+ is_track_enabled(TRACK_HELIX_SMALL) &&
+ _currentTrackBankEnd != TRACK_BANK_NONE &&
+ _currentTrackSlopeEnd == TRACK_SLOPE_NONE
+ ) {
+ if (_currentTrackCurve >= TRACK_CURVE_LEFT && _currentTrackCurve <= TRACK_CURVE_RIGHT_SMALL) {
+ // Enable helix
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].type = WWT_FLATBTN;
+ if (rideType != RIDE_TYPE_SPLASH_BOATS)
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].type = WWT_FLATBTN;
+ }
+ }
+
+ if (is_track_enabled(TRACK_SLOPE_STEEP)) {
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].type = WWT_FLATBTN;
+ if (rideType != RIDE_TYPE_SPLASH_BOATS)
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].type = WWT_FLATBTN;
+ }
+
+ int x;
+ if (is_track_enabled(TRACK_LIFT_HILL) && _currentTrackCurve < 256) {
+ window_ride_construction_widgets[WIDX_CHAIN_LIFT].type = WWT_FLATBTN;
+ x = 9;
+ } else {
+ window_ride_construction_widgets[WIDX_CHAIN_LIFT].type = WWT_EMPTY;
+ x = 23;
+ }
+
+ for (int i = WIDX_SLOPE_DOWN_STEEP; i <= WIDX_SLOPE_UP_STEEP; i++) {
+ window_ride_construction_widgets[i].left = x;
+ window_ride_construction_widgets[i].right = x + 23;
+ x += 24;
+ }
+
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5148;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5144;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP;
+ if (is_track_enabled(TRACK_SLOPE_VERTICAL)) {
+ if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_60 || _previousTrackSlopeEnd == TRACK_SLOPE_UP_90) {
+ int originalSlopeUpSteepLeft = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left;
+ int originalSlopeUpSteepRight = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right;
+ for (int i = WIDX_SLOPE_UP_STEEP; i > WIDX_SLOPE_DOWN_STEEP; i--) {
+ window_ride_construction_widgets[i].left = window_ride_construction_widgets[i - 1].left;
+ window_ride_construction_widgets[i].right = window_ride_construction_widgets[i - 1].right;
+ }
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left = originalSlopeUpSteepLeft;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right = originalSlopeUpSteepRight;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5149;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_VERTICAL_RISE_TIP;
+ } else if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_60 || _previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90) {
+ int originalSlopeDownSteepLeft = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left;
+ int originalSlopeDownSteepRight = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right;
+ for (int i = WIDX_SLOPE_DOWN_STEEP; i < WIDX_SLOPE_UP_STEEP; i++) {
+ window_ride_construction_widgets[i].left = window_ride_construction_widgets[i + 1].left;
+ window_ride_construction_widgets[i].right = window_ride_construction_widgets[i + 1].right;
+ }
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left = originalSlopeDownSteepLeft;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right = originalSlopeDownSteepRight;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5150;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_VERTICAL_DROP_TIP;
+ }
+ }
+
+ if (
+ is_track_enabled(TRACK_HELIX_LARGE_UNBANKED) &&
+ _currentTrackSlopeEnd == TRACK_SLOPE_NONE &&
+ _currentTrackBankEnd == TRACK_BANK_NONE &&
+ (_currentTrackCurve == TRACK_CURVE_LEFT || _currentTrackCurve == TRACK_CURVE_RIGHT)
+ ) {
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5151;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5152;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_UP_TIP;
+
+ int tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left = window_ride_construction_widgets[WIDX_SLOPE_DOWN].left;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN].left = tmp;
+
+ tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_DOWN].right;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN].right = tmp;
+
+ tmp = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_UP].right;
+ window_ride_construction_widgets[WIDX_SLOPE_UP].right = tmp;
+ }
+
+ if (
+ (is_track_enabled(TRACK_HELIX_LARGE) || is_track_enabled(TRACK_HELIX_SMALL)) &&
+ (_currentTrackCurve >= TRACK_CURVE_LEFT && _currentTrackCurve <= TRACK_CURVE_RIGHT_SMALL) &&
+ _currentTrackSlopeEnd == TRACK_SLOPE_NONE &&
+ _currentTrackBankEnd != TRACK_BANK_NONE
+ ) {
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5151;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5152;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_UP_TIP;
+
+ int tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left = window_ride_construction_widgets[WIDX_SLOPE_DOWN].left;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN].left = tmp;
+
+ tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_DOWN].right;
+ window_ride_construction_widgets[WIDX_SLOPE_DOWN].right = tmp;
+
+ tmp = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left = window_ride_construction_widgets[WIDX_SLOPE_UP].left;
+ window_ride_construction_widgets[WIDX_SLOPE_UP].left = tmp;
+
+ tmp = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right;
+ window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_UP].right;
+ window_ride_construction_widgets[WIDX_SLOPE_UP].right = tmp;
+ }
+
+ window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_ROLL_BANKING;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].image = 5153;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].tooltip = STR_RIDE_CONSTRUCTION_ROLL_FOR_LEFT_CURVE_TIP;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].left = 47;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].right = 70;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].top = 132;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].bottom = 155;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].image = 5154;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].tooltip = STR_RIDE_CONSTRUCTION_NO_ROLL_TIP;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].left = 71;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].right = 94;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].top = 132;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].bottom = 155;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].image = 5155;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].tooltip = STR_RIDE_CONSTRUCTION_ROLL_FOR_RIGHT_CURVE_TIP;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].left = 95;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].right = 118;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].top = 132;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].bottom = 155;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_EMPTY;
+ if (RCT2_GLOBAL(0x00F440D0, uint8) != 99 && _currentTrackCurve != 355) {
+ if (is_track_enabled(TRACK_FLAT_ROLL_BANKING)) {
+ window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_FLATBTN;
+ }
+ if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) {
+ if (rideType == RIDE_TYPE_WATER_COASTER) {
+ window_ride_construction_widgets[WIDX_U_TRACK].image = 5158;
+ window_ride_construction_widgets[WIDX_O_TRACK].image = 5159;
+ window_ride_construction_widgets[WIDX_U_TRACK].tooltip = STR_RIDE_CONSTRUCTION_STANDARD_RC_TRACK_TIP;
+ window_ride_construction_widgets[WIDX_O_TRACK].tooltip = STR_RIDE_CONSTRUCTION_WATER_CHANNEL_TIP;
+ if (_currentTrackCurve < TRACK_CURVE_LEFT_SMALL && _currentTrackSlopeEnd == TRACK_SLOPE_NONE && _currentTrackBankEnd == TRACK_BANK_NONE) {
+ window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_TRACK_STYLE;
+ window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_FLATBTN;
+ }
+ } else {
+ window_ride_construction_widgets[WIDX_U_TRACK].image = 5156;
+ window_ride_construction_widgets[WIDX_O_TRACK].image = 5157;
+ window_ride_construction_widgets[WIDX_U_TRACK].tooltip = STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP;
+ window_ride_construction_widgets[WIDX_O_TRACK].tooltip = STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP;
+ window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_TRACK_STYLE;
+ window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_FLATBTN;
+ }
+ }
+ } else {
+ window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_BRAKE_SPEED;
+ RCT2_GLOBAL(0x00F440D3, uint8) = 1;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].image = 1675;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_SPINNER;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].left = 12;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].right = 83;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].top = 138;
+ window_ride_construction_widgets[WIDX_BANK_LEFT].bottom = 149;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_DROPDOWN_BUTTON;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].image = STR_NUMERIC_UP;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].left = 72;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].right = 82;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].top = 139;
+ window_ride_construction_widgets[WIDX_BANK_STRAIGHT].bottom = 143;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_DROPDOWN_BUTTON;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].image = STR_NUMERIC_DOWN;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].left = 72;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].right = 82;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].top = 144;
+ window_ride_construction_widgets[WIDX_BANK_RIGHT].bottom = 148;
+ w->hold_down_widgets |= (1 << WIDX_BANK_STRAIGHT) | (1 << WIDX_BANK_RIGHT);
+ }
+
+ window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].right = 162;
+ window_ride_construction_widgets[WIDX_SEAT_ROTATION_GROUPBOX].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER].type = 0;
+ window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP].type = 0;
+ window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN].type = 0;
+ if (
+ (rideType == RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER || rideType == RIDE_TYPE_38) &&
+ RCT2_GLOBAL(0x00F440D0, uint8) != 99 &&
+ _currentTrackCurve != 355
+ ) {
+ window_ride_construction_widgets[WIDX_SEAT_ROTATION_GROUPBOX].type = WWT_GROUPBOX;
+ window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER].type = WWT_SPINNER;
+ window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP].type = WWT_DROPDOWN_BUTTON;
+ window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN].type = WWT_DROPDOWN_BUTTON;
+ window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].right = 92;
+ if (window_ride_construction_widgets[WIDX_BANK_LEFT].type != WWT_SPINNER) {
+ for (int i = WIDX_BANK_LEFT; i <= WIDX_BANK_RIGHT; i++) {
+ window_ride_construction_widgets[i].left -= 36;
+ window_ride_construction_widgets[i].right -= 36;
+ }
+ }
+ }
+
+ uint64 pressedWidgets = w->pressed_widgets & (
+ (1 << WIDX_BACKGROUND) |
+ (1 << WIDX_TITLE) |
+ (1 << WIDX_CLOSE) |
+ (1 << WIDX_DIRECTION_GROUPBOX) |
+ (1 << WIDX_SLOPE_GROUPBOX) |
+ (1 << WIDX_BANKING_GROUPBOX) |
+ (1 << WIDX_CONSTRUCT) |
+ (1 << WIDX_DEMOLISH) |
+ (1 << WIDX_PREVIOUS_SECTION) |
+ (1 << WIDX_NEXT_SECTION) |
+ (1 << WIDX_ENTRANCE_EXIT_GROUPBOX) |
+ (1 << WIDX_ENTRANCE) |
+ (1 << WIDX_EXIT)
+ );
+
+ window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_ROTATE].type = WWT_EMPTY;
+ if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_8)) {
+ window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY;
+ } else {
+ window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_FLATBTN;
+ window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_FLATBTN;
+ }
+
+ switch (_rideConstructionState) {
+ case RIDE_CONSTRUCTION_STATE_FRONT:
+ window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_IMGBTN;
+ window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY;
+ break;
+ case RIDE_CONSTRUCTION_STATE_BACK:
+ window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_IMGBTN;
+ window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY;
+ break;
+ case RIDE_CONSTRUCTION_STATE_PLACE:
+ window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_IMGBTN;
+ window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_ROTATE].type = WWT_FLATBTN;
+ break;
+ case RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT:
+ window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY;
+ window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY;
+ break;
+ default:
+ w->pressed_widgets = pressedWidgets;
+ window_invalidate(w);
+ return;
+ }
+
+ int widgetIndex;
+ switch (_currentTrackCurve) {
+ case TRACK_CURVE_NONE:
+ widgetIndex = WIDX_STRAIGHT;
+ break;
+ case TRACK_CURVE_LEFT:
+ widgetIndex = WIDX_LEFT_CURVE;
+ break;
+ case TRACK_CURVE_RIGHT:
+ widgetIndex = WIDX_RIGHT_CURVE;
+ break;
+ case TRACK_CURVE_LEFT_SMALL:
+ widgetIndex = WIDX_LEFT_CURVE_SMALL;
+ break;
+ case TRACK_CURVE_RIGHT_SMALL:
+ widgetIndex = WIDX_RIGHT_CURVE_SMALL;
+ break;
+ case TRACK_CURVE_LEFT_VERY_SMALL:
+ widgetIndex = WIDX_LEFT_CURVE_VERY_SMALL;
+ break;
+ case TRACK_CURVE_RIGHT_VERY_SMALL:
+ widgetIndex = WIDX_RIGHT_CURVE_VERY_SMALL;
+ break;
+ case TRACK_CURVE_LEFT_LARGE:
+ widgetIndex = WIDX_LEFT_CURVE_LARGE;
+ break;
+ case TRACK_CURVE_RIGHT_LARGE:
+ widgetIndex = WIDX_RIGHT_CURVE_LARGE;
+ break;
+ default:
+ widgetIndex = WIDX_SPECIAL_TRACK_DROPDOWN;
+ break;
+ }
+ pressedWidgets |= (1ULL << widgetIndex);
+
+ switch (_currentTrackSlopeEnd) {
+ case TRACK_SLOPE_DOWN_60:
+ case TRACK_SLOPE_UP_90:
+ widgetIndex = WIDX_SLOPE_DOWN_STEEP;
+ break;
+ case TRACK_SLOPE_DOWN_25:
+ widgetIndex = WIDX_SLOPE_DOWN;
+ break;
+ case TRACK_SLOPE_UP_25:
+ widgetIndex = WIDX_SLOPE_UP;
+ break;
+ case TRACK_SLOPE_UP_60:
+ case TRACK_SLOPE_DOWN_90:
+ widgetIndex = WIDX_SLOPE_UP_STEEP;
+ break;
+ default:
+ widgetIndex = WIDX_LEVEL;
+ break;
+ }
+ pressedWidgets |= (1ULL << widgetIndex);
+
+ if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) {
+ if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) {
+ if (_currentTrackCovered & 1) {
+ w->pressed_widgets |= (1ULL << WIDX_O_TRACK);
+ } else {
+ w->pressed_widgets |= (1ULL << WIDX_U_TRACK);
+ }
+ }
+ switch (_currentTrackBankEnd) {
+ case TRACK_BANK_LEFT:
+ widgetIndex = WIDX_BANK_LEFT;
+ break;
+ case TRACK_BANK_NONE:
+ widgetIndex = WIDX_BANK_STRAIGHT;
+ break;
+ default:
+ widgetIndex = WIDX_BANK_RIGHT;
+ break;
+ }
+ pressedWidgets |= (1ULL << widgetIndex);
+ }
+
+ if (_currentTrackLiftHill & 1)
+ pressedWidgets |= (1 << WIDX_CHAIN_LIFT);
+
+ w->pressed_widgets = pressedWidgets;
+ window_invalidate(w);
+}
+
+static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackType, int trackDirection, int x, int y)
+{
+ const rct_preview_track *trackBlock;
+ int offsetX, offsetY;
+
+ trackBlock = get_track_def_from_ride(ride, trackType);
+ trackDirection &= 3;
+ int selectionTileIndex = 0;
+ while (trackBlock->index != 255) {
+ switch (trackDirection) {
+ case 0:
+ offsetX = trackBlock->x;
+ offsetY = trackBlock->y;
+ break;
+ case 1:
+ offsetX = trackBlock->y;
+ offsetY = -trackBlock->x;
+ break;
+ case 2:
+ offsetX = -trackBlock->x;
+ offsetY = -trackBlock->y;
+ break;
+ case 3:
+ offsetX = -trackBlock->y;
+ offsetY = trackBlock->x;
+ break;
+ }
+ gMapSelectionTiles[selectionTileIndex].x = x + offsetX;
+ gMapSelectionTiles[selectionTileIndex].y = y + offsetY;
+ selectionTileIndex++;
+ trackBlock++;
+ }
+ gMapSelectionTiles[selectionTileIndex].x = -1;
+ gMapSelectionTiles[selectionTileIndex].y = -1;
+}
+
+/**
+ *
+ * rct2: 0x006C776D
+ */
+static void window_ride_construction_show_special_track_dropdown(rct_window *w, rct_widget *widget)
+{
+ window_dropdown_show_text_custom_width(
+ w->x + widget->left,
+ w->y + widget->top,
+ widget->bottom - widget->top + 1,
+ w->colours[1],
+ 0,
+ _numCurrentPossibleRideConfigurations,
+ widget->right - widget->left
+ );
+
+ for (int i = 0; i < _numCurrentPossibleRideConfigurations; i++) {
+ uint8 trackPiece = _currentPossibleRideConfigurations[i];
+ rct_string_id trackPieceStringId = RideConfigurationStringIds[trackPiece];
+ if (trackPieceStringId == STR_RAPIDS) {
+ rct_ride *ride = GET_RIDE(_currentRideIndex);
+ if (ride->type == RIDE_TYPE_CAR_RIDE)
+ trackPieceStringId = STR_LOG_BUMPS;
+ }
+ gDropdownItemsFormat[i] = trackPieceStringId;
+ if ((trackPiece | 0x100) == _currentTrackCurve) {
+ RCT2_GLOBAL(0x009DEBA2, sint16) = i;
+ }
+ }
+ *gDropdownItemsDisabled = RCT2_GLOBAL(0x00F4409C, uint32);
+}
+
+/**
+ *
+ * rct2: 0x006C7630
+ */
+static void ride_selected_track_set_seat_rotation(int seatRotation)
+{
+ int x, y, z;
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, seatRotation, NULL, (1 << 5));
+ sub_6C84CE();
+}
+
+/**
+ *
+ * rct2: 0x006C7502
+ */
+static void loc_6C7502(int al)
+{
+ _currentTrackSlopeEnd = al;
+ _currentTrackPrice = MONEY32_UNDEFINED;
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) {
+ if (al != 2 && al != 4 && al != 0) {
+ _currentTrackLiftHill &= ~1;
+ }
+ }
+ sub_6C84CE();
+}
+
+/**
+ *
+ * rct2: 0x006C76E9
+ */
+static void loc_6C76E9()
+{
+ rct_map_element *mapElement;
+ int x, y, z;
+
+ x = _currentTrackBeginX;
+ y = _currentTrackBeginY;
+ z = _currentTrackBeginZ;
+ if (sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) {
+ game_do_command(
+ _currentTrackBeginX,
+ GAME_COMMAND_FLAG_APPLY | ((_currentTrackPieceDirection & 3) << 8),
+ _currentTrackBeginY,
+ mapElement->properties.track.type,
+ GAME_COMMAND_28,
+ _currentTrackBeginZ,
+ 0
+ );
+ }
+ sub_6C84CE();
+}
+
+/**
+ *
+ * rct2: 0x006CC6A8
+ */
+static void ride_construction_toolupdate_construct(int screenX, int screenY)
+{
+ int x, y, z, highestZ;
+ rct_ride *ride;
+ const rct_preview_track *trackBlock;
+
+ map_invalidate_map_selection_tiles();
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4);
+ if (!ride_get_place_position_from_screen_position(screenX, screenY, &x, &y)) {
+ sub_6C9627();
+ map_invalidate_map_selection_tiles();
+ return;
+ }
+
+ z = RCT2_GLOBAL(0x00F44163, uint16);
+ if (z == 0)
+ z = map_get_highest_z(x >> 5, y >> 5);
+
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 2;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~8;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 4;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = _currentTrackPieceDirection;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z;
+ gMapSelectionTiles[0].x = x;
+ gMapSelectionTiles[0].y = y;
+ gMapSelectionTiles[1].x = -1;
+ gMapSelectionTiles[1].y = -1;
+
+ int trackType, trackDirection, rideIndex, edxRS16;
+ if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, NULL, NULL, NULL, NULL)) {
+ sub_6C9627();
+ map_invalidate_map_selection_tiles();
+ return;
+ }
+ _currentTrackPieceType = trackType;
+ ride = GET_RIDE(_currentRideIndex);
+
+ // Re-using this other code, very slight difference from original
+ // - Original code checks for MSB mask instead of 255 on trackPart->var_00
+ // - Original code checks this first as its already set origin tile, probably just a micro optimisation
+ window_ride_construction_select_map_tiles(ride, trackType, trackDirection, x, y);
+
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z;
+ if (RCT2_GLOBAL(0x00F44163, uint16) == 0) {
+ // Raise z above all slopes and water
+ highestZ = 0;
+ if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 2) {
+ rct_xy16 *selectedTile = gMapSelectionTiles;
+ while (selectedTile->x != -1) {
+ if (selectedTile->x >= (256 * 32) || selectedTile->y >= (256 * 32))
+ continue;
+
+ z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5);
+ if (z > highestZ)
+ highestZ = z;
+
+ selectedTile++;
+ }
+ }
+ // loc_6CC8BF:
+ // z = map_get_highest_z(x >> 5, y >> 5);
+ }
+ // loc_6CC91B:
+ trackBlock = get_track_def_from_ride(ride, trackType);
+ int bx = 0;
+ do {
+ bx = min(bx, trackBlock->z);
+ trackBlock++;
+ } while (trackBlock->index != 255);
+ z -= bx;
+
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z;
+ bx = 41;
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = z;
+ if (
+ (_currentTrackSelectionFlags & 2) &&
+ x == _previousTrackPieceX &&
+ y == _previousTrackPieceY &&
+ z == _previousTrackPieceZ
+ ) {
+ map_invalidate_map_selection_tiles();
+ return;
+ }
+
+ _previousTrackPieceX = x;
+ _previousTrackPieceY = y;
+ _previousTrackPieceZ = z;
+ if (ride->type == RIDE_TYPE_MAZE) {
+ // goto loc_6CCA31
+ return;
+ }
+
+ for (;;) {
+ sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, NULL);
+ _currentTrackPrice = sub_6CA162(rideIndex, trackType, trackDirection, edxRS16, x, y, z);
+ if (_currentTrackPrice != MONEY32_UNDEFINED)
+ break;
+
+ bx--;
+ if (bx == 0)
+ break;
+
+ _currentTrackBeginZ -= 8;
+ if (_currentTrackBeginZ & 0x8000)
+ break;
+
+ if (bx >= 0)
+ _currentTrackBeginZ += 16;
+ }
+
+ sub_6C84CE();
+ map_invalidate_map_selection_tiles();
+}
+
+/**
+ *
+ * rct2: 0x006CD354
+ */
+static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY)
+{
+ int x, y, direction;
+ uint8 unk;
+
+ map_invalidate_selection_rect();
+ map_invalidate_map_selection_tiles();
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4);
+ ride_get_entrance_or_exit_position_from_screen_position(screenX, screenY, &x, &y, &direction);
+ if (RCT2_GLOBAL(0x00F44194, uint8) == 255) {
+ sub_6C9627();
+ return;
+ }
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 1 | 4;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16) = x;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16) = y;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = x;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = y;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = direction ^ 2;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y;
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = RCT2_GLOBAL(0x00F44190, uint8) * 8;
+ map_invalidate_selection_rect();
+
+ direction = RCT2_GLOBAL(0x00F44194, uint8) ^ 2;
+ unk = RCT2_GLOBAL(0x00F44193, uint8);
+ if (
+ !(_currentTrackSelectionFlags & 4) ||
+ x != RCT2_GLOBAL(0x00F440BF, uint16) ||
+ y != RCT2_GLOBAL(0x00F440C1, uint16) ||
+ direction != RCT2_GLOBAL(0x00F440C3, uint8) ||
+ unk != RCT2_GLOBAL(0x00F440C4, uint8)
+ ) {
+ _currentTrackPrice = ride_get_entrance_or_exit_price(
+ _currentRideIndex, x, y, direction, RCT2_GLOBAL(0x00F44191, uint8), unk
+ );
+ sub_6C84CE();
+ }
+}
+
+/**
+ *
+ * rct2: 0x006CCA73
+ */
+static void ride_construction_tooldown_construct(int screenX, int screenY)
+{
+ int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation, highestZ;
+ rct_window *w;
+
+ map_invalidate_map_selection_tiles();
+ sub_6C9627();
+
+ if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &seatRotation))
+ return;
+
+ _currentTrackPieceType = trackType;
+
+ // Raise z above all slopes and water
+ highestZ = 0;
+ if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 2) {
+ rct_xy16 *selectedTile = gMapSelectionTiles;
+ while (selectedTile->x != -1) {
+ if (selectedTile->x >= (256 * 32) || selectedTile->y >= (256 * 32))
+ continue;
+
+ z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5);
+ if (z > highestZ)
+ highestZ = z;
+
+ selectedTile++;
+ }
+ }
+ RCT2_GLOBAL(0x00F440E2, uint16) = z;
+
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4);
+ if (!ride_get_place_position_from_screen_position(screenX, screenY, &x, &y))
+ return;
+
+ z = RCT2_GLOBAL(0x00F44163, uint16);
+ if (z == 0)
+ z = map_get_highest_z(x >> 5, y >> 5);
+
+ tool_cancel();
+
+ rct_ride *ride = GET_RIDE(_currentRideIndex);
+ if (RCT2_GLOBAL(0x00F44163, uint16) == 0) {
+ const rct_preview_track *trackBlock = get_track_def_from_ride(ride, _currentTrackPieceType);
+ int bx = 0;
+ do {
+ bx = min(bx, trackBlock->z);
+ trackBlock++;
+ } while (trackBlock->index != 255);
z -= bx;
- int start_x = x;
- switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t))
- {
- case 0:
- x = y - x;
- y = (y + start_x) / 2 - z;
+ z -= 16;
+ } else {
+ z = RCT2_GLOBAL(0x00F44163, uint16);
+ }
+
+ if (ride->type == RIDE_TYPE_MAZE) {
+ // goto loc_6CCDE4
+ return;
+ }
+
+ for (int zAttempts = 41; zAttempts >= 0; zAttempts--) {
+ _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT;
+ _currentTrackBeginX = x;
+ _currentTrackBeginY = y;
+ _currentTrackBeginZ = z;
+ _currentTrackSelectionFlags = 0;
+ _rideConstructionArrowPulseTime = 0;
+ sub_6C84CE();
+ w = window_find_by_class(WC_RIDE_CONSTRUCTION);
+ if (w == NULL)
break;
- case 1:
- x = -x - y;
- y = (y - start_x) / 2 - z;
- break;
- case 2:
- x -= y;
- y = (-y - start_x) / 2 - z;
- break;
- case 3:
- x += y;
- y = (-y + start_x) / 2 - z;
+
+ RCT2_GLOBAL(0x009A8C29, uint8) |= 1;
+ window_event_mouse_up_call(w, WIDX_CONSTRUCT);
+ RCT2_GLOBAL(0x009A8C29, uint8) &= ~1;
+
+ if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) {
+ rct_string_id errorText = RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id);
+ if (
+ errorText == STR_NOT_ENOUGH_CASH_REQUIRES ||
+ errorText == STR_CAN_ONLY_BUILD_THIS_UNDERWATER ||
+ errorText == STR_CAN_ONLY_BUILD_THIS_ON_WATER ||
+ errorText == STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND ||
+ errorText == STR_TOO_HIGH_FOR_SUPPORTS ||
+ zAttempts == 0 ||
+ z - 8 < 0
+ ) {
+ int saveTrackDirection = _currentTrackPieceDirection;
+ int saveCurrentTrackCurve = _currentTrackCurve;
+ int savePreviousTrackSlopeEnd = _previousTrackSlopeEnd;
+ int saveCurrentTrackSlopeEnd = _currentTrackSlopeEnd;
+ int savePreviousTrackBankEnd = _previousTrackBankEnd;
+ int saveCurrentTrackBankEnd = _currentTrackBankEnd;
+ int saveCurrentTrackCovered = _currentTrackCovered;
+ int saveCurrentTrackLiftHill = _currentTrackLiftHill;
+
+ sub_6CC3FB(_currentRideIndex);
+
+ _currentTrackPieceDirection = saveTrackDirection;
+ _currentTrackCurve = saveCurrentTrackCurve;
+ _previousTrackSlopeEnd = savePreviousTrackSlopeEnd;
+ _currentTrackSlopeEnd = saveCurrentTrackSlopeEnd;
+ _previousTrackBankEnd = savePreviousTrackBankEnd;
+ _currentTrackBankEnd = saveCurrentTrackBankEnd;
+ _currentTrackCovered = saveCurrentTrackCovered;
+ _currentTrackLiftHill = saveCurrentTrackLiftHill;
+
+ sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z);
+ break;
+ } else if (zAttempts >= 0) {
+ z += 16;
+ }
+ } else {
+ window_close_by_class(WC_ERROR);
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_0) {
+ w = window_find_by_class(WC_RIDE_CONSTRUCTION);
+ if (w != NULL) {
+ if (ride_are_all_possible_entrances_and_exits_built(ride)) {
+ window_close(w);
+ } else {
+ window_event_mouse_up_call(w, WIDX_ENTRANCE);
+ }
+ }
+ }
break;
}
- clip_dpi->x += x - width / 2;
- clip_dpi->y += y - height / 2 - 16;
- RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*) = clip_dpi;
- uint32_t d = RCT2_GLOBAL(0xF44136, int16_t) << 16;
- d |= RCT2_GLOBAL(0xF44133, uint8_t);// Ride id
- d |= RCT2_GLOBAL(0xF44135, uint8_t) << 8;
- RCT2_CALLPROC_X(0x6CBCE2, 0x1000, (((uint16_t)bx) & 0xFF) | (RCT2_GLOBAL(0xF44134, uint8_t) << 8), 0x1000, d, width / 2, 0x400, height / 2);
- rct2_free(clip_dpi);
}
- short string_x = (RCT2_GLOBAL(0x9D7C02, int16_t) + RCT2_GLOBAL(0x9D7C04, int16_t)) / 2 + w->x;
- short string_y = RCT2_GLOBAL(0x9D7C08, int16_t) + w->y - 23;
- if (RCT2_GLOBAL(0xF440A6, uint8_t) != 4) gfx_draw_string_centred(dpi, 1407, string_x, string_y, 0, w);
- string_y += 11;
- if (RCT2_GLOBAL(0xF44070, uint32_t) != MONEY32_UNDEFINED && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32_t) & 0x800))
- gfx_draw_string_centred(dpi, 1408, string_x, string_y, 0, (void*)0xF44070);
}
-//0x006CD45B
-void window_construction_maze_paint()
+/**
+ *
+ * rct2: 0x006CCA73
+ */
+static void ride_construction_tooldown_entrance_exit(int screenX, int screenY)
{
- rct_window *w;
- rct_drawpixelinfo *dpi;
- window_paint_get_registers(w, dpi);
- window_draw_widgets(w, dpi);
-}
\ No newline at end of file
+ sub_6C9627();
+ map_invalidate_selection_rect();
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 4);
+
+ int mapX, mapY, direction;
+ ride_get_entrance_or_exit_position_from_screen_position(screenX, screenY, &mapX, &mapY, &direction);
+ if (RCT2_GLOBAL(0x00F44194, uint8) == 255)
+ return;
+
+ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = (RCT2_GLOBAL(0x00F44191, uint8) == 0) ?
+ STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION :
+ STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION;
+
+ money32 cost = game_do_command(
+ RCT2_GLOBAL(0x00F44188, uint16),
+ (GAME_COMMAND_FLAG_APPLY) | ((RCT2_GLOBAL(0x00F44194, uint8) ^ 2) << 8),
+ RCT2_GLOBAL(0x00F4418A, uint16),
+ RCT2_GLOBAL(0x00F44192, uint8) | (RCT2_GLOBAL(0x00F44191, uint8) << 8),
+ GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT,
+ RCT2_GLOBAL(0x00F44193, uint8),
+ 0
+ );
+ if (cost == MONEY32_UNDEFINED) {
+ return;
+ }
+
+ sound_play_panned(
+ SOUND_PLACE_ITEM,
+ 0x8001,
+ RCT2_GLOBAL(0x009DEA5E, uint16),
+ RCT2_GLOBAL(0x009DEA60, uint16),
+ RCT2_GLOBAL(0x009DEA62, uint16)
+ );
+
+ rct_ride *ride = GET_RIDE(RCT2_GLOBAL(0x00F44192, uint8));
+ if (ride_are_all_possible_entrances_and_exits_built(ride)) {
+ tool_cancel();
+ if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15)) {
+ window_close_by_class(WC_RIDE_CONSTRUCTION);
+ }
+ } else {
+ RCT2_GLOBAL(0x00F44191, uint8) ^= 1;
+ window_invalidate_by_class(77);
+ RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) = (RCT2_GLOBAL(0x00F44191, uint8) == 0) ?
+ WIDX_ENTRANCE : WIDX_EXIT;
+ }
+}
diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c
index a62e17a86d..2b13bcc63a 100644
--- a/src/windows/title_editor.c
+++ b/src/windows/title_editor.c
@@ -319,7 +319,7 @@ static void window_title_editor_mouseup()
case WIDX_TITLE_EDITOR_NEW_BUTTON:
commandEditorOpen *= 2;
if (!commandEditorOpen)
- window_text_input_open(w, widgetIndex, 5239, 5406, STR_NONE, NULL, 64);
+ window_text_input_open(w, widgetIndex, 5239, 5406, STR_NONE, 0, 64);
break;
case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON:
commandEditorOpen *= 2;
diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c
index bf256a54a2..3ef453ca1c 100644
--- a/src/windows/top_toolbar.c
+++ b/src/windows/top_toolbar.c
@@ -178,6 +178,8 @@ static void window_top_toolbar_dropdown();
static void window_top_toolbar_tool_update();
static void window_top_toolbar_tool_down();
static void window_top_toolbar_tool_drag();
+static void window_top_toolbar_tool_up();
+static void window_top_toolbar_tool_abort();
static void window_top_toolbar_invalidate();
static void window_top_toolbar_paint();
@@ -194,8 +196,8 @@ static void* window_top_toolbar_events[] = {
window_top_toolbar_tool_update, // editor: 0x0066fB0E
window_top_toolbar_tool_down, // editor: 0x0066fB5C
window_top_toolbar_tool_drag, // editor: 0x0066fB37
- (void*)0x0066CC5B, // editor: 0x0066fC44
- (void*)0x0066CA58, // editor: 0x0066fA74
+ window_top_toolbar_tool_up, // editor: 0x0066fC44 (Exactly the same)
+ window_top_toolbar_tool_abort, // editor: 0x0066fA74 (Exactly the same)
window_top_toolbar_emptysub,
window_top_toolbar_emptysub,
window_top_toolbar_emptysub,
@@ -2723,6 +2725,55 @@ static void window_top_toolbar_tool_drag()
}
}
+/**
+ *
+ * rct2: 0x0066CC5B
+ */
+static void window_top_toolbar_tool_up()
+{
+ short widgetIndex, x, y;
+ rct_window *w;
+
+ window_tool_get_registers(w, widgetIndex, x, y);
+
+ switch (widgetIndex) {
+ case WIDX_LAND:
+ map_invalidate_selection_rect();
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 0x12;
+ break;
+ case WIDX_WATER:
+ map_invalidate_selection_rect();
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 0x13;
+ break;
+ case WIDX_CLEAR_SCENERY:
+ map_invalidate_selection_rect();
+ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 0x0C;
+ break;
+ }
+}
+
+/**
+ *
+ * rct2: 0x0066CA58
+ */
+static void window_top_toolbar_tool_abort()
+{
+ short widgetIndex, x, y;
+ rct_window* w;
+
+ window_tool_get_registers(w, widgetIndex, x, y);
+
+ switch (widgetIndex) {
+ case WIDX_LAND:
+ case WIDX_WATER:
+ case WIDX_CLEAR_SCENERY:
+ hide_gridlines();
+ break;
+ }
+}
void top_toolbar_init_fastforward_menu(rct_window* w, rct_widget* widget) {
int num_items = 4;
diff --git a/src/windows/track_place.c b/src/windows/track_place.c
index 7e8bcbf35f..c204bff517 100644
--- a/src/windows/track_place.c
+++ b/src/windows/track_place.c
@@ -130,7 +130,7 @@ static void window_track_place_draw_mini_preview()
int i, rotation, pass, x, y, pixelX, pixelY, originX, originY, minX, minY, maxX, maxY;
rct_maze_element *mazeElement;
rct_track_element *trackElement;
- rct_preview_track *trackBlock;
+ const rct_preview_track *trackBlock;
window_track_place_clear_mini_preview();
@@ -163,8 +163,8 @@ static void window_track_place_draw_mini_preview()
colour = RCT2_ADDRESS(0x0099BA64, uint8)[trackType * 16] & 0x10 ? 222 : 218;
// Follow a single track piece shape
- trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[trackType];
- while (trackBlock->var_00 != 255) {
+ trackBlock = TrackBlocks[trackType];
+ while (trackBlock->index != 255) {
x = originX;
y = originY;
@@ -357,7 +357,7 @@ static void window_track_place_attempt_placement(int x, int y, int z, int bl, mo
ebx = bl;
ecx = y;
edi = z;
- result = game_do_command_p(GAME_COMMAND_PLACE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
+ result = game_do_command_p(GAME_COMMAND_PLACE_TRACK_DESIGN, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
if (cost != NULL) *cost = result;
if (rideIndex != NULL) *rideIndex = edi & 0xFF;
diff --git a/src/world/map.c b/src/world/map.c
index fd40301cd3..602be3f4ee 100644
--- a/src/world/map.c
+++ b/src/world/map.c
@@ -153,14 +153,22 @@ void map_element_iterator_restart_for_tile(map_element_iterator *it)
rct_map_element *map_get_first_element_at(int x, int y)
{
- if (x < 0 || y < 0 || x > 255 || y > 255)
- {
- log_error("Trying to access element outside of range");
+ if (x < 0 || y < 0 || x > 255 || y > 255) {
+ log_error("Trying to access element outside of range");
return NULL;
}
return TILE_MAP_ELEMENT_POINTER(x + y * 256);
}
+void map_set_tile_elements(int x, int y, rct_map_element *elements)
+{
+ if (x < 0 || y < 0 || x > 255 || y > 255) {
+ log_error("Trying to access element outside of range");
+ return;
+ }
+ TILE_MAP_ELEMENT_POINTER(x + y * 256) = elements;
+}
+
int map_element_is_last_for_tile(rct_map_element *element)
{
return element->flags & MAP_ELEMENT_FLAG_LAST_TILE;
@@ -171,6 +179,11 @@ int map_element_get_type(rct_map_element *element)
return element->type & MAP_ELEMENT_TYPE_MASK;
}
+int map_element_get_direction(rct_map_element *element)
+{
+ return element->type & MAP_ELEMENT_DIRECTION_MASK;
+}
+
int map_element_get_terrain(rct_map_element *element)
{
int terrain = (element->properties.surface.terrain >> 5) & 7;
@@ -3061,3 +3074,24 @@ static void sub_68AE2A(int x, int y)
}
}
}
+
+int map_get_highest_z(int tileX, int tileY)
+{
+ rct_map_element *mapElement;
+ int z;
+
+ mapElement = map_get_surface_element_at(tileX, tileY);
+ if (mapElement == NULL)
+ return -1;
+
+ z = mapElement->base_height * 8;
+
+ // Raise z so that is above highest point of land and water on tile
+ if ((mapElement->properties.surface.slope & 0x0F) != 0)
+ z += 16;
+ if ((mapElement->properties.surface.slope & 0x10) != 0)
+ z += 16;
+
+ z = max(z, (mapElement->properties.surface.terrain & 0x1F) * 16);
+ return z;
+}
diff --git a/src/world/map.h b/src/world/map.h
index 6fcf3df8b2..0c2882bb0c 100644
--- a/src/world/map.h
+++ b/src/world/map.h
@@ -121,6 +121,10 @@ enum {
MAP_ELEMENT_TYPE_BANNER = (7 << 2)
};
+enum {
+ MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT = (1 << 6)
+};
+
enum {
MAP_ELEMENT_DIRECTION_WEST,
MAP_ELEMENT_DIRECTION_NORTH,
@@ -254,8 +258,10 @@ extern bool gClearFootpath;
void map_init(int size);
void map_update_tile_pointers();
rct_map_element *map_get_first_element_at(int x, int y);
+void map_set_tile_elements(int x, int y, rct_map_element *elements);
int map_element_is_last_for_tile(rct_map_element *element);
int map_element_get_type(rct_map_element *element);
+int map_element_get_direction(rct_map_element *element);
int map_element_get_terrain(rct_map_element *element);
int map_element_get_terrain_edge(rct_map_element *element);
void map_element_set_terrain(rct_map_element *element, int terrain);
@@ -322,6 +328,7 @@ void map_element_iterator_restart_for_tile(map_element_iterator *it);
void map_remove_intersecting_walls(int x, int y, int z0, int z1, int direction);
void map_update_tiles();
+int map_get_highest_z(int tileX, int tileY);
void sub_6A7594();
int map_element_get_banner_index(rct_map_element *mapElement);