diff --git a/data/language/dutch.txt b/data/language/dutch.txt
index 715704d297..906c83090d 100644
--- a/data/language/dutch.txt
+++ b/data/language/dutch.txt
@@ -51,11 +51,11 @@ STR_0049 :Attractie
STR_0050 :Attractie
STR_0051 :Attractie
STR_0052 :Attractie
-STR_0053 :Hyper-Twisterachtbaan
+STR_0053 :Hyper-twisterachtbaan
STR_0054 :Houten achtbaan
-STR_0055 :Zijfrictieachtbaan
+STR_0055 :Zijfrictie-achtbaan
STR_0056 :Wilde muis
-STR_0057 :Multidimensieachtbaan
+STR_0057 :Multidimensie-achtbaan
STR_0058 :Attractie
STR_0059 :Omgekeerde luchtachtbaan
STR_0060 :Attractie
@@ -512,7 +512,7 @@ STR_0510 :
STR_0511 :
STR_0512 :
STR_0513 :
-STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in bochten
+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
@@ -564,10 +564,10 @@ 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 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 de diepe afdalingen gaan en door diverse omkeringen.
+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 zitten in een speciaal tuigje onder de baan 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 :
@@ -576,7 +576,7 @@ STR_0574 :
STR_0575 :Aangedreven treinen hangen aan een enkele rail en vervoeren mensen door het park heen
STR_0576 :
STR_0577 :
-STR_0578 :Karretjes lopen in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists
+STR_0578 :Karretjes rijden in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists
STR_0579 :
STR_0580 :
STR_0581 :
@@ -584,7 +584,7 @@ STR_0582 :
STR_0583 :
STR_0584 :
STR_0585 :
-STR_0586 :Bootvormige karretjes lopen over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen
+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_0589 :
@@ -1059,39 +1059,39 @@ STR_1057 :Attractienaam
STR_1058 :Voer een nieuwe naam in voor deze attractie:
STR_1059 :Kan deze attractie geen andere naam geven...
STR_1060 :Ongeldige attractienaam
-STR_1061 :Normale stand
+STR_1061 :Normale modus
STR_1062 :Voortdurend circuit
STR_1063 :Lancering via achterwaartse optakeling
STR_1064 :Lancering
-STR_1065 :Shuttlestand
+STR_1065 :Shuttlemodus
STR_1066 :Bootverhuurmodus
STR_1067 :Opwaartse lancering
STR_1068 :Draaiendeliftmodus
STR_1069 :Station-naar-station
STR_1070 :Enkele rit per entree
STR_1071 :Onbeperkt aantal ritten per entree
-STR_1072 :Doolhofstand
-STR_1073 :Racestand
+STR_1072 :Doolhofmodus
+STR_1073 :Racemodus
STR_1074 :Botsautomodus
-STR_1075 :Schommelstand
-STR_1076 :Winkelstand
-STR_1077 :Draaistand
+STR_1075 :Schommelmodus
+STR_1076 :Winkelmodus
+STR_1077 :Draaimodus
STR_1078 :Voorwaartse rotatie
STR_1079 :Achterwaartse rotatie
-STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES}
-STR_1081 :3D-film: {ENDQUOTES}Mouse tails{ENDQUOTES}
+STR_1080 :Film: {ENDQUOTES}Avenging Aviators{ENDQUOTES}
+STR_1081 :3D-film: {ENDQUOTES}Mouse Tails{ENDQUOTES}
STR_1082 :Ruimteringenmodus
STR_1083 :Beginnersstand
STR_1084 :LIM-lancering
-STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES}
-STR_1086 :3D-film: {ENDQUOTES}Storm chasers{ENDQUOTES}
-STR_1087 :3D-film: {ENDQUOTES}Space raiders{ENDQUOTES}
+STR_1085 :Film: {ENDQUOTES}Thrill Riders{ENDQUOTES}
+STR_1086 :3D-film: {ENDQUOTES}Storm Chasers{ENDQUOTES}
+STR_1087 :3D-film: {ENDQUOTES}Space Raiders{ENDQUOTES}
STR_1088 :Intense stand
-STR_1089 :Gestoorde stand
+STR_1089 :Waanzinnige stand
STR_1090 :Spookhuismodus
STR_1091 :Circusmodus
STR_1092 :Neerwaartse lancering
-STR_1093 :Crooked housestand
+STR_1093 :Crookedhousemodus
STR_1094 :Vrijevalmodus
STR_1095 :Voortdurend circuit met blokken
STR_1096 :Lancering
@@ -1171,13 +1171,13 @@ STR_1169 :(Geen)
STR_1170 :{STRING}
STR_1171 :{RED}Gesloten - -
STR_1172 :{YELLLOW}{STRINGID} - -
-STR_1173 :{SMALLFONT}{BLACK}Voetpaden en wachtrijen neerzetten
+STR_1173 :{SMALLFONT}{BLACK}Voetpaden en wachtrijen aanleggen
STR_1174 :Banier in de weg
STR_1175 :Kan dit niet op hellend voetpad neerzetten
-STR_1176 :Kan hier geen voetpad neerzetten...
+STR_1176 :Kan hier geen voetpad aanleggen...
STR_1177 :Kan dit voetpad niet verwijderen...
STR_1178 :Landhelling is ongeschikt
-STR_1179 :Voetpad staat in de weg
+STR_1179 :Voetpad ligt in de weg
STR_1180 :Dit kan niet onder water worden gebouwd!
STR_1181 :Voetpaden
STR_1182 :Type
@@ -1345,7 +1345,7 @@ STR_1343 :{DURATION} /
STR_1344 :{WINDOW_COLOUR_2}Lengte: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID}
STR_1345 :{LENGTH}
STR_1346 :{LENGTH} /
-STR_1347 :{WINDOW_COLOUR_2}Gem. snlhd: {BLACK}{VELOCITY}
+STR_1347 :{WINDOW_COLOUR_2}Gem. snelheid: {BLACK}{VELOCITY}
STR_1348 :{WINDOW_COLOUR_2}Max. pos. vert. G-krachten: {BLACK}{COMMA2DP32}g
STR_1349 :{WINDOW_COLOUR_2}Max. pos. vert. G-krachten: {OUTLINE}{RED}{COMMA2DP32}g
STR_1350 :{WINDOW_COLOUR_2}Max. neg. vert. G-krachten: {BLACK}{COMMA2DP32}g
@@ -1500,7 +1500,7 @@ STR_1498 :{SMALLFONT}{OPENQUOTES}Ik sta al eeuwen in de rij voor {STRINGID}{E
STR_1499 :{SMALLFONT}{OPENQUOTES}Ik ben moe{ENDQUOTES}
STR_1500 :{SMALLFONT}{OPENQUOTES}Ik heb honger{ENDQUOTES}
STR_1501 :{SMALLFONT}{OPENQUOTES}Ik heb dorst{ENDQUOTES}
-STR_1502 :{SMALLFONT}{OPENQUOTES}Ik moet naar de WC{ENDQUOTES}
+STR_1502 :{SMALLFONT}{OPENQUOTES}Ik moet naar de wc{ENDQUOTES}
STR_1503 :{SMALLFONT}{OPENQUOTES}Ik kan {STRINGID} niet vinden{ENDQUOTES}
STR_1504 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor het gebruik van {STRINGID}{ENDQUOTES}
STR_1505 :{SMALLFONT}{OPENQUOTES}Ik ga niet in {STRINGID} als het regent{ENDQUOTES}
@@ -1588,7 +1588,7 @@ STR_1586 :{SMALLFONT}{OPENQUOTES}Deze actiefoto van {STRINGID} is erg goedkoo
STR_1587 :{SMALLFONT}{OPENQUOTES}Deze krakeling van {STRINGID} is erg goedkoop{ENDQUOTES}
STR_1588 :{SMALLFONT}{OPENQUOTES}Deze warme chocolademelk van {STRINGID} is erg goedkoop{ENDQUOTES}
STR_1589 :{SMALLFONT}{OPENQUOTES}Deze ijsthee van {STRINGID} is erg goedkoop{ENDQUOTES}
-STR_1590 :{SMALLFONT}{OPENQUOTES}Deze funnel cake van {STRINGID} is erg goedkoop{ENDQUOTES}
+STR_1590 :{SMALLFONT}{OPENQUOTES}Deze oliebollen van {STRINGID} zijn erg goedkoop{ENDQUOTES}
STR_1591 :{SMALLFONT}{OPENQUOTES}Deze zonnebril van {STRINGID} is erg goedkoop{ENDQUOTES}
STR_1592 :{SMALLFONT}{OPENQUOTES}Deze rundernoedels van {STRINGID} zijn erg goedkoop{ENDQUOTES}
STR_1593 :{SMALLFONT}{OPENQUOTES}Deze rijstnoedels van {STRINGID} zijn erg goedkoop{ENDQUOTES}
@@ -1620,7 +1620,7 @@ STR_1618 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een actiefoto van
STR_1619 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een krakeling van {STRINGID}{ENDQUOTES}
STR_1620 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor warme chocolademelk van {STRINGID}{ENDQUOTES}
STR_1621 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor ijsthee van {STRINGID}{ENDQUOTES}
-STR_1622 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een funnel cake van {STRINGID}{ENDQUOTES}
+STR_1622 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een oliebol van {STRINGID}{ENDQUOTES}
STR_1623 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een zonnebril van {STRINGID}{ENDQUOTES}
STR_1624 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor rundernoedels van {STRINGID}{ENDQUOTES}
STR_1625 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor rijstnoedels van {STRINGID}{ENDQUOTES}
@@ -1653,8 +1653,8 @@ STR_1651 :{SMALLFONT}{OPENQUOTES}Leuke attractie! Maar niet zo goed als de Ph
STR_1652 :{SMALLFONT}{OPENQUOTES}Ik ben zo enthousiast - het is een attractie van Intamin!{ENDQUOTES}
STR_1653 :{SMALLFONT}{OPENQUOTES}...en nu zijn we in {STRINGID}!{ENDQUOTES}
STR_1654 :{WINDOW_COLOUR_2}Recente gedachten:
-STR_1655 :{SMALLFONT}{BLACK}Voetpaden op land bouwen
-STR_1656 :{SMALLFONT}{BLACK}Voetpad over bruggen of door tunnels bouwen
+STR_1655 :{SMALLFONT}{BLACK}Voetpaden op land aanleggen
+STR_1656 :{SMALLFONT}{BLACK}Voetpad over bruggen of door tunnels aanleggen
STR_1657 :{WINDOW_COLOUR_2}Voorkeursintensiteit:
STR_1658 :{WINDOW_COLOUR_2}{BLACK}minder dan {COMMA16}
STR_1659 :{WINDOW_COLOUR_2}{BLACK}tussen {COMMA16} en {COMMA16}
@@ -1665,7 +1665,7 @@ STR_1663 :{WINDOW_COLOUR_2}Misselijkheid:
STR_1664 :{WINDOW_COLOUR_2}Energie:
STR_1665 :{WINDOW_COLOUR_2}Honger:
STR_1666 :{WINDOW_COLOUR_2}Dorst:
-STR_1667 :{WINDOW_COLOUR_2}WC-behoefte:
+STR_1667 :{WINDOW_COLOUR_2}Wc-behoefte:
STR_1668 :{WINDOW_COLOUR_2}Voldoening: {BLACK}onbekend
STR_1669 :{WINDOW_COLOUR_2}Voldoening: {BLACK}{COMMA16}%
STR_1670 :{WINDOW_COLOUR_2}Totaal aantal bezoekers: {BLACK}{COMMA32}
@@ -1694,7 +1694,7 @@ STR_1692 :{WINDOW_COLOUR_2} Kosten: {BLACK}vanaf {CURRENCY}
STR_1693 :{SMALLFONT}{BLACK}Bezoekers
STR_1694 :{SMALLFONT}{BLACK}Werknemers
STR_1695 :{SMALLFONT}{BLACK}Inkomsten en kosten
-STR_1696 :{SMALLFONT}{BLACK}Klanteninformatie
+STR_1696 :{SMALLFONT}{BLACK}Klantinformatie
STR_1697 :Dit kan niet op wachtrijen worden geplaatst
STR_1698 :Dit kan alleen op wachtrijen worden geplaatst
STR_1699 :Teveel personen in het spel
@@ -1775,7 +1775,7 @@ STR_1773 :Een attractie mag maar één actiefotogedeelte hebben
STR_1774 :Een attractie mag maar één kabellift hebben
STR_1775 :Uit
STR_1776 :Aan
-STR_1777 :{WINDOW_COLOUR_2}Muziek:
+STR_1777 :{WINDOW_COLOUR_2}Muziek
STR_1778 :{STRINGID} - -
STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandapak
STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tijgerpak
@@ -1787,7 +1787,7 @@ STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Ridderkostuum
STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronautenpak
STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandietenkostuum
STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriffkostuum
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenpak
+STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenkostuum
STR_1790 :{SMALLFONT}{BLACK}Selecteer de uniformkleur voor dit type werknemer
STR_1791 :{WINDOW_COLOUR_2}Uniformkleur:
STR_1792 :Gaat {STRINGID} repareren
@@ -1878,9 +1878,9 @@ STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Attracties inspect
STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Attracties repareren
STR_1878 :{WINDOW_COLOUR_2}Inspectie:
STR_1879 :Elke 10 minuten
-STR_1880 :Elke 20 minutes
-STR_1881 :Elke 30 minutes
-STR_1882 :Elke 45 minutes
+STR_1880 :Elke 20 minuten
+STR_1881 :Elke 30 minuten
+STR_1882 :Elke 45 minuten
STR_1883 :Elk uur
STR_1884 :Elke 2 uur
STR_1885 :Nooit
@@ -1928,7 +1928,7 @@ STR_1926 :{SMALLFONT}
STR_1927 :{YELLOW}{STRINGID} is kapot gegaan
STR_1928 :{RED}{STRINGID} is neergestort!
STR_1929 :{RED}{STRINGID} is nog steeds niet gerepareerd{NEWLINE}Controleer waar je monteurs zijn en overweeg ze beter te organiseren
-STR_1930 :{SMALLFONT}{BLACK}Volgen van bezoeker aan- of uitschakelen - (Als volgen is ingeschakeld, worden de activiteit van deze bezoeker vermeld in het berichtengebied)
+STR_1930 :{SMALLFONT}{BLACK}Volgen van bezoeker in- of uitschakelen - (Als volgen is ingeschakeld, worden de activiteiten van deze bezoeker vermeld in het berichtengebied)
STR_1931 :{STRINGID} staat nu in de rij voor {STRINGID}
STR_1932 :{STRINGID} is nu in {STRINGID}
STR_1933 :{STRINGID} is nu in {STRINGID}
@@ -2104,7 +2104,7 @@ STR_2102 :{WINDOW_COLOUR_2}Prijs actiefoto:
STR_2103 :{WINDOW_COLOUR_2}Prijs krakeling:
STR_2104 :{WINDOW_COLOUR_2}Prijs warme chocolademelk:
STR_2105 :{WINDOW_COLOUR_2}Prijs ijsthee:
-STR_2106 :{WINDOW_COLOUR_2}Prijs funnel cake:
+STR_2106 :{WINDOW_COLOUR_2}Prijs oliebollen:
STR_2107 :{WINDOW_COLOUR_2}Prijs zonnebril:
STR_2108 :{WINDOW_COLOUR_2}Prijs rundernoedels:
STR_2109 :{WINDOW_COLOUR_2}Prijs rijstnoedels:
@@ -2126,7 +2126,7 @@ STR_2124 :Actiefoto
STR_2125 :Krakeling
STR_2126 :Warme chocolademelk
STR_2127 :IJsthee
-STR_2128 :Funnel cake
+STR_2128 :Oliebol
STR_2129 :Zonnebril
STR_2130 :Rundernoedels
STR_2131 :Rijstnoedels
@@ -2148,7 +2148,7 @@ STR_2146 :Actiefoto's
STR_2147 :Krakelingen
STR_2148 :Warme chocolademelk
STR_2149 :IJsthee
-STR_2150 :Funnel cakes
+STR_2150 :Oliebollen
STR_2151 :Zonnebrillen
STR_2152 :Rundernoedels
STR_2153 :Rijstnoedels
@@ -2170,7 +2170,7 @@ STR_2168 :een actiefoto
STR_2169 :een krakeling
STR_2170 :warme chocolademelk
STR_2171 :ijsthee
-STR_2172 :een funnel cake
+STR_2172 :een oliebol
STR_2173 :een zonnebril
STR_2174 :rundernoedels
STR_2175 :rijstnoedels
@@ -2192,7 +2192,7 @@ STR_2190 :Actiefoto van {STRINGID}
STR_2191 :Krakeling
STR_2192 :Warme chocolademelk
STR_2193 :IJsthee
-STR_2194 :Funnel cake
+STR_2194 :Oliebollen
STR_2195 :Zonnebril
STR_2196 :Rundernoedels
STR_2197 :Rijstnoedels
@@ -2297,13 +2297,13 @@ STR_2295 :{SMALLFONT}{BLACK}Zijkant land aanpassen
STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} betaald voor entree
STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} attractie
STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} attracties
-STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} stuk voedsel
-STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} stuks voedsel
+STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} etenswaar
+STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} etenswaren
STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} drankje
STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} drankjes
STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} souvenir
STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} souvenirs
-STR_2305 :Baantontwerpbestanden
+STR_2305 :Baanontwerpbestanden
STR_2306 :Baanontwerp opslaan
STR_2307 :Ontwerp voor {STRINGID} selecteren
STR_2308 :Baanontwerpen voor {STRINGID}
@@ -2311,7 +2311,7 @@ STR_2309 :Nieuw baanontwerp installeren
STR_2310 :Eigen ontwerp bouwen
STR_2311 :{WINDOW_COLOUR_2}Spanningswaarde: {BLACK}{COMMA2DP32} (ongeveer)
STR_2312 :{WINDOW_COLOUR_2}Intensiteitswaarde: {BLACK}{COMMA2DP32} (ongeveer)
-STR_2313 :{WINDOW_COLOUR_2}Missellijkheidswaarde: {BLACK}{COMMA2DP32} (ongeveer)
+STR_2313 :{WINDOW_COLOUR_2}Misselijkheidswaarde: {BLACK}{COMMA2DP32} (ongeveer)
STR_2314 :{WINDOW_COLOUR_2}Lengte: {BLACK}{STRINGID}
STR_2315 :{WINDOW_COLOUR_2}Kosten: {BLACK}ongeveer {CURRENCY}
STR_2316 :{WINDOW_COLOUR_2}Vereiste ruimte: {BLACK}{COMMA16} x {COMMA16} blokken
@@ -2339,7 +2339,7 @@ STR_2337 :Duitse mark (DM)
STR_2338 :Yen ({YEN})
STR_2339 :Peseta (Pts)
STR_2340 :Lire (L)
-STR_2341 :Guldens (fl.)
+STR_2341 :Guldens (fl)
STR_2342 :Kronen (kr)
STR_2343 :Euro's ({EURO})
STR_2344 :Engelse maten
@@ -2347,7 +2347,7 @@ STR_2345 :Metriek stelsel
STR_2346 :Weergave
STR_2347 :{RED}{STRINGID} is verdronken!
STR_2348 :{SMALLFONT}{BLACK}Statistieken voor deze werknemer tonen
-STR_2349 :{WINDOW_COLOUR_2}Loon: {BLACK}{CURRENCY} per month
+STR_2349 :{WINDOW_COLOUR_2}Loon: {BLACK}{CURRENCY} per maand
STR_2350 :{WINDOW_COLOUR_2}In dienst genomen: {BLACK}{MONTHYEAR}
STR_2351 :{WINDOW_COLOUR_2}Velden gemaaid: {BLACK}{COMMA16}
STR_2352 :{WINDOW_COLOUR_2}Bloemen water gegeven: {BLACK}{COMMA16}
@@ -2360,7 +2360,7 @@ STR_2358 :Eenheden
STR_2359 :Echte waarden
STR_2360 :{WINDOW_COLOUR_2}Schermresolutie:
STR_2361 :Landschapslijnen verzachten
-STR_2362 :{SMALLFONT}{BLACK}Verzachting van lijnen tussen blokken land aan- of uitzetten
+STR_2362 :{SMALLFONT}{BLACK}Verzachting van lijnen tussen landschapstegels aan- of uitzetten
STR_2363 :Raster weergeven op landschap
STR_2364 :{SMALLFONT}{BLACK}Rasterlijnen op land aan- of uitzetten
STR_2365 :De bank wil je lening niet verhogen!
@@ -2382,19 +2382,19 @@ STR_2380 :{SMALLFONT}{BLACK}Kleiner stuk water aanpassen
STR_2381 :{SMALLFONT}{BLACK}Groter stuk water aanpassen
STR_2382 :Land
STR_2383 :Water
-STR_2384 :{WINDOW_COLOUR_2}Je doel:
+STR_2384 :{WINDOW_COLOUR_2}Je doelstelling:
STR_2385 :{BLACK}Geen
-STR_2386 :{BLACK}Om minstens {COMMA16} bezoekers in je park toe hebben aan het einde van {MONTHYEAR}, met een parkwaardering van ten minste 600
-STR_2387 :{BLACK}Om een parkwaarde van minstens {POP16}{POP16}{CURRENCY} te hebben aan het einde van {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR}
+STR_2386 :{BLACK}Om ten minste {COMMA16} bezoekers in je park te hebben aan het einde van {MONTHYEAR}, met een parkwaardering van ten minste 600
+STR_2387 :{BLACK}Om een parkwaarde van ten minste {POP16}{POP16}{CURRENCY} te hebben aan het einde van {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR}
STR_2388 :{BLACK}Om plezier te hebben!
STR_2389 :{BLACK}Om de beste {STRINGID} te bouwen!
-STR_2390 :{BLACK}Om 10 verschillende typen achtbanen in je park te hebben, elk met een spanningswaarde van minstens 6,00
-STR_2391 :{BLACK}Om minstens {COMMA16} bezoekers in je park te hebben. Je parkwaardering mag geen moment onder de 700 komen!
-STR_2392 :{BLACK}Om in één maand minstens {POP16}{POP16}{CURRENCY} aan attractiekaartjes te verdienen
-STR_2393 :{BLACK}Om 10 verschillende typen achtbanen in je park te hebben, elk met een lengte van minstens {LENGTH} en een spanningswaarde van minstens 7,00
-STR_2394 :{BLACK}Om alle 5 deels gebouwde achtbanen in je park af te maken, ek met een spanningswaarde van minstens {POP16}{POP16}{COMMA2DP32}
-STR_2395 :{BLACK}Om je lening terug te betalen en een parkwaarde van minstens {POP16}{POP16}{CURRENCY} te bereiken
-STR_2396 :{BLACK}Om in één maand minstens {POP16}{POP16}{CURRENCY} aan de verkoop van eten, drinken en souvenirs te verdienen
+STR_2390 :{BLACK}Om 10 verschillende typen achtbanen in je park te hebben, elk met een spanningswaarde van ten minste 6,00
+STR_2391 :{BLACK}Om ten minste {COMMA16} bezoekers in je park te hebben. Je parkwaardering mag geen moment onder de 700 komen!
+STR_2392 :{BLACK}Om in één maand ten minste {POP16}{POP16}{CURRENCY} aan attractiekaartjes te verdienen
+STR_2393 :{BLACK}Om 10 verschillende typen achtbanen in je park te hebben, elk met een lengte van ten minste {LENGTH} en een spanningswaarde van ten minste 7,00
+STR_2394 :{BLACK}Om alle 5 deels gebouwde achtbanen in je park af te maken, ek met een spanningswaarde van ten minste {POP16}{POP16}{COMMA2DP32}
+STR_2395 :{BLACK}Om je lening terug te betalen en een parkwaarde van ten minste {POP16}{POP16}{CURRENCY} te bereiken
+STR_2396 :{BLACK}Om in één maand ten minste {POP16}{POP16}{CURRENCY} aan de verkoop van eten, drinken en souvenirs te verdienen
STR_2397 :Geen
STR_2398 :Aantal bezoekers op een bepaalde datum
STR_2399 :Parkwaarde op een bepaalde datum
@@ -2402,11 +2402,11 @@ STR_2400 :Plezier hebben
STR_2401 :De beste attractie te bouwen
STR_2402 :Tien achtbanen bouwen
STR_2403 :Aantal bezoekers in het park
-STR_2404 :Maandelijks inkomen van attractiekaartjes
+STR_2404 :Maandelijks inkomen uit attractiekaartjes
STR_2405 :Tien achtbanen van een bepaalde lengte bouwen
STR_2406 :Vijf achtbanen afmaken
STR_2407 :Lening terugbetalen en een bepaalde parkwaarde bereiken
-STR_2408 :Maandelijks inkomen van voedsel/souvenirs
+STR_2408 :Maandelijks inkomen uit etenswaren/souvenirs
STR_2409 :{WINDOW_COLOUR_2}Lopende marketingcampagnes
STR_2410 :{BLACK}Geen
STR_2411 :{WINDOW_COLOUR_2}Beschikbare marketingcampagnes
@@ -2512,7 +2512,7 @@ STR_2510 :Toon hoogtemarkeringen op paden
STR_2511 :Land aanpassen
STR_2512 :Water aanpassen
STR_2513 :Decor bouwen
-STR_2514 :Voetpaden bouwen
+STR_2514 :Voetpaden aanleggen
STR_2515 :Nieuwe attractie bouwen
STR_2516 :Financiële informatie tonen
STR_2517 :Onderzoeksinformatie tonen
@@ -2777,7 +2777,7 @@ STR_2775 :Volledig scherm (bureaublad)
STR_2776 :Taal
STR_2777 :{MOVE_X}{SMALLFONT}{STRING}
STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING}
-STR_2779 :Kijkvenster #{COMMA16}
+STR_2779 :Kijkvenster {COMMA16}
STR_2780 :Extra kijkvenster
STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID}
STR_2782 :SHIFT +
@@ -2786,8 +2786,8 @@ STR_2784 :Sneltoets wijzigen
STR_2785 :{WINDOW_COLOUR_2}Voer een nieuwe sneltoets in voor:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES}
STR_2786 :{SMALLFONT}{BLACK}Klik op de beschrijving om een nieuwe sneltoets in te stellen
STR_2787 :{WINDOW_COLOUR_2}Parkwaarde: {BLACK}{CURRENCY}
-STR_2788 :{WINDOW_COLOUR_2}Gefeliciteerd!{NEWLINE}{BLACK}Je hebt je doel bereikt met een bedrijfswaarde van {CURRENCY}!
-STR_2789 :{WINDOW_COLOUR_2}Je hebt je doel niet bereikt!
+STR_2788 :{WINDOW_COLOUR_2}Gefeliciteerd!{NEWLINE}{BLACK}Je hebt je doelstelling bereikt met een bedrijfswaarde van {CURRENCY}!
+STR_2789 :{WINDOW_COLOUR_2}Je hebt je doelstelling niet bereikt!
STR_2790 :Naam invoeren voor scenario-overzicht
STR_2791 :Naam invoeren
STR_2792 :Voer je naam in voor het scenario-overzicht:
@@ -2805,9 +2805,9 @@ STR_2803 :{SMALLFONT}{BLACK}Parkkaart tonen waarop deze bezoekers gemarkeerd
STR_2804 :{SMALLFONT}{BLACK}Parkkaart tonen waarop deze werknemers gemarkeerd zijn
STR_2805 :{SMALLFONT}{BLACK}Parkkaart tonen
STR_2806 :{RED}Bezoekers klagen over de smerige voetpaden in je park{NEWLINE}Controleer waar je klusjesmannen zijn en overweeg om ze beter te organiseren
-STR_2807 :{RED}Bezoekers klagen over de hoeveelheid rommel{NEWLINE}Controleer waar je klusjesmannen zijn en overweeg om ze beter te organiseren
+STR_2807 :{RED}Bezoekers klagen over de hoeveelheid rommel in je park{NEWLINE}Controleer waar je klusjesmannen zijn en overweeg om ze beter te organiseren
STR_2808 :{RED}Bezoekers klagen over het vandalisme in je park{NEWLINE}Controleer waar je bewakers zijn en overweeg om ze beter te organiseren
-STR_2809 :{RED}Bezoekers hebben honger en kunnen geen plek vinden om voedsel te kopen
+STR_2809 :{RED}Bezoekers hebben honger en kunnen geen plek vinden om eten te kopen
STR_2810 :{RED}Bezoekers hebben dorst en kunnen geen plek vinden om drinken te kopen
STR_2811 :{RED}Bezoekers klagen omdat ze de toiletten in je park niet kunnen vinden
STR_2812 :{RED}Bezoekers raken verdwaald of komen vast te zitten{NEWLINE}Controleer of je de indeling van je voetpaden kunt verbeteren
@@ -3060,7 +3060,7 @@ STR_3058 :Stenen muren
STR_3059 :Heggen
STR_3060 :Blokken ijs
STR_3061 :Houten schuttingen
-STR_3062 :{SMALLFONT}{BLACK}Standard achtbaanspoor
+STR_3062 :{SMALLFONT}{BLACK}Standaard achtbaanspoor
STR_3063 :{SMALLFONT}{BLACK}Watergedeelte (spoor onder water)
STR_3064 :Eenvoudige parken
STR_3065 :Uitdagende parken
@@ -3181,7 +3181,7 @@ STR_3179 :Er moet minstens één attractie worden geselecteerd
STR_3180 :Ongeldige selectie van objecten
STR_3181 :Objectselectie - {STRINGID}
STR_3182 :Er moet een parkingang worden geselecteerd
-STR_3183 :Er moet een watertyoe worden geselecteerd
+STR_3183 :Er moet een watertype worden geselecteerd
STR_3184 :Attracties/voertuigen
STR_3185 :Klein decor
STR_3186 :Groot decor
@@ -3203,7 +3203,7 @@ STR_3201 :Objectselectie
STR_3202 :Landschap bewerken
STR_3203 :Uitvindingen instellen
STR_3204 :Opties selecteren
-STR_3205 :Doel selecteren
+STR_3205 :Doelstelling selecteren
STR_3206 :Scenario opslaan
STR_3207 :Achtbaanontwerper
STR_3208 :Baanontwerpbeheer
@@ -3239,7 +3239,7 @@ STR_3237 :{SMALLFONT}{BLACK}Toon parkopties
STR_3238 :Zonder geld
STR_3239 :{SMALLFONT}{BLACK}Schakel geld compleet uit, zodat het park geen financiële beperkingen heeft
STR_3240 :{WINDOW_COLOUR_2}Startsaldo:
-STR_3241 :{WINDOW_COLOUR_2}Startlening
+STR_3241 :{WINDOW_COLOUR_2}Startlening:
STR_3242 :{WINDOW_COLOUR_2}Maximale lening:
STR_3243 :{WINDOW_COLOUR_2}Jaarlijkse rente:
STR_3244 :Marketingcampagnes niet toestaan
@@ -3280,12 +3280,12 @@ STR_3278 :{WINDOW_COLOUR_2}Prijs bouwrechten:
STR_3279 :Gratis entree / Per rit betalen
STR_3280 :Betaalde toegang / Attracties gratis
STR_3281 :{WINDOW_COLOUR_2}Entreeprijs:
-STR_3282 :{SMALLFONT}{BLACK}Doel en parknaam selecteren
+STR_3282 :{SMALLFONT}{BLACK}Doelstelling en parknaam selecteren
STR_3283 :{SMALLFONT}{BLACK}Beschermde attracties selecteren
STR_3284 :Doelselectie
STR_3285 :Beschermde attracties
-STR_3286 :{SMALLFONT}{BLACK}Selecteer doel voor dit scenario
-STR_3287 :{WINDOW_COLOUR_2}Doel:
+STR_3286 :{SMALLFONT}{BLACK}Selecteer doelstelling voor dit scenario
+STR_3287 :{WINDOW_COLOUR_2}Doelstelling:
STR_3288 :{SMALLFONT}{BLACK}Selecteer klimaat:
STR_3289 :{WINDOW_COLOUR_2}Klimaat:
STR_3290 :Koel en nat
@@ -3299,7 +3299,7 @@ STR_3297 :{SMALLFONT}{BLACK}Details van dit park/scenario aanpassen
STR_3298 :{WINDOW_COLOUR_2}Parknaam: {BLACK}{STRINGID}
STR_3299 :{WINDOW_COLOUR_2}Parkdetails:
STR_3300 :{WINDOW_COLOUR_2}Scenarionaam: {BLACK}{STRINGID}
-STR_3301 :{WINDOW_COLOUR_2}Datum doel:
+STR_3301 :{WINDOW_COLOUR_2}Datum doelstelling:
STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR}
STR_3303 :{WINDOW_COLOUR_2}Aantal bezoekers:
STR_3304 :{WINDOW_COLOUR_2}Parkwaarde:
@@ -3320,7 +3320,7 @@ STR_3318 :{SMALLFONT}{BLACK}Selecteer in welke groep dit scenario moet versch
STR_3319 :{WINDOW_COLOUR_2}Scenariogroep:
STR_3320 :Kan scenariobestand niet opslaan...
STR_3321 :Nieuwe objecten successvol geïnstalleerd
-STR_3322 :{WINDOW_COLOUR_2}Doel: {BLACK}{STRINGID}
+STR_3322 :{WINDOW_COLOUR_2}Doelstelling: {BLACK}{STRINGID}
STR_3323 :Ontbrekende objectdata, ID:
STR_3324 :Vereist uitbreidingspakket:
STR_3325 :Vereist een uitbreidingspakket
@@ -3329,8 +3329,8 @@ STR_3327 :Startpositie voor bezoekers niet aangegeven
STR_3328 :Kan niet verder naar volgende stap...
STR_3329 :Parkingang nog niet gebouwd
STR_3330 :Park moet land bezitten
-STR_3331 :Pad van de parkingang naar de rand van de kaart is incompleet of te complex; het pad mag maar één blok breed zijn en moet zo min mogelijk kruisingen en bochten bevatten
-STR_3332 :Parkingang staan achterstevoren of heeft geen pad naar de rand van de kaart
+STR_3331 :Pad van de parkingang naar de rand van de kaart is incompleet of te complex; het pad mag maar één tegel breed zijn en moet zo min mogelijk kruisingen en bochten bevatten
+STR_3332 :Parkingang staat achterstevoren of heeft geen pad naar de rand van de kaart
STR_3333 :Plug-inobjecten meeleveren in opgeslagen spellen
STR_3334 :{SMALLFONT}{BLACK}Selecteer of toegevoegde (niet-standaard) objecten in opgeslagen spellen en scenario's moeten worden meegeleverd, zodat ze geopend kunnen worden door iemand die deze objecten nog niet heeft
STR_3335 :Achtbaanontwerper - Attractietypes en -voertuigen selecteren
@@ -3360,7 +3360,7 @@ STR_3358 :Kan het baanontwerp niet verwijderen...
STR_3359 :{BLACK}Geen baanontwerpen van dit type
STR_3360 :Waarschuwing!
STR_3361 :Te veel baanontwerpen van dit type; sommige staan niet in de lijst
-STR_3362 :Mixing via softwarebuffer forceren
+STR_3362 :Mixen via softwarebuffer forceren
STR_3363 :{SMALLFONT}{BLACK}Selecteer deze optie om de prestaties te verbeteren als het spel vertraagt bij het afspelen van geluiden of als er ruis hoorbaar is
STR_3364 :Meer opties
STR_3365 :{SMALLFONT}{BLACK}Maakt naast selectie van decorgroepen ook selectie van losse items mogelijk
@@ -3368,9 +3368,9 @@ STR_3366 :{BLACK}= Attractie
STR_3367 :{BLACK}= Eetkraampje
STR_3368 :{BLACK}= Drankkraampje
STR_3369 :{BLACK}= Souvenirkraampje
-STR_3370 :{BLACK}= Infokiosk
+STR_3370 :{BLACK}= Informatiekiosk
STR_3371 :{BLACK}= Eerste hulp
-STR_3372 :{BLACK}= PIN
+STR_3372 :{BLACK}= Geldautomaat
STR_3373 :{BLACK}= Toilet
STR_3374 :Waarschuwing: teveel objecten geselecteerd!
STR_3375 :Niet alle objecten in deze decorgroep kunnen worden geselecteerd
@@ -3379,13 +3379,13 @@ STR_3377 :{SMALLFONT}{BLACK}Bestand met nieuw baanontwerp installeren
STR_3378 :Installeren
STR_3379 :Annuleren
STR_3380 :Kan dit baanontwerp niet installeren...
-STR_3381 :Bestand is niet compatible of bevat ongeldige gegevens
+STR_3381 :Bestand is niet compatibel of bevat ongeldige gegevens
STR_3382 :Kopiëren van bestand mislukt
STR_3383 :Selecteer nieuwe naam voor dit baanontwerp
STR_3384 :Er bestaat al een baanontwerp met deze naam; verzin een andere naam voor dit ontwerp:
STR_3385 :Tutorial voor beginners
-STR_3386 :Toturial voor eigen ontwerpen
-STR_3387 :Toturial voor achtbanen bouwen
+STR_3386 :Tutorial voor eigen ontwerpen
+STR_3387 :Tutorial voor achtbanen bouwen
STR_3388 :Kan niet naar de geselecteerde modus overschakelen
STR_3389 :Kan extra decorstukken niet selecteren...
STR_3390 :Te veel items geselecteerd
@@ -3397,14 +3397,14 @@ STR_3395 :{SMALLFONT}{BLACK}Dingen bouwen vanaf deze hoogte is een beetje las
STR_3396 :{SMALLFONT}{BLACK}Laten we een simpele attractie bouwen om met dit park te beginnen...
STR_3397 :{SMALLFONT}{BLACK}Het witte 'spookplaatje' laat zien waar de attractie zal worden gebouwd. Beweeg de muis er naar toe en klik om het te bouwen...
STR_3398 :{SMALLFONT}{BLACK}Attracties hebben een ingang en een uitgang nodig. Beweeg de muis naar een tegeltje aan de rand van de attractie en klik om de ingang te bouwen. Klik nog een keer ergens om de uitgang te bouwen...
-STR_3399 :{SMALLFONT}{BLACK}We moeten een voetpad bouwen zodat bezoekers onze nieuwe attractie kunnen bereiken...
+STR_3399 :{SMALLFONT}{BLACK}We moeten een voetpad aanleggen zodat bezoekers onze nieuwe attractie kunnen bereiken...
STR_3400 :{SMALLFONT}{BLACK}Voor het pad naar de ingang gebruiken we een speciaal wachtrij-voetpad...
STR_3401 :{SMALLFONT}{BLACK}Voor de uitgang maakt het niet uit welk pad je gebruikt. Een normaal pad is goed...
STR_3402 :{SMALLFONT}{BLACK}Oké dan, laten we de attractie openen! Om de attractie te openen klikken we op het knopje met de vlag in het attractievenster en selecteren we 'openen'...
STR_3403 :{SMALLFONT}{BLACK}Maar waar zijn de bezoekers?!
STR_3404 :{SMALLFONT}{BLACK}Oh, juist - het park is nog gesloten! Laten we ons park openen...
STR_3405 :{SMALLFONT}{BLACK}Terwijl we op onze eerste bezoekers wachten kunnen we wat decorstukken neerzetten...
-STR_3406 :{SMALLFONT}{BLACK}Dit is ons lege park. We gaan een simpele zelfontworpen attractie bouwen...
+STR_3406 :{SMALLFONT}{BLACK}Dit is ons lege park. We gaan een simpele, zelfontworpen attractie bouwen...
STR_3407 :{SMALLFONT}{BLACK}Ten eerste hebben we een startpositie nodig...
STR_3408 :{SMALLFONT}{BLACK}Het stuk baan dat we net gebouwd hebben is een 'station' en zorgt ervoor dat bezoekers in en uit kunnen stappen...
STR_3409 :{SMALLFONT}{BLACK}We verlengen het perron een beetje door nog wat stationsgedeeltes aan te leggen...
@@ -3414,7 +3414,7 @@ STR_3412 :{SMALLFONT}{BLACK}De bocht is nog niet gebouwd, maar het witte spoo
STR_3413 :{SMALLFONT}{BLACK}Nu willen we een recht stuk bouwen, dus klikken we op het knopje voor 'recht stuk'...
STR_3414 :{SMALLFONT}{BLACK}De baan is af, we kunnen nu de ingang en uitgang bouwen...
STR_3415 :{SMALLFONT}{BLACK}Laten we testen of onze attractie werkt...
-STR_3416 :{SMALLFONT}{BLACK}Terwijl de attractie wordt getest kunnen we een wachtrij en uitgangspad bouwen...
+STR_3416 :{SMALLFONT}{BLACK}Terwijl de attractie wordt getest kunnen we een wachtrij en uitgangspad aanleggen...
STR_3417 :{SMALLFONT}{BLACK}Goed - laten we het park en onze attractie openen...
STR_3418 :{SMALLFONT}{BLACK}Onze nieuwe attractie is niet heel erg spannend; misschien moeten we wat decor toevoegen?
STR_3419 :{SMALLFONT}{BLACK}Om decor te bouwen boven ander decor (of midden in de lucht) hou je de SHIFT-toets ingedrukt en beweeg je de muis om de hoogte te bepalen...
@@ -3425,13 +3425,13 @@ STR_3423 :{SMALLFONT}{BLACK}Er zijn veel kant-en-klare achtbanen, maar wij ga
STR_3424 :{SMALLFONT}{BLACK}Zo, het station is af. Nu hebben we een liftheuvel nodig...
STR_3425 :{SMALLFONT}{BLACK}Achtbaankarretjes zijn niet aangedreven, dus is een 'kettinglift' nodig om ze eerst een heuvel op te trekken...
STR_3426 :{SMALLFONT}{BLACK}Goed, de liftheuvel is klaar - nu de eerste afdaling...
-STR_3427 :{SMALLFONT}{BLACK}Die bochten zijn een slecht idee; de passagiers zullen naar de zijkanten geslingerd worden door de G-kracht wanneer de trein er doorheen raast...
+STR_3427 :{SMALLFONT}{BLACK}Die bochten zijn een slecht idee; de passagiers zullen naar de zijkanten geslingerd worden door de zijwaartse G-krachten wanneer de trein er doorheen raast...
STR_3428 :{SMALLFONT}{BLACK}De bochten een banking geven (schuinleggen) zal de rit prettiger maken, aangezien de passagiers in hun stoelen geduwd zullen worden in plaats van naar de zijkanten...
STR_3429 :{SMALLFONT}{BLACK}Dit gaat niet werken! Kijk naar de hoogtemarkeringen: de tweede heuvel is hoger dan de liftheuvel...
STR_3430 :{SMALLFONT}{BLACK}Om ervoor te zorgen dat de trein terug naar het station komt, moet elke heuvel iets lager zijn dan de heuvel daarvoor...
STR_3431 :{SMALLFONT}{BLACK}Dat ziet er beter uit! Onze trein zou het nu moeten halen! Laten we wat meer bochtige stukjes toevoegen...
STR_3432 :{SMALLFONT}{BLACK}We moeten de trein afremmen voordat we de laatste bocht en het station inkomen, dus laten we wat remmen toevoegen...
-STR_3433 :{SMALLFONT}{BLACK}En tenslotte voegen we 'blokremmen' toe. Die zorgen ervoor dat twee treinen tegelijk (en veilig) op de baan kunnen zitten...
+STR_3433 :{SMALLFONT}{BLACK}En tenslotte voegen we 'blokremmen' toe. Die zorgen ervoor dat twee treinen tegelijk (en veilig) op de baan kunnen rijden...
STR_3434 :{SMALLFONT}{BLACK}Laten we kijken of onze achtbaan werkt!
STR_3435 :{SMALLFONT}{BLACK}Fantastisch, hij werkt! Laten we wat voetpaden aanleggen, zodat bezoekers bij onze nieuwe achtbaan kunnen komen...
STR_3436 :{SMALLFONT}{BLACK}Terwijl we wachten op onze eerste bezoekers, kunnen we onze achtbaan een beetje aanpassen...
@@ -3445,3 +3445,6 @@ STR_3443 :Pagina 4
STR_3444 :Pagina 5
STR_3445 :Werkgebied instellen
STR_3446 :Werkgebied wissen
+STR_5120 :'Financiën'-knop in de werkbalk tonen
+STR_5121 :'Onderzoek'-knop in de werkbalk tonen
+STR_5122 :Alle voertuigen met hetzelfde baan- of attractietype tonen
diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt
index f69061e519..af15baa97d 100644
--- a/data/language/english_uk.txt
+++ b/data/language/english_uk.txt
@@ -3456,3 +3456,4 @@ STR_3446 :Cancel Patrol Area
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_5123 :Renew rides
diff --git a/data/language/english_us.txt b/data/language/english_us.txt
index 2c97eeac69..7ea461cfc3 100644
--- a/data/language/english_us.txt
+++ b/data/language/english_us.txt
@@ -3463,3 +3463,8 @@ STR_3443 :Page 4
STR_3444 :Page 5
STR_3445 :Set Patrol Area
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
diff --git a/data/language/french.txt b/data/language/french.txt
index d689041161..032d6105b8 100644
--- a/data/language/french.txt
+++ b/data/language/french.txt
@@ -1,4 +1,4 @@
-# STR_XXXX part is read and XXXX becomes the string id number.
+# STR_XXXX part is read and XXXX becomes the string id number.
# Everything after the colon and before the new line will be saved as the string.
# Use # at the beginning of a line to leave a comment.
STR_0000 :
@@ -3340,63 +3340,63 @@ STR_3333 :Export plug-in objects with saved games
STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data
STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles
STR_3336 :Track Designs Manager - Select Ride Type
-STR_3337 :Six Flags Park
-STR_3338 :{BLACK}Custom-designed layout
-STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout
-STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout
+STR_3337 :Parc Six Flags
+STR_3338 :{BLACK}Dispositions personnalisées
+STR_3339 :{BLACK}{COMMA16} design disponible, ou disposition personnalisée
+STR_3340 :{BLACK}{COMMA16} designs disponibles, ou dispositions personnalisées
STR_3341 :{SMALLFONT}{BLACK}Outils
STR_3342 :Editeur de scénario
STR_3343 :Convertir partie sauvegardée en scénario
STR_3344 :Concepteur de montages russes
STR_3345 :Gestionnaire de voies
-STR_3346 :Can't save track design...
-STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out
-STR_3348 :Rename
-STR_3349 :Delete
-STR_3350 :Track design name
-STR_3351 :Enter new name for this track design:
-STR_3352 :Can't rename track design...
-STR_3353 :New name contains invalid characters
-STR_3354 :Another file exists with this name, or file is write-protected
-STR_3355 :File is write-protected or locked
-STR_3356 :Delete File
-STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ?
-STR_3358 :Can't delete track design...
-STR_3359 :{BLACK}No track designs of this type
-STR_3360 :Warning!
-STR_3361 :Too many track designs of this type - Some will not be listed.
-STR_3362 :Forced Software Buffer Mixing
-STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard
-STR_3364 :Advanced
-STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups
-STR_3366 :{BLACK}= Ride
-STR_3367 :{BLACK}= Food Stall
-STR_3368 :{BLACK}= Drink Stall
-STR_3369 :{BLACK}= Souvenir Stall
-STR_3370 :{BLACK}= Info. Kiosk
-STR_3371 :{BLACK}= First Aid
-STR_3372 :{BLACK}= A.T.M.
-STR_3373 :{BLACK}= Restroom
-STR_3374 :Warning: Too many objects selected!
-STR_3375 :Not all objects in this scenery group could be selected
-STR_3376 :Install new track design...
-STR_3377 :{SMALLFONT}{BLACK}Install a new track design file
-STR_3378 :Install
-STR_3379 :Cancel
-STR_3380 :Unable to install this track design...
-STR_3381 :File is not compatible or contains invalid data
-STR_3382 :File copy failed
-STR_3383 :Select new name for track design
-STR_3384 :An existing track design already has this name - Please select a new name for this design:
+STR_3346 :Impossible de sauvegarder le modèle du circuit...
+STR_3347 :L'attraction est trop large, contient trop d'éléments, ou le décor est trop éloigné
+STR_3348 :Renommer
+STR_3349 :Supprimer
+STR_3350 :Nom du modèle de circuit
+STR_3351 :Entrez le nouveau nom du modèle du circuit :
+STR_3352 :Impossible de renommer le modèle du circuit...
+STR_3353 :Le nouveau nom contient des caractères invalides
+STR_3354 :Un autre fichier existe avec ce nom, ou il est en lecture seule
+STR_3355 :Le fichier est verrouillé ou est en lecture seule
+STR_3356 :Supprimer fichier
+STR_3357 :{WINDOW_COLOUR_2}Etes-vous sûr(e) de vouloir supprimer de manière permanente {STRINGID} ?
+STR_3358 :Impossible de supprimer le modèle du circuit...
+STR_3359 :{BLACK}Pas de modèle de circuit pour ce type
+STR_3360 :Attention !
+STR_3361 :Trop de modèles de circuit pour ce type - Certains ne seront pas listés.
+STR_3362 :Forcé mixage tampon logiciel
+STR_3363 :{SMALLFONT}{BLACK}Selectionnez cette option pour améliorer les performances si le jeu se met légèrement en pause slightly quand les sons démarrent ou de l'interférence est entendue
+STR_3364 :Avancé
+STR_3365 :{SMALLFONT}{BLACK}Autorise la sélection d'objets individuels du décor en plus des groupes de décor
+STR_3366 :{BLACK}= Attraction
+STR_3367 :{BLACK}= Stand de nourriture
+STR_3368 :{BLACK}= Stand de boissons
+STR_3369 :{BLACK}= Stand de souvenirs
+STR_3370 :{BLACK}= Kiosque aux informations
+STR_3371 :{BLACK}= Infirmerie
+STR_3372 :{BLACK}= D.A.B.
+STR_3373 :{BLACK}= Toilettes
+STR_3374 :Attention : Trop d'objets sélectionnés !
+STR_3375 :Certains objets dans ce groupe de décor n'ont pas pu être sélectionnés
+STR_3376 :Installer un nouveau modèle de circuit...
+STR_3377 :{SMALLFONT}{BLACK}Installe un fichier qui contient un nouveau modèle de circuit
+STR_3378 :Installer
+STR_3379 :Annuler
+STR_3380 :Impossible d'installer ce modèle de circuit...
+STR_3381 :Le fichier n'est pas compatible ou contient des données invalides
+STR_3382 :Copie du fichier échouée
+STR_3383 :Sélectionnez le nouveau nom pour le modèle de circuit
+STR_3384 :Un modèle de circuit possède déjà ce nom - Veuillez en choisir un autre pour celui ci :
STR_3385 :Didacticiel pour débutants
STR_3386 :Didacticiel attractions personnalisées
STR_3387 :Didacticiel construction des montagnes russes
-STR_3388 :Unable to switch to selected mode
-STR_3389 :Unable to select additional item of scenery...
-STR_3390 :Too many items selected
+STR_3388 :Impossible de changer au mode sélectionné
+STR_3389 :Impossible de choisir plus d'objets du décor...
+STR_3390 :Trop d'objets sélectionnés
STR_3391 :{SMALLFONT}{BLACK}Voici notre parc. Voyons ça d'un peu plus près...
-STR_3392 :{SMALLFONT}{BLACK}Pour déplacer la vue, maintenir le bouton DROIT de la souris enfoncé puis bouger la souris...
-STR_3393 :{SMALLFONT}{BLACK}Pour élargir la vue, faites un zomm arrière à l'aide de l'icone placé en haut de l'écran...
+STR_3392 :{SMALLFONT}{BLACK}Pour déplacer la vue, maintenez le bouton DROIT de la souris enfoncé puis bouger la souris...
+STR_3393 :{SMALLFONT}{BLACK}Pour élargir la vue, faites un zoom arrière à l'aide de l'icone placé en haut de l'écran...
STR_3394 :{SMALLFONT}{BLACK}Vous pouvez aussi faire pivoter la vue par tranches de 90 degrés...
STR_3395 :{SMALLFONT}{BLACK}Difficile d'entamer une construction avec une vue aussi large. Faites un zoom avant...
STR_3396 :{SMALLFONT}{BLACK}Construisons d'abord une simple attraction...
@@ -3409,44 +3409,44 @@ STR_3402 :{SMALLFONT}{BLACK}Bien, et si on ouvrait l'attraction maintenant ?
STR_3403 :{SMALLFONT}{BLACK}Mais où sont passés les visiteurs ?
STR_3404 :{SMALLFONT}{BLACK}Zut. Nous avons oublié d'ouvrir le parc. Bon il est temps d'y remédier...
STR_3405 :{SMALLFONT}{BLACK}En attendant vos premiers visiteurs, occupons-nous du décor...
-STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride...
-STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position...
-STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride...
-STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections...
-STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add...
-STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve...
-STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track...
-STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon...
-STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the ride entrance and exit...
-STR_3415 :{SMALLFONT}{BLACK}Let's test our ride to check it works...
-STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path...
-STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride...
-STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery?
-STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height...
-STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built...
-STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride...
-STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster !
-STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design...
-STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill...
-STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill...
-STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop...
-STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The riders will be flung to the sides by the lateral G forces as the train hurtles around...
-STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the ride - Riders will be pushed down into their seats instead of flung to the sides...
-STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill...
-STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one...
-STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track...
-STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes...
-STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit...
-STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works!
-STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster...
-STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customize the ride a bit...
-STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape
-STR_3438 :Unable to remove all scenery from here...
+STR_3406 :{SMALLFONT}{BLACK}Voici notre parc vide. Nous allons construire une attraction simple et personnalisée...
+STR_3407 :{SMALLFONT}{BLACK}Tout d'abord on doit choisir le point de départ...
+STR_3408 :{SMALLFONT}{BLACK}La section du circuit que nous venons de construire est la 'station', cela permet aux visiteurs de monter et descendre de l'attraction...
+STR_3409 :{SMALLFONT}{BLACK}Nous allons étendre cette station en ajoutant quelques blocs...
+STR_3410 :{SMALLFONT}{BLACK}Les icônes en haut de la fenêtre de construction vous permet les différentes parties du circuit à ajouter...
+STR_3411 :{SMALLFONT}{BLACK}Nous choissions une courbe vers la gauche...
+STR_3412 :{SMALLFONT}{BLACK}La courbe n'est pas encore construite, mais l'image fantôme blanche indique où elle le sera. Cliquez sur l'icône 'construire ceci' pour construire le bloc...
+STR_3413 :{SMALLFONT}{BLACK}Maintenant nous voulons construire un tracé droit, donc on clique sur l'icône 'tracé droit'...
+STR_3414 :{SMALLFONT}{BLACK}Maintenant que le circuit est terminé, nous devons construire l'entrée et la sortie...
+STR_3415 :{SMALLFONT}{BLACK}Testons notre attraction pour voir si tout va bien...
+STR_3416 :{SMALLFONT}{BLACK}Pendant son test, on va construire la zone d'attente et l'allée de sortie...
+STR_3417 :{SMALLFONT}{BLACK}OK - Ouvrons le parc et l'attraction...
+STR_3418 :{SMALLFONT}{BLACK}Notre nouvelle attraction n'est pas très attractive - Peut-être que nous devons rajouter du décor ?
+STR_3419 :{SMALLFONT}{BLACK}Pour construire du décor l'un au-dessus de l'autre ou en plein vol, maintenez la touche MAJ key et déplacez la souris pour choisir l'hauteur...
+STR_3420 :{SMALLFONT}{BLACK}Certains éléments du décor peuvent être repeints après leur construction...
+STR_3421 :{SMALLFONT}{BLACK}Ajoutons un peu de musique à notre attraction...
+STR_3422 :{SMALLFONT}{BLACK}Construisons un montagne russe !
+STR_3423 :{SMALLFONT}{BLACK}Il y a plein de modèles pré-définis, mais nous allons construire notre propre circuit...
+STR_3424 :{SMALLFONT}{BLACK}Voilà la station construite. Maintenant la montée...
+STR_3425 :{SMALLFONT}{BLACK}Les trains des montagnes russes ne sont pas propulsés, une 'échelle' est nécessaire pour tirer le train lors de la première montée...
+STR_3426 :{SMALLFONT}{BLACK}La montée est terminée - Maintenant la descente...
+STR_3427 :{SMALLFONT}{BLACK}Ces courbes sont une mauvaise idée - Les visiteurs vont être projetés sur le côté de leur siège par les forces G latérales pendant que le train tourne...
+STR_3428 :{SMALLFONT}{BLACK}Pencher les courbes améliorera l'attraction - Les visiteurs auront leur dos collé aux sièges plutôt que d'être projetés sur les côtés...
+STR_3429 :{SMALLFONT}{BLACK}Non - Ca ne fonctionnera pas ! Regardez les marques de hauteur - La deuxième montée est plus grande que la première...
+STR_3430 :{SMALLFONT}{BLACK}Pour être sûr que le train réussise le circuit, chaque montée doit être légèrement plus petite que la précédente...
+STR_3431 :{SMALLFONT}{BLACK}C'est mieux - Notre train pourra passer cette montée ! Ajoutons des voies plus tordues...
+STR_3432 :{SMALLFONT}{BLACK}Nous devons freiner le train avant la courbe finale et la station, ajoutons quelques freins...
+STR_3433 :{SMALLFONT}{BLACK}Et finalement nous rajouterons des 'freins de blocs', cela permettra à 2 trains de parcourir le circuit en sécurité...
+STR_3434 :{SMALLFONT}{BLACK}Testons l'attraction et regardons si tout fonctionne !
+STR_3435 :{SMALLFONT}{BLACK}Génial - Tout fonctionne ! Ajoutons la zone d'attente et l'allée de sortie pour que les visiteurs puissent y accéder...
+STR_3436 :{SMALLFONT}{BLACK}En attendant les premiers passagers, on va personnaliser un peu l'attraction...
+STR_3437 :{SMALLFONT}{BLACK}Nettoyer grande zone de décor du paysage
+STR_3438 :Impossible d'effacer tout le décor d'içi...
STR_3439 :Effacer décor
STR_3440 :Page 1
STR_3441 :Page 2
STR_3442 :Page 3
STR_3443 :Page 4
STR_3444 :Page 5
-STR_3445 :Set Patrol Area
-STR_3446 :Cancel Patrol Area
+STR_3445 :Définir Zone de Patrouille
+STR_3446 :Annuler Zone de Patrouille
diff --git a/data/language/polish.txt b/data/language/polish.txt
index f88b5e5dbb..ee75dc49b5 100644
--- a/data/language/polish.txt
+++ b/data/language/polish.txt
@@ -2442,49 +2442,52 @@ STR_2405 :Build 10 roller coasters of a given length
STR_2406 :Finish building 5 roller coasters
STR_2407 :Repay loan and achieve a given park value
STR_2408 :Monthly profit from food/merchandise
-STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation
-STR_2410 :{BLACK}None
-STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available
-STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign
-STR_2413 :{BLACK}({CURRENCY2DP} per week)
-STR_2414 :(Not Selected)
-STR_2415 :{WINDOW_COLOUR_2}Ride:
-STR_2416 :{WINDOW_COLOUR_2}Item:
-STR_2417 :{WINDOW_COLOUR_2}Length of time:
-STR_2418 :Free entry to {STRINGID}
-STR_2419 :Free ride on {STRINGID}
-STR_2420 :Half-price entry to {STRINGID}
-STR_2421 :Free {STRINGID}
-STR_2422 :Advertising campaign for {STRINGID}
-STR_2423 :Advertising campaign for {STRINGID}
-STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park
-STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride
-STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park
-STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink
-STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park
-STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride
-STR_2430 :{BLACK}Vouchers for free entry to {STRINGID}
-STR_2431 :{BLACK}Vouchers for free ride on {STRINGID}
-STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID}
-STR_2433 :{BLACK}Vouchers for free {STRINGID}
-STR_2434 :{BLACK}Advertising campaign for {STRINGID}
-STR_2435 :{BLACK}Advertising campaign for {STRINGID}
-STR_2436 :1 week
-STR_2437 :2 weeks
-STR_2438 :3 weeks
-STR_2439 :4 weeks
-STR_2440 :5 weeks
-STR_2441 :6 weeks
-STR_2442 :{BLACK}({STRINGID} remaining)
-STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP}
-STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP}
-STR_2445 :Start this marketing campaign
-STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished
-STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished
-STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished
-STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished
-STR_2450 :{YELLOW}Your advertising campaign for the park has finished
-STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished
+# ------------------------------------------ Polish start
+STR_2409 :{WINDOW_COLOUR_2}Trwające kampanie marketingowe
+STR_2410 :{BLACK}Brak
+STR_2411 :{WINDOW_COLOUR_2}Dostępne kampanie marketingowe
+STR_2412 :{SMALLFONT}{BLACK}Rozpocznij tą kampanię
+STR_2413 :{BLACK}({CURRENCY2DP} tygodniowo)
+STR_2414 :(Nie wybrano)
+STR_2415 :{WINDOW_COLOUR_2}Atrakcja:
+STR_2416 :{WINDOW_COLOUR_2}Przedmiot:
+STR_2417 :{WINDOW_COLOUR_2}Czas trwania:
+# I think they are only used in "Voucher for ___" strings, so lower case fits here better
+STR_2418 :darmowe wejście do {STRINGID}
+STR_2419 :darmową przejażdżkę {STRINGID}
+STR_2420 :wejście do {STRINGID} za połowę ceny
+STR_2421 :darmowe {STRINGID}
+STR_2422 :Kampania reklamowa dla {STRINGID}
+STR_2423 :Kampania reklamowa dla {STRINGID}
+STR_2424 :{WINDOW_COLOUR_2}Kupony na darmowe wejście do parku
+STR_2425 :{WINDOW_COLOUR_2}Kupony na darmową przejażdżkę wybraną atrakcję
+STR_2426 :{WINDOW_COLOUR_2}Kupony na wejście do parku za połowę ceny
+STR_2427 :{WINDOW_COLOUR_2}Kupony na darmowe jedzenie lub picie
+STR_2428 :{WINDOW_COLOUR_2}Kampania reklamująca park
+STR_2429 :{WINDOW_COLOUR_2}Kampania reklamująca wybraną przejażdżkę
+STR_2430 :{BLACK}Kupony na darmowe wejście do {STRINGID}
+STR_2431 :{BLACK}Kupony na darmową przejażdżkę {STRINGID}
+STR_2432 :{BLACK}Kupony na wejście do {STRINGID} za połowę ceny
+STR_2433 :{BLACK}Kupony na darmowe {STRINGID}
+STR_2434 :{BLACK}Kampania reklamowa dla {STRINGID}
+STR_2435 :{BLACK}Kampania reklamowa dla {STRINGID}
+STR_2436 :1 tydzień
+STR_2437 :2 tygodnie
+STR_2438 :3 tygodnie
+STR_2439 :4 tygodnie
+STR_2440 :5 tygodnie
+STR_2441 :6 tygodnie
+STR_2442 :{BLACK}(został/y {STRINGID})
+STR_2443 :{WINDOW_COLOUR_2}Koszt tygodniowy: {BLACK}{CURRENCY2DP}
+STR_2444 :{WINDOW_COLOUR_2}Koszt łączny: {BLACK}{CURRENCY2DP}
+STR_2445 :Rozpocznij kampanię
+STR_2446 :{YELLOW}Twoja kampania marketingowa na darmowe wejście do parku zakończyła się
+STR_2447 :{YELLOW}Twoja kampania marketingowa na darmowe przejażdżki {STRINGID} zakończyła się
+STR_2448 :{YELLOW}Twoja kampania marketingowa na wejście do parku za połowę ceny zakończyła się
+STR_2449 :{YELLOW}Twoja kampania marketingowa na darmowe {STRINGID} zakończyła się
+STR_2450 :{YELLOW}Twoja kmapania reklamująca park zakończyła się
+STR_2451 :{YELLOW}Twoja kampania reklamująca {STRINGID} zakończyła się
+# ------------------------------------------ Polish end
STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP}
STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP}
STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} -
@@ -2753,9 +2756,9 @@ STR_2714 :-
STR_2715 :.
STR_2716 :/
STR_2717 :'
-STR_2718 :???
-STR_2719 :???
# New strings (previously these were ???)
+STR_2718 :(..)
+STR_2719 :(nowy plik)
# sec, secs
STR_2720 :{UINT16}sek
STR_2721 :{UINT16}sek
@@ -2790,25 +2793,25 @@ STR_2745 :\
STR_2746 :]
STR_2747 :{ENDQUOTES}
STR_2748 :Bar
-STR_2749 :???
-STR_2750 :???
-STR_2751 :???
-STR_2752 :???
-STR_2753 :???
-STR_2754 :???
-STR_2755 :???
-STR_2756 :???
-STR_2757 :???
-STR_2758 :???
-STR_2759 :???
-# New strings used in the cheats window previously these were ???
+# New strings (previously these were ???)
+STR_2749 :Mój nowy scenariusz
+STR_2750 :Przenieś wszystkie do góry
+STR_2751 :Przenieś wszystkie na dół
+STR_2752 :Czysta trawa
+STR_2753 :Skoszona trawa
+STR_2754 :Podlej kwiaty
+STR_2755 :Usuń wandalizm
+STR_2756 :Usuń śmieci
+STR_2757 :Wymuś słońce
+STR_2758 :Wymuś burzę
+STR_2759 :Mniejsze odstępy
STR_2760 :+5K Pieniędzy
STR_2761 :Płatne Wejście
STR_2762 :Płatne Atrakcje
STR_2763 :???
STR_2764 :Szczęśliwi Goście
STR_2765 :Przypływ Gości
-STR_2766 :???
+STR_2766 :Wygraj scenariusz
STR_2767 :Zablokuj Klimat
STR_2768 :Odblokuj Klimat
STR_2769 :Otwórz Park
@@ -2821,9 +2824,9 @@ STR_2775 :Pełny ekran w oknie
STR_2776 :Język
STR_2777 :{MOVE_X}{SMALLFONT}{STRING}
STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING}
+STR_2779 :Podgląd #{COMMA16}
+STR_2780 :Dodatkowe okno podglądu
# End of new strings
-STR_2779 :???
-STR_2780 :???
STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID}
STR_2782 :SHIFT +
STR_2783 :CTRL +
diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj
index 3a650aa77d..1a6e2e0ed6 100644
--- a/projects/openrct2.vcxproj
+++ b/projects/openrct2.vcxproj
@@ -138,6 +138,7 @@
+
@@ -204,6 +205,7 @@
+
@@ -286,6 +288,7 @@
false_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;%(PreprocessorDefinitions)$(IntDir)fake\%(RelativeDir)
+ truetrue
diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters
index fce4be6300..6bc6dd78b5 100644
--- a/projects/openrct2.vcxproj.filters
+++ b/projects/openrct2.vcxproj.filters
@@ -345,7 +345,6 @@
Source\Windows
- Source\Windows
@@ -371,7 +370,7 @@
Source\World
-
+ Source
@@ -427,6 +426,9 @@
Source\Windows
+
+ Source\World
+
@@ -627,5 +629,8 @@
Source\World
+
+ Source\World
+
\ No newline at end of file
diff --git a/src/game.c b/src/game.c
index dc702c2d7e..74ddbbc797 100644
--- a/src/game.c
+++ b/src/game.c
@@ -49,6 +49,7 @@
#include "windows/error.h"
#include "windows/tooltip.h"
#include "world/climate.h"
+#include "world/map_animation.h"
#include "world/park.h"
#include "world/sprite.h"
#include "world/water.h"
@@ -317,7 +318,7 @@ void game_logic_update()
research_update();
ride_ratings_update_all();
ride_measurements_update();
- map_invalidate_animations();
+ map_animation_invalidate_all();
vehicle_sounds_update();
peep_update_crowd_noise();
climate_update_sound();
diff --git a/src/interface/viewport.c b/src/interface/viewport.c
index 1238b835ea..9530f3f191 100644
--- a/src/interface/viewport.c
+++ b/src/interface/viewport.c
@@ -1,9 +1,9 @@
/*****************************************************************************
* 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
@@ -25,6 +25,8 @@
#include "../sprites.h"
#include "../world/map.h"
#include "../world/sprite.h"
+#include "../world/banner.h"
+#include "../world/scenery.h"
#include "viewport.h"
#include "window.h"
@@ -106,7 +108,7 @@ void viewport_init_all()
* z : cx
* out_x : ax
* out_y : bx
- * Converts between 3d point of a sprite to 2d coordinates for centering on that sprite
+ * Converts between 3d point of a sprite to 2d coordinates for centering on that sprite
*/
void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_viewport* viewport){
int start_x = x;
@@ -130,8 +132,8 @@ void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_view
break;
}
- *out_x = x - viewport->view_width/2;
- *out_y = y - viewport->view_height/2;
+ *out_x = x - viewport->view_width / 2;
+ *out_y = y - viewport->view_height / 2;
}
/**
@@ -205,7 +207,7 @@ void viewport_create(rct_window *w, int x, int y, int width, int height, int zoo
}
/**
- *
+ *
* rct2: 0x006EE510
*/
void viewport_update_pointers()
@@ -408,7 +410,7 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){
}
if (viewport->width <= 0){
- memcpy( viewport, &view_copy,sizeof(rct_viewport));
+ memcpy(viewport, &view_copy, sizeof(rct_viewport));
return;
}
@@ -458,7 +460,7 @@ void viewport_set_underground_flag(int underground, rct_window* window, rct_view
}
/**
- *
+ *
* rct2: 0x006E7A3A
*/
void viewport_update_position(rct_window *window)
@@ -494,7 +496,7 @@ void viewport_update_position(rct_window *window)
int curr_rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32);
sub_689174(&x, &y, &z, curr_rotation);
-
+
viewport_set_underground_flag(0, window, viewport);
//RCT2_CALLPROC_X(0x006E7A15, x, y, z, 0, (int)window, (int)viewport, 0);
@@ -525,7 +527,7 @@ void viewport_update_position(rct_window *window)
int z = map_element_height(x & 0xFFFF, y & 0xFFFF);
int _2d_x, _2d_y;
center_2d_coordinates(x, y, z, &_2d_x, &_2d_y, viewport);
-
+
if (window->saved_view_x > 0){
_2d_x = min(_2d_x, window->saved_view_x);
}
@@ -559,8 +561,8 @@ void viewport_update_position(rct_window *window)
y = -y;
flags |= 2;
}
- x = (x + 7)/8;
- y = (y + 7)/8;
+ x = (x + 7) / 8;
+ y = (y + 7) / 8;
//If we are at the final zoom position
if (!x && !y){
@@ -581,7 +583,7 @@ void viewport_update_position(rct_window *window)
}
/**
- *
+ *
* rct2: 0x00685C02
* ax: left
* bx: top
@@ -594,8 +596,8 @@ void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, i
{
if (right <= viewport->x) return;
if (bottom <= viewport->y) return;
- if (left >= viewport->x + viewport->width )return;
- if (top >= viewport->y + viewport->height )return;
+ if (left >= viewport->x + viewport->width)return;
+ if (top >= viewport->y + viewport->height)return;
int l = left, t = top, r = right, b = bottom;
@@ -621,8 +623,8 @@ void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, i
top += 384;
}
//Paint
- viewport_paint(viewport, dpi, left, top, right, bottom);
-
+ viewport_paint(viewport, dpi, left, top, right, bottom);
+
#ifdef DEBUG_SHOW_DIRTY_BOX
if (viewport != g_viewport_list){
gfx_fill_rect_inset(dpi, l, t, r-1, b-1, 0x2, 0x30);
@@ -632,7 +634,7 @@ void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, i
}
/**
-*
+*
* rct2: 0x0068615B
* ebp: ebp
*/
@@ -735,7 +737,7 @@ void sub_688485(){
if (!(ps->var_1A & 1))
gfx_draw_sprite(dpi, image_id, x, y, ps->var_04);
else
- RCT2_CALLPROC_X(0x00681DE2, 0, image_id, x, y, 0, (int)dpi, ps->var_04);
+ RCT2_CALLPROC_X(0x00681DE2, 0, image_id, x, y, 0, (int)dpi, ps->var_04);
if (ps->var_20 != 0){
ps = ps->var_20;
@@ -786,7 +788,7 @@ void sub_0x6736FC(rct_litter* litter, int ebx, int edx){
RCT2_GLOBAL(0x9DEA54, uint16) = 0xFFFC;
RCT2_GLOBAL(0x9DEA56, uint16) = edx + 2;
- switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION,uint32)){
+ switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){
case 0:
//0x686806
break;
@@ -812,19 +814,19 @@ void sub_0x69E8B0(uint32 eax, uint32 ecx){
rct_drawpixelinfo* dpi;
- if (RCT2_GLOBAL(0x9DEA6F,uint8) & 1) return;
-
- dpi = RCT2_GLOBAL(0x140E9A8,rct_drawpixelinfo*);
-
+ if (RCT2_GLOBAL(0x9DEA6F, uint8) & 1) return;
+
+ dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
+
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & 0x4000)return;
-
+
if (dpi->zoom_level > 2) return;
-
+
if (eax > 0x2000)return;
if (ecx > 0x2000)return;
-
+
//push eax, ecx
- eax = (eax&0x1FE0)<<3 | (ecx>>5);
+ eax = (eax & 0x1FE0) << 3 | (ecx >> 5);
int sprite_idx = RCT2_ADDRESS(0xF1EF60, uint16)[eax];
if (sprite_idx == SPRITE_INDEX_NULL) return;
@@ -871,6 +873,344 @@ void sub_0x69E8B0(uint32 eax, uint32 ecx){
//return;
}
+/*rct2: 0x006C42D9*/
+int sub_6C42D9(rct_string_id string_id, int scroll, int ebp)
+{
+ rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
+ if (dpi->zoom_level != 0) return 0x626;
+ RCT2_GLOBAL(0x9D7A80, uint32_t)++;
+ uint32_t edx = 0xFFFFFFFF;
+ for (int i = 0; i < 0x20; i++)
+ {
+ uint8_t* unknown_pointer = RCT2_ADDRESS(0x9C3840, uint8_t) + 0xA12 * i;
+ if (edx >= *((uint32_t*)(unknown_pointer + 0x0E)))
+ {
+ edx = *((uint32_t*)(unknown_pointer + 0x0E));
+ RCT2_GLOBAL(0x9D7A84, uint32_t) = i;
+ RCT2_GLOBAL(0x9D7A88, uint32_t) = (uint32_t)unknown_pointer;
+ }
+ if (*((rct_string_id*)unknown_pointer) == string_id &&
+ *((uint32_t*)(unknown_pointer + 0x02)) == RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t) &&
+ *((uint32_t*)(unknown_pointer + 0x06)) == RCT2_GLOBAL(0x13CE956, uint32_t) &&
+ *((uint16_t*)(unknown_pointer + 0x0A)) == scroll &&
+ *((uint16_t*)(unknown_pointer + 0x0C)) == ebp)
+ {
+ *((uint32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t);
+ return i + 0x606;
+ }
+ }
+ uint8_t* unknown_pointer = RCT2_GLOBAL(0x9D7A88, uint8_t*);
+ *((rct_string_id*)unknown_pointer) = string_id;
+ *((uint32_t*)(unknown_pointer + 0x02)) = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t);
+ *((uint32_t*)(unknown_pointer + 0x06)) = RCT2_GLOBAL(0x13CE956, uint32_t);
+ *((uint16_t*)(unknown_pointer + 0x0A)) = scroll;
+ *((uint16_t*)(unknown_pointer + 0x0C)) = ebp;
+ *((uint32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t);
+ unknown_pointer += 0x12;
+ memset(unknown_pointer, 0, 0x280 * 4);
+ format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS);
+ int al = RCT2_GLOBAL(0x13CE959, uint8_t);
+ int edi = al & 0x7F;
+ int offs = 0;
+ if (al >= 0x80) offs = 2;
+ RCT2_GLOBAL(0x9D7A8C, uint8_t) = RCT2_ADDRESS(0x0141FC47, uint8_t)[offs + edi * 8];
+ int16_t* unk = RCT2_ADDRESS(0x992FB8, uint16_t*)[ebp];
+ uint8_t* format_result = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8_t);
+ while (true)
+ {
+ al = *format_result;
+ format_result++;
+ if (al == 0)
+ {
+ format_result = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char);
+ continue;
+ }
+ if (al <= FORMAT_COLOUR_CODE_END && al >= FORMAT_COLOUR_CODE_START)
+ {
+ al -= FORMAT_COLOUR_CODE_START;
+ RCT2_GLOBAL(0x9D7A8C, uint8_t) = RCT2_ADDRESS(RCT2_GLOBAL(0x9FF048, uint32_t), uint8_t)[al * 4];
+ continue;
+ }
+ if (al < 0x20) continue;
+ al -= 0x20;
+ int edx = RCT2_ADDRESS(0x141EBA8, uint8_t)[al];
+ uint8_t* unk2 = &(RCT2_ADDRESS(0xF4393C, uint8)[al * 8]);
+ while (true)
+ {
+ if (scroll != 0)
+ {
+ scroll--;
+ unk2++;
+ edx--;
+ if (edx == 0) break;
+ }
+ else
+ {
+ int16_t eax = *unk;
+ if (eax == -1) return RCT2_GLOBAL(0x9D7A84, uint32_t) + 0x606;
+ if (eax > -1)
+ {
+ uint8_t* dst = &unknown_pointer[eax];
+ int ah = *unk2;
+ int al = RCT2_GLOBAL(0x9D7A8C, uint8_t);
+ while (true)
+ {
+ if (ah & 1) *dst = al;
+ ah >>= 1;
+ dst += 0x40;
+ if (ah == 0) break;
+ }
+ }
+ unk2++;
+ unk++;
+ edx--;
+ if (edx == 0) break;
+ }
+ }
+ }
+}
+
+/* rct2: 0x006B9CC4 */
+void viewport_banner_paint_setup(uint32_t direction, int edx, rct_map_element* map_element)
+{
+ rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
+ RCT2_GLOBAL(0x9DE570, uint8_t) = 0xC;
+ if (dpi->zoom_level > 1 || RCT2_GLOBAL(0x9DEA6F, uint8_t) & 1) return;
+ edx -= 16;
+ rct_scenery_entry* banner_scenery = g_bannerSceneryEntries[gBanners[map_element->properties.banner.index].type];
+ direction += map_element->properties.banner.position;
+ direction &= 3;
+ RCT2_GLOBAL(0x9DEA56, uint16_t) = edx + 2;
+ RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D884, uint32_t)[direction * 2];
+ int ebx = (direction << 1) + banner_scenery->image;
+ ebx += (gBanners[map_element->properties.banner.index].colour << 19) | 0x20000000;
+ if (map_element->flags & 0x10)//if being placed (ghost appearance)
+ {
+ RCT2_GLOBAL(0x9DE570, uint8_t) = 0;
+ ebx &= 0x7FFFF;
+ ebx |= RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8_t)];
+ }
+ RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)],
+ 0x1500, ebx, 0, edx, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t));
+ RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D888, uint32_t)[direction * 2];
+ ebx++;
+ RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)],
+ 0x1500, ebx, 0, edx, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t));
+ direction ^= 2;
+ direction--;
+ if (direction >= 2 || (map_element->flags & 0x10)) return;
+ int ebp = banner_scenery->banner.var_06;
+ ebp += direction;
+ RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t) = 0;
+ RCT2_GLOBAL(0x13CE956, uint32_t) = 0;
+ rct_string_id string_id = 0xBA5;//no entry
+ if (!(gBanners[map_element->properties.banner.index].flags & BANNER_FLAG_NO_ENTRY))
+ {
+ RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16_t) = gBanners[map_element->properties.banner.index].string_idx;
+ string_id = 0x6C3;
+ }
+ format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS);
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16_t) = 0x1C0;
+ uint16_t string_width = gfx_get_string_width(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char));
+ uint16_t scroll = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32_t) >> 1) % string_width;
+ RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)],
+ 0x1500, sub_6C42D9(string_id, scroll, ebp), 0, edx + 22, 1, 1, 0);
+}
+
+/*rct2: 0x0068B35F*/
+void sub_68B35F(int ax, int cx)
+{
+ if (ax < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) &&
+ cx < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) &&
+ ax >= 32 && cx >= 32)
+ {
+ RCT2_GLOBAL(0x141E9B4, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9B8, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9BC, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9C0, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9C4, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9C8, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9CC, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9D0, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9D4, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9D8, uint32_t) = 0xFFFF;
+ RCT2_GLOBAL(0x141E9DC, uint32_t) = 0xFFFF;
+ //loc_68B3FB: Another function jumps to here. We need to split this!
+ RCT2_GLOBAL(0x141F56A, uint16_t) = 0;
+ RCT2_GLOBAL(0x9E3138, uint8_t) = 0xFF;
+ RCT2_GLOBAL(0x9E30B6, uint8_t) = 0xFF;
+ RCT2_GLOBAL(0x9E323C, uint8_t) = 0xFF;
+ RCT2_GLOBAL(0x9DE56A, uint16_t) = ax;
+ RCT2_GLOBAL(0x9DE56E, uint16_t) = cx;
+ RCT2_GLOBAL(0x9DE574, uint16_t) = ax;
+ RCT2_GLOBAL(0x9DE576, uint16_t) = cx;
+ int dx = cx;
+ int esi = dx;
+ esi <<= 8;
+ esi |= ax;
+ esi >>= 3;
+ int ax_tmp = ax;
+ int cx_tmp = cx;
+ rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(esi / 4);
+ rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
+ switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t))
+ {
+ case 0:
+ dx = ax + cx;
+ break;
+ case 1:
+ ax += 32;
+ dx = cx - ax;
+ break;
+ case 2:
+ ax += 32;
+ cx += 32;
+ dx = -(ax + cx);
+ break;
+ case 3:
+ cx += 32;
+ dx = ax - cx;
+ break;
+ }
+ dx /= 2;
+ if ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16_t) & 4) &&
+ RCT2_GLOBAL(0x9DE56A, uint16_t) == RCT2_GLOBAL(0x9DEA48, uint16_t) &&
+ RCT2_GLOBAL(0x9DE56E, uint16_t) == RCT2_GLOBAL(0x9DEA4A, uint16_t))
+ {
+
+ int ebx = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t);
+ RCT2_GLOBAL(0x9DE568, uint16_t) = ax;
+ RCT2_GLOBAL(0x9DE56C, uint16_t) = cx;
+ int dl = RCT2_GLOBAL(0x009DEA4E, uint8_t) & 3;
+ ebx += dl;
+ ebx &= 3;
+ dl = RCT2_GLOBAL(0x009DEA4E, uint8_t) & 0xFC;
+ ebx += dl;
+ ebx += 0x20900C27;
+ int d = RCT2_GLOBAL(0x009DEA4C, uint16_t);
+ RCT2_GLOBAL(0x9DE570, uint8_t) = 0;
+ RCT2_GLOBAL(0x9DEA52, uint16_t) = 0;
+ RCT2_GLOBAL(0x9DEA54, uint16_t) = 0;
+ RCT2_GLOBAL(0x9DEA56, uint16_t) = d + 18;
+ RCT2_CALLPROC_X(
+ (int)RCT2_ADDRESS(0x0098197C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)],
+ 0xFF00, ebx, cx & 0xFF00, d, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t));
+ }
+ int bx = dx + 52;
+ if (bx > dpi->y)
+ {
+ rct_map_element* element = map_element;//push map_element
+ bx = element->clearance_height;
+ if (!map_element_is_last_for_tile(element))
+ {
+ while (true)
+ {
+ element++;
+ bx = max(bx, element->clearance_height);
+ if (map_element_is_last_for_tile(element)) break;
+ }
+ }
+ if (map_element_get_type(element) == MAP_ELEMENT_TYPE_SURFACE &&
+ (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) != 0)
+ {
+ bx = (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) << 1;
+ }
+ bx <<= 3;
+ dx -= bx;
+ dx -= 32;
+ element = map_element;//pop map_element
+ dx -= dpi->height;
+ if (dx < dpi->y)
+ {
+ RCT2_GLOBAL(0x9DE568, uint16_t) = ax;
+ RCT2_GLOBAL(0x9DE56C, uint16_t) = cx;
+ RCT2_GLOBAL(0x9DE57C, uint16_t) = 0;
+ while (true)
+ {
+ int direction = (map_element->type + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) & MAP_ELEMENT_DIRECTION_MASK;
+ dx = map_element->base_height * 8;
+ uint32_t dword_9DE574 = RCT2_GLOBAL(0x9DE574, uint32_t);
+ RCT2_GLOBAL(0x9DE578, rct_map_element*) = map_element;
+ //setup the painting of for example: the underground, signs, rides, scenery, etc.
+ switch (map_element_get_type(map_element))
+ {
+ case MAP_ELEMENT_TYPE_SURFACE:
+ RCT2_CALLPROC_X(0x66062C, 0, 0, direction, dx, (int)map_element, 0, 0);
+ break;
+ case MAP_ELEMENT_TYPE_PATH:
+ RCT2_CALLPROC_X(0x6A3590, 0, 0, direction, dx, (int)map_element, 0, 0);
+ break;
+ case MAP_ELEMENT_TYPE_TRACK:
+ RCT2_CALLPROC_X(0x6C4794, 0, 0, direction, dx, (int)map_element, 0, 0);
+ break;
+ case MAP_ELEMENT_TYPE_SCENERY:
+ RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, dx, (int)map_element, 0, 0);
+ break;
+ case MAP_ELEMENT_TYPE_ENTRANCE:
+ RCT2_CALLPROC_X(0x664FD4, 0, 0, direction, dx, (int)map_element, 0, 0);
+ break;
+ case MAP_ELEMENT_TYPE_FENCE:
+ RCT2_CALLPROC_X(0x6E44B0, 0, 0, direction, dx, (int)map_element, 0, 0);
+ break;
+ case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE:
+ RCT2_CALLPROC_X(0x6B7F0C, 0, 0, direction, dx, (int)map_element, 0, 0);
+ break;
+ case MAP_ELEMENT_TYPE_BANNER:
+ //there are still some small localisation glitches,
+ //because the old function still gets called sometimes
+ //viewport_banner_paint_setup(direction, dx, map_element);
+ //Until that is solved, use the original function instead
+ RCT2_CALLPROC_X(0x6B9CC4, 0, 0, direction, dx, (int)map_element, 0, 0);
+ break;
+ default:
+ break;
+ }
+ RCT2_GLOBAL(0x9DE574, uint32_t) = dword_9DE574;
+ int stop = map_element_is_last_for_tile(map_element);
+ map_element++;
+ if (stop) break;
+ }
+ }
+ }
+ }
+ else
+ {
+ rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
+ int dx;
+ switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t))
+ {
+ case 0:
+ dx = ax + cx;
+ break;
+ case 1:
+ ax += 32;
+ dx = cx - ax;
+ break;
+ case 2:
+ ax += 32;
+ cx += 32;
+ dx = -(ax + cx);
+ break;
+ case 3:
+ cx += 32;
+ dx = ax - cx;
+ break;
+ }
+ dx /= 2;
+ dx -= 16;
+ int bx = dx + 32;
+ if (bx <= dpi->y) return;
+ dx -= 20;
+ dx -= dpi->height;
+ if (dx >= dpi->y) return;
+ RCT2_GLOBAL(0x9DE568, uint16_t) = ax;
+ RCT2_GLOBAL(0x9DE56C, uint16_t) = cx;
+ RCT2_GLOBAL(0x9DE570, uint8_t) = 0;
+ RCT2_CALLPROC_X((int)RCT2_ADDRESS(0x98196C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)],
+ 0xFF00, 3123, cx & 0xFF00, 16, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t));
+ }
+}
+
/**
*
* rct2: 0x0068B6C2
@@ -896,13 +1236,13 @@ void sub_0x68B6C2(){
dx += 2128;
dx >>= 5;
for (int i = dx; i > 0; --i){
- RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
+ sub_68B35F(ax, cx);
sub_0x69E8B0(ax, cx);
cx += 0x20;
ax -= 0x20;
sub_0x69E8B0(ax, cx);
ax += 0x20;
- RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
+ sub_68B35F(ax, cx);
sub_0x69E8B0(ax, cx);
ax += 0x20;
cx -= 0x20;
@@ -917,7 +1257,7 @@ void sub_0x68B6C2(){
bx &= 0xFFE0;
ax &= 0xFFE0;
bx >>= 1;
- cx = ax;
+ cx = ax;
ax = -ax;
ax -= bx;
cx -= bx;
@@ -928,13 +1268,13 @@ void sub_0x68B6C2(){
dx += 0x860;
dx >>= 5;
for (int i = dx; i > 0; i--){
- RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
+ sub_68B35F(ax, cx);
sub_0x69E8B0(ax, cx);
ax -= 0x20;
cx -= 0x20;
sub_0x69E8B0(ax, cx);
cx += 0x20;
- RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
+ sub_68B35F(ax, cx);
sub_0x69E8B0(ax, cx);
ax += 0x20;
cx += 0x20;
@@ -959,13 +1299,13 @@ void sub_0x68B6C2(){
dx += 0x860;
dx >>= 5;
for (int i = dx; i > 0; i--){
- RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
+ sub_68B35F(ax, cx);
sub_0x69E8B0(ax, cx);
ax += 0x20;
cx -= 0x20;
sub_0x69E8B0(ax, cx);
ax -= 0x20;
- RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
+ sub_68B35F(ax, cx);
sub_0x69E8B0(ax, cx);
ax -= 0x20;
cx += 0x20;
@@ -991,13 +1331,13 @@ void sub_0x68B6C2(){
dx += 0x860;
dx >>= 5;
for (int i = dx; i > 0; i--){
- RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
+ sub_68B35F(ax, cx);
sub_0x69E8B0(ax, cx);
ax += 0x20;
cx += 0x20;
sub_0x69E8B0(ax, cx);
cx -= 0x20;
- RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
+ sub_68B35F(ax, cx);
sub_0x69E8B0(ax, cx);
ax -= 0x20;
cx -= 0x20;
@@ -1110,13 +1450,13 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in
gfx_fill_rect(dpi2, dpi2->x, dpi2->y, dpi2->width + dpi2->x - 1, dpi2->height + dpi2->y - 1, weather_colour);
}
RCT2_CALLPROC_EBPSAFE(0x6860C3); //string related
- }
+ }
//RCT2_CALLPROC_X(0x00685CBF, left, top, 0, right, (int)viewport, (int)dpi, bottom);
}
/**
- *
+ *
* rct2: 0x0068958D
*/
void screen_pos_to_map_pos(short *x, short *y)
@@ -1130,7 +1470,7 @@ void screen_pos_to_map_pos(short *x, short *y)
}
/**
- *
+ *
* rct2: 0x00664689
*/
void show_gridlines()
@@ -1149,7 +1489,7 @@ void show_gridlines()
}
/**
- *
+ *
* rct2: 0x006646B4
*/
void hide_gridlines()
@@ -1168,7 +1508,7 @@ void hide_gridlines()
}
/**
- *
+ *
* rct2: 0x00664E8E
*/
void show_land_rights()
@@ -1187,7 +1527,7 @@ void show_land_rights()
}
/**
- *
+ *
* rct2: 0x00664EB9
*/
void hide_land_rights()
@@ -1206,7 +1546,7 @@ void hide_land_rights()
}
/**
- *
+ *
* rct2: 0x00664EDD
*/
void show_construction_rights()
@@ -1225,7 +1565,7 @@ void show_construction_rights()
}
/**
- *
+ *
* rct2: 0x00664F08
*/
void hide_construction_rights()
@@ -1244,48 +1584,48 @@ void hide_construction_rights()
}
/**
- *
+ *
* rct2: 0x006CB70A
*/
void viewport_set_visibility(uint8 mode)
{
- rct_window* window = window_get_main();
+ rct_window* window = window_get_main();
- if(window != NULL) {
- rct_viewport* edi = window->viewport;
- uint32 invalidate = 0;
+ if (window != NULL) {
+ rct_viewport* edi = window->viewport;
+ uint32 invalidate = 0;
- switch(mode) {
- case 0: { //Set all these flags to 0, and invalidate if any were active
- uint16 mask = VIEWPORT_FLAG_UNDERGROUND_INSIDE | VIEWPORT_FLAG_SEETHROUGH_RIDES |
- VIEWPORT_FLAG_SEETHROUGH_SCENERY | VIEWPORT_FLAG_INVISIBLE_SUPPORTS |
- VIEWPORT_FLAG_LAND_HEIGHTS | VIEWPORT_FLAG_TRACK_HEIGHTS |
- VIEWPORT_FLAG_PATH_HEIGHTS | VIEWPORT_FLAG_INVISIBLE_PEEPS |
- VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_VERTICAL;
+ switch (mode) {
+ case 0: { //Set all these flags to 0, and invalidate if any were active
+ uint16 mask = VIEWPORT_FLAG_UNDERGROUND_INSIDE | VIEWPORT_FLAG_SEETHROUGH_RIDES |
+ VIEWPORT_FLAG_SEETHROUGH_SCENERY | VIEWPORT_FLAG_INVISIBLE_SUPPORTS |
+ VIEWPORT_FLAG_LAND_HEIGHTS | VIEWPORT_FLAG_TRACK_HEIGHTS |
+ VIEWPORT_FLAG_PATH_HEIGHTS | VIEWPORT_FLAG_INVISIBLE_PEEPS |
+ VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_VERTICAL;
- invalidate += edi->flags & mask;
- edi->flags &= ~mask;
- break;
- }
- case 1: //6CB79D
- case 4: //6CB7C4
- //Set underground on, invalidate if it was off
- invalidate += !(edi->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE);
- edi->flags |= VIEWPORT_FLAG_UNDERGROUND_INSIDE;
- break;
- case 2: //6CB7EB
- //Set track heights on, invalidate if off
- invalidate += !(edi->flags & VIEWPORT_FLAG_TRACK_HEIGHTS);
- edi->flags |= VIEWPORT_FLAG_TRACK_HEIGHTS;
- break;
- case 3: //6CB7B1
- case 5: //6CB7D8
- //Set underground off, invalidate if it was on
- invalidate += edi->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE;
- edi->flags &= ~((uint16)VIEWPORT_FLAG_UNDERGROUND_INSIDE);
- break;
- }
- if (invalidate != 0)
+ invalidate += edi->flags & mask;
+ edi->flags &= ~mask;
+ break;
+ }
+ case 1: //6CB79D
+ case 4: //6CB7C4
+ //Set underground on, invalidate if it was off
+ invalidate += !(edi->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE);
+ edi->flags |= VIEWPORT_FLAG_UNDERGROUND_INSIDE;
+ break;
+ case 2: //6CB7EB
+ //Set track heights on, invalidate if off
+ invalidate += !(edi->flags & VIEWPORT_FLAG_TRACK_HEIGHTS);
+ edi->flags |= VIEWPORT_FLAG_TRACK_HEIGHTS;
+ break;
+ case 3: //6CB7B1
+ case 5: //6CB7D8
+ //Set underground off, invalidate if it was on
+ invalidate += edi->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE;
+ edi->flags &= ~((uint16)VIEWPORT_FLAG_UNDERGROUND_INSIDE);
+ break;
+ }
+ if (invalidate != 0)
window_invalidate(window);
}
}
@@ -1303,13 +1643,43 @@ void viewport_set_visibility(uint8 mode)
*/
void get_map_coordinates_from_pos(int screenX, int screenY, int flags, int *x, int *y, int *z, rct_map_element **mapElement)
{
- int eax, ebx, ecx, edx, esi, edi, ebp;
- eax = screenX;
- ebx = screenY;
- edx = flags;
- RCT2_CALLFUNC_X(0x00685ADC, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
- if (x != NULL) *x = *((uint16*)&eax);
- if (y != NULL) *y = *((uint16*)&ecx);
- if (z != NULL) *z = *((uint8*)&ebx);
- if (mapElement != NULL) *mapElement = (rct_map_element*)edx;
+ RCT2_GLOBAL(0x9AC154, uint16_t) = flags & 0xFFFF;
+ RCT2_GLOBAL(0x9AC148, uint8_t) = 0;
+ rct_window* window = window_find_from_point(screenX, screenY);
+ if (window != NULL && window->viewport != NULL)
+ {
+ rct_viewport* viewport = window->viewport;
+ RCT2_GLOBAL(0x9AC138 + 4, int16_t) = screenX;
+ RCT2_GLOBAL(0x9AC138 + 6, int16_t) = screenY;
+ screenX -= (int)viewport->x;
+ screenY -= (int)viewport->y;
+ if (screenX >= 0 && screenX < (int)viewport->width && screenY >= 0 && screenY < (int)viewport->height)
+ {
+ screenX <<= viewport->zoom;
+ screenY <<= viewport->zoom;
+ screenX += (int)viewport->view_x;
+ screenY += (int)viewport->view_y;
+ RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_ZOOM, uint16_t) = viewport->zoom;
+ screenX &= (0xFFFF << viewport->zoom) & 0xFFFF;
+ screenY &= (0xFFFF << viewport->zoom) & 0xFFFF;
+ RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_PAINT_X, int16_t) = screenX;
+ RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_PAINT_Y, int16_t) = screenY;
+ rct_drawpixelinfo* dpi = RCT2_ADDRESS(RCT2_ADDRESS_VIEWPORT_DPI, rct_drawpixelinfo);
+ dpi->y = RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_PAINT_Y, int16_t);
+ dpi->height = 1;
+ dpi->zoom_level = RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_ZOOM, uint16_t);
+ dpi->x = RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_PAINT_X, int16_t);
+ dpi->width = 1;
+ RCT2_GLOBAL(0xEE7880, uint32_t) = 0xF1A4CC;
+ RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*) = dpi;
+ sub_0x68615B(0xEE788C);
+ sub_0x68B6C2();
+ RCT2_CALLPROC_X(0x688217, 0, 0, 0, 0, 0, 0, 0);
+ RCT2_CALLPROC_X(0x68862C, 0, 0, 0, 0, 0, 0, 0);
+ }
+ }
+ if (z != NULL) *z = RCT2_GLOBAL(0x9AC148, uint8_t);
+ if (x != NULL) *x = (int)RCT2_GLOBAL(0x9AC14C, int16_t);
+ if (y != NULL) *y = (int)RCT2_GLOBAL(0x9AC14E, int16_t);
+ if (mapElement != NULL) *mapElement = RCT2_GLOBAL(0x9AC150, rct_map_element*);
}
\ No newline at end of file
diff --git a/src/interface/window.c b/src/interface/window.c
index 30ba02612c..7613b0872a 100644
--- a/src/interface/window.c
+++ b/src/interface/window.c
@@ -594,7 +594,7 @@ void window_close_top()
if (RCT2_GLOBAL(0x0141F570, uint8) != 1)
return;
- for (w = g_window_list; w < RCT2_LAST_WINDOW; w++) {
+ for (w = RCT2_NEW_WINDOW - 1; w >= g_window_list; w--) {
if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))) {
window_close(w);
return;
diff --git a/src/localisation/language.c b/src/localisation/language.c
index 677dfa864b..dbc51414d4 100644
--- a/src/localisation/language.c
+++ b/src/localisation/language.c
@@ -32,7 +32,8 @@ const char *language_names[LANGUAGE_COUNT] = {
"Magyar", // LANGUAGE_HUNGARIAN
"Polski", // LANGUAGE_POLISH
"Espa\u00F1ol", // LANGUAGE_SPANISH
- "Svenska" // LANGUAGE_SWEDISH
+ "Svenska", // LANGUAGE_SWEDISH
+ "Italiano" // LANGUAGE_ITALIAN
};
const char *language_filenames[LANGUAGE_COUNT] = {
@@ -45,7 +46,8 @@ const char *language_filenames[LANGUAGE_COUNT] = {
"hungarian", // LANGUAGE_HUNGARIAN
"polish", // LANGUAGE_POLISH
"spanish_sp", // LANGUAGE_SPANISH
- "swedish" // LANGUAGE_SWEDISH
+ "swedish", // LANGUAGE_SWEDISH
+ "italian" // LANGUAGE_ITALIAN
};
int gCurrentLanguage = LANGUAGE_UNDEFINED;
@@ -236,7 +238,7 @@ void language_close()
}
const int OpenRCT2LangIdToObjectLangId[] = {
- 0, 0, 1, 3, 6, 2, 0, 0, 4, 7
+ 0, 0, 1, 3, 6, 2, 0, 0, 4, 7, 5
};
/* rct2: 0x0098DA16 */
@@ -312,4 +314,4 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/
RCT2_ADDRESS(0x009BF2D4, char*)[stringid] = pString;
return stringid;
}
-}
\ No newline at end of file
+}
diff --git a/src/localisation/language.h b/src/localisation/language.h
index 860d821dce..5f61838c33 100644
--- a/src/localisation/language.h
+++ b/src/localisation/language.h
@@ -34,6 +34,7 @@ enum {
LANGUAGE_POLISH,
LANGUAGE_SPANISH,
LANGUAGE_SWEDISH,
+ LANGUAGE_ITALIAN,
LANGUAGE_COUNT
};
diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c
index 5ba1213a73..83e8f50742 100644
--- a/src/ride/ride_data.c
+++ b/src/ride/ride_data.c
@@ -864,4 +864,19 @@ const uint8 RideAvailableBreakdowns[] = {
(1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 58 Mine Ride
(1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 59 LIM Launched Roller Coaster
(1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE) // 60 (none)
+};
+
+const rct_ride_entrance_definition RideEntranceDefinitions[12] = {
+ { 22664, 32, 2 }, // RIDE_ENTRANCE_STYLE_PLAIN
+ { 22760, 31, 21 }, // RIDE_ENTRANCE_STYLE_WOODEN
+ { 22680, 43, 2 }, // RIDE_ENTRANCE_STYLE_CANVAS_TENT
+ { 22728, 43, 19 }, // RIDE_ENTRANCE_STYLE_CASTLE_GREY
+ { 22712, 33, 19 }, // RIDE_ENTRANCE_STYLE_CASTLE_BROWN
+ { 22776, 32, 19 }, // RIDE_ENTRANCE_STYLE_JUNGLE
+ { 22744, 32, 20 }, // RIDE_ENTRANCE_STYLE_LOG_CABIN
+ { 22696, 34, 19 }, // RIDE_ENTRANCE_STYLE_CLASSICAL_ROMAN
+ { 22792, 40, 22 }, // RIDE_ENTRANCE_STYLE_ABSTRACT
+ { 22824, 35, 23 }, // RIDE_ENTRANCE_STYLE_SNOW_ICE
+ { 22840, 33, 19 }, // RIDE_ENTRANCE_STYLE_PAGODA
+ { 22856, 33, 2 } // RIDE_ENTRANCE_STYLE_SPACE
};
\ No newline at end of file
diff --git a/src/ride/ride_data.h b/src/ride/ride_data.h
index c2e81cc9f8..c5cac5fb9c 100644
--- a/src/ride/ride_data.h
+++ b/src/ride/ride_data.h
@@ -30,6 +30,12 @@ typedef struct {
rct_string_id unk_name;
} rct_ride_name_convention;
+typedef struct {
+ uint32 spriteIndex;
+ uint16 height;
+ uint16 var_06;
+} rct_ride_entrance_definition;
+
extern const bool hasRunningTrack[0x60];
extern const uint8 initialUpkeepCosts[0x60];
extern const uint8 costPerTrackPiece[0x60];
@@ -42,4 +48,6 @@ extern const rct_ride_name_convention RideNameConvention[96];
extern const uint8 RideAvailableModes[];
extern const uint8 RideAvailableBreakdowns[];
+extern const rct_ride_entrance_definition RideEntranceDefinitions[12];
+
#endif
\ No newline at end of file
diff --git a/src/windows/cheats.c b/src/windows/cheats.c
index ac7261a438..fcac4fca52 100644
--- a/src/windows/cheats.c
+++ b/src/windows/cheats.c
@@ -66,7 +66,8 @@ enum WINDOW_CHEATS_WIDGET_IDX {
WIDX_WATER_PLANTS,
WIDX_FIX_VANDALISM,
WIDX_REMOVE_LITTER,
- WIDX_WIN_SCENARIO
+ WIDX_WIN_SCENARIO,
+ WIDX_RENEW_RIDES
};
#pragma region MEASUREMENTS
@@ -137,6 +138,7 @@ static rct_widget window_cheats_misc_widgets[] = {
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(7), HPL(7), 2756, STR_NONE}, // Remove litter
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), 2766, STR_NONE}, // Win scenario
+ { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(7), HPL(7), 5123, STR_NONE}, // Renew rides
{ WIDGETS_END },
};
@@ -259,7 +261,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_HIGH_MONEY) | (1 << WIDX_PARK_ENTRANCE_FEE),
(1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_HAPPY_GUESTS) | (1 << WIDX_TRAM_GUESTS),
- (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_DECREASE_GAME_SPEED) | (1 << WIDX_INCREASE_GAME_SPEED) | (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_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_DECREASE_GAME_SPEED) | (1 << WIDX_INCREASE_GAME_SPEED) | (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_RENEW_RIDES)
};
static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w);
@@ -347,6 +349,16 @@ static void cheat_fix_rides()
}
}
+static void cheat_renew_rides()
+{
+ int i;
+ rct_ride *ride;
+
+ FOR_ALL_RIDES(i, ride)
+ ride->build_date = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16);
+ window_invalidate_by_class(WC_RIDE);
+}
+
static void cheat_clear_loan()
{
// TODO, this sets the loan but stops loan borrowing from working, possible due to cheat detection stuff
@@ -519,6 +531,9 @@ static void window_cheats_misc_mouseup()
case WIDX_WIN_SCENARIO:
scenario_success();
break;
+ case WIDX_RENEW_RIDES:
+ cheat_renew_rides();
+ break;
}
}
@@ -681,4 +696,4 @@ static void window_cheats_misc_tool_down()
mapElement->clearance_height = 0;
}
} while (!map_element_is_last_for_tile(mapElement++));
-}
\ No newline at end of file
+}
diff --git a/src/windows/ride.c b/src/windows/ride.c
index ff84a7e466..0a949ee097 100644
--- a/src/windows/ride.c
+++ b/src/windows/ride.c
@@ -3541,17 +3541,20 @@ static void window_ride_set_track_colour_scheme(rct_window *w, int x, int y)
newColourScheme = (uint8)(*((uint16*)&w->var_494));
+ int z;
+
+ get_map_coordinates_from_pos(x, y, -5, &x, &y, &z, &mapElement);
// Get map coordinates from point
- int eax, ebx, ecx, edx, esi, edi, ebp;
+ /*int eax, ebx, ecx, edx, esi, edi, ebp;
eax = x;
ebx = y;
edx = -5;
RCT2_CALLFUNC_X(0x00685ADC, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
x = eax & 0xFFFF;
y = ecx & 0xFFFF;
- mapElement = (rct_map_element*)edx;
+ mapElement = (rct_map_element*)edx;*/
- if ((ebx & 0xFF) != 3)
+ if ((/*ebx*/z & 0xFF) != 3)
return;
if (mapElement->properties.track.ride_index != w->number)
return;
@@ -4129,7 +4132,7 @@ static void window_ride_colour_paint()
spriteIndex = (trackColour.additional << 24) | (trackColour.main << 19);
spriteIndex |= 0xA0000000;
- spriteIndex += RCT2_GLOBAL(0x00993E7C + (ride->entrance_style * 8), uint32);
+ spriteIndex += RideEntranceDefinitions[ride->entrance_style].spriteIndex;
// Back
gfx_draw_sprite(clippedDpi, spriteIndex, 34, 20, terniaryColour);
@@ -5877,7 +5880,8 @@ static void window_ride_customer_paint()
y += 2;
// Age
- age = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16) - ride->build_date) / 8;
+ //If the ride has a build date that is in the future, show it as built this year.
+ age = max((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16) - ride->build_date) / 8, 0);
stringId = age == 0 ?
STR_BUILT_THIS_YEAR :
age == 1 ?
diff --git a/src/world/map.c b/src/world/map.c
index b15d1d8a6d..c1ee8373d4 100644
--- a/src/world/map.c
+++ b/src/world/map.c
@@ -458,15 +458,6 @@ int map_coord_is_connected(int x, int y, int z, uint8 faceDirection)
return 0;
}
-/**
- *
- * rct2: 0x0068AFAD
- */
-void map_invalidate_animations()
-{
- RCT2_CALLPROC_EBPSAFE(0x0068AFAD);
-}
-
/**
*
* rct2: 0x006A876D
diff --git a/src/world/map.h b/src/world/map.h
index e9671394a8..cd9b08bdd3 100644
--- a/src/world/map.h
+++ b/src/world/map.h
@@ -181,6 +181,10 @@ enum {
PATH_TILE
};
+enum {
+ PATH_FLAG_QUEUE_BANNER = 1 << 3
+};
+
enum {
ENTRANCE_TYPE_RIDE_ENTRANCE,
ENTRANCE_TYPE_RIDE_EXIT,
@@ -246,7 +250,6 @@ rct_map_element *map_get_surface_element_at(int x, int y);
int map_element_height(int x, int y);
void sub_68B089();
int map_coord_is_connected(int x, int y, int z, uint8 faceDirection);
-void map_invalidate_animations();
void sub_6A876D();
int map_is_location_owned(int x, int y, int z);
int map_is_location_in_park(int x, int y);
diff --git a/src/world/map_animation.c b/src/world/map_animation.c
new file mode 100644
index 0000000000..35dc9ca2fa
--- /dev/null
+++ b/src/world/map_animation.c
@@ -0,0 +1,392 @@
+/*****************************************************************************
+ * 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 "../ride/ride.h"
+#include "../ride/ride_data.h"
+#include "map_animation.h"
+#include "map.h"
+#include "scenery.h"
+#include "sprite.h"
+
+rct_animated_object *gAnimatedObjects = (rct_animated_object*)0x013886A0;
+
+typedef bool (*map_animation_invalidate_event_handler)(int x, int y, int baseZ);
+
+static bool map_animation_invalidate_ride_entrance(int x, int y, int baseZ);
+static bool map_animation_invalidate_queue_banner(int x, int y, int baseZ);
+static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ);
+static bool map_animation_invalidate_park_entrance(int x, int y, int baseZ);
+static bool map_animation_invalidate_remove(int x, int y, int baseZ);
+static bool map_animation_invalidate_banner(int x, int y, int baseZ);
+static bool map_animation_invalidate_large_scenery(int x, int y, int baseZ);
+static bool sub_6E5B50(int x, int y, int baseZ);
+static bool map_animation_invalidate_wall(int x, int y, int baseZ);
+
+/** rct2: 0x009819DC */
+const uint32 _animatedObjectEventHandlers[] = {
+ (uint32)map_animation_invalidate_ride_entrance, // ride entrance
+ (uint32)map_animation_invalidate_queue_banner, // queue banner
+ (uint32)map_animation_invalidate_small_scenery, // small scenery + peep
+ (uint32)map_animation_invalidate_park_entrance, // park entrance
+ 0x006CE29E, // track
+ 0x006CE2F3, // track
+ 0x006CE39D, // track
+ 0x006CE348, // track
+ 0x006CE3FA, // track
+ (uint32)map_animation_invalidate_remove, // simply return true
+ (uint32)map_animation_invalidate_banner, // banner
+ (uint32)map_animation_invalidate_large_scenery, // large scenery
+ (uint32)sub_6E5B50, // wall
+ (uint32)map_animation_invalidate_wall // wall
+};
+
+
+static bool map_animation_invalidate(rct_animated_object *obj);
+
+/**
+ *
+ * rct2: 0x0068AFAD
+ */
+void map_animation_invalidate_all()
+{
+ rct_animated_object *aobj = &gAnimatedObjects[0];
+ int numAnimatedObjects = RCT2_GLOBAL(0x0138B580, uint16);
+ while (numAnimatedObjects > 0) {
+ if (map_animation_invalidate(aobj)) {
+ // Remove animated object
+ RCT2_GLOBAL(0x0138B580, uint16)--;
+ numAnimatedObjects--;
+ if (numAnimatedObjects > 0)
+ memmove(aobj, aobj + 1, numAnimatedObjects);
+ } else {
+ numAnimatedObjects--;
+ aobj++;
+ }
+ }
+}
+
+/**
+ * @returns true if the animation should be removed.
+ */
+static bool map_animation_invalidate(rct_animated_object *obj)
+{
+ uint32 address = _animatedObjectEventHandlers[obj->type];
+ if (((address >> 20) & 0xFFF) == 0x006) {
+ int result = RCT2_CALLPROC_X(address, obj->x, 0, obj->y, obj->baseZ, 0, 0, 0);
+ return (result & 0x100) != 0;
+ } else {
+ map_animation_invalidate_event_handler handler = (map_animation_invalidate_event_handler)address;
+ return handler(obj->x, obj->y, obj->baseZ);
+ }
+}
+
+/**
+ *
+ * rct2: 0x00666670
+ */
+static bool map_animation_invalidate_ride_entrance(int x, int y, int baseZ)
+{
+ rct_map_element *mapElement;
+ rct_ride *ride;
+ const rct_ride_entrance_definition *entranceDefinition;
+
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (mapElement->base_height != baseZ)
+ continue;
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE)
+ continue;
+ if (mapElement->properties.entrance.type != ENTRANCE_TYPE_RIDE_ENTRANCE)
+ continue;
+
+ ride = GET_RIDE(mapElement->properties.entrance.ride_index);
+ entranceDefinition = &RideEntranceDefinitions[ride->entrance_style];
+
+ int height = (mapElement->base_height * 8) + entranceDefinition->height + 8;
+ map_invalidate_tile(x, y, height, height + 16);
+ return false;
+ } while (!map_element_is_last_for_tile(mapElement++));
+
+ return true;
+}
+
+/**
+ *
+ * rct2: 0x006A7BD4
+ */
+static bool map_animation_invalidate_queue_banner(int x, int y, int baseZ)
+{
+ rct_map_element *mapElement;
+
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (mapElement->base_height != baseZ)
+ continue;
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH)
+ continue;
+ if (!(mapElement->flags & 1))
+ continue;
+ if (!(mapElement->properties.path.type & PATH_FLAG_QUEUE_BANNER))
+ continue;
+
+ int direction = ((mapElement->type >> 6) & 3) + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8);
+ if (direction == MAP_ELEMENT_DIRECTION_NORTH || direction == MAP_ELEMENT_DIRECTION_EAST) {
+ baseZ = mapElement->base_height * 8;
+ map_invalidate_tile(x, y, baseZ + 16, baseZ + 30);
+ }
+ return false;
+ } while (!map_element_is_last_for_tile(mapElement++));
+
+ return true;
+}
+
+/**
+ *
+ * rct2: 0x006E32C9
+ */
+static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ)
+{
+ rct_map_element *mapElement;
+ rct_scenery_entry *sceneryEntry;
+ rct_sprite *sprite;
+ rct_peep *peep;
+
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (mapElement->base_height != baseZ)
+ continue;
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY)
+ continue;
+ if (mapElement->flags & (1 << 4))
+ continue;
+
+ sceneryEntry = g_smallSceneryEntries[mapElement->properties.scenery.type];
+ if (sceneryEntry->small_scenery.flags & 0xD800) {
+ map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8);
+ return false;
+ }
+
+ if (sceneryEntry->small_scenery.flags & 0x2000) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x3FF)) {
+ int direction = mapElement->type & 3;
+ int x2 = x - TileDirectionDelta[direction].x;
+ int y2 = y - TileDirectionDelta[direction].y;
+
+ uint16 spriteIdx = RCT2_ADDRESS(0x00F1EF60, uint16)[((x2 & 0x1FE0) << 3) | (y2 >> 5)];
+ for (; spriteIdx != 0xFFFF; spriteIdx = sprite->unknown.var_02) {
+ sprite = &g_sprite_list[spriteIdx];
+ if (sprite->unknown.linked_list_type_offset != SPRITE_LINKEDLIST_OFFSET_PEEP)
+ continue;
+
+ peep = &sprite->peep;
+ if (peep->state != PEEP_STATE_WALKING)
+ continue;
+ if (peep->z != mapElement->base_height * 8)
+ continue;
+ if (peep->action < PEEP_ACTION_NONE_1)
+ continue;
+
+ peep->action = 0;
+ peep->action_frame = 0;
+ peep->var_70 = 0;
+ sub_693B58(peep);
+ RCT2_CALLPROC_X(0x006EC53F, 0, 0, 0, 0, (int)peep, 0, 0);
+ break;
+ }
+ }
+ map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8);
+ return false;
+ }
+ } while (!map_element_is_last_for_tile(mapElement++));
+ return true;
+}
+
+/**
+ *
+ * rct2: 0x00666C63
+ */
+static bool map_animation_invalidate_park_entrance(int x, int y, int baseZ)
+{
+ rct_map_element *mapElement;
+
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (mapElement->base_height != baseZ)
+ continue;
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE)
+ continue;
+ if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE)
+ continue;
+ if (mapElement->properties.entrance.index & 0x0F)
+ continue;
+
+ baseZ = mapElement->base_height * 8;
+ map_invalidate_tile(x, y, baseZ + 32, baseZ + 64);
+ return false;
+ } while (!map_element_is_last_for_tile(mapElement++));
+
+ return true;
+}
+
+/**
+ *
+ * rct2: 0x0068DF8F
+ */
+static bool map_animation_invalidate_remove(int x, int y, int baseZ)
+{
+ return true;
+}
+
+/**
+ *
+ * rct2: 0x006BA2BB
+ */
+static bool map_animation_invalidate_banner(int x, int y, int baseZ)
+{
+ rct_map_element *mapElement;
+
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (mapElement->base_height != baseZ)
+ continue;
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_BANNER)
+ continue;
+
+ baseZ = mapElement->base_height * 8;
+ map_invalidate_tile(x, y, baseZ, baseZ + 16);
+ return false;
+ } while (!map_element_is_last_for_tile(mapElement++));
+
+ return true;
+}
+
+/**
+ *
+ * rct2: 0x006B94EB
+ */
+static bool map_animation_invalidate_large_scenery(int x, int y, int baseZ)
+{
+ rct_map_element *mapElement;
+ rct_scenery_entry *sceneryEntry;
+
+ bool wasInvalidated = false;
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (mapElement->base_height != baseZ)
+ continue;
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE)
+ continue;
+
+ sceneryEntry = g_largeSceneryEntries[mapElement->properties.scenery.type & 0x3FF];
+ if (sceneryEntry->large_scenery.flags & (1 << 3)) {
+ int z = mapElement->base_height * 8;
+ map_invalidate_tile(x, y, z, z + 16);
+ wasInvalidated = true;
+ }
+ } while (!map_element_is_last_for_tile(mapElement++));
+
+ return !wasInvalidated;
+}
+
+/**
+ *
+ * rct2: 0x006E5B50
+ */
+static bool sub_6E5B50(int x, int y, int baseZ)
+{
+ rct_map_element *mapElement;
+ rct_scenery_entry *sceneryEntry;
+
+ if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 1)
+ return false;
+
+ bool wasInvalidated = false;
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (mapElement->base_height != baseZ)
+ continue;
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_FENCE)
+ continue;
+
+ sceneryEntry = g_wallSceneryEntries[mapElement->properties.scenery.type];
+ if (!(sceneryEntry->wall.flags & (1 << 4)))
+ continue;
+
+ uint8 di = 0;
+ uint8 bl = mapElement->properties.fence.item[2];
+ uint8 bh = bl & 0x78;
+ if (bh != 0) {
+ if (bh == 0x78) {
+ bl &= 0x87;
+ } else {
+ di |= 2;
+ if (bh != 40) {
+ bh += 8;
+ if (bh == 104 && !(sceneryEntry->wall.flags & (1 << 5)))
+ bh = 120;
+
+ di |= 1;
+ bl &= 135;
+ bl |= bh;
+ }
+ }
+ }
+
+ mapElement->properties.fence.item[2] = bl;
+ if (di & 1) {
+ int z = mapElement->base_height * 8;
+ map_invalidate_tile(x, y, z, z + 32);
+ }
+ if (di & 2)
+ wasInvalidated = true;
+ } while (!map_element_is_last_for_tile(mapElement++));
+
+ return !wasInvalidated;
+}
+
+/**
+ *
+ * rct2: 0x006E5EE4
+ */
+static bool map_animation_invalidate_wall(int x, int y, int baseZ)
+{
+ rct_map_element *mapElement;
+ rct_scenery_entry *sceneryEntry;
+
+ bool wasInvalidated = false;
+ mapElement = map_get_first_element_at(x >> 5, y >> 5);
+ do {
+ if (mapElement->base_height != baseZ)
+ continue;
+ if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_FENCE)
+ continue;
+
+ sceneryEntry = g_wallSceneryEntries[mapElement->properties.scenery.type];
+ if (!(sceneryEntry->wall.flags2 & (1 << 4)) && sceneryEntry->wall.var_0D == 255)
+ continue;
+
+ int z = mapElement->base_height * 8;
+ map_invalidate_tile(x, y, z, z + 16);
+ wasInvalidated = true;
+ } while (!map_element_is_last_for_tile(mapElement++));
+
+ return !wasInvalidated;
+}
\ No newline at end of file
diff --git a/src/world/map_animation.h b/src/world/map_animation.h
new file mode 100644
index 0000000000..e766f60b3b
--- /dev/null
+++ b/src/world/map_animation.h
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ * 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 .
+ *****************************************************************************/
+
+#ifndef _MAP_ANIMATION_H_
+#define _MAP_ANIMATION_H_
+
+#include "../common.h"
+
+/**
+ * Animated object
+ * size: 0x06
+ */
+typedef struct {
+ uint8 baseZ;
+ uint8 type;
+ uint16 x;
+ uint16 y;
+} rct_animated_object;
+
+extern rct_animated_object *gAnimatedObjects;
+
+void map_animation_invalidate_all();
+
+#endif
\ No newline at end of file
diff --git a/src/world/park.h b/src/world/park.h
index 5098c17369..fd4b97ef49 100644
--- a/src/world/park.h
+++ b/src/world/park.h
@@ -35,7 +35,7 @@ enum {
PARK_FLAGS_FORBID_HIGH_CONSTRUCTION = (1 << 5), // below tree height
PARK_FLAGS_PREF_LESS_INTENSE_RIDES = (1 << 6),
PARK_FLAGS_FORBID_MARKETING_CAMPAIGN = (1 << 7),
- PARK_FLAGS_PREF_MORE_INTENSE_RIDES = (1 << 8),
+ PARK_FLAGS_PREF_MORE_INTENSE_RIDES = (1 << 9),
PARK_FLAGS_NO_MONEY = (1 << 11),
PARK_FLAGS_DIFFICULT_GUEST_GENERATION = (1 << 12),
PARK_FLAGS_PARK_FREE_ENTRY = (1 << 13),
diff --git a/src/world/sprite.h b/src/world/sprite.h
index ea1ec8a105..2eca98ca63 100644
--- a/src/world/sprite.h
+++ b/src/world/sprite.h
@@ -66,6 +66,10 @@ typedef struct {
uint8 sprite_direction; //direction of sprite? 0x1e
uint8 pad_1F[3]; // 0x1f
uint16 name_string_idx; // 0x22
+ uint8 pad_24[7];
+ uint8 var_2B;
+ uint8 pad_2C[0x45];
+ uint8 var_71;
} rct_unk_sprite;
typedef struct {