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 a9b0fef910..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
@@ -510,31 +510,31 @@ STR_0508 :
STR_0509 :
STR_0510 :
STR_0511 :
-STR_0512 :
-STR_0513 :
-STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in de bochten
-STR_0515 :
-STR_0516 :Een rustige achtbaan voor bezoekers die nog niet in engere attracties durven
-STR_0517 :Passagiers rijden in miniatuurtreinen over een smalspoorweg
-STR_0518 :Passagiers rijden in elektrische treinen over een monorailbaan
-STR_0519 :Passagiers zitten in kleine karretjes die onder een enkele rail hangen en naar buiten zwaaien in de bochten
-STR_0520 :
-STR_0521 :
-STR_0522 :
-STR_0523 :Bezoekers rijden langzaam over een baan in aangedreven karretjes
-STR_0524 :
-STR_0525 :
-STR_0526 :
-STR_0527 :Een soepele stalen achtbaan die verticale loopings kan maken
-STR_0528 :
-STR_0529 :
-STR_0530 :Stoeltjes hangen aan een continu draaiende stalen kabel die van het ene uiteinde van de baan naar het andere loopt, en daarna weer terug
-STR_0531 :
+STR_0512 :Een compacte achtbaan met een spiraalvormige kettingheuvel en soepele, kronkelende afdalingen.
+STR_0513 :Een achtbaan met loopings waar de passagiers in de karretjes staan.
+STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in de bochten.
+STR_0515 :Een stalen achtbaan met treinen die onder de baan hangen, met veel complexe en kronkelende baanelementen.
+STR_0516 :Een rustige achtbaan voor bezoekers die nog niet in engere attracties durven.
+STR_0517 :Passagiers rijden in miniatuurtreinen over een smalspoorweg.
+STR_0518 :Passagiers rijden in elektrische treinen over een monorailbaan.
+STR_0519 :Passagiers zitten in kleine karretjes die onder een enkele rail hangen en naar buiten zwaaien in de bochten.
+STR_0520 :Een aanlegsteiger waar bezoekers in een bootje kunnen gaan om over het water te varen.
+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 :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 :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.
+STR_0530 :Stoeltjes hangen aan een continu draaiende stalen kabel die van het ene uiteinde van de baan naar het andere loopt, en daarna weer terug.
+STR_0531 :Een compacte stalen achtbaan waar de trein door schroeven en loopings gaat.
STR_0532 :
STR_0533 :
-STR_0534 :
-STR_0535 :
-STR_0536 :
+STR_0534 :Go-karts met benzinemotor die de passagiers zelf besturen
+STR_0535 :Boten in de vorm van een boomstam varen door een waterbak, waarbij ze van steile hellingen afdalen om de passagiers te doorweken.
+STR_0536 :Ronde boten varen door een brede waterbak, waarbij ze de passagiers opwinden door watervallen en schuimende stroomversnellingen.
STR_0537 :
STR_0538 :
STR_0539 :
@@ -552,55 +552,55 @@ STR_0550 :
STR_0551 :
STR_0552 :
STR_0553 :
-STR_0554 :Het karretje wordt het station uitgelanceerd over een lange rechte baan door middel van lineaire inductiemotoren, om daarna recht omhoog te gaan en weer terug te vallen richting het station
-STR_0555 :
-STR_0556 :
+STR_0554 :Het karretje wordt het station uitgelanceerd over een lange rechte baan door middel van lineaire inductiemotoren, om daarna recht omhoog te gaan en weer terug te vallen richting het station.
+STR_0555 :Bezoekers gaan in een lift in een toren omhoog of omlaag om naar een ander hoogteniveau te komen.
+STR_0556 :Extra brede karretjes gaan door over compleet verticale baan voor een ultimate vrijevalbeleving.
STR_0557 :
STR_0558 :
STR_0559 :
STR_0560 :
STR_0561 :
-STR_0562 :
-STR_0563 :Bezoekers zitten in comfortabele treinen met enkel een schootbeugel en gaan soepel door grote afdalingen en kronkelende stukken baan, met veel 'airtime' in de heuvels
-STR_0564 :Deze over een houten baan lopende achtbaan is snel, ruw, luidruchting en geeft het gevoel van controleverlies met veel 'airtime'
-STR_0565 :Een simpele houten achtbaan die enkel in staat is rustige hellingen en bochten te bedwingen, de karretjes worden enkel op de baan gehouden door middel van zijfrictiewielen en zwaartekracht
-STR_0566 :Losse karretjes rijden over een kronkelende baan met scherpe bochten en korte felle afdalingen
-STR_0567 :Bezoekers zitten in stoelen aan beide kanten van de baan, en draaien alle kanten op terwijl ze door diepe afdalingen en diverse omkeringen gaan
+STR_0562 :Aangedreven karretjes rijden langs eng decor en special effects over een baan met hoogteverschillen.
+STR_0563 :Bezoekers zitten in comfortabele treinen met enkel een schootbeugel en gaan soepel door grote afdalingen en kronkelende stukken baan, met veel 'airtime' in de heuvels.
+STR_0564 :Deze over een houten baan lopende achtbaan is snel, ruw, luidruchting en geeft het gevoel van controleverlies met veel 'airtime'.
+STR_0565 :Een simpele houten achtbaan die enkel in staat is rustige hellingen en bochten te bedwingen, de karretjes worden enkel op de baan gehouden door middel van zijfrictiewielen en zwaartekracht.
+STR_0566 :Losse karretjes rijden over een kronkelende baan met scherpe bochten en korte felle afdalingen.
+STR_0567 :Bezoekers zitten in stoelen aan beide kanten van de baan, en draaien alle kanten op terwijl ze door diepe afdalingen en diverse omkeringen gaan.
STR_0568 :
-STR_0569 :Bezoekers hangen in treinen onder de baan met enkel schouderbeugels en krijgen zo de ervaring dat ze vliegen
+STR_0569 :Bezoekers hangen in treinen onder de baan met enkel schouderbeugels en krijgen zo de ervaring dat ze vliegen.
STR_0570 :
-STR_0571 :
-STR_0572 :
-STR_0573 :
-STR_0574 :
-STR_0575 :Aangedreven treinen hangen aan een enkele rail en vervoeren mensen door het park heen
+STR_0571 :Ronde karretjes gaan over een zigzaggende houten baan en draaien daarbij rond.
+STR_0572 :Boten met een hoge capaciteit varen door een brede waterbak, worden naar boven vervoerd door een lopende band, en gaan met hoge snelheid steile heuvels af om met een grote plons de passagiers te doorweken.
+STR_0573 :Aangedreven karretjes in de vorm van een helicopter rijden over een stalen baan, bestuurd door het trappen van de passagiers.
+STR_0574 :Passagiers worden door middel van een speciale beugel in een liggende positie vastgehouden, waarna ze op hun rug of met hun gezicht naar de grond door kronkelende stukken baan en omkeringen heen gaan.
+STR_0575 :Aangedreven treinen hangen aan een enkele rail en vervoeren mensen door het park heen.
STR_0576 :
-STR_0577 :
-STR_0578 :Karretjes rijden in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists
+STR_0577 :Karrtjes met draaistellen rijden op een houten baan en kunnen omkeren op speciale stukken baan.
+STR_0578 :Karretjes rijden in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists.
STR_0579 :
-STR_0580 :
-STR_0581 :
+STR_0580 :Een gigantische stalen achtbaan die in staat is tot soepele afdalingen en heuvels die hoger zijn dan 90 meter.
+STR_0581 :Een ring van stoelen wordt naar de bovenkant van een hoge toren getrokken terwijl hij rustig ronddraait, waarna hij losgelaten wordt in een vrije val, waarna hij beneden rustig wordt afgeremd door middel van magnetische remmen.
STR_0582 :
STR_0583 :
-STR_0584 :
-STR_0585 :
-STR_0586 :Bootvormige karretjes rijden over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen
-STR_0587 :
-STR_0588 :
+STR_0584 :Speciale fietsen rijden over een stalen monorail, voortbewogen door het trappen van de passagiers.
+STR_0585 :Passagiers zitten in stoelparen die onder de baan hangen terwijl ze door kronkelende en scherpe omkeringen gaan.
+STR_0586 :Bootvormige karretjes rijden over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen.
+STR_0587 :Na een enerverende pneumatische lancering rijdt de trein met hogere snelheid over een verticale baan, over de top, en vervolgens over de andere kant weer naar beneden om terug te keren naar het station.
+STR_0588 :Losse karretjes hangen onder een zigzaggende baan met haarspeldbochten en scherpe afdalingen.
STR_0589 :
-STR_0590 :
-STR_0591 :
+STR_0590 :Passagiers rijden over een onderwaterparcours in onderzeeërs.
+STR_0591 :Boten in de vorm van een vlot varen rustig door een waterbak.
STR_0592 :
STR_0593 :
STR_0594 :
STR_0595 :
STR_0596 :
STR_0597 :
-STR_0598 :
-STR_0599 :Een compacte achtbaan met individuele karretjes en steile, kronkelende afdalingen
-STR_0600 :
+STR_0598 :Omgekeerde achtbaantrein worden het station uit gelanceerd en gaan een verticale kronkelende baan op, waarna ze terugzakken, door het station heengaan en achteruit een ander stuk verticale baan opgaan.
+STR_0599 :Een compacte achtbaan met individuele karretjes en steile, kronkelende afdalingen.
+STR_0600 :Aangedreven mijntreinen rijden over een soepele en kronkelende baan.
STR_0601 :
-STR_0602 :
+STR_0602 :Achtbaantreinen worden door lineaire inductiemotoren het station uit gelanceerd en razen door een kronkelende baan die vaak over de kop gaat.
STR_0603 :Bezoeker {INT32}
STR_0604 :Bezoeker {INT32}
STR_0605 :Bezoeker {INT32}
@@ -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
@@ -3449,7 +3449,7 @@ STR_3446 :Werkgebied wissen
#Start van OpenRCT2-indices
STR_5120 :'Financiën'-knop in de werkbalk tonen
STR_5121 :'Onderzoek'-knop in de werkbalk tonen
-STR_5122 :Alle voertuigen met hetzelfde baan-/attractietype tonen
+STR_5122 :Attracties op baantype sorteren
STR_5123 :Attr. vernieuwen
STR_5124 :Six Flags weg
STR_5125 :Afbreekbaar maken
@@ -3496,7 +3496,7 @@ STR_5163 :Maand/dag/jaar
STR_5164 :Twitch-kanaalnaam
STR_5165 :Bezoekers namen van volgers geven
STR_5166 :Geeft bezoekers namen van gebruikers die het Twitch-kanaal volgen.
-STR_5167 :Bez. met Twitch-volgersnamen volgen in berichtengebied
+STR_5167 :Bez. met Twitch-volgersnamen volgen in berichtengeb.
STR_5168 :Zet het bezoekersvolgsysteem aan voor bezoekers die naar Twitch-volgers zijn genoemd.
STR_5169 :Bez. namen van gebruikers in de Twitch-chat geven
STR_5170 :Geeft bezoekers namen van gebruikers in de Twitch-chat.
@@ -3507,15 +3507,15 @@ STR_5174 :Zal chatberichten op Twitch die beginnen met !news in het berichten
STR_5175 :Voer de naam van je Twitch-kanaal in
STR_5176 :Twitch-integratie inschakelen
STR_5177 :Schermmodus:
-STR_5178 :{SMALLFONT}{BLACK}Show financial cheats
-STR_5179 :{SMALLFONT}{BLACK}Show guest cheats
-STR_5180 :{SMALLFONT}{BLACK}Show park cheats
-STR_5181 :{SMALLFONT}{BLACK}Show ride cheats
+STR_5178 :{SMALLFONT}{BLACK}Cheats voor financiën
+STR_5179 :{SMALLFONT}{BLACK}Cheats voor gasten
+STR_5180 :{SMALLFONT}{BLACK}Cheats voor park
+STR_5181 :{SMALLFONT}{BLACK}Cheats voor attracties
STR_5182 :{INT32}
STR_5183 :Basishoogte
-STR_5184 :Enter base height between {COMMA16} and {COMMA16}
+STR_5184 :Voer een basishoogte tussen {COMMA16} en {COMMA16} in
STR_5185 :Waterniveau
-STR_5186 :Enter water level between {COMMA16} and {COMMA16}
+STR_5186 :Voer een waterniveau tussen {COMMA16} en {COMMA16} in
STR_5187 :Financiën
STR_5188 :Nieuwe advertentiecampagne
STR_5189 :Onderzoek
@@ -3706,3 +3706,68 @@ STR_5373 :Naam {STRINGID}
STR_5374 :Datum {STRINGID}
STR_5375 :{UP}
STR_5376 :{DOWN}
+STR_5377 :{SMALLFONT}{BLACK}Opgeslagen spellen
+STR_5378 :{SMALLFONT}{BLACK}Script
+STR_5379 :{SMALLFONT}{BLACK}Ga naar volgend Wacht-commando
+STR_5380 :{SMALLFONT}{BLACK}Start het afspelen van de titelpresentatie
+STR_5381 :{SMALLFONT}{BLACK}Stopt het afspelen van de titelpresentatie
+STR_5382 :{SMALLFONT}{BLACK}Titelpresentatie herstarten
+STR_5383 :{SMALLFONT}{BLACK}Een nieuwe titelpresentatie aanmaken die is gebaseerd op de huidige
+STR_5384 :{SMALLFONT}{BLACK}Huidige titelpresentatie verwijderen
+STR_5385 :{SMALLFONT}{BLACK}Huidige titelpresentatie hernoemen
+STR_5386 :{SMALLFONT}{BLACK}Nieuw commando invoegen
+STR_5387 :{SMALLFONT}{BLACK}Geselecteerd commando bewerken
+STR_5388 :{SMALLFONT}{BLACK}Geselecteerd commando verwijderen
+STR_5389 :{SMALLFONT}{BLACK}Naar geselecteerd commando titelpresentatie springen
+STR_5390 :{SMALLFONT}{BLACK}Geselecteerd commando naar beneden verplaatsen
+STR_5391 :{SMALLFONT}{BLACK}Geselecteerd commando naar boven verplaatsen
+STR_5392 :{SMALLFONT}{BLACK}Opgeslagen spel aan titelpresentatie toevoegen
+STR_5393 :{SMALLFONT}{BLACK}Geselecteerd opgeslagen spel uit titelpresentatie verwijderen
+STR_5394 :{SMALLFONT}{BLACK}Opgeslagen spel hernoemen
+STR_5395 :{SMALLFONT}{BLACK}Opgeslagen spel laden
+STR_5396 :{SMALLFONT}{BLACK}Titelpresentatie herladen als ze buiten het spel om is aangepast
+STR_5397 :Kan enkel in het titelscherm worden gebruikt
+STR_5398 :Kan de titelpresentatie niet aanpassen wanneer deze wordt afgespeeld
+STR_5399 :Klik op Stop om verder te gaan met aanpassen
+STR_5400 :Kan deze titelpresentatie niet aanpassen
+STR_5401 :Een nieuwe titelpresentatie aanmaken om wijzigingen aan te brengen
+STR_5402 :Kan titelpresentatie niet laden
+STR_5403 :Er is mogelijk geen Laad- or Wacht-commando of één van de opgeslagen spellen is mogelijk beschadigd
+STR_5404 :Naam bestaat al
+STR_5405 :Voer een naam in voor het opgeslagen spel
+STR_5406 :Voer een naam in voor de titelpresentatie
+STR_5407 :Toevoegen
+STR_5408 :Verwijderen
+STR_5409 :Invoegen
+STR_5410 :Bewerken
+STR_5411 :Herladen
+STR_5412 :Spring naar
+STR_5413 :Laad
+STR_5414 :Laad{MOVE_X}{87}Six Flags Magic Mountain.SC6
+STR_5415 :Laad{MOVE_X}{87}{STRING}
+STR_5416 :Laad{MOVE_X}{87}Geen opgeslagen spel geselecteerd
+STR_5417 :Locatie
+STR_5418 :Locatie{MOVE_X}{87}{COMMA16} {COMMA16}
+STR_5419 :Draai
+STR_5420 :Draai{MOVE_X}{87}{COMMA16}
+STR_5421 :Zoom
+STR_5422 :Zoom{MOVE_X}{87}{COMMA16}
+STR_5423 :Wacht
+STR_5424 :Wacht{MOVE_X}{87}{COMMA16}
+STR_5425 :Herstarten
+STR_5426 :Einde
+STR_5427 :Coördinaten:
+STR_5428 :Aant. draaiingen tegen de klok:
+STR_5429 :Zoomniveau:
+STR_5430 :Te wachten seconden:
+STR_5431 :Te laden opgeslagen spel:
+STR_5432 :Commando:
+STR_5433 :Titlepresentaties
+STR_5434 :Commandobewerker
+STR_5435 :Opgeslagen spel hernoemen
+STR_5436 :Titelpresentaties bewerekn...
+STR_5437 :Geen opgeslagen spel geselecteerd
+STR_5438 :Kan geen wijzigingen aanbrengen wanneer de commandobewerker open is
+STR_5439 :Er is een herstart gebruikt zonder Wacht-commando
+STR_5440 :Volledig scherm minimaliseren bij focusverlies
+STR_5441 :{SMALLFONT}{BLACK}Sorteert attracties per baantype,{NEWLINE}zodat achteraf wisselen van treintypes mogelijk{NEWLINE}wordt, zoals in RCT1.
diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt
index d4041307b5..52a834f1a4 100644
--- a/data/language/english_uk.txt
+++ b/data/language/english_uk.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 a 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
@@ -3680,8 +3680,8 @@ STR_5343 :Automatically place staff
STR_5344 :Changelog
STR_5345 :Financial cheats
STR_5346 :Guest cheats
-STR_5347 :Ride cheats
-STR_5348 :Park cheats
+STR_5347 :Park cheats
+STR_5348 :Ride cheats
STR_5349 :{SMALLFONT}{BLACK}All Rides
STR_5350 :Max
STR_5351 :Min
@@ -3775,9 +3775,15 @@ STR_5438 :Can't make changes while command editor is open
STR_5439 :A wait command with at least 4 seconds is required with a restart command
STR_5440 :Minimise fullscreen on focus loss
STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1.
-STR_5442 :reserved
+STR_5442 :Force park rating:
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}
+STR_5449 :Reduce game speed
+STR_5450 :Increase game speed
+STR_5451 :Open cheats window
+STR_5452 :Toggle visibility of toolbars
STR_5453 :Select another ride
diff --git a/data/language/english_us.txt b/data/language/english_us.txt
index d82fe466aa..c2883e1794 100644
--- a/data/language/english_us.txt
+++ b/data/language/english_us.txt
@@ -513,31 +513,31 @@ STR_0508 :
STR_0509 :
STR_0510 :
STR_0511 :
-STR_0512 :
-STR_0513 :
+STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops.
+STR_0513 :A looping roller coaster where the riders ride in a standing position
STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners
-STR_0515 :
+STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements
STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides
STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track
STR_0518 :Passengers travel in electric trains along a monorail track
STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners
-STR_0520 :
-STR_0521 :
-STR_0522 :
+STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water
+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_0525 :
-STR_0526 :
+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 :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 :
-STR_0529 :
+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
STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again
-STR_0531 :
+STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops
STR_0532 :
STR_0533 :
-STR_0534 :
-STR_0535 :
-STR_0536 :
+STR_0534 :Self-drive petrol-engined go karts
+STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders
+STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids
STR_0537 :
STR_0538 :
STR_0539 :
@@ -556,14 +556,14 @@ STR_0551 :
STR_0552 :
STR_0553 :
STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station
-STR_0555 :
-STR_0556 :
+STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another
+STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience
STR_0557 :
STR_0558 :
STR_0559 :
STR_0560 :
STR_0561 :
-STR_0562 :
+STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects
STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills
STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time'
STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity
@@ -572,38 +572,38 @@ STR_0567 :Sitting in seats suspended either side of the track, riders are pit
STR_0568 :
STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air
STR_0570 :
-STR_0571 :
-STR_0572 :
-STR_0573 :
-STR_0574 :
+STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track
+STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash
+STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders
+STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground
STR_0575 :Powered trains hanging from a single rail transport people around the park
STR_0576 :
-STR_0577 :
+STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections
STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists
STR_0579 :
-STR_0580 :
-STR_0581 :
+STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft
+STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes
STR_0582 :
STR_0583 :
-STR_0584 :
-STR_0585 :
+STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders
+STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions
STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections
-STR_0587 :
-STR_0588 :
+STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station
+STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops
STR_0589 :
-STR_0590 :
-STR_0591 :
+STR_0590 :Riders ride in a submerged submarine through an underwater course
+STR_0591 :Raft-shaped boats gently meander around a river track
STR_0592 :
STR_0593 :
STR_0594 :
STR_0595 :
STR_0596 :
STR_0597 :
-STR_0598 :
+STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track
STR_0599 :A compact roller coaster with individual cars and smooth twisting drops
-STR_0600 :
+STR_0600 :Powered mine trains career along a smooth and twisted track layout
STR_0601 :
-STR_0602 :
+STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions
STR_0603 :Guest {INT32}
STR_0604 :Guest {INT32}
STR_0605 :Guest {INT32}
@@ -3458,7 +3458,7 @@ STR_3446 :Cancel Patrol Area
# New strings, cleaner
STR_5120 :Show finances button on toolbar
STR_5121 :Show research button on toolbar
-STR_5122 :Show all vehicles sharing a track/ride type
+STR_5122 :Select rides by track type (like in RCT1)
STR_5123 :Renew rides
STR_5124 :No Six Flags
STR_5125 :All destructable
@@ -3711,3 +3711,72 @@ STR_5369 :Park parameters...
STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money.
STR_5371 :Object Selection
STR_5372 :Invert right mouse dragging
+STR_5373 :Name {STRINGID}
+STR_5374 :Date {STRINGID}
+STR_5375 :{UP}
+STR_5376 :{DOWN}
+STR_5377 :{SMALLFONT}{BLACK}Saves
+STR_5378 :{SMALLFONT}{BLACK}Script
+STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command
+STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence
+STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence
+STR_5382 :{SMALLFONT}{BLACK}Restart title sequence
+STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one
+STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence
+STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence
+STR_5386 :{SMALLFONT}{BLACK}Insert a new command
+STR_5387 :{SMALLFONT}{BLACK}Edit the selected command
+STR_5388 :{SMALLFONT}{BLACK}Delete the selected command
+STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence
+STR_5390 :{SMALLFONT}{BLACK}Move the selected command down
+STR_5391 :{SMALLFONT}{BLACK}Move the selected command up
+STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence
+STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence
+STR_5394 :{SMALLFONT}{BLACK}Rename the selected save
+STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game
+STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game
+STR_5397 :Can only be used on the title screen
+STR_5398 :Cannot edit title sequence while it's playing
+STR_5399 :Press the stop button to continue editing
+STR_5400 :Can't change this title sequence
+STR_5401 :Create a new title sequence to make changes to
+STR_5402 :Failed to load title sequence
+STR_5403 :There may be no Load or Wait command or a save may be invalid
+STR_5404 :Name already exists
+STR_5405 :Enter a name for the save
+STR_5406 :Enter a name for the title sequence
+STR_5407 :Add
+STR_5408 :Remove
+STR_5409 :Insert
+STR_5410 :Edit
+STR_5411 :Reload
+STR_5412 :Skip to
+STR_5413 :Load
+STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6
+STR_5415 :Load{MOVE_X}{87}{STRING}
+STR_5416 :Load{MOVE_X}{87}No save selected
+STR_5417 :Location
+STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16}
+STR_5419 :Rotate
+STR_5420 :Rotate{MOVE_X}{87}{COMMA16}
+STR_5421 :Zoom
+STR_5422 :Zoom{MOVE_X}{87}{COMMA16}
+STR_5423 :Wait
+STR_5424 :Wait{MOVE_X}{87}{COMMA16}
+STR_5425 :Restart
+STR_5426 :End
+STR_5427 :Coordinates:
+STR_5428 :Counter-clockwise rotations:
+STR_5429 :Zoom level:
+STR_5430 :Seconds to wait:
+STR_5431 :Save to load:
+STR_5432 :Command:
+STR_5433 :Title Sequences
+STR_5434 :Command Editor
+STR_5435 :Rename save
+STR_5436 :Edit Title Sequences...
+STR_5437 :No save selected
+STR_5438 :Can't make changes while command editor is open
+STR_5439 :A restart is used without a wait command
+STR_5440 :Minimize fullscreen on focus loss
+STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1.
diff --git a/data/language/german.txt b/data/language/german.txt
index 01864bc2dd..0ad49e4e4f 100644
--- a/data/language/german.txt
+++ b/data/language/german.txt
@@ -513,31 +513,31 @@ STR_0508 :
STR_0509 :
STR_0510 :
STR_0511 :
-STR_0512 :
-STR_0513 :
+STR_0512 :Eine kompakte Stahlachterbahn mit einem Spirallifthügel und Wagen mit Sitzen in einer Reihe
+STR_0513 :Eine Looping-Achterbahn, bei der sich die Fahrgäste in einer stehenden Position befinden
STR_0514 :Die unterhalb der Schiene aufgehängten Züge schwingen in Kurven seitlich aus.
-STR_0515 :
+STR_0515 :Die Fahrgäste sind in Sitzen, die unter den Schienen hängen und durch riesige Schleifen, Kurven und große Gefälle rasen
STR_0516 :Eine gemäßigte Achterbahn für Leute, die noch nicht den Mut für längere Bahnen haben
STR_0517 :Die Fahrgäste sitzen in Miniaturzügen, die auf einer schmalen Schienenstrecke fahren
STR_0518 :Die Passagiere fahren in elektrischen Zügen auf einer Einschienenstrecke
STR_0519 :Die Fahrgäste sitzen in kleinen, an einer Einschienenstrecke aufgehängten Wagen, die in Kurven seitlich frei schwingen
-STR_0520 :
-STR_0521 :
-STR_0522 :
+STR_0520 :Die Fahrgäste können ihr persönliches Wasserfahrzeug über das Wasser steuern
+STR_0521 :Kleine mausförmige Wagen fahren auf einer Holzstrecke, wobei sich die Wagen in Haarnadelkurven und steilen Senken neigen
+STR_0522 :Eine kleinere Achterbahn, auf der die Passagiere über der Strecke sitzen, ohne von einem Wagen umgeben zu sein
STR_0523 :Die Passagiere sitzen in langsam angetriebenen Wagen auf einer Schienenstrecke
-STR_0524 :
-STR_0525 :
-STR_0526 :
+STR_0524 :Der Freefall-Wagen wird mit Druckluft einen hohen Stahlturm hochgeschossen, von wo er dann im freien Fall nach unten saust
+STR_0525 :Die Passagiere fahren, nur von der Krümmung und der seitlichen Neigung der halbkreisförmigen Strecke geführt, auf einer verdrehten Strecke
+STR_0526 :Rotierende Aussichtskabine, die sich an einem hohen Turm hinauf bewegt
STR_0527 :Eine gemäßigte Stahlachterbahn, bei der vertikale Schleifen möglich sind
-STR_0528 :
-STR_0529 :
+STR_0528 :Die Passagiere fahren in Schlauchbooten eine sich windende, halbkreisförmige oder komplett in sich geschlossene Rohrstrecke herunter
+STR_0529 :Minenachterbahnzüge fahren auf Stahlschienen, die so aussehen wie alte Zugschienen
STR_0530 :Die Wagen hängen an einem Stahlseil, das durchgängig von einem Streckenende zum anderen und wieder zurück führt
-STR_0531 :
+STR_0531 :Eine kompakte Stahlachterbahn, bei der der Zug durch Schrauben und Schleifen fährt
STR_0532 :
STR_0533 :
-STR_0534 :
-STR_0535 :
-STR_0536 :
+STR_0534 :Selbstbetriebene Benzin-Go-Karts
+STR_0535 :Baumstammförmige Boote fahren in einem Wasserkanal und rutschen steile Gefälle herunter, damit die Fahrgäste unten nass werden
+STR_0536 :Runde Boote gleiten durch einen breiten Wasserkanal, zischen durch Wasserfälle und schäumende Stromschnellen
STR_0537 :
STR_0538 :
STR_0539 :
@@ -556,14 +556,14 @@ STR_0551 :
STR_0552 :
STR_0553 :
STR_0554 :Der Wagen wird mit Hilfe von linearen Induktionsmotoren aus der Station entlang einer langen, ebenen Bahn beschleunigt und dann vertikal nach oben geschossen, von wo er wieder im freien Fall zur Station zurückzukehrt
-STR_0555 :
-STR_0556 :
+STR_0555 :Die Besucher fahren in einem Aufzug einen Turm hinauf oder hinab, um in ein anderes Stockwerk zu gelangen
+STR_0556 :Besonders breite Wagen fallen eine vollständige Vertikale herunter - das ultimative Erlebnis des freien Falls
STR_0557 :
STR_0558 :
STR_0559 :
STR_0560 :
STR_0561 :
-STR_0562 :
+STR_0562 :Angetriebene Wagen fahren auf einer mehrstöckigen Strecke mit gruseliger Landschaft und Spezialeffekten
STR_0563 :Die Fahrgäste sitzen in komfortablen Wagen mit einfachen Beckenhalterungen, in denen sie gigantische, gemäßigte Gefälle erleben, aber auch viel Zeit oben `in der Luft' verbringen
STR_0564 :Diese Holzachterbahn ist schnell, rauh, laut und gibt einem das Gefühl, außer Kontrolle zu sein, wobei man häufig `in der Luft' ist
STR_0565 :Eine einfache Holzachterbahn mit nur leichten Gefällen und Kurven, bei der die Wagen nur mit Hilfe von seitlichen Führungsrollen und der Schwerkraft auf der Strecke gehalten werden
@@ -572,38 +572,38 @@ STR_0567 :Die Passagiere befinden sich in Sitzen, die an beiden Seiten der Ba
STR_0568 :
STR_0569 :Die Passagiere, die in speziellen Vorrichtungen unter der Schiene fahren, haben das Gefühl zu fliegen, während sie durch die Lüfte sausen
STR_0570 :
-STR_0571 :
-STR_0572 :
-STR_0573 :
-STR_0574 :
+STR_0571 :Runde Wagen drehen sich auf der Zickzack-Holzstrecke
+STR_0572 :Große Boote bewegen sich in einem breiten Wasserkanal, fahren von einem Fließband befördert Anstiege hoch und sausen steile Gefälle hinunter, damit die Fahrgäste mit einem gigantischen Platscher durchnässt werden
+STR_0573 :Helikopterförmige Wagen fahren auf einer Stahlstrecke und werden von den Pedaltritten der Fahrer angetrieben
+STR_0574 :Die Passagiere befinden sich in speziellen Haltevorrichtungen in liegender Position (entweder auf dem Rücken oder dem Bauch) und fahren auf einer gewundenen Strecke mit Überkopfteilen
STR_0575 :Angetriebene Züge, die von einem einzelnen Gleis hängen, befördern die Fahrgäste durch den Park
STR_0576 :
-STR_0577 :
+STR_0577 :Wagen mit Drehgestell fahren auf einer Holzstrecke und rotieren dabei auf speziellen Umkehrabschnitten
STR_0578 :Die Wagen fahren auf einer Strecke mit kreisförmigen Reifen, steilen Gefällen und Heartline-Twists
STR_0579 :
-STR_0580 :
-STR_0581 :
+STR_0580 :Eine gigantische Stahlachterbahn mit gemäßigten Gefällen und Anstiegen von über 90 Meter
+STR_0581 :Ein Ring mit Sitzen, der zur Spitze eines hohen Turms gezogen wird, während er sich leicht dreht, und dann im freien Fall heruntersaust, wobei er unten sanft von Magnetbremsen angehalten wird
STR_0582 :
STR_0583 :
-STR_0584 :
-STR_0585 :
+STR_0584 :Spezielle Fahrräder fahren auf einer einschienigen Stahlstrecke und werden von den Passagieren angetrieben, indem sie in die Pedale treten
+STR_0585 :Die Fahrgäste hängen in Sitzpaaren unter der Strecke und fahren Schleifen und Wendungen durch enge Kurven
STR_0586 :Wagen in Bootsform laufen auf einer gewundenen Achterbahn mit steilen Gefällen, wobei sie in Wasserabschnitte klatschen, die in gemäßigtere Flussbereiche führen
-STR_0587 :
-STR_0588 :
+STR_0587 :Nach einem atemberaubenden luftbetriebenen Start schnellt der Zug eine vertikale Strecke hoch, über die Spitze und auf der anderen Seite vertikal nach unten zurück zur Station
+STR_0588 :Einzelne Wagen fahren unter einer Zickzack-Strecke mit Haarnadelkurven und steilen Gefällen
STR_0589 :
-STR_0590 :
-STR_0591 :
+STR_0590 :Die Fahrgäste fahren in einem U-Boot auf einer Unterwasserstrecke
+STR_0591 :Floßförmige Boote winden sich sanft durch eine Flussstrecke
STR_0592 :
STR_0593 :
STR_0594 :
STR_0595 :
STR_0596 :
STR_0597 :
-STR_0598 :
+STR_0598 :Umgekehrte Achterbahnzüge werden aus der Station beschleunigt und rasen ein vertikales Streckenstück hinauf, sausen wieder hinab durch die Station und fahren einen anderen vertikalen Streckenabschnitt hinauf
STR_0599 :Eine kompakte Achterbahn mit unabhängigen Wagen und gemäßigten, sich windenden Gefällen
-STR_0600 :
+STR_0600 :Angetriebene Minenzüge fahren auf einer gemäßigten und verwundenen Strecke
STR_0601 :
-STR_0602 :
+STR_0602 :Achterbahnzüge werden aus der Station mit Hilfe von linearen Induktionsmotoren beschleunigt und rasen durch gewundene Überkopfteile
STR_0603 :Besucher {INT32}
STR_0604 :Besucher {INT32}
STR_0605 :Besucher {INT32}
@@ -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
@@ -3455,7 +3455,7 @@ STR_3446 :Patrouillenbereich verwerfen
# New strings, cleaner
STR_5120 :Finanzen in der Symbolleiste anzeigen
STR_5121 :Forschung in der Symbolleiste anzeigen
-STR_5122 :Fahrzeuge gleicher Strecke/Bahnart anzeigen
+STR_5122 :Bahnen nach Streckentyp auswählen (wie in RCT1)
STR_5123 :Bahnen erneuern
STR_5124 :Keine Six Flags
STR_5125 :Alles zerstörbar
@@ -3508,7 +3508,7 @@ STR_5171 :Überwache Chat-Parkbesucher
STR_5172 :{SMALLFONT}{BLACK}Überwachungsinformationen zu Parkbesuchern, die nach Twitch-Chatbenutzern benannt sind, einschalten - (Bei eingeschalteter Überwachung werden Besucheraktivitäten im Nachrichtenbereich angezeigt)
STR_5173 :Erhalte Twitch-Chat als Spielnachrichten
STR_5174 :{SMALLFONT}{BLACK}Benutzt Twitch-Chatnachrichten, welchen !news vorangestellt ist, für Spielbenachrichtigungen
-STR_5175 :Name Ihres Twitch-Kanals eingeben:
+STR_5175 :Namen Ihres Twitch-Kanals eingeben:
STR_5176 :Twitch-Integration aktivieren
STR_5177 :Vollbildmodus:
STR_5178 :{SMALLFONT}{BLACK}Cheats für Finanzen anzeigen
@@ -3573,7 +3573,7 @@ STR_5236 :Fenster:
STR_5237 :Farbpalette:
STR_5238 :Aktuelles Thema:
STR_5239 :Duplizieren
-STR_5240 :Name für Thema eingeben:
+STR_5240 :Namen für Thema eingeben:
STR_5241 :Dieses Thema kann nicht geändert werden
STR_5242 :Dieser Themenname existiert bereits
STR_5243 :Unzulässige Zeichen benutzt
@@ -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
@@ -3710,3 +3710,75 @@ STR_5373 :Name {STRINGID}
STR_5374 :Datum {STRINGID}
STR_5375 :{UP}
STR_5376 :{DOWN}
+STR_5377 :{SMALLFONT}{BLACK}Gespeicherte Spiele
+STR_5378 :{SMALLFONT}{BLACK}Skript
+STR_5379 :{SMALLFONT}{BLACK}Zum nächsten `Warten'-Befehl springen
+STR_5380 :{SMALLFONT}{BLACK}Titelsequenz abspielen
+STR_5381 :{SMALLFONT}{BLACK}Titelsequenz stoppen
+STR_5382 :{SMALLFONT}{BLACK}Titelsequenz neu starten
+STR_5383 :{SMALLFONT}{BLACK}Neue Titelsequenz durch duplizieren der aktuellen Titelsequenz erstellen
+STR_5384 :{SMALLFONT}{BLACK}Aktuelle Titelsequenz löschen
+STR_5385 :{SMALLFONT}{BLACK}Aktuelle Titelsequenz umbenennen
+STR_5386 :{SMALLFONT}{BLACK}Neuen Befehl einfügen
+STR_5387 :{SMALLFONT}{BLACK}Ausgewählten Befehl bearbeiten
+STR_5388 :{SMALLFONT}{BLACK}Ausgewählten Befehl löschen
+STR_5389 :{SMALLFONT}{BLACK}Zum ausgewählten Befehl in{NEWLINE}der Titelsequenz springen
+STR_5390 :{SMALLFONT}{BLACK}Ausgewählten Befehl nach oben verschieben
+STR_5391 :{SMALLFONT}{BLACK}Ausgewählten Befehl nach unten verschieben
+STR_5392 :{SMALLFONT}{BLACK}Einen Spielstand zur Titelsequenz hinzufügen
+STR_5393 :{SMALLFONT}{BLACK}Ausgewählten Spielstand von{NEWLINE}Titelsequenz entfernen
+STR_5394 :{SMALLFONT}{BLACK}Ausgewählten Spielstand umbenennen
+STR_5395 :{SMALLFONT}{BLACK}Ausgewählten Spielstand laden
+STR_5396 :{SMALLFONT}{BLACK}Titelsequenz neu laden, falls sie außerhalb des Spiels geändert wurde
+STR_5397 :Kann nur im Titelbildschirm verwendet werden
+STR_5398 :Titelsequenz kann, während sie läuft, nicht geändert werden
+STR_5399 :Titelsequenz stoppen, um das Bearbeiten fortzusetzen
+STR_5400 :Diese Titelsequenz kann nicht geändert werden
+STR_5401 :Erstellen Sie eine neue Titelsequenz, um sie zu bearbeiten
+STR_5402 :Titelsequenz konnte nicht geladen werden
+STR_5403 :Möglicherweise kein `Laden'-Befehl, `Warten'-Befehl oder ein ungültiger Spielstand vorhanden
+STR_5404 :Dieser Name existiert bereits
+STR_5405 :Namen für Spielstand eingeben:
+STR_5406 :Namen für Titelsequenz eingeben:
+STR_5407 :Hinzufügen
+STR_5408 :Entfernen
+STR_5409 :Einfügen
+STR_5410 :Bearbeiten
+STR_5411 :Neu laden
+STR_5412 :Springen zu
+STR_5413 :Laden
+STR_5414 :Laden{MOVE_X}{87}Six Flags Magic Mountain.SC6
+STR_5415 :Laden{MOVE_X}{87}{STRING}
+STR_5416 :Laden{MOVE_X}{87}Kein Spielstand ausgewählt
+STR_5417 :Position
+STR_5418 :Position{MOVE_X}{87}{COMMA16} {COMMA16}
+STR_5419 :Drehen
+STR_5420 :Drehen{MOVE_X}{87}{COMMA16}
+STR_5421 :Zoom
+STR_5422 :Zoom{MOVE_X}{87}{COMMA16}
+STR_5423 :Warten
+STR_5424 :Warten{MOVE_X}{87}{COMMA16}
+STR_5425 :Neustart
+STR_5426 :Ende
+STR_5427 :Koordinaten:
+STR_5428 :Drehungen gegen Uhrzeigersinn:
+STR_5429 :Zoomstufe:
+STR_5430 :Zu wartende Sekunden:
+STR_5431 :Zu ladender Spielstand:
+STR_5432 :Befehl:
+STR_5433 :Titelsequenzen
+STR_5434 :Befehlseditor
+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 :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
+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/addresses.h b/src/addresses.h
index 224a5966f4..83959c7cb1 100644
--- a/src/addresses.h
+++ b/src/addresses.h
@@ -354,6 +354,7 @@
#define RCT2_ADDRESS_SCENARIO_SRAND_0 0x00F663B0
#define RCT2_ADDRESS_SCENARIO_SRAND_1 0x00F663B4
#define RCT2_ADDRESS_MAP_ELEMENTS 0x00F663B8
+#define RCT2_ADDRESS_MAP_ELEMENTS_END 0x010E53B8
#define RCT2_ADDRESS_SPRITE_LIST 0x010E63BC
#define RCT2_ADDRESS_SPRITES_NEXT_INDEX 0x013573BC
@@ -362,6 +363,11 @@
#define RCT2_ADDRESS_SPRITES_START_MISC 0x013573C2
#define RCT2_ADDRESS_SPRITES_START_LITTER 0x013573C4
+#define RCT2_ADDRESS_SPRITES_COUNT_VEHICLE 0x013573CA
+#define RCT2_ADDRESS_SPRITES_COUNT_PEEP 0x013573CC
+#define RCT2_ADDRESS_SPRITES_COUNT_MISC 0x013573CE
+#define RCT2_ADDRESS_SPRITES_COUNT_LITTER 0x013573D0
+
#define RCT2_ADDRESS_PARK_NAME 0x013573D4
#define RCT2_ADDRESS_PARK_NAME_ARGS 0x013573D8
#define RCT2_ADDRESS_INITIAL_CASH 0x013573DC
diff --git a/src/config.c b/src/config.c
index 3fdde76f90..75e9c1dde0 100644
--- a/src/config.c
+++ b/src/config.c
@@ -954,7 +954,8 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = {
// New
SDL_SCANCODE_MINUS, // SHORTCUT_REDUCE_GAME_SPEED,
SDL_SCANCODE_EQUALS, // SHORTCUT_INCREASE_GAME_SPEED,
- 0x0200 | 0x0400 | SDL_SCANCODE_C // SHORTCUT_OPEN_CHEAT_WINDOW,
+ 0x0200 | 0x0400 | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW,
+ SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE,
};
/**
diff --git a/src/config.h b/src/config.h
index 6f5a85b991..8c70b4b64b 100644
--- a/src/config.h
+++ b/src/config.h
@@ -70,6 +70,7 @@ enum {
SHORTCUT_REDUCE_GAME_SPEED,
SHORTCUT_INCREASE_GAME_SPEED,
SHORTCUT_OPEN_CHEAT_WINDOW,
+ SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE,
SHORTCUT_COUNT
};
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..1a765677b1 100644
--- a/src/game.c
+++ b/src/game.c
@@ -870,7 +870,7 @@ void rct2_exit_reason(rct_string_id title, rct_string_id body){
*/
void rct2_exit()
{
- RCT2_CALLPROC_EBPSAFE(0x006E3879);
+ audio_close();
//Post quit message does not work in 0x6e3879 as its windows only.
openrct2_finish();
}
@@ -892,7 +892,7 @@ void game_load_or_quit_no_save_prompt()
game_do_command(0, 1, 0, 1, GAME_COMMAND_LOAD_OR_QUIT, 0, 0);
tool_cancel();
if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_5) {
- RCT2_CALLPROC_EBPSAFE(0x0040705E);
+ // RCT2_CALLPROC_EBPSAFE(0x0040705E); Function not required resets cursor position.
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_5;
}
gGameSpeed = 1;
@@ -909,8 +909,8 @@ static uint32 game_do_command_table[58] = {
0,
0x0066397F,
0,
- 0x006C511D,
- 0x006C5B69,
+ 0,
+ 0,
0,
0x006B3F0F,
0,
@@ -934,7 +934,7 @@ static uint32 game_do_command_table[58] = {
0x0068BC01,
0,
0,
- 0x006C5AE9,
+ 0,
0, // use new_game_command_table, original: 0x006BEFA1, 29
0, // 30
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,
@@ -997,7 +997,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = {
game_command_emptysub,
game_command_raise_water,
game_command_lower_water,
- game_command_emptysub,
+ game_command_set_brakes_speed,
game_command_hire_new_staff_member, //game_command_emptysub,
game_command_set_staff_patrol, // 30
game_command_fire_staff_member,
@@ -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..b5df70cc6b 100644
--- a/src/game.h
+++ b/src/game.h
@@ -27,17 +27,17 @@ 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,
+ GAME_COMMAND_DEMOLISH_RIDE,
GAME_COMMAND_SET_RIDE_STATUS, // 8
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,
@@ -52,7 +52,7 @@ enum GAME_COMMAND {
GAME_COMMAND_EDIT_LAND_SMOOTH,
GAME_COMMAND_RAISE_WATER,
GAME_COMMAND_LOWER_WATER,
- GAME_COMMAND_28,
+ GAME_COMMAND_SET_BRAKES_SPEED,
GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, // 29
GAME_COMMAND_SET_STAFF_PATROL, //30
GAME_COMMAND_FIRE_STAFF_MEMBER, // 31
@@ -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/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c
index c2e65483c2..d0382709c7 100644
--- a/src/interface/keyboard_shortcut.c
+++ b/src/interface/keyboard_shortcut.c
@@ -228,6 +228,25 @@ static void shortcut_remove_vertical_land_toggle()
toggle_view_flag(VIEWPORT_FLAG_HIDE_VERTICAL);
}
+static void shortcut_remove_top_bottom_toolbar_toggle()
+{
+ if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO)
+ return;
+
+ if (window_find_by_class(WC_TOP_TOOLBAR) != NULL) {
+ window_close(window_find_by_class(WC_TOP_TOOLBAR));
+ window_close(window_find_by_class(WC_BOTTOM_TOOLBAR));
+ } else {
+ if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == 0) {
+ window_top_toolbar_open();
+ window_game_bottom_toolbar_open();
+ } else {
+ window_top_toolbar_open();
+ window_editor_bottom_toolbar_open();
+ }
+ }
+}
+
static void shortcut_see_through_rides_toggle()
{
toggle_view_flag(VIEWPORT_FLAG_SEETHROUGH_RIDES);
@@ -484,9 +503,12 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = {
shortcut_show_recent_messages,
shortcut_show_map,
shortcut_screenshot,
+
+ //new
shortcut_reduce_game_speed,
shortcut_increase_game_speed,
- shortcut_open_cheat_window
+ shortcut_open_cheat_window,
+ shortcut_remove_top_bottom_toolbar_toggle,
};
#pragma endregion
diff --git a/src/interface/themes.c b/src/interface/themes.c
index 2fe2d20e6e..f10aa752f7 100644
--- a/src/interface/themes.c
+++ b/src/interface/themes.c
@@ -198,6 +198,7 @@ void theme_create_preset(int duplicate, const char *name)
for (int i = 0; i < (int)gNumThemeWindows; i++) {
gConfigThemes.presets[preset].windows[i] = gConfigThemes.presets[duplicate].windows[i];
}
+ gConfigThemes.presets[preset].features = gConfigThemes.presets[duplicate].features;
themes_save_preset(preset);
theme_change_preset(preset);
}
diff --git a/src/interface/viewport.h b/src/interface/viewport.h
index 429b91602e..62cfa47c7f 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/localisation.c b/src/localisation/localisation.c
index 2a950495bf..db22c239fd 100644
--- a/src/localisation/localisation.c
+++ b/src/localisation/localisation.c
@@ -664,6 +664,24 @@ void format_string_raw(char *dest, char *src, void *args)
format_string_part_from_raw(&dest, src, (char**)&args);
}
+/**
+ * Writes a formatted string to a buffer and converts it to upper case.
+ * rct2: 0x006C2538
+ * dest (edi)
+ * format (ax)
+ * args (ecx)
+ */
+void format_string_to_upper(char *dest, rct_string_id format, void *args)
+{
+ format_string(dest, format, args);
+
+ char *ch = dest;
+ while (*ch != 0) {
+ *ch = toupper(*ch);
+ ch++;
+ }
+}
+
/**
* rct2: 0x006E37F7
* error (eax)
diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h
index c7bee7a75c..9d7a8e7f42 100644
--- a/src/localisation/localisation.h
+++ b/src/localisation/localisation.h
@@ -28,6 +28,7 @@
void format_string(char *dest, rct_string_id format, void *args);
void format_string_raw(char *dest, char *src, void *args);
+void format_string_to_upper(char *dest, rct_string_id format, void *args);
void generate_string_file();
void error_string_quit(int error, rct_string_id format);
int get_string_length(char* buffer);
diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h
index 46999df8df..aa6125e82a 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,
@@ -991,11 +1146,52 @@ enum {
STR_REAL_NAME_TIP = 2488,
STR_HOTKEY = 2489,
- STR_SHORTCUT_DESCRIPTION_0 = 2493,
+ STR_SHORTCUT_CLOSE_TOP_MOST_WINDOW = 2493,
+ STR_SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS = 2494,
+ STR_SHORTCUT_CANCEL_CONSTRUCTION_MODE = 2495,
+ STR_SHORTCUT_PAUSE_GAME = 2496,
+ STR_SHORTCUT_ZOOM_VIEW_OUT = 2497,
+ STR_SHORTCUT_ZOOM_VIEW_IN = 2498,
+ STR_SHORTCUT_ROTATE_VIEW = 2499,
+ STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT = 2500,
+ STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE = 2501,
+ STR_SHORTCUT_REMOVE_BASE_LAND_TOGGLE = 2502,
+ STR_SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE = 2503,
+ STR_SHORTCUT_SEE_THROUGH_RIDES_TOGGLE = 2504,
+ STR_SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE = 2505,
+ STR_SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE = 2506,
+ STR_SHORTCUT_INVISIBLE_PEOPLE_TOGGLE = 2507,
+ STR_SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE = 2508,
+ STR_SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE = 2509,
+ STR_SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE = 2510,
+ STR_SHORTCUT_ADJUST_LAND = 2511,
+ STR_SHORTCUT_ADJUST_WATER = 2512,
+ STR_SHORTCUT_BUILD_SCENERY = 2513,
+ STR_SHORTCUT_BUILD_PATHS = 2514,
+ STR_SHORTCUT_BUILD_NEW_RIDE = 2515,
+ STR_SHORTCUT_SHOW_FINANCIAL_INFORMATION = 2516,
+ STR_SHORTCUT_SHOW_RESEARCH_INFORMATION = 2517,
+ STR_SHORTCUT_SHOW_RIDES_LIST = 2518,
+ STR_SHORTCUT_SHOW_PARK_INFORMATION = 2519,
+ STR_SHORTCUT_SHOW_GUEST_LIST = 2520,
+ STR_SHORTCUT_SHOW_STAFF_LIST = 2521,
+ STR_SHORTCUT_SHOW_RECENT_MESSAGES = 2522,
+ STR_SHORTCUT_SHOW_MAP = 2523,
+ STR_SHORTCUT_SCREENSHOT = 2524,
- 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,
@@ -1221,6 +1417,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,
@@ -1551,6 +1750,16 @@ enum {
STR_UP = 5375,
STR_DOWN = 5376,
+ STR_FORCE_PARK_RATING = 5442,
+
+ STR_OBJECTS_SORT_TYPE = 5447,
+ STR_OBJECTS_SORT_RIDE = 5448,
+
+ STR_SHORTCUT_REDUCE_GAME_SPEED = 5449,
+ STR_SHORTCUT_INCREASE_GAME_SPEED = 5450,
+ STR_SHORTCUT_OPEN_CHEATS_WINDOW = 5451,
+ STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS = 5452,
+
// 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 add50ce5fe..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)
@@ -623,27 +633,12 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp
// 0x6DEB0D
if (!(rideVehicleEntry->var_12 & 0x400)){
- int ecx = cur_vehicle_images_offset - rideVehicleEntry->base_image_id;
+ int num_images = cur_vehicle_images_offset - rideVehicleEntry->base_image_id;
if (rideVehicleEntry->var_12 & 0x2000){
- ecx *= 2;
+ num_images *= 2;
}
- int bl, bh, eax = 0;
- {
- int ebx = rideVehicleEntry->base_image_id;
- int edx = 0, esi = 0, ebp = 0, edi = 0;
- RCT2_CALLFUNC_X(0x6847BA, &eax, &ebx, &ecx, &edx, &esi, &ebp, &edi);
- bl = ebx & 0xFF;
- bh = (ebx >> 8) & 0xFF;
- }
-
- if (rideVehicleEntry->var_12 & 0x2000){
- bl += 16;
- }
-
- rideVehicleEntry->var_0E = eax & 0xFF;
- rideVehicleEntry->var_0F = bl;
- rideVehicleEntry->var_10 = bh;
+ set_vehicle_type_image_max_sizes(rideVehicleEntry, num_images);
}
uint8 no_positions = *peep_loading_positions++;
@@ -1598,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 0b79db46ba..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"
@@ -277,6 +278,7 @@ void object_list_load()
uint32 fileCount = 0;
uint32 objectCount = 0;
uint32 current_item_offset = 0;
+ uint32 next_offset = 0;
RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32) = 0;
log_verbose("building cache of available objects...");
@@ -318,10 +320,13 @@ void object_list_load()
rct_object_entry* installed_entry = (rct_object_entry*)(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, uint8*) + current_item_offset);
rct_object_filters filter;
- current_item_offset += install_object_entry(&entry, installed_entry, enumFileInfo.path, &filter);
- _installedObjectFilters[objectCount] = filter;
+ next_offset = install_object_entry(&entry, installed_entry, enumFileInfo.path, &filter);
+ if (next_offset) {
+ current_item_offset += next_offset;
- objectCount++;
+ _installedObjectFilters[objectCount] = filter;
+ objectCount++;
+ }
}
platform_enumerate_files_end(enumFileHandle);
}
@@ -572,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();
}
@@ -723,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;
}
}
@@ -734,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.
@@ -784,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/peep/peep.c b/src/peep/peep.c
index adb41accf4..67551e3d4d 100644
--- a/src/peep/peep.c
+++ b/src/peep/peep.c
@@ -23,6 +23,7 @@
#include "../audio/mixer.h"
#include "../interface/window.h"
#include "../localisation/localisation.h"
+#include "../management/finance.h"
#include "../management/news_item.h"
#include "../ride/ride.h"
#include "../scenario.h"
@@ -42,6 +43,7 @@ static int peep_empty_container_extra_flag(rct_peep* peep);
static int peep_should_find_bench(rct_peep* peep);
static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type);
static void sub_693BAB(rct_peep* peep);
+static void peep_spend_money(rct_peep *peep, money32 amount);
const char *gPeepEasterEggNames[] = {
"MICHAEL SCHUMACHER",
@@ -163,7 +165,7 @@ void sub_693B58(rct_peep* peep){
}
/* 0x00693BE5 */
-static void sub_693BE5(rct_peep* peep, uint8 al){
+void sub_693BE5(rct_peep* peep, uint8 al){
if (al == peep->var_6D)return;
peep->var_6D = al;
@@ -344,10 +346,9 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep
peep->var_45 |= (1 << 2);
// Create sick at location
- RCT2_CALLPROC_X(0x67375D, peep->x, peep->sprite_direction, peep->y, peep->z, 0, 0, peep->sprite_index & 1);
-
- int sound_id = (scenario_rand() & 3) + 24;
+ litter_create(peep->x, peep->y, peep->z, peep->sprite_direction, peep->sprite_index & 1);
+ int sound_id = SOUND_COUGH_1 + (scenario_rand() & 3);
sound_play_panned(sound_id, 0x8001, peep->x, peep->y, peep->z);
invalidate_sprite((rct_sprite*)peep);
@@ -1369,8 +1370,7 @@ static void peep_update_ride_sub_state_2_enter_ride(rct_peep* peep, rct_ride* ri
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME;
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 20;
RCT2_GLOBAL(0xF1AEC0, uint32) = 230;
-
- RCT2_CALLPROC_X(0x0069926C, 0, ride->price, 0, 0, (int)peep, 0, 0);
+ peep_spend_money(peep, ride->price);
}
}
@@ -3485,7 +3485,7 @@ static void peep_update_using_bin(rct_peep* peep){
x = peep->x + (scenario_rand() & 7) - 3;
y = peep->y + (scenario_rand() & 7) - 3;
- RCT2_CALLPROC_X(0x67375D, x, scenario_rand() & 3, y, peep->z, 0, 0, bp);
+ litter_create(x, y, peep->z, scenario_rand() & 3, bp);
peep->item_standard_flags &= ~(1 << cur_container);
peep->var_45 |= 8;
@@ -3516,7 +3516,7 @@ static void peep_update_using_bin(rct_peep* peep){
x = peep->x + (scenario_rand() & 7) - 3;
y = peep->y + (scenario_rand() & 7) - 3;
- RCT2_CALLPROC_X(0x67375D, x, scenario_rand() & 3, y, peep->z, 0, 0, bp);
+ litter_create(x, y, peep->z, scenario_rand() & 3, bp);
peep->item_extra_flags &= ~(1 << cur_container);
peep->var_45 |= 8;
@@ -4021,7 +4021,7 @@ static void peep_update_walking(rct_peep* peep){
int y = peep->y + (scenario_rand() & 0x7) - 3;
int direction = (scenario_rand() & 0x3);
- RCT2_CALLPROC_X(0x67375D, x, direction, y, peep->z, 0, 0, ebp);
+ litter_create(x, y, peep->z, direction, ebp);
}
}
}
@@ -4053,7 +4053,7 @@ static void peep_update_walking(rct_peep* peep){
int y = peep->y + (scenario_rand() & 0x7) - 3;
int direction = (scenario_rand() & 0x3);
- RCT2_CALLPROC_X(0x67375D, x, direction, y, peep->z, 0, 0, bp);
+ litter_create(x, y, peep->z, direction, bp);
}
}
@@ -5311,3 +5311,24 @@ void sub_693BAB(rct_peep* peep) {
}
}
+/**
+ *
+ * rct2: 0x0069926C
+ */
+static void peep_spend_money(rct_peep *peep, money32 amount)
+{
+ if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)
+ return;
+
+ peep->cash_in_pocket = max(0, peep->cash_in_pocket - amount);
+ peep->cash_spent += amount;
+ if (RCT2_GLOBAL(0x00F1AEC0, uint32) == 0xFFFFFFFF) {
+ RCT2_GLOBAL(peep + RCT2_GLOBAL(0x00F1AEC0, uint32), money16) += (money16)amount;
+ }
+ window_invalidate_by_number(WC_PEEP, peep->sprite_index);
+
+ RCT2_GLOBAL(0x00141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8);
+ finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint32));
+
+ sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z);
+}
\ No newline at end of file
diff --git a/src/peep/peep.h b/src/peep/peep.h
index 704914342e..28875d2bfd 100644
--- a/src/peep/peep.h
+++ b/src/peep/peep.h
@@ -591,4 +591,6 @@ void sub_693B58(rct_peep* peep);
void remove_peep_from_ride(rct_peep* peep);
void remove_peep_from_queue(rct_peep* peep);
+void sub_693BE5(rct_peep* peep, uint8 al);
+
#endif
diff --git a/src/platform/shared.c b/src/platform/shared.c
index a0a929c8b4..77418e2137 100644
--- a/src/platform/shared.c
+++ b/src/platform/shared.c
@@ -646,6 +646,7 @@ void platform_set_fullscreen_mode(int mode)
*/
void platform_set_cursor(char cursor)
{
+ RCT2_GLOBAL(RCT2_ADDRESS_CURENT_CURSOR, uint8) = cursor;
SDL_SetCursor(_cursors[cursor]);
}
/**
diff --git a/src/platform/windows.c b/src/platform/windows.c
index e478b0ea34..f04b8745cb 100644
--- a/src/platform/windows.c
+++ b/src/platform/windows.c
@@ -676,9 +676,13 @@ uint16 platform_get_locale_language(){
}
time_t platform_file_get_modified_time(char* path){
- struct _stat stat;
- _stat(path, &stat);
- return stat.st_mtime;
+ WIN32_FILE_ATTRIBUTE_DATA data;
+ if (!GetFileAttributesEx(path, GetFileExInfoStandard, &data))
+ return 0;
+ ULARGE_INTEGER ull;
+ ull.LowPart = data.ftLastWriteTime.dwLowDateTime;
+ ull.HighPart = data.ftLastWriteTime.dwHighDateTime;
+ return ull.QuadPart / 10000000ULL - 11644473600ULL;
}
uint8 platform_get_locale_currency(){
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 ace0989439..f5a3338891 100644
--- a/src/ride/ride.c
+++ b/src/ride/ride.c
@@ -37,6 +37,7 @@
#include "../util/util.h"
#include "../windows/error.h"
#include "../world/banner.h"
+#include "../world/footpath.h"
#include "../world/map.h"
#include "../world/sprite.h"
#include "ride.h"
@@ -138,6 +139,7 @@ void ride_prepare_breakdown(int rideIndex, int breakdownReason);
static void ride_shop_connected(rct_ride* ride, int ride_idx);
static void ride_spiral_slide_update(rct_ride *ride);
static void ride_update(int rideIndex);
+static void sub_6B59C6(int rideIndex);
rct_ride_type *ride_get_entry(rct_ride *ride)
{
@@ -328,7 +330,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 +341,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 +396,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 +573,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 +633,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
@@ -766,7 +786,7 @@ void ride_remove_peeps(int rideIndex)
invalidate_sprite((rct_sprite*)peep);
peep->state = PEEP_STATE_FALLING;
- RCT2_CALLPROC_X(0x00693BE5, 0, 0, 0, 0, (int)peep, 0, 0);
+ sub_693BE5(peep, 0);
peep->happiness = min(peep->happiness, peep->happiness_growth_rate) / 2;
peep->happiness_growth_rate = peep->happiness;
@@ -779,7 +799,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 +812,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 +861,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 +885,332 @@ 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);
+ 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;
@@ -3130,7 +3334,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *
switch (setting){
case 0:
- RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0);
+ sub_6B59C6(ride_id);
ride_clear_for_construction(ride_id);
ride_remove_peeps(ride_id);
@@ -3172,7 +3376,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *
ride->min_waiting_time = min(new_value, ride->min_waiting_time);
break;
case 4:
- RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0);
+ sub_6B59C6(ride_id);
ride->time_limit = new_value;
break;
case 5:
@@ -3193,13 +3397,13 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *
case 8:
if (new_value != ride->lift_hill_speed){
ride->lift_hill_speed = new_value;
- RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0);
+ sub_6B59C6(ride_id);
}
break;
case 9:
if (new_value != ride->num_circuits){
ride->num_circuits = new_value;
- RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0);
+ sub_6B59C6(ride_id);
}
break;
}
@@ -3322,7 +3526,28 @@ int ride_check_for_entrance_exit(int rideIndex)
*/
void sub_6B5952(int rideIndex)
{
- RCT2_CALLPROC_X(0x006B5952, 0, 0, 0, rideIndex, 0, 0, 0);
+ rct_ride *ride = GET_RIDE(rideIndex);
+
+ for (int i = 0; i < 4; i++) {
+ uint16 xy = ride->entrances[i];
+ if (xy == 0xFFFF)
+ continue;
+
+ int x = xy & 0xFF;
+ int y = xy >> 8;
+ int z = ride->station_heights[i];
+
+ rct_map_element *mapElement = map_get_first_element_at(x, y);
+ do {
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE)
+ continue;
+ if (mapElement->base_height != z)
+ continue;
+
+ int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK;
+ sub_6A742F(rideIndex, i, x, y, mapElement, direction ^ 2);
+ } while (map_element_is_last_for_tile(mapElement++));
+ }
}
/**
@@ -3339,12 +3564,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 +3727,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 +4316,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;
@@ -4104,6 +4329,30 @@ int ride_get_refund_price(int ride_id)
return RCT2_GLOBAL(0x00F4413A, int);
}
+/**
+ *
+ * rct2: 0x00696707
+ */
+static void ride_stop_peeps_queuing(int rideIndex)
+{
+ uint16 spriteIndex;
+ rct_peep *peep;
+
+ FOR_ALL_PEEPS(spriteIndex, peep) {
+ if (peep->state != PEEP_STATE_QUEUING)
+ continue;
+ if (peep->current_ride != rideIndex)
+ continue;
+
+ remove_peep_from_queue(peep);
+ peep_decrement_num_riders(peep);
+
+ peep->state = PEEP_STATE_FALLING;
+
+ peep_window_state_update(peep);
+ }
+}
+
/**
*
* rct2: 0x006B49D9
@@ -4145,7 +4394,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi
}
ride_clear_for_construction(ride_id);
ride_remove_peeps(ride_id);
- RCT2_CALLPROC_X(0x00696707, 0, 0, 0, ride_id, 0, 0, 0);
+ ride_stop_peeps_queuing(ride_id);
*ebx = ride_get_refund_price(ride_id);
RCT2_CALLPROC_X(0x006CB945, 0, 0, 0, ride_id, 0, 0, 0);
@@ -4508,3 +4757,253 @@ void ride_all_has_any_track_elements(bool *rideIndexArray)
rideIndexArray[it.element->properties.track.ride_index] = true;
}
}
+
+/* rct2: 0x006847BA */
+void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images){
+ char bitmap[200][200] = { 0 };
+
+ rct_drawpixelinfo dpi = {
+ .bits = (char*)bitmap,
+ .x = -100,
+ .y = -100,
+ .width = 200,
+ .height = 200,
+ .pitch = 0,
+ .zoom_level = 0
+ };
+
+ for (int i = 0; i < num_images; ++i){
+ gfx_draw_sprite(&dpi, vehicle_type->base_image_id + i, 0, 0, 0);
+ }
+ int al = -1;
+ for (int i = 99; i != 0; --i){
+ for (int j = 0; j < 200; j++){
+ if (bitmap[j][100 - i] != 0){
+ al = i;
+ break;
+ }
+ }
+
+ if (al != -1)
+ break;
+
+ for (int j = 0; j < 200; j++){
+ if (bitmap[j][100 + i] != 0){
+ al = i;
+ break;
+ }
+ }
+
+ if (al != -1)
+ break;
+ }
+
+ al++;
+ int bl = -1;
+
+ for (int i = 99; i != 0; --i){
+ for (int j = 0; j < 200; j++){
+ if (bitmap[100 - i][j] != 0){
+ bl = i;
+ break;
+ }
+ }
+
+ if (bl != -1)
+ break;
+ }
+ bl++;
+
+ int bh = -1;
+
+ for (int i = 99; i != 0; --i){
+ for (int j = 0; j < 200; j++){
+ if (bitmap[100 + i][j] != 0){
+ bh = i;
+ break;
+ }
+ }
+
+ if (bh != -1)
+ break;
+ }
+ bh++;
+
+ // Moved from object paint
+
+ if (vehicle_type->var_12 & 0x2000){
+ bl += 16;
+ }
+
+ 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;
+}
+
+/**
+ *
+ * rct2: 0x006B59C6
+ */
+static void sub_6B59C6(int rideIndex)
+{
+ rct_ride *ride = GET_RIDE(rideIndex);
+
+ ride_measurement_clear(ride);
+ ride->excitement = 0xFFFF;
+ ride->lifecycle_flags &= ~RIDE_LIFECYCLE_TESTED;
+ ride->lifecycle_flags &= ~RIDE_LIFECYCLE_TEST_IN_PROGRESS;
+ if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) {
+ for (int i = 0; i < ride->num_vehicles; i++) {
+ uint16 spriteIndex = ride->vehicles[i];
+ if (spriteIndex != SPRITE_INDEX_NULL) {
+ rct_vehicle *vehicle = &(g_sprite_list[spriteIndex].vehicle);
+ vehicle->var_48 &= ~(1 << 5);
+ }
+ }
+ }
+ window_invalidate_by_number(WC_RIDE, rideIndex);
+}
+
+/**
+ *
+ * rct2: 0x006B7481
+ */
+void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor)
+{
+ rct_ride *ride = GET_RIDE(rideIndex);
+
+ ride->lifecycle_flags &= ~RIDE_LIFECYCLE_BREAKDOWN_PENDING;
+ ride->lifecycle_flags &= ~RIDE_LIFECYCLE_BROKEN_DOWN;
+ ride->lifecycle_flags &= ~RIDE_LIFECYCLE_DUE_INSPECTION;
+ ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_CUSTOMER;
+
+ if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) {
+ rct_vehicle *vehicle;
+ uint16 spriteIndex;
+
+ for (int i = 0; i < ride->num_vehicles; i++) {
+ spriteIndex = ride->vehicles[i];
+ while (spriteIndex != SPRITE_INDEX_NULL) {
+ vehicle = &(g_sprite_list[spriteIndex].vehicle);
+ vehicle->var_48 &= ~(1 << 7);
+ vehicle->var_48 &= ~(1 << 8);
+ vehicle->var_48 &= ~(1 << 9);
+ spriteIndex = vehicle->next_vehicle_on_train;
+ }
+ }
+ }
+
+ uint8 unreliability = 100 - ((ride->reliability >> 8) & 0xFF);
+ ride->reliability += reliabilityIncreaseFactor * (unreliability / 2);
+}
diff --git a/src/ride/ride.h b/src/ride/ride.h
index 923a4e540c..143e654899 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);
@@ -826,6 +887,10 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi
void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
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);
@@ -851,4 +916,25 @@ 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);
+void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor);
+
#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..06ca30f6ee 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);
@@ -1489,7 +1491,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac
}
if (RCT2_GLOBAL(0x00F440D4, uint8) == 6){
- game_do_command(0, 0x69, 0, rideIndex, GAME_COMMAND_7, 0, 0);
+ game_do_command(0, 0x69, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0);
}
RCT2_GLOBAL(0x00F44142, sint16) = x;
@@ -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){
@@ -2223,7 +2225,6 @@ rct_track_design *track_get_info(int index, uint8** preview)
memcpy(&trackDesign->track_td6, loaded_track, sizeof(rct_track_td6));
// Load in a new preview image, calculate cost variable, calculate var_06
draw_track_preview((uint8**)trackDesign->preview);
- //RCT2_CALLPROC_X(0x006D1EF0, 0, 0, 0, 0, 0, (int)&trackDesign->preview, 0);
trackDesign->track_td6.cost = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_COST, money32);
trackDesign->track_td6.track_flags = RCT2_GLOBAL(0x00F44151, uint8) & 7;
@@ -2617,10 +2618,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 +2631,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 +2729,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 +3171,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;
@@ -3245,7 +3241,7 @@ void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi,
if (cost == MONEY32_UNDEFINED ||
!(flags & GAME_COMMAND_FLAG_APPLY)){
rct_string_id error_reason = RCT2_GLOBAL(0x00141E9AC, rct_string_id);
- game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, rideIndex, GAME_COMMAND_7, 0, 0);
+ game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0);
*ebx = cost;
RCT2_GLOBAL(0x00141E9AC, rct_string_id) = error_reason;
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0;
@@ -3432,3 +3428,77 @@ 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);
+}
+
+/**
+ *
+ * rct2: 0x006C5AE9
+ */
+void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp)
+{
+ rct_map_element *mapElement;
+ int x, y, z, trackType, brakesSpeed;
+
+ x = (*eax & 0xFFFF);
+ y = (*ecx & 0xFFFF);
+ z = (*edi & 0xFFFF);
+ trackType = (*edx & 0xFF);
+ brakesSpeed = ((*ebx >> 8) & 0xFF);
+
+ RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0;
+ RCT2_GLOBAL(0x009DEA5E, uint8) = x + 16;
+ RCT2_GLOBAL(0x009DEA60, uint8) = y + 16;
+ RCT2_GLOBAL(0x009DEA62, uint8) = z;
+
+ if (*ebx & GAME_COMMAND_FLAG_APPLY) {
+ *ebx = 0;
+ return;
+ }
+
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (mapElement->base_height * 8 != z)
+ continue;
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK)
+ continue;
+ if (mapElement->properties.track.type != trackType)
+ continue;
+
+ mapElement->properties.track.sequence =
+ (mapElement->properties.track.sequence & 0x0F) |
+ ((brakesSpeed >> 1) << 4);
+
+ break;
+ } while (!map_element_is_last_for_tile(mapElement++));
+
+ *ebx = 0;
+}
\ No newline at end of file
diff --git a/src/ride/track.h b/src/ride/track.h
index dc5e8acb64..39c05890c7 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,16 @@ 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);
+void game_command_set_brakes_speed(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/scenario.h b/src/scenario.h
index 9f5aa3f5a8..7fc1878d1a 100644
--- a/src/scenario.h
+++ b/src/scenario.h
@@ -134,9 +134,10 @@ typedef struct {
uint16 sprites_start_litter;
uint8 pad_013573C6[2];
uint16 word_013573C8;
- uint8 pad_013573CA[4];
- uint16 word_013573CE;
- uint16 word_013573D0;
+ uint16 sprites_count_vehicle;
+ uint16 sprites_count_peep;
+ uint16 sprites_count_misc;
+ uint16 sprites_count_litter;
uint8 pad_013573D2[2];
rct_string_id park_name;
uint8 pad_013573D6[2];
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/cheats.c b/src/windows/cheats.c
index 2d00ef2203..52f1a38702 100644
--- a/src/windows/cheats.c
+++ b/src/windows/cheats.c
@@ -40,6 +40,8 @@
#define CHEATS_MONEY_INCREMENT MONEY(5000,00)
#define CHEATS_TRAM_INCREMENT 250
+#define CHEATS_PARK_RATING_SPINNER_PAUSE 20
+
enum {
WINDOW_CHEATS_PAGE_MONEY,
WINDOW_CHEATS_PAGE_GUESTS,
@@ -96,6 +98,10 @@ enum WINDOW_CHEATS_WIDGET_IDX {
WIDX_FAST_STAFF,
WIDX_NORMAL_STAFF,
WIDX_PARK_PARAMETERS,
+ WIDX_FORCE_PARK_RATING,
+ WIDX_PARK_RATING_SPINNER,
+ WIDX_INCREASE_PARK_RATING,
+ WIDX_DECREASE_PARK_RATING,
WIDX_RENEW_RIDES = 8,
WIDX_REMOVE_SIX_FLAGS,
WIDX_MAKE_DESTRUCTIBLE,
@@ -214,6 +220,10 @@ static rct_widget window_cheats_misc_widgets[] = {
{ WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_FAST, STR_NONE }, // fast staff
{ WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_NORMAL, STR_NONE }, // normal staff
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(7), HPL(7), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_TIP_PARK_PARAMETERS}, // Park parameters
+ { WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(8), HPL(8), STR_FORCE_PARK_RATING, STR_NONE}, // Force park rating
+ { WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(8) + 2, HPL(8) - 3, STR_NONE, STR_NONE }, // park rating
+ { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(8) + 3, YPL(8) + 7, STR_NUMERIC_UP, STR_NONE }, // increase rating
+ { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(8) + 8, YPL(8) + 12, STR_NUMERIC_DOWN, STR_NONE }, // decrease rating
{ WIDGETS_END },
};
static rct_widget window_cheats_rides_widgets[] = {
@@ -384,7 +394,7 @@ static void* window_cheats_page_events[] = {
static uint32 window_cheats_page_enabled_widgets[] = {
(1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_CLEAR_LOAN),
(1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_GUEST_HAPPINESS_MAX) | (1 << WIDX_GUEST_HAPPINESS_MIN) | (1 << WIDX_GUEST_ENERGY_MAX) | (1 << WIDX_GUEST_ENERGY_MIN) | (1 << WIDX_GUEST_HUNGER_MAX) | (1 << WIDX_GUEST_HUNGER_MIN) | (1 << WIDX_GUEST_THIRST_MAX) | (1 << WIDX_GUEST_THIRST_MIN) | (1 << WIDX_GUEST_NAUSEA_MAX) | (1 << WIDX_GUEST_NAUSEA_MIN) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1 << WIDX_GUEST_BATHROOM_MAX) | (1 << WIDX_GUEST_BATHROOM_MIN) | (1 << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1 << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1 << WIDX_TRAM_GUESTS) | (1 << WIDX_REMOVE_ALL_GUESTS) | (1 << WIDX_EXPLODE_GUESTS) | (1 << WIDX_GIVE_GUESTS_PARK_MAPS) | (1 << WIDX_GIVE_GUESTS_BALLOONS) | (1 << WIDX_GIVE_GUESTS_UMBRELLAS),
- (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF) | (1 << WIDX_PARK_PARAMETERS),
+ (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF) | (1 << WIDX_PARK_PARAMETERS) | (1 << WIDX_FORCE_PARK_RATING) | (1 << WIDX_INCREASE_PARK_RATING) | (1 << WIDX_DECREASE_PARK_RATING),
(1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) | (1 << WIDX_RESET_CRASH_STATUS)
};
@@ -397,6 +407,9 @@ static rct_string_id window_cheats_page_titles[] = {
static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w);
+int park_rating_spinner_value;
+int park_rating_spinner_pressed_for = 0;
+
#pragma region Cheat functions
static void cheat_set_grass_length(int length)
@@ -502,7 +515,7 @@ static void cheat_fix_rides()
remove_peep_from_ride(mechanic);
}
- RCT2_CALLPROC_X(0x006B7481, 0, 0, 0, rideIndex, 0, 0, 0);
+ ride_fix_breakdown(rideIndex, 0);
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST;
}
}
@@ -730,6 +743,7 @@ void window_cheats_open()
window->enabled_widgets = window_cheats_page_enabled_widgets[0];
window_init_scroll_widgets(window);
window_cheats_set_page(window, WINDOW_CHEATS_PAGE_MONEY);
+ park_rating_spinner_value = get_forced_park_rating() >= 0 ? get_forced_park_rating() : 999;
}
static void window_cheats_money_mouseup()
@@ -921,6 +935,25 @@ static void window_cheats_misc_mouseup()
case WIDX_PARK_PARAMETERS:
window_editor_scenario_options_open();
break;
+ case WIDX_FORCE_PARK_RATING:
+ if (get_forced_park_rating() >= 0){
+ set_forced_park_rating(-1);
+ } else {
+ set_forced_park_rating(park_rating_spinner_value);
+ }
+ break;
+ case WIDX_INCREASE_PARK_RATING:
+ park_rating_spinner_value = min(999, 10 * (park_rating_spinner_value / 10 + 1));
+ widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER);
+ if (get_forced_park_rating() >= 0)
+ set_forced_park_rating(park_rating_spinner_value);
+ break;
+ case WIDX_DECREASE_PARK_RATING:
+ park_rating_spinner_value = max(0, 10 * (park_rating_spinner_value / 10 - 1));
+ widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER);
+ if (get_forced_park_rating() >= 0)
+ set_forced_park_rating(park_rating_spinner_value);
+ break;
}
}
@@ -983,6 +1016,25 @@ static void window_cheats_update(rct_window *w)
{
w->frame_no++;
widget_invalidate(w, WIDX_TAB_1 + w->page);
+
+ if (widget_is_pressed(w, WIDX_INCREASE_PARK_RATING) || widget_is_pressed(w, WIDX_DECREASE_PARK_RATING))
+ park_rating_spinner_pressed_for++;
+ else
+ park_rating_spinner_pressed_for = 0;
+ if (park_rating_spinner_pressed_for >= CHEATS_PARK_RATING_SPINNER_PAUSE)
+ if (!(w->frame_no % 3)){
+ if (widget_is_pressed(w, WIDX_INCREASE_PARK_RATING)){
+ park_rating_spinner_value = min(999, 10 * (park_rating_spinner_value / 10 + 1));
+ widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER);
+ if (get_forced_park_rating() >= 0)
+ set_forced_park_rating(park_rating_spinner_value);
+ } else if (widget_is_pressed(w, WIDX_DECREASE_PARK_RATING)){
+ park_rating_spinner_value = max(0, 10 * (park_rating_spinner_value / 10 - 1));
+ widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER);
+ if (get_forced_park_rating() >= 0)
+ set_forced_park_rating(park_rating_spinner_value);
+ }
+ }
}
static void window_cheats_invalidate()
@@ -1006,6 +1058,7 @@ static void window_cheats_invalidate()
w->widgets[WIDX_OPEN_CLOSE_PARK].image = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN ?
STR_CHEAT_CLOSE_PARK : STR_CHEAT_OPEN_PARK;
widget_set_checkbox_value(w, WIDX_UNLOCK_ALL_PRICES, gConfigCheat.unlock_all_prices);
+ widget_set_checkbox_value(w, WIDX_FORCE_PARK_RATING, get_forced_park_rating() >= 0);
break;
case WINDOW_CHEATS_PAGE_RIDES:
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = 255;
@@ -1041,6 +1094,7 @@ static void window_cheats_paint()
}
else if(w->page == WINDOW_CHEATS_PAGE_MISC){
gfx_draw_string_left(dpi, STR_CHEAT_STAFF_SPEED, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(6) + TXTO);
+ gfx_draw_string_right(dpi, 5182, &park_rating_spinner_value, w->colours[2], w->x + WPL(1) - 10 - TXTO, w->y + YPL(8) + TXTO);
}
else if (w->page == WINDOW_CHEATS_PAGE_GUESTS){
gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HAPPINESS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO);
diff --git a/src/windows/demolish_ride_prompt.c b/src/windows/demolish_ride_prompt.c
index ba62515caf..3ad481bc28 100644
--- a/src/windows/demolish_ride_prompt.c
+++ b/src/windows/demolish_ride_prompt.c
@@ -116,7 +116,7 @@ static void window_ride_demolish_mouseup(){
switch (widgetIndex){
case WIDX_DEMOLISH:
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_DEMOLISH_RIDE;
- game_do_command(0, 1, 0, w->number, GAME_COMMAND_7, 0, 0);
+ game_do_command(0, 1, 0, w->number, GAME_COMMAND_DEMOLISH_RIDE, 0, 0);
break;
case WIDX_CANCEL:
case WIDX_CLOSE:
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..d86e41ff3c 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,33 @@ 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;
+ width = middleOutsetWidget->right - middleOutsetWidget->left - 62;
+ 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 +636,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 +665,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..0a659f63b2
--- /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_DEMOLISH_RIDE, 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..f5adfefdb2 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 *properties);
+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 ride_construction_set_brakes_speed(int brakesSpeed);
+
+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,2974 @@ 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);
+ game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 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) ||
+ (
+ is_track_enabled(TRACK_HELIX_LARGE) &&
+ _currentTrackCurve != TRACK_CURVE_LEFT_SMALL &&
+ _currentTrackCurve != TRACK_CURVE_RIGHT_SMALL
+ )
+ ) &&
+ (
+ _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 *brakesSpeedPtr = (uint8*)0x00F440CD;
+ uint8 maxBrakesSpeed = 30;
+ if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) {
+ brakesSpeedPtr = (uint8*)0x00F440CE;
+ maxBrakesSpeed = RCT2_GLOBAL(0x0097CF40 + 6 + (ride->type * 8), uint8);
+ }
+ uint8 brakesSpeed = *brakesSpeedPtr + 2;
+ if (brakesSpeed <= maxBrakesSpeed) {
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ ride_construction_set_brakes_speed(brakesSpeed);
+ } else {
+ *brakesSpeedPtr = brakesSpeed;
+ 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 *brakesSpeedPtr = (uint8*)0x00F440CD;
+ if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) {
+ brakesSpeedPtr = (uint8*)0x00F440CE;
+ }
+ uint8 brakesSpeed = *brakesSpeedPtr - 2;
+ if (brakesSpeed >= 2) {
+ if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) {
+ ride_construction_set_brakes_speed(brakesSpeed);
+ } else {
+ *brakesSpeedPtr = brakesSpeed;
+ 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, properties;
+ 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, &properties)) {
+ 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 | (properties << 16),
+ 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 *properties)
+{
+ 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 (properties != NULL) *properties = (edi >> 16) & 0xFFFF;
+ 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) == TRACK_HELIX_SMALL ||
+ RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == TRACK_HELIX_LARGE
+ ) {
+ if (bank != _previousTrackBankEnd) {
+ if (_previousTrackBankEnd != TRACK_BANK_NONE)
+ 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 != TRACK_ELEM_TOWER_BASE || 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 ride_construction_set_brakes_speed(int brakesSpeed)
+{
+ 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 | ((brakesSpeed) << 8),
+ _currentTrackBeginY,
+ mapElement->properties.track.type,
+ GAME_COMMAND_SET_BRAKES_SPEED,
+ _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, properties, highestZ;
+ rct_window *w;
+
+ map_invalidate_map_selection_tiles();
+ sub_6C9627();
+
+ if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &properties))
+ 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/ride_list.c b/src/windows/ride_list.c
index c70fb45ac0..704946e326 100644
--- a/src/windows/ride_list.c
+++ b/src/windows/ride_list.c
@@ -615,6 +615,7 @@ static void window_ride_list_refresh_list(rct_window *w)
{
int i, countA, countB;
rct_ride *ride, *otherRide;
+ char *bufferA, *bufferB;
countA = countB = 0;
FOR_ALL_RIDES(i, ride) {
@@ -644,13 +645,13 @@ static void window_ride_list_refresh_list(rct_window *w)
int current_list_position = list_index;
switch (w->list_information_type) {
case INFORMATION_TYPE_STATUS:
- RCT2_GLOBAL(0x013CE952, uint32) = ride->name_arguments;
- RCT2_CALLPROC_X(0x006C2538, ride->name, 0, 0x013CE952, 0, 0, RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, 0);
+ bufferA = (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER;
+ bufferB = (char*)0x0141EF68;
+ format_string_to_upper(bufferA, ride->name, &ride->name_arguments);
while (--current_list_position >= 0) {
otherRide = &g_ride_list[w->list_item_positions[current_list_position]];
- RCT2_GLOBAL(0x013CE952, uint32) = otherRide->name_arguments;
- RCT2_CALLPROC_X(0x006C2538, otherRide->name, 0, 0x013CE952, 0, 0, 0x0141EF68, 0);
- if (strcmp((char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68) >= 0)
+ format_string_to_upper(bufferB, otherRide->name, &otherRide->name_arguments);
+ if (strcmp(bufferA, bufferB) >= 0)
break;
window_bubble_list_item(w, current_list_position);
diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c
index 24e6db0dd9..1accbd0c51 100644
--- a/src/windows/shortcut_keys.c
+++ b/src/windows/shortcut_keys.c
@@ -88,6 +88,45 @@ static void* window_shortcut_events[] = {
window_shortcut_scrollpaint
};
+const rct_string_id ShortcutStringIds[] = {
+ STR_SHORTCUT_CLOSE_TOP_MOST_WINDOW,
+ STR_SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS,
+ STR_SHORTCUT_CANCEL_CONSTRUCTION_MODE,
+ STR_SHORTCUT_PAUSE_GAME,
+ STR_SHORTCUT_ZOOM_VIEW_OUT,
+ STR_SHORTCUT_ZOOM_VIEW_IN,
+ STR_SHORTCUT_ROTATE_VIEW,
+ STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT,
+ STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE,
+ STR_SHORTCUT_REMOVE_BASE_LAND_TOGGLE,
+ STR_SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE,
+ STR_SHORTCUT_SEE_THROUGH_RIDES_TOGGLE,
+ STR_SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE,
+ STR_SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE,
+ STR_SHORTCUT_INVISIBLE_PEOPLE_TOGGLE,
+ STR_SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE,
+ STR_SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE,
+ STR_SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE,
+ STR_SHORTCUT_ADJUST_LAND,
+ STR_SHORTCUT_ADJUST_WATER,
+ STR_SHORTCUT_BUILD_SCENERY,
+ STR_SHORTCUT_BUILD_PATHS,
+ STR_SHORTCUT_BUILD_NEW_RIDE,
+ STR_SHORTCUT_SHOW_FINANCIAL_INFORMATION,
+ STR_SHORTCUT_SHOW_RESEARCH_INFORMATION,
+ STR_SHORTCUT_SHOW_RIDES_LIST,
+ STR_SHORTCUT_SHOW_PARK_INFORMATION,
+ STR_SHORTCUT_SHOW_GUEST_LIST,
+ STR_SHORTCUT_SHOW_STAFF_LIST,
+ STR_SHORTCUT_SHOW_RECENT_MESSAGES,
+ STR_SHORTCUT_SHOW_MAP,
+ STR_SHORTCUT_SCREENSHOT,
+ STR_SHORTCUT_REDUCE_GAME_SPEED,
+ STR_SHORTCUT_INCREASE_GAME_SPEED,
+ STR_SHORTCUT_OPEN_CHEATS_WINDOW,
+ STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS,
+};
+
/**
*
* rct2: 0x006E3884
@@ -106,7 +145,7 @@ void window_shortcut_keys_open()
w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RESET);
window_init_scroll_widgets(w);
- w->no_list_items = 32;
+ w->no_list_items = SHORTCUT_COUNT;
w->selected_list_item = -1;
}
@@ -176,7 +215,7 @@ static void window_shortcut_scrollgetsize()
window_get_register(w);
width = 0;
- height = 32 * 10;
+ height = w->no_list_items * 10;
window_scrollsize_set_registers(width, height);
}
@@ -244,7 +283,7 @@ static void window_shortcut_scrollpaint()
gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x2000031);
}
- RCT2_GLOBAL(0x13CE954, uint16) = i + STR_SHORTCUT_DESCRIPTION_0;
+ RCT2_GLOBAL(0x13CE954, uint16) = ShortcutStringIds[i];
RCT2_GLOBAL(0x13CE956, uint16) = 0;
RCT2_GLOBAL(0x13CE958, uint16) = 0;
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/footpath.h b/src/world/footpath.h
index 047773a653..2f943e8084 100644
--- a/src/world/footpath.h
+++ b/src/world/footpath.h
@@ -51,5 +51,6 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y,
void footpath_remove_litter(int x, int y, int z);
void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags);
void sub_6A759F();
+void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction);
#endif
diff --git a/src/world/map.c b/src/world/map.c
index fd40301cd3..17412bae0c 100644
--- a/src/world/map.c
+++ b/src/world/map.c
@@ -35,6 +35,7 @@
#include "scenery.h"
#include "../cheats.h"
#include "../config.h"
+#include "../cursors.h"
const rct_xy16 TileDirectionDelta[] = {
{ -32, 0 },
@@ -153,14 +154,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 +180,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;
@@ -2624,7 +2638,17 @@ int map_get_station(rct_map_element *mapElement)
*/
void map_element_remove(rct_map_element *mapElement)
{
- RCT2_CALLPROC_X(0x0068B280, 0, 0, 0, 0, (int)mapElement, 0, 0);
+ if (!map_element_is_last_for_tile(mapElement)){
+ do{
+ *mapElement = *(mapElement + 1);
+ } while (!map_element_is_last_for_tile(++mapElement));
+ }
+ (mapElement - 1)->flags |= MAP_ELEMENT_FLAG_LAST_TILE;
+ mapElement->base_height = 0xFF;
+
+ if ((mapElement + 1) == RCT2_GLOBAL(0x00140E9A4, rct_map_element*)){
+ RCT2_GLOBAL(0x00140E9A4, rct_map_element*)--;
+ }
}
/**
@@ -2712,7 +2736,36 @@ void map_invalidate_selection_rect()
*/
void map_reorganise_elements()
{
- RCT2_CALLPROC_EBPSAFE(0x0068B111);
+ platform_set_cursor(CURSOR_ZZZ);
+
+ rct_map_element* new_map_elements = rct2_malloc(0x30000 * sizeof(rct_map_element));
+ rct_map_element* new_elements_pointer = new_map_elements;
+
+ if (new_map_elements == NULL || new_map_elements == (rct_map_element*)-1){
+ error_string_quit(4370, 0xFFFF);
+ return;
+ }
+
+ rct_map_element **tile = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*);
+ for (int y = 0; y < 256; y++) {
+ for (int x = 0; x < 256; x++) {
+ rct_map_element *startElement = map_get_first_element_at(x, y);
+ rct_map_element *endElement = startElement;
+ while (!map_element_is_last_for_tile(endElement++));
+
+ uint8 num_bytes = (endElement - startElement) * sizeof(rct_map_element);
+ memcpy(new_elements_pointer, startElement, num_bytes);
+ new_elements_pointer += num_bytes / sizeof(rct_map_element);
+ }
+ }
+
+ uint32 num_elements = (new_elements_pointer - new_map_elements);
+ memcpy(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element), new_map_elements, num_elements * sizeof(rct_map_element));
+ memset(new_map_elements + num_elements, 0, (0x30000 - num_elements) * sizeof(rct_map_element));
+
+ rct2_free(new_map_elements);
+
+ map_update_tile_pointers();
}
/**
@@ -2721,7 +2774,23 @@ void map_reorganise_elements()
*/
int sub_68B044()
{
- return (RCT2_CALLPROC_X(0x0068B044, 0, 0, 0, 0, 0, 0, 0) & 0x100) == 0;
+ if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element))
+ return 1;
+
+ for (int i = 1000; i != 0; --i)
+ sub_68B089();
+
+ if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element))
+ return 1;
+
+ map_reorganise_elements();
+
+ if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element))
+ return 1;
+ else{
+ RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 894;
+ return 0;
+ }
}
/**
@@ -3061,3 +3130,34 @@ 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;
+}
+
+bool map_element_is_underground(rct_map_element *mapElement)
+{
+ do {
+ mapElement++;
+ if (map_element_is_last_for_tile(mapElement - 1))
+ return false;
+ } while (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SURFACE);
+ return true;
+}
diff --git a/src/world/map.h b/src/world/map.h
index 6fcf3df8b2..46dcc6fa71 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,9 +328,12 @@ 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);
void map_element_remove_banner_entry(rct_map_element *mapElement);
+bool map_element_is_underground(rct_map_element *mapElement);
+
#endif
diff --git a/src/world/park.c b/src/world/park.c
index 73230f230d..7b52393d88 100644
--- a/src/world/park.c
+++ b/src/world/park.c
@@ -38,6 +38,9 @@
uint8 *gParkRatingHistory = RCT2_ADDRESS(RCT2_ADDRESS_PARK_RATING_HISTORY, uint8);
uint8 *gGuestsInParkHistory = RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY, uint8);
+// If this value is more than or equal to 0, the park rating is forced to this value. Used for cheat
+int gForcedParkRating = -1;
+
/**
* In a difficult guest generation scenario, no guests will be generated if over this value.
*/
@@ -161,6 +164,9 @@ int park_calculate_size()
*/
int calculate_park_rating()
{
+ if (gForcedParkRating >= 0)
+ return gForcedParkRating;
+
int result;
result = 1150;
@@ -261,8 +267,8 @@ int calculate_park_rating()
for (sprite_idx = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_LITTER, uint16); sprite_idx != SPRITE_INDEX_NULL; sprite_idx = litter->next) {
litter = &(g_sprite_list[sprite_idx].litter);
- // Guessing this eliminates recently dropped litter
- if (litter->var_24 - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) >= 7680)
+ // Ignore recently dropped litter
+ if (litter->creationTick - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) >= 7680)
num_litter++;
}
result -= 600 - (4 * (150 - min(150, num_litter)));
@@ -1402,3 +1408,15 @@ void game_command_buy_land_rights(int *eax, int *ebx, int *ecx, int *edx, int *e
*ebx = RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16);
}*/
}
+
+
+void set_forced_park_rating(int rating){
+ gForcedParkRating = rating;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) = calculate_park_rating();
+ RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) |= BTM_TB_DIRTY_FLAG_PARK_RATING;
+ window_invalidate_by_class(WC_PARK_INFORMATION);
+}
+
+int get_forced_park_rating(){
+ return gForcedParkRating;
+}
\ No newline at end of file
diff --git a/src/world/park.h b/src/world/park.h
index aa19444e04..556757cdc8 100644
--- a/src/world/park.h
+++ b/src/world/park.h
@@ -48,6 +48,9 @@ enum {
extern uint8 *gParkRatingHistory;
extern uint8 *gGuestsInParkHistory;
+void set_forced_park_rating();
+int get_forced_park_rating();
+
int park_is_open();
void park_init();
void park_reset_history();
diff --git a/src/world/sprite.c b/src/world/sprite.c
index ede41f10d8..1127ec59da 100644
--- a/src/world/sprite.c
+++ b/src/world/sprite.c
@@ -901,4 +901,78 @@ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite){
void sprite_remove(rct_sprite *sprite)
{
RCT2_CALLPROC_X(0x0069EDB6, 0, 0, 0, 0, (int)sprite, 0, 0);
+}
+
+static bool litter_can_be_at(int x, int y, int z)
+{
+ rct_map_element *mapElement;
+
+ if (!map_is_location_owned(x & 0xFFE0, y & 0xFFE0, z))
+ return false;
+
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH)
+ continue;
+
+ int pathZ = mapElement->base_height * 8;
+ if (pathZ < z || pathZ >= z + 32)
+ continue;
+
+ if (map_element_is_underground(mapElement))
+ return false;
+
+ return true;
+ } while (!map_element_is_last_for_tile(mapElement++));
+ return false;
+}
+
+/**
+ *
+ * rct2: 0x0067375D
+ */
+void litter_create(int x, int y, int z, int direction, int type)
+{
+ rct_litter *litter, *newestLitter;
+ uint16 spriteIndex, nextSpriteIndex;
+ uint32 newestLitterCreationTick;
+
+ x += TileDirectionDelta[direction].x / 8;
+ y += TileDirectionDelta[direction].y / 8;
+
+ if (!litter_can_be_at(x, y, z))
+ return;
+
+ if (RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_COUNT_LITTER, uint16) >= 500) {
+ newestLitter = NULL;
+ newestLitterCreationTick = 0;
+ for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_LITTER, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) {
+ litter = &(g_sprite_list[spriteIndex].litter);
+ nextSpriteIndex = litter->next;
+ if (newestLitterCreationTick <= litter->creationTick) {
+ newestLitterCreationTick = litter->creationTick;
+ newestLitter = litter;
+ }
+ }
+
+ if (newestLitter != NULL) {
+ sub_6EC60B((rct_sprite*)newestLitter);
+ sprite_remove((rct_sprite*)newestLitter);
+ }
+ }
+
+ litter = (rct_litter*)create_sprite(1);
+ if (litter == NULL)
+ return;
+
+ move_sprite_to_list((rct_sprite*)litter, SPRITE_LINKEDLIST_OFFSET_LITTER);
+ litter->sprite_direction = direction;
+ litter->sprite_width = 6;
+ litter->sprite_height_negative = 6;
+ litter->sprite_height_positive = 3;
+ litter->sprite_identifier = SPRITE_IDENTIFIER_LITTER;
+ litter->type = type;
+ sprite_move(x, y, z, (rct_sprite*)litter);
+ sub_6EC60B((rct_sprite*)litter);
+ litter->creationTick = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32);
}
\ No newline at end of file
diff --git a/src/world/sprite.h b/src/world/sprite.h
index 7a93a7c1c8..4dbdebae6a 100644
--- a/src/world/sprite.h
+++ b/src/world/sprite.h
@@ -84,14 +84,18 @@ typedef struct {
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
- uint8 pad_09;
+ uint8 sprite_height_negative; // 0x09
uint16 sprite_index; // 0x0A
uint16 pad_0C;
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
- uint8 pad_14[0x10];
- uint32 var_24;
+ uint8 sprite_width; // 0x14
+ uint8 sprite_height_positive; // 0x15
+ uint8 pad_16[8];
+ uint8 sprite_direction; // 0x1E
+ uint8 pad_1F[5];
+ uint32 creationTick; // 0x24
} rct_litter;
typedef struct {
@@ -252,5 +256,6 @@ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite);
void invalidate_sprite(rct_sprite *sprite);
void sub_6EC60B(rct_sprite* sprite);
void sprite_remove(rct_sprite *sprite);
+void litter_create(int x, int y, int z, int direction, int type);
#endif