mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge branch 'develop' into footpath-commands
This commit is contained in:
commit
886f30d00c
|
@ -0,0 +1,80 @@
|
|||
# Contributors to OpenRCT2
|
||||
Includes all git commit authors. Aliases are GitHub user names.
|
||||
|
||||
## Project team
|
||||
* Ted John (IntelOrca) - Owner
|
||||
|
||||
## Long term developers
|
||||
* Ted John (IntelOrca)
|
||||
* Duncan Frost (duncanspumpkin)
|
||||
|
||||
## Implementation (RCT2)
|
||||
* Ted John (IntelOrca)
|
||||
* Duncan Frost (duncanspumpkin)
|
||||
* Peter Hill (ZedFree) - String handling, misc.
|
||||
* (qcz) - Scenery window, misc.
|
||||
* Matthias Lanzinger (lnz) - Climate, finance, scenario, ride reachability
|
||||
* (zsilencer) - Audio, misc.
|
||||
* Adrian Wielgosik (adrian17) - Misc.
|
||||
* (hexdec) - Misc.
|
||||
* Dennis Devriendt (ddevrien) - Misc.
|
||||
* Maciek Baron (MaciekBaron) - Misc.
|
||||
* (AngeloG) - Scrollbar input, misc.
|
||||
* (jcdavis) - Misc.
|
||||
* (marcotc) - Rain drawing, misc.
|
||||
* (vanderkleij) - Misc.
|
||||
* Ben Pye (benpye) - Misc.
|
||||
* (JeroenSack) - Misc.
|
||||
* (Vijfhoek) - Misc.
|
||||
* (wolfreak99) - Misc.
|
||||
* Inseok Lee (dlunch) - Original command line
|
||||
|
||||
## Additional implementation (OpenRCT2)
|
||||
* (atmaxinger) - User configuration
|
||||
* (anyc) - Housecleaning, cross-platform fixes
|
||||
* Miso Zmiric (mzmiric5) - Misc.
|
||||
* (DutchRPW) - Housecleaning, initialisation
|
||||
* Jørn Lomax (jvlomax) - User configuration
|
||||
* (KingHual) - Housecleaning
|
||||
* Alexander Overvoorde (Overv) - Misc.
|
||||
* (eezstreet) - Misc.
|
||||
|
||||
## Bug fixes
|
||||
* (halfbro)
|
||||
* (Myrtle)
|
||||
* (nean)
|
||||
|
||||
## Toolchain
|
||||
* (Balletie) - OSX
|
||||
* Kevin Burke (kevinburke) - OSX, Unix
|
||||
* Miso Zmiric (mzmiric5) - OSX
|
||||
* (JarnoVgr) - Windows build server
|
||||
* Ted John (IntelOrca) - Windows
|
||||
|
||||
## Documentation
|
||||
* (honzi)
|
||||
* Kevin Burke (kevinburke)
|
||||
* James Robertson (rd3k)
|
||||
* Max Boße (MakaHost)
|
||||
* (MaxBareiss)
|
||||
* Philip Plarkson (Philpax)
|
||||
* (RollingStar)
|
||||
|
||||
## Translation
|
||||
* English (UK) - Ted John (IntelOrca), (Tinytimrob)
|
||||
* French - (fbourigault)
|
||||
* German - (atmaxinger), (Yepoleb)
|
||||
* Dutch - Michael Steenbeek (Gymnasiast), (hostbrute), (mrtnptrs), (xzbobzx)
|
||||
* Spanish - (mdtrooper)
|
||||
* Swedish - (Jinxit), (mharrys)
|
||||
|
||||
## RollerCoaster Tycoon 2 credits
|
||||
Design and programming by Chris Sawyer
|
||||
Graphics by Simon Foster
|
||||
Sound and music by Allister Brimble
|
||||
Additional sounds recorded by David Ellis
|
||||
Representation by Jacqui Lyons at Mar jacq Ltd.
|
||||
|
||||
Thanks to: Peter James Adcock, Joe Booth, and John Wardley
|
||||
|
||||
Licensed to Infogrames Interactive Inc.
|
|
@ -561,13 +561,13 @@ STR_0559 :
|
|||
STR_0560 :
|
||||
STR_0561 :
|
||||
STR_0562 :
|
||||
STR_0563 :Bezoekers zitten in comfortabele treinen met enkel een schootbeugel en gaan door soepel door grote afdalingen en kronkelende stukken baan, met veel 'airtime' in de heuvels
|
||||
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_0568 :
|
||||
STR_0569 :Bezoekers zitten in een speciaal tuig onder de baan en krijgen zo de ervaring dat ze vliegen
|
||||
STR_0569 :Bezoekers zitten in een speciaal tuigje onder de baan en krijgen zo de ervaring dat ze vliegen
|
||||
STR_0570 :
|
||||
STR_0571 :
|
||||
STR_0572 :
|
||||
|
@ -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 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_0587 :
|
||||
STR_0588 :
|
||||
STR_0589 :
|
||||
|
@ -879,7 +879,7 @@ STR_0877 :Te laag!
|
|||
STR_0878 :Te hoog!
|
||||
STR_0879 :Kan het land hier niet verlagen...
|
||||
STR_0880 :Kan het land hier niet verhogen...
|
||||
STR_0881 :Object in de weg
|
||||
STR_0881 :Object staat in de weg
|
||||
STR_0882 :Spel laden
|
||||
STR_0883 :Spel opslaan
|
||||
STR_0884 :Landschap laden
|
||||
|
@ -892,18 +892,18 @@ STR_0890 :SCR{COMMA16}.PNG
|
|||
STR_0891 :Screenshot
|
||||
STR_0892 :Screenshot opgeslagen als '{STRINGID}'
|
||||
STR_0893 :Screenshot maken mislukt!
|
||||
STR_0894 :Landscape data area zit vol!
|
||||
STR_0894 :"Landscape data area" zit vol!
|
||||
STR_0895 :Kan niet gedeeltelijk onder en boven de grond bouwen
|
||||
STR_0896 :{POP16}{POP16}{STRINGID} Constructie
|
||||
STR_0897 :Richting
|
||||
STR_0898 :{SMALLFONT}{BLACK}Bocht naar links
|
||||
STR_0899 :{SMALLFONT}{BLACK}Bocht naar rechts
|
||||
STR_0900 :{SMALLFONT}{BLACK}Bocht naar links (kleine radius)
|
||||
STR_0901 :{SMALLFONT}{BLACK}Bocht naar rechts (kleine radius)
|
||||
STR_0902 :{SMALLFONT}{BLACK}Bocht naar links (zeer kleine radius)
|
||||
STR_0903 :{SMALLFONT}{BLACK}Bocht naar rechts (zeer kleine radius)
|
||||
STR_0904 :{SMALLFONT}{BLACK}Bocht naar links (grote radius)
|
||||
STR_0905 :{SMALLFONT}{BLACK}Bocht naar rechts (grote radius)
|
||||
STR_0900 :{SMALLFONT}{BLACK}Bocht naar links (kleine straal)
|
||||
STR_0901 :{SMALLFONT}{BLACK}Bocht naar rechts (kleine straal)
|
||||
STR_0902 :{SMALLFONT}{BLACK}Bocht naar links (zeer kleine straal)
|
||||
STR_0903 :{SMALLFONT}{BLACK}Bocht naar rechts (zeer kleine straal)
|
||||
STR_0904 :{SMALLFONT}{BLACK}Bocht naar links (grote straal)
|
||||
STR_0905 :{SMALLFONT}{BLACK}Bocht naar rechts (straal)
|
||||
STR_0906 :{SMALLFONT}{BLACK}Recht stuk
|
||||
STR_0907 :Helling
|
||||
STR_0908 :Roll/Banking
|
||||
|
@ -911,10 +911,10 @@ STR_0909 :Stoelrot.
|
|||
STR_0910 :{SMALLFONT}{BLACK}Roll voor bocht naar links
|
||||
STR_0911 :{SMALLFONT}{BLACK}Roll voor bocht naar rechts
|
||||
STR_0912 :{SMALLFONT}{BLACK}Geen roll
|
||||
STR_0913 :{SMALLFONT}{BLACK}Ga naar vorig segment
|
||||
STR_0914 :{SMALLFONT}{BLACK}Ga naar volgend segment
|
||||
STR_0915 :{SMALLFONT}{BLACK}Bouw het geselecteerde segment
|
||||
STR_0916 :{SMALLFONT}{BLACK}Verwijder het gemarkeerde segment
|
||||
STR_0913 :{SMALLFONT}{BLACK}Ga naar vorig gedeelte
|
||||
STR_0914 :{SMALLFONT}{BLACK}Ga naar volgend gedeelte
|
||||
STR_0915 :{SMALLFONT}{BLACK}Bouw het geselecteerde gedeelte
|
||||
STR_0916 :{SMALLFONT}{BLACK}Verwijder het gemarkeerde gedeelte
|
||||
STR_0917 :{SMALLFONT}{BLACK}Verticale val
|
||||
STR_0918 :{SMALLFONT}{BLACK}Steile helling naar beneden
|
||||
STR_0919 :{SMALLFONT}{BLACK}Helling naar beneden
|
||||
|
@ -932,9 +932,9 @@ STR_0930 :S-bocht (rechts)
|
|||
STR_0931 :Verticale looping (links)
|
||||
STR_0932 :Verticale looping (rechts)
|
||||
STR_0933 :Verhoog of verlaag eerst het land
|
||||
STR_0934 :Attractieingang in de weg
|
||||
STR_0935 :Attractieuitgang in de weg
|
||||
STR_0936 :Parkingang in de weg
|
||||
STR_0934 :Attractieingang staat in de weg
|
||||
STR_0935 :Attractieuitgang staat in de weg
|
||||
STR_0936 :Parkingang staat in de weg
|
||||
STR_0937 :{SMALLFONT}{BLACK}Beeldopties
|
||||
STR_0938 :{SMALLFONT}{BLACK}Landhoogte en -helling aanpassen
|
||||
STR_0939 :Zicht ondergronds/binnen
|
||||
|
@ -945,7 +945,7 @@ STR_0943 :Doorzichtig decor
|
|||
STR_0944 :Opslaan
|
||||
STR_0945 :Niet opslaan
|
||||
STR_0946 :Annuleren
|
||||
STR_0947 :Dit spel opslaan voordat je een ander laadt?
|
||||
STR_0947 :Dit spel opslaan voordat je een ander spel laadt?
|
||||
STR_0948 :Dit spel opslaan voordat je afsluit?
|
||||
STR_0949 :Dit spel opslaan voordat je afsluit?
|
||||
STR_0950 :Spel laden
|
||||
|
@ -953,7 +953,7 @@ STR_0951 :Spel afsluiten
|
|||
STR_0952 :Spel afsluiten
|
||||
STR_0953 :Landschap laden
|
||||
STR_0954 :
|
||||
STR_0955 :{SMALLFONT}{BLACK}Selecteer de draaiing van de stoelen voor dit segment
|
||||
STR_0955 :{SMALLFONT}{BLACK}Selecteer de draaiing van de stoelen voor dit gedeelte
|
||||
STR_0956 :-180{DEGREE}
|
||||
STR_0957 :-135{DEGREE}
|
||||
STR_0958 :-90{DEGREE}
|
||||
|
@ -1003,7 +1003,7 @@ STR_1001 :Baan is ongeschikt voor dit type trein
|
|||
STR_1002 :Kan {POP16}{POP16}{POP16}{STRINGID} niet openen...
|
||||
STR_1003 :Kan {POP16}{POP16}{POP16}{STRINGID} niet testen...
|
||||
STR_1004 :Kan {POP16}{POP16}{POP16}{STRINGID} niet sluiten...
|
||||
STR_1005 :Kan verbouwing van {POP16}{POP16}{POP16}{STRINGID} niet beginnen...
|
||||
STR_1005 :Kan de verbouwing van {POP16}{POP16}{POP16}{STRINGID} niet starten...
|
||||
STR_1006 :Moet eerst worden gesloten
|
||||
STR_1007 :Kan niet voldoende voertuigen aanmaken
|
||||
STR_1008 :{SMALLFONT}{BLACK}Attractie openen, sluiten of testen
|
||||
|
@ -1013,7 +1013,7 @@ STR_1011 :Alles sluiten
|
|||
STR_1012 :Alles openen
|
||||
STR_1013 :Park sluiten
|
||||
STR_1014 :Park openen
|
||||
STR_1015 :Kan in deze modus niet met meer dan een station werken
|
||||
STR_1015 :Kan in deze modus niet met meer dan één station werken
|
||||
STR_1016 :Kan in deze modus niet met minder dan twee stations werken
|
||||
STR_1017 :Kan modus niet veranderen...
|
||||
STR_1018 :Kan geen veranderingen aanbrengen...
|
||||
|
@ -1057,7 +1057,7 @@ STR_1055 :{SMALLFONT}{BLACK}Persoonsnaam
|
|||
STR_1056 :{SMALLFONT}{BLACK}Werknemersnaam
|
||||
STR_1057 :Attractienaam
|
||||
STR_1058 :Voer een nieuwe naam in voor deze attractie:
|
||||
STR_1059 :Kan deze attractienaam geen andere naam geven...
|
||||
STR_1059 :Kan deze attractie geen andere naam geven...
|
||||
STR_1060 :Ongeldige attractienaam
|
||||
STR_1061 :Normale stand
|
||||
STR_1062 :Voortdurend circuit
|
||||
|
@ -1068,8 +1068,8 @@ STR_1066 :Bootverhuurmodus
|
|||
STR_1067 :Opwaartse lancering
|
||||
STR_1068 :Draaiendeliftmodus
|
||||
STR_1069 :Station-naar-station
|
||||
STR_1070 :Enkele rit per toegang
|
||||
STR_1071 :Onbeperkt aantal ritten per toegang
|
||||
STR_1070 :Enkele rit per entree
|
||||
STR_1071 :Onbeperkt aantal ritten per entree
|
||||
STR_1072 :Doolhofstand
|
||||
STR_1073 :Racestand
|
||||
STR_1074 :Botsautomodus
|
||||
|
@ -1177,7 +1177,7 @@ STR_1175 :Kan dit niet op hellend voetpad neerzetten
|
|||
STR_1176 :Kan hier geen voetpad neerzetten...
|
||||
STR_1177 :Kan dit voetpad niet verwijderen...
|
||||
STR_1178 :Landhelling is ongeschikt
|
||||
STR_1179 :Voetpad in de weg
|
||||
STR_1179 :Voetpad staat in de weg
|
||||
STR_1180 :Dit kan niet onder water worden gebouwd!
|
||||
STR_1181 :Voetpaden
|
||||
STR_1182 :Type
|
||||
|
@ -1187,8 +1187,8 @@ STR_1185 :{SMALLFONT}{BLACK}Richting
|
|||
STR_1186 :{SMALLFONT}{BLACK}Helling naar beneden
|
||||
STR_1187 :{SMALLFONT}{BLACK}Vlak
|
||||
STR_1188 :{SMALLFONT}{BLACK}Helling naar boven
|
||||
STR_1189 :{SMALLFONT}{BLACK}Bouw het geselecteerde segment
|
||||
STR_1190 :{SMALLFONT}{BLACK}Verwijder vorig segment
|
||||
STR_1189 :{SMALLFONT}{BLACK}Bouw het geselecteerde gedeelte
|
||||
STR_1190 :{SMALLFONT}{BLACK}Verwijder vorig gedeelte
|
||||
STR_1191 :{BLACK}{STRINGID}
|
||||
STR_1192 :{OUTLINE}{RED}{STRINGID}
|
||||
STR_1193 :{WINDOW_COLOUR_2}{STRINGID}
|
||||
|
@ -1218,7 +1218,7 @@ STR_1216 :{SMALLFONT}{BLACK}Selecteer of een trein op hetzelfde moment moet v
|
|||
STR_1217 :{COMMA16} seconden
|
||||
STR_1218 :{BLACK}{SMALLUP}
|
||||
STR_1219 :{BLACK}{SMALLDOWN}
|
||||
STR_1220 :Alleen uitgang
|
||||
STR_1220 :Alleen een uitgang
|
||||
STR_1221 :Geen ingang
|
||||
STR_1222 :Geen uitgang
|
||||
STR_1223 :{SMALLFONT}{BLACK}Transportattracties
|
||||
|
@ -1383,7 +1383,7 @@ STR_1381 :Gedraaide liftheuvel (links)
|
|||
STR_1382 :Gedraaide liftheuvel (rechts)
|
||||
STR_1383 :Kwartlooping
|
||||
STR_1384 :{YELLOW}{STRINGID}
|
||||
STR_1385 :{SMALLFONT}{BLACK}Andere baanconfiguraties
|
||||
STR_1385 :{SMALLFONT}{BLACK}Andere baanmogelijkheden
|
||||
STR_1386 :Speciaal...
|
||||
STR_1387 :Kan het landtype niet aanpassen...
|
||||
STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY}
|
||||
|
@ -1409,7 +1409,7 @@ STR_1407 :{WINDOW_COLOUR_2}Dit bouwen...
|
|||
STR_1408 :{WINDOW_COLOUR_2}Kosten: {BLACK}{CURRENCY}
|
||||
STR_1409 :Platform voor ingang/uitgang
|
||||
STR_1410 :Verticale toren
|
||||
STR_1411 :{STRINGID} in de weg
|
||||
STR_1411 :{STRINGID} staat in de weg
|
||||
STR_1412 :{15}Datalog is niet beschikbaar voor dit type attractie
|
||||
STR_1413 :{15}Datalog zal beginnen wanneer de volgende {STRINGID} {STRINGID} verlaat
|
||||
STR_1414 :{SMALLFONT}{BLACK}{DURATION}
|
||||
|
@ -1443,10 +1443,10 @@ STR_1441 :Veegt voetpad
|
|||
STR_1442 :Leegt prullenbak
|
||||
STR_1443 :Geeft planten water
|
||||
STR_1444 :Kijkt naar {STRINGID}
|
||||
STR_1445 :Kijkt naar bouw van {STRINGID}
|
||||
STR_1445 :Kijkt naar de bouw van {STRINGID}
|
||||
STR_1446 :Kijkt naar decor
|
||||
STR_1447 :Verlaat het park
|
||||
STR_1448 :Kijkt naar bouw van nieuwe attractie
|
||||
STR_1448 :Kijkt naar de bouw van de nieuwe attractie
|
||||
STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID})
|
||||
STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID})
|
||||
STR_1451 :{STRINGID}{NEWLINE}({STRINGID})
|
||||
|
@ -1502,7 +1502,7 @@ 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_1503 :{SMALLFONT}{OPENQUOTES}Ik kan {STRINGID} niet vinden{ENDQUOTES}
|
||||
STR_1504 :{SMALLFONT}{OPENQUOTES}Zoveel betalen ik niet voor het gebruik van {STRINGID}{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}
|
||||
STR_1506 :{SMALLFONT}{OPENQUOTES}Het is hier een zwijnenstal{ENDQUOTES}
|
||||
STR_1507 :{SMALLFONT}{OPENQUOTES}Ik kan de parkuitgang niet vinden{ENDQUOTES}
|
||||
|
@ -1515,14 +1515,14 @@ STR_1513 :{SMALLFONT}{OPENQUOTES}Er is hier erg veel vandalisme{ENDQUOTES}
|
|||
STR_1514 :{SMALLFONT}{OPENQUOTES}Mooi decor!{ENDQUOTES}
|
||||
STR_1515 :{SMALLFONT}{OPENQUOTES}Dit park is erg schoon en netjes{ENDQUOTES}
|
||||
STR_1516 :{SMALLFONT}{OPENQUOTES}Die springende fonteinen zijn erg leuk{ENDQUOTES}
|
||||
STR_1517 :{SMALLFONT}{OPENQUOTES}Er speelt hier leuke muziek{ENDQUOTES}
|
||||
STR_1517 :{SMALLFONT}{OPENQUOTES}Er wordt hier leuke muziek gedraaid{ENDQUOTES}
|
||||
STR_1518 :{SMALLFONT}{OPENQUOTES}Deze ballon van {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
STR_1519 :{SMALLFONT}{OPENQUOTES}Deze knuffel van {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
STR_1520 :{SMALLFONT}{OPENQUOTES}Deze plattegrond van {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
STR_1521 :{SMALLFONT}{OPENQUOTES}Deze actiefoto van {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
STR_1522 :{SMALLFONT}{OPENQUOTES}Deze paraplu van {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
STR_1523 :{SMALLFONT}{OPENQUOTES}Deze frisdrank van {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
STR_1524 :{SMALLFONT}{OPENQUOTES}Deze hamburger {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
STR_1524 :{SMALLFONT}{OPENQUOTES}Deze hamburger van {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
STR_1525 :{SMALLFONT}{OPENQUOTES}Deze frietjes van {STRINGID} zijn erg goedkoop{ENDQUOTES}
|
||||
STR_1526 :{SMALLFONT}{OPENQUOTES}Dit ijsje van {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
STR_1527 :{SMALLFONT}{OPENQUOTES}Deze suikerspin van {STRINGID} is erg goedkoop{ENDQUOTES}
|
||||
|
@ -1556,7 +1556,7 @@ STR_1554 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een plattegrond v
|
|||
STR_1555 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een actiefoto van {STRINGID}{ENDQUOTES}
|
||||
STR_1556 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een paraplu van {STRINGID}{ENDQUOTES}
|
||||
STR_1557 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor frisdrank van {STRINGID}{ENDQUOTES}
|
||||
STR_1558 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een hamburger {STRINGID}{ENDQUOTES}
|
||||
STR_1558 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een hamburger van {STRINGID}{ENDQUOTES}
|
||||
STR_1559 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor frietjes van {STRINGID}{ENDQUOTES}
|
||||
STR_1560 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een ijsje van {STRINGID}{ENDQUOTES}
|
||||
STR_1561 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een suikerspin van {STRINGID}{ENDQUOTES}
|
||||
|
@ -1668,7 +1668,7 @@ STR_1666 :{WINDOW_COLOUR_2}Dorst:
|
|||
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}Totale bezoekers: {BLACK}{COMMA32}
|
||||
STR_1670 :{WINDOW_COLOUR_2}Totaal aantal bezoekers: {BLACK}{COMMA32}
|
||||
STR_1671 :{WINDOW_COLOUR_2}Totale winst: {BLACK}{CURRENCY2DP}
|
||||
STR_1672 :Remmen
|
||||
STR_1673 :Draaistop
|
||||
|
@ -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}Klantinformatie
|
||||
STR_1696 :{SMALLFONT}{BLACK}Klanteninformatie
|
||||
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
|
||||
|
@ -1763,7 +1763,7 @@ STR_1761 :{SMALLFONT}{BLACK}Bouw doolhof in deze richting
|
|||
STR_1762 :Watervallen
|
||||
STR_1763 :Stroomversnelling
|
||||
STR_1764 :Balkendrempels
|
||||
STR_1765 :Actiefoto-installatie
|
||||
STR_1765 :Actiefotogedeelte
|
||||
STR_1766 :Draaischijf
|
||||
STR_1767 :Draaiende tunnel
|
||||
STR_1768 :Kan het aantal schommelingen niet aanpassen...
|
||||
|
@ -1771,7 +1771,7 @@ STR_1769 :{WINDOW_COLOUR_2}Aantal schommelingen:
|
|||
STR_1770 :{SMALLFONT}{BLACK}Aantal complete schommelingen
|
||||
STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16}
|
||||
STR_1772 :{COMMA16}
|
||||
STR_1773 :Een attractie mag maar één actiefoto-installatie hebben
|
||||
STR_1773 :Een attractie mag maar één actiefotogedeelte hebben
|
||||
STR_1774 :Een attractie mag maar één kabellift hebben
|
||||
STR_1775 :Uit
|
||||
STR_1776 :Aan
|
||||
|
@ -1918,9 +1918,9 @@ STR_1916 :{WINDOW_COLOUR_2}Lening:
|
|||
STR_1917 :{POP16}{POP16}{POP16}{CURRENCY}
|
||||
STR_1918 :Kan niet meer geld lenen!
|
||||
STR_1919 :Onvoldoende contant geld beschikbaar!
|
||||
STR_1920 :Kan geen lening terugbetalen!
|
||||
STR_1920 :Kan lening niet terugbetalen!
|
||||
STR_1921 :{SMALLFONT}{BLACK}Een nieuw spel starten
|
||||
STR_1922 :{SMALLFONT}{BLACK}Verder gaan aan een opgeslagen spel
|
||||
STR_1922 :{SMALLFONT}{BLACK}Verder gaan met een opgeslagen spel
|
||||
STR_1923 :{SMALLFONT}{BLACK}Tutorial tonen
|
||||
STR_1924 :{SMALLFONT}{BLACK}Afsluiten
|
||||
STR_1925 :Kan hier geen persoon plaatsen...
|
||||
|
@ -1945,10 +1945,10 @@ STR_1943 :{SMALLFONT}{BLACK}Recente gedachten van deze bezoeker tonen
|
|||
STR_1944 :{SMALLFONT}{BLACK}Toon de dingen die de gast bij zich heeft
|
||||
STR_1945 :{SMALLFONT}{BLACK}Orders en opties voor deze werknemer tonen
|
||||
STR_1946 :{SMALLFONT}{BLACK}Kostuum van deze entertainer selecteren
|
||||
STR_1947 :{SMALLFONT}{BLACK}Werkgebieden van het geselecteerde type werknemer weergeven, en de dichtstbijzijnde werknemer localiseren
|
||||
STR_1947 :{SMALLFONT}{BLACK}Werkgebieden van het geselecteerde type werknemer weergeven en de dichtstbijzijnde werknemer localiseren
|
||||
STR_1948 :{SMALLFONT}{BLACK}Nieuwe werknemer van het geselecteerde type aannemen
|
||||
STR_1949 :Samenvatting financiën
|
||||
STR_1950 :Grafiek financiën
|
||||
STR_1950 :Grafiek van financiën
|
||||
STR_1951 :Grafiek van parkwaardering
|
||||
STR_1952 :Winstgrafiek
|
||||
STR_1953 :Marketing
|
||||
|
@ -2226,7 +2226,7 @@ STR_2224 :{WINDOW_COLOUR_2}Contant: {BLACK}{CURRENCY2DP}
|
|||
STR_2225 :{WINDOW_COLOUR_2}Contant: {RED}{CURRENCY2DP}
|
||||
STR_2226 :{WINDOW_COLOUR_2}Parkwaarde: {BLACK}{CURRENCY}
|
||||
STR_2227 :{WINDOW_COLOUR_2}Bedrijfswaarde: {BLACK}{CURRENCY}
|
||||
STR_2228 :{WINDOW_COLOUR_2}Inkomsten horeca en merchandise{NEWLINE}vorige maand: {BLACK}{CURRENCY}
|
||||
STR_2228 :{WINDOW_COLOUR_2}Inkomsten horeca en souvenirs{NEWLINE}vorige maand: {BLACK}{CURRENCY}
|
||||
STR_2229 :Helling omhoog naar verticaal
|
||||
STR_2230 :Verticale baan
|
||||
STR_2231 :Vasthoudrem voor afdaling
|
||||
|
@ -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}Misselheidswaarde: {BLACK}{COMMA2DP32} (ongeveer)
|
||||
STR_2313 :{WINDOW_COLOUR_2}Missellijkheidswaarde: {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
|
||||
|
@ -2350,7 +2350,7 @@ STR_2348 :{SMALLFONT}{BLACK}Statistieken voor deze werknemer tonen
|
|||
STR_2349 :{WINDOW_COLOUR_2}Loon: {BLACK}{CURRENCY} per month
|
||||
STR_2350 :{WINDOW_COLOUR_2}In dienst genomen: {BLACK}{MONTHYEAR}
|
||||
STR_2351 :{WINDOW_COLOUR_2}Velden gemaaid: {BLACK}{COMMA16}
|
||||
STR_2352 :{WINDOW_COLOUR_2}Bloembakken water gegeven: {BLACK}{COMMA16}
|
||||
STR_2352 :{WINDOW_COLOUR_2}Bloemen water gegeven: {BLACK}{COMMA16}
|
||||
STR_2353 :{WINDOW_COLOUR_2}Afval opgeveegd: {BLACK}{COMMA16}
|
||||
STR_2354 :{WINDOW_COLOUR_2}Prullenbakken geleegd: {BLACK}{COMMA16}
|
||||
STR_2355 :{WINDOW_COLOUR_2}Reparaties: {BLACK}{COMMA16}
|
||||
|
@ -2391,22 +2391,22 @@ 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_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 merchandise te verdienen
|
||||
STR_2396 :{BLACK}Om in één maand minstens {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
|
||||
STR_2400 :Plezier hebben
|
||||
STR_2401 :De beste attractie te bouwen
|
||||
STR_2402 :10 achtbanen bouwen
|
||||
STR_2402 :Tien achtbanen bouwen
|
||||
STR_2403 :Aantal bezoekers in het park
|
||||
STR_2404 :Maandelijks inkomen van attractiekaartjes
|
||||
STR_2405 :10 achtbanen van een bepaalde lengte bouwen
|
||||
STR_2406 :5 achtbanen afmaken
|
||||
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/merchandise
|
||||
STR_2408 :Maandelijks inkomen van voedsel/souvenirs
|
||||
STR_2409 :{WINDOW_COLOUR_2}Lopende marketingcampagnes
|
||||
STR_2410 :{BLACK}Geen
|
||||
STR_2411 :{WINDOW_COLOUR_2}Beschikbare marketingcampagnes
|
||||
|
@ -2458,7 +2458,7 @@ STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} -
|
|||
STR_2457 :{SMALLFONT}{BLACK}Laat financiële posten zien
|
||||
STR_2458 :{SMALLFONT}{BLACK}Toon grafiek van saldoverloop (zonder lening)
|
||||
STR_2459 :{SMALLFONT}{BLACK}Toon grafiek van parkwaardeverloop
|
||||
STR_2460 :{SMALLFONT}{BLACK}Toon grafiek van wekelijke winst
|
||||
STR_2460 :{SMALLFONT}{BLACK}Toon grafiek van wekelijkse winst
|
||||
STR_2461 :{SMALLFONT}{BLACK}Toon marketingcampagnes
|
||||
STR_2462 :{SMALLFONT}{BLACK}Toon beeld van de parkingang
|
||||
STR_2463 :{SMALLFONT}{BLACK}Toon grafiek van parkwaarderingverloop
|
||||
|
@ -2718,30 +2718,30 @@ STR_2716 :/
|
|||
STR_2717 :'
|
||||
STR_2718 :???
|
||||
STR_2719 :???
|
||||
STR_2720 :???
|
||||
STR_2721 :???
|
||||
STR_2722 :???
|
||||
STR_2723 :???
|
||||
STR_2724 :???
|
||||
STR_2725 :???
|
||||
STR_2726 :???
|
||||
STR_2727 :???
|
||||
STR_2728 :???
|
||||
STR_2729 :???
|
||||
STR_2730 :???
|
||||
STR_2731 :???
|
||||
STR_2732 :???
|
||||
STR_2733 :???
|
||||
STR_2734 :???
|
||||
STR_2735 :???
|
||||
STR_2736 :???
|
||||
STR_2737 :???
|
||||
STR_2738 :???
|
||||
STR_2739 :???
|
||||
STR_2740 :???
|
||||
STR_2741 :???
|
||||
STR_2742 :???
|
||||
STR_2743 :???
|
||||
STR_2720 :{UINT16}s
|
||||
STR_2721 :{UINT16}s
|
||||
STR_2722 :{UINT16}m {UINT16}s
|
||||
STR_2723 :{UINT16}m {UINT16}s
|
||||
STR_2724 :{UINT16}m {UINT16}s
|
||||
STR_2725 :{UINT16}m {UINT16}s
|
||||
STR_2726 :{UINT16}m
|
||||
STR_2727 :{UINT16}m
|
||||
STR_2728 :{UINT16}h {UINT16}m
|
||||
STR_2729 :{UINT16}h {UINT16}m
|
||||
STR_2730 :{UINT16}h {UINT16}m
|
||||
STR_2731 :{UINT16}h {UINT16}m
|
||||
STR_2732 :{COMMA16} ft
|
||||
STR_2733 :{COMMA16} m
|
||||
STR_2734 :{COMMA16} mph
|
||||
STR_2735 :{COMMA16} km/h
|
||||
STR_2736 :{MONTH}, jaar {COMMA16}
|
||||
STR_2737 :{STRINGID} {MONTH}, jaar {COMMA16}
|
||||
STR_2738 :Titelschermmuziek
|
||||
STR_2739 :Geen
|
||||
STR_2740 :RollerCoaster Tycoon 1
|
||||
STR_2741 :RollerCoaster Tycoon 2
|
||||
STR_2742 :css50.dat niet gevonden
|
||||
STR_2743 :Kopieer data\css17.dat van je RCT1-installatie naar data\css50.dat in je RCT2-installatie.
|
||||
STR_2744 :[
|
||||
STR_2745 :\
|
||||
STR_2746 :]
|
||||
|
@ -2784,7 +2784,7 @@ STR_2782 :SHIFT +
|
|||
STR_2783 :CTRL +
|
||||
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 op een nieuwe sneltoets in te stellen
|
||||
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!
|
||||
|
@ -2810,38 +2810,38 @@ STR_2808 :{RED}Bezoekers klagen over het vandalisme in je park{NEWLINE}Contro
|
|||
STR_2809 :{RED}Bezoekers hebben honger en kunnen geen plek vinden om voedsel 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 de indeling van je voetpaden voor verbetering vatbaar is
|
||||
STR_2812 :{RED}Bezoekers raken verdwaald of komen vast te zitten{NEWLINE}Controleer of je de indeling van je voetpaden kunt verbeteren
|
||||
STR_2813 :{RED}Je entreeprijs is te hoog!{NEWLINE}Verlaag de entreeprijs of verbeter het park om meer bezoekers te trekken
|
||||
STR_2814 :{WINDOW_COLOUR_2}Rommeligste park
|
||||
STR_2815 :{WINDOW_COLOUR_2}Netste park
|
||||
STR_2816 :{WINDOW_COLOUR_2}Beste achtbanen
|
||||
STR_2817 :{WINDOW_COLOUR_2}Beste park
|
||||
STR_2818 :{WINDOW_COLOUR_2}Mooiste park
|
||||
STR_2819 :{WINDOW_COLOUR_2}Slechtste park
|
||||
STR_2820 :{WINDOW_COLOUR_2}Veiligste park
|
||||
STR_2821 :{WINDOW_COLOUR_2}Beste personeel
|
||||
STR_2822 :{WINDOW_COLOUR_2}Beste eten
|
||||
STR_2823 :{WINDOW_COLOUR_2}Slechtste eten
|
||||
STR_2824 :{WINDOW_COLOUR_2}Beste toiletten
|
||||
STR_2825 :{WINDOW_COLOUR_2}Meest teleurstellende park
|
||||
STR_2826 :{WINDOW_COLOUR_2}Beste waterattracties
|
||||
STR_2827 :{WINDOW_COLOUR_2}Beste unieke attracties
|
||||
STR_2828 :{WINDOW_COLOUR_2}Meest duizelingwekkende kleurenschema
|
||||
STR_2829 :{WINDOW_COLOUR_2}Vreemdste indeling
|
||||
STR_2830 :{WINDOW_COLOUR_2}Beste rustige attracties
|
||||
STR_2814 :{WINDOW_COLOUR_2}Prijs voor het rommeligste park
|
||||
STR_2815 :{WINDOW_COLOUR_2}Prijs voor het netste park
|
||||
STR_2816 :{WINDOW_COLOUR_2}Prijs voor de beste achtbanen
|
||||
STR_2817 :{WINDOW_COLOUR_2}Prijs voor het park met de beste prijs/kwaliteitsverhouding
|
||||
STR_2818 :{WINDOW_COLOUR_2}Prijs voor het mooiste park
|
||||
STR_2819 :{WINDOW_COLOUR_2}Prijs voor het park met de slechtste prijs/kwaliteitsverhouding
|
||||
STR_2820 :{WINDOW_COLOUR_2}Prijs voor het veiligste park
|
||||
STR_2821 :{WINDOW_COLOUR_2}Prijs voor het beste personeel
|
||||
STR_2822 :{WINDOW_COLOUR_2}Prijs voor het beste eten
|
||||
STR_2823 :{WINDOW_COLOUR_2}Prijs voor het slechtste eten
|
||||
STR_2824 :{WINDOW_COLOUR_2}Prijs voor beste toiletten
|
||||
STR_2825 :{WINDOW_COLOUR_2}Prijs voor het meest teleurstellende park
|
||||
STR_2826 :{WINDOW_COLOUR_2}Prijs voor de beste waterattracties
|
||||
STR_2827 :{WINDOW_COLOUR_2}Prijs voor de beste unieke attracties
|
||||
STR_2828 :{WINDOW_COLOUR_2}Prijs voor het meest duizelingwekkende kleurenschema
|
||||
STR_2829 :{WINDOW_COLOUR_2}Prijs voor het park met de vreemdste indeling
|
||||
STR_2830 :{WINDOW_COLOUR_2}Prijs voor de beste rustige attracties
|
||||
STR_2831 :{TOPAZ}Je park heeft een prijs gekregen: 'Rommeligste park van het land'!
|
||||
STR_2832 :{TOPAZ}Je park heeft een prijs gekregen: 'Netste park van het land'!
|
||||
STR_2833 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met de beste achtbanen'!
|
||||
STR_2834 :{TOPAZ}Je park heeft een prijs gekregen: 'Beste park van het land'!
|
||||
STR_2834 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met de beste prijs/kwaliteitsverhouding'!
|
||||
STR_2835 :{TOPAZ}Je park heeft een prijs gekregen: 'Mooiste park van het land'!
|
||||
STR_2836 :{TOPAZ}Je park heeft een prijs gekregen: 'Slechtste park van het land'!
|
||||
STR_2837 :{TOPAZ}Je park heeft een prijs gekregen: 'Veiligste park'!
|
||||
STR_2836 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met de slechtste prijs/kwaliteitsverhouding'!
|
||||
STR_2837 :{TOPAZ}Je park heeft een prijs gekregen: 'Veiligste park van het land'!
|
||||
STR_2838 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met de beste werknemers'!
|
||||
STR_2839 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met het beste eten van het land'!
|
||||
STR_2840 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met het slechtste eten van het land'!
|
||||
STR_2841 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met de beste toiletten van het land'!
|
||||
STR_2842 :{TOPAZ}Je park heeft een prijs gekregen: 'Meest teleurstellende park'!
|
||||
STR_2843 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met de beste waterattracties'!
|
||||
STR_2842 :{TOPAZ}Je park heeft een prijs gekregen: 'Meest teleurstellende park van het land'!
|
||||
STR_2843 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met de beste waterattracties van het land'!
|
||||
STR_2844 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met de beste unieke attracties'!
|
||||
STR_2845 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met het meest duizelingwekkende kleurenschema'!
|
||||
STR_2846 :{TOPAZ}Je park heeft een prijs gekregen: 'Park met de vreemdste indeling'!
|
||||
|
@ -2986,7 +2986,7 @@ STR_2984 :Kan de tekst op deze banier niet veranderen...
|
|||
STR_2985 :Banier
|
||||
STR_2986 :{SMALLFONT}{BLACK}Tekst op deze banier aanpassen
|
||||
STR_2987 :{SMALLFONT}{BLACK}Deze banier gebruiken als bord voor 'geen toegang' voor de bezoekers
|
||||
STR_2988 :{SMALLFONT}{BLACK}Deze banier vernietigen
|
||||
STR_2988 :{SMALLFONT}{BLACK}Deze banier verwijderen
|
||||
STR_2989 :{SMALLFONT}{BLACK}Hoofdkleur selecteren
|
||||
STR_2990 :{SMALLFONT}{BLACK}Tekstkleur selecteren
|
||||
STR_2991 :Bord
|
||||
|
@ -3043,7 +3043,7 @@ STR_3041 :Moderne stijl
|
|||
STR_3042 :Piratenstijl
|
||||
STR_3043 :Rockstijl 3
|
||||
STR_3044 :Snoepstijl
|
||||
STR_3045 :{SMALLFONT}{BLACK}Selecteer welke muziekstijl er moet worden gespeeld
|
||||
STR_3045 :{SMALLFONT}{BLACK}Selecteer welke muziekstijl er moet worden gedraaid
|
||||
STR_3046 :Deze attractie kan niet worden aangepast
|
||||
STR_3047 :De gemeente staat de sloop van en wijzigingen aan deze attractie niet toe
|
||||
STR_3048 :Marketingcampagnes worden niet toegestaan door de gemeente
|
||||
|
@ -3054,20 +3054,20 @@ STR_3052 :Golfhole D
|
|||
STR_3053 :Golfhole E
|
||||
STR_3054 :Laden...
|
||||
STR_3055 :Wit
|
||||
STR_3056 :Doorzichting
|
||||
STR_3056 :Doorzichtig
|
||||
STR_3057 :{WINDOW_COLOUR_2}Bouwmarkering:
|
||||
STR_3058 :Stenen muren
|
||||
STR_3059 :Heggen
|
||||
STR_3060 :Blokken ijs
|
||||
STR_3061 :Houten schuttingen
|
||||
STR_3062 :{SMALLFONT}{BLACK}Standard achtbaanspoor
|
||||
STR_3063 :{SMALLFONT}{BLACK}Watersegment (spoor onder water)
|
||||
STR_3063 :{SMALLFONT}{BLACK}Watergedeelte (spoor onder water)
|
||||
STR_3064 :Eenvoudige parken
|
||||
STR_3065 :Uitdagende parken
|
||||
STR_3066 :Moeilijke parken
|
||||
STR_3067 :{OPENQUOTES}Echte{ENDQUOTES} parken
|
||||
STR_3068 :Andere parken
|
||||
STR_3069 :Bovensegment
|
||||
STR_3069 :Bovengedeelte
|
||||
STR_3070 :Van helling naar vlak
|
||||
STR_3071 :{WINDOW_COLOUR_2}Dezelfde prijs in het hele park
|
||||
STR_3072 :{SMALLFONT}{BLACK}Selecteer of deze prijs in het hele park moet worden gehanteerd
|
||||
|
@ -3089,7 +3089,7 @@ STR_3087 :Sneeuw/ijs-ingang
|
|||
STR_3088 :Pagode-ingang
|
||||
STR_3089 :Ruimte-ingang
|
||||
STR_3090 :{SMALLFONT}{BLACK}Selecteer de stijl van de ingang, uitgang, en het station
|
||||
STR_3091 :Je mag dit segment niet verwijderen!
|
||||
STR_3091 :Je mag dit gedeelte niet verwijderen!
|
||||
STR_3092 :Je mag het station van deze attractie niet verplaatsen of veranderen!
|
||||
STR_3093 :{WINDOW_COLOUR_2}Favoriet: {BLACK}{STRINGID}
|
||||
STR_3094 :n.v.t.
|
||||
|
@ -3118,8 +3118,8 @@ STR_3116 :{SMALLFONT}{BLACK}Baanontwerp opslaan (Niet mogelijk voordat de att
|
|||
STR_3117 :{BLACK}Monteur wordt opgeroepen...
|
||||
STR_3118 :{BLACK}{STRINGID} gaat naar deze attractie
|
||||
STR_3119 :{BLACK}{STRINGID} is bezig deze attractie te repareren
|
||||
STR_3120 :{SMALLFONT}{BLACK}Vind de dichtstbijzijnde monteur, of de monteur die de attractie aan het repareren is
|
||||
STR_3121 :Kan geen monteur vinden, of alle monteurs in de buurt zijn bezig
|
||||
STR_3120 :{SMALLFONT}{BLACK}Vind de dichtstbijzijnde monteur of de monteur die de attractie aan het repareren is
|
||||
STR_3121 :Kan geen monteur vinden of alle monteurs in de buurt zijn bezig
|
||||
STR_3122 :{WINDOW_COLOUR_2}Favoriet van: {BLACK}{COMMA16} bezoeker
|
||||
STR_3123 :{WINDOW_COLOUR_2}Favoriet van: {BLACK}{COMMA16} bezoekers
|
||||
STR_3124 :{STRINGID} defect
|
||||
|
@ -3211,10 +3211,10 @@ STR_3209 :Terug naar de vorige stap:
|
|||
STR_3210 :Verder naar de volgende stap:
|
||||
STR_3211 :{WINDOW_COLOUR_2}Kaartgrootte:
|
||||
STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16}
|
||||
STR_3213 :Kan kaart niet verder verkleinen
|
||||
STR_3214 :Kan kaart niet verder vergroten
|
||||
STR_3213 :Kan de kaart niet verder verkleinen
|
||||
STR_3214 :Kan de kaart niet verder vergroten
|
||||
STR_3215 :Te dicht bij de rand van de kaart
|
||||
STR_3216 :{SMALLFONT}{BLACK}Selecteer parkland, etc.
|
||||
STR_3216 :{SMALLFONT}{BLACK}Selecteer parkland etc.
|
||||
STR_3217 :Eigendom van het park
|
||||
STR_3218 :Bouwrechten voor het park
|
||||
STR_3219 :Te koop
|
||||
|
@ -3310,11 +3310,11 @@ STR_3308 :{WINDOW_COLOUR_2}Spanningswaarde:
|
|||
STR_3309 :{WINDOW_COLOUR_2}{COMMA16}
|
||||
STR_3310 :{WINDOW_COLOUR_2}{LENGTH}
|
||||
STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32}
|
||||
STR_3312 :{WINDOW_COLOUR_2}Attracties met monumentenstatus:
|
||||
STR_3312 :{WINDOW_COLOUR_2}Attracties met een monumentenstatus:
|
||||
STR_3313 :Scenarionaam
|
||||
STR_3314 :Voer een naam in voor het scenario:
|
||||
STR_3315 :Details park/scenario
|
||||
STR_3316 :Geef een beschrijving voor dit scenario:
|
||||
STR_3316 :Geef een beschrijving van dit scenario:
|
||||
STR_3317 :Nog geen details
|
||||
STR_3318 :{SMALLFONT}{BLACK}Selecteer in welke groep dit scenario moet verschijnen
|
||||
STR_3319 :{WINDOW_COLOUR_2}Scenariogroep:
|
||||
|
@ -3329,9 +3329,9 @@ 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_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_3333 :Niet-standaard objecten meeleveren in opgeslagen spellen
|
||||
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
|
||||
STR_3336 :Baanontwerpbeheer - Attractietype selecteren
|
||||
|
@ -3345,7 +3345,7 @@ STR_3343 :Opgeslagen spel omzetten naar scenario
|
|||
STR_3344 :Achtbaanontwerper
|
||||
STR_3345 :Baanontwerpbeheer
|
||||
STR_3346 :Kan baanontwerp niet opslaan
|
||||
STR_3347 :Attractie is te groot, bevat teveel elementen, of het decor is te ver verspreid
|
||||
STR_3347 :Attractie is te groot, bevat teveel elementen of het decor is te ver verspreid
|
||||
STR_3348 :Naam wijzigen
|
||||
STR_3349 :Verwijderen
|
||||
STR_3350 :Naam baanontwerp
|
||||
|
@ -3359,7 +3359,7 @@ STR_3357 :{WINDOW_COLOUR_2}Weet je zeker dat je {STRINGID} permanent wilt ver
|
|||
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_3361 :Te veel baanontwerpen van dit type; sommige staan niet in de lijst
|
||||
STR_3362 :Mixing 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
|
||||
|
@ -3382,7 +3382,7 @@ STR_3380 :Kan dit baanontwerp niet installeren...
|
|||
STR_3381 :Bestand is niet compatible 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_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
|
||||
|
@ -3406,8 +3406,8 @@ STR_3404 :{SMALLFONT}{BLACK}Oh, juist - het park is nog gesloten! Laten we on
|
|||
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_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 stationssegmenten aan te leggen...
|
||||
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...
|
||||
STR_3410 :{SMALLFONT}{BLACK}De knopjes aan de bovenkant van het bouwvenster laten je tusen verschillende soorten baanstukjes kiezen...
|
||||
STR_3411 :{SMALLFONT}{BLACK}We gaan een bocht naar links bouwen...
|
||||
STR_3412 :{SMALLFONT}{BLACK}De bocht is nog niet gebouwd, maar het witte spookplaatje laat zien waar het gebouwd gaat worden. Als je op de grote knop klikt wordt het gebouwd...
|
||||
|
@ -3416,7 +3416,7 @@ STR_3414 :{SMALLFONT}{BLACK}De baan is af, we kunnen nu de ingang en uitgang
|
|||
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_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_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...
|
||||
STR_3420 :{SMALLFONT}{BLACK}Sommige types decor kunnen opnieuw geverfd worden nadat ze zijn gebouwd...
|
||||
STR_3421 :{SMALLFONT}{BLACK}Laten we wat muziek draaien in onze attractie...
|
||||
|
@ -3425,15 +3425,15 @@ 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 gesmeten worden wanneer de trein er doorheen raast...
|
||||
STR_3428 :{SMALLFONT}{BLACK}De bochten een banking (schuinleggen) geven zal de rit prettiger maken - de passagiers zullen in hun stoelen geduwd 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_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_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_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_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...
|
||||
STR_3437 :{SMALLFONT}{BLACK}Grote gebieden met decor van het landschap verwijderen
|
||||
STR_3438 :Kan hier niet al het decor verwijderen...
|
||||
|
|
|
@ -2692,13 +2692,13 @@ STR_2686 :???
|
|||
STR_2687 :???
|
||||
STR_2688 :???
|
||||
STR_2689 :???
|
||||
STR_2690 :???
|
||||
STR_2691 :???
|
||||
STR_2692 :???
|
||||
STR_2693 :???
|
||||
STR_2694 :???
|
||||
STR_2695 :???
|
||||
STR_2696 :???
|
||||
STR_2690 :Map Generation
|
||||
STR_2691 :{WINDOW_COLOUR_2}Base height:
|
||||
STR_2692 :{WINDOW_COLOUR_2}Water level:
|
||||
STR_2693 :{WINDOW_COLOUR_2}Terrain:
|
||||
STR_2694 :Generate
|
||||
STR_2695 :Random terrain
|
||||
STR_2696 :Place trees
|
||||
STR_2697 :???
|
||||
STR_2698 :???
|
||||
STR_2699 :???
|
||||
|
@ -2722,30 +2722,30 @@ STR_2716 :/
|
|||
STR_2717 :'
|
||||
STR_2718 :???
|
||||
STR_2719 :???
|
||||
STR_2720 :???
|
||||
STR_2721 :???
|
||||
STR_2722 :???
|
||||
STR_2723 :???
|
||||
STR_2724 :???
|
||||
STR_2725 :???
|
||||
STR_2726 :???
|
||||
STR_2727 :???
|
||||
STR_2728 :???
|
||||
STR_2729 :???
|
||||
STR_2730 :???
|
||||
STR_2731 :???
|
||||
STR_2732 :???
|
||||
STR_2733 :???
|
||||
STR_2734 :???
|
||||
STR_2735 :???
|
||||
STR_2736 :???
|
||||
STR_2737 :???
|
||||
STR_2738 :???
|
||||
STR_2739 :???
|
||||
STR_2740 :???
|
||||
STR_2741 :???
|
||||
STR_2742 :???
|
||||
STR_2743 :???
|
||||
STR_2720 :{UINT16}sec
|
||||
STR_2721 :{UINT16}secs
|
||||
STR_2722 :{UINT16}min:{UINT16}sec
|
||||
STR_2723 :{UINT16}min:{UINT16}secs
|
||||
STR_2724 :{UINT16}mins:{UINT16}sec
|
||||
STR_2725 :{UINT16}mins:{UINT16}secs
|
||||
STR_2726 :{UINT16}min
|
||||
STR_2727 :{UINT16}mins
|
||||
STR_2728 :{UINT16}hour:{UINT16}min
|
||||
STR_2729 :{UINT16}hour:{UINT16}mins
|
||||
STR_2730 :{UINT16}hours:{UINT16}min
|
||||
STR_2731 :{UINT16}hours:{UINT16}mins
|
||||
STR_2732 :{COMMA16}ft
|
||||
STR_2733 :{COMMA16}m
|
||||
STR_2734 :{COMMA16}mph
|
||||
STR_2735 :{COMMA16}km/h
|
||||
STR_2736 :{MONTH}, Year {COMMA16}
|
||||
STR_2737 :{STRINGID} {MONTH}, Year {COMMA16}
|
||||
STR_2738 :Title screen music
|
||||
STR_2739 :None
|
||||
STR_2740 :RollerCoaster Tycoon 1
|
||||
STR_2741 :RollerCoaster Tycoon 2
|
||||
STR_2742 :css50.dat not found
|
||||
STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation.
|
||||
STR_2744 :[
|
||||
STR_2745 :\
|
||||
STR_2746 :]
|
||||
|
|
|
@ -2526,6 +2526,7 @@ STR_2521 :Show staff list
|
|||
STR_2522 :Show recent messages
|
||||
STR_2523 :Show map
|
||||
STR_2524 :Screenshot
|
||||
|
||||
STR_2525 :???
|
||||
STR_2526 :???
|
||||
STR_2527 :???
|
||||
|
@ -2691,13 +2692,13 @@ STR_2686 :???
|
|||
STR_2687 :???
|
||||
STR_2688 :???
|
||||
STR_2689 :???
|
||||
STR_2690 :???
|
||||
STR_2691 :???
|
||||
STR_2692 :???
|
||||
STR_2693 :???
|
||||
STR_2694 :???
|
||||
STR_2695 :???
|
||||
STR_2696 :???
|
||||
STR_2690 :Map Generation
|
||||
STR_2691 :{WINDOW_COLOUR_2}Base height:
|
||||
STR_2692 :{WINDOW_COLOUR_2}Water level:
|
||||
STR_2693 :{WINDOW_COLOUR_2}Terrain:
|
||||
STR_2694 :Generate
|
||||
STR_2695 :Random terrain
|
||||
STR_2696 :Place trees
|
||||
STR_2697 :???
|
||||
STR_2698 :???
|
||||
STR_2699 :???
|
||||
|
@ -2721,47 +2722,57 @@ STR_2716 :/
|
|||
STR_2717 :'
|
||||
STR_2718 :???
|
||||
STR_2719 :???
|
||||
STR_2720 :???
|
||||
STR_2721 :???
|
||||
STR_2722 :???
|
||||
STR_2723 :???
|
||||
STR_2724 :???
|
||||
STR_2725 :???
|
||||
STR_2726 :???
|
||||
STR_2727 :???
|
||||
STR_2728 :???
|
||||
STR_2729 :???
|
||||
STR_2730 :???
|
||||
STR_2731 :???
|
||||
STR_2732 :???
|
||||
STR_2733 :???
|
||||
STR_2734 :???
|
||||
STR_2735 :???
|
||||
STR_2736 :???
|
||||
STR_2737 :???
|
||||
STR_2738 :???
|
||||
STR_2739 :???
|
||||
STR_2740 :???
|
||||
STR_2741 :???
|
||||
STR_2742 :???
|
||||
STR_2743 :???
|
||||
STR_2720 :{UINT16}sec
|
||||
STR_2721 :{UINT16}secs
|
||||
STR_2722 :{UINT16}min:{UINT16}sec
|
||||
STR_2723 :{UINT16}min:{UINT16}secs
|
||||
STR_2724 :{UINT16}mins:{UINT16}sec
|
||||
STR_2725 :{UINT16}mins:{UINT16}secs
|
||||
STR_2726 :{UINT16}min
|
||||
STR_2727 :{UINT16}mins
|
||||
STR_2728 :{UINT16}hour:{UINT16}min
|
||||
STR_2729 :{UINT16}hour:{UINT16}mins
|
||||
STR_2730 :{UINT16}hours:{UINT16}min
|
||||
STR_2731 :{UINT16}hours:{UINT16}mins
|
||||
STR_2732 :{COMMA16}ft
|
||||
STR_2733 :{COMMA16}m
|
||||
STR_2734 :{COMMA16}mph
|
||||
STR_2735 :{COMMA16}km/h
|
||||
STR_2736 :{MONTH}, Year {COMMA16}
|
||||
STR_2737 :{STRINGID} {MONTH}, Year {COMMA16}
|
||||
STR_2738 :Title screen music
|
||||
STR_2739 :None
|
||||
STR_2740 :RollerCoaster Tycoon 1
|
||||
STR_2741 :RollerCoaster Tycoon 2
|
||||
STR_2742 :css50.dat not found
|
||||
STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation.
|
||||
STR_2744 :[
|
||||
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 ???
|
||||
STR_2750 :Move all items to top
|
||||
STR_2751 :Move all items to bottom
|
||||
STR_2752 :Clear grass
|
||||
STR_2753 :Mowed grass
|
||||
STR_2754 :Water plants
|
||||
STR_2755 :Fix vandalism
|
||||
STR_2756 :Remove litter
|
||||
STR_2757 :Force Sun
|
||||
STR_2758 :Force Thunder
|
||||
STR_2759 :Zero Clearance
|
||||
STR_2760 :+5K Money
|
||||
STR_2761 :Pay For Entrance
|
||||
STR_2762 :Pay For Rides
|
||||
|
@ -2781,9 +2792,11 @@ STR_2775 :Fullscreen (desktop)
|
|||
STR_2776 :Language
|
||||
STR_2777 :{MOVE_X}{SMALLFONT}{STRING}
|
||||
STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING}
|
||||
STR_2779 :Viewport #{COMMA16}
|
||||
STR_2780 :Extra viewport
|
||||
# End of new strings
|
||||
STR_2779 :???
|
||||
STR_2780 :???
|
||||
|
||||
|
||||
STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID}
|
||||
STR_2782 :SHIFT +
|
||||
STR_2783 :CTRL +
|
||||
|
|
|
@ -983,28 +983,30 @@ STR_0973 :OK
|
|||
STR_0974 :Atrakcje
|
||||
STR_0975 :Sklepy
|
||||
STR_0976 :Toalety i Punkty Informacyjne
|
||||
# ------------------------------------------ Polish end
|
||||
STR_0977 :New Transport Rides
|
||||
STR_0978 :New Gentle Rides
|
||||
STR_0979 :New Roller Coasters
|
||||
STR_0980 :New Thrill Rides
|
||||
STR_0981 :New Water Rides
|
||||
STR_0982 :New Shops & Stalls
|
||||
STR_0983 :Research & Development
|
||||
STR_0977 :Nowa atrakcja transportowa
|
||||
STR_0978 :Nowa łagodna atrakcja
|
||||
STR_0979 :Nowa kolejka górska
|
||||
STR_0980 :Nowa intensywna atrakcja
|
||||
STR_0981 :Nowa wodna atrakcja
|
||||
STR_0982 :Nowy sklep lub stoisko
|
||||
STR_0983 :Badania i rozwój
|
||||
STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP}
|
||||
STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP}
|
||||
STR_0986 :{BLACK}{CURRENCY2DP}
|
||||
# ------------------------------------------ Polish end
|
||||
STR_0987 :Too many rides/attractions
|
||||
STR_0988 :Can't create new ride/attraction...
|
||||
STR_0989 :{STRINGID}
|
||||
STR_0990 :{SMALLFONT}{BLACK}Construction
|
||||
STR_0991 :Station platform
|
||||
STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction
|
||||
STR_0993 :Demolish ride/attraction
|
||||
STR_0994 :Demolish
|
||||
STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}?
|
||||
STR_0996 :Overall view
|
||||
STR_0997 :{SMALLFONT}{BLACK}View selection
|
||||
# ------------------------------------------ Polish start
|
||||
STR_0992 :{SMALLFONT}{BLACK}Zniszcz całą atrakcję
|
||||
STR_0993 :Zniszcz atrakcję
|
||||
STR_0994 :Zniszcz
|
||||
STR_0995 :{WINDOW_COLOUR_1}Jesteś pewien, że chcesz zniszczyć {STRINGID}?
|
||||
STR_0996 :Widok ogólny
|
||||
STR_0997 :{SMALLFONT}{BLACK}Wybór widoku
|
||||
# ------------------------------------------ Polish end
|
||||
STR_0998 :No more stations allowed on this ride
|
||||
STR_0999 :Requires a station platform
|
||||
STR_1000 :Track is not a complete circuit
|
||||
|
@ -1015,13 +1017,15 @@ STR_1004 :Can't close {POP16}{POP16}{POP16}{STRINGID}...
|
|||
STR_1005 :Can't start construction on {POP16}{POP16}{POP16}{STRINGID}...
|
||||
STR_1006 :Must be closed first
|
||||
STR_1007 :Unable to create enough vehicles
|
||||
STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction
|
||||
STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions
|
||||
STR_1010 :{SMALLFONT}{BLACK}Open or close park
|
||||
STR_1011 :Close all
|
||||
STR_1012 :Open all
|
||||
STR_1013 :Close park
|
||||
STR_1014 :Open park
|
||||
# ------------------------------------------ Polish start
|
||||
STR_1008 :{SMALLFONT}{BLACK}Otwórz, zamknij lub testuj atrakcję
|
||||
STR_1009 :{SMALLFONT}{BLACK}Otwórz / zamknij wszystkie atrakcje
|
||||
STR_1010 :{SMALLFONT}{BLACK}Otwórz / zamknij park
|
||||
STR_1011 :Zamknij wszystkie
|
||||
STR_1012 :Otwórz wszystkie
|
||||
STR_1013 :Zamknij park
|
||||
STR_1014 :Otwórz park
|
||||
# ------------------------------------------ Polish end
|
||||
STR_1015 :Unable to operate with more than one station platform in this mode
|
||||
STR_1016 :Unable to operate with less than two stations in this mode
|
||||
STR_1017 :Can't change operating mode...
|
||||
|
@ -1043,27 +1047,29 @@ STR_1032 :Can only build this on water!
|
|||
STR_1033 :Can only build this above ground!
|
||||
STR_1034 :Can only build this on land!
|
||||
STR_1035 :Local authority won't allow construction above tree-height!
|
||||
STR_1036 :Load Game
|
||||
STR_1037 :Load Landscape
|
||||
STR_1038 :Convert saved game to scenario
|
||||
STR_1039 :Install new track design
|
||||
STR_1040 :Save Game
|
||||
STR_1041 :Save Scenario
|
||||
STR_1042 :Save Landscape
|
||||
STR_1043 :RollerCoaster Tycoon 2 Saved Game
|
||||
STR_1044 :RollerCoaster Tycoon 2 Scenario File
|
||||
STR_1045 :RollerCoaster Tycoon 2 Landscape File
|
||||
STR_1046 :RollerCoaster Tycoon 2 Track Design File
|
||||
STR_1047 :Game save failed!
|
||||
STR_1048 :Scenario save failed!
|
||||
STR_1049 :Landscape save failed!
|
||||
STR_1050 :Failed to load...{NEWLINE}File contains invalid data!
|
||||
STR_1051 :Invisible Supports
|
||||
STR_1052 :Invisible People
|
||||
STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park
|
||||
STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction
|
||||
STR_1055 :{SMALLFONT}{BLACK}Name person
|
||||
STR_1056 :{SMALLFONT}{BLACK}Name staff member
|
||||
# ------------------------------------------ Polish start
|
||||
STR_1036 :Wczytaj grę
|
||||
STR_1037 :Wczytaj krajobraz
|
||||
STR_1038 :Przekonwertuj zapis gry do scenariusza
|
||||
STR_1039 :Dodaj nowy projekt trasy
|
||||
STR_1040 :Zapisz grę
|
||||
STR_1041 :Zapisz scenariusz
|
||||
STR_1042 :Zapisz krajobraz
|
||||
STR_1043 :Zapis gry RollerCoaster Tycoon 2
|
||||
STR_1044 :Scenariusz RollerCoaster Tycoon 2
|
||||
STR_1045 :Krajobrazu RollerCoaster Tycoon 2
|
||||
STR_1046 :Projekt trasy RollerCoaster Tycoon 2
|
||||
STR_1047 :Zapis gry nieudany!
|
||||
STR_1048 :Zapis scenariusza nieudany!
|
||||
STR_1049 :Zapis krajobrazu nieudany!
|
||||
STR_1050 :Nie udało się wczytać...{NEWLINE}Plik zawiera błędne dane!
|
||||
STR_1051 :Przezroczyste wsporniki
|
||||
STR_1052 :Przezroczyści ludzie
|
||||
STR_1053 :{SMALLFONT}{BLACK}Atrakcje w parku
|
||||
STR_1054 :{SMALLFONT}{BLACK}Nazwij atrakcję
|
||||
STR_1055 :{SMALLFONT}{BLACK}Nazwij osobę
|
||||
STR_1056 :{SMALLFONT}{BLACK}Nazwij pracownika
|
||||
# ------------------------------------------ Polish end
|
||||
STR_1057 :Ride/attraction name
|
||||
STR_1058 :Enter new name for this ride/attraction:
|
||||
STR_1059 :Can't rename ride/attraction...
|
||||
|
@ -1155,25 +1161,25 @@ STR_1144 :Can't build/move entrance for this ride/attraction...
|
|||
STR_1145 :Can't build/move exit for this ride/attraction...
|
||||
STR_1146 :Entrance not yet built
|
||||
STR_1147 :Exit not yet built
|
||||
STR_1148 :Quarter load
|
||||
STR_1149 :Half load
|
||||
STR_1150 :Three-quarter load
|
||||
STR_1151 :Full load
|
||||
STR_1152 :Any load
|
||||
STR_1153 :Height Marks on Ride Tracks
|
||||
STR_1154 :Height Marks on Land
|
||||
STR_1155 :Height Marks on Paths
|
||||
# ------------------------------------------ Polish start
|
||||
STR_1148 :25% zapełnienia
|
||||
STR_1149 :50% zapełnienia
|
||||
STR_1150 :70% zapełnienia
|
||||
STR_1151 :100% zapełnienia
|
||||
STR_1152 :dowolne zapełnienie
|
||||
STR_1153 :Znaczniki wysokości torów
|
||||
STR_1154 :Znaczniki wysokości terenu
|
||||
STR_1155 :Znaczniki wysokości chodników
|
||||
STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID}
|
||||
STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID}
|
||||
STR_1158 :Can't remove this...
|
||||
STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories
|
||||
STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water
|
||||
STR_1161 :Can't position this here...
|
||||
STR_1158 :Nie można tego usunąć...
|
||||
STR_1159 :{SMALLFONT}{BLACK}Buduj scenerię, ogrody i inne akcesoria
|
||||
STR_1160 :{SMALLFONT}{BLACK}Twórz i zmieniaj obszary wodne
|
||||
STR_1161 :Nie można tego tu umieścić...
|
||||
STR_1162 :{OUTLINE}{TOPAZ}{STRINGID}
|
||||
STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify)
|
||||
STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove)
|
||||
STR_1163 :{STRINGID}{NEWLINE}(Kliknij PPM by zmodyfikować)
|
||||
STR_1164 :{STRINGID}{NEWLINE}(Kliknij PPM by usunąć)
|
||||
STR_1165 :{STRINGID} - {STRINGID} {COMMA16}
|
||||
# ------------------------------------------ Polish start
|
||||
STR_1166 :Nie można tu obniżyć poziomu wody...
|
||||
STR_1167 :Nie można tu podnieść poziomu wody...
|
||||
STR_1168 :Opcje
|
||||
|
@ -1214,21 +1220,21 @@ STR_1202 :1 osoba w kolejce
|
|||
STR_1203 :{COMMA16} osób w kolejce
|
||||
STR_1204 :{COMMA16} minuta czekania
|
||||
STR_1205 :{COMMA16} minut czekania
|
||||
# ------------------------------------------ Polish end
|
||||
STR_1206 :{WINDOW_COLOUR_2}Wait for:
|
||||
STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station
|
||||
STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station
|
||||
STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing
|
||||
STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station
|
||||
STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time:
|
||||
STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time:
|
||||
STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing
|
||||
STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing
|
||||
STR_1215 :{WINDOW_COLOUR_2}Synchronize with adjacent stations
|
||||
STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronize departure with all adjacent stations (for 'racing')
|
||||
STR_1217 :{COMMA16} seconds
|
||||
STR_1206 :{WINDOW_COLOUR_2}Czekaj na:
|
||||
STR_1207 :{WINDOW_COLOUR_2}Wyrusz, gdy inna kolejka trafi na tą samą stację
|
||||
STR_1208 :{WINDOW_COLOUR_2}Wyrusz, gdy inna łódka trafi na tą samą stację
|
||||
STR_1209 :{SMALLFONT}{BLACK}Ustal, czy pojazdy powinny czekać na pasażerów przed wyruszeniem ze stacji
|
||||
STR_1210 :{SMALLFONT}{BLACK}Ustal, czy pojazdy powinny wyruszać ze stacj gdy tylko inny pojazd dotrze do tej samej stacji
|
||||
STR_1211 :{WINDOW_COLOUR_2}Minimalny czas oczekiwania:
|
||||
STR_1212 :{WINDOW_COLOUR_2}Maksymalny czas oczekiwania:
|
||||
STR_1213 :{SMALLFONT}{BLACK}Wybierz minimalny czas oczekiwania na stacji przed wyruszeniem
|
||||
STR_1214 :{SMALLFONT}{BLACK}Wybierz maksymalny czas oczekiwania na stacji przed wyruszeniem
|
||||
STR_1215 :{WINDOW_COLOUR_2}Synchronizuj z sąsiadującymi stacjami
|
||||
STR_1216 :{SMALLFONT}{BLACK}Wybierz, czy kolejki mają synchronizować start z innymi stacjami (dla 'wyścigów')
|
||||
STR_1217 :{COMMA16} sekund
|
||||
STR_1218 :{BLACK}{SMALLUP}
|
||||
STR_1219 :{BLACK}{SMALLDOWN}
|
||||
# ------------------------------------------ Polish end
|
||||
STR_1220 :Exit only
|
||||
STR_1221 :No entrance
|
||||
STR_1222 :No exit
|
||||
|
@ -1666,20 +1672,22 @@ STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES}
|
|||
STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES}
|
||||
STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES}
|
||||
STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES}
|
||||
STR_1654 :{WINDOW_COLOUR_2}Recent thoughts:
|
||||
STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land
|
||||
STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath
|
||||
STR_1657 :{WINDOW_COLOUR_2}Preferred ride
|
||||
STR_1658 :{WINDOW_COLOUR_2}intensity: {BLACK}less than {COMMA16}
|
||||
STR_1659 :{WINDOW_COLOUR_2}intensity: {BLACK}between {COMMA16} and {COMMA16}
|
||||
STR_1660 :{WINDOW_COLOUR_2}intensity: {BLACK}more than {COMMA16}
|
||||
STR_1661 :{WINDOW_COLOUR_2}Nausea tolerance: {BLACK}{STRINGID}
|
||||
STR_1662 :{WINDOW_COLOUR_2}Happiness:
|
||||
STR_1663 :{WINDOW_COLOUR_2}Nausea:
|
||||
STR_1664 :{WINDOW_COLOUR_2}Energy:
|
||||
STR_1665 :{WINDOW_COLOUR_2}Hunger:
|
||||
STR_1666 :{WINDOW_COLOUR_2}Thirst:
|
||||
STR_1667 :{WINDOW_COLOUR_2}Bathroom:
|
||||
# ------------------------------------------ Polish start
|
||||
STR_1654 :{WINDOW_COLOUR_2}Ostatnie myśli:
|
||||
STR_1655 :{SMALLFONT}{BLACK}Buduj ścieżki na ziemi
|
||||
STR_1656 :{SMALLFONT}{BLACK}Buduj ścieżki w powietrzu lub pod ziemią
|
||||
STR_1657 :{WINDOW_COLOUR_2}Preferowana
|
||||
STR_1658 :{WINDOW_COLOUR_2}intensywność: {BLACK}poniżej {COMMA16}
|
||||
STR_1659 :{WINDOW_COLOUR_2}intensywność: {BLACK}między {COMMA16} a {COMMA16}
|
||||
STR_1660 :{WINDOW_COLOUR_2}intensywność: {BLACK}powyżej {COMMA16}
|
||||
STR_1661 :{WINDOW_COLOUR_2}Odporność na mdłości: {BLACK}{STRINGID}
|
||||
STR_1662 :{WINDOW_COLOUR_2}Szczęście:
|
||||
STR_1663 :{WINDOW_COLOUR_2}Mdłości:
|
||||
STR_1664 :{WINDOW_COLOUR_2}Energia:
|
||||
STR_1665 :{WINDOW_COLOUR_2}Głód:
|
||||
STR_1666 :{WINDOW_COLOUR_2}Pragnienie:
|
||||
STR_1667 :{WINDOW_COLOUR_2}Pęcherz:
|
||||
# ------------------------------------------ Polish end
|
||||
STR_1668 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}Unknown
|
||||
STR_1669 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}{COMMA16}%
|
||||
STR_1670 :{WINDOW_COLOUR_2}Total customers: {BLACK}{COMMA32}
|
||||
|
@ -1840,48 +1848,51 @@ STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID}
|
|||
STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction
|
||||
STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction
|
||||
STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction
|
||||
STR_1826 :Status
|
||||
STR_1827 :Popularity
|
||||
STR_1828 :Satisfaction
|
||||
STR_1829 :Profit
|
||||
STR_1830 :Queue length
|
||||
STR_1831 :Queue time
|
||||
STR_1832 :Reliability
|
||||
STR_1833 :Down-time
|
||||
STR_1834 :Guests favorite
|
||||
STR_1835 :Popularity: Unknown
|
||||
STR_1836 :Popularity: {COMMA16}%
|
||||
STR_1837 :Satisfaction: Unknown
|
||||
STR_1838 :Satisfaction: {COMMA16}%
|
||||
STR_1839 :Reliability: {COMMA16}%
|
||||
STR_1840 :Down-time: {COMMA16}%
|
||||
STR_1841 :Profit: {CURRENCY} per hour
|
||||
STR_1842 :Favorite of: {COMMA16} guest
|
||||
STR_1843 :Favorite of: {COMMA16} guests
|
||||
STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list
|
||||
# ------------------------------------------ Polish start
|
||||
STR_1826 :Stan
|
||||
STR_1827 :Popularność
|
||||
STR_1828 :Satysfakcja
|
||||
STR_1829 :Zysk
|
||||
STR_1830 :Długość kolejki
|
||||
STR_1831 :Czas w kolejce
|
||||
STR_1832 :Niezawodność
|
||||
STR_1833 :Przestoje
|
||||
STR_1834 :Ulubieniec gości
|
||||
STR_1835 :Popularność: Nieznana
|
||||
STR_1836 :Popularność: {COMMA16}%
|
||||
STR_1837 :Satysfakcja: Nieznana
|
||||
STR_1838 :Satysfakcja: {COMMA16}%
|
||||
STR_1839 :Niezawodność: {COMMA16}%
|
||||
STR_1840 :Przestoje w pracy: {COMMA16}%
|
||||
STR_1841 :Zysk: {CURRENCY} per hour
|
||||
STR_1842 :Ulubiony dla: {COMMA16} gościa
|
||||
STR_1843 :Ulubiony dla: {COMMA16} gości
|
||||
STR_1844 :{SMALLFONT}{BLACK}Wybierz rodzaj informacji do pokazania
|
||||
STR_1845 :{MONTHYEAR}
|
||||
STR_1846 :{COMMA16} guests
|
||||
STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests
|
||||
STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests
|
||||
STR_1849 :{WINDOW_COLOUR_2}Play music
|
||||
STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride
|
||||
STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour
|
||||
STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown
|
||||
STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year
|
||||
STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year
|
||||
STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago
|
||||
STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP}
|
||||
STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP}
|
||||
STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month
|
||||
STR_1859 :Handymen
|
||||
STR_1860 :Mechanics
|
||||
STR_1861 :Security Guards
|
||||
STR_1862 :Entertainers
|
||||
STR_1863 :Handyman
|
||||
STR_1864 :Mechanic
|
||||
STR_1865 :Security Guard
|
||||
STR_1866 :Entertainer
|
||||
STR_1846 :{COMMA16} gości
|
||||
STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} gości
|
||||
STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} gości
|
||||
STR_1849 :{WINDOW_COLOUR_2}Graj muzykę
|
||||
STR_1850 :{SMALLFONT}{BLACK}Wybierz, czy w tej atrakcji może grać muzyka
|
||||
STR_1851 :{WINDOW_COLOUR_2}Koszty utrzymania: {BLACK}{CURRENCY2DP} na godzinę
|
||||
STR_1852 :{WINDOW_COLOUR_2}Koszty utrzymania: {BLACK}Nieznane
|
||||
STR_1853 :{WINDOW_COLOUR_2}Zbudowany: {BLACK}W tym roku
|
||||
STR_1854 :{WINDOW_COLOUR_2}Zbudowany: {BLACK}W zeszłym roku
|
||||
STR_1855 :{WINDOW_COLOUR_2}Zbudowany: {BLACK}{COMMA16} lat temu
|
||||
STR_1856 :{WINDOW_COLOUR_2}Zysk na sztuce: {BLACK}{CURRENCY2DP}
|
||||
STR_1857 :{WINDOW_COLOUR_2}Strata na sztuce: {BLACK}{CURRENCY2DP}
|
||||
# could be "pensja" but I'm not sure if it's used outside of staff window
|
||||
STR_1858 :{WINDOW_COLOUR_2}Koszt: {BLACK}{CURRENCY} miesięcznie
|
||||
STR_1859 :dozorcy
|
||||
STR_1860 :mechanicy
|
||||
STR_1861 :strażnicy
|
||||
STR_1862 :klauni
|
||||
STR_1863 :dozorca
|
||||
STR_1864 :mechanik
|
||||
STR_1865 :strażnik
|
||||
STR_1866 :klaun
|
||||
STR_1867 :{BLACK}{COMMA16} {STRINGID}
|
||||
# ------------------------------------------ Polish end
|
||||
STR_1868 :Can't change number of rotations...
|
||||
STR_1869 :{WINDOW_COLOUR_2}Number of rotations:
|
||||
STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations
|
||||
|
@ -2273,7 +2284,7 @@ STR_2252 :Można budować tylko w poprzek chodników!
|
|||
STR_2253 :Transport
|
||||
STR_2254 :Łagodne atrakcje
|
||||
STR_2255 :Kolejki górskie
|
||||
STR_2256 :Mocne atrakcje
|
||||
STR_2256 :Intensywne atrakcje
|
||||
STR_2257 :Wodne atrakcje
|
||||
STR_2258 :Sklepy i stoiska
|
||||
STR_2259 :Scenerie i dekoracje
|
||||
|
@ -2298,7 +2309,7 @@ STR_2277 :Nieznany
|
|||
STR_2278 :Transport
|
||||
STR_2279 :Łagodne atrakcje
|
||||
STR_2280 :Kolejki górskie
|
||||
STR_2281 :Mocne atrakcje
|
||||
STR_2281 :Intensywne atrakcje
|
||||
STR_2282 :Wodne atrakcje
|
||||
STR_2283 :Sklepy i stoiska
|
||||
STR_2284 :Scenerie i dekoracje
|
||||
|
@ -2309,20 +2320,22 @@ STR_2288 :Nieznane
|
|||
STR_2289 :{STRINGID} {STRINGID}
|
||||
STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID}
|
||||
STR_2291 :Wybierz scenariusz dla nowej gry
|
||||
STR_2292 :{WINDOW_COLOUR_2}Odwiedzone atrakcje:
|
||||
STR_2293 :{BLACK} Nic
|
||||
# ------------------------------------------ Polish end
|
||||
STR_2292 :{WINDOW_COLOUR_2}Rides been on:
|
||||
STR_2293 :{BLACK} Nothing
|
||||
STR_2294 :{SMALLFONT}{BLACK}Change base land style
|
||||
STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land
|
||||
STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park
|
||||
STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} ride
|
||||
STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} rides
|
||||
STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food
|
||||
STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food
|
||||
STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink
|
||||
STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks
|
||||
STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir
|
||||
STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs
|
||||
# ------------------------------------------ Polish start
|
||||
STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na wejście do parku
|
||||
STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} atrakcji
|
||||
STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} atrakcjach
|
||||
STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} posiłku
|
||||
STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} posiłkach
|
||||
STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} napoju
|
||||
STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} napojach
|
||||
STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} pamiątce
|
||||
STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} pamiątkach
|
||||
# ------------------------------------------ Polish end
|
||||
STR_2305 :Track design files
|
||||
STR_2306 :Save track design
|
||||
STR_2307 :Select {STRINGID} design
|
||||
|
@ -2367,18 +2380,16 @@ STR_2344 :Imperialne
|
|||
STR_2345 :Metryczne
|
||||
STR_2346 :Grafika
|
||||
STR_2347 :{RED}{STRINGID} utonął!
|
||||
# ------------------------------------------ Polish end
|
||||
STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member
|
||||
STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month
|
||||
STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR}
|
||||
STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16}
|
||||
STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16}
|
||||
STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16}
|
||||
STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16}
|
||||
STR_2355 :{WINDOW_COLOUR_2}Rides fixed: {BLACK}{COMMA16}
|
||||
STR_2356 :{WINDOW_COLOUR_2}Rides inspected: {BLACK}{COMMA16}
|
||||
STR_2357 :House
|
||||
# ------------------------------------------ Polish start
|
||||
STR_2348 :{SMALLFONT}{BLACK}Pokaż statystyki tego pracownika
|
||||
STR_2349 :{WINDOW_COLOUR_2}Pensja: {BLACK}{CURRENCY} miesięcznie
|
||||
STR_2350 :{WINDOW_COLOUR_2}Zatrudniony: {BLACK}{MONTHYEAR}
|
||||
STR_2351 :{WINDOW_COLOUR_2}Skoszone trawniki: {BLACK}{COMMA16}
|
||||
STR_2352 :{WINDOW_COLOUR_2}Podlane ogrody: {BLACK}{COMMA16}
|
||||
STR_2353 :{WINDOW_COLOUR_2}Sprzątnięte śmieci: {BLACK}{COMMA16}
|
||||
STR_2354 :{WINDOW_COLOUR_2}Opróżnione kosze: {BLACK}{COMMA16}
|
||||
STR_2355 :{WINDOW_COLOUR_2}Naprawione atrakcje: {BLACK}{COMMA16}
|
||||
STR_2356 :{WINDOW_COLOUR_2}Skontrolowane atrakcje: {BLACK}{COMMA16}
|
||||
STR_2357 :Dom
|
||||
STR_2358 :Jednostki
|
||||
STR_2359 :Prawdziwe wartości
|
||||
STR_2360 :{WINDOW_COLOUR_2}Rozdzielczość:
|
||||
|
@ -2744,30 +2755,36 @@ STR_2716 :/
|
|||
STR_2717 :'
|
||||
STR_2718 :???
|
||||
STR_2719 :???
|
||||
STR_2720 :???
|
||||
STR_2721 :???
|
||||
STR_2722 :???
|
||||
STR_2723 :???
|
||||
STR_2724 :???
|
||||
STR_2725 :???
|
||||
STR_2726 :???
|
||||
STR_2727 :???
|
||||
STR_2728 :???
|
||||
STR_2729 :???
|
||||
STR_2730 :???
|
||||
STR_2731 :???
|
||||
STR_2732 :???
|
||||
STR_2733 :???
|
||||
STR_2734 :???
|
||||
STR_2735 :???
|
||||
STR_2736 :???
|
||||
STR_2737 :???
|
||||
STR_2738 :???
|
||||
STR_2739 :???
|
||||
STR_2740 :???
|
||||
STR_2741 :???
|
||||
STR_2742 :???
|
||||
STR_2743 :???
|
||||
# New strings (previously these were ???)
|
||||
# sec, secs
|
||||
STR_2720 :{UINT16}sek
|
||||
STR_2721 :{UINT16}sek
|
||||
# min+sec, min+secs, mins+sec, mins+secs
|
||||
STR_2722 :{UINT16}min:{UINT16}sek
|
||||
STR_2723 :{UINT16}min:{UINT16}sek
|
||||
STR_2724 :{UINT16}min:{UINT16}sek
|
||||
STR_2725 :{UINT16}min:{UINT16}sek
|
||||
# min, mins
|
||||
STR_2726 :{UINT16}min
|
||||
STR_2727 :{UINT16}min
|
||||
# hour+min, hour+mins, hours+min, hours+mins
|
||||
STR_2728 :{UINT16}godz:{UINT16}min
|
||||
STR_2729 :{UINT16}godz:{UINT16}min
|
||||
STR_2730 :{UINT16}godz:{UINT16}min
|
||||
STR_2731 :{UINT16}godz:{UINT16}min
|
||||
STR_2732 :{COMMA16}ft
|
||||
STR_2733 :{COMMA16}m
|
||||
STR_2734 :{COMMA16}mph
|
||||
STR_2735 :{COMMA16}km/h
|
||||
STR_2736 :{MONTH}, Rok {COMMA16}
|
||||
STR_2737 :{STRINGID} {MONTH}, Rok {COMMA16}
|
||||
STR_2738 :Muzyka tytułowa
|
||||
STR_2739 :Brak
|
||||
STR_2740 :RollerCoaster Tycoon 1
|
||||
STR_2741 :RollerCoaster Tycoon 2
|
||||
STR_2742 :Nie znaleziono css50.dat
|
||||
STR_2743 :Przekopiuj data\css17.dat z folderu RCT1 do data\css50.dat folderu instalacji RCT2.
|
||||
# End of new strings
|
||||
STR_2744 :[
|
||||
STR_2745 :\
|
||||
STR_2746 :]
|
||||
|
@ -3137,9 +3154,11 @@ STR_3103 :Can't re-paint this...
|
|||
STR_3104 :{SMALLFONT}{BLACK}List rides
|
||||
STR_3105 :{SMALLFONT}{BLACK}List shops and stalls
|
||||
STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities
|
||||
STR_3107 :Close
|
||||
STR_3108 :Test
|
||||
STR_3109 :Open
|
||||
# ------------------------------------------ Polish start
|
||||
STR_3107 :Zamknij
|
||||
STR_3108 :Testuj
|
||||
STR_3109 :Otwórz
|
||||
# ------------------------------------------ Polish end
|
||||
STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16}
|
||||
STR_3111 :{SMALLFONT}{BLACK}Click on design to build it
|
||||
STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
<ClCompile Include="..\src\audio\mixer.cpp" />
|
||||
<ClCompile Include="..\src\cmdline.c" />
|
||||
<ClCompile Include="..\src\config.c" />
|
||||
<ClCompile Include="..\src\cursors.c" />
|
||||
<ClCompile Include="..\src\diagnostic.c" />
|
||||
<ClCompile Include="..\src\drawing\drawing.c" />
|
||||
<ClCompile Include="..\src\drawing\line.c" />
|
||||
|
@ -59,7 +60,6 @@
|
|||
<ClCompile Include="..\src\peep\staff.c" />
|
||||
<ClCompile Include="..\src\platform\shared.c" />
|
||||
<ClCompile Include="..\src\platform\unix.c" />
|
||||
<ClCompile Include="..\src\platform\osinterface.c" />
|
||||
<ClCompile Include="..\src\platform\osx.c" />
|
||||
<ClCompile Include="..\src\platform\windows.c" />
|
||||
<ClCompile Include="..\src\rct2.c" />
|
||||
|
@ -68,11 +68,11 @@
|
|||
<ClCompile Include="..\src\ride\ride_ratings.c" />
|
||||
<ClCompile Include="..\src\ride\station.c" />
|
||||
<ClCompile Include="..\src\ride\track.c" />
|
||||
<ClCompile Include="..\src\ride\track_data.c" />
|
||||
<ClCompile Include="..\src\ride\vehicle.c" />
|
||||
<ClCompile Include="..\src\scenario.c" />
|
||||
<ClCompile Include="..\src\scenario_list.c" />
|
||||
<ClCompile Include="..\src\title.c" />
|
||||
<ClCompile Include="..\src\toolbar.c" />
|
||||
<ClCompile Include="..\src\tutorial.c" />
|
||||
<ClCompile Include="..\src\util\sawyercoding.c" />
|
||||
<ClCompile Include="..\src\util\util.c" />
|
||||
|
@ -88,16 +88,15 @@
|
|||
<ClCompile Include="..\src\windows\editor_objective_options.c" />
|
||||
<ClCompile Include="..\src\windows\editor_object_selection.c" />
|
||||
<ClCompile Include="..\src\windows\editor_scenario_options.c" />
|
||||
<ClCompile Include="..\src\windows\editor_top_toolbar.c" />
|
||||
<ClCompile Include="..\src\windows\error.c" />
|
||||
<ClCompile Include="..\src\windows\finances.c" />
|
||||
<ClCompile Include="..\src\windows\footpath.c" />
|
||||
<ClCompile Include="..\src\windows\game_bottom_toolbar.c" />
|
||||
<ClCompile Include="..\src\windows\game_top_toolbar.c" />
|
||||
<ClCompile Include="..\src\windows\guest_list.c" />
|
||||
<ClCompile Include="..\src\windows\land.c" />
|
||||
<ClCompile Include="..\src\windows\main.c" />
|
||||
<ClCompile Include="..\src\windows\map.c" />
|
||||
<ClCompile Include="..\src\windows\mapgen.c" />
|
||||
<ClCompile Include="..\src\windows\map_tooltip.c" />
|
||||
<ClCompile Include="..\src\windows\music_credits.c" />
|
||||
<ClCompile Include="..\src\windows\news.c" />
|
||||
|
@ -125,6 +124,7 @@
|
|||
<ClCompile Include="..\src\windows\title_menu.c" />
|
||||
<ClCompile Include="..\src\windows\title_scenarioselect.c" />
|
||||
<ClCompile Include="..\src\windows\tooltip.c" />
|
||||
<ClCompile Include="..\src\windows\top_toolbar.c" />
|
||||
<ClCompile Include="..\src\windows\track_list.c" />
|
||||
<ClCompile Include="..\src\windows\track_manage.c" />
|
||||
<ClCompile Include="..\src\windows\track_place.c" />
|
||||
|
@ -135,6 +135,8 @@
|
|||
<ClCompile Include="..\src\world\footpath.c" />
|
||||
<ClCompile Include="..\src\world\fountain.c" />
|
||||
<ClCompile Include="..\src\world\map.c" />
|
||||
<ClCompile Include="..\src\world\mapgen.c" />
|
||||
<ClCompile Include="..\src\world\map_helpers.c" />
|
||||
<ClCompile Include="..\src\world\park.c" />
|
||||
<ClCompile Include="..\src\world\sprite.c" />
|
||||
</ItemGroup>
|
||||
|
@ -174,19 +176,19 @@
|
|||
<ClInclude Include="..\src\openrct2.h" />
|
||||
<ClInclude Include="..\src\peep\peep.h" />
|
||||
<ClInclude Include="..\src\peep\staff.h" />
|
||||
<ClInclude Include="..\src\platform\osinterface.h" />
|
||||
<ClInclude Include="..\src\platform\platform.h" />
|
||||
<ClInclude Include="..\src\rct1.h" />
|
||||
<ClInclude Include="..\src\rct2.h" />
|
||||
<ClInclude Include="..\src\ride\ride.h" />
|
||||
<ClInclude Include="..\src\ride\ride_data.h" />
|
||||
<ClInclude Include="..\src\ride\ride_ratings.h" />
|
||||
<ClInclude Include="..\src\ride\station.h" />
|
||||
<ClInclude Include="..\src\ride\track.h" />
|
||||
<ClInclude Include="..\src\ride\track_data.h" />
|
||||
<ClInclude Include="..\src\ride\vehicle.h" />
|
||||
<ClInclude Include="..\src\scenario.h" />
|
||||
<ClInclude Include="..\src\sprites.h" />
|
||||
<ClInclude Include="..\src\title.h" />
|
||||
<ClInclude Include="..\src\toolbar.h" />
|
||||
<ClInclude Include="..\src\tutorial.h" />
|
||||
<ClInclude Include="..\src\util\sawyercoding.h" />
|
||||
<ClInclude Include="..\src\util\util.h" />
|
||||
|
@ -198,6 +200,8 @@
|
|||
<ClInclude Include="..\src\world\climate.h" />
|
||||
<ClInclude Include="..\src\world\footpath.h" />
|
||||
<ClInclude Include="..\src\world\map.h" />
|
||||
<ClInclude Include="..\src\world\mapgen.h" />
|
||||
<ClInclude Include="..\src\world\map_helpers.h" />
|
||||
<ClInclude Include="..\src\world\park.h" />
|
||||
<ClInclude Include="..\src\world\scenery.h" />
|
||||
<ClInclude Include="..\src\world\sprite.h" />
|
||||
|
|
|
@ -120,9 +120,6 @@
|
|||
<ClCompile Include="..\src\windows\game_bottom_toolbar.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\windows\game_top_toolbar.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\windows\guest_list.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
|
@ -204,9 +201,6 @@
|
|||
<ClCompile Include="..\src\localisation\language.c">
|
||||
<Filter>Source\Localisation</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\platform\osinterface.c">
|
||||
<Filter>Source\Platform</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\ride\ride.c">
|
||||
<Filter>Source\Ride</Filter>
|
||||
</ClCompile>
|
||||
|
@ -330,10 +324,6 @@
|
|||
<ClCompile Include="..\src\drawing\rain.c">
|
||||
<Filter>Source\Drawing</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\src\cmdline.c">
|
||||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
|
@ -341,29 +331,28 @@
|
|||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\lib\libspeex\resample.c;..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\src\world\fountain.c">
|
||||
<Filter>Source\World</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\lib\libspeex\resample.c;..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\src\world\banner.c">
|
||||
<Filter>Source\World</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\windows\staff_fire_prompt.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\lib\libspeex\resample.c;..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\src\windows\viewport.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\windows\text_input.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\lib\libspeex\resample.c;..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\src\windows\map_tooltip.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\lib\libspeex\resample.c;..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\src\windows\demolish_ride_prompt.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
|
@ -394,9 +383,6 @@
|
|||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\lib\libspeex\resample.c;..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\src\toolbar.c">
|
||||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\windows\editor_bottom_toolbar.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
|
@ -406,9 +392,6 @@
|
|||
<ClCompile Include="..\src\windows\editor_object_selection.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\windows\editor_top_toolbar.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\lib\libspeex\resample.c;..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\src\localisation\user.c">
|
||||
<Filter>Source\Localisation</Filter>
|
||||
|
@ -424,6 +407,24 @@
|
|||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\lib\lodepng\lodepng.c" />
|
||||
<ClCompile Include="..\src\world\map_helpers.c">
|
||||
<Filter>Source\World</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\world\mapgen.c">
|
||||
<Filter>Source\World</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\windows\mapgen.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\windows\top_toolbar.c">
|
||||
<Filter>Source\Windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\ride\track_data.c">
|
||||
<Filter>Source\Ride</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\cursors.c">
|
||||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\src\management\award.h">
|
||||
|
@ -495,9 +496,6 @@
|
|||
<ClInclude Include="..\src\localisation\string_ids.h">
|
||||
<Filter>Source\Localisation</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\platform\osinterface.h">
|
||||
<Filter>Source\Platform</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\ride\ride.h">
|
||||
<Filter>Source\Ride</Filter>
|
||||
</ClInclude>
|
||||
|
@ -609,8 +607,17 @@
|
|||
<ClInclude Include="..\src\diagnostic.h">
|
||||
<Filter>Source</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\toolbar.h">
|
||||
<ClInclude Include="..\src\rct1.h">
|
||||
<Filter>Source</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\world\mapgen.h">
|
||||
<Filter>Source\World</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\world\map_helpers.h">
|
||||
<Filter>Source\World</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\ride\track_data.h">
|
||||
<Filter>Source\Ride</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,18 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ShowAllFiles>false</ShowAllFiles>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LocalDebuggerCommand>$(TargetDir)\openrct2.exe</LocalDebuggerCommand>
|
||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
<LocalDebuggerWorkingDirectory>$(TargetDir)</LocalDebuggerWorkingDirectory>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LocalDebuggerCommand>$(TargetDir)\openrct2.exe</LocalDebuggerCommand>
|
||||
<LocalDebuggerWorkingDirectory>$(TargetDir)</LocalDebuggerWorkingDirectory>
|
||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
<LocalDebuggerCommandArguments>
|
||||
</LocalDebuggerCommandArguments>
|
||||
<LocalDebuggerCommand>$(TargetDir)\openrct2.exe</LocalDebuggerCommand>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -129,6 +129,7 @@
|
|||
#define RCT2_ADDRESS_RIDE_ENTRIES 0x009ACFA4
|
||||
|
||||
#define RCT2_ADDRESS_INSTALLED_OBJECT_LIST 0x009ADAE8
|
||||
#define RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST 0x009ADAEC
|
||||
|
||||
#define RCT2_ADDRESS_CURRENT_SOUND_DEVICE 0x009AF280
|
||||
|
||||
|
@ -169,6 +170,8 @@
|
|||
#define RCT2_ADDRESS_CURSOR_OVER_WINDOWNUMBER 0x009DE55E
|
||||
#define RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX 0x009DE560
|
||||
|
||||
#define RCT2_ADDRESS_PALETTE_EFFECT_FRAME_NO 0x009DE584
|
||||
|
||||
#define RCT2_ADDRESS_MAP_SELECTION_FLAGS 0x009DE58A
|
||||
#define RCT2_ADDRESS_MAP_SELECTION_A_X 0x009DE58C
|
||||
#define RCT2_ADDRESS_MAP_SELECTION_B_X 0x009DE58E
|
||||
|
@ -178,6 +181,11 @@
|
|||
|
||||
#define RCT2_ADDRESS_SCREEN_FLAGS 0x009DEA68
|
||||
#define RCT2_ADDRESS_SCREENSHOT_COUNTDOWN 0x009DEA6D
|
||||
// Note: not only the zeroth bit can be set to control pause
|
||||
// When paused by saving track 2nd bit is set
|
||||
// When paused by save menu 1st bit is set
|
||||
// When paused by pause button 0th bit is set
|
||||
#define RCT2_ADDRESS_GAME_PAUSED 0x009DEA6E
|
||||
#define RCT2_ADDRESS_PLACE_OBJECT_MODIFIER 0x009DEA70
|
||||
#define RCT2_ADDRESS_ON_TUTORIAL 0x009DEA71
|
||||
|
||||
|
@ -253,6 +261,24 @@
|
|||
|
||||
#define RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX 0x00F43908
|
||||
|
||||
#define RCT2_ADDRESS_TRACK_PREVIEW_ROTATION 0x00F440AE
|
||||
|
||||
#define RCT2_ADDRESS_TRACK_PREVIEW_X_MIN 0x00F440F9
|
||||
#define RCT2_ADDRESS_TRACK_PREVIEW_X_MAX 0x00F440FB
|
||||
#define RCT2_ADDRESS_TRACK_PREVIEW_Y_MIN 0x00F440FD
|
||||
#define RCT2_ADDRESS_TRACK_PREVIEW_Y_MAX 0x00F440FF
|
||||
#define RCT2_ADDRESS_TRACK_PREVIEW_Z_MIN 0x00F44101
|
||||
#define RCT2_ADDRESS_TRACK_PREVIEW_Z_MAX 0x00F44103
|
||||
#define RCT2_ADDRESS_TRACK_DESIGN_CACHE 0x00F44105
|
||||
#define RCT2_ADDRESS_TRACK_DESIGN_INDEX_CACHE 0x00F44109
|
||||
#define RCT2_ADDRESS_TRACK_DESIGN_NEXT_INDEX_CACHE 0x00F44119
|
||||
|
||||
#define RCT2_ADDRESS_TRACK_DESIGN_COST 0x00F4411D
|
||||
|
||||
#define RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE 0x00F44152
|
||||
|
||||
#define RCT2_ADDRESS_TRACK_LIST 0x00F441EC
|
||||
|
||||
#define RCT2_ADDRESS_CURRENT_MONTH_YEAR 0x00F663A8
|
||||
#define RCT2_ADDRESS_CURRENT_MONTH_TICKS 0x00F663AA
|
||||
#define RCT2_ADDRESS_SCENARIO_TICKS 0x00F663AC
|
||||
|
@ -268,6 +294,8 @@
|
|||
#define RCT2_ADDRESS_SPRITES_START_TEXTFX 0x013573C2
|
||||
#define RCT2_ADDRESS_SPRITES_START_LITTER 0x013573C4
|
||||
|
||||
#define RCT2_ADDRESS_PARK_NAME 0x013573D4
|
||||
#define RCT2_ADDRESS_PARK_NAME_ARGS 0x013573D8
|
||||
#define RCT2_ADDRESS_INITIAL_CASH 0x013573DC
|
||||
#define RCT2_ADDRESS_CURRENT_LOAN 0x013573E0
|
||||
#define RCT2_ADDRESS_MAXIMUM_LOAN 0x013580F0
|
||||
|
@ -324,6 +352,7 @@
|
|||
#define RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY 0x013580E7
|
||||
#define RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_MONTH 0x013580E8
|
||||
|
||||
#define RCT2_ADDRESS_MAP_SIZE_UNITS 0x01358830
|
||||
#define RCT2_ADDRESS_MAP_MAXIMUM_X_Y 0x01358832
|
||||
#define RCT2_ADDRESS_MAP_SIZE 0x01358834
|
||||
#define RCT2_ADDRESS_PARK_SIZE 0x013580EA
|
||||
|
@ -338,6 +367,7 @@
|
|||
#define RCT2_ADDRESS_PARK_ENTRANCE_X 0x01359350
|
||||
#define RCT2_ADDRESS_PARK_ENTRANCE_Y 0x01359358
|
||||
#define RCT2_ADDRESS_PARK_ENTRANCE_Z 0x01359360
|
||||
#define RCT2_ADDRESS_PARK_ENTRANCE_DIRECTION 0x01359368
|
||||
|
||||
#define RCT2_ADDRESS_CURRENT_TICKS 0x013628F4
|
||||
#define RCT2_ADDRESS_RIDE_LIST 0x013628F8
|
||||
|
@ -379,12 +409,10 @@
|
|||
|
||||
#define RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER 0x0141ED68
|
||||
|
||||
#define RCT2_ADDRESS_AUDIO_INFO 0x01425B40
|
||||
#define RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE 0x0141F56C
|
||||
|
||||
#define RCT2_ADDRESS_SOUND_CHANNEL_LIST 0x014262E0
|
||||
|
||||
#define RCT2_ADDRESS_WATER_RAISE_COST 0x0141F738
|
||||
#define RCT2_ADDRESS_WATER_LOWER_COST 0x0141F73C
|
||||
#define RCT2_ADDRESS_WATER_RAISE_COST 0x0141F738
|
||||
#define RCT2_ADDRESS_WATER_LOWER_COST 0x0141F73C
|
||||
|
||||
#define RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_1 0x0141F740
|
||||
#define RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_2 0x0141F741
|
||||
|
@ -475,6 +503,10 @@
|
|||
|
||||
#define RCT2_ADDRESS_INPUT_QUEUE 0x01424340
|
||||
|
||||
#define RCT2_ADDRESS_AUDIO_INFO 0x01425B40
|
||||
|
||||
#define RCT2_ADDRESS_SOUND_CHANNEL_LIST 0x014262E0
|
||||
|
||||
#define RCT2_ADDRESS_COMMON_FORMAT_ARGS 0x013CE952
|
||||
|
||||
#define RCT2_ADDRESS_STAFF_MODE_ARRAY 0x013CA672
|
||||
|
@ -494,24 +526,11 @@
|
|||
#define RCT2_ADDRESS_X_END_POINT_GLOBAL 0x9ABDA8 //sint16
|
||||
#define RCT2_ADDRESS_X_START_POINT_GLOBAL 0xEDF80C //sint16
|
||||
#define RCT2_ADDRESS_DPI_LINE_LENGTH_GLOBAL 0x9ABDB0 //uint16 width+pitch
|
||||
#define RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS 0x009AA00D
|
||||
#define RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG 0x009AB4C6
|
||||
|
||||
#pragma endregion
|
||||
|
||||
static void RCT2_CALLPROC_EBPSAFE(int address)
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
__asm push ebp
|
||||
__asm call address
|
||||
__asm pop ebp
|
||||
#else
|
||||
__asm__ ( "\
|
||||
push ebp \n\
|
||||
call %[address] \n\
|
||||
pop ebp \n\
|
||||
" : [address] "+m" (address) );
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Returns the flags register
|
||||
*
|
||||
*Flags register is as follows:
|
||||
|
@ -566,45 +585,9 @@ static int RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx,
|
|||
#endif
|
||||
}
|
||||
|
||||
static void RCT2_CALLPROC_X_EBPSAFE(int address, int _eax, int _ebx, int _ecx, int _edx, int _esi, int _edi, int _ebp)
|
||||
static int RCT2_CALLPROC_EBPSAFE(int address)
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
__asm {
|
||||
push ebp
|
||||
push address
|
||||
mov eax, _eax
|
||||
mov ebx, _ebx
|
||||
mov ecx, _ecx
|
||||
mov edx, _edx
|
||||
mov esi, _esi
|
||||
mov edi, _edi
|
||||
mov ebp, _ebp
|
||||
call[esp]
|
||||
add esp, 4
|
||||
pop ebp
|
||||
}
|
||||
#else
|
||||
__asm__ ( "\
|
||||
\n\
|
||||
push ebx \n\
|
||||
push ebp \n\
|
||||
push %[address] \n\
|
||||
mov eax, %[_eax] \n\
|
||||
mov ebx, %[_ebx] \n\
|
||||
mov ecx, %[_ecx] \n\
|
||||
mov edx, %[_edx] \n\
|
||||
mov esi, %[_esi] \n\
|
||||
mov edi, %[_edi] \n\
|
||||
mov ebp, %[_ebp] \n\
|
||||
call [esp] \n\
|
||||
add esp, 4 \n\
|
||||
pop ebp \n\
|
||||
pop ebx \n\
|
||||
" : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp)
|
||||
:
|
||||
: "eax","ecx","edx","esi","edi"
|
||||
);
|
||||
#endif
|
||||
return RCT2_CALLPROC_X(address, 0xBBBBBBBB, 0xBBBBBBBB, 0xBBBBBBBB, 0xBBBBBBBB, 0xBBBBBBBB, 0xBBBBBBBB, 0xBBBBBBBB);
|
||||
}
|
||||
|
||||
/* Returns the flags register
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include "../config.h"
|
||||
#include "../interface/viewport.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../platform/platform.h"
|
||||
#include "../world/map.h"
|
||||
#include "../world/sprite.h"
|
||||
#include "audio.h"
|
||||
|
@ -693,32 +693,32 @@ int sound_prepare(int sound_id, rct_sound *sound, int channels, int software)
|
|||
rct_sound_effect* sound_effect = sound_get_effect(sound_id);
|
||||
if (sound_effect) {
|
||||
if (sound_effect_loadvars(sound_effect, &bufferdesc.lpwfxFormat, &buffer, &bufferdesc.dwBufferBytes)) {
|
||||
bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STATIC;
|
||||
if (channels) {
|
||||
if (channels == 2) {
|
||||
if (channels == 0){
|
||||
bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STATIC;
|
||||
}
|
||||
else if (channels == 2) {
|
||||
bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D | DSBCAPS_STATIC;
|
||||
} else {
|
||||
} else {
|
||||
bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY | DSBCAPS_STATIC;
|
||||
}
|
||||
if (RCT2_GLOBAL(0x009E2B90, uint32)) {
|
||||
bufferdesc.dwFlags |= DSBCAPS_CTRLPAN;
|
||||
}
|
||||
if (software) {
|
||||
bufferdesc.dwFlags |= DSBCAPS_LOCSOFTWARE;
|
||||
}
|
||||
if (SUCCEEDED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &sound->dsbuffer, 0))) {
|
||||
if (sound_fill_buffer(sound->dsbuffer, buffer, bufferdesc.dwBufferBytes)) {
|
||||
sound->id = sound_id;
|
||||
DSBCAPS caps;
|
||||
caps.dwSize = sizeof(caps);
|
||||
sound->dsbuffer->lpVtbl->GetCaps(sound->dsbuffer, &caps);
|
||||
sound->has_caps = caps.dwFlags;
|
||||
sound_add(sound);
|
||||
return 1;
|
||||
}
|
||||
if (RCT2_GLOBAL(0x009E2B90, uint32)) {
|
||||
bufferdesc.dwFlags |= DSBCAPS_CTRLPAN;
|
||||
}
|
||||
if (software) {
|
||||
bufferdesc.dwFlags |= DSBCAPS_LOCSOFTWARE;
|
||||
}
|
||||
if (SUCCEEDED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &sound->dsbuffer, 0))) {
|
||||
if (sound_fill_buffer(sound->dsbuffer, buffer, bufferdesc.dwBufferBytes)) {
|
||||
sound->id = sound_id;
|
||||
DSBCAPS caps;
|
||||
caps.dwSize = sizeof(caps);
|
||||
sound->dsbuffer->lpVtbl->GetCaps(sound->dsbuffer, &caps);
|
||||
sound->has_caps = caps.dwFlags;
|
||||
sound_add(sound);
|
||||
return 1;
|
||||
}
|
||||
sound->dsbuffer->lpVtbl->Release(sound->dsbuffer);
|
||||
sound->dsbuffer = 0;
|
||||
}
|
||||
sound->dsbuffer->lpVtbl->Release(sound->dsbuffer);
|
||||
sound->dsbuffer = 0;
|
||||
}
|
||||
sound->dsbuffer = 0;
|
||||
}
|
||||
|
@ -1329,7 +1329,7 @@ int dsound_create_primary_buffer(int a, int device, int channels, int samples, i
|
|||
if (FAILED(DirectSoundCreate(&dsdevice->guid, &RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), 0))) {
|
||||
return 0;
|
||||
}
|
||||
if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->SetCooperativeLevel(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), RCT2_GLOBAL(0x009E2D70, HWND), DSSCL_NORMAL)) ||
|
||||
if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->SetCooperativeLevel(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), windows_get_window_handle(), DSSCL_NORMAL)) ||
|
||||
FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), 0))) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->Release(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0;
|
||||
|
@ -1374,7 +1374,7 @@ int dsound_create_primary_buffer(int a, int device, int channels, int samples, i
|
|||
if (FAILED(DirectSoundCreate(&dsdevice->guid, &RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), 0))) {
|
||||
return 0;
|
||||
}
|
||||
if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->SetCooperativeLevel(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), RCT2_GLOBAL(0x009E2D70, HWND), DSSCL_PRIORITY))) {
|
||||
if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->SetCooperativeLevel(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), windows_get_window_handle(), DSSCL_PRIORITY))) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->Release(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0;
|
||||
return 0;
|
||||
|
@ -1431,7 +1431,7 @@ int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z)
|
|||
sint16 y2 = y & 0xFFE0;
|
||||
if (x2 < 0x1FFF && y2 < 0x1FFF) {
|
||||
rct_map_element* mapelement = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*)[((y2 * 256 + x2) & 0xFFFF) / 8];
|
||||
while (mapelement->type & MAP_ELEMENT_TYPE_MASK) {
|
||||
while (map_element_get_type(mapelement) != MAP_ELEMENT_TYPE_SURFACE) {
|
||||
mapelement++;
|
||||
}
|
||||
if ((mapelement->base_height * 8) - 5 > z) {
|
||||
|
@ -1544,13 +1544,25 @@ void stop_completed_sounds()
|
|||
*/
|
||||
void start_title_music()
|
||||
{
|
||||
int musicPathId;
|
||||
switch (gGeneral_config.title_music) {
|
||||
default:
|
||||
return;
|
||||
case 1:
|
||||
musicPathId = PATH_ID_CSS50;
|
||||
break;
|
||||
case 2:
|
||||
musicPathId = PATH_ID_CSS17;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) && RCT2_GLOBAL(0x009AF59D, uint8) & 1 && RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1) {
|
||||
if (!RCT2_GLOBAL(0x009AF600, uint8)) {
|
||||
#ifdef USE_MIXER
|
||||
gTitleMusicChannel = Mixer_Play_Music(PATH_ID_CSS17);
|
||||
gTitleMusicChannel = Mixer_Play_Music(musicPathId);
|
||||
#else
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 1;
|
||||
int result = sound_channel_load_file2(3, (char*)get_file_path(PATH_ID_CSS17), 0);
|
||||
int result = sound_channel_load_file2(3, (char*)get_file_path(musicPathId), 0);
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 0;
|
||||
if (result) {
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 1;
|
||||
|
@ -1690,13 +1702,10 @@ void audio_init1()
|
|||
do {
|
||||
rct_ride_music_info* ride_music_info = &RCT2_GLOBAL(0x009AF1C8, rct_ride_music_info*)[m];
|
||||
const char* path = get_file_path(ride_music_info->pathid);
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 3;
|
||||
HANDLE hfile = osinterface_file_open(path);
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 0;
|
||||
if (hfile != INVALID_HANDLE_VALUE) {
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 3;
|
||||
osinterface_file_read(hfile, &RCT2_GLOBAL(0x009AF47E, uint32), 4);
|
||||
osinterface_file_close(hfile);
|
||||
FILE *file = fopen(path, "rb");
|
||||
if (file != NULL) {
|
||||
fread(&RCT2_GLOBAL(0x009AF47E, uint32), 4, 1, file);
|
||||
fclose(file);
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 0;
|
||||
if (RCT2_GLOBAL(0x009AF47E, uint32) == 0x78787878) {
|
||||
ride_music_info->var_0 = 0;
|
||||
|
|
|
@ -25,6 +25,7 @@ extern "C" {
|
|||
#include "../config.h"
|
||||
#include "../platform/platform.h"
|
||||
#include "audio.h"
|
||||
#include "../localisation/localisation.h"
|
||||
}
|
||||
#include "mixer.h"
|
||||
|
||||
|
@ -44,33 +45,50 @@ Sample::~Sample()
|
|||
|
||||
bool Sample::Load(const char* filename)
|
||||
{
|
||||
log_verbose("Sample::Load(%s)", filename);
|
||||
|
||||
utf8 utf8filename[512];
|
||||
win1252_to_utf8(utf8filename, filename, sizeof(utf8filename));
|
||||
|
||||
Unload();
|
||||
SDL_RWops* rw = SDL_RWFromFile(filename, "rb");
|
||||
if (!rw) {
|
||||
SDL_RWclose(rw);
|
||||
SDL_RWops* rw = SDL_RWFromFile(utf8filename, "rb");
|
||||
if (rw == NULL) {
|
||||
log_verbose("Error loading %s", filename);
|
||||
return false;
|
||||
}
|
||||
|
||||
SDL_AudioSpec audiospec;
|
||||
memset(&audiospec, 0, sizeof(audiospec));
|
||||
SDL_AudioSpec* spec = SDL_LoadWAV_RW(rw, false, &audiospec, &data, (Uint32*)&length);
|
||||
SDL_RWclose(rw);
|
||||
|
||||
if (spec != NULL) {
|
||||
format.freq = spec->freq;
|
||||
format.format = spec->format;
|
||||
format.channels = spec->channels;
|
||||
issdlwav = true;
|
||||
} else {
|
||||
log_verbose("Error loading %s, unsupported WAV format", filename);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Sample::LoadCSS1(const char* filename, unsigned int offset)
|
||||
{
|
||||
log_verbose("Sample::LoadCSS1(%s, %d)", filename, offset);
|
||||
|
||||
utf8 utf8filename[512];
|
||||
win1252_to_utf8(utf8filename, filename, sizeof(utf8filename));
|
||||
|
||||
Unload();
|
||||
SDL_RWops* rw = SDL_RWFromFile(filename, "rb");
|
||||
if (!rw) {
|
||||
SDL_RWops* rw = SDL_RWFromFile(utf8filename, "rb");
|
||||
if (rw == NULL) {
|
||||
log_verbose("Unable to load %s", filename);
|
||||
return false;
|
||||
}
|
||||
|
||||
Uint32 numsounds;
|
||||
SDL_RWread(rw, &numsounds, sizeof(numsounds), 1);
|
||||
if (offset > numsounds) {
|
||||
|
|
|
@ -50,10 +50,6 @@ static const char *const usage[] = {
|
|||
*/
|
||||
int cmdline_run(const char **argv, int argc)
|
||||
{
|
||||
// For argparse's sake, add virtual first argument process path
|
||||
argc++;
|
||||
argv--;
|
||||
|
||||
//
|
||||
int version = 0, verbose = 0, width = 0, height = 0;
|
||||
|
||||
|
|
52
src/config.c
52
src/config.c
|
@ -22,7 +22,6 @@
|
|||
#include "addresses.h"
|
||||
#include "config.h"
|
||||
#include "localisation/localisation.h"
|
||||
#include "platform/osinterface.h"
|
||||
#include "platform/platform.h"
|
||||
|
||||
// Current keyboard shortcuts
|
||||
|
@ -88,10 +87,13 @@ general_configuration_t gGeneral_config_default = {
|
|||
0, // show_height_as_units
|
||||
1, // save_plugin_data
|
||||
0, // fullscreen mode (default: windowed)
|
||||
-1, // fullscreen_width
|
||||
-1, // fullscreen_height
|
||||
-1, // window_width
|
||||
-1, // window_height
|
||||
LANGUAGE_ENGLISH_UK, // language
|
||||
5 // window_snap_proximity
|
||||
5, // window_snap_proximity
|
||||
2 // title music
|
||||
};
|
||||
sound_configuration_t gSound_config;
|
||||
|
||||
|
@ -252,6 +254,11 @@ void config_write_ini_general(FILE *fp)
|
|||
else
|
||||
fprintf(fp, "fullscreen_mode = borderless_fullscreen\n");
|
||||
|
||||
if (gGeneral_config.fullscreen_width != -1)
|
||||
fprintf(fp, "fullscreen_width = %d\n", gGeneral_config.fullscreen_width);
|
||||
if (gGeneral_config.fullscreen_height != -1)
|
||||
fprintf(fp, "fullscreen_height = %d\n", gGeneral_config.fullscreen_height);
|
||||
|
||||
if (gGeneral_config.window_width != -1)
|
||||
fprintf(fp, "window_width = %d\n", gGeneral_config.window_width);
|
||||
if (gGeneral_config.window_height != -1)
|
||||
|
@ -260,6 +267,8 @@ void config_write_ini_general(FILE *fp)
|
|||
fprintf(fp, "language = %d\n", gGeneral_config.language);
|
||||
|
||||
fprintf(fp, "window_snap_proximity = %d\n", gGeneral_config.window_snap_proximity);
|
||||
|
||||
fprintf(fp, "title_music = %d\n", gGeneral_config.title_music);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -275,6 +284,9 @@ void config_apply_to_old_addresses()
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8) = gGeneral_config.construction_marker_colour;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8) = gSound_config.sound_quality;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, sint8) = gSound_config.forced_software_buffering;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (gGeneral_config.measurement_format + 1) * 256;
|
||||
if (gGeneral_config.show_height_as_units)
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = 0;
|
||||
|
||||
int configFlags = 0;
|
||||
if (gGeneral_config.always_show_gridlines)
|
||||
|
@ -296,7 +308,7 @@ void config_apply_to_old_addresses()
|
|||
*/
|
||||
void config_load()
|
||||
{
|
||||
char *path = osinterface_get_orct2_homefolder();
|
||||
char *path = platform_get_orct2_homefolder();
|
||||
FILE* fp;
|
||||
|
||||
memcpy(&gGeneral_config, &gGeneral_config_default, sizeof(general_configuration_t));
|
||||
|
@ -307,7 +319,7 @@ void config_load()
|
|||
return;
|
||||
}
|
||||
|
||||
sprintf(path, "%s%c%s", path, osinterface_get_path_separator(), "config.ini");
|
||||
sprintf(path, "%s%c%s", path, platform_get_path_separator(), "config.ini");
|
||||
|
||||
fp = fopen(path, "r");
|
||||
if (!fp) {
|
||||
|
@ -329,9 +341,9 @@ void config_load()
|
|||
|
||||
void config_save()
|
||||
{
|
||||
char *configIniPath = osinterface_get_orct2_homefolder();;
|
||||
char *configIniPath = platform_get_orct2_homefolder();;
|
||||
|
||||
sprintf(configIniPath, "%s%c%s", configIniPath, osinterface_get_path_separator(), "config.ini");
|
||||
sprintf(configIniPath, "%s%c%s", configIniPath, platform_get_path_separator(), "config.ini");
|
||||
config_save_ini(configIniPath);
|
||||
|
||||
config_apply_to_old_addresses();
|
||||
|
@ -374,8 +386,8 @@ int config_find_or_browse_install_directory()
|
|||
char *installPath;
|
||||
|
||||
if (!config_find_rct2_path(gGeneral_config.game_path)) {
|
||||
osinterface_show_messagebox("Unable to find RCT2 installation directory. Please select the directory where you installed RCT2!");
|
||||
installPath = osinterface_open_directory_browser("Please select your RCT2 directory");
|
||||
platform_show_messagebox("Unable to find RCT2 installation directory. Please select the directory where you installed RCT2!");
|
||||
installPath = platform_open_directory_browser("Please select your RCT2 directory");
|
||||
if (installPath == NULL)
|
||||
return 0;
|
||||
|
||||
|
@ -554,6 +566,12 @@ static void config_general(char *setting, char *value){
|
|||
else
|
||||
gGeneral_config.fullscreen_mode = 2;
|
||||
}
|
||||
else if (strcmp(setting, "fullscreen_width") == 0) {
|
||||
gGeneral_config.fullscreen_width = atoi(value);
|
||||
}
|
||||
else if (strcmp(setting, "fullscreen_height") == 0) {
|
||||
gGeneral_config.fullscreen_height = atoi(value);
|
||||
}
|
||||
else if (strcmp(setting, "window_width") == 0) {
|
||||
gGeneral_config.window_width = atoi(value);
|
||||
}
|
||||
|
@ -566,6 +584,9 @@ static void config_general(char *setting, char *value){
|
|||
else if (strcmp(setting, "window_snap_proximity") == 0) {
|
||||
gGeneral_config.window_snap_proximity = clamp(0, atoi(value), 255);
|
||||
}
|
||||
else if (strcmp(setting, "title_music") == 0) {
|
||||
gGeneral_config.title_music = atoi(value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -757,7 +778,7 @@ static int config_parse_currency(char *currency)
|
|||
*/
|
||||
static void config_error(char *msg){
|
||||
|
||||
osinterface_show_messagebox(msg);
|
||||
platform_show_messagebox(msg);
|
||||
//TODO:SHUT DOWN EVERYTHING!
|
||||
|
||||
}
|
||||
|
@ -835,28 +856,29 @@ void config_dat_load()
|
|||
// return;
|
||||
|
||||
|
||||
RCT2_GLOBAL(0x009AB4C6, sint8) = 1; // no idea on what this does
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG, sint8) = 1; // Marks config as first time loaded
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 2) * 256;
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS))
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256;
|
||||
RCT2_GLOBAL(0x009AA00D, sint8) = 0;
|
||||
// No longer used (controls first time object load)
|
||||
//RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, sint8) = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* TODO: CLEANUP
|
||||
|
||||
if (RCT2_GLOBAL(0x009AB4C6, sint8) == 1)
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG, sint8) == 1)
|
||||
return;
|
||||
RCT2_GLOBAL(0x009AB4C6, sint8) = 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG, sint8) = 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, sint8) = 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CURRENCY, sint8) = 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = 0;
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS))
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256;
|
||||
RCT2_GLOBAL(0x009AA00D, sint8) = 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, sint8) = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -875,7 +897,7 @@ void config_dat_load()
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = 0;
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS))
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256;
|
||||
RCT2_GLOBAL(0x009AA00D, sint8) = 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, sint8) = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -132,10 +132,13 @@ typedef struct general_configuration {
|
|||
|
||||
//new
|
||||
uint8 fullscreen_mode;
|
||||
sint16 fullscreen_width;
|
||||
sint16 fullscreen_height;
|
||||
sint16 window_width;
|
||||
sint16 window_height;
|
||||
uint16 language;
|
||||
uint8 window_snap_proximity;
|
||||
uint8 title_music;
|
||||
} general_configuration_t;
|
||||
|
||||
static const struct { const char *key; int value; } _currencyLookupTable[] = {
|
||||
|
|
|
@ -0,0 +1,533 @@
|
|||
/*****************************************************************************
|
||||
* Copyright (c) 2014 Ted John, Duncan Frost
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "cursors.h"
|
||||
|
||||
unsigned char blank_cursor_data[32 * 4] = {
|
||||
0
|
||||
};
|
||||
unsigned char blank_cursor_mask[32 * 4] = {
|
||||
0
|
||||
};
|
||||
|
||||
unsigned char up_arrow_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x04, 0x10, 0x00,
|
||||
0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x02, 0x20, 0x00,
|
||||
0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char up_arrow_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00,
|
||||
0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char up_down_arrow_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0xA0, 0x00,
|
||||
0x00, 0x05, 0x50, 0x00, 0x00, 0x0A, 0x28, 0x00, 0x00, 0x17, 0x74, 0x00, 0x00, 0x21, 0x42, 0x00,
|
||||
0x00, 0x1D, 0xDC, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00,
|
||||
0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x05, 0xD0, 0x00, 0x00, 0x1D, 0x5C, 0x00,
|
||||
0x00, 0x21, 0x42, 0x00, 0x00, 0x17, 0x74, 0x00, 0x00, 0x0A, 0x28, 0x00, 0x00, 0x05, 0x50, 0x00,
|
||||
0x00, 0x02, 0xA0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char up_down_arrow_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x00, 0x07, 0x70, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x3F, 0x7E, 0x00,
|
||||
0x00, 0x1F, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x1F, 0x7C, 0x00,
|
||||
0x00, 0x3F, 0x7E, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x07, 0x70, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
|
||||
unsigned char zzz_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C,
|
||||
0x00, 0x00, 0x03, 0xE2, 0x00, 0x00, 0xFC, 0x34, 0x00, 0x01, 0x07, 0x62, 0x00, 0x3F, 0xEA, 0xDC,
|
||||
0x00, 0x40, 0xD4, 0x20, 0x00, 0x3D, 0xBB, 0xC0, 0x3F, 0xCB, 0x04, 0x00, 0x40, 0x34, 0xF8, 0x00,
|
||||
0x40, 0x2F, 0x00, 0x00, 0x3C, 0x40, 0x80, 0x00, 0x08, 0xBF, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
|
||||
0x23, 0xC0, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char zzz_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C,
|
||||
0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x3F, 0xFB, 0xDC,
|
||||
0x00, 0x7F, 0xF7, 0xE0, 0x00, 0x3F, 0xFB, 0xC0, 0x3F, 0xCF, 0xFC, 0x00, 0x7F, 0xFC, 0xF8, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x0F, 0xBF, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00,
|
||||
0x3F, 0xC0, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char diagonal_arrow_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
|
||||
0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00,
|
||||
0x00, 0x1C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char diagonal_arrow_cursor_mask[32 * 4] = {
|
||||
0xFE, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00,
|
||||
0xFC, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
|
||||
0x01, 0xC2, 0x00, 0x00, 0x00, 0xE6, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00,
|
||||
0x00, 0x3E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char picker_cursor_data[32 * 4] = {
|
||||
0x00, 0x07, 0xC0, 0x00, 0x00, 0x08, 0x60, 0x00, 0x00, 0x13, 0x30, 0x00, 0x00, 0x17, 0xB0, 0x00,
|
||||
0x00, 0x17, 0xB0, 0x00, 0x00, 0x13, 0x30, 0x00, 0x00, 0x08, 0x60, 0x00, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x00, 0x17, 0x30, 0x00, 0x00, 0x12, 0x30, 0x00, 0x00, 0x21, 0x18, 0x00,
|
||||
0x00, 0x23, 0x18, 0x00, 0x00, 0x44, 0x8C, 0x00, 0x00, 0x44, 0x8C, 0x00, 0x00, 0x88, 0x46, 0x00,
|
||||
0x00, 0x90, 0x26, 0x00, 0x01, 0x10, 0x23, 0x00, 0x01, 0x20, 0x13, 0x00, 0x02, 0x40, 0x09, 0x80,
|
||||
0x02, 0x40, 0x09, 0x80, 0x04, 0x80, 0x04, 0xC0, 0x04, 0x80, 0x04, 0xC0, 0x04, 0x80, 0x04, 0xC0,
|
||||
0x04, 0x80, 0x04, 0xC0, 0x04, 0x80, 0x04, 0xC0, 0x04, 0x40, 0x08, 0xC0, 0x02, 0x40, 0x09, 0x80,
|
||||
0x01, 0x20, 0x13, 0x00, 0x00, 0x90, 0x26, 0x00, 0x00, 0x68, 0x5C, 0x00, 0x00, 0x1C, 0xF0, 0x00,
|
||||
};
|
||||
unsigned char picker_cursor_mask[32 * 4] = {
|
||||
0x00, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00,
|
||||
0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0xF8, 0x00,
|
||||
0x00, 0x3F, 0xF8, 0x00, 0x00, 0x7C, 0xFC, 0x00, 0x00, 0x7C, 0xFC, 0x00, 0x00, 0xF8, 0x7E, 0x00,
|
||||
0x00, 0xF0, 0x3E, 0x00, 0x01, 0xF0, 0x3F, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x03, 0xC0, 0x0F, 0x80,
|
||||
0x03, 0xC0, 0x0F, 0x80, 0x07, 0x80, 0x07, 0xC0, 0x07, 0x80, 0x07, 0xC0, 0x07, 0x80, 0x07, 0xC0,
|
||||
0x07, 0x80, 0x07, 0xC0, 0x07, 0x80, 0x07, 0xC0, 0x07, 0xC0, 0x0F, 0xC0, 0x03, 0xC0, 0x0F, 0x80,
|
||||
0x01, 0xE0, 0x1F, 0x00, 0x00, 0xF0, 0x3E, 0x00, 0x00, 0x78, 0x7C, 0x00, 0x00, 0x1C, 0xF0, 0x00,
|
||||
};
|
||||
|
||||
unsigned char tree_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0x89, 0xC0, 0x00, 0x02, 0x06, 0x20,
|
||||
0x00, 0x07, 0x00, 0x18, 0x00, 0x07, 0x40, 0x04, 0x00, 0x03, 0x80, 0x04, 0x00, 0x01, 0xC0, 0x02,
|
||||
0x00, 0x03, 0x82, 0x02, 0x00, 0x03, 0xD0, 0x04, 0x00, 0x07, 0xF9, 0x08, 0x00, 0x0F, 0x6E, 0x04,
|
||||
0x00, 0x0E, 0xB8, 0x82, 0x00, 0x0F, 0x44, 0x22, 0x00, 0x0F, 0xA8, 0x46, 0x00, 0x0F, 0xFC, 0x16,
|
||||
0x00, 0x07, 0xEE, 0x8C, 0x0F, 0x81, 0xFF, 0xD8, 0x08, 0x80, 0x7D, 0xF0, 0x08, 0x80, 0x3A, 0x00,
|
||||
0x08, 0x80, 0x1A, 0x00, 0x08, 0x80, 0x1A, 0x00, 0x08, 0x80, 0x12, 0x00, 0x08, 0x80, 0x12, 0x00,
|
||||
0x08, 0x80, 0x11, 0x00, 0xF8, 0xF8, 0x60, 0x80, 0x40, 0x11, 0x80, 0x60, 0x20, 0x22, 0x09, 0x90,
|
||||
0x10, 0x41, 0xD5, 0x60, 0x08, 0x80, 0x22, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char tree_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0xF9, 0xC0, 0x00, 0x03, 0xFF, 0xE0,
|
||||
0x00, 0x07, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFE,
|
||||
0x00, 0x03, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC,
|
||||
0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFE,
|
||||
0x00, 0x07, 0xFF, 0xFC, 0x0F, 0x81, 0xFF, 0xF8, 0x0F, 0x80, 0x7F, 0xF0, 0x0F, 0x80, 0x3E, 0x00,
|
||||
0x0F, 0x80, 0x1E, 0x00, 0x0F, 0x80, 0x1E, 0x00, 0x0F, 0x80, 0x1E, 0x00, 0x0F, 0x80, 0x1E, 0x00,
|
||||
0x0F, 0x80, 0x1F, 0x00, 0xFF, 0xF8, 0x7F, 0x80, 0x7F, 0xF1, 0xFF, 0xE0, 0x3F, 0xE3, 0xFF, 0xF0,
|
||||
0x1F, 0xC1, 0xF7, 0x60, 0x0F, 0x80, 0x22, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char fountain_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00,
|
||||
0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x01, 0x8B, 0x30, 0x00, 0x02, 0x17, 0xC8,
|
||||
0x00, 0x02, 0x0F, 0x88, 0x0F, 0x83, 0x80, 0x38, 0x08, 0x82, 0x7F, 0xD8, 0x08, 0x81, 0x01, 0xF0,
|
||||
0x08, 0x80, 0xE3, 0xE0, 0x08, 0x80, 0x3F, 0x80, 0x08, 0x80, 0x17, 0x00, 0x08, 0x80, 0x13, 0x00,
|
||||
0x08, 0x80, 0x13, 0x00, 0xF8, 0xF8, 0x27, 0x80, 0x40, 0x10, 0x4E, 0xC0, 0x20, 0x20, 0x80, 0xE0,
|
||||
0x10, 0x40, 0xC1, 0xA0, 0x08, 0x80, 0x7F, 0xC0, 0x05, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char fountain_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x01, 0x04, 0x00, 0x00, 0x10, 0x10, 0x81, 0x00, 0x00, 0x41, 0x14, 0x00, 0x05, 0x08, 0x20,
|
||||
0x00, 0x00, 0x22, 0x81, 0x00, 0x00, 0x88, 0x10, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x02, 0x00,
|
||||
0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00,
|
||||
0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0xF8,
|
||||
0x00, 0x03, 0xFF, 0xF8, 0x0F, 0x83, 0xFF, 0xF8, 0x0F, 0x83, 0xFF, 0xF8, 0x0F, 0x81, 0xFF, 0xF0,
|
||||
0x0F, 0x80, 0xFF, 0xE0, 0x0F, 0x80, 0x3F, 0x80, 0x0F, 0x80, 0x1F, 0x00, 0x0F, 0x80, 0x1F, 0x00,
|
||||
0x0F, 0x80, 0x1F, 0x00, 0xFF, 0xF8, 0x3F, 0x80, 0x7F, 0xF0, 0x7F, 0xC0, 0x3F, 0xE0, 0xFF, 0xE0,
|
||||
0x1F, 0xC0, 0xFF, 0xE0, 0x0F, 0x80, 0x7F, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char statue_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x07, 0x03, 0x30,
|
||||
0x00, 0x02, 0x84, 0x98, 0x00, 0x01, 0x44, 0x98, 0x00, 0x00, 0xB5, 0xA8, 0x00, 0x00, 0x4A, 0xD0,
|
||||
0x00, 0x00, 0x21, 0x20, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x10, 0x80,
|
||||
0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00,
|
||||
0x00, 0x00, 0x05, 0x00, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x04, 0x80, 0x08, 0x80, 0x05, 0x00,
|
||||
0x08, 0x80, 0x0D, 0x00, 0x08, 0x80, 0x09, 0x00, 0x08, 0x80, 0x3F, 0x80, 0x08, 0x80, 0x20, 0x80,
|
||||
0x08, 0x80, 0x20, 0x80, 0xF8, 0xF8, 0x20, 0x80, 0x40, 0x10, 0x20, 0x80, 0x20, 0x20, 0x20, 0x80,
|
||||
0x10, 0x40, 0x7F, 0xC0, 0x08, 0x80, 0x80, 0x20, 0x05, 0x00, 0xFF, 0xE0, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char statue_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x07, 0x03, 0x30,
|
||||
0x00, 0x03, 0x87, 0x98, 0x00, 0x01, 0xC7, 0x98, 0x00, 0x00, 0xF7, 0xB8, 0x00, 0x00, 0x7E, 0xF0,
|
||||
0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x1F, 0x80,
|
||||
0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00,
|
||||
0x00, 0x00, 0x07, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x07, 0x80, 0x0F, 0x80, 0x07, 0x00,
|
||||
0x0F, 0x80, 0x0F, 0x00, 0x0F, 0x80, 0x0F, 0x00, 0x0F, 0x80, 0x3F, 0x80, 0x0F, 0x80, 0x3F, 0x80,
|
||||
0x0F, 0x80, 0x3F, 0x80, 0xFF, 0xF8, 0x3F, 0x80, 0x7F, 0xF0, 0x3F, 0x80, 0x3F, 0xE0, 0x3F, 0x80,
|
||||
0x1F, 0xC0, 0x7F, 0xC0, 0x0F, 0x80, 0xFF, 0xE0, 0x07, 0x00, 0xFF, 0xE0, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char bench_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x80, 0x00,
|
||||
0x00, 0x04, 0x60, 0x00, 0x00, 0x04, 0x18, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x05, 0x81, 0x80,
|
||||
0x00, 0x05, 0x60, 0x60, 0x00, 0x0D, 0x18, 0x18, 0x00, 0x33, 0x06, 0x04, 0x00, 0xC0, 0xC1, 0x84,
|
||||
0x00, 0xF0, 0x30, 0x64, 0x00, 0xAC, 0x0C, 0x1C, 0x00, 0xA7, 0x03, 0x14, 0x00, 0x40, 0xC0, 0xD4,
|
||||
0x00, 0x00, 0xF0, 0x34, 0x0F, 0x80, 0xAC, 0x0C, 0x08, 0x80, 0xA3, 0x3C, 0x08, 0x80, 0x41, 0xD4,
|
||||
0x08, 0x80, 0x01, 0xD4, 0x08, 0x80, 0x01, 0x48, 0x08, 0x80, 0x01, 0x40, 0x08, 0x80, 0x00, 0x80,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char bench_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00,
|
||||
0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0x80,
|
||||
0x00, 0x07, 0x7F, 0xE0, 0x00, 0x0F, 0x1F, 0xF8, 0x00, 0x3F, 0x07, 0xFC, 0x00, 0xFF, 0xC1, 0xFC,
|
||||
0x00, 0xFF, 0xF0, 0x7C, 0x00, 0xEF, 0xFC, 0x1C, 0x00, 0xE7, 0xFF, 0x1C, 0x00, 0x40, 0xFF, 0xDC,
|
||||
0x00, 0x00, 0xFF, 0xFC, 0x0F, 0x80, 0xEF, 0xFC, 0x0F, 0x80, 0xE3, 0xFC, 0x0F, 0x80, 0x41, 0xDC,
|
||||
0x0F, 0x80, 0x01, 0xDC, 0x0F, 0x80, 0x01, 0xC8, 0x0F, 0x80, 0x01, 0xC0, 0x0F, 0x80, 0x00, 0x80,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char cross_hair_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE2, 0x3F, 0x80,
|
||||
0x10, 0x15, 0x40, 0x40, 0x0F, 0xE2, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char cross_hair_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE2, 0x3F, 0x80,
|
||||
0x1F, 0xF7, 0x7F, 0xC0, 0x0F, 0xE2, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char bin_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x22, 0x00,
|
||||
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xC3, 0x80, 0x00, 0x01, 0x00, 0xC0, 0x00, 0x02, 0x57, 0xE0,
|
||||
0x00, 0x02, 0x00, 0x60, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x01, 0x01, 0xC0, 0x00, 0x01, 0x40, 0xC0,
|
||||
0x00, 0x01, 0x50, 0xC0, 0x0F, 0x81, 0x50, 0x40, 0x08, 0x81, 0x51, 0x40, 0x08, 0x81, 0x51, 0x40,
|
||||
0x08, 0x81, 0x55, 0x40, 0x08, 0x81, 0x55, 0x40, 0x08, 0x81, 0x55, 0x40, 0x08, 0x81, 0x55, 0x40,
|
||||
0x08, 0x81, 0x55, 0x40, 0xF8, 0xF9, 0x55, 0x40, 0x40, 0x11, 0x55, 0x40, 0x20, 0x21, 0xFF, 0xC0,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char bin_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x22, 0x00,
|
||||
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xE0,
|
||||
0x00, 0x03, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xC0,
|
||||
0x00, 0x01, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0,
|
||||
0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0,
|
||||
0x0F, 0x81, 0xFF, 0xC0, 0xFF, 0xF9, 0xFF, 0xC0, 0x7F, 0xF1, 0xFF, 0xC0, 0x3F, 0xE1, 0xFF, 0xC0,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char lamppost_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0xFF, 0x80,
|
||||
0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x32, 0x00,
|
||||
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x94, 0x80,
|
||||
0x00, 0x01, 0xF7, 0xC0, 0x00, 0x00, 0x94, 0x80, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00,
|
||||
0x00, 0x00, 0x14, 0x00, 0x0F, 0x80, 0x14, 0x00, 0x08, 0x80, 0x14, 0x00, 0x08, 0x80, 0x14, 0x00,
|
||||
0x08, 0x80, 0x14, 0x00, 0x08, 0x80, 0x14, 0x00, 0x08, 0x80, 0x14, 0x00, 0x08, 0x80, 0x1C, 0x00,
|
||||
0x08, 0x80, 0x1C, 0x00, 0xF8, 0xF8, 0x32, 0x00, 0x40, 0x10, 0x61, 0x00, 0x20, 0x20, 0x61, 0x00,
|
||||
0x10, 0x40, 0x71, 0x00, 0x08, 0x80, 0x7D, 0x00, 0x05, 0x00, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char lamppost_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x80,
|
||||
0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x3E, 0x00,
|
||||
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x9C, 0x80,
|
||||
0x00, 0x01, 0xFF, 0xC0, 0x00, 0x00, 0x9C, 0x80, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00,
|
||||
0x00, 0x00, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00,
|
||||
0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00,
|
||||
0x0F, 0x80, 0x1C, 0x00, 0xFF, 0xF8, 0x3E, 0x00, 0x7F, 0xF0, 0x7F, 0x00, 0x3F, 0xE0, 0x7F, 0x00,
|
||||
0x1F, 0xC0, 0x7F, 0x00, 0x0F, 0x80, 0x7F, 0x00, 0x07, 0x00, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char fence_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x4E, 0x60, 0x00, 0x00,
|
||||
0x43, 0xB0, 0x00, 0x00, 0x20, 0xB1, 0x80, 0x00, 0x2C, 0x3A, 0xC0, 0x00, 0x2F, 0x0E, 0xC6, 0x00,
|
||||
0x2C, 0x82, 0xCB, 0x00, 0x2C, 0xB0, 0x6B, 0x18, 0x6C, 0xBC, 0x1B, 0x2C, 0x7C, 0xB2, 0x83, 0x2C,
|
||||
0x1E, 0xB2, 0xE1, 0xAC, 0x07, 0xB2, 0xD8, 0x6C, 0x01, 0xF2, 0xCA, 0x0C, 0x00, 0x7A, 0xCB, 0x86,
|
||||
0x00, 0x1E, 0xCB, 0x66, 0x0F, 0x87, 0xCB, 0x2E, 0x08, 0x81, 0xEB, 0x2C, 0x08, 0x80, 0x7B, 0x2C,
|
||||
0x08, 0x80, 0x1F, 0x2C, 0x08, 0x80, 0x07, 0xAC, 0x08, 0x80, 0x01, 0xEC, 0x08, 0x80, 0x00, 0x78,
|
||||
0x08, 0x80, 0x00, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char fence_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x7E, 0x60, 0x00, 0x00,
|
||||
0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xF1, 0x80, 0x00, 0x3F, 0xFB, 0xC0, 0x00, 0x3F, 0xFF, 0xC6, 0x00,
|
||||
0x3C, 0xFF, 0xCF, 0x00, 0x3C, 0xFF, 0xEF, 0x18, 0x7C, 0xFF, 0xFF, 0x3C, 0x7C, 0xF3, 0xFF, 0x3C,
|
||||
0x1E, 0xF3, 0xFF, 0xBC, 0x07, 0xF3, 0xDF, 0xFC, 0x01, 0xF3, 0xCF, 0xFC, 0x00, 0x7B, 0xCF, 0xFE,
|
||||
0x00, 0x1F, 0xCF, 0x7E, 0x0F, 0x87, 0xCF, 0x3E, 0x0F, 0x81, 0xEF, 0x3C, 0x0F, 0x80, 0x7F, 0x3C,
|
||||
0x0F, 0x80, 0x1F, 0x3C, 0x0F, 0x80, 0x07, 0xBC, 0x0F, 0x80, 0x01, 0xFC, 0x0F, 0x80, 0x00, 0x78,
|
||||
0x0F, 0x80, 0x00, 0x18, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char flower_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x18, 0x44, 0x30,
|
||||
0x00, 0x24, 0x54, 0x48, 0x00, 0x22, 0x54, 0x88, 0x00, 0x11, 0x55, 0x10, 0x00, 0x0A, 0xBA, 0xA0,
|
||||
0x00, 0x05, 0xBB, 0x40, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x7C, 0x92, 0x7C, 0x00, 0x83, 0x47, 0x82,
|
||||
0x01, 0x1D, 0x89, 0xF1, 0x00, 0x83, 0x23, 0x82, 0x00, 0x7C, 0x8A, 0x7C, 0x00, 0x03, 0xE7, 0x80,
|
||||
0x00, 0x05, 0xBB, 0x40, 0x0F, 0x8A, 0xBA, 0xA0, 0x08, 0x91, 0x55, 0x10, 0x08, 0x92, 0x54, 0x90,
|
||||
0x08, 0x8C, 0x44, 0x6C, 0x08, 0x98, 0x44, 0x32, 0x08, 0xA6, 0x44, 0x42, 0x08, 0xA1, 0x28, 0x82,
|
||||
0x08, 0xA0, 0xB9, 0x24, 0xF8, 0xFA, 0xBA, 0x44, 0x40, 0x11, 0x6A, 0x88, 0x20, 0x28, 0xED, 0x10,
|
||||
0x10, 0x46, 0x4A, 0x60, 0x08, 0x81, 0x81, 0x80, 0x05, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char flower_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x18, 0x7C, 0x30,
|
||||
0x00, 0x3C, 0x7C, 0x78, 0x00, 0x3E, 0x7C, 0xF8, 0x00, 0x1F, 0x7D, 0xF0, 0x00, 0x0F, 0xBB, 0xE0,
|
||||
0x00, 0x07, 0xBB, 0xC0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7C, 0xFE, 0x7C, 0x00, 0xFF, 0xFF, 0xFE,
|
||||
0x01, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7C, 0xFE, 0x7C, 0x00, 0x03, 0xFF, 0x80,
|
||||
0x00, 0x07, 0xBB, 0xC0, 0x0F, 0x8F, 0xBB, 0xE0, 0x0F, 0x9F, 0x7D, 0xF0, 0x0F, 0x9E, 0x7C, 0xF0,
|
||||
0x0F, 0x8C, 0x7C, 0x6C, 0x0F, 0x98, 0x7C, 0x3E, 0x0F, 0xBE, 0x7C, 0x7E, 0x0F, 0xBF, 0x38, 0xFE,
|
||||
0x0F, 0xBF, 0xB9, 0xFC, 0xFF, 0xFF, 0xBB, 0xFC, 0x7F, 0xFF, 0xFB, 0xF8, 0x3F, 0xEF, 0xFF, 0xF0,
|
||||
0x1F, 0xC7, 0xFF, 0xE0, 0x0F, 0x81, 0xFF, 0x80, 0x07, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char path_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x01, 0x85, 0x80, 0x00,
|
||||
0x06, 0x48, 0x60, 0x00, 0x1A, 0x24, 0x58, 0x00, 0x62, 0x3A, 0x46, 0x00, 0x79, 0xC1, 0x45, 0x80,
|
||||
0x1E, 0x27, 0xFC, 0x60, 0x07, 0x98, 0x82, 0x58, 0x01, 0xE0, 0x82, 0x46, 0x00, 0x79, 0x45, 0x79,
|
||||
0x00, 0x1E, 0x28, 0x87, 0x0F, 0x87, 0x94, 0x9E, 0x08, 0x81, 0xE2, 0x78, 0x08, 0x80, 0x79, 0xE0,
|
||||
0x08, 0x80, 0x1F, 0x80, 0x08, 0x80, 0x06, 0x00, 0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char path_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,
|
||||
0x07, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0x80,
|
||||
0x1F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF,
|
||||
0x00, 0x1F, 0xFF, 0xFF, 0x0F, 0x87, 0xFF, 0xFE, 0x0F, 0x81, 0xFF, 0xF8, 0x0F, 0x80, 0x7F, 0xE0,
|
||||
0x0F, 0x80, 0x1F, 0x80, 0x0F, 0x80, 0x06, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char dig_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0xA4,
|
||||
0x00, 0x00, 0x01, 0x52, 0x00, 0x00, 0x02, 0x8B, 0x00, 0x00, 0x02, 0x96, 0x00, 0x00, 0x02, 0x6C,
|
||||
0x00, 0x00, 0x04, 0x18, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x00, 0x11, 0x80, 0x00, 0x03, 0x2A, 0x00,
|
||||
0x00, 0x04, 0xC6, 0x00, 0x00, 0x09, 0x8C, 0x00, 0x00, 0x15, 0x18, 0x00, 0x00, 0x22, 0x30, 0x00,
|
||||
0x00, 0x24, 0x78, 0x00, 0x0F, 0xC5, 0xE4, 0x00, 0x08, 0xC7, 0xC4, 0x00, 0x08, 0xC3, 0x28, 0x00,
|
||||
0x08, 0xA0, 0x10, 0x00, 0x08, 0x90, 0x20, 0x00, 0x08, 0x88, 0xC0, 0x00, 0x08, 0x87, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char dig_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xFC,
|
||||
0x00, 0x00, 0x01, 0xDE, 0x00, 0x00, 0x03, 0x8F, 0x00, 0x00, 0x03, 0x9E, 0x00, 0x00, 0x03, 0xFC,
|
||||
0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0x3E, 0x00,
|
||||
0x00, 0x07, 0xFE, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x3F, 0xF0, 0x00,
|
||||
0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF8, 0x00,
|
||||
0x0F, 0xBF, 0xF0, 0x00, 0x0F, 0x9F, 0xE0, 0x00, 0x0F, 0x8F, 0xC0, 0x00, 0x0F, 0x87, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char water_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x82, 0x00,
|
||||
0x08, 0x20, 0x82, 0x00, 0x14, 0x51, 0x45, 0x00, 0x63, 0x8E, 0x38, 0xC0, 0x88, 0x20, 0x82, 0x20,
|
||||
0x77, 0xDF, 0x7D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x82, 0x08, 0x00, 0x20, 0x82, 0x08,
|
||||
0x00, 0x51, 0x45, 0x14, 0x00, 0x8E, 0x38, 0xE2, 0x0F, 0xA0, 0x82, 0x09, 0x08, 0xDF, 0x7D, 0xF6,
|
||||
0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x82, 0x00, 0x08, 0x80, 0x82, 0x00, 0x08, 0x81, 0x45, 0x00,
|
||||
0x08, 0x86, 0x38, 0xC0, 0xF8, 0xF8, 0x82, 0x20, 0x40, 0x17, 0x7D, 0xC0, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char water_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x82, 0x00,
|
||||
0x08, 0x20, 0x82, 0x00, 0x1C, 0x71, 0xC7, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xE0,
|
||||
0x77, 0xDF, 0x7D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x82, 0x08, 0x00, 0x20, 0x82, 0x08,
|
||||
0x00, 0x71, 0xC7, 0x1C, 0x00, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0x0F, 0xDF, 0x7D, 0xF6,
|
||||
0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x82, 0x00, 0x0F, 0x80, 0x82, 0x00, 0x0F, 0x81, 0xC7, 0x00,
|
||||
0x0F, 0x87, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0xF7, 0x7D, 0xC0, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char house_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xF0, 0x00, 0x00, 0x2A, 0x10,
|
||||
0x00, 0x00, 0x45, 0xE0, 0x00, 0x00, 0x93, 0x20, 0x00, 0x01, 0x19, 0x20, 0x00, 0x02, 0x0C, 0x20,
|
||||
0x00, 0x04, 0x7E, 0x20, 0x00, 0x08, 0x03, 0x20, 0x00, 0x10, 0xFF, 0x90, 0x00, 0x20, 0x00, 0xC8,
|
||||
0x00, 0x47, 0xFF, 0xE4, 0x00, 0xF0, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
|
||||
0x00, 0x11, 0xEF, 0xD0, 0x00, 0x11, 0x28, 0x50, 0x0F, 0x91, 0x28, 0x50, 0x08, 0x91, 0x28, 0x50,
|
||||
0x08, 0x91, 0x2F, 0xD0, 0x08, 0x91, 0x20, 0x10, 0x08, 0x91, 0x20, 0x10, 0x08, 0x9F, 0xFF, 0xF0,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char house_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xF0, 0x00, 0x00, 0x3B, 0xF0,
|
||||
0x00, 0x00, 0x7D, 0xE0, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xE0,
|
||||
0x00, 0x07, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xF8,
|
||||
0x00, 0x7F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xF0,
|
||||
0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x1F, 0x38, 0x70, 0x0F, 0x9F, 0x38, 0x70, 0x0F, 0x9F, 0x38, 0x70,
|
||||
0x0F, 0x9F, 0x3F, 0xF0, 0x0F, 0x9F, 0x3F, 0xF0, 0x0F, 0x9F, 0x3F, 0xF0, 0x0F, 0x9F, 0xFF, 0xF0,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char volcano_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x08, 0xA0, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00,
|
||||
0x00, 0x07, 0xB0, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x17, 0x84, 0x00, 0x00, 0x30, 0x1E, 0x00,
|
||||
0x00, 0x76, 0x72, 0x00, 0x00, 0x5A, 0x89, 0x00, 0x00, 0x81, 0x1C, 0x80, 0x03, 0x08, 0x0A, 0x70,
|
||||
0x04, 0x18, 0x17, 0x88, 0x18, 0x30, 0x0A, 0xA6, 0x23, 0xC2, 0x07, 0x7F, 0x7C, 0x5F, 0x8F, 0xEC,
|
||||
0x40, 0xF0, 0xD8, 0xC0, 0x00, 0x40, 0x20, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char volcano_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x08, 0xA0, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00,
|
||||
0x00, 0x07, 0xB0, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00,
|
||||
0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xF0,
|
||||
0x07, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0x7C, 0x7F, 0xFF, 0xEC,
|
||||
0x40, 0xF0, 0xF8, 0xC0, 0x00, 0x40, 0x20, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char walk_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00,
|
||||
0x02, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00,
|
||||
0x00, 0x12, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x1C, 0x00,
|
||||
0x02, 0x20, 0x22, 0x00, 0x02, 0x10, 0x21, 0x00, 0x01, 0x08, 0x10, 0x80, 0x00, 0x88, 0x08, 0x80,
|
||||
0x00, 0x72, 0x07, 0x20, 0x00, 0x0D, 0x00, 0xD0, 0x0F, 0x89, 0x00, 0x90, 0x08, 0x86, 0x00, 0x60,
|
||||
0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x0E, 0x00, 0x08, 0x80, 0x11, 0x00, 0x08, 0x80, 0x10, 0x80,
|
||||
0x08, 0x80, 0x08, 0x40, 0xF8, 0xF8, 0x04, 0x40, 0x40, 0x10, 0x03, 0x90, 0x20, 0x20, 0x00, 0x68,
|
||||
0x10, 0x40, 0x00, 0x48, 0x08, 0x80, 0x00, 0x30, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char walk_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00,
|
||||
0x03, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00,
|
||||
0x00, 0x1E, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x1C, 0x00,
|
||||
0x03, 0xE0, 0x3E, 0x00, 0x03, 0xF0, 0x3F, 0x00, 0x01, 0xF8, 0x1F, 0x80, 0x00, 0xF8, 0x0F, 0x80,
|
||||
0x00, 0x72, 0x07, 0x20, 0x00, 0x0F, 0x00, 0xF0, 0x0F, 0x8F, 0x00, 0xF0, 0x0F, 0x86, 0x00, 0x60,
|
||||
0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x0E, 0x00, 0x0F, 0x80, 0x1F, 0x00, 0x0F, 0x80, 0x1F, 0x80,
|
||||
0x0F, 0x80, 0x0F, 0xC0, 0xFF, 0xF8, 0x07, 0xC0, 0x7F, 0xF0, 0x03, 0x90, 0x3F, 0xE0, 0x00, 0x78,
|
||||
0x1F, 0xC0, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x30, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char paint_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFA,
|
||||
0x00, 0x00, 0x01, 0xF6, 0x00, 0x00, 0x03, 0xE4, 0x00, 0x03, 0x07, 0xCC, 0x00, 0x07, 0x84, 0x98,
|
||||
0x00, 0x0F, 0xC8, 0x70, 0x00, 0x1B, 0xF8, 0x60, 0x00, 0x3D, 0xE0, 0xC0, 0x00, 0x7E, 0xE3, 0x00,
|
||||
0x00, 0xFF, 0x62, 0x00, 0x00, 0xDF, 0xBE, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x00, 0x37, 0xEF, 0x80,
|
||||
0x00, 0x1B, 0xF7, 0xC0, 0x07, 0xCF, 0xFB, 0xC0, 0x04, 0x46, 0x9D, 0xC0, 0x04, 0x43, 0x07, 0x80,
|
||||
0x04, 0x41, 0x83, 0x00, 0x04, 0x40, 0xC6, 0x00, 0x04, 0x40, 0x6C, 0x00, 0x04, 0x40, 0x28, 0x00,
|
||||
0x7C, 0x7C, 0x10, 0x00, 0x20, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00,
|
||||
0x04, 0x40, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char paint_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFE,
|
||||
0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x03, 0x07, 0xFC, 0x00, 0x07, 0x87, 0xF8,
|
||||
0x00, 0x0F, 0xCF, 0xF0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x80,
|
||||
0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xCF, 0xFF, 0xC0, 0x07, 0xC7, 0xFF, 0xC0, 0x07, 0xC3, 0xFF, 0x80,
|
||||
0x07, 0xC1, 0xFF, 0x00, 0x07, 0xC0, 0xFE, 0x00, 0x07, 0xC0, 0x7C, 0x00, 0x07, 0xC0, 0x38, 0x00,
|
||||
0x7F, 0xFC, 0x10, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00,
|
||||
0x07, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char entrance_down_cursor_data[32 * 4] = {
|
||||
0x20, 0x00, 0x00, 0x08, 0x50, 0x00, 0x00, 0x14, 0x88, 0x00, 0x00, 0x22, 0x50, 0x00, 0x00, 0x14,
|
||||
0x7F, 0xFF, 0xFF, 0xFC, 0x58, 0x00, 0x00, 0x34, 0x54, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x54,
|
||||
0x54, 0x00, 0x00, 0x54, 0x5C, 0x00, 0x00, 0x34, 0x5F, 0xFF, 0xFF, 0xF4, 0x50, 0x00, 0x00, 0x14,
|
||||
0x50, 0x00, 0x00, 0x14, 0x50, 0x00, 0x00, 0x14, 0x50, 0x00, 0x00, 0x14, 0x50, 0x00, 0x00, 0x14,
|
||||
0x50, 0x00, 0x00, 0x14, 0x5F, 0x80, 0x00, 0x14, 0xD8, 0x80, 0x00, 0x14, 0x58, 0x80, 0x02, 0xB5,
|
||||
0x58, 0x80, 0x00, 0x14, 0xD8, 0x80, 0x00, 0x14, 0x58, 0x80, 0x05, 0x74, 0x08, 0x80, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0xD2, 0xF8, 0xF8, 0x0E, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char entrance_down_cursor_mask[32 * 4] = {
|
||||
0x20, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x1C, 0xF8, 0x00, 0x00, 0x3E, 0x70, 0x00, 0x00, 0x1C,
|
||||
0x7F, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x77, 0xFF, 0xFF, 0xDC, 0x77, 0xFF, 0xFF, 0xDC,
|
||||
0x77, 0xFF, 0xFF, 0xDC, 0x7F, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x70, 0x00, 0x00, 0x1C,
|
||||
0x70, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x00, 0x1C,
|
||||
0x70, 0x00, 0x00, 0x1C, 0x7F, 0x80, 0x00, 0x1C, 0xFF, 0x80, 0x00, 0x1C, 0x7F, 0x80, 0x02, 0xBD,
|
||||
0x7F, 0x80, 0x00, 0x1C, 0xFF, 0x80, 0x00, 0x1C, 0x7F, 0x80, 0x05, 0x7C, 0x0F, 0x80, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0xD2, 0xFF, 0xF8, 0x0E, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
unsigned char hand_open_cursor_data[32 * 4] = {
|
||||
0x00, 0x06, 0x10, 0x00, 0x00, 0x09, 0x38, 0x00, 0x00, 0x09, 0x24, 0x00, 0x03, 0x08, 0xA4, 0x00,
|
||||
0x04, 0x88, 0xA4, 0xC0, 0x04, 0x48, 0x63, 0x20, 0x04, 0x24, 0x63, 0x10, 0x06, 0x24, 0x61, 0x90,
|
||||
0x02, 0x14, 0x21, 0x90, 0x03, 0x0C, 0x21, 0x10, 0x01, 0x04, 0x21, 0x10, 0x01, 0x86, 0x01, 0x10,
|
||||
0x00, 0x82, 0x00, 0x08, 0x00, 0xC0, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08,
|
||||
0x00, 0x30, 0x00, 0x08, 0x00, 0x30, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08,
|
||||
0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x00, 0x10,
|
||||
0x0F, 0xC0, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x12, 0x00, 0x00, 0x08,
|
||||
0x0F, 0x0F, 0x00, 0x04, 0x01, 0xF9, 0x80, 0x04, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x00, 0x7F, 0xE0,
|
||||
};
|
||||
unsigned char hand_open_cursor_mask[32 * 4] = {
|
||||
0x00, 0x06, 0x10, 0x00, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x0F, 0x3C, 0x00, 0x03, 0x0F, 0xBC, 0x00,
|
||||
0x07, 0x8F, 0xBC, 0xC0, 0x07, 0xCF, 0xFF, 0xE0, 0x07, 0xE7, 0xFF, 0xF0, 0x07, 0xE7, 0xFF, 0xF0,
|
||||
0x03, 0xF7, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xF0,
|
||||
0x00, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF8,
|
||||
0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF8,
|
||||
0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xF0,
|
||||
0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xF8,
|
||||
0x0F, 0xFF, 0xFF, 0xFC, 0x01, 0xF9, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xE0,
|
||||
};
|
||||
|
||||
unsigned char hand_closed_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xE0, 0x00, 0x00, 0x43, 0x10, 0x00, 0x00, 0x41, 0x8C, 0x00,
|
||||
0x00, 0x20, 0x87, 0x00, 0x0E, 0x20, 0x42, 0x80, 0x11, 0x98, 0x62, 0x40, 0x10, 0x6C, 0x61, 0x20,
|
||||
0x18, 0x14, 0x21, 0x20, 0x0C, 0x0C, 0x21, 0x10, 0x06, 0x04, 0x21, 0x10, 0x03, 0x06, 0x01, 0x10,
|
||||
0x00, 0x82, 0x00, 0x08, 0x00, 0xC0, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08,
|
||||
0x00, 0x30, 0x00, 0x08, 0x00, 0x30, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08,
|
||||
0x07, 0x10, 0x00, 0x10, 0x08, 0x90, 0x00, 0x10, 0x08, 0x60, 0x00, 0x10, 0x0A, 0x00, 0x00, 0x10,
|
||||
0x0A, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x08, 0x03, 0x80, 0x00, 0x08,
|
||||
0x00, 0x7F, 0x00, 0x04, 0x00, 0x01, 0x80, 0x04, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x00, 0x7F, 0xE0,
|
||||
};
|
||||
unsigned char hand_closed_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xE0, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x7F, 0xFC, 0x00,
|
||||
0x00, 0x3F, 0xFF, 0x00, 0x0E, 0x3F, 0xFF, 0x80, 0x1F, 0x9F, 0xFF, 0xC0, 0x1F, 0xEF, 0xFF, 0xE0,
|
||||
0x1F, 0xF7, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xF0,
|
||||
0x00, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF8,
|
||||
0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF8,
|
||||
0x07, 0x1F, 0xFF, 0xF0, 0x0F, 0x9F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF0,
|
||||
0x0F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xF8,
|
||||
0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xE0,
|
||||
};
|
567
src/cursors.h
567
src/cursors.h
|
@ -21,571 +21,164 @@
|
|||
#ifndef _CURSORS_H_
|
||||
#define _CURSORS_H_
|
||||
|
||||
#define NO_CURSORS 27
|
||||
enum {
|
||||
CURSOR_ARROW = 0,
|
||||
CURSOR_BLANK = 1,
|
||||
CURSOR_UP_ARROW = 2,
|
||||
CURSOR_UP_DOWN_ARROW = 3,
|
||||
CURSOR_HAND_POINT = 4,
|
||||
CURSOR_ZZZ = 5,
|
||||
CURSOR_DIAGONAL_ARROWS = 6,
|
||||
CURSOR_PICKER = 7,
|
||||
CURSOR_TREE_DOWN = 8,
|
||||
CURSOR_FOUNTAIN_DOWN = 9,
|
||||
CURSOR_STATUE_DOWN = 10,
|
||||
CURSOR_BENCH_DOWN = 11,
|
||||
CURSOR_CROSS_HAIR = 12,
|
||||
CURSOR_BIN_DOWN = 13,
|
||||
CURSOR_LAMPPOST_DOWN = 14,
|
||||
CURSOR_FENCE_DOWN = 15,
|
||||
CURSOR_FLOWER_DOWN = 16,
|
||||
CURSOR_PATH_DOWN = 17,
|
||||
CURSOR_DIG_DOWN = 18,
|
||||
CURSOR_WATER_DOWN = 19,
|
||||
CURSOR_HOUSE_DOWN = 20,
|
||||
CURSOR_VOLCANO_DOWN = 21,
|
||||
CURSOR_WALK_DOWN = 22,
|
||||
CURSOR_PAINT_DOWN = 23,
|
||||
CURSOR_ENTRANCE_DOWN = 24,
|
||||
CURSOR_HAND_OPEN = 25,
|
||||
CURSOR_HAND_CLOSED = 26,
|
||||
CURSOR_COUNT
|
||||
};
|
||||
|
||||
unsigned char blank_cursor_data[32 * 4] = {
|
||||
0
|
||||
};
|
||||
unsigned char blank_cursor_mask[32 * 4] = {
|
||||
0
|
||||
};
|
||||
extern unsigned char blank_cursor_data[32 * 4];
|
||||
extern unsigned char blank_cursor_mask[32 * 4];
|
||||
|
||||
#define BLANK_CURSOR_HOTX 0
|
||||
#define BLANK_CURSOR_HOTY 0
|
||||
|
||||
unsigned char up_arrow_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x04, 0x10, 0x00,
|
||||
0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x02, 0x20, 0x00,
|
||||
0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char up_arrow_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00,
|
||||
0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char up_arrow_cursor_data[32 * 4];
|
||||
extern unsigned char up_arrow_cursor_mask[32 * 4];
|
||||
|
||||
#define UP_ARROW_CURSOR_HOTX 15
|
||||
#define UP_ARROW_CURSOR_HOTY 0
|
||||
|
||||
unsigned char up_down_arrow_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0xA0, 0x00,
|
||||
0x00, 0x05, 0x50, 0x00, 0x00, 0x0A, 0x28, 0x00, 0x00, 0x17, 0x74, 0x00, 0x00, 0x21, 0x42, 0x00,
|
||||
0x00, 0x1D, 0xDC, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00,
|
||||
0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x05, 0xD0, 0x00, 0x00, 0x1D, 0x5C, 0x00,
|
||||
0x00, 0x21, 0x42, 0x00, 0x00, 0x17, 0x74, 0x00, 0x00, 0x0A, 0x28, 0x00, 0x00, 0x05, 0x50, 0x00,
|
||||
0x00, 0x02, 0xA0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char up_down_arrow_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x00, 0x07, 0x70, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x3F, 0x7E, 0x00,
|
||||
0x00, 0x1F, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x1F, 0x7C, 0x00,
|
||||
0x00, 0x3F, 0x7E, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x07, 0x70, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char up_down_arrow_cursor_data[32 * 4];
|
||||
extern unsigned char up_down_arrow_cursor_mask[32 * 4];
|
||||
|
||||
#define UP_DOWN_ARROW_CURSOR_HOTX 7
|
||||
#define UP_DOWN_ARROW_CURSOR_HOTY 31
|
||||
|
||||
unsigned char zzz_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C,
|
||||
0x00, 0x00, 0x03, 0xE2, 0x00, 0x00, 0xFC, 0x34, 0x00, 0x01, 0x07, 0x62, 0x00, 0x3F, 0xEA, 0xDC,
|
||||
0x00, 0x40, 0xD4, 0x20, 0x00, 0x3D, 0xBB, 0xC0, 0x3F, 0xCB, 0x04, 0x00, 0x40, 0x34, 0xF8, 0x00,
|
||||
0x40, 0x2F, 0x00, 0x00, 0x3C, 0x40, 0x80, 0x00, 0x08, 0xBF, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
|
||||
0x23, 0xC0, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char zzz_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C,
|
||||
0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x3F, 0xFB, 0xDC,
|
||||
0x00, 0x7F, 0xF7, 0xE0, 0x00, 0x3F, 0xFB, 0xC0, 0x3F, 0xCF, 0xFC, 0x00, 0x7F, 0xFC, 0xF8, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x0F, 0xBF, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00,
|
||||
0x3F, 0xC0, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char zzz_cursor_data[32 * 4];
|
||||
extern unsigned char zzz_cursor_mask[32 * 4];
|
||||
#define ZZZ_CURSOR_HOTX 0
|
||||
#define ZZZ_CURSOR_HOTY 0
|
||||
|
||||
unsigned char diagonal_arrow_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
|
||||
0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00,
|
||||
0x00, 0x1C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char diagonal_arrow_cursor_mask[32 * 4] = {
|
||||
0xFE, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00,
|
||||
0xFC, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
|
||||
0x01, 0xC2, 0x00, 0x00, 0x00, 0xE6, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00,
|
||||
0x00, 0x3E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char diagonal_arrow_cursor_data[32 * 4];
|
||||
extern unsigned char diagonal_arrow_cursor_mask[32 * 4];
|
||||
#define DIAGONAL_ARROW_CURSOR_HOTX 0
|
||||
#define DIAGONAL_ARROW_CURSOR_HOTY 0
|
||||
|
||||
unsigned char picker_cursor_data[32 * 4] = {
|
||||
0x00, 0x07, 0xC0, 0x00, 0x00, 0x08, 0x60, 0x00, 0x00, 0x13, 0x30, 0x00, 0x00, 0x17, 0xB0, 0x00,
|
||||
0x00, 0x17, 0xB0, 0x00, 0x00, 0x13, 0x30, 0x00, 0x00, 0x08, 0x60, 0x00, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x00, 0x17, 0x30, 0x00, 0x00, 0x12, 0x30, 0x00, 0x00, 0x21, 0x18, 0x00,
|
||||
0x00, 0x23, 0x18, 0x00, 0x00, 0x44, 0x8C, 0x00, 0x00, 0x44, 0x8C, 0x00, 0x00, 0x88, 0x46, 0x00,
|
||||
0x00, 0x90, 0x26, 0x00, 0x01, 0x10, 0x23, 0x00, 0x01, 0x20, 0x13, 0x00, 0x02, 0x40, 0x09, 0x80,
|
||||
0x02, 0x40, 0x09, 0x80, 0x04, 0x80, 0x04, 0xC0, 0x04, 0x80, 0x04, 0xC0, 0x04, 0x80, 0x04, 0xC0,
|
||||
0x04, 0x80, 0x04, 0xC0, 0x04, 0x80, 0x04, 0xC0, 0x04, 0x40, 0x08, 0xC0, 0x02, 0x40, 0x09, 0x80,
|
||||
0x01, 0x20, 0x13, 0x00, 0x00, 0x90, 0x26, 0x00, 0x00, 0x68, 0x5C, 0x00, 0x00, 0x1C, 0xF0, 0x00,
|
||||
};
|
||||
unsigned char picker_cursor_mask[32 * 4] = {
|
||||
0x00, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00,
|
||||
0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0xF8, 0x00,
|
||||
0x00, 0x3F, 0xF8, 0x00, 0x00, 0x7C, 0xFC, 0x00, 0x00, 0x7C, 0xFC, 0x00, 0x00, 0xF8, 0x7E, 0x00,
|
||||
0x00, 0xF0, 0x3E, 0x00, 0x01, 0xF0, 0x3F, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x03, 0xC0, 0x0F, 0x80,
|
||||
0x03, 0xC0, 0x0F, 0x80, 0x07, 0x80, 0x07, 0xC0, 0x07, 0x80, 0x07, 0xC0, 0x07, 0x80, 0x07, 0xC0,
|
||||
0x07, 0x80, 0x07, 0xC0, 0x07, 0x80, 0x07, 0xC0, 0x07, 0xC0, 0x0F, 0xC0, 0x03, 0xC0, 0x0F, 0x80,
|
||||
0x01, 0xE0, 0x1F, 0x00, 0x00, 0xF0, 0x3E, 0x00, 0x00, 0x78, 0x7C, 0x00, 0x00, 0x1C, 0xF0, 0x00,
|
||||
};
|
||||
extern unsigned char picker_cursor_data[32 * 4];
|
||||
extern unsigned char picker_cursor_mask[32 * 4];
|
||||
#define PICKER_CURSOR_HOTX 15
|
||||
#define PICKER_CURSOR_HOTY 31
|
||||
|
||||
unsigned char tree_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0x89, 0xC0, 0x00, 0x02, 0x06, 0x20,
|
||||
0x00, 0x07, 0x00, 0x18, 0x00, 0x07, 0x40, 0x04, 0x00, 0x03, 0x80, 0x04, 0x00, 0x01, 0xC0, 0x02,
|
||||
0x00, 0x03, 0x82, 0x02, 0x00, 0x03, 0xD0, 0x04, 0x00, 0x07, 0xF9, 0x08, 0x00, 0x0F, 0x6E, 0x04,
|
||||
0x00, 0x0E, 0xB8, 0x82, 0x00, 0x0F, 0x44, 0x22, 0x00, 0x0F, 0xA8, 0x46, 0x00, 0x0F, 0xFC, 0x16,
|
||||
0x00, 0x07, 0xEE, 0x8C, 0x0F, 0x81, 0xFF, 0xD8, 0x08, 0x80, 0x7D, 0xF0, 0x08, 0x80, 0x3A, 0x00,
|
||||
0x08, 0x80, 0x1A, 0x00, 0x08, 0x80, 0x1A, 0x00, 0x08, 0x80, 0x12, 0x00, 0x08, 0x80, 0x12, 0x00,
|
||||
0x08, 0x80, 0x11, 0x00, 0xF8, 0xF8, 0x60, 0x80, 0x40, 0x11, 0x80, 0x60, 0x20, 0x22, 0x09, 0x90,
|
||||
0x10, 0x41, 0xD5, 0x60, 0x08, 0x80, 0x22, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char tree_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0xF9, 0xC0, 0x00, 0x03, 0xFF, 0xE0,
|
||||
0x00, 0x07, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFE,
|
||||
0x00, 0x03, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC,
|
||||
0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFE,
|
||||
0x00, 0x07, 0xFF, 0xFC, 0x0F, 0x81, 0xFF, 0xF8, 0x0F, 0x80, 0x7F, 0xF0, 0x0F, 0x80, 0x3E, 0x00,
|
||||
0x0F, 0x80, 0x1E, 0x00, 0x0F, 0x80, 0x1E, 0x00, 0x0F, 0x80, 0x1E, 0x00, 0x0F, 0x80, 0x1E, 0x00,
|
||||
0x0F, 0x80, 0x1F, 0x00, 0xFF, 0xF8, 0x7F, 0x80, 0x7F, 0xF1, 0xFF, 0xE0, 0x3F, 0xE3, 0xFF, 0xF0,
|
||||
0x1F, 0xC1, 0xF7, 0x60, 0x0F, 0x80, 0x22, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char tree_down_cursor_data[32 * 4];
|
||||
extern unsigned char tree_down_cursor_mask[32 * 4];
|
||||
#define TREE_DOWN_CURSOR_HOTX 7
|
||||
#define TREE_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char fountain_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00,
|
||||
0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x01, 0x8B, 0x30, 0x00, 0x02, 0x17, 0xC8,
|
||||
0x00, 0x02, 0x0F, 0x88, 0x0F, 0x83, 0x80, 0x38, 0x08, 0x82, 0x7F, 0xD8, 0x08, 0x81, 0x01, 0xF0,
|
||||
0x08, 0x80, 0xE3, 0xE0, 0x08, 0x80, 0x3F, 0x80, 0x08, 0x80, 0x17, 0x00, 0x08, 0x80, 0x13, 0x00,
|
||||
0x08, 0x80, 0x13, 0x00, 0xF8, 0xF8, 0x27, 0x80, 0x40, 0x10, 0x4E, 0xC0, 0x20, 0x20, 0x80, 0xE0,
|
||||
0x10, 0x40, 0xC1, 0xA0, 0x08, 0x80, 0x7F, 0xC0, 0x05, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char fountain_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x01, 0x04, 0x00, 0x00, 0x10, 0x10, 0x81, 0x00, 0x00, 0x41, 0x14, 0x00, 0x05, 0x08, 0x20,
|
||||
0x00, 0x00, 0x22, 0x81, 0x00, 0x00, 0x88, 0x10, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x02, 0x00,
|
||||
0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00,
|
||||
0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0xF8,
|
||||
0x00, 0x03, 0xFF, 0xF8, 0x0F, 0x83, 0xFF, 0xF8, 0x0F, 0x83, 0xFF, 0xF8, 0x0F, 0x81, 0xFF, 0xF0,
|
||||
0x0F, 0x80, 0xFF, 0xE0, 0x0F, 0x80, 0x3F, 0x80, 0x0F, 0x80, 0x1F, 0x00, 0x0F, 0x80, 0x1F, 0x00,
|
||||
0x0F, 0x80, 0x1F, 0x00, 0xFF, 0xF8, 0x3F, 0x80, 0x7F, 0xF0, 0x7F, 0xC0, 0x3F, 0xE0, 0xFF, 0xE0,
|
||||
0x1F, 0xC0, 0xFF, 0xE0, 0x0F, 0x80, 0x7F, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char fountain_down_cursor_data[32 * 4];
|
||||
extern unsigned char fountain_down_cursor_mask[32 * 4];
|
||||
#define FOUNTAIN_DOWN_CURSOR_HOTX 7
|
||||
#define FOUNTAIN_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char statue_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x07, 0x03, 0x30,
|
||||
0x00, 0x02, 0x84, 0x98, 0x00, 0x01, 0x44, 0x98, 0x00, 0x00, 0xB5, 0xA8, 0x00, 0x00, 0x4A, 0xD0,
|
||||
0x00, 0x00, 0x21, 0x20, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x10, 0x80,
|
||||
0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00,
|
||||
0x00, 0x00, 0x05, 0x00, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x04, 0x80, 0x08, 0x80, 0x05, 0x00,
|
||||
0x08, 0x80, 0x0D, 0x00, 0x08, 0x80, 0x09, 0x00, 0x08, 0x80, 0x3F, 0x80, 0x08, 0x80, 0x20, 0x80,
|
||||
0x08, 0x80, 0x20, 0x80, 0xF8, 0xF8, 0x20, 0x80, 0x40, 0x10, 0x20, 0x80, 0x20, 0x20, 0x20, 0x80,
|
||||
0x10, 0x40, 0x7F, 0xC0, 0x08, 0x80, 0x80, 0x20, 0x05, 0x00, 0xFF, 0xE0, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char statue_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x07, 0x03, 0x30,
|
||||
0x00, 0x03, 0x87, 0x98, 0x00, 0x01, 0xC7, 0x98, 0x00, 0x00, 0xF7, 0xB8, 0x00, 0x00, 0x7E, 0xF0,
|
||||
0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x1F, 0x80,
|
||||
0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00,
|
||||
0x00, 0x00, 0x07, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x07, 0x80, 0x0F, 0x80, 0x07, 0x00,
|
||||
0x0F, 0x80, 0x0F, 0x00, 0x0F, 0x80, 0x0F, 0x00, 0x0F, 0x80, 0x3F, 0x80, 0x0F, 0x80, 0x3F, 0x80,
|
||||
0x0F, 0x80, 0x3F, 0x80, 0xFF, 0xF8, 0x3F, 0x80, 0x7F, 0xF0, 0x3F, 0x80, 0x3F, 0xE0, 0x3F, 0x80,
|
||||
0x1F, 0xC0, 0x7F, 0xC0, 0x0F, 0x80, 0xFF, 0xE0, 0x07, 0x00, 0xFF, 0xE0, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char statue_down_cursor_data[32 * 4];
|
||||
extern unsigned char statue_down_cursor_mask[32 * 4];
|
||||
#define STATUE_DOWN_CURSOR_HOTX 7
|
||||
#define STATUE_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char bench_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x80, 0x00,
|
||||
0x00, 0x04, 0x60, 0x00, 0x00, 0x04, 0x18, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x05, 0x81, 0x80,
|
||||
0x00, 0x05, 0x60, 0x60, 0x00, 0x0D, 0x18, 0x18, 0x00, 0x33, 0x06, 0x04, 0x00, 0xC0, 0xC1, 0x84,
|
||||
0x00, 0xF0, 0x30, 0x64, 0x00, 0xAC, 0x0C, 0x1C, 0x00, 0xA7, 0x03, 0x14, 0x00, 0x40, 0xC0, 0xD4,
|
||||
0x00, 0x00, 0xF0, 0x34, 0x0F, 0x80, 0xAC, 0x0C, 0x08, 0x80, 0xA3, 0x3C, 0x08, 0x80, 0x41, 0xD4,
|
||||
0x08, 0x80, 0x01, 0xD4, 0x08, 0x80, 0x01, 0x48, 0x08, 0x80, 0x01, 0x40, 0x08, 0x80, 0x00, 0x80,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char bench_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00,
|
||||
0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0x80,
|
||||
0x00, 0x07, 0x7F, 0xE0, 0x00, 0x0F, 0x1F, 0xF8, 0x00, 0x3F, 0x07, 0xFC, 0x00, 0xFF, 0xC1, 0xFC,
|
||||
0x00, 0xFF, 0xF0, 0x7C, 0x00, 0xEF, 0xFC, 0x1C, 0x00, 0xE7, 0xFF, 0x1C, 0x00, 0x40, 0xFF, 0xDC,
|
||||
0x00, 0x00, 0xFF, 0xFC, 0x0F, 0x80, 0xEF, 0xFC, 0x0F, 0x80, 0xE3, 0xFC, 0x0F, 0x80, 0x41, 0xDC,
|
||||
0x0F, 0x80, 0x01, 0xDC, 0x0F, 0x80, 0x01, 0xC8, 0x0F, 0x80, 0x01, 0xC0, 0x0F, 0x80, 0x00, 0x80,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char bench_down_cursor_data[32 * 4];
|
||||
extern unsigned char bench_down_cursor_mask[32 * 4];
|
||||
#define BENCH_DOWN_CURSOR_HOTX 7
|
||||
#define BENCH_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char cross_hair_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE2, 0x3F, 0x80,
|
||||
0x10, 0x15, 0x40, 0x40, 0x0F, 0xE2, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
|
||||
0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char cross_hair_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE2, 0x3F, 0x80,
|
||||
0x1F, 0xF7, 0x7F, 0xC0, 0x0F, 0xE2, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char cross_hair_cursor_data[32 * 4];
|
||||
extern unsigned char cross_hair_cursor_mask[32 * 4];
|
||||
#define CROSS_HAIR_CURSOR_HOTX 15
|
||||
#define CROSS_HAIR_CURSOR_HOTY 15
|
||||
|
||||
unsigned char bin_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x22, 0x00,
|
||||
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xC3, 0x80, 0x00, 0x01, 0x00, 0xC0, 0x00, 0x02, 0x57, 0xE0,
|
||||
0x00, 0x02, 0x00, 0x60, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x01, 0x01, 0xC0, 0x00, 0x01, 0x40, 0xC0,
|
||||
0x00, 0x01, 0x50, 0xC0, 0x0F, 0x81, 0x50, 0x40, 0x08, 0x81, 0x51, 0x40, 0x08, 0x81, 0x51, 0x40,
|
||||
0x08, 0x81, 0x55, 0x40, 0x08, 0x81, 0x55, 0x40, 0x08, 0x81, 0x55, 0x40, 0x08, 0x81, 0x55, 0x40,
|
||||
0x08, 0x81, 0x55, 0x40, 0xF8, 0xF9, 0x55, 0x40, 0x40, 0x11, 0x55, 0x40, 0x20, 0x21, 0xFF, 0xC0,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char bin_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x22, 0x00,
|
||||
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xE0,
|
||||
0x00, 0x03, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xC0,
|
||||
0x00, 0x01, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0,
|
||||
0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0xC0,
|
||||
0x0F, 0x81, 0xFF, 0xC0, 0xFF, 0xF9, 0xFF, 0xC0, 0x7F, 0xF1, 0xFF, 0xC0, 0x3F, 0xE1, 0xFF, 0xC0,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char bin_down_cursor_data[32 * 4];
|
||||
extern unsigned char bin_down_cursor_mask[32 * 4];
|
||||
#define BIN_DOWN_CURSOR_HOTX 7
|
||||
#define BIN_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char lamppost_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0xFF, 0x80,
|
||||
0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x32, 0x00,
|
||||
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x94, 0x80,
|
||||
0x00, 0x01, 0xF7, 0xC0, 0x00, 0x00, 0x94, 0x80, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00,
|
||||
0x00, 0x00, 0x14, 0x00, 0x0F, 0x80, 0x14, 0x00, 0x08, 0x80, 0x14, 0x00, 0x08, 0x80, 0x14, 0x00,
|
||||
0x08, 0x80, 0x14, 0x00, 0x08, 0x80, 0x14, 0x00, 0x08, 0x80, 0x14, 0x00, 0x08, 0x80, 0x1C, 0x00,
|
||||
0x08, 0x80, 0x1C, 0x00, 0xF8, 0xF8, 0x32, 0x00, 0x40, 0x10, 0x61, 0x00, 0x20, 0x20, 0x61, 0x00,
|
||||
0x10, 0x40, 0x71, 0x00, 0x08, 0x80, 0x7D, 0x00, 0x05, 0x00, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char lamppost_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x80,
|
||||
0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x3E, 0x00,
|
||||
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x9C, 0x80,
|
||||
0x00, 0x01, 0xFF, 0xC0, 0x00, 0x00, 0x9C, 0x80, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00,
|
||||
0x00, 0x00, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00,
|
||||
0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x1C, 0x00,
|
||||
0x0F, 0x80, 0x1C, 0x00, 0xFF, 0xF8, 0x3E, 0x00, 0x7F, 0xF0, 0x7F, 0x00, 0x3F, 0xE0, 0x7F, 0x00,
|
||||
0x1F, 0xC0, 0x7F, 0x00, 0x0F, 0x80, 0x7F, 0x00, 0x07, 0x00, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char lamppost_down_cursor_data[32 * 4];
|
||||
extern unsigned char lamppost_down_cursor_mask[32 * 4];
|
||||
#define LAMPPOST_DOWN_CURSOR_HOTX 7
|
||||
#define LAMPPOST_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char fence_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x4E, 0x60, 0x00, 0x00,
|
||||
0x43, 0xB0, 0x00, 0x00, 0x20, 0xB1, 0x80, 0x00, 0x2C, 0x3A, 0xC0, 0x00, 0x2F, 0x0E, 0xC6, 0x00,
|
||||
0x2C, 0x82, 0xCB, 0x00, 0x2C, 0xB0, 0x6B, 0x18, 0x6C, 0xBC, 0x1B, 0x2C, 0x7C, 0xB2, 0x83, 0x2C,
|
||||
0x1E, 0xB2, 0xE1, 0xAC, 0x07, 0xB2, 0xD8, 0x6C, 0x01, 0xF2, 0xCA, 0x0C, 0x00, 0x7A, 0xCB, 0x86,
|
||||
0x00, 0x1E, 0xCB, 0x66, 0x0F, 0x87, 0xCB, 0x2E, 0x08, 0x81, 0xEB, 0x2C, 0x08, 0x80, 0x7B, 0x2C,
|
||||
0x08, 0x80, 0x1F, 0x2C, 0x08, 0x80, 0x07, 0xAC, 0x08, 0x80, 0x01, 0xEC, 0x08, 0x80, 0x00, 0x78,
|
||||
0x08, 0x80, 0x00, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char fence_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x7E, 0x60, 0x00, 0x00,
|
||||
0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xF1, 0x80, 0x00, 0x3F, 0xFB, 0xC0, 0x00, 0x3F, 0xFF, 0xC6, 0x00,
|
||||
0x3C, 0xFF, 0xCF, 0x00, 0x3C, 0xFF, 0xEF, 0x18, 0x7C, 0xFF, 0xFF, 0x3C, 0x7C, 0xF3, 0xFF, 0x3C,
|
||||
0x1E, 0xF3, 0xFF, 0xBC, 0x07, 0xF3, 0xDF, 0xFC, 0x01, 0xF3, 0xCF, 0xFC, 0x00, 0x7B, 0xCF, 0xFE,
|
||||
0x00, 0x1F, 0xCF, 0x7E, 0x0F, 0x87, 0xCF, 0x3E, 0x0F, 0x81, 0xEF, 0x3C, 0x0F, 0x80, 0x7F, 0x3C,
|
||||
0x0F, 0x80, 0x1F, 0x3C, 0x0F, 0x80, 0x07, 0xBC, 0x0F, 0x80, 0x01, 0xFC, 0x0F, 0x80, 0x00, 0x78,
|
||||
0x0F, 0x80, 0x00, 0x18, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char fence_down_cursor_data[32 * 4];
|
||||
extern unsigned char fence_down_cursor_mask[32 * 4];
|
||||
#define FENCE_DOWN_CURSOR_HOTX 7
|
||||
#define FENCE_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char flower_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x18, 0x44, 0x30,
|
||||
0x00, 0x24, 0x54, 0x48, 0x00, 0x22, 0x54, 0x88, 0x00, 0x11, 0x55, 0x10, 0x00, 0x0A, 0xBA, 0xA0,
|
||||
0x00, 0x05, 0xBB, 0x40, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x7C, 0x92, 0x7C, 0x00, 0x83, 0x47, 0x82,
|
||||
0x01, 0x1D, 0x89, 0xF1, 0x00, 0x83, 0x23, 0x82, 0x00, 0x7C, 0x8A, 0x7C, 0x00, 0x03, 0xE7, 0x80,
|
||||
0x00, 0x05, 0xBB, 0x40, 0x0F, 0x8A, 0xBA, 0xA0, 0x08, 0x91, 0x55, 0x10, 0x08, 0x92, 0x54, 0x90,
|
||||
0x08, 0x8C, 0x44, 0x6C, 0x08, 0x98, 0x44, 0x32, 0x08, 0xA6, 0x44, 0x42, 0x08, 0xA1, 0x28, 0x82,
|
||||
0x08, 0xA0, 0xB9, 0x24, 0xF8, 0xFA, 0xBA, 0x44, 0x40, 0x11, 0x6A, 0x88, 0x20, 0x28, 0xED, 0x10,
|
||||
0x10, 0x46, 0x4A, 0x60, 0x08, 0x81, 0x81, 0x80, 0x05, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char flower_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x18, 0x7C, 0x30,
|
||||
0x00, 0x3C, 0x7C, 0x78, 0x00, 0x3E, 0x7C, 0xF8, 0x00, 0x1F, 0x7D, 0xF0, 0x00, 0x0F, 0xBB, 0xE0,
|
||||
0x00, 0x07, 0xBB, 0xC0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7C, 0xFE, 0x7C, 0x00, 0xFF, 0xFF, 0xFE,
|
||||
0x01, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7C, 0xFE, 0x7C, 0x00, 0x03, 0xFF, 0x80,
|
||||
0x00, 0x07, 0xBB, 0xC0, 0x0F, 0x8F, 0xBB, 0xE0, 0x0F, 0x9F, 0x7D, 0xF0, 0x0F, 0x9E, 0x7C, 0xF0,
|
||||
0x0F, 0x8C, 0x7C, 0x6C, 0x0F, 0x98, 0x7C, 0x3E, 0x0F, 0xBE, 0x7C, 0x7E, 0x0F, 0xBF, 0x38, 0xFE,
|
||||
0x0F, 0xBF, 0xB9, 0xFC, 0xFF, 0xFF, 0xBB, 0xFC, 0x7F, 0xFF, 0xFB, 0xF8, 0x3F, 0xEF, 0xFF, 0xF0,
|
||||
0x1F, 0xC7, 0xFF, 0xE0, 0x0F, 0x81, 0xFF, 0x80, 0x07, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char flower_down_cursor_data[32 * 4];
|
||||
extern unsigned char flower_down_cursor_mask[32 * 4];
|
||||
|
||||
#define FLOWER_DOWN_CURSOR_HOTX 7
|
||||
#define FLOWER_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char path_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x01, 0x85, 0x80, 0x00,
|
||||
0x06, 0x48, 0x60, 0x00, 0x1A, 0x24, 0x58, 0x00, 0x62, 0x3A, 0x46, 0x00, 0x79, 0xC1, 0x45, 0x80,
|
||||
0x1E, 0x27, 0xFC, 0x60, 0x07, 0x98, 0x82, 0x58, 0x01, 0xE0, 0x82, 0x46, 0x00, 0x79, 0x45, 0x79,
|
||||
0x00, 0x1E, 0x28, 0x87, 0x0F, 0x87, 0x94, 0x9E, 0x08, 0x81, 0xE2, 0x78, 0x08, 0x80, 0x79, 0xE0,
|
||||
0x08, 0x80, 0x1F, 0x80, 0x08, 0x80, 0x06, 0x00, 0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char path_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,
|
||||
0x07, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0x80,
|
||||
0x1F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF,
|
||||
0x00, 0x1F, 0xFF, 0xFF, 0x0F, 0x87, 0xFF, 0xFE, 0x0F, 0x81, 0xFF, 0xF8, 0x0F, 0x80, 0x7F, 0xE0,
|
||||
0x0F, 0x80, 0x1F, 0x80, 0x0F, 0x80, 0x06, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char path_down_cursor_data[32 * 4];
|
||||
extern unsigned char path_down_cursor_mask[32 * 4];
|
||||
#define PATH_DOWN_CURSOR_HOTX 7
|
||||
#define PATH_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char dig_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0xA4,
|
||||
0x00, 0x00, 0x01, 0x52, 0x00, 0x00, 0x02, 0x8B, 0x00, 0x00, 0x02, 0x96, 0x00, 0x00, 0x02, 0x6C,
|
||||
0x00, 0x00, 0x04, 0x18, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x00, 0x11, 0x80, 0x00, 0x03, 0x2A, 0x00,
|
||||
0x00, 0x04, 0xC6, 0x00, 0x00, 0x09, 0x8C, 0x00, 0x00, 0x15, 0x18, 0x00, 0x00, 0x22, 0x30, 0x00,
|
||||
0x00, 0x24, 0x78, 0x00, 0x0F, 0xC5, 0xE4, 0x00, 0x08, 0xC7, 0xC4, 0x00, 0x08, 0xC3, 0x28, 0x00,
|
||||
0x08, 0xA0, 0x10, 0x00, 0x08, 0x90, 0x20, 0x00, 0x08, 0x88, 0xC0, 0x00, 0x08, 0x87, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char dig_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xFC,
|
||||
0x00, 0x00, 0x01, 0xDE, 0x00, 0x00, 0x03, 0x8F, 0x00, 0x00, 0x03, 0x9E, 0x00, 0x00, 0x03, 0xFC,
|
||||
0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0x3E, 0x00,
|
||||
0x00, 0x07, 0xFE, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x3F, 0xF0, 0x00,
|
||||
0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF8, 0x00,
|
||||
0x0F, 0xBF, 0xF0, 0x00, 0x0F, 0x9F, 0xE0, 0x00, 0x0F, 0x8F, 0xC0, 0x00, 0x0F, 0x87, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char dig_down_cursor_data[32 * 4];
|
||||
extern unsigned char dig_down_cursor_mask[32 * 4];
|
||||
|
||||
#define DIG_DOWN_CURSOR_HOTX 7
|
||||
#define DIG_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char water_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x82, 0x00,
|
||||
0x08, 0x20, 0x82, 0x00, 0x14, 0x51, 0x45, 0x00, 0x63, 0x8E, 0x38, 0xC0, 0x88, 0x20, 0x82, 0x20,
|
||||
0x77, 0xDF, 0x7D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x82, 0x08, 0x00, 0x20, 0x82, 0x08,
|
||||
0x00, 0x51, 0x45, 0x14, 0x00, 0x8E, 0x38, 0xE2, 0x0F, 0xA0, 0x82, 0x09, 0x08, 0xDF, 0x7D, 0xF6,
|
||||
0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x82, 0x00, 0x08, 0x80, 0x82, 0x00, 0x08, 0x81, 0x45, 0x00,
|
||||
0x08, 0x86, 0x38, 0xC0, 0xF8, 0xF8, 0x82, 0x20, 0x40, 0x17, 0x7D, 0xC0, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char water_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x82, 0x00,
|
||||
0x08, 0x20, 0x82, 0x00, 0x1C, 0x71, 0xC7, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xE0,
|
||||
0x77, 0xDF, 0x7D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x82, 0x08, 0x00, 0x20, 0x82, 0x08,
|
||||
0x00, 0x71, 0xC7, 0x1C, 0x00, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0x0F, 0xDF, 0x7D, 0xF6,
|
||||
0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x82, 0x00, 0x0F, 0x80, 0x82, 0x00, 0x0F, 0x81, 0xC7, 0x00,
|
||||
0x0F, 0x87, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0xF7, 0x7D, 0xC0, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char water_down_cursor_data[32 * 4];
|
||||
extern unsigned char water_down_cursor_mask[32 * 4];
|
||||
#define WATER_DOWN_CURSOR_HOTX 7
|
||||
#define WATER_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char house_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xF0, 0x00, 0x00, 0x2A, 0x10,
|
||||
0x00, 0x00, 0x45, 0xE0, 0x00, 0x00, 0x93, 0x20, 0x00, 0x01, 0x19, 0x20, 0x00, 0x02, 0x0C, 0x20,
|
||||
0x00, 0x04, 0x7E, 0x20, 0x00, 0x08, 0x03, 0x20, 0x00, 0x10, 0xFF, 0x90, 0x00, 0x20, 0x00, 0xC8,
|
||||
0x00, 0x47, 0xFF, 0xE4, 0x00, 0xF0, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
|
||||
0x00, 0x11, 0xEF, 0xD0, 0x00, 0x11, 0x28, 0x50, 0x0F, 0x91, 0x28, 0x50, 0x08, 0x91, 0x28, 0x50,
|
||||
0x08, 0x91, 0x2F, 0xD0, 0x08, 0x91, 0x20, 0x10, 0x08, 0x91, 0x20, 0x10, 0x08, 0x9F, 0xFF, 0xF0,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char house_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xF0, 0x00, 0x00, 0x3B, 0xF0,
|
||||
0x00, 0x00, 0x7D, 0xE0, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xE0,
|
||||
0x00, 0x07, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xF8,
|
||||
0x00, 0x7F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xF0,
|
||||
0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x1F, 0x38, 0x70, 0x0F, 0x9F, 0x38, 0x70, 0x0F, 0x9F, 0x38, 0x70,
|
||||
0x0F, 0x9F, 0x3F, 0xF0, 0x0F, 0x9F, 0x3F, 0xF0, 0x0F, 0x9F, 0x3F, 0xF0, 0x0F, 0x9F, 0xFF, 0xF0,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char house_down_cursor_data[32 * 4];
|
||||
extern unsigned char house_down_cursor_mask[32 * 4];
|
||||
#define HOUSE_DOWN_CURSOR_HOTX 7
|
||||
#define HOUSE_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char volcano_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x08, 0xA0, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00,
|
||||
0x00, 0x07, 0xB0, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x17, 0x84, 0x00, 0x00, 0x30, 0x1E, 0x00,
|
||||
0x00, 0x76, 0x72, 0x00, 0x00, 0x5A, 0x89, 0x00, 0x00, 0x81, 0x1C, 0x80, 0x03, 0x08, 0x0A, 0x70,
|
||||
0x04, 0x18, 0x17, 0x88, 0x18, 0x30, 0x0A, 0xA6, 0x23, 0xC2, 0x07, 0x7F, 0x7C, 0x5F, 0x8F, 0xEC,
|
||||
0x40, 0xF0, 0xD8, 0xC0, 0x00, 0x40, 0x20, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char volcano_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x08, 0xA0, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00,
|
||||
0x00, 0x07, 0xB0, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00,
|
||||
0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xF0,
|
||||
0x07, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0x7C, 0x7F, 0xFF, 0xEC,
|
||||
0x40, 0xF0, 0xF8, 0xC0, 0x00, 0x40, 0x20, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char volcano_down_cursor_data[32 * 4];
|
||||
extern unsigned char volcano_down_cursor_mask[32 * 4];
|
||||
#define VOLCANO_DOWN_CURSOR_HOTX 7
|
||||
#define VOLCANO_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char walk_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00,
|
||||
0x02, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00,
|
||||
0x00, 0x12, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x1C, 0x00,
|
||||
0x02, 0x20, 0x22, 0x00, 0x02, 0x10, 0x21, 0x00, 0x01, 0x08, 0x10, 0x80, 0x00, 0x88, 0x08, 0x80,
|
||||
0x00, 0x72, 0x07, 0x20, 0x00, 0x0D, 0x00, 0xD0, 0x0F, 0x89, 0x00, 0x90, 0x08, 0x86, 0x00, 0x60,
|
||||
0x08, 0x80, 0x00, 0x00, 0x08, 0x80, 0x0E, 0x00, 0x08, 0x80, 0x11, 0x00, 0x08, 0x80, 0x10, 0x80,
|
||||
0x08, 0x80, 0x08, 0x40, 0xF8, 0xF8, 0x04, 0x40, 0x40, 0x10, 0x03, 0x90, 0x20, 0x20, 0x00, 0x68,
|
||||
0x10, 0x40, 0x00, 0x48, 0x08, 0x80, 0x00, 0x30, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char walk_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00,
|
||||
0x03, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00,
|
||||
0x00, 0x1E, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x1C, 0x00,
|
||||
0x03, 0xE0, 0x3E, 0x00, 0x03, 0xF0, 0x3F, 0x00, 0x01, 0xF8, 0x1F, 0x80, 0x00, 0xF8, 0x0F, 0x80,
|
||||
0x00, 0x72, 0x07, 0x20, 0x00, 0x0F, 0x00, 0xF0, 0x0F, 0x8F, 0x00, 0xF0, 0x0F, 0x86, 0x00, 0x60,
|
||||
0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x0E, 0x00, 0x0F, 0x80, 0x1F, 0x00, 0x0F, 0x80, 0x1F, 0x80,
|
||||
0x0F, 0x80, 0x0F, 0xC0, 0xFF, 0xF8, 0x07, 0xC0, 0x7F, 0xF0, 0x03, 0x90, 0x3F, 0xE0, 0x00, 0x78,
|
||||
0x1F, 0xC0, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x30, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char walk_down_cursor_data[32 * 4];
|
||||
extern unsigned char walk_down_cursor_mask[32 * 4];
|
||||
#define WALK_DOWN_CURSOR_HOTX 7
|
||||
#define WALK_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char paint_down_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFA,
|
||||
0x00, 0x00, 0x01, 0xF6, 0x00, 0x00, 0x03, 0xE4, 0x00, 0x03, 0x07, 0xCC, 0x00, 0x07, 0x84, 0x98,
|
||||
0x00, 0x0F, 0xC8, 0x70, 0x00, 0x1B, 0xF8, 0x60, 0x00, 0x3D, 0xE0, 0xC0, 0x00, 0x7E, 0xE3, 0x00,
|
||||
0x00, 0xFF, 0x62, 0x00, 0x00, 0xDF, 0xBE, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x00, 0x37, 0xEF, 0x80,
|
||||
0x00, 0x1B, 0xF7, 0xC0, 0x07, 0xCF, 0xFB, 0xC0, 0x04, 0x46, 0x9D, 0xC0, 0x04, 0x43, 0x07, 0x80,
|
||||
0x04, 0x41, 0x83, 0x00, 0x04, 0x40, 0xC6, 0x00, 0x04, 0x40, 0x6C, 0x00, 0x04, 0x40, 0x28, 0x00,
|
||||
0x7C, 0x7C, 0x10, 0x00, 0x20, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00,
|
||||
0x04, 0x40, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char paint_down_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFE,
|
||||
0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x03, 0x07, 0xFC, 0x00, 0x07, 0x87, 0xF8,
|
||||
0x00, 0x0F, 0xCF, 0xF0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x80,
|
||||
0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xCF, 0xFF, 0xC0, 0x07, 0xC7, 0xFF, 0xC0, 0x07, 0xC3, 0xFF, 0x80,
|
||||
0x07, 0xC1, 0xFF, 0x00, 0x07, 0xC0, 0xFE, 0x00, 0x07, 0xC0, 0x7C, 0x00, 0x07, 0xC0, 0x38, 0x00,
|
||||
0x7F, 0xFC, 0x10, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00,
|
||||
0x07, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char paint_down_cursor_data[32 * 4];
|
||||
extern unsigned char paint_down_cursor_mask[32 * 4];
|
||||
#define PAINT_DOWN_CURSOR_HOTX 8
|
||||
#define PAINT_DOWN_CURSOR_HOTY 30
|
||||
|
||||
unsigned char entrance_down_cursor_data[32 * 4] = {
|
||||
0x20, 0x00, 0x00, 0x08, 0x50, 0x00, 0x00, 0x14, 0x88, 0x00, 0x00, 0x22, 0x50, 0x00, 0x00, 0x14,
|
||||
0x7F, 0xFF, 0xFF, 0xFC, 0x58, 0x00, 0x00, 0x34, 0x54, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x54,
|
||||
0x54, 0x00, 0x00, 0x54, 0x5C, 0x00, 0x00, 0x34, 0x5F, 0xFF, 0xFF, 0xF4, 0x50, 0x00, 0x00, 0x14,
|
||||
0x50, 0x00, 0x00, 0x14, 0x50, 0x00, 0x00, 0x14, 0x50, 0x00, 0x00, 0x14, 0x50, 0x00, 0x00, 0x14,
|
||||
0x50, 0x00, 0x00, 0x14, 0x5F, 0x80, 0x00, 0x14, 0xD8, 0x80, 0x00, 0x14, 0x58, 0x80, 0x02, 0xB5,
|
||||
0x58, 0x80, 0x00, 0x14, 0xD8, 0x80, 0x00, 0x14, 0x58, 0x80, 0x05, 0x74, 0x08, 0x80, 0x00, 0x00,
|
||||
0x08, 0x80, 0x00, 0xD2, 0xF8, 0xF8, 0x0E, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
|
||||
0x10, 0x40, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char entrance_down_cursor_mask[32 * 4] = {
|
||||
0x20, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x1C, 0xF8, 0x00, 0x00, 0x3E, 0x70, 0x00, 0x00, 0x1C,
|
||||
0x7F, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x77, 0xFF, 0xFF, 0xDC, 0x77, 0xFF, 0xFF, 0xDC,
|
||||
0x77, 0xFF, 0xFF, 0xDC, 0x7F, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x70, 0x00, 0x00, 0x1C,
|
||||
0x70, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x00, 0x1C,
|
||||
0x70, 0x00, 0x00, 0x1C, 0x7F, 0x80, 0x00, 0x1C, 0xFF, 0x80, 0x00, 0x1C, 0x7F, 0x80, 0x02, 0xBD,
|
||||
0x7F, 0x80, 0x00, 0x1C, 0xFF, 0x80, 0x00, 0x1C, 0x7F, 0x80, 0x05, 0x7C, 0x0F, 0x80, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0xD2, 0xFF, 0xF8, 0x0E, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
};
|
||||
extern unsigned char entrance_down_cursor_data[32 * 4];
|
||||
extern unsigned char entrance_down_cursor_mask[32 * 4];
|
||||
#define ENTRANCE_DOWN_CURSOR_HOTX 7
|
||||
#define ENTRANCE_DOWN_CURSOR_HOTY 31
|
||||
|
||||
unsigned char hand_open_cursor_data[32 * 4] = {
|
||||
0x00, 0x06, 0x10, 0x00, 0x00, 0x09, 0x38, 0x00, 0x00, 0x09, 0x24, 0x00, 0x03, 0x08, 0xA4, 0x00,
|
||||
0x04, 0x88, 0xA4, 0xC0, 0x04, 0x48, 0x63, 0x20, 0x04, 0x24, 0x63, 0x10, 0x06, 0x24, 0x61, 0x90,
|
||||
0x02, 0x14, 0x21, 0x90, 0x03, 0x0C, 0x21, 0x10, 0x01, 0x04, 0x21, 0x10, 0x01, 0x86, 0x01, 0x10,
|
||||
0x00, 0x82, 0x00, 0x08, 0x00, 0xC0, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08,
|
||||
0x00, 0x30, 0x00, 0x08, 0x00, 0x30, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08,
|
||||
0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x00, 0x10,
|
||||
0x0F, 0xC0, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x12, 0x00, 0x00, 0x08,
|
||||
0x0F, 0x0F, 0x00, 0x04, 0x01, 0xF9, 0x80, 0x04, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x00, 0x7F, 0xE0,
|
||||
};
|
||||
unsigned char hand_open_cursor_mask[32 * 4] = {
|
||||
0x00, 0x06, 0x10, 0x00, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x0F, 0x3C, 0x00, 0x03, 0x0F, 0xBC, 0x00,
|
||||
0x07, 0x8F, 0xBC, 0xC0, 0x07, 0xCF, 0xFF, 0xE0, 0x07, 0xE7, 0xFF, 0xF0, 0x07, 0xE7, 0xFF, 0xF0,
|
||||
0x03, 0xF7, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xF0,
|
||||
0x00, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF8,
|
||||
0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF8,
|
||||
0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xF0,
|
||||
0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xF8,
|
||||
0x0F, 0xFF, 0xFF, 0xFC, 0x01, 0xF9, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xE0,
|
||||
};
|
||||
extern unsigned char hand_open_cursor_data[32 * 4];
|
||||
extern unsigned char hand_open_cursor_mask[32 * 4];
|
||||
#define HAND_OPEN_CURSOR_HOTX 0
|
||||
#define HAND_OPEN_CURSOR_HOTY 0
|
||||
|
||||
unsigned char hand_closed_cursor_data[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xE0, 0x00, 0x00, 0x43, 0x10, 0x00, 0x00, 0x41, 0x8C, 0x00,
|
||||
0x00, 0x20, 0x87, 0x00, 0x0E, 0x20, 0x42, 0x80, 0x11, 0x98, 0x62, 0x40, 0x10, 0x6C, 0x61, 0x20,
|
||||
0x18, 0x14, 0x21, 0x20, 0x0C, 0x0C, 0x21, 0x10, 0x06, 0x04, 0x21, 0x10, 0x03, 0x06, 0x01, 0x10,
|
||||
0x00, 0x82, 0x00, 0x08, 0x00, 0xC0, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08,
|
||||
0x00, 0x30, 0x00, 0x08, 0x00, 0x30, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08,
|
||||
0x07, 0x10, 0x00, 0x10, 0x08, 0x90, 0x00, 0x10, 0x08, 0x60, 0x00, 0x10, 0x0A, 0x00, 0x00, 0x10,
|
||||
0x0A, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x08, 0x03, 0x80, 0x00, 0x08,
|
||||
0x00, 0x7F, 0x00, 0x04, 0x00, 0x01, 0x80, 0x04, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x00, 0x7F, 0xE0,
|
||||
};
|
||||
unsigned char hand_closed_cursor_mask[32 * 4] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xE0, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x7F, 0xFC, 0x00,
|
||||
0x00, 0x3F, 0xFF, 0x00, 0x0E, 0x3F, 0xFF, 0x80, 0x1F, 0x9F, 0xFF, 0xC0, 0x1F, 0xEF, 0xFF, 0xE0,
|
||||
0x1F, 0xF7, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xF0,
|
||||
0x00, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF8,
|
||||
0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF8,
|
||||
0x07, 0x1F, 0xFF, 0xF0, 0x0F, 0x9F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF0,
|
||||
0x0F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xF8,
|
||||
0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xE0,
|
||||
};
|
||||
extern unsigned char hand_closed_cursor_data[32 * 4];
|
||||
extern unsigned char hand_closed_cursor_mask[32 * 4];
|
||||
#define HAND_CLOSED_CURSOR_HOTX 0
|
||||
#define HAND_CLOSED_CURSOR_HOTY 0
|
||||
|
||||
|
|
|
@ -22,7 +22,8 @@
|
|||
#include "../common.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../platform/platform.h"
|
||||
#include "../object.h"
|
||||
#include "drawing.h"
|
||||
|
||||
// HACK These were originally passed back through registers
|
||||
|
@ -136,7 +137,7 @@ void gfx_transpose_palette(int pal, unsigned char product)
|
|||
rct_g1_element g1 = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[pal];
|
||||
int width = g1.width;
|
||||
int x = g1.x_offset;
|
||||
uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x014124680,uint8)[x]);
|
||||
uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x01424680, uint8)[x * 4]);
|
||||
uint8* source_pointer = g1.offset;
|
||||
|
||||
for (; width > 0; width--) {
|
||||
|
@ -146,7 +147,33 @@ void gfx_transpose_palette(int pal, unsigned char product)
|
|||
source_pointer += 3;
|
||||
dest_pointer += 4;
|
||||
}
|
||||
osinterface_update_palette((char*)0x01424680, 10, 236);//Odd would have expected dest_pointer
|
||||
platform_update_palette((char*)0x01424680, 10, 236);
|
||||
}
|
||||
|
||||
/* rct2: 0x006837E3 */
|
||||
void load_palette(){
|
||||
uint8* water_chunk = object_entry_groups[OBJECT_TYPE_WATER].chunks[0];
|
||||
|
||||
uint32 palette = 0x5FC;
|
||||
|
||||
if (water_chunk != (uint8*)-1){
|
||||
palette = *((uint32*)(water_chunk + 2));
|
||||
}
|
||||
|
||||
rct_g1_element g1 = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[palette];
|
||||
int width = g1.width;
|
||||
int x = g1.x_offset;
|
||||
uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x01424680, uint8)[x * 4]);
|
||||
uint8* source_pointer = g1.offset;
|
||||
|
||||
for (; width > 0; width--) {
|
||||
dest_pointer[0] = source_pointer[0];
|
||||
dest_pointer[1] = source_pointer[1];
|
||||
dest_pointer[2] = source_pointer[2];
|
||||
source_pointer += 3;
|
||||
dest_pointer += 4;
|
||||
}
|
||||
platform_update_palette((char*)0x01424680, 10, 236);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -75,6 +75,7 @@ void gfx_invalidate_screen();
|
|||
|
||||
// palette
|
||||
void gfx_transpose_palette(int pal, unsigned char product);
|
||||
void load_palette();
|
||||
|
||||
// other
|
||||
void gfx_draw_rain(int left, int top, int width, int height, sint32 x_start, sint32 y_start);
|
||||
|
|
348
src/editor.c
348
src/editor.c
|
@ -31,7 +31,8 @@
|
|||
#include "management/news_item.h"
|
||||
#include "object.h"
|
||||
#include "peep/staff.h"
|
||||
#include "platform/osinterface.h"
|
||||
#include "platform/platform.h"
|
||||
#include "rct1.h"
|
||||
#include "ride/ride.h"
|
||||
#include "scenario.h"
|
||||
#include "util/sawyercoding.h"
|
||||
|
@ -47,7 +48,7 @@ static int editor_load_landscape_from_sv4(const char *path);
|
|||
static int editor_load_landscape_from_sc4(const char *path);
|
||||
static int editor_read_sc4(char *src, int length);
|
||||
static int editor_read_sv4(char *src, int length);
|
||||
static int editor_read_s4(char *src);
|
||||
static int editor_read_s4(rct1_s4 *data);
|
||||
static int editor_read_s6(const char *path);
|
||||
|
||||
/**
|
||||
|
@ -61,7 +62,7 @@ void editor_load()
|
|||
pause_sounds();
|
||||
unpause_sounds();
|
||||
object_unload_all();
|
||||
map_init();
|
||||
map_init(150);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006B9CB0);
|
||||
reset_park_entrances();
|
||||
user_string_clear_all();
|
||||
|
@ -85,7 +86,7 @@ void editor_load()
|
|||
mainWindow = window_get_main();
|
||||
window_scroll_to_location(mainWindow, 2400, 2400, 112);
|
||||
mainWindow->flags &= ~WF_SCROLLING_TO_LOCATION;
|
||||
RCT2_CALLPROC_EBPSAFE(0x006837E3);
|
||||
load_palette();
|
||||
gfx_invalidate_screen();
|
||||
RCT2_GLOBAL(0x009DEA66, sint16) = 0;
|
||||
}
|
||||
|
@ -106,7 +107,7 @@ static int show_convert_saved_game_to_scenario_dialog(char *resultPath)
|
|||
format_string(filterName, STR_RCT2_SAVED_GAME, NULL);
|
||||
|
||||
pause_sounds();
|
||||
result = osinterface_open_common_file_dialog(1, title, filename, "*.SV6", filterName);
|
||||
result = platform_open_common_file_dialog(1, title, filename, "*.SV6", filterName);
|
||||
unpause_sounds();
|
||||
|
||||
if (result)
|
||||
|
@ -155,7 +156,7 @@ void editor_convert_save_to_scenario()
|
|||
|
||||
format_string(s6Info->details, STR_NO_DETAILS_YET, NULL);
|
||||
s6Info->name[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_SCENARIO_EDITOR;
|
||||
s6Info->var_000 = 4;
|
||||
|
@ -194,7 +195,7 @@ void editor_convert_save_to_scenario()
|
|||
RCT2_CALLPROC_EBPSAFE(0x006DFEE4);
|
||||
window_new_ride_init_vars();
|
||||
RCT2_GLOBAL(0x009DEB7C, uint16) = 0;
|
||||
RCT2_CALLPROC_EBPSAFE(0x006837E3); // (palette related)
|
||||
load_palette();
|
||||
gfx_invalidate_screen();
|
||||
RCT2_GLOBAL(0x009DEA66, uint16) = 0;
|
||||
}
|
||||
|
@ -208,7 +209,7 @@ void trackdesigner_load()
|
|||
rct_window *mainWindow;
|
||||
|
||||
object_unload_all();
|
||||
map_init();
|
||||
map_init(150);
|
||||
set_all_land_owned();
|
||||
RCT2_CALLPROC_EBPSAFE(0x006B9CB0);
|
||||
reset_park_entrances();
|
||||
|
@ -231,7 +232,7 @@ void trackdesigner_load()
|
|||
mainWindow = window_get_main();
|
||||
window_scroll_to_location(mainWindow, 2400, 2400, 112);
|
||||
mainWindow->flags &= ~WF_SCROLLING_TO_LOCATION;
|
||||
RCT2_CALLPROC_EBPSAFE(0x006837E3);
|
||||
load_palette();
|
||||
gfx_invalidate_screen();
|
||||
RCT2_GLOBAL(0x009DEA66, sint16) = 0;
|
||||
}
|
||||
|
@ -245,7 +246,7 @@ void trackmanager_load()
|
|||
rct_window *mainWindow;
|
||||
|
||||
object_unload_all();
|
||||
map_init();
|
||||
map_init(150);
|
||||
set_all_land_owned();
|
||||
RCT2_CALLPROC_EBPSAFE(0x006B9CB0);
|
||||
reset_park_entrances();
|
||||
|
@ -268,7 +269,7 @@ void trackmanager_load()
|
|||
mainWindow = window_get_main();
|
||||
window_scroll_to_location(mainWindow, 2400, 2400, 112);
|
||||
mainWindow->flags &= ~WF_SCROLLING_TO_LOCATION;
|
||||
RCT2_CALLPROC_EBPSAFE(0x006837E3);
|
||||
load_palette();
|
||||
gfx_invalidate_screen();
|
||||
RCT2_GLOBAL(0x009DEA66, sint16) = 0;
|
||||
}
|
||||
|
@ -299,12 +300,6 @@ void sub_6BD3A4() {
|
|||
sub_6C0C3F();
|
||||
}
|
||||
|
||||
static void read(void *dst, void **src, int length)
|
||||
{
|
||||
memcpy(dst, *src, length);
|
||||
*((char**)src) += length;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006758C0
|
||||
|
@ -328,6 +323,254 @@ void editor_load_landscape(const char *path)
|
|||
editor_read_s6(path);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00666DFD
|
||||
*/
|
||||
static void sub_666DFD()
|
||||
{
|
||||
int x, y;
|
||||
rct_map_element *mapElement;
|
||||
|
||||
x = RCT2_GLOBAL(0x013573EA, uint16);
|
||||
y = RCT2_GLOBAL(0x013573EC, uint16);
|
||||
if (x == 0x8000)
|
||||
return;
|
||||
|
||||
x /= 32;
|
||||
y /= 32;
|
||||
mapElement = map_get_first_element_at(x, y);
|
||||
do {
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) {
|
||||
if (mapElement->properties.entrance.type == ENTRANCE_TYPE_PARK_ENTRANCE) {
|
||||
mapElement->properties.entrance.path_type = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0069F06A
|
||||
*/
|
||||
static void sub_69F06A()
|
||||
{
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069F06A); return;
|
||||
|
||||
// TODO, bug with the following code
|
||||
RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 0) | (1 << 1) | (1 << 14) | (1 << 2) | (1 << 3);
|
||||
if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 4))) {
|
||||
RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 4);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006B9CB0);
|
||||
}
|
||||
if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 6))) {
|
||||
RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 6);
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069E891);
|
||||
}
|
||||
RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 7);
|
||||
if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 8))) {
|
||||
RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 8);
|
||||
sub_666DFD();
|
||||
}
|
||||
if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 9))) {
|
||||
RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 9);
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069E89B);
|
||||
}
|
||||
if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 13))) {
|
||||
RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 13);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = 127 * 32;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, uint16) = 4350;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = 128;
|
||||
RCT2_GLOBAL(0x01358836, uint16) = 4095;
|
||||
}
|
||||
if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 15))) {
|
||||
RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 15);
|
||||
RCT2_GLOBAL(0x01358838, uint32) = 0;
|
||||
}
|
||||
RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 16) | (1 << 18) | (1 << 19);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006A2B62
|
||||
*/
|
||||
static void sub_6A2B62()
|
||||
{
|
||||
int i;
|
||||
rct_sprite *sprite;
|
||||
rct_ride *ride;
|
||||
map_element_iterator it;
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069F007);
|
||||
|
||||
// Free sprite user strings
|
||||
for (i = 0; i < MAX_SPRITES; i++) {
|
||||
sprite = &g_sprite_list[i];
|
||||
if (sprite->unknown.sprite_identifier != 255)
|
||||
user_string_free(sprite->unknown.name_string_idx);
|
||||
}
|
||||
|
||||
reset_sprite_list();
|
||||
|
||||
// Free ride user strings
|
||||
FOR_ALL_RIDES(i, ride)
|
||||
user_string_free(ride->name);
|
||||
|
||||
ride_init_all();
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) = 0;
|
||||
RCT2_GLOBAL(0x01357BC8, uint16) = 0;
|
||||
RCT2_GLOBAL(0x013573FE, uint8) = 0;
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069F44B);
|
||||
sub_69F06A();
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069F143);
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069F2D0);
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069F3AB);
|
||||
|
||||
// Fix paths and remove all ride track / entrance / exit
|
||||
map_element_iterator_begin(&it);
|
||||
do {
|
||||
switch (map_element_get_type(it.element)) {
|
||||
case MAP_ELEMENT_TYPE_PATH:
|
||||
if (it.element->type & 1) {
|
||||
it.element->properties.path.type &= 0xF7;
|
||||
it.element->properties.path.addition_status = 255;
|
||||
}
|
||||
break;
|
||||
|
||||
case MAP_ELEMENT_TYPE_TRACK:
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A7594);
|
||||
sub_6A6AA7(it.x * 32, it.y * 32, it.element);
|
||||
map_element_remove(it.element);
|
||||
map_element_iterator_restart_for_tile(&it);
|
||||
break;
|
||||
|
||||
case MAP_ELEMENT_TYPE_ENTRANCE:
|
||||
if (it.element->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) {
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A7594);
|
||||
sub_6A6AA7(it.x * 32, it.y * 32, it.element);
|
||||
map_element_remove(it.element);
|
||||
map_element_iterator_restart_for_tile(&it);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} while (map_element_iterator_next(&it));
|
||||
|
||||
object_unload_all();
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069F53D);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A9FC0);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A2730);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A2956);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A29B9);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A2A68);
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069F509);
|
||||
RCT2_CALLPROC_EBPSAFE(0x00685675);
|
||||
RCT2_CALLPROC_EBPSAFE(0x0068585B);
|
||||
|
||||
climate_reset(RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, uint8));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_SCENARIO_EDITOR;
|
||||
viewport_init_all();
|
||||
news_item_init_queue();
|
||||
window_editor_main_open();
|
||||
|
||||
rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4;
|
||||
rct_s6_info *s6Info = (rct_s6_info*)0x0141F570;
|
||||
|
||||
s6Info->var_000 = 1;
|
||||
s6Info->category = 4;
|
||||
format_string(s6Info->details, STR_NO_DETAILS_YET, NULL);
|
||||
s6Info->name[0] = 0;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint8) & PARK_FLAGS_NO_MONEY) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint8) |= PARK_FLAGS_NO_MONEY_SCENARIO;
|
||||
} else {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint8) &= PARK_FLAGS_NO_MONEY_SCENARIO;
|
||||
}
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) == MONEY_FREE) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint8) |= PARK_FLAGS_PARK_FREE_ENTRY;
|
||||
} else {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint8) &= ~PARK_FLAGS_PARK_FREE_ENTRY;
|
||||
}
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint8) &= ~PARK_FLAGS_18;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16) = clamp(
|
||||
MONEY(10,00),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16),
|
||||
MONEY(100,00)
|
||||
);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) = min(
|
||||
MONEY(10000,00),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32)
|
||||
);
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069E89B);
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069E869);
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = clamp(
|
||||
MONEY(0,00),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32),
|
||||
MONEY(5000000,00)
|
||||
);
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) = clamp(
|
||||
MONEY(0,00),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32),
|
||||
MONEY(5000000,00)
|
||||
);
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_INTEREST_RATE, uint8) = clamp(
|
||||
5,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_INTEREST_RATE, uint8),
|
||||
80
|
||||
);
|
||||
|
||||
if (
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_NONE ||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_HAVE_FUN ||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_BUILD_THE_BEST
|
||||
) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) = OBJECTIVE_GUESTS_BY;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_YEAR, uint8) = 4;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16) = 1000;
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(0x01358774, uint16) = 0;
|
||||
|
||||
// Initialise main view
|
||||
rct_window *w = window_get_main();
|
||||
rct_viewport *viewport = w->viewport;
|
||||
|
||||
w->viewport_target_sprite = -1;
|
||||
w->saved_view_x = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_X, sint16);
|
||||
w->saved_view_y = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_Y, sint16);
|
||||
|
||||
viewport->zoom = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, uint16) & 0xFF;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, uint16) >> 8;
|
||||
|
||||
int cx = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) - viewport->zoom;
|
||||
if (cx != 0) {
|
||||
if (cx >= 0) {
|
||||
viewport->view_width <<= cx;
|
||||
viewport->view_height <<= cx;
|
||||
} else {
|
||||
cx = -cx;
|
||||
viewport->view_width >>= cx;
|
||||
viewport->view_height >>= cx;
|
||||
}
|
||||
}
|
||||
w->saved_view_x -= viewport->view_width >> 1;
|
||||
w->saved_view_y -= viewport->view_height >> 1;
|
||||
|
||||
window_invalidate(w);
|
||||
sub_69E9A7();
|
||||
RCT2_CALLPROC_EBPSAFE(0x006DFEE4);
|
||||
window_new_ride_init_vars();
|
||||
RCT2_GLOBAL(0x009DEB7C, uint16) = 0;
|
||||
load_palette();
|
||||
gfx_invalidate_screen();
|
||||
|
||||
RCT2_GLOBAL(0x009DEA66, uint16) = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006A2B02
|
||||
|
@ -355,7 +598,7 @@ static int editor_load_landscape_from_sv4(const char *path)
|
|||
editor_read_sv4(fpBuffer, fpLength);
|
||||
free(fpBuffer);
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A2B62);
|
||||
sub_6A2B62();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -386,62 +629,71 @@ static int editor_load_landscape_from_sc4(const char *path)
|
|||
editor_read_sc4(fpBuffer, fpLength);
|
||||
free(fpBuffer);
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A2B62);
|
||||
sub_6A2B62();
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int editor_read_sc4(char *src, int length)
|
||||
{
|
||||
int decodedLength;
|
||||
char *decodedBuffer;
|
||||
rct1_s4 *data;
|
||||
|
||||
decodedBuffer = malloc(2065676);
|
||||
decodedLength = sawyercoding_decode_sc4(src, decodedBuffer, length);
|
||||
if (decodedLength != 2065676) {
|
||||
free(decodedBuffer);
|
||||
int fileType = sawyercoding_detect_file_type(src, length);
|
||||
|
||||
data = malloc(sizeof(rct1_s4));
|
||||
decodedLength = (fileType & FILE_VERSION_MASK) == FILE_VERSION_RCT1 ?
|
||||
sawyercoding_decode_sv4(src, (char*)data, length) :
|
||||
sawyercoding_decode_sc4(src, (char*)data, length);
|
||||
if (decodedLength != sizeof(rct1_s4)) {
|
||||
free(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
editor_read_s4(decodedBuffer);
|
||||
free(decodedBuffer);
|
||||
editor_read_s4(data);
|
||||
free(data);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int editor_read_sv4(char *src, int length)
|
||||
{
|
||||
int decodedLength;
|
||||
char *decodedBuffer;
|
||||
rct1_s4 *data;
|
||||
|
||||
decodedBuffer = malloc(2065676);
|
||||
decodedLength = sawyercoding_decode_sv4(src, decodedBuffer, length);
|
||||
if (decodedLength != 2065676) {
|
||||
free(decodedBuffer);
|
||||
data = malloc(sizeof(rct1_s4));
|
||||
decodedLength = sawyercoding_decode_sv4(src, (char*)data, length);
|
||||
if (decodedLength != sizeof(rct1_s4)) {
|
||||
free(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
editor_read_s4(decodedBuffer);
|
||||
free(decodedBuffer);
|
||||
editor_read_s4(data);
|
||||
free(data);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void read(void *dst, void *src, int length)
|
||||
{
|
||||
memcpy(dst, src, length);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0069EEA0
|
||||
*/
|
||||
static int editor_read_s4(char *src)
|
||||
static int editor_read_s4(rct1_s4 *src)
|
||||
{
|
||||
int i;
|
||||
rct_banner *banner;
|
||||
|
||||
read((void*)RCT2_ADDRESS_CURRENT_MONTH_YEAR, &src, 16);
|
||||
memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, 0x60000 * 4);
|
||||
read((void*)RCT2_ADDRESS_MAP_ELEMENTS, &src, 0x60000);
|
||||
read((void*)0x010E63B8, &src, 0x138804);
|
||||
read((void*)RCT2_ADDRESS_CURRENT_MONTH_YEAR, &src->month, 16);
|
||||
memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, 0x30000 * sizeof(rct_map_element));
|
||||
read((void*)RCT2_ADDRESS_MAP_ELEMENTS, src->map_elements, sizeof(src->map_elements));
|
||||
read((void*)0x010E63B8, &src->unk_counter, 4 + sizeof(src->sprites));
|
||||
|
||||
for (i = 0; i < MAX_BANNERS; i++)
|
||||
gBanners[i].type = 255;
|
||||
|
||||
read((void*)0x013573BC, &src, 12424);
|
||||
read((void*)0x013573BC, &src->next_sprite_index, 12424);
|
||||
|
||||
for (i = 0; i < MAX_BANNERS; i++) {
|
||||
banner = &gBanners[i];
|
||||
|
@ -449,10 +701,10 @@ static int editor_read_s4(char *src)
|
|||
banner->string_idx = 778;
|
||||
}
|
||||
|
||||
read((void*)0x0135A8F4, &src, 0x2F51C);
|
||||
read((void*)0x0135A8F4, &src->string_table, 0x2F51C);
|
||||
memset((void*)0x013CA672, 0, 204);
|
||||
read((void*)0x0138B580, &src, 0x258F2);
|
||||
read((void*)0x013C6A72, &src, 0x3C00);
|
||||
read((void*)0x0138B580, &src->animated_objects, 0x258F2);
|
||||
read((void*)0x013C6A72, &src->patrol_areas, sizeof(src->patrol_areas));
|
||||
|
||||
char *esi = (char*)0x13C6A72;
|
||||
char *edi = (char*)0x13B0E72;
|
||||
|
@ -477,9 +729,9 @@ static int editor_read_s4(char *src)
|
|||
memset(edi, 0, 64); edi += 64;
|
||||
} while (--edx);
|
||||
|
||||
read((void*)0x013CA672, &src, 116);
|
||||
read((void*)0x013CA73A, &src, 4);
|
||||
read((void*)0x013CA73E, &src, 0x41EA);
|
||||
read((void*)0x013CA672, &src->unk_1F42AA, 116);
|
||||
read((void*)0x013CA73A, &src->unk_1F431E, 4);
|
||||
read((void*)0x013CA73E, &src->unk_1F4322, 0x41EA);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -641,9 +893,9 @@ static int editor_read_s6(const char *path)
|
|||
MONEY(5000000,00)
|
||||
);
|
||||
|
||||
RCT2_GLOBAL(0x013580F0, money32) = clamp(
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) = clamp(
|
||||
MONEY(0,00),
|
||||
RCT2_GLOBAL(0x013580F0, money32),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32),
|
||||
MONEY(5000000,00)
|
||||
);
|
||||
|
||||
|
@ -699,7 +951,7 @@ static int editor_read_s6(const char *path)
|
|||
RCT2_CALLPROC_EBPSAFE(0x006DFEE4);
|
||||
window_new_ride_init_vars();
|
||||
RCT2_GLOBAL(0x009DEB7C, uint16) = 0;
|
||||
RCT2_CALLPROC_EBPSAFE(0x006837E3); // (palette related)
|
||||
load_palette();
|
||||
gfx_invalidate_screen();
|
||||
|
||||
return 1;
|
||||
|
|
162
src/game.c
162
src/game.c
|
@ -31,12 +31,13 @@
|
|||
#include "interface/widget.h"
|
||||
#include "interface/window.h"
|
||||
#include "management/finance.h"
|
||||
#include "management/marketing.h"
|
||||
#include "management/news_item.h"
|
||||
#include "management/research.h"
|
||||
#include "object.h"
|
||||
#include "peep/peep.h"
|
||||
#include "peep/staff.h"
|
||||
#include "platform/osinterface.h"
|
||||
#include "platform/platform.h"
|
||||
#include "ride/ride.h"
|
||||
#include "ride/ride_ratings.h"
|
||||
#include "ride/vehicle.h"
|
||||
|
@ -70,7 +71,7 @@ void game_reduce_game_speed()
|
|||
void game_create_windows()
|
||||
{
|
||||
window_main_open();
|
||||
window_game_top_toolbar_open();
|
||||
window_top_toolbar_open();
|
||||
window_game_bottom_toolbar_open();
|
||||
RCT2_CALLPROC_EBPSAFE(0x0066B905);
|
||||
}
|
||||
|
@ -96,7 +97,7 @@ void update_palette_effects()
|
|||
RCT2_ADDRESS(0x01424680 + xoffset, uint8)[(i * 4) + 2] = -((0xFF - g1_element.offset[(i * 3) + 2]) / 2) - 1;
|
||||
}
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 2;
|
||||
osinterface_update_palette(RCT2_ADDRESS(0x01424680, uint8), 10, 236);
|
||||
platform_update_palette(RCT2_ADDRESS(0x01424680, uint8), 10, 236);
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint8)++;
|
||||
} else {
|
||||
|
@ -125,7 +126,7 @@ void update_palette_effects()
|
|||
q = 2;
|
||||
}
|
||||
}
|
||||
uint32 j = RCT2_GLOBAL(0x009DE584, uint32);
|
||||
uint32 j = RCT2_GLOBAL(RCT2_ADDRESS_PALETTE_EFFECT_FRAME_NO, uint32);
|
||||
j = (((uint16)((~j / 2) * 128) * 15) >> 16);
|
||||
int p = 1533;
|
||||
if (RCT2_GLOBAL(0x009ADAE0, int) != -1) {
|
||||
|
@ -164,7 +165,7 @@ void update_palette_effects()
|
|||
vd += 4;
|
||||
}
|
||||
|
||||
j = ((uint16)(RCT2_GLOBAL(0x009DE584, uint32) * -960) * 3) >> 16;
|
||||
j = ((uint16)(RCT2_GLOBAL(RCT2_ADDRESS_PALETTE_EFFECT_FRAME_NO, uint32) * -960) * 3) >> 16;
|
||||
p = 1539;
|
||||
g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[q + p];
|
||||
vs = &g1_element.offset[j * 3];
|
||||
|
@ -182,11 +183,11 @@ void update_palette_effects()
|
|||
}
|
||||
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 2;
|
||||
osinterface_update_palette(RCT2_ADDRESS(0x01424680, uint8), 230, 16);
|
||||
platform_update_palette(RCT2_ADDRESS(0x01424680, uint8), 230, 16);
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 0;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint8) == 2) {
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 2;
|
||||
osinterface_update_palette(RCT2_ADDRESS(0x01424680, uint8), 10, 236);
|
||||
platform_update_palette(RCT2_ADDRESS(0x01424680, uint8), 10, 236);
|
||||
RCT2_GLOBAL(0x014241BC, uint32) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint8) = 0;
|
||||
}
|
||||
|
@ -219,7 +220,7 @@ void game_update()
|
|||
}
|
||||
|
||||
// Update the game one or more times
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint8) == 0) {
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) {
|
||||
for (i = 0; i < numUpdates; i++) {
|
||||
game_logic_update();
|
||||
start_title_music();
|
||||
|
@ -435,7 +436,7 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int *
|
|||
//
|
||||
if (!(flags & 0x20)) {
|
||||
// Update money balance
|
||||
finance_payment(cost, RCT2_GLOBAL(0x0141F56C, uint8));
|
||||
finance_payment(cost, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) / 4);
|
||||
if (RCT2_GLOBAL(0x0141F568, uint8) == RCT2_GLOBAL(0x013CA740, uint8)) {
|
||||
// Create a +/- money text effect
|
||||
if (cost != 0)
|
||||
|
@ -464,83 +465,40 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int *
|
|||
*
|
||||
* rct2: 0x00667C15
|
||||
*/
|
||||
void game_pause_toggle()
|
||||
void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp)
|
||||
{
|
||||
char input_bl;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov input_bl, bl
|
||||
#else
|
||||
__asm__ ( "mov %[input_bl], bl " : [input_bl] "+m" (input_bl) );
|
||||
#endif
|
||||
|
||||
|
||||
if (input_bl & 1) {
|
||||
RCT2_GLOBAL(0x009DEA6E, uint32) ^= 1;
|
||||
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) ^= 1;
|
||||
window_invalidate_by_class(WC_TOP_TOOLBAR);
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint32) & 1)
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) & 1)
|
||||
pause_sounds();
|
||||
else
|
||||
unpause_sounds();
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov ebx, 0
|
||||
#else
|
||||
__asm__ ( "mov ebx, 0 " );
|
||||
#endif
|
||||
|
||||
*ebx = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066DB5F
|
||||
*/
|
||||
static void game_load_or_quit()
|
||||
static void game_load_or_quit(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp)
|
||||
{
|
||||
char input_bl, input_dl;
|
||||
short input_di;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov input_bl, bl
|
||||
#else
|
||||
__asm__ ( "mov %[input_bl], bl " : [input_bl] "+m" (input_bl) );
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov input_dl, dl
|
||||
#else
|
||||
__asm__ ( "mov %[input_dl], dl " : [input_dl] "+m" (input_dl) );
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov input_di, di
|
||||
#else
|
||||
__asm__ ( "mov %[input_di], di " : [input_di] "+m" (input_di) );
|
||||
#endif
|
||||
|
||||
if (!(input_bl & 1))
|
||||
return; // 0;
|
||||
|
||||
switch (input_dl) {
|
||||
case 0:
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SAVE_PROMPT_MODE, uint16) = input_di;
|
||||
window_save_prompt_open();
|
||||
break;
|
||||
case 1:
|
||||
window_close_by_class(WC_SAVE_PROMPT);
|
||||
break;
|
||||
default:
|
||||
game_load_or_quit_no_save_prompt();
|
||||
break;
|
||||
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
|
||||
switch (*edx & 0xFF) {
|
||||
case 0:
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SAVE_PROMPT_MODE, uint16) = *edi & 0xFF;
|
||||
window_save_prompt_open();
|
||||
break;
|
||||
case 1:
|
||||
window_close_by_class(WC_SAVE_PROMPT);
|
||||
break;
|
||||
default:
|
||||
game_load_or_quit_no_save_prompt();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov ebx, 0
|
||||
#else
|
||||
__asm__ ( "mov ebx, 0 " );
|
||||
#endif
|
||||
|
||||
*ebx = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -554,7 +512,7 @@ static int open_landscape_file_dialog()
|
|||
strcpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_LANDSCAPES_PATH);
|
||||
format_string((char*)0x0141EE68, STR_RCT2_LANDSCAPE_FILE, 0);
|
||||
pause_sounds();
|
||||
result = osinterface_open_common_file_dialog(1, (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68, "*.SV6;*.SV4;*.SC6", (char*)0x0141EE68);
|
||||
result = platform_open_common_file_dialog(1, (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68, "*.SV6;*.SV4;*.SC6", (char*)0x0141EE68);
|
||||
unpause_sounds();
|
||||
// window_proc
|
||||
return result;
|
||||
|
@ -571,7 +529,7 @@ static int open_load_game_dialog()
|
|||
strcpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_SAVED_GAMES_PATH);
|
||||
format_string((char*)0x0141EE68, STR_RCT2_SAVED_GAME, 0);
|
||||
pause_sounds();
|
||||
result = osinterface_open_common_file_dialog(1, (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68, "*.SV6", (char*)0x0141EE68);
|
||||
result = platform_open_common_file_dialog(1, (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68, "*.SV6", (char*)0x0141EE68);
|
||||
unpause_sounds();
|
||||
// window_proc
|
||||
return result;
|
||||
|
@ -724,7 +682,7 @@ int game_load_save(const char *path)
|
|||
if (RCT2_GLOBAL(0x0013587C4, uint32) == 0) // this check is not in scenario play
|
||||
sub_69E869();
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x006837E3); // (palette related)
|
||||
load_palette();
|
||||
gfx_invalidate_screen();
|
||||
return 1;
|
||||
}
|
||||
|
@ -790,7 +748,7 @@ static int show_save_game_dialog(char *resultPath)
|
|||
format_string(filterName, STR_RCT2_SAVED_GAME, NULL);
|
||||
|
||||
pause_sounds();
|
||||
result = osinterface_open_common_file_dialog(0, title, filename, "*.SV6", filterName);
|
||||
result = platform_open_common_file_dialog(0, title, filename, "*.SV6", filterName);
|
||||
unpause_sounds();
|
||||
|
||||
if (result)
|
||||
|
@ -860,15 +818,15 @@ void game_load_or_quit_no_save_prompt()
|
|||
static uint32 game_do_command_table[58] = {
|
||||
0x006B2FC5,
|
||||
0x0066397F,
|
||||
(uint32)game_pause_toggle,
|
||||
0,
|
||||
0x006C511D,
|
||||
0x006C5B69,
|
||||
(uint32)game_load_or_quit,
|
||||
0,
|
||||
0x006B3F0F,
|
||||
0x006B49D9,
|
||||
0x006B4EA6,
|
||||
0x006B52D4,
|
||||
0x006B578B, // 10
|
||||
0, // 10
|
||||
0x006B5559,
|
||||
0x006660A8,
|
||||
0x0066640B,
|
||||
|
@ -892,21 +850,21 @@ static uint32 game_do_command_table[58] = {
|
|||
0x006C0B83,
|
||||
0x006C0BB5,
|
||||
0x00669C6D,
|
||||
0x00669D4A,
|
||||
0,
|
||||
0x006649BD,
|
||||
0x006666E7,
|
||||
0x00666A63,
|
||||
0,
|
||||
0x006CD8CE,
|
||||
(uint32)game_command_set_park_entrance_fee,
|
||||
(uint32)game_command_update_staff_colour, // 40
|
||||
0,
|
||||
0, // 40
|
||||
0x006E519A,
|
||||
0x006E5597,
|
||||
0x006B893C,
|
||||
0x006B8E1B,
|
||||
0x0069DFB3,
|
||||
0x00684A7F,
|
||||
0,
|
||||
0,
|
||||
0x006D13FE,
|
||||
0x0069E73C,
|
||||
0,
|
||||
0x006CDEE4,
|
||||
0x006B9E6D, // 50
|
||||
0x006BA058,
|
||||
|
@ -923,15 +881,15 @@ void game_command_emptysub(int* eax, int* ebx, int* ecx, int* edx, int* esi, int
|
|||
static GAME_COMMAND_POINTER* new_game_command_table[58] = {
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_pause_toggle,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_load_or_quit,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub, // 10
|
||||
game_command_set_ride_name, // 10
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
|
@ -954,22 +912,22 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = {
|
|||
game_command_emptysub, // 30
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_set_park_name,
|
||||
game_command_set_park_open,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_remove_park_entrance,
|
||||
game_command_emptysub,
|
||||
game_command_set_park_entrance_fee,
|
||||
game_command_update_staff_colour, // 40
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_set_current_loan,
|
||||
game_command_set_research_funding,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub, // 40
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub,
|
||||
game_command_start_campaign,
|
||||
game_command_emptysub,
|
||||
game_command_emptysub, // 50
|
||||
game_command_emptysub,
|
||||
|
|
|
@ -55,11 +55,11 @@ enum GAME_COMMAND {
|
|||
GAME_COMMAND_SET_STAFF_PATROL, //30
|
||||
GAME_COMMAND_FIRE_STAFF_MEMBER, // 31
|
||||
GAME_COMMAND_SET_STAFF_ORDER, // 32
|
||||
GAME_COMMAND_33,
|
||||
GAME_COMMAND_SET_PARK_NAME,
|
||||
GAME_COMMAND_SET_PARK_OPEN, // 34
|
||||
GAME_COMMAND_35,
|
||||
GAME_COMMAND_36,
|
||||
GAME_COMMAND_37,
|
||||
GAME_COMMAND_PLACE_PARK_ENTRANCE,
|
||||
GAME_COMMAND_REMOVE_PARK_ENTRANCE,
|
||||
GAME_COMMAND_38,
|
||||
GAME_COMMAND_SET_PARK_ENTRANCE_FEE, // 39
|
||||
GAME_COMMAND_SET_STAFF_COLOUR, // 40
|
||||
|
@ -106,7 +106,7 @@ void game_reduce_game_speed();
|
|||
|
||||
void game_load_or_quit_no_save_prompt();
|
||||
int game_load_save(const char *path);
|
||||
void game_pause_toggle();
|
||||
void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
|
||||
char save_game();
|
||||
void rct2_exit();
|
||||
|
||||
|
|
298
src/input.c
298
src/input.c
|
@ -22,6 +22,7 @@
|
|||
#include "addresses.h"
|
||||
#include "audio/audio.h"
|
||||
#include "config.h"
|
||||
#include "cursors.h"
|
||||
#include "game.h"
|
||||
#include "input.h"
|
||||
#include "interface/keyboard_shortcut.h"
|
||||
|
@ -29,7 +30,7 @@
|
|||
#include "interface/widget.h"
|
||||
#include "interface/window.h"
|
||||
#include "localisation/localisation.h"
|
||||
#include "platform/osinterface.h"
|
||||
#include "platform/platform.h"
|
||||
#include "ride/ride_data.h"
|
||||
#include "scenario.h"
|
||||
#include "tutorial.h"
|
||||
|
@ -97,7 +98,7 @@ void game_handle_input()
|
|||
if (RCT2_GLOBAL(0x009DEA64, uint16) & 2) {
|
||||
RCT2_GLOBAL(0x009DEA64, uint16) &= ~2;
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 2, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(0x009ABDF2, uint8) != 0) {
|
||||
for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++)
|
||||
|
@ -112,7 +113,7 @@ void game_handle_input()
|
|||
break;
|
||||
|
||||
game_handle_input_mouse(x, y, state & 0xFF);
|
||||
}
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_5) {
|
||||
game_handle_input_mouse(x, y, state);
|
||||
|
@ -123,8 +124,8 @@ void game_handle_input()
|
|||
game_handle_input_mouse(x, y, state);
|
||||
process_mouse_over(x, y);
|
||||
process_mouse_tool(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++)
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_08], 0, 0, 0, 0,(int) w, 0, 0);
|
||||
|
@ -133,7 +134,7 @@ void game_handle_input()
|
|||
/**
|
||||
*
|
||||
* rct2: 0x006E83C7
|
||||
*/
|
||||
*/
|
||||
static void game_get_next_input(int *x, int *y, int *state)
|
||||
{
|
||||
rct_mouse_data* eax = get_mouse_input();
|
||||
|
@ -142,7 +143,7 @@ static void game_get_next_input(int *x, int *y, int *state)
|
|||
*y = gCursorState.y;
|
||||
*state = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
*x = eax->x;
|
||||
*y = eax->y;
|
||||
|
@ -172,7 +173,7 @@ static void game_get_next_input(int *x, int *y, int *state)
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* rct2: 0x00407074
|
||||
*/
|
||||
static rct_mouse_data* get_mouse_input()
|
||||
|
@ -185,7 +186,7 @@ static rct_mouse_data* get_mouse_input()
|
|||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32) = (read_index + 1) % 64;
|
||||
return &mouse_buffer[read_index];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -253,8 +254,8 @@ static void game_handle_input_mouse(int x, int y, int state)
|
|||
input_viewport_drag_end();
|
||||
if (RCT2_GLOBAL(0x009DE540, sint16) < 500) {
|
||||
viewport_interaction_right_click(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case INPUT_STATE_DROPDOWN_ACTIVE:
|
||||
input_state_widget_pressed(x, y, state, widgetIndex, w, widget);
|
||||
|
@ -305,10 +306,10 @@ static void game_handle_input_mouse(int x, int y, int state)
|
|||
else{
|
||||
if ((RCT2_GLOBAL(0x9DE518, uint32) & (1 << 4)))
|
||||
break;
|
||||
|
||||
|
||||
viewport_interaction_left_click(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case INPUT_STATE_SCROLL_LEFT:
|
||||
if (state == 0)
|
||||
|
@ -326,14 +327,14 @@ static void game_handle_input_mouse(int x, int y, int state)
|
|||
|
||||
if (state == 0 || state == 2)
|
||||
input_window_resize_continue(w, x, y);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
RCT2_CALLPROC_X(0x006E8ACB, x, y, state, widgetIndex, (int)w, (int)widget, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma region Window positioning / resizing
|
||||
|
||||
void input_window_position_begin(rct_window *w, int widgetIndex, int x, int y)
|
||||
|
@ -344,7 +345,7 @@ void input_window_position_begin(rct_window *w, int widgetIndex, int x, int y)
|
|||
_dragWindowClass = w->classification;
|
||||
_dragWindowNumber = w->number;
|
||||
_dragWidgetIndex = widgetIndex;
|
||||
}
|
||||
}
|
||||
|
||||
static void input_window_position_continue(rct_window *w, int wdx, int wdy, int x, int y)
|
||||
{
|
||||
|
@ -352,7 +353,7 @@ static void input_window_position_continue(rct_window *w, int wdx, int wdy, int
|
|||
|
||||
snapProximity = w->flags & WF_NO_SNAPPING ? 0 : gGeneral_config.window_snap_proximity;
|
||||
window_move_and_snap(w, x - wdx, y - wdy, snapProximity);
|
||||
}
|
||||
}
|
||||
|
||||
static void input_window_position_end(rct_window *w, int x, int y)
|
||||
{
|
||||
|
@ -362,7 +363,7 @@ static void input_window_position_end(rct_window *w, int x, int y)
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_NUMBER, rct_windownumber) = _dragWindowNumber;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WIDGET_INDEX, uint16) = _dragWidgetIndex;
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_MOVED], 0, 0, x, y, (int)w, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void input_window_resize_begin(rct_window *w, int widgetIndex, int x, int y)
|
||||
{
|
||||
|
@ -374,7 +375,7 @@ static void input_window_resize_begin(rct_window *w, int widgetIndex, int x, int
|
|||
_dragWidgetIndex = widgetIndex;
|
||||
_originalWindowWidth = w->width;
|
||||
_originalWindowHeight = w->height;
|
||||
}
|
||||
}
|
||||
|
||||
static void input_window_resize_continue(rct_window *w, int x, int y)
|
||||
{
|
||||
|
@ -391,8 +392,8 @@ static void input_window_resize_continue(rct_window *w, int x, int y)
|
|||
targetWidth - w->width,
|
||||
targetHeight - w->height
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void input_window_resize_end()
|
||||
{
|
||||
|
@ -535,77 +536,77 @@ static void input_scroll_continue(rct_window *w, int widgetIndex, int state, int
|
|||
rct_widget *widget;
|
||||
|
||||
widget = &w->widgets[widgetIndex];
|
||||
if (widgetIndex != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, uint32)){
|
||||
invalidate_scroll();
|
||||
return;
|
||||
}
|
||||
if (w->classification != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, uint8)){
|
||||
invalidate_scroll();
|
||||
return;
|
||||
}
|
||||
if (w->number != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, uint16)){
|
||||
invalidate_scroll();
|
||||
return;
|
||||
}
|
||||
if (widgetIndex != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, uint32)){
|
||||
invalidate_scroll();
|
||||
return;
|
||||
}
|
||||
if (w->classification != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, uint8)){
|
||||
invalidate_scroll();
|
||||
return;
|
||||
}
|
||||
if (w->number != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, uint16)){
|
||||
invalidate_scroll();
|
||||
return;
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SCROLL_AREA, uint16) == SCROLL_PART_HSCROLLBAR_THUMB){
|
||||
int temp_x = x;
|
||||
x -= RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_X, uint16);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_X, uint16) = temp_x;
|
||||
RCT2_CALLPROC_X(0x006E98F2, x, temp_x, state, w->number, (int)w, (int)widget, x);
|
||||
return;
|
||||
}
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SCROLL_AREA, uint16) == SCROLL_PART_HSCROLLBAR_THUMB){
|
||||
int temp_x = x;
|
||||
x -= RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_X, uint16);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_X, uint16) = temp_x;
|
||||
RCT2_CALLPROC_X(0x006E98F2, x, temp_x, state, w->number, (int)w, (int)widget, x);
|
||||
return;
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SCROLL_AREA, uint16) == SCROLL_PART_VSCROLLBAR_THUMB){
|
||||
int temp_y = y;
|
||||
y -= RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_Y, uint16);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_Y, uint16) = temp_y;
|
||||
RCT2_CALLPROC_X(0x006E99A9, temp_y, y, state, w->number, (int)w, (int)widget, y);
|
||||
return;
|
||||
}
|
||||
int scroll_part, scroll_id;
|
||||
widget_scroll_get_part(w, widget, x, y, &x, &y, &scroll_part, &scroll_id);
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SCROLL_AREA, uint16) == SCROLL_PART_VSCROLLBAR_THUMB){
|
||||
int temp_y = y;
|
||||
y -= RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_Y, uint16);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_Y, uint16) = temp_y;
|
||||
RCT2_CALLPROC_X(0x006E99A9, temp_y, y, state, w->number, (int)w, (int)widget, y);
|
||||
return;
|
||||
}
|
||||
int scroll_part, scroll_id;
|
||||
widget_scroll_get_part(w, widget, x, y, &x, &y, &scroll_part, &scroll_id);
|
||||
|
||||
if (scroll_part != RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SCROLL_AREA, uint16)){
|
||||
invalidate_scroll();
|
||||
return;
|
||||
}
|
||||
if (scroll_part != RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SCROLL_AREA, uint16)){
|
||||
invalidate_scroll();
|
||||
return;
|
||||
}
|
||||
|
||||
switch (scroll_part){
|
||||
case SCROLL_PART_VIEW:
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_DRAG], w->number / 18, y, x, y, (int)w, (int)widget, (int)w->event_handlers);
|
||||
break;
|
||||
case SCROLL_PART_HSCROLLBAR_LEFT:
|
||||
RCT2_CALLPROC_X(0x006E9A60, x, y, scroll_part, w->number, (int)w, (int)widget, 0);
|
||||
break;
|
||||
case SCROLL_PART_HSCROLLBAR_RIGHT:
|
||||
RCT2_CALLPROC_X(0x006E9ABF, x, y, scroll_part, w->number, (int)w, (int)widget, 0);
|
||||
break;
|
||||
case SCROLL_PART_HSCROLLBAR_LEFT_TROUGH:
|
||||
case SCROLL_PART_HSCROLLBAR_RIGHT_TROUGH:
|
||||
return;
|
||||
break;
|
||||
case SCROLL_PART_HSCROLLBAR_THUMB:
|
||||
case SCROLL_PART_VSCROLLBAR_TOP:
|
||||
RCT2_CALLPROC_X(0x006E9C37, x, y, scroll_part, w->number, (int)w, (int)widget, 0);
|
||||
break;
|
||||
case SCROLL_PART_VSCROLLBAR_BOTTOM:
|
||||
RCT2_CALLPROC_X(0x006E9C96, x, y, scroll_part, w->number, (int)w, (int)widget, 0);
|
||||
break;
|
||||
case SCROLL_PART_VSCROLLBAR_TOP_TROUGH:
|
||||
case SCROLL_PART_VSCROLLBAR_BOTTOM_TROUGH:
|
||||
return;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
switch (scroll_part){
|
||||
case SCROLL_PART_VIEW:
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_DRAG], w->number / 18, y, x, y, (int)w, (int)widget, (int)w->event_handlers);
|
||||
break;
|
||||
case SCROLL_PART_HSCROLLBAR_LEFT:
|
||||
RCT2_CALLPROC_X(0x006E9A60, x, y, scroll_part, w->number, (int)w, (int)widget, 0);
|
||||
break;
|
||||
case SCROLL_PART_HSCROLLBAR_RIGHT:
|
||||
RCT2_CALLPROC_X(0x006E9ABF, x, y, scroll_part, w->number, (int)w, (int)widget, 0);
|
||||
break;
|
||||
case SCROLL_PART_HSCROLLBAR_LEFT_TROUGH:
|
||||
case SCROLL_PART_HSCROLLBAR_RIGHT_TROUGH:
|
||||
return;
|
||||
break;
|
||||
case SCROLL_PART_HSCROLLBAR_THUMB:
|
||||
case SCROLL_PART_VSCROLLBAR_TOP:
|
||||
RCT2_CALLPROC_X(0x006E9C37, x, y, scroll_part, w->number, (int)w, (int)widget, 0);
|
||||
break;
|
||||
case SCROLL_PART_VSCROLLBAR_BOTTOM:
|
||||
RCT2_CALLPROC_X(0x006E9C96, x, y, scroll_part, w->number, (int)w, (int)widget, 0);
|
||||
break;
|
||||
case SCROLL_PART_VSCROLLBAR_TOP_TROUGH:
|
||||
case SCROLL_PART_VSCROLLBAR_BOTTOM_TROUGH:
|
||||
return;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void input_scroll_end()
|
||||
{
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_RESET;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_RESET;
|
||||
invalidate_scroll();
|
||||
}
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
|
@ -638,8 +639,8 @@ static void input_widget_over(int x, int y, rct_window *w, int widgetIndex)
|
|||
else if (ecx == 0) {
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEOVER], edx, 0, eax, ebx, (int)w, 0, 0);
|
||||
input_update_tooltip(w, widgetIndex, x, y);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
} else {
|
||||
input_update_tooltip(w, widgetIndex, x, y);
|
||||
}
|
||||
|
||||
|
@ -714,7 +715,7 @@ static void input_widget_left(int x, int y, rct_window *w, int widgetIndex)
|
|||
if (w != NULL) {
|
||||
windowClass = w->classification;
|
||||
windowNumber = w->number;
|
||||
}
|
||||
}
|
||||
|
||||
window_close_by_class(WC_ERROR);
|
||||
window_close_by_class(WC_TOOLTIP);
|
||||
|
@ -773,7 +774,7 @@ static void input_widget_left(int x, int y, rct_window *w, int widgetIndex)
|
|||
|
||||
widget_invalidate_by_number(windowClass, windowNumber, widgetIndex);
|
||||
window_event_mouse_down_call(w, widgetIndex);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -781,9 +782,9 @@ static void input_widget_left(int x, int y, rct_window *w, int widgetIndex)
|
|||
#pragma endregion
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* rct2: 0x006ED833
|
||||
*/
|
||||
*/
|
||||
void process_mouse_over(int x, int y)
|
||||
{
|
||||
rct_window* window;
|
||||
|
@ -797,7 +798,7 @@ void process_mouse_over(int x, int y)
|
|||
RCT2_GLOBAL(0x9A9808, sint16) = -1;
|
||||
window = window_find_from_point(x, y);
|
||||
|
||||
if (window != NULL) {
|
||||
if (window != NULL) {
|
||||
widgetId = window_find_widget_from_point(window, x, y);
|
||||
RCT2_GLOBAL(0x1420046, sint16) = (widgetId & 0xFFFF);
|
||||
if (widgetId != -1) {
|
||||
|
@ -807,9 +808,9 @@ void process_mouse_over(int x, int y)
|
|||
if (viewport_interaction_left_over(x, y)) {
|
||||
sub_6ED990(CURSOR_HAND_POINT);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
cursorId = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8);
|
||||
subWindow = window_find_by_number(
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass),
|
||||
|
@ -818,8 +819,8 @@ void process_mouse_over(int x, int y)
|
|||
ebp = (int)subWindow;
|
||||
if (subWindow == NULL)
|
||||
{
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
ebx = ebx & 0xFFFFFF00;
|
||||
edi = cursorId;
|
||||
esi = (int) subWindow;
|
||||
|
@ -829,28 +830,28 @@ void process_mouse_over(int x, int y)
|
|||
{
|
||||
sub_6ED990(cursorId);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case WWT_FRAME:
|
||||
case WWT_RESIZE:
|
||||
if (!(window->flags & 0x100))
|
||||
{
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (window->min_width == window->max_width && window->min_height == window->max_height)
|
||||
{
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (x < window->x + window->width - 0x13)
|
||||
{
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (y < window->y + window->height - 0x13)
|
||||
{
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
cursorId = CURSOR_DIAGONAL_ARROWS;
|
||||
break;
|
||||
break;
|
||||
case WWT_SCROLL:
|
||||
RCT2_GLOBAL(0x9DE558, uint16) = x;
|
||||
RCT2_GLOBAL(0x9DE55A, uint16) = y;
|
||||
|
@ -860,8 +861,8 @@ void process_mouse_over(int x, int y)
|
|||
if (output_scroll_area != SCROLL_PART_VIEW)
|
||||
{
|
||||
cursorId = CURSOR_ARROW;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
//Fall through to default
|
||||
default:
|
||||
ecx = x;
|
||||
|
@ -874,17 +875,17 @@ void process_mouse_over(int x, int y)
|
|||
RCT2_CALLFUNC_X(window->event_handlers[WE_CURSOR], &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
if (ebx == 0xFFFFFFFF) {
|
||||
cursorId = CURSOR_ARROW;
|
||||
break;
|
||||
}
|
||||
cursorId = ebx;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
cursorId = ebx;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
viewport_interaction_right_over(x, y);
|
||||
sub_6ED990(cursorId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -904,16 +905,15 @@ void process_mouse_tool(int x, int y)
|
|||
else
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_UPDATE], x, y, 0, RCT2_GLOBAL(0x9DE546, uint16), (int)w, 0, 0);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006E8DA7
|
||||
*/
|
||||
void input_state_widget_pressed( int x, int y, int state, int widgetIndex, rct_window* w, rct_widget* widget ){
|
||||
//RCT2_CALLPROC_X(0x006E8DA7, x, y, state, widgetIndex, (int)w, (int)widget, 0);
|
||||
//return;
|
||||
void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_window *w, rct_widget *widget)
|
||||
{
|
||||
RCT2_GLOBAL(0x1420054, uint16) = x;
|
||||
RCT2_GLOBAL(0x1420056, uint16) = y;
|
||||
|
||||
|
@ -923,7 +923,7 @@ void input_state_widget_pressed( int x, int y, int state, int widgetIndex, rct_w
|
|||
cursor_w_number = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, rct_windownumber);
|
||||
int cursor_widgetIndex = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, uint32);
|
||||
|
||||
rct_window* cursor_w = window_find_by_number(cursor_w_class, cursor_w_number);
|
||||
rct_window *cursor_w = window_find_by_number(cursor_w_class, cursor_w_number);
|
||||
if (cursor_w == NULL) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = 0;
|
||||
return;
|
||||
|
@ -932,31 +932,33 @@ void input_state_widget_pressed( int x, int y, int state, int widgetIndex, rct_w
|
|||
switch (state){
|
||||
case 0:
|
||||
if (!w || cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
|
||||
break;
|
||||
break;
|
||||
|
||||
if (w->disabled_widgets & (1ULL << widgetIndex))
|
||||
break;
|
||||
|
||||
if (RCT2_GLOBAL(0x9DE528, uint16) != 0) RCT2_GLOBAL(0x9DE528, uint16)++;
|
||||
if (RCT2_GLOBAL(0x009DE528, uint16) != 0)
|
||||
RCT2_GLOBAL(0x009DE528, uint16)++;
|
||||
|
||||
if (w->var_020 & (1ULL << widgetIndex) &&
|
||||
RCT2_GLOBAL(0x9DE528, uint16) >= 0x10 &&
|
||||
(!(RCT2_GLOBAL(0x9DE528, uint16) & 0x3))){
|
||||
if (w->hold_down_widgets & (1ULL << widgetIndex) &&
|
||||
RCT2_GLOBAL(0x009DE528, uint16) >= 16 &&
|
||||
!(RCT2_GLOBAL(0x009DE528, uint16) & 3)
|
||||
) {
|
||||
window_event_mouse_down_call(w, widgetIndex);
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(0x9DE518, uint32) & 1) return;
|
||||
if (RCT2_GLOBAL(0x009DE518, uint32) & 1) return;
|
||||
|
||||
RCT2_GLOBAL(0x9DE518, uint32) |= 1;
|
||||
RCT2_GLOBAL(0x009DE518, uint32) |= 1;
|
||||
widget_invalidate_by_number(cursor_w_class, cursor_w_number, widgetIndex);
|
||||
return;
|
||||
case 3:
|
||||
case 2:
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) == 5){
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) == 5) {
|
||||
if (w) {
|
||||
int dropdown_index = 0;
|
||||
|
||||
if (w->classification == WC_DROPDOWN){
|
||||
if (w->classification == WC_DROPDOWN) {
|
||||
dropdown_index = dropdown_index_from_point(x, y, w);
|
||||
if (dropdown_index == -1)goto dropdown_cleanup;
|
||||
|
||||
|
@ -965,8 +967,7 @@ void input_state_widget_pressed( int x, int y, int state, int widgetIndex, rct_w
|
|||
|
||||
// gDropdownItemsFormat[dropdown_index] will not work until all windows that use dropdown decompiled
|
||||
if (RCT2_ADDRESS(0x9DEBA4, uint16)[dropdown_index] == 0)goto dropdown_cleanup;
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
|
||||
goto dropdown_cleanup;
|
||||
dropdown_index = -1;
|
||||
|
@ -980,7 +981,7 @@ void input_state_widget_pressed( int x, int y, int state, int widgetIndex, rct_w
|
|||
|
||||
window_close_by_class(WC_DROPDOWN);
|
||||
cursor_w = window_find_by_number(cursor_w_class, cursor_w_number);
|
||||
if (RCT2_GLOBAL(0x9DE518, uint32) & 1){
|
||||
if (RCT2_GLOBAL(0x9DE518, uint32) & 1) {
|
||||
RCT2_GLOBAL(0x9DE518, uint32) &= 0xFFFE;
|
||||
widget_invalidate_by_number(cursor_w_class, cursor_w_number, cursor_widgetIndex);
|
||||
}
|
||||
|
@ -1002,24 +1003,24 @@ void input_state_widget_pressed( int x, int y, int state, int widgetIndex, rct_w
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WIDGET_INDEX, uint16) = cursor_widgetIndex;
|
||||
|
||||
if (!w)
|
||||
break;
|
||||
break;
|
||||
|
||||
if (!widget)
|
||||
break;
|
||||
break;
|
||||
|
||||
int mid_point_x = (widget->left + widget->right) / 2 + w->x;
|
||||
sound_play_panned(5, mid_point_x, 0, 0, 0);
|
||||
if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
|
||||
break;
|
||||
break;
|
||||
|
||||
if (w->disabled_widgets & (1ULL << widgetIndex))
|
||||
break;
|
||||
break;
|
||||
|
||||
widget_invalidate_by_number(cursor_w_class, cursor_w_number, widgetIndex);
|
||||
window_event_mouse_up_call(w, widgetIndex);
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(0x9DE528, uint16) = 0;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) != 5){
|
||||
|
@ -1027,9 +1028,9 @@ void input_state_widget_pressed( int x, int y, int state, int widgetIndex, rct_w
|
|||
if (RCT2_GLOBAL(0x9DE518, uint32) & 1){
|
||||
RCT2_GLOBAL(0x9DE518, uint32) &= 0xFFFE;
|
||||
widget_invalidate_by_number(cursor_w_class, cursor_w_number, cursor_widgetIndex);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!w) return;
|
||||
|
||||
|
@ -1067,7 +1068,7 @@ static void input_update_tooltip(rct_window *w, int widgetIndex, int x, int y)
|
|||
|
||||
window_tooltip_open(w, widgetIndex, x, y);
|
||||
// RCT2_CALLPROC_X(0x006EA10D, x, y, 0, widgetIndex, w, widget, 0); // window_tooltip_open();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_CLASS, rct_windowclass) != w->classification ||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_NUMBER, rct_windownumber) != w->number ||
|
||||
|
@ -1170,7 +1171,6 @@ void game_handle_keyboard_input()
|
|||
keyboard_shortcut_handle(key);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_ON_TUTORIAL, uint8) == 0)
|
||||
|
@ -1208,13 +1208,13 @@ void game_handle_keyboard_input()
|
|||
* rct2: 0x00406CD2
|
||||
*/
|
||||
int get_next_key()
|
||||
{
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 221; i++) {
|
||||
if (gKeysPressed[i]) {
|
||||
gKeysPressed[i] = 0;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1238,7 +1238,7 @@ void sub_6ED990(char cursor_id){
|
|||
}
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURENT_CURSOR, uint8) = cursor_id;
|
||||
RCT2_GLOBAL(0x14241BC, uint32) = 2;
|
||||
osinterface_set_cursor(cursor_id);
|
||||
platform_set_cursor(cursor_id);
|
||||
RCT2_GLOBAL(0x14241BC, uint32) = 0;
|
||||
}
|
||||
|
||||
|
@ -1367,4 +1367,4 @@ void game_handle_key_scroll()
|
|||
mainWindow->saved_view_y += scrollY * (12 << mainWindow->viewport->zoom);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_VIEWPORT_SCROLLING;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include "../drawing/drawing.h"
|
||||
#include "../game.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../platform/platform.h"
|
||||
#include "../windows/error.h"
|
||||
#include "screenshot.h"
|
||||
|
@ -71,7 +70,7 @@ void screenshot_check()
|
|||
|
||||
static int screenshot_get_next_path(char *path, int format)
|
||||
{
|
||||
char *screenshotPath = osinterface_get_orct2_homesubfolder("screenshot");
|
||||
char *screenshotPath = platform_get_orct2_homesubfolder("screenshot");
|
||||
if (!platform_ensure_directory_exists(screenshotPath)) {
|
||||
free(screenshotPath);
|
||||
|
||||
|
@ -84,7 +83,7 @@ static int screenshot_get_next_path(char *path, int format)
|
|||
RCT2_GLOBAL(0x013CE952, uint16) = i;
|
||||
|
||||
// Glue together path and filename
|
||||
sprintf(path, "%s%cSCR%d%s", screenshotPath, osinterface_get_path_separator(), i, _screenshot_format_extension[format]);
|
||||
sprintf(path, "%s%cSCR%d%s", screenshotPath, platform_get_path_separator(), i, _screenshot_format_extension[format]);
|
||||
|
||||
if (!platform_file_exists(path)) {
|
||||
return i;
|
||||
|
|
|
@ -339,8 +339,11 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){
|
|||
//return;
|
||||
uint8 zoom = (1 << viewport->zoom);
|
||||
|
||||
sint16 x_diff = (viewport->view_x - x) / zoom;
|
||||
sint16 y_diff = (viewport->view_y - y) / zoom;
|
||||
// Note: do not do the subtraction and then divide!
|
||||
// Note: Due to arithmatic shift != /zoom a shift will have to be used
|
||||
// hopefully when 0x006E7FF3 is finished this can be converted to /zoom.
|
||||
sint16 x_diff = (viewport->view_x >> viewport->zoom) - (x >> viewport->zoom);
|
||||
sint16 y_diff = (viewport->view_y >> viewport->zoom) - (y >> viewport->zoom);
|
||||
|
||||
viewport->view_x = x;
|
||||
viewport->view_y = y;
|
||||
|
@ -527,8 +530,6 @@ void viewport_update_position(rct_window *window)
|
|||
//RCT2_CALLPROC_X(0x6E7DE1, x, y, 0, 0, (int)window, (int)viewport, 0);
|
||||
}
|
||||
|
||||
void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, int top, int right, int bottom);
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00685C02
|
||||
|
|
|
@ -80,6 +80,7 @@ void viewport_create(rct_window *w, int x, int y, int width, int height, int zoo
|
|||
void viewport_update_pointers();
|
||||
void viewport_update_position(rct_window *window);
|
||||
void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, int top, int right, int bottom);
|
||||
void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, int top, int right, int bottom);
|
||||
|
||||
void sub_689174(sint16* x, sint16* y, sint16 *z, uint8 curr_rotation);
|
||||
|
||||
|
|
|
@ -81,8 +81,8 @@ int viewport_interaction_get_item_left(int x, int y, viewport_interaction_info *
|
|||
ride_set_map_tooltip(mapElement);
|
||||
break;
|
||||
case VIEWPORT_INTERACTION_ITEM_PARK:
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 0, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 0, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 2, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32);
|
||||
break;
|
||||
default:
|
||||
info->type = VIEWPORT_INTERACTION_ITEM_NONE;
|
||||
|
@ -190,7 +190,7 @@ int viewport_interaction_get_item_right(int x, int y, viewport_interaction_info
|
|||
case VIEWPORT_INTERACTION_ITEM_RIDE:
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR)
|
||||
return info->type = VIEWPORT_INTERACTION_ITEM_NONE;
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_PATH)
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH)
|
||||
return info->type = VIEWPORT_INTERACTION_ITEM_NONE;
|
||||
|
||||
ride = GET_RIDE(mapElement->properties.track.ride_index);
|
||||
|
@ -199,13 +199,13 @@ int viewport_interaction_get_item_right(int x, int y, viewport_interaction_info
|
|||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 0, uint16) = 1163;
|
||||
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_ENTRANCE) {
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 2, uint16) =
|
||||
mapElement->properties.track.type == ENTRANCE_TYPE_RIDE_ENTRANCE ? 1335 : 1337;
|
||||
} else if (mapElement->properties.track.type == 1 || mapElement->properties.track.type == 2 || mapElement->properties.track.type == 3) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 2, uint16) = 1333;
|
||||
} else {
|
||||
if (!map_is_location_owned(x, y, mapElement->base_height << 4))
|
||||
if (!map_is_location_owned(info->x, info->y, mapElement->base_height << 4))
|
||||
return info->type = VIEWPORT_INTERACTION_ITEM_NONE;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 2, uint16) = ride->name;
|
||||
|
@ -285,10 +285,10 @@ int viewport_interaction_get_item_right(int x, int y, viewport_interaction_info
|
|||
return info->type;
|
||||
|
||||
case VIEWPORT_INTERACTION_ITEM_PARK:
|
||||
if (!(RCT2_ADDRESS_SCREEN_FLAGS & SCREEN_FLAGS_SCENARIO_EDITOR))
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR))
|
||||
break;
|
||||
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) != MAP_ELEMENT_TYPE_ENTRANCE)
|
||||
if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE)
|
||||
break;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 0, uint16) = 1164;
|
||||
|
@ -331,8 +331,8 @@ int viewport_interaction_right_click(int x, int y)
|
|||
return 0;
|
||||
|
||||
case VIEWPORT_INTERACTION_ITEM_SPRITE:
|
||||
if (info.mapElement->type == 0)
|
||||
RCT2_CALLPROC_X(0x006B4857, info.x, 0, info.y, (int)info.sprite, 0, 0, 0);
|
||||
if (info.sprite->unknown.sprite_identifier == SPRITE_IDENTIFIER_VEHICLE)
|
||||
ride_construct(info.sprite->vehicle.ride);
|
||||
break;
|
||||
case VIEWPORT_INTERACTION_ITEM_RIDE:
|
||||
ride_modify(info.mapElement, info.x, info.y);
|
||||
|
@ -397,13 +397,14 @@ static void viewport_interaction_remove_footpath(rct_map_element *mapElement, in
|
|||
if (w != NULL)
|
||||
sub_6A7831();
|
||||
|
||||
mapElement2 = TILE_MAP_ELEMENT_POINTER((y / 32) * 256 + (x / 32));
|
||||
mapElement2 = map_get_first_element_at(x / 32, y / 32);
|
||||
do {
|
||||
if ((mapElement2->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_PATH && mapElement2->base_height == z) {
|
||||
if (map_element_get_type(mapElement2) == MAP_ELEMENT_TYPE_PATH && mapElement2->base_height == z) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_REMOVE_FOOTPATH_FROM_HERE;
|
||||
footpath_remove(x, y, z, 1);
|
||||
break;
|
||||
}
|
||||
} while (!((mapElement2++)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
} while (!map_element_is_last_for_tile(mapElement2++));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -436,7 +437,19 @@ static void viewport_interaction_remove_footpath_item(rct_map_element *mapElemen
|
|||
*/
|
||||
static void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y)
|
||||
{
|
||||
RCT2_CALLPROC_X(0x00666C0E, x, 0, y, (int)mapElement, 0, 0, 0);
|
||||
int rotation = (mapElement->type + 1) & 3;
|
||||
switch (mapElement->properties.entrance.index & 0x0F) {
|
||||
case 1:
|
||||
x += TileDirectionDelta[rotation].x;
|
||||
y += TileDirectionDelta[rotation].y;
|
||||
break;
|
||||
case 2:
|
||||
x -= TileDirectionDelta[rotation].x;
|
||||
y -= TileDirectionDelta[rotation].y;
|
||||
break;
|
||||
}
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_REMOVE_THIS;
|
||||
game_do_command(x, GAME_COMMAND_FLAG_APPLY, y, mapElement->base_height / 2, GAME_COMMAND_REMOVE_PARK_ENTRANCE, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -451,10 +464,10 @@ static void viewport_interaction_remove_park_wall(rct_map_element *mapElement, i
|
|||
if (sceneryEntry->wall.var_0D != 0xFF){
|
||||
window_sign_small_open(mapElement->properties.fence.item[0]);
|
||||
} else {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1158;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_REMOVE_THIS;
|
||||
game_do_command(
|
||||
x,
|
||||
1,
|
||||
GAME_COMMAND_FLAG_APPLY,
|
||||
y,
|
||||
(mapElement->type & 0x3) | (mapElement->base_height << 8),
|
||||
GAME_COMMAND_REMOVE_FENCE,
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include "../game.h"
|
||||
#include "../drawing/drawing.h"
|
||||
#include "../input.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../platform/platform.h"
|
||||
#include "../world/map.h"
|
||||
#include "../world/sprite.h"
|
||||
#include "widget.h"
|
||||
|
@ -319,7 +319,7 @@ static void window_all_wheel_input()
|
|||
w = window_find_from_point(gCursorState.x, gCursorState.y);
|
||||
if (w != NULL) {
|
||||
// Check if main window
|
||||
if (w->classification == WC_MAIN_WINDOW) {
|
||||
if (w->classification == WC_MAIN_WINDOW || w->classification == WC_VIEWPORT) {
|
||||
window_viewport_wheel_input(w, wheel);
|
||||
return;
|
||||
}
|
||||
|
@ -417,7 +417,7 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han
|
|||
w->enabled_widgets = 0;
|
||||
w->disabled_widgets = 0;
|
||||
w->pressed_widgets = 0;
|
||||
w->var_020 = 0;
|
||||
w->hold_down_widgets = 0;
|
||||
w->viewport_focus_coordinates.var_480 = 0;
|
||||
w->viewport_focus_coordinates.x = 0;
|
||||
w->viewport_focus_coordinates.y = 0;
|
||||
|
@ -1007,7 +1007,7 @@ rct_window *window_get_main()
|
|||
|
||||
/**
|
||||
* Based on
|
||||
* rct2: 0x696ee9 & 0x66842F
|
||||
* rct2: 0x696ee9 & 0x66842F & 0x006AF3B3
|
||||
*
|
||||
*/
|
||||
void window_scroll_to_viewport(rct_window *w)
|
||||
|
@ -1654,6 +1654,38 @@ void window_bubble_list_item(rct_window* w, int item_position){
|
|||
w->list_item_positions[item_position + 1] = swap;
|
||||
}
|
||||
|
||||
/* rct2: 0x006ED710
|
||||
* Called after a window resize to move windows if they
|
||||
* are going to be out of sight.
|
||||
*/
|
||||
void window_relocate_windows(int width, int height){
|
||||
int new_location = 8;
|
||||
for (rct_window* w = g_window_list; w < RCT2_NEW_WINDOW; w++){
|
||||
|
||||
// Work out if the window requires moving
|
||||
if (w->x + 10 < width){
|
||||
if (w->flags&(WF_STICK_TO_BACK | WF_STICK_TO_FRONT)){
|
||||
if (w->y -22 < height)continue;
|
||||
}
|
||||
if (w->y + 10 < height)continue;
|
||||
}
|
||||
|
||||
// Calculate the new locations
|
||||
int x = w->x;
|
||||
int y = w->y;
|
||||
w->x = new_location;
|
||||
w->y = new_location + 28;
|
||||
|
||||
// Move the next new location so windows are not directly on top
|
||||
new_location += 8;
|
||||
|
||||
// Adjust the viewport if required.
|
||||
if (w->viewport){
|
||||
w->viewport->x -= x - w->x;
|
||||
w->viewport->y -= y - w->y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* rct2: 0x0066B905
|
||||
|
@ -1808,7 +1840,7 @@ void sub_6EA73F()
|
|||
{
|
||||
rct_window *w;
|
||||
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint8) != 0)
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0)
|
||||
RCT2_GLOBAL(0x01423604, uint32)++;
|
||||
|
||||
for (w = RCT2_LAST_WINDOW; w >= g_window_list; w--) {
|
||||
|
|
|
@ -190,7 +190,7 @@ typedef struct rct_window {
|
|||
uint64 enabled_widgets; // 0x008
|
||||
uint64 disabled_widgets; // 0x010
|
||||
uint64 pressed_widgets; // 0x018
|
||||
uint64 var_020;
|
||||
uint64 hold_down_widgets; // 0x020
|
||||
rct_widget* widgets; // 0x028
|
||||
sint16 x; // 0x02C
|
||||
sint16 y; // 0x02E
|
||||
|
@ -223,7 +223,7 @@ typedef struct rct_window {
|
|||
};
|
||||
sint16 page; // 0x48A
|
||||
sint16 var_48C;
|
||||
sint16 frame_no; // 0x48E updated every tic for motion in windows sprites
|
||||
uint16 frame_no; // 0x48E updated every tic for motion in windows sprites
|
||||
uint16 list_information_type; // 0x490 0 for none, Used as current position of marquee in window_peep
|
||||
sint16 var_492;
|
||||
uint32 var_494;
|
||||
|
@ -397,7 +397,8 @@ enum {
|
|||
WC_CHEATS = 110,
|
||||
WC_RESEARCH = 111,
|
||||
WC_VIEWPORT = 112,
|
||||
WC_TEXTINPUT = 113
|
||||
WC_TEXTINPUT = 113,
|
||||
WC_MAPGEN = 114
|
||||
} WINDOW_CLASS;
|
||||
|
||||
enum PROMPT_MODE {
|
||||
|
@ -481,9 +482,10 @@ void window_update_viewport_ride_music();
|
|||
|
||||
// Open window functions
|
||||
void window_main_open();
|
||||
void window_relocate_windows(int width, int height);
|
||||
void window_resize_gui(int width, int height);
|
||||
void window_resize_gui_scenario_editor(int width, int height);
|
||||
void window_game_top_toolbar_open();
|
||||
void window_top_toolbar_open();
|
||||
void window_game_bottom_toolbar_open();
|
||||
void window_about_open();
|
||||
void window_footpath_open();
|
||||
|
@ -535,9 +537,9 @@ void window_publisher_credits_open();
|
|||
void window_track_manage_open();
|
||||
void window_viewport_open();
|
||||
void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id title, rct_string_id description, rct_string_id existing_text, uint32 existing_args, int maxLength);
|
||||
rct_window *window_mapgen_open();
|
||||
|
||||
void window_editor_main_open();
|
||||
void window_editor_top_toolbar_open();
|
||||
void window_editor_bottom_toolbar_open();
|
||||
void window_editor_object_selection_open();
|
||||
void window_editor_inventions_list_open();
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include "drawing/drawing.h"
|
||||
#include "intro.h"
|
||||
#include "localisation/localisation.h"
|
||||
#include "platform/osinterface.h"
|
||||
#include "platform/platform.h"
|
||||
#include "sprites.h"
|
||||
|
||||
static void screen_intro_process_mouse_input();
|
||||
|
@ -262,7 +262,7 @@ void intro_update()
|
|||
(*part) = 0;
|
||||
|
||||
// Change palette
|
||||
RCT2_CALLPROC_EBPSAFE(0x006837E3);
|
||||
load_palette();
|
||||
|
||||
RCT2_GLOBAL(0x009E2C78, sint32) = 0;
|
||||
gfx_invalidate_screen();
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <windows.h>
|
||||
#include "../addresses.h"
|
||||
#include "../config.h"
|
||||
#include "../game.h"
|
||||
|
@ -342,6 +343,84 @@ void format_currency_2dp(char **dest, long long value)
|
|||
}
|
||||
}
|
||||
|
||||
void format_date(char **dest, uint16 value)
|
||||
{
|
||||
uint16 args[] = { date_get_month(value), date_get_year(value) + 1 };
|
||||
uint16 *argsRef = args;
|
||||
format_string_part(dest, 2736, (char**)&argsRef);
|
||||
(*dest)--;
|
||||
}
|
||||
|
||||
void format_length(char **dest, uint16 value)
|
||||
{
|
||||
rct_string_id stringId = 2733;
|
||||
|
||||
if (gGeneral_config.measurement_format == MEASUREMENT_FORMAT_IMPERIAL) {
|
||||
value = metres_to_feet(value);
|
||||
stringId--;
|
||||
}
|
||||
|
||||
uint16 *argRef = &value;
|
||||
format_string_part(dest, stringId, (char**)&argRef);
|
||||
}
|
||||
|
||||
void format_velocity(char **dest, uint16 value)
|
||||
{
|
||||
rct_string_id stringId = 2734;
|
||||
|
||||
if (gGeneral_config.measurement_format == MEASUREMENT_FORMAT_METRIC) {
|
||||
value = mph_to_kmph(value);
|
||||
stringId++;
|
||||
}
|
||||
|
||||
uint16 *argRef = &value;
|
||||
format_string_part(dest, stringId, (char**)&argRef);
|
||||
}
|
||||
|
||||
void format_duration(char **dest, uint16 value)
|
||||
{
|
||||
uint16 minutes = value / 60;
|
||||
uint16 seconds = value % 60;
|
||||
uint16 args[] = { minutes, seconds };
|
||||
uint16 *argsRef = &args[1];
|
||||
rct_string_id stringId = 2720;
|
||||
|
||||
if (minutes > 0) {
|
||||
stringId += 2;
|
||||
if (minutes != 1)
|
||||
stringId += 2;
|
||||
|
||||
argsRef--;
|
||||
}
|
||||
|
||||
if (seconds != 1)
|
||||
stringId++;
|
||||
|
||||
format_string_part(dest, stringId, (char**)&argsRef);
|
||||
}
|
||||
|
||||
void format_realtime(char **dest, uint16 value)
|
||||
{
|
||||
uint16 hours = value / 60;
|
||||
uint16 minutes = value % 60;
|
||||
uint16 args[] = { hours, minutes };
|
||||
uint16 *argsRef = &args[1];
|
||||
rct_string_id stringId = 2726;
|
||||
|
||||
if (hours > 0) {
|
||||
stringId += 2;
|
||||
if (hours != 1)
|
||||
stringId += 2;
|
||||
|
||||
argsRef--;
|
||||
}
|
||||
|
||||
if (minutes != 1)
|
||||
stringId++;
|
||||
|
||||
format_string_part(dest, stringId, (char**)&argsRef);
|
||||
}
|
||||
|
||||
void format_string_code(unsigned char format_code, char **dest, char **args)
|
||||
{
|
||||
int value;
|
||||
|
@ -418,13 +497,7 @@ void format_string_code(unsigned char format_code, char **dest, char **args)
|
|||
value = *((uint16*)*args);
|
||||
*args += 2;
|
||||
|
||||
uint16 dateArgs[] = { date_get_month(value), date_get_year(value) + 1 };
|
||||
uint16 *dateArgs2 = dateArgs;
|
||||
char formatString[] = "?, Year ?";
|
||||
formatString[0] = FORMAT_MONTH;
|
||||
formatString[8] = FORMAT_COMMA16;
|
||||
format_string_part_from_raw(dest, formatString, (char**)&dateArgs2);
|
||||
(*dest)--;
|
||||
format_date(dest, value);
|
||||
break;
|
||||
case FORMAT_MONTH:
|
||||
// Pop argument
|
||||
|
@ -439,15 +512,7 @@ void format_string_code(unsigned char format_code, char **dest, char **args)
|
|||
value = *((sint16*)*args);
|
||||
*args += 2;
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, uint8)) {
|
||||
format_comma_separated_integer(dest, mph_to_kmph(value));
|
||||
strcpy(*dest, "kmh");
|
||||
*dest += strlen(*dest);
|
||||
} else {
|
||||
format_comma_separated_integer(dest, value);
|
||||
strcpy(*dest, "mph");
|
||||
*dest += strlen(*dest);
|
||||
}
|
||||
format_velocity(dest, value);
|
||||
break;
|
||||
case FORMAT_POP16:
|
||||
*args += 2;
|
||||
|
@ -460,45 +525,21 @@ void format_string_code(unsigned char format_code, char **dest, char **args)
|
|||
value = *((uint16*)*args);
|
||||
*args += 2;
|
||||
|
||||
if (value / 60 > 0) {
|
||||
format_integer(dest, value / 60);
|
||||
strcpy(*dest, value / 60 == 1 ? "min:" : "mins:");
|
||||
*dest += strlen(*dest);
|
||||
}
|
||||
|
||||
format_integer(dest, value % 60);
|
||||
strcpy(*dest, value % 60 == 1 ? "sec" : "secs");
|
||||
*dest += strlen(*dest);
|
||||
format_duration(dest, value);
|
||||
break;
|
||||
case FORMAT_REALTIME:
|
||||
// Pop argument
|
||||
value = *((uint16*)*args);
|
||||
*args += 2;
|
||||
|
||||
if (value / 60 > 0) {
|
||||
format_integer(dest, value / 60);
|
||||
strcpy(*dest, value / 60 == 1 ? "hour:" : "hours:");
|
||||
*dest += strlen(*dest);
|
||||
}
|
||||
|
||||
format_integer(dest, value % 60);
|
||||
strcpy(*dest, value % 60 == 1 ? "min" : "mins");
|
||||
*dest += strlen(*dest);
|
||||
format_realtime(dest, value);
|
||||
break;
|
||||
case FORMAT_LENGTH:
|
||||
// Pop argument
|
||||
value = *((sint16*)*args);
|
||||
*args += 2;
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, uint8)) {
|
||||
format_comma_separated_integer(dest, value);
|
||||
strcpy(*dest, "m");
|
||||
*dest += strlen(*dest);
|
||||
} else {
|
||||
format_comma_separated_integer(dest, metres_to_feet(value));
|
||||
strcpy(*dest, "ft");
|
||||
*dest += strlen(*dest);
|
||||
}
|
||||
format_length(dest, value);
|
||||
break;
|
||||
case FORMAT_SPRITE:
|
||||
// Pop argument
|
||||
|
@ -700,4 +741,13 @@ int get_string_length(char* buffer)
|
|||
}
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength)
|
||||
{
|
||||
utf16 intermediateBuffer[512];
|
||||
|
||||
// TODO this supports only a maximum of 512 characters
|
||||
MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, 512);
|
||||
return WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, maxBufferLength, NULL, NULL);
|
||||
}
|
|
@ -32,8 +32,11 @@ void error_string_quit(int error, rct_string_id format);
|
|||
int get_string_length(char* buffer);
|
||||
|
||||
void user_string_clear_all();
|
||||
rct_string_id user_string_allocate(int base, const char *text);
|
||||
void user_string_free(rct_string_id id);
|
||||
|
||||
int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength);
|
||||
|
||||
#define MAX_USER_STRINGS 1024
|
||||
#define USER_STRING_MAX_LENGTH 32
|
||||
|
||||
|
|
|
@ -485,6 +485,7 @@ enum {
|
|||
STR_YES = 1710,
|
||||
STR_FIRE_STAFF_ID = 1711,
|
||||
|
||||
STR_INVALID_NAME_FOR_PARK = 1716,
|
||||
STR_CANT_RENAME_PARK = 1717,
|
||||
STR_PARK_NAME = 1718,
|
||||
STR_ENTER_PARK_NAME = 1719,
|
||||
|
@ -822,6 +823,7 @@ enum {
|
|||
STR_TILE_SMOOTHING_TIP = 2362,
|
||||
STR_GRIDLINES = 2363,
|
||||
STR_GRIDLINES_TIP = 2364,
|
||||
STR_BANK_REFUSES_TO_INCREASE_LOAN = 2365,
|
||||
STR_CELSIUS = 2366,
|
||||
STR_FAHRENHEIT = 2367,
|
||||
//STR_NONE = 2368,
|
||||
|
@ -1199,9 +1201,25 @@ enum {
|
|||
|
||||
STR_LIST = 3159,
|
||||
|
||||
STR_UNABLE_TO_SELECT_THIS_OBJECT = 3176,
|
||||
STR_UNABLE_TO_DE_SELECT_THIS_OBJECT = 3177,
|
||||
STR_AT_LEAST_ONE_PATH_OBJECT_MUST_BE_SELECTED = 3178,
|
||||
|
||||
STR_INVALID_SELECTION_OF_OBJECTS = 3180,
|
||||
STR_OBJECT_SELECTION = 3181,
|
||||
STR_PARK_ENTRANCE_TYPE_MUST_BE_SELECTED = 3182,
|
||||
STR_WATER_TYPE_MUST_BE_SELECTED = 3183,
|
||||
STR_OBJECT_SELECTION_RIDE_VEHICLES_ATTRACTIONS = 3184,
|
||||
STR_OBJECT_SELECTION_SMALL_SCENERY = 3185,
|
||||
STR_OBJECT_SELECTION_LARGE_SCENERY = 3186,
|
||||
STR_OBJECT_SELECTION_WALLS_FENCES = 3187,
|
||||
STR_OBJECT_SELECTION_PATH_SIGNS = 3188,
|
||||
STR_OBJECT_SELECTION_FOOTPATHS = 3189,
|
||||
STR_OBJECT_SELECTION_PATH_EXTRAS = 3190,
|
||||
STR_OBJECT_SELECTION_SCENERY_GROUPS = 3191,
|
||||
STR_OBJECT_SELECTION_PARK_ENTRANCE = 3192,
|
||||
STR_OBJECT_SELECTION_WATER = 3193,
|
||||
STR_OBJECT_SELECTION_SCENARIO_DESCRIPTION = 3194,
|
||||
|
||||
STR_INVENTION_LIST = 3195,
|
||||
|
||||
|
@ -1296,6 +1314,8 @@ enum {
|
|||
STR_PARK_ENTRANCE_WRONG_DIRECTION_OR_NO_PATH = 3332,
|
||||
STR_SAVE_PLUGIN_DATA = 3333,
|
||||
STR_SAVE_PLUGIN_DATA_TIP = 3334,
|
||||
STR_ROLLER_COASTER_DESIGNER_SELECT_RIDE_TYPES_VEHICLES = 3335,
|
||||
STR_TRACK_DESIGNS_MANAGER_SELECT_RIDE_TYPE = 3336,
|
||||
STR_SIX_FLAGS_PARK = 3337,
|
||||
|
||||
STR_GAME_TOOLS = 3341,
|
||||
|
@ -1317,9 +1337,16 @@ enum {
|
|||
|
||||
STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING = 3362,
|
||||
STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING_TIP = 3363,
|
||||
STR_OBJECT_SELECTION_ADVANCED = 3364,
|
||||
STR_OBJECT_SELECTION_ADVANCED_TIP = 3365,
|
||||
|
||||
STR_MAP_RIDE = 3366,
|
||||
|
||||
STR_WARNING_TOO_MANY_OBJECTS_SELECTED = 3374,
|
||||
STR_NOT_ALL_OBJECTS_IN_THIS_SCENERY_GROUP_COULD_BE_SELECTED = 3375,
|
||||
STR_INSTALL_NEW_TRACK_DESIGN = 3376,
|
||||
STR_INSTALL_NEW_TRACK_DESIGN_TIP = 3377,
|
||||
|
||||
STR_TUTORIAL_BEGINNERS = 3385,
|
||||
STR_TUTORIAL_CUSTOM_RIDES = 3386,
|
||||
STR_TUTORIAL_ROLLER_COASTER = 3387,
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "localisation.h"
|
||||
|
||||
char *gUserStrings = (char*)0x0135A8F4;
|
||||
|
@ -31,6 +32,21 @@ void user_string_clear_all()
|
|||
memset(gUserStrings, 0, MAX_USER_STRINGS * USER_STRING_MAX_LENGTH);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006C421D
|
||||
*/
|
||||
rct_string_id user_string_allocate(int base, const char *text)
|
||||
{
|
||||
int eax, ebx, ecx, edx, esi, edi, ebp;
|
||||
|
||||
ecx = base;
|
||||
edi = (int)text;
|
||||
RCT2_CALLFUNC_X(0x006C421D, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
|
||||
return eax & 0xFFFF;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006C42AC
|
||||
|
|
|
@ -412,13 +412,13 @@ static int award_is_deserved_most_disappointing(int awardType, int activeAwardTy
|
|||
disappointingRides = 0;
|
||||
|
||||
FOR_ALL_RIDES(i, ride) {
|
||||
if (ride->excitement == 0xFFFF || ride->var_158 == 0xFF)
|
||||
if (ride->excitement == 0xFFFF || ride->popularity == 0xFF)
|
||||
continue;
|
||||
|
||||
countedRides++;
|
||||
|
||||
// Satification maybe?
|
||||
if (ride->var_158 <= 6)
|
||||
// Unpopular
|
||||
if (ride->popularity <= 6)
|
||||
disappointingRides++;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,9 @@
|
|||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../game.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../peep/peep.h"
|
||||
#include "../ride/ride.h"
|
||||
#include "../world/park.h"
|
||||
|
@ -42,6 +44,8 @@ const money32 research_cost_table[4] = {
|
|||
MONEY(400,00) // Maximum funding
|
||||
};
|
||||
|
||||
int dword_988E60[] = { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0 };
|
||||
|
||||
/**
|
||||
* Pay an amount of money.
|
||||
* rct2: 0x069C674
|
||||
|
@ -56,7 +60,7 @@ void finance_payment(money32 amount, rct_expenditure_type type)
|
|||
//overflow check
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32) = ENCRYPT_MONEY(new_money);
|
||||
RCT2_ADDRESS(RCT2_ADDRESS_EXPENDITURE_TABLE, money32)[type] -= amount;
|
||||
if (RCT2_ADDRESS(0x00988E60, uint32)[type] & 1)
|
||||
if (dword_988E60[type] & 1)
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_EXPENDITURE, money32) -= amount; // Cumulative amount of money spent this day
|
||||
|
||||
|
||||
|
@ -131,7 +135,7 @@ void finance_pay_ride_upkeep()
|
|||
if (upkeep != -1) {
|
||||
ride->total_profit -= upkeep;
|
||||
ride->var_14D |= 2;
|
||||
finance_payment(upkeep, RCT2_EXPENDITURE_TYPE_RIDE_UPKEEP);
|
||||
finance_payment(upkeep, RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -239,7 +243,7 @@ void sub_69E869()
|
|||
{
|
||||
// This subroutine is loan related and is used for cheat detection
|
||||
sint32 value = 0x70093A;
|
||||
value -= RCT2_GLOBAL(0x013573DC, money32); // Cheat detection
|
||||
value -= RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32);
|
||||
value = ror32(value, 5);
|
||||
value -= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32);
|
||||
value = ror32(value, 7);
|
||||
|
@ -247,3 +251,50 @@ void sub_69E869()
|
|||
value = ror32(value, 3);
|
||||
RCT2_GLOBAL(0x013587C4, sint32) = value;
|
||||
}
|
||||
|
||||
void finance_set_loan(money32 loan)
|
||||
{
|
||||
game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, loan, GAME_COMMAND_SET_CURRENT_LOAN, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0069DFB3
|
||||
*/
|
||||
void game_command_set_current_loan(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp)
|
||||
{
|
||||
money32 money, loanDifference, currentLoan;
|
||||
money32 newLoan = *edx;
|
||||
|
||||
currentLoan = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32);
|
||||
money = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32));
|
||||
loanDifference = currentLoan - newLoan;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_INTEREST * 4;
|
||||
if (newLoan > currentLoan) {
|
||||
if (newLoan > RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BANK_REFUSES_TO_INCREASE_LOAN;
|
||||
*ebx = MONEY32_UNDEFINED;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (loanDifference > money) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_NOT_ENOUGH_CASH_AVAILABLE;
|
||||
*ebx = MONEY32_UNDEFINED;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
|
||||
money -= loanDifference;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = newLoan;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) = money;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(money);
|
||||
sub_69E869();
|
||||
|
||||
window_invalidate_by_class(WC_FINANCES);
|
||||
RCT2_GLOBAL(0x009A9804, uint16) |= 1;
|
||||
}
|
||||
|
||||
*ebx = 0;
|
||||
}
|
|
@ -26,10 +26,20 @@
|
|||
typedef int rct_expenditure_type;
|
||||
|
||||
enum {
|
||||
RCT2_EXPENDITURE_TYPE_RIDE_UPKEEP = 1,
|
||||
RCT_EXPENDITURE_TYPE_WAGES = 10,
|
||||
RCT_EXPENDITURE_TYPE_RESEARCH = 12,
|
||||
RCT_EXPENDITURE_TYPE_INTEREST = 13
|
||||
RCT_EXPENDITURE_TYPE_RIDE_CONSRUCTION,
|
||||
RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS,
|
||||
RCT_EXPENDITURE_TYPE_LAND_PURCHASE,
|
||||
RCT_EXPENDITURE_TYPE_LANDSCAPING,
|
||||
RCT_EXPENDITURE_TYPE_PARK_ENTRANCE_TICKETS,
|
||||
RCT_EXPENDITURE_TYPE_PARK_RIDE_TICKETS,
|
||||
RCT_EXPENDITURE_TYPE_SHOP_SHOP_SALES,
|
||||
RCT_EXPENDITURE_TYPE_SHOP_STOCK,
|
||||
RCT_EXPENDITURE_TYPE_FOODDRINK_SALES,
|
||||
RCT_EXPENDITURE_TYPE_FOODDRINK_STOCK,
|
||||
RCT_EXPENDITURE_TYPE_WAGES,
|
||||
RCT_EXPENDITURE_TYPE_MARKETING,
|
||||
RCT_EXPENDITURE_TYPE_RESEARCH,
|
||||
RCT_EXPENDITURE_TYPE_INTEREST
|
||||
};
|
||||
|
||||
extern const money32 research_cost_table[4];
|
||||
|
@ -44,4 +54,7 @@ void finance_init();
|
|||
void finance_update_daily_profit();
|
||||
void sub_69E869();
|
||||
|
||||
void finance_set_loan(money32 loan);
|
||||
void game_command_set_current_loan(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
|
||||
|
||||
#endif
|
|
@ -19,8 +19,10 @@
|
|||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../game.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../management/finance.h"
|
||||
#include "../ride/ride.h"
|
||||
#include "marketing.h"
|
||||
#include "news_item.h"
|
||||
|
@ -36,6 +38,9 @@ const money16 AdvertisingCampaignPricePerWeek[] = {
|
|||
|
||||
const int advertisingCampaignGuestGenerationProbabilities[] = { 400, 300, 200, 200, 250, 200 };
|
||||
|
||||
uint8 *gMarketingCampaignDaysLeft = RCT2_ADDRESS(0x01358102, uint8);
|
||||
uint8 *gMarketingCampaignRideIndex = RCT2_ADDRESS(0x01358116, uint8);
|
||||
|
||||
int marketing_get_campaign_guest_generation_probability(int campaign)
|
||||
{
|
||||
int probability = advertisingCampaignGuestGenerationProbabilities[campaign];
|
||||
|
@ -52,7 +57,7 @@ int marketing_get_campaign_guest_generation_probability(int campaign)
|
|||
probability /= 8;
|
||||
break;
|
||||
case ADVERTISING_CAMPAIGN_RIDE_FREE:
|
||||
ride = &g_ride_list[RCT2_ADDRESS(0x01358116, uint8)[campaign]];
|
||||
ride = &g_ride_list[gMarketingCampaignRideIndex[campaign]];
|
||||
if (ride->price < 3)
|
||||
probability /= 8;
|
||||
break;
|
||||
|
@ -68,33 +73,32 @@ int marketing_get_campaign_guest_generation_probability(int campaign)
|
|||
void marketing_update()
|
||||
{
|
||||
for (int campaign = 0; campaign < ADVERTISING_CAMPAIGN_COUNT; campaign++) {
|
||||
uint8 campaign_weeks_left = RCT2_ADDRESS(0x01358102, uint8)[campaign];
|
||||
if (campaign_weeks_left == 0)
|
||||
int active = (gMarketingCampaignDaysLeft[campaign] & CAMPAIGN_ACTIVE_FLAG) != 0;
|
||||
if (gMarketingCampaignDaysLeft[campaign] == 0)
|
||||
continue;
|
||||
|
||||
window_invalidate_by_class(WC_FINANCES);
|
||||
|
||||
// High bit marks the campaign as inactive, on first check the campaign is set actice
|
||||
// High bit marks the campaign as inactive, on first check the campaign is set active
|
||||
// this makes campaigns run a full x weeks even when started in the middle of a week
|
||||
RCT2_ADDRESS(0x01358102, uint8)[campaign] &= ~(1 << 7);
|
||||
if (campaign_weeks_left & (1 << 7))
|
||||
gMarketingCampaignDaysLeft[campaign] &= ~CAMPAIGN_ACTIVE_FLAG;
|
||||
if (active)
|
||||
continue;
|
||||
|
||||
RCT2_ADDRESS(0x01358102, uint8)[campaign]--;
|
||||
if (campaign_weeks_left - 1 != 0)
|
||||
if (--gMarketingCampaignDaysLeft[campaign] != 0)
|
||||
continue;
|
||||
|
||||
int campaign_item = RCT2_ADDRESS(0x01358116, uint8)[campaign];
|
||||
int campaignItem = gMarketingCampaignRideIndex[campaign];
|
||||
|
||||
// This sets the string parameters for the marketing types that have an argument.
|
||||
if (campaign == ADVERTISING_CAMPAIGN_RIDE_FREE || campaign == ADVERTISING_CAMPAIGN_RIDE) {
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x01362942 + 304 * campaign_item, uint16);
|
||||
RCT2_GLOBAL(0x013CE954, uint32) = RCT2_GLOBAL(0x01362944 + 152 * campaign_item, uint32);
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x01362942 + 304 * campaignItem, uint16);
|
||||
RCT2_GLOBAL(0x013CE954, uint32) = RCT2_GLOBAL(0x01362944 + 152 * campaignItem, uint32);
|
||||
} else if (campaign == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) {
|
||||
campaign_item += 2016;
|
||||
if (campaign_item >= 2048)
|
||||
campaign_item += 96;
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = campaign_item;
|
||||
campaignItem += 2016;
|
||||
if (campaignItem >= 2048)
|
||||
campaignItem += 96;
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = campaignItem;
|
||||
}
|
||||
|
||||
news_item_add_to_queue(NEWS_ITEM_MONEY, STR_MARKETING_FINISHED_BASE + campaign, 0);
|
||||
|
@ -111,8 +115,8 @@ void marketing_set_guest_campaign(rct_peep *peep, int campaign)
|
|||
case ADVERTISING_CAMPAIGN_RIDE_FREE:
|
||||
peep->item_standard_flags |= PEEP_ITEM_VOUCHER;
|
||||
peep->voucher_type = VOUCHER_TYPE_RIDE_FREE;
|
||||
peep->voucher_arguments = RCT2_ADDRESS(0x01358116, uint8)[campaign];
|
||||
peep->guest_heading_to_ride_id = RCT2_ADDRESS(0x01358116, uint8)[campaign];
|
||||
peep->voucher_arguments = gMarketingCampaignRideIndex[campaign];
|
||||
peep->guest_heading_to_ride_id = gMarketingCampaignRideIndex[campaign];
|
||||
peep->var_C6 = 240;
|
||||
break;
|
||||
case ADVERTISING_CAMPAIGN_PARK_ENTRY_HALF_PRICE:
|
||||
|
@ -122,13 +126,46 @@ void marketing_set_guest_campaign(rct_peep *peep, int campaign)
|
|||
case ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE:
|
||||
peep->item_standard_flags |= PEEP_ITEM_VOUCHER;
|
||||
peep->voucher_type = VOUCHER_TYPE_FOOD_OR_DRINK_FREE;
|
||||
peep->voucher_arguments = RCT2_ADDRESS(0x01358116, uint8)[campaign];
|
||||
peep->voucher_arguments = gMarketingCampaignRideIndex[campaign];
|
||||
break;
|
||||
case ADVERTISING_CAMPAIGN_PARK:
|
||||
break;
|
||||
case ADVERTISING_CAMPAIGN_RIDE:
|
||||
peep->guest_heading_to_ride_id = RCT2_ADDRESS(0x01358116, uint8)[campaign];
|
||||
peep->guest_heading_to_ride_id = gMarketingCampaignRideIndex[campaign];
|
||||
peep->var_C6 = 240;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void marketing_start_campaign(int type, int rideOrItem, int numWeeks)
|
||||
{
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_START_MARKETING_CAMPAIGN;
|
||||
game_do_command(0, (numWeeks << 8) | GAME_COMMAND_FLAG_APPLY, 0, (rideOrItem << 8) | type, GAME_COMMAND_START_MARKETING_CAMPAIGN, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0069E73C
|
||||
*/
|
||||
void game_command_start_campaign(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp)
|
||||
{
|
||||
int type = *edx & 0xFF;
|
||||
int rideOrItem = (*edx >> 8) & 0xFF;
|
||||
int numWeeks = (*ebx >> 8) & 0xFF;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_MARKETING * 4;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_MARKETING_CAMPAIGN) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 3048;
|
||||
*ebx = MONEY32_UNDEFINED;
|
||||
return;
|
||||
}
|
||||
|
||||
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
|
||||
gMarketingCampaignDaysLeft[type] = numWeeks | CAMPAIGN_ACTIVE_FLAG;
|
||||
gMarketingCampaignRideIndex[type] = rideOrItem;
|
||||
|
||||
window_invalidate_by_class(WC_FINANCES);
|
||||
}
|
||||
|
||||
*ebx = numWeeks * AdvertisingCampaignPricePerWeek[type];
|
||||
}
|
|
@ -41,10 +41,16 @@ enum{
|
|||
VOUCHER_TYPE_FOOD_OR_DRINK_FREE,
|
||||
};
|
||||
|
||||
#define CAMPAIGN_ACTIVE_FLAG (1 << 7)
|
||||
|
||||
extern const money16 AdvertisingCampaignPricePerWeek[6];
|
||||
extern uint8 *gMarketingCampaignDaysLeft;
|
||||
extern uint8 *gMarketingCampaignRideIndex;
|
||||
|
||||
int marketing_get_campaign_guest_generation_probability(int campaign);
|
||||
void marketing_update();
|
||||
void marketing_set_guest_campaign(rct_peep *peep, int campaign);
|
||||
void marketing_start_campaign(int type, int rideOrItem, int numWeeks);
|
||||
void game_command_start_campaign(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
|
||||
|
||||
#endif
|
|
@ -19,12 +19,14 @@
|
|||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../game.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../localisation/date.h"
|
||||
#include "../management/finance.h"
|
||||
#include "../scenario.h"
|
||||
#include "../world/scenery.h"
|
||||
#include "news_item.h"
|
||||
#include "research.h"
|
||||
#include "../scenario.h"
|
||||
|
||||
const int _researchRate[] = { 0, 160, 250, 400 };
|
||||
|
||||
|
@ -262,7 +264,10 @@ void research_update()
|
|||
}
|
||||
}
|
||||
|
||||
/* rct2: 0x684AC3*/
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00684AC3
|
||||
*/
|
||||
void sub_684AC3(){
|
||||
rct_research_item* research = gResearchItems;
|
||||
for (; research->entryIndex != -2; research++);
|
||||
|
@ -317,4 +322,39 @@ void sub_684AC3(){
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, sint32) = -1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16) = 0;
|
||||
}
|
||||
|
||||
void research_set_funding(int amount)
|
||||
{
|
||||
game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, amount, GAME_COMMAND_SET_RESEARCH_FUNDING, 0, 0);
|
||||
|
||||
}
|
||||
|
||||
void research_set_priority(int activeCategories)
|
||||
{
|
||||
game_do_command(0, (1 << 8) | GAME_COMMAND_FLAG_APPLY, 0, activeCategories, GAME_COMMAND_SET_RESEARCH_FUNDING, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00684A7F
|
||||
*/
|
||||
void game_command_set_research_funding(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp)
|
||||
{
|
||||
int setPriorities = (*ebx & (1 << 8)) != 0;
|
||||
int fundingAmount = *edx;
|
||||
int activeCategories = *edx;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RESEARCH * 4;
|
||||
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
|
||||
if (!setPriorities)
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8) = fundingAmount;
|
||||
else
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint8) = activeCategories;
|
||||
|
||||
window_invalidate_by_class(WC_FINANCES);
|
||||
window_invalidate_by_class(WC_RESEARCH);
|
||||
}
|
||||
|
||||
*ebx = 0;
|
||||
}
|
|
@ -55,4 +55,8 @@ void research_update_uncompleted_types();
|
|||
void research_update();
|
||||
void sub_684AC3();
|
||||
|
||||
void research_set_funding(int amount);
|
||||
void research_set_priority(int activeCategories);
|
||||
void game_command_set_research_funding(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
|
||||
|
||||
#endif
|
21
src/object.c
21
src/object.c
|
@ -21,7 +21,6 @@
|
|||
#include "addresses.h"
|
||||
#include "localisation/localisation.h"
|
||||
#include "object.h"
|
||||
#include "platform/osinterface.h"
|
||||
#include "platform/platform.h"
|
||||
#include "util/sawyercoding.h"
|
||||
|
||||
|
@ -51,7 +50,7 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi
|
|||
|
||||
subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), (char*)installedObject + 16);
|
||||
|
||||
// log_verbose("loading object, %s", path);
|
||||
log_verbose("loading object, %s", path);
|
||||
|
||||
file = fopen(path, "rb");
|
||||
if (file == NULL)
|
||||
|
@ -495,7 +494,7 @@ int object_get_scenario_text(rct_object_entry *entry)
|
|||
void object_free_scenario_text()
|
||||
{
|
||||
if (RCT2_GLOBAL(0x009ADAF8, void*) != NULL) {
|
||||
free(RCT2_GLOBAL(0x009ADAF8, void*));
|
||||
rct2_free(RCT2_GLOBAL(0x009ADAF8, void*));
|
||||
RCT2_GLOBAL(0x009ADAF8, void*) = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -534,4 +533,20 @@ rct_object_entry *object_get_next(rct_object_entry *entry)
|
|||
pos += 4;
|
||||
|
||||
return (rct_object_entry*)pos;
|
||||
}
|
||||
|
||||
char *object_get_name(rct_object_entry *entry)
|
||||
{
|
||||
uint8 *pos = (uint8*)entry;
|
||||
|
||||
// Skip sizeof(rct_object_entry)
|
||||
pos += 16;
|
||||
|
||||
// Skip filename
|
||||
while (*pos++);
|
||||
|
||||
// Skip
|
||||
pos += 4;
|
||||
|
||||
return pos;
|
||||
}
|
|
@ -87,7 +87,11 @@ int object_calculate_checksum(const rct_object_entry *entry, const char *data, i
|
|||
int object_paint(int type, int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp);
|
||||
rct_object_entry *object_get_next(rct_object_entry *entry);
|
||||
int sub_6A9F42(FILE *file, rct_object_entry* entry);
|
||||
void sub_6A9FC0();
|
||||
int find_object_in_entry_group(rct_object_entry* entry, uint8* entry_type, uint8* entry_index);
|
||||
|
||||
rct_object_entry *object_list_find(rct_object_entry *entry);
|
||||
|
||||
char *object_get_name(rct_object_entry *entry);
|
||||
|
||||
#endif
|
|
@ -22,7 +22,6 @@
|
|||
#include "localisation/localisation.h"
|
||||
#include "object.h"
|
||||
#include "platform/platform.h"
|
||||
#include "platform/osinterface.h"
|
||||
#include "ride/track.h"
|
||||
#include "util/sawyercoding.h"
|
||||
|
||||
|
@ -79,7 +78,7 @@ rct_object_entry_group object_entry_groups[] = {
|
|||
(uint8**)(0x009ACFA4 + (699 * 4)), (rct_object_entry_extended*)(0x00F3F03C + (699 * 20)), // scenery sets
|
||||
(uint8**)(0x009ACFA4 + (718 * 4)), (rct_object_entry_extended*)(0x00F3F03C + (718 * 20)), // park entrance
|
||||
(uint8**)(0x009ACFA4 + (719 * 4)), (rct_object_entry_extended*)(0x00F3F03C + (719 * 20)), // water
|
||||
(uint8**)(0x009ACFA4 + (720 * 4)), (rct_object_entry_extended*)(0x00F3F03C + (720 * 20)) // scenario text
|
||||
(uint8**)(0x009ACFA4 + (720 * 4)), (rct_object_entry_extended*)(0x00F3F03C + (720 * 20)) // scenario text
|
||||
};
|
||||
|
||||
static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int fileDateModifiedChecksum);
|
||||
|
@ -90,11 +89,61 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in
|
|||
|
||||
static void get_plugin_path(char *path)
|
||||
{
|
||||
char *homePath = osinterface_get_orct2_homefolder();
|
||||
sprintf(path, "%s%c%s", homePath, osinterface_get_path_separator(), "plugin.dat");
|
||||
char *homePath = platform_get_orct2_homefolder();
|
||||
sprintf(path, "%s%c%s", homePath, platform_get_path_separator(), "plugin.dat");
|
||||
free(homePath);
|
||||
}
|
||||
|
||||
static void object_list_sort()
|
||||
{
|
||||
rct_object_entry **objectBuffer, *newBuffer, *entry, *destEntry, *lowestEntry;
|
||||
int numObjects, i, j, bufferSize, entrySize, lowestIndex;
|
||||
char *objectName, *lowestString;
|
||||
uint8 *copied;
|
||||
|
||||
objectBuffer = &RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
|
||||
numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32);
|
||||
copied = calloc(numObjects, sizeof(uint8));
|
||||
|
||||
// Get buffer size
|
||||
entry = *objectBuffer;
|
||||
for (i = 0; i < numObjects; i++)
|
||||
entry = object_get_next(entry);
|
||||
bufferSize = (int)entry - (int)*objectBuffer;
|
||||
|
||||
// Create new buffer
|
||||
newBuffer = rct2_malloc(bufferSize);
|
||||
destEntry = newBuffer;
|
||||
|
||||
// Copy over sorted objects
|
||||
for (i = 0; i < numObjects; i++) {
|
||||
// Find next lowest string
|
||||
lowestString = NULL;
|
||||
entry = *objectBuffer;
|
||||
for (j = 0; j < numObjects; j++) {
|
||||
if (!copied[j]) {
|
||||
objectName = object_get_name(entry);
|
||||
if (lowestString == NULL || strcmp(objectName, lowestString) < 0) {
|
||||
lowestEntry = entry;
|
||||
lowestString = objectName;
|
||||
lowestIndex = j;
|
||||
}
|
||||
}
|
||||
entry = object_get_next(entry);
|
||||
}
|
||||
entrySize = object_get_length(lowestEntry);
|
||||
memcpy(destEntry, lowestEntry, entrySize);
|
||||
destEntry = (rct_object_entry*)((int)destEntry + entrySize);
|
||||
copied[lowestIndex] = 1;
|
||||
}
|
||||
|
||||
// Replace old buffer
|
||||
rct2_free(*objectBuffer);
|
||||
*objectBuffer = newBuffer;
|
||||
|
||||
free(copied);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006A93CD
|
||||
|
@ -111,6 +160,7 @@ static void object_list_examine()
|
|||
|
||||
object = object_get_next(object);
|
||||
}
|
||||
object_list_sort();
|
||||
|
||||
// Create a search index
|
||||
object_list_create_hash_table();
|
||||
|
@ -136,7 +186,7 @@ void sub_6A9FC0()
|
|||
for (int j = 0; j < object_entry_group_counts[type]; j++){
|
||||
uint8* chunk = object_entry_groups[type].chunks[j];
|
||||
if (chunk != (uint8*)-1)
|
||||
object_paint(type, 0, 0, 0, 0, (int)chunk, 0, 0);
|
||||
object_paint(type, 0, j, type, 0, (int)chunk, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -194,8 +244,10 @@ void object_list_load()
|
|||
|
||||
// Reload object list
|
||||
|
||||
if (RCT2_GLOBAL(0x9AA00D, uint8) != 0)
|
||||
RCT2_GLOBAL(0x9AA00D, uint8) = 0;
|
||||
// RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS used to control if this was the first time loading objects
|
||||
// and display the starting RCT2 for the first time message.
|
||||
//if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, uint8) != 0)
|
||||
// RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, uint8) = 0;
|
||||
|
||||
sub_6A9FC0();
|
||||
|
||||
|
@ -390,6 +442,7 @@ int object_read_and_load_entries(FILE *file)
|
|||
entries = malloc(OBJECT_ENTRY_COUNT * sizeof(rct_object_entry));
|
||||
sawyercoding_read_chunk(file, (uint8*)entries);
|
||||
|
||||
uint8 load_fail = 0;
|
||||
// Load each object
|
||||
for (i = 0; i < OBJECT_ENTRY_COUNT; i++) {
|
||||
if (!check_object_entry(&entries[i]))
|
||||
|
@ -407,14 +460,18 @@ int object_read_and_load_entries(FILE *file)
|
|||
if (!object_load(entryGroupIndex, &entries[i], NULL)) {
|
||||
log_error("failed to load entry: %.8s", entries[i].name);
|
||||
memcpy((char*)0x13CE952, &entries[i], sizeof(rct_object_entry));
|
||||
free(entries);
|
||||
object_unload_all();
|
||||
RCT2_GLOBAL(0x14241BC, uint32) = 0;
|
||||
return 0;
|
||||
load_fail = 1;
|
||||
}
|
||||
}
|
||||
|
||||
free(entries);
|
||||
free(entries);
|
||||
if (load_fail){
|
||||
object_unload_all();
|
||||
RCT2_GLOBAL(0x14241BC, uint32) = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_verbose("finished loading required objects");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -481,11 +538,35 @@ void object_list_create_hash_table()
|
|||
// Set hash table slot
|
||||
_installedObjectHashTable[index] = installedObject;
|
||||
|
||||
// Next installde object
|
||||
// Next installed object
|
||||
installedObject = object_get_next(installedObject);
|
||||
}
|
||||
}
|
||||
|
||||
/* 0x006A9DA2
|
||||
* bl = entry_index
|
||||
* ecx = entry_type
|
||||
*/
|
||||
int find_object_in_entry_group(rct_object_entry* entry, uint8* entry_type, uint8* entry_index){
|
||||
*entry_type = entry->flags & 0xF;
|
||||
|
||||
rct_object_entry_group entry_group = object_entry_groups[*entry_type];
|
||||
for (*entry_index = 0;
|
||||
*entry_index < object_entry_group_counts[*entry_type];
|
||||
++(*entry_index),
|
||||
entry_group.chunks++,
|
||||
entry_group.entries++){
|
||||
|
||||
if (*entry_group.chunks == (uint8*)-1) continue;
|
||||
|
||||
if (object_entry_compare((rct_object_entry*)entry_group.entries, entry))break;
|
||||
}
|
||||
|
||||
if (*entry_index == object_entry_group_counts[*entry_type])return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
rct_object_entry *object_list_find(rct_object_entry *entry)
|
||||
{
|
||||
uint32 hash = object_get_hash_code(entry);
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
#include "localisation/localisation.h"
|
||||
#include "openrct2.h"
|
||||
#include "platform/platform.h"
|
||||
#include "platform/osinterface.h"
|
||||
#include "util/sawyercoding.h"
|
||||
#include "world/mapgen.h"
|
||||
|
||||
int gOpenRCT2StartupAction = STARTUP_ACTION_TITLE;
|
||||
char gOpenRCT2StartupActionPath[512] = { 0 };
|
||||
|
@ -77,15 +77,17 @@ void openrct2_launch()
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING;
|
||||
break;
|
||||
case STARTUP_ACTION_EDIT:
|
||||
if (strlen(gOpenRCT2StartupActionPath) == 0)
|
||||
if (strlen(gOpenRCT2StartupActionPath) == 0) {
|
||||
editor_load();
|
||||
else
|
||||
} else {
|
||||
editor_load_landscape(gOpenRCT2StartupActionPath);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
log_verbose("begin openrct2 loop");
|
||||
openrct2_loop();
|
||||
osinterface_free();
|
||||
platform_free();
|
||||
|
||||
// HACK Some threads are still running which causes the game to not terminate. Investigation required!
|
||||
exit(gExitCode);
|
||||
|
@ -110,9 +112,9 @@ static void openrct2_loop()
|
|||
|
||||
lastTick = currentTick;
|
||||
|
||||
osinterface_process_messages();
|
||||
platform_process_messages();
|
||||
rct2_update();
|
||||
osinterface_draw();
|
||||
platform_draw();
|
||||
} while (!_finished);
|
||||
}
|
||||
|
||||
|
|
986
src/peep/peep.c
986
src/peep/peep.c
File diff suppressed because it is too large
Load Diff
|
@ -202,7 +202,7 @@ enum PEEP_STATE {
|
|||
PEEP_STATE_BUYING = 17,
|
||||
PEEP_STATE_WATCHING = 18,
|
||||
PEEP_STATE_EMPTYING_BIN = 19,
|
||||
PEEP_STATE_20 = 20,
|
||||
PEEP_STATE_USING_BIN = 20,
|
||||
PEEP_STATE_WATERING = 21,
|
||||
PEEP_STATE_HEADING_TO_INSPECTION = 22,
|
||||
PEEP_STATE_INSPECTING = 23
|
||||
|
@ -230,9 +230,14 @@ enum PEEP_ACTION_EVENTS {
|
|||
PEEP_ACTION_STAFF_WATERING = 19,
|
||||
PEEP_ACTION_WAVE = 22,
|
||||
PEEP_ACTION_STAFF_EMPTY_BIN = 23,
|
||||
PEEP_ACTION_WAVE_2 = 24,
|
||||
PEEP_ACTION_TAKE_PHOTO = 25,
|
||||
PEEP_ACTION_CLAP = 26,
|
||||
|
||||
PEEP_ACTION_DRAW_PICTURE = 28,
|
||||
|
||||
PEEP_ACTION_WITHDRAW_MONEY = 30,
|
||||
|
||||
PEEP_ACTION_NONE_1 = 254,
|
||||
PEEP_ACTION_NONE_2 = 255
|
||||
};
|
||||
|
@ -258,6 +263,8 @@ enum PEEP_FLAGS {
|
|||
PEEP_FLAGS_EATING = (1 << 17), // Reduces hunger
|
||||
PEEP_FLAGS_EXPLODE = (1 << 18),
|
||||
|
||||
PEEP_FLAGS_21 = (1<<21),
|
||||
|
||||
PEEP_FLAGS_JOY = (1 << 23), // Makes the peep jump in joy
|
||||
PEEP_FLAGS_ANGRY = (1 << 24),
|
||||
PEEP_FLAGS_ICE_CREAM = (1 << 25) // Unconfirmed
|
||||
|
@ -357,10 +364,11 @@ typedef struct {
|
|||
uint16 name_string_idx; // 0x22
|
||||
uint16 next_x; // 0x24
|
||||
uint16 next_y; // 0x26
|
||||
uint16 next_z; // 0x28 possibly split into two uint8s
|
||||
uint8 next_z; // 0x28
|
||||
uint8 next_var_29; // 0x29
|
||||
uint8 var_2A;
|
||||
uint8 state; // 0x2B
|
||||
uint8 var_2C;
|
||||
uint8 sub_state; // 0x2C
|
||||
uint8 sprite_type; // 0x2D
|
||||
uint8 type; // 0x2E
|
||||
union{
|
||||
|
@ -428,8 +436,8 @@ typedef struct {
|
|||
money32 cash_spent; // 0xA4
|
||||
sint32 time_in_park; // 0xA8
|
||||
uint8 var_AC; // 0xAC
|
||||
uint8 var_AD; // creation/hire time?
|
||||
uint16 var_AE;
|
||||
uint8 previous_ride; // 0xAD
|
||||
uint16 previous_ride_time_out; // 0xAE
|
||||
rct_peep_thought thoughts[PEEP_MAX_THOUGHTS]; // 0xB0
|
||||
uint8 var_C4; // 0xC4
|
||||
union // 0xC5
|
||||
|
@ -446,9 +454,9 @@ typedef struct {
|
|||
uint32 var_CC;
|
||||
uint8 pad_D0[0x10];
|
||||
uint8 var_E0; // 0xE0
|
||||
uint8 pad_E1;
|
||||
uint8 var_E1;
|
||||
uint8 var_E2; // 0xE2
|
||||
uint8 pad_E3;
|
||||
uint8 var_E3;
|
||||
union{
|
||||
money16 paid_to_enter; // 0xE4
|
||||
uint16 staff_lawns_mown; // 0xE4
|
||||
|
@ -475,7 +483,8 @@ typedef struct {
|
|||
uint8 voucher_arguments; // 0xF1 ride_id or string_offset_id
|
||||
uint8 pad_F2;
|
||||
uint8 var_F3;
|
||||
uint8 pad_F4[0x02];
|
||||
uint8 var_F4;
|
||||
uint8 pad_F5;
|
||||
uint8 balloon_colour; // 0xF6
|
||||
uint8 umbrella_colour; // 0xF7
|
||||
uint8 hat_colour; // 0xF8
|
||||
|
|
|
@ -28,38 +28,23 @@
|
|||
#include "staff.h"
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00669E55
|
||||
*/
|
||||
void game_command_update_staff_colour()
|
||||
*
|
||||
* rct2: 0x00669E55
|
||||
*/
|
||||
void game_command_update_staff_colour(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp)
|
||||
{
|
||||
uint8 staff_type, colour, _bl;
|
||||
uint8 staffType, colour;
|
||||
int spriteIndex;
|
||||
rct_peep *peep;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov _bl, bl
|
||||
#else
|
||||
__asm__("mov %[_bl], bl " : [_bl] "+m" (_bl));
|
||||
#endif
|
||||
staffType = (*ebx >> 8) & 0xFF;
|
||||
colour = (*edx >> 8) & 0xFF;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov staff_type, bh
|
||||
#else
|
||||
__asm__("mov %[staff_type], bh " : [staff_type] "+m" (staff_type));
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov colour, dh
|
||||
#else
|
||||
__asm__("mov %[colour], bh " : [colour] "+m" (colour));
|
||||
#endif
|
||||
|
||||
if (_bl & 1) {
|
||||
RCT2_ADDRESS(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8)[staff_type] = colour;
|
||||
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
|
||||
RCT2_ADDRESS(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8)[staffType] = colour;
|
||||
|
||||
FOR_ALL_PEEPS(spriteIndex, peep) {
|
||||
if (peep->type == PEEP_TYPE_STAFF && peep->staff_type == staff_type) {
|
||||
if (peep->type == PEEP_TYPE_STAFF && peep->staff_type == staffType) {
|
||||
peep->tshirt_colour = colour;
|
||||
peep->trousers_colour = colour;
|
||||
}
|
||||
|
@ -67,25 +52,19 @@ void game_command_update_staff_colour()
|
|||
}
|
||||
|
||||
gfx_invalidate_screen();
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__asm mov ebx, 0
|
||||
#else
|
||||
__asm__("mov ebx, 0 ");
|
||||
#endif
|
||||
*ebx = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006BEFA1
|
||||
*/
|
||||
void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx,
|
||||
int* esi, int* edi, int* ebp)
|
||||
*
|
||||
* rct2: 0x006BEFA1
|
||||
*/
|
||||
void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp)
|
||||
{
|
||||
uint8 _bl = *ebx & 0xFF, staff_type = (*ebx & 0xFF00) >> 8;
|
||||
uint16 _ax = *eax & 0xFFFF, _cx = *ecx & 0xFFFF, _dx = *edx & 0xFFFF;
|
||||
|
||||
RCT2_GLOBAL(0x0141F56C, uint8) = 0x28;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_WAGES * 4;
|
||||
RCT2_GLOBAL(0x009DEA5E, uint16) = _ax;
|
||||
RCT2_GLOBAL(0x009DEA60, uint16) = _cx;
|
||||
RCT2_GLOBAL(0x009DEA62, uint16) = _dx;
|
||||
|
@ -204,7 +183,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx,
|
|||
sprite_move( newPeep->x, newPeep->y, newPeep->z, (rct_sprite*)newPeep);
|
||||
invalidate_sprite((rct_sprite*)newPeep);
|
||||
|
||||
newPeep->var_AD = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint8);
|
||||
newPeep->time_in_park = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16);
|
||||
newPeep->var_CC = 0xFFFFFFFF;
|
||||
|
||||
uint8 colour = RCT2_ADDRESS(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8)[staff_type > 2 ? 2 : staff_type];
|
||||
|
@ -234,30 +213,23 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx,
|
|||
|
||||
/*
|
||||
* Updates the colour of the given staff type.
|
||||
*/
|
||||
void update_staff_colour(uint8 staff_type, uint16 colour)
|
||||
*/
|
||||
void update_staff_colour(uint8 staffType, uint16 colour)
|
||||
{
|
||||
game_do_command(
|
||||
0,
|
||||
(staff_type << 8) + 1,
|
||||
0,
|
||||
(colour << 8) + 4,
|
||||
GAME_COMMAND_SET_STAFF_COLOUR,
|
||||
0,
|
||||
0);
|
||||
game_do_command(0, (staffType << 8) | GAME_COMMAND_FLAG_APPLY, 0, (colour << 8) | 4, GAME_COMMAND_SET_STAFF_COLOUR, 0, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Hires a new staff member of the given type. If the hire cannot be completed (eg. the maximum
|
||||
* number of staff is reached or there are too many people in the game) it returns 0xFFFF.
|
||||
*/
|
||||
uint16 hire_new_staff_member(uint8 staff_type)
|
||||
*/
|
||||
uint16 hire_new_staff_member(uint8 staffType)
|
||||
{
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = STR_CANT_HIRE_NEW_STAFF;
|
||||
|
||||
int eax, ebx, ecx, edx, esi, edi, ebp;
|
||||
eax = 0x8000;
|
||||
ebx = staff_type << 8 | 1;
|
||||
ebx = staffType << 8 | GAME_COMMAND_FLAG_APPLY;
|
||||
|
||||
int result = game_do_command_p(GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
|
||||
|
|
|
@ -40,11 +40,11 @@ enum STAFF_TYPE {
|
|||
STAFF_TYPE_ENTERTAINER
|
||||
};
|
||||
|
||||
void game_command_update_staff_colour();
|
||||
void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
|
||||
void game_command_update_staff_colour(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
|
||||
void game_command_hire_new_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
|
||||
|
||||
void update_staff_colour(uint8 staff_type, uint16 color);
|
||||
uint16 hire_new_staff_member(uint8 staff_type);
|
||||
void update_staff_colour(uint8 staffType, uint16 color);
|
||||
uint16 hire_new_staff_member(uint8 staffType);
|
||||
void sub_6C0C3F();
|
||||
int mechanic_is_location_in_patrol(rct_peep *mechanic, int x, int y);
|
||||
|
||||
|
|
|
@ -1,929 +0,0 @@
|
|||
/*****************************************************************************
|
||||
* Copyright (c) 2014 Ted John, Alexander Overvoorde
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <shlobj.h>
|
||||
#include <tchar.h>
|
||||
#include <SDL.h>
|
||||
#include <SDL_syswm.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../config.h"
|
||||
#include "../cursors.h"
|
||||
#include "../drawing/drawing.h"
|
||||
#include "../input.h"
|
||||
#include "../interface/keyboard_shortcut.h"
|
||||
#include "../interface/screenshot.h"
|
||||
#include "../interface/window.h"
|
||||
#include "osinterface.h"
|
||||
|
||||
typedef void(*update_palette_func)(char*, int, int);
|
||||
|
||||
openrct2_cursor gCursorState;
|
||||
const unsigned char *gKeysState;
|
||||
unsigned char *gKeysPressed;
|
||||
unsigned int gLastKeyPressed;
|
||||
char* gTextInput;
|
||||
int gTextInputLength;
|
||||
int gTextInputMaxLength;
|
||||
int gTextInputCursorPosition = 0;
|
||||
|
||||
static void osinterface_create_window();
|
||||
static void osinterface_close_window();
|
||||
static void osinterface_resize(int width, int height);
|
||||
|
||||
static SDL_Window *_window;
|
||||
static SDL_Surface *_surface;
|
||||
static SDL_Palette *_palette;
|
||||
|
||||
static int _screenBufferSize;
|
||||
static void *_screenBuffer;
|
||||
|
||||
static SDL_Cursor* _cursors[NO_CURSORS];
|
||||
|
||||
static const int _fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP };
|
||||
|
||||
static unsigned int _lastGestureTimestamp;
|
||||
static float _gestureRadius;
|
||||
|
||||
void osinterface_init()
|
||||
{
|
||||
osinterface_create_window();
|
||||
|
||||
gKeysPressed = malloc(sizeof(unsigned char) * 256);
|
||||
memset(gKeysPressed, 0, sizeof(unsigned char) * 256);
|
||||
|
||||
// RCT2_CALLPROC(0x00404584); // dinput_init()
|
||||
}
|
||||
|
||||
int osinterface_scancode_to_rct_keycode(int sdl_key){
|
||||
char keycode = (char)SDL_GetKeyFromScancode((SDL_Scancode)sdl_key);
|
||||
|
||||
// Until we reshufle the text files to use the new positions
|
||||
// this will suffice to move the majority to the correct positions.
|
||||
// Note any special buttons PgUp PgDwn are mapped wrong.
|
||||
if (keycode >= 'a' && keycode <= 'z')keycode = toupper(keycode);
|
||||
|
||||
return keycode;
|
||||
}
|
||||
|
||||
void osinterface_start_text_input(char* buffer, int max_length){
|
||||
SDL_StartTextInput();
|
||||
gTextInputMaxLength = max_length - 1;
|
||||
gTextInput = buffer;
|
||||
gTextInputCursorPosition = strnlen(gTextInput, max_length);
|
||||
gTextInputLength = gTextInputCursorPosition;
|
||||
}
|
||||
|
||||
void osinterface_stop_text_input(){
|
||||
SDL_StopTextInput();
|
||||
gTextInput = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is not quite the same as the below function as we don't want to
|
||||
* derfererence the cursor before the function.
|
||||
* rct2: 0x0407956
|
||||
*/
|
||||
void osinterface_set_cursor(char cursor){
|
||||
//HCURSOR hCurs = RCT2_ADDRESS(RCT2_ADDRESS_HCURSOR_START, HCURSOR)[cursor];
|
||||
//SetCursor((HCURSOR)hCurs);
|
||||
SDL_SetCursor(_cursors[cursor]);
|
||||
}
|
||||
/**
|
||||
*rct2: 0x0068352C
|
||||
*/
|
||||
static void osinterface_load_cursors(){
|
||||
|
||||
RCT2_GLOBAL(0x14241BC, uint32) = 2;
|
||||
HINSTANCE hInst = RCT2_GLOBAL(RCT2_ADDRESS_HINSTANCE, HINSTANCE);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ARROW, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x74));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_BLANK, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA1));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_UP_ARROW, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x6D));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_UP_DOWN_ARROW, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x6E));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_POINT, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x70));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ZZZ, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x78));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_DIAGONAL_ARROWS, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x77));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_PICKER, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x7C));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_TREE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x83));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_FOUNTAIN_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x7F));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_STATUE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x80));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_BENCH_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x81));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_CROSS_HAIR, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x82));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_BIN_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x84));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_LAMPPOST_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x85));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_FENCE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8A));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_FLOWER_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x89));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_PATH_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8B));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_DIG_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8D));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_WATER_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8E));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HOUSE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8F));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_VOLCANO_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x90));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_WALK_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x91));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_PAINT_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x9E));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ENTRANCE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x9F));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_OPEN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA6));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_CLOSED, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA5));
|
||||
|
||||
_cursors[0] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW);
|
||||
_cursors[1] = SDL_CreateCursor(blank_cursor_data, blank_cursor_mask, 32, 32, BLANK_CURSOR_HOTX, BLANK_CURSOR_HOTY);
|
||||
_cursors[2] = SDL_CreateCursor(up_arrow_cursor_data, up_arrow_cursor_mask, 32, 32, UP_ARROW_CURSOR_HOTX, UP_ARROW_CURSOR_HOTY);
|
||||
_cursors[3] = SDL_CreateCursor(up_down_arrow_cursor_data, up_down_arrow_cursor_mask, 32, 32, UP_DOWN_ARROW_CURSOR_HOTX, UP_DOWN_ARROW_CURSOR_HOTY);
|
||||
_cursors[4] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND);
|
||||
_cursors[5] = SDL_CreateCursor(zzz_cursor_data, zzz_cursor_mask, 32, 32, ZZZ_CURSOR_HOTX, ZZZ_CURSOR_HOTY);
|
||||
_cursors[6] = SDL_CreateCursor(diagonal_arrow_cursor_data, diagonal_arrow_cursor_mask, 32, 32, DIAGONAL_ARROW_CURSOR_HOTX, DIAGONAL_ARROW_CURSOR_HOTY);
|
||||
_cursors[7] = SDL_CreateCursor(picker_cursor_data, picker_cursor_mask, 32, 32, PICKER_CURSOR_HOTX, PICKER_CURSOR_HOTY);
|
||||
_cursors[8] = SDL_CreateCursor(tree_down_cursor_data, tree_down_cursor_mask, 32, 32, TREE_DOWN_CURSOR_HOTX, TREE_DOWN_CURSOR_HOTY);
|
||||
_cursors[9] = SDL_CreateCursor(fountain_down_cursor_data, fountain_down_cursor_mask, 32, 32, FOUNTAIN_DOWN_CURSOR_HOTX, FOUNTAIN_DOWN_CURSOR_HOTY);
|
||||
_cursors[10] = SDL_CreateCursor(statue_down_cursor_data, statue_down_cursor_mask, 32, 32, STATUE_DOWN_CURSOR_HOTX, STATUE_DOWN_CURSOR_HOTY);
|
||||
_cursors[11] = SDL_CreateCursor(bench_down_cursor_data, bench_down_cursor_mask, 32, 32, BENCH_DOWN_CURSOR_HOTX, BENCH_DOWN_CURSOR_HOTY);
|
||||
_cursors[12] = SDL_CreateCursor(cross_hair_cursor_data, cross_hair_cursor_mask, 32, 32, CROSS_HAIR_CURSOR_HOTX, CROSS_HAIR_CURSOR_HOTY);
|
||||
_cursors[13] = SDL_CreateCursor(bin_down_cursor_data, bin_down_cursor_mask, 32, 32, BIN_DOWN_CURSOR_HOTX, BIN_DOWN_CURSOR_HOTY);
|
||||
_cursors[14] = SDL_CreateCursor(lamppost_down_cursor_data, lamppost_down_cursor_mask, 32, 32, LAMPPOST_DOWN_CURSOR_HOTX, LAMPPOST_DOWN_CURSOR_HOTY);
|
||||
_cursors[15] = SDL_CreateCursor(fence_down_cursor_data, fence_down_cursor_mask, 32, 32, FENCE_DOWN_CURSOR_HOTX, FENCE_DOWN_CURSOR_HOTY);
|
||||
_cursors[16] = SDL_CreateCursor(flower_down_cursor_data, flower_down_cursor_mask, 32, 32, FLOWER_DOWN_CURSOR_HOTX, FLOWER_DOWN_CURSOR_HOTY);
|
||||
_cursors[17] = SDL_CreateCursor(path_down_cursor_data, path_down_cursor_mask, 32, 32, PATH_DOWN_CURSOR_HOTX, PATH_DOWN_CURSOR_HOTY);
|
||||
_cursors[18] = SDL_CreateCursor(dig_down_cursor_data, dig_down_cursor_mask, 32, 32, DIG_DOWN_CURSOR_HOTX, DIG_DOWN_CURSOR_HOTY);
|
||||
_cursors[19] = SDL_CreateCursor(water_down_cursor_data, water_down_cursor_mask, 32, 32, WATER_DOWN_CURSOR_HOTX, WATER_DOWN_CURSOR_HOTY);
|
||||
_cursors[20] = SDL_CreateCursor(house_down_cursor_data, house_down_cursor_mask, 32, 32, HOUSE_DOWN_CURSOR_HOTX, HOUSE_DOWN_CURSOR_HOTY);
|
||||
_cursors[21] = SDL_CreateCursor(volcano_down_cursor_data, volcano_down_cursor_mask, 32, 32, VOLCANO_DOWN_CURSOR_HOTX, VOLCANO_DOWN_CURSOR_HOTY);
|
||||
_cursors[22] = SDL_CreateCursor(walk_down_cursor_data, walk_down_cursor_mask, 32, 32, WALK_DOWN_CURSOR_HOTX, WALK_DOWN_CURSOR_HOTY);
|
||||
_cursors[23] = SDL_CreateCursor(paint_down_cursor_data, paint_down_cursor_mask, 32, 32, PAINT_DOWN_CURSOR_HOTX, PAINT_DOWN_CURSOR_HOTY);
|
||||
_cursors[24] = SDL_CreateCursor(entrance_down_cursor_data, entrance_down_cursor_mask, 32, 32, ENTRANCE_DOWN_CURSOR_HOTX, ENTRANCE_DOWN_CURSOR_HOTY);
|
||||
_cursors[25] = SDL_CreateCursor(hand_open_cursor_data, hand_open_cursor_mask, 32, 32, HAND_OPEN_CURSOR_HOTX, HAND_OPEN_CURSOR_HOTY);
|
||||
_cursors[26] = SDL_CreateCursor(hand_closed_cursor_data, hand_closed_cursor_mask, 32, 32, HAND_CLOSED_CURSOR_HOTX, HAND_CLOSED_CURSOR_HOTY);
|
||||
osinterface_set_cursor(CURSOR_ARROW);
|
||||
RCT2_GLOBAL(0x14241BC, uint32) = 0;
|
||||
}
|
||||
|
||||
static void osinterface_unload_cursors(){
|
||||
for (int i = 0; i < NO_CURSORS; ++i){
|
||||
if (_cursors[i] != NULL)SDL_FreeCursor(_cursors[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void osinterface_create_window()
|
||||
{
|
||||
SDL_SysWMinfo wmInfo;
|
||||
HWND hWnd;
|
||||
int width, height;
|
||||
|
||||
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||
RCT2_ERROR("SDL_Init %s", SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// stuff
|
||||
{
|
||||
osinterface_load_cursors();
|
||||
RCT2_CALLPROC_EBPSAFE(0x0068371D);
|
||||
|
||||
width = gGeneral_config.window_width;
|
||||
height = gGeneral_config.window_height;
|
||||
|
||||
if (width == -1) width = 640;
|
||||
if (height == -1) height = 480;
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(0x009E2D8C, sint32) = 0;
|
||||
|
||||
_window = SDL_CreateWindow("OpenRCT2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height,
|
||||
_fullscreen_modes[gGeneral_config.fullscreen_mode] | SDL_WINDOW_RESIZABLE);
|
||||
if (!_window) {
|
||||
RCT2_ERROR("SDL_CreateWindow failed %s", SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
SDL_VERSION(&wmInfo.version);
|
||||
// Get the HWND context
|
||||
if (SDL_GetWindowWMInfo(_window, &wmInfo) != SDL_TRUE) {
|
||||
RCT2_ERROR("SDL_GetWindowWMInfo failed %s", SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
hWnd = wmInfo.info.win.window;
|
||||
RCT2_GLOBAL(0x009E2D70, HWND) = hWnd;
|
||||
|
||||
// Set the update palette function pointer
|
||||
RCT2_GLOBAL(0x009E2BE4, update_palette_func) = osinterface_update_palette;
|
||||
|
||||
// Initialise the surface, palette and draw buffer
|
||||
osinterface_resize(width, height);
|
||||
}
|
||||
|
||||
|
||||
static void osinterface_resize(int width, int height)
|
||||
{
|
||||
rct_drawpixelinfo *screenDPI;
|
||||
int newScreenBufferSize;
|
||||
void *newScreenBuffer;
|
||||
|
||||
if (_surface != NULL)
|
||||
SDL_FreeSurface(_surface);
|
||||
if (_palette != NULL)
|
||||
SDL_FreePalette(_palette);
|
||||
|
||||
_surface = SDL_CreateRGBSurface(0, width, height, 8, 0, 0, 0, 0);
|
||||
_palette = SDL_AllocPalette(256);
|
||||
|
||||
if (!_surface || !_palette) {
|
||||
RCT2_ERROR("%p || %p == NULL %s", _surface, _palette, SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (SDL_SetSurfacePalette(_surface, _palette)) {
|
||||
RCT2_ERROR("SDL_SetSurfacePalette failed %s", SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
newScreenBufferSize = _surface->pitch * _surface->h;
|
||||
newScreenBuffer = malloc(newScreenBufferSize);
|
||||
if (_screenBuffer == NULL) {
|
||||
memset(newScreenBuffer, 0, newScreenBufferSize);
|
||||
} else {
|
||||
memcpy(newScreenBuffer, _screenBuffer, min(_screenBufferSize, newScreenBufferSize));
|
||||
if (newScreenBufferSize - _screenBufferSize > 0)
|
||||
memset((uint8*)newScreenBuffer + _screenBufferSize, 0, newScreenBufferSize - _screenBufferSize);
|
||||
free(_screenBuffer);
|
||||
}
|
||||
|
||||
_screenBuffer = newScreenBuffer;
|
||||
_screenBufferSize = newScreenBufferSize;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) = width;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) = height;
|
||||
|
||||
screenDPI = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo);
|
||||
screenDPI->bits = _screenBuffer;
|
||||
screenDPI->x = 0;
|
||||
screenDPI->y = 0;
|
||||
screenDPI->width = width;
|
||||
screenDPI->height = height;
|
||||
screenDPI->pitch = _surface->pitch - _surface->w;
|
||||
|
||||
RCT2_GLOBAL(0x009ABDF0, uint8) = 6;
|
||||
RCT2_GLOBAL(0x009ABDF1, uint8) = 3;
|
||||
RCT2_GLOBAL(0x009ABDF2, uint8) = 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_WIDTH, sint16) = 64;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, sint16) = 8;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32) = (width >> 6) + 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, sint32) = (height >> 3) + 1;
|
||||
|
||||
window_resize_gui(width, height);
|
||||
//RCT2_CALLPROC_EBPSAFE(0x0066B905); // resize_gui()
|
||||
|
||||
gfx_invalidate_screen();
|
||||
}
|
||||
|
||||
void osinterface_update_palette(char* colours, int start_index, int num_colours)
|
||||
{
|
||||
SDL_Color base[256];
|
||||
SDL_Surface *surface;
|
||||
int i;
|
||||
|
||||
surface = SDL_GetWindowSurface(_window);
|
||||
if (!surface) {
|
||||
RCT2_ERROR("SDL_GetWindowSurface failed %s", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 256; i++) {
|
||||
base[i].r = colours[2];
|
||||
base[i].g = colours[1];
|
||||
base[i].b = colours[0];
|
||||
base[i].a = 0;
|
||||
colours += 4;
|
||||
}
|
||||
|
||||
if (SDL_SetPaletteColors(_palette, base, 0, 256)) {
|
||||
RCT2_ERROR("SDL_SetPaletteColors failed %s", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void osinterface_draw()
|
||||
{
|
||||
// Lock the surface before setting its pixels
|
||||
if (SDL_MUSTLOCK(_surface))
|
||||
if (SDL_LockSurface(_surface) < 0) {
|
||||
RCT2_ERROR("locking failed %s", SDL_GetError());
|
||||
return;
|
||||
}
|
||||
|
||||
// Copy pixels from the virtual screen buffer to the surface
|
||||
memcpy(_surface->pixels, _screenBuffer, _surface->pitch * _surface->h);
|
||||
|
||||
// Unlock the surface
|
||||
if (SDL_MUSTLOCK(_surface))
|
||||
SDL_UnlockSurface(_surface);
|
||||
|
||||
// Copy the surface to the window
|
||||
if (SDL_BlitSurface(_surface, NULL, SDL_GetWindowSurface(_window), NULL)) {
|
||||
RCT2_ERROR("SDL_BlitSurface %s", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
if (SDL_UpdateWindowSurface(_window)) {
|
||||
RCT2_ERROR("SDL_UpdateWindowSurface %s", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void osinterface_process_messages()
|
||||
{
|
||||
SDL_Event e;
|
||||
|
||||
gLastKeyPressed = 0;
|
||||
// gCursorState.wheel = 0;
|
||||
gCursorState.left &= ~CURSOR_CHANGED;
|
||||
gCursorState.middle &= ~CURSOR_CHANGED;
|
||||
gCursorState.right &= ~CURSOR_CHANGED;
|
||||
gCursorState.old = 0;
|
||||
|
||||
while (SDL_PollEvent(&e)) {
|
||||
switch (e.type) {
|
||||
case SDL_QUIT:
|
||||
// rct2_finish();
|
||||
rct2_quit();
|
||||
break;
|
||||
case SDL_WINDOWEVENT:
|
||||
if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
|
||||
osinterface_resize(e.window.data1, e.window.data2);
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
RCT2_GLOBAL(0x0142406C, int) = e.motion.x;
|
||||
RCT2_GLOBAL(0x01424070, int) = e.motion.y;
|
||||
|
||||
gCursorState.x = e.motion.x;
|
||||
gCursorState.y = e.motion.y;
|
||||
break;
|
||||
case SDL_MOUSEWHEEL:
|
||||
gCursorState.wheel += e.wheel.y * 128;
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
RCT2_GLOBAL(0x01424318, int) = e.button.x;
|
||||
RCT2_GLOBAL(0x0142431C, int) = e.button.y;
|
||||
switch (e.button.button) {
|
||||
case SDL_BUTTON_LEFT:
|
||||
store_mouse_input(1);
|
||||
gCursorState.left = CURSOR_PRESSED;
|
||||
gCursorState.old = 1;
|
||||
break;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
gCursorState.middle = CURSOR_PRESSED;
|
||||
break;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
store_mouse_input(3);
|
||||
gCursorState.right = CURSOR_PRESSED;
|
||||
gCursorState.old = 2;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
RCT2_GLOBAL(0x01424318, int) = e.button.x;
|
||||
RCT2_GLOBAL(0x0142431C, int) = e.button.y;
|
||||
switch (e.button.button) {
|
||||
case SDL_BUTTON_LEFT:
|
||||
store_mouse_input(2);
|
||||
gCursorState.left = CURSOR_RELEASED;
|
||||
gCursorState.old = 3;
|
||||
break;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
gCursorState.middle = CURSOR_RELEASED;
|
||||
break;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
store_mouse_input(4);
|
||||
gCursorState.right = CURSOR_RELEASED;
|
||||
gCursorState.old = 4;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
if (e.key.keysym.sym == SDLK_KP_ENTER){
|
||||
// Map Keypad enter to regular enter.
|
||||
e.key.keysym.scancode = SDL_SCANCODE_RETURN;
|
||||
}
|
||||
|
||||
gLastKeyPressed = e.key.keysym.sym;
|
||||
gKeysPressed[e.key.keysym.scancode] = 1;
|
||||
if (e.key.keysym.sym == SDLK_RETURN && e.key.keysym.mod & KMOD_ALT)
|
||||
osinterface_set_fullscreen_mode(!gGeneral_config.fullscreen_mode);
|
||||
|
||||
// Text input
|
||||
|
||||
// If backspace and we have input text with a cursor position none zero
|
||||
if (e.key.keysym.sym == SDLK_BACKSPACE && gTextInputLength > 0 && gTextInput && gTextInputCursorPosition){
|
||||
// When at max length don't shift the data left
|
||||
// as it would buffer overflow.
|
||||
if (gTextInputCursorPosition != gTextInputMaxLength)
|
||||
memmove(gTextInput + gTextInputCursorPosition - 1, gTextInput + gTextInputCursorPosition, gTextInputMaxLength - gTextInputCursorPosition - 1);
|
||||
gTextInput[gTextInputLength - 1] = '\0';
|
||||
gTextInputCursorPosition--;
|
||||
gTextInputLength--;
|
||||
}
|
||||
if (e.key.keysym.sym == SDLK_END){
|
||||
gTextInputCursorPosition = gTextInputLength;
|
||||
}
|
||||
if (e.key.keysym.sym == SDLK_HOME){
|
||||
gTextInputCursorPosition = 0;
|
||||
}
|
||||
if (e.key.keysym.sym == SDLK_DELETE && gTextInputLength > 0 && gTextInput && gTextInputCursorPosition != gTextInputLength){
|
||||
memmove(gTextInput + gTextInputCursorPosition, gTextInput + gTextInputCursorPosition + 1, gTextInputMaxLength - gTextInputCursorPosition - 1);
|
||||
gTextInput[gTextInputMaxLength - 1] = '\0';
|
||||
gTextInputLength--;
|
||||
}
|
||||
if (e.key.keysym.sym == SDLK_LEFT && gTextInput){
|
||||
if (gTextInputCursorPosition) gTextInputCursorPosition--;
|
||||
}
|
||||
else if (e.key.keysym.sym == SDLK_RIGHT && gTextInput){
|
||||
if (gTextInputCursorPosition < gTextInputLength) gTextInputCursorPosition++;
|
||||
}
|
||||
break;
|
||||
case SDL_MULTIGESTURE:
|
||||
if (e.mgesture.numFingers == 2) {
|
||||
if (e.mgesture.timestamp > _lastGestureTimestamp + 1000)
|
||||
_gestureRadius = 0;
|
||||
_lastGestureTimestamp = e.mgesture.timestamp;
|
||||
_gestureRadius += e.mgesture.dDist;
|
||||
|
||||
// Zoom gesture
|
||||
const int tolerance = 128;
|
||||
int gesturePixels = (int)(_gestureRadius * RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16));
|
||||
if (gesturePixels > tolerance) {
|
||||
_gestureRadius = 0;
|
||||
keyboard_shortcut_handle_command(SHORTCUT_ZOOM_VIEW_IN);
|
||||
} else if (gesturePixels < -tolerance) {
|
||||
_gestureRadius = 0;
|
||||
keyboard_shortcut_handle_command(SHORTCUT_ZOOM_VIEW_OUT);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_TEXTINPUT:
|
||||
if (gTextInputLength < gTextInputMaxLength && gTextInput){
|
||||
// Convert the utf-8 code into rct ascii
|
||||
char new_char;
|
||||
if (!(e.text.text[0] & 0x80))
|
||||
new_char = *e.text.text;
|
||||
else if (!(e.text.text[0] & 0x20))
|
||||
new_char = ((e.text.text[0] & 0x1F) << 6) | (e.text.text[1] & 0x3F);
|
||||
|
||||
// If inserting in center of string make space for new letter
|
||||
if (gTextInputLength > gTextInputCursorPosition){
|
||||
memmove(gTextInput + gTextInputCursorPosition + 1, gTextInput + gTextInputCursorPosition, gTextInputMaxLength - gTextInputCursorPosition - 1);
|
||||
gTextInput[gTextInputCursorPosition] = new_char;
|
||||
gTextInputLength++;
|
||||
}
|
||||
else gTextInput[gTextInputLength++] = new_char;
|
||||
|
||||
gTextInputCursorPosition++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gCursorState.any = gCursorState.left | gCursorState.middle | gCursorState.right;
|
||||
|
||||
// Updates the state of the keys
|
||||
int numKeys = 256;
|
||||
gKeysState = SDL_GetKeyboardState(&numKeys);
|
||||
}
|
||||
|
||||
static void osinterface_close_window()
|
||||
{
|
||||
if (_window != NULL)
|
||||
SDL_DestroyWindow(_window);
|
||||
if (_surface != NULL)
|
||||
SDL_FreeSurface(_surface);
|
||||
if (_palette != NULL)
|
||||
SDL_FreePalette(_palette);
|
||||
osinterface_unload_cursors();
|
||||
}
|
||||
|
||||
void osinterface_free()
|
||||
{
|
||||
free(gKeysPressed);
|
||||
|
||||
osinterface_close_window();
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
void osinterface_set_fullscreen_mode(int mode){
|
||||
if (mode == gGeneral_config.fullscreen_mode)
|
||||
return;
|
||||
|
||||
if (SDL_SetWindowFullscreen(_window, _fullscreen_modes[mode])){
|
||||
RCT2_ERROR("SDL_SetWindowFullscreen %s", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
//SDL automatically resizes the fullscreen window to the nearest allowed screen resolution
|
||||
//No need to call osinterface_resize() here, SDL_WINDOWEVENT_SIZE_CHANGED event will be triggered anyway
|
||||
|
||||
gGeneral_config.fullscreen_mode = mode;
|
||||
|
||||
config_save();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407978
|
||||
*/
|
||||
int osinterface_407978(rct2_install_info* install_info, char* source, char* font, uint8 charset)
|
||||
{
|
||||
char subkey[MAX_PATH];
|
||||
char subkey2[MAX_PATH];
|
||||
strcpy(subkey, "Software\\Infogrames\\");
|
||||
strcat(subkey, source);
|
||||
strcpy(subkey2, "Software\\Fish Technology Group\\");
|
||||
strcat(subkey2, source);
|
||||
LOGFONTA lf;
|
||||
memset(&lf, 0, sizeof(lf));
|
||||
lf.lfCharSet = charset;
|
||||
lf.lfHeight = 12;
|
||||
lf.lfWeight = 400;
|
||||
strcpy(lf.lfFaceName, font);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HFONT, HFONT) = CreateFontIndirectA(&lf);
|
||||
HKEY hkey;
|
||||
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &hkey) != ERROR_SUCCESS && RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey2, &hkey) != ERROR_SUCCESS) {
|
||||
return 0;
|
||||
} else {
|
||||
DWORD type;
|
||||
DWORD size = 260;
|
||||
RegQueryValueExA(hkey, "Title", 0, &type, install_info->title, &size);
|
||||
size = 260;
|
||||
RegQueryValueExA(hkey, "Path", 0, &type, install_info->path, &size);
|
||||
install_info->var_20C = 235960;
|
||||
size = 4;
|
||||
RegQueryValueExA(hkey, "InstallLevel", 0, &type, (LPBYTE)&install_info->installlevel, &size);
|
||||
for (int i = 0; i <= 15; i++) {
|
||||
char name[100];
|
||||
sprintf(name, "AddonPack%d", i);
|
||||
size = sizeof(install_info->addon[i]);
|
||||
if (RegQueryValueExA(hkey, name, 0, &type, install_info->addon[i], &size) == ERROR_SUCCESS) {
|
||||
install_info->addons |= (1 << i);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hkey);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407D80
|
||||
*/
|
||||
int osinterface_get_cursor_pos(int* x, int* y)
|
||||
{
|
||||
POINT point;
|
||||
GetCursorPos(&point);
|
||||
*x = point.x;
|
||||
*y = point.y;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407E15
|
||||
*/
|
||||
int osinterface_print_window_message(UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
const char* msgname = "NULL";
|
||||
// get the string representation of the msg id, from 190 different values in 0x009A61D8 - 0x009A8873
|
||||
// not going to bother reading those since this function is going to be unused and taken out anyways
|
||||
char temp[1024];
|
||||
sprintf(temp, "Message id = %s (%i), wParam = 0x%x, lParam = 0x%x\n", msgname, msg, wparam, lparam);
|
||||
OutputDebugStringA(temp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407E6E
|
||||
*/
|
||||
int osinterface_progressbar_create(char* title, int a2)
|
||||
{
|
||||
DWORD style = WS_VISIBLE | WS_BORDER | WS_DLGFRAME;
|
||||
if (a2) {
|
||||
style = WS_VISIBLE | WS_BORDER | WS_DLGFRAME | PBS_SMOOTH;
|
||||
}
|
||||
int width = 340;
|
||||
int height = GetSystemMetrics(SM_CYCAPTION) + 24;
|
||||
HWND hwnd = CreateWindowExA(WS_EX_TOPMOST | WS_EX_DLGMODALFRAME, "msctls_progress32", title, style, (RCT2_GLOBAL(0x01423C08, sint32) - width) / 2, (RCT2_GLOBAL(0x01423C0C, sint32) - height) / 2, width, height, 0, 0, RCT2_GLOBAL(RCT2_ADDRESS_HINSTANCE, HINSTANCE), 0);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PROGRESSBAR_HWND, HWND) = hwnd;
|
||||
if (hwnd) {
|
||||
RCT2_GLOBAL(0x009E2DFC, uint32) = 1;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_HFONT, HFONT)) {
|
||||
SendMessageA(hwnd, WM_SETFONT, (WPARAM)RCT2_GLOBAL(RCT2_ADDRESS_HFONT, HFONT), 1);
|
||||
}
|
||||
SetWindowTextA(hwnd, title);
|
||||
osinterface_progressbar_setmax(0xFF);
|
||||
osinterface_progressbar_setpos(0);
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407F16
|
||||
*/
|
||||
int osinterface_progressbar_destroy()
|
||||
{
|
||||
if (DestroyWindow(RCT2_GLOBAL(RCT2_ADDRESS_PROGRESSBAR_HWND, HWND))) {
|
||||
RCT2_GLOBAL(0x009E2DFC, uint32) = 0;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407F2E
|
||||
*/
|
||||
void osinterface_progressbar_setmax(int max)
|
||||
{
|
||||
SendMessageA(RCT2_GLOBAL(RCT2_ADDRESS_PROGRESSBAR_HWND, HWND), PBM_SETRANGE, MAKEWPARAM(0, max), 0);
|
||||
SendMessageA(RCT2_GLOBAL(RCT2_ADDRESS_PROGRESSBAR_HWND, HWND), PBM_SETSTEP, 1, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407F60
|
||||
*/
|
||||
void osinterface_progressbar_setpos(int pos)
|
||||
{
|
||||
SendMessageA(RCT2_GLOBAL(RCT2_ADDRESS_PROGRESSBAR_HWND, HWND), PBM_SETPOS, MAKEWPARAM(pos, 0), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407F78
|
||||
*/
|
||||
int osinterface_file_seek_from_begin(HANDLE handle, int offset)
|
||||
{
|
||||
return SetFilePointer(handle, offset, 0, FILE_BEGIN);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407F8B
|
||||
*/
|
||||
int osinterface_file_seek_from_current(HANDLE handle, int offset)
|
||||
{
|
||||
return SetFilePointer(handle, offset, 0, FILE_CURRENT);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407F9E
|
||||
*/
|
||||
int osinterface_file_seek_from_end(HANDLE handle, int offset)
|
||||
{
|
||||
return SetFilePointer(handle, offset, 0, FILE_END);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407FB1
|
||||
*/
|
||||
int osinterface_file_read(HANDLE handle, void* data, int size)
|
||||
{
|
||||
DWORD read;
|
||||
BOOL result;
|
||||
if (size == -1) {
|
||||
DWORD current = SetFilePointer(handle, 0, 0, FILE_CURRENT);
|
||||
DWORD remaining = SetFilePointer(handle, 0, 0, FILE_END) - current;
|
||||
result = ReadFile(handle, data, remaining, &read, 0);
|
||||
} else {
|
||||
result = ReadFile(handle, data, size, &read, 0);
|
||||
}
|
||||
if (result) {
|
||||
return read;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00408024
|
||||
*/
|
||||
int osinterface_file_write(HANDLE handle, const void* data, int size)
|
||||
{
|
||||
DWORD written;
|
||||
if (WriteFile(handle, data, size, &written, 0)) {
|
||||
return written;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0040804A
|
||||
*/
|
||||
int osinterface_file_close(HANDLE handle)
|
||||
{
|
||||
if (handle) {
|
||||
return CloseHandle(handle);
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00408060
|
||||
*/
|
||||
HANDLE osinterface_file_open(const char* filename)
|
||||
{
|
||||
return CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS | FILE_ATTRIBUTE_NORMAL, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0040807D
|
||||
*/
|
||||
HANDLE osinterface_file_create(const char* filename)
|
||||
{
|
||||
return CreateFileA(filename, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00408099
|
||||
*/
|
||||
int osinterface_file_move(const char* srcfilename, const char* dstfilename)
|
||||
{
|
||||
return (MoveFileA(srcfilename, dstfilename) != 0) - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x004080AF
|
||||
*/
|
||||
int osinterface_file_delete(const char* filename)
|
||||
{
|
||||
return (DeleteFileA(filename) != 0) - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x004080EA
|
||||
*/
|
||||
int osinterface_open_common_file_dialog(int type, char *title, char *filename, char *filterPattern, char *filterName)
|
||||
{
|
||||
char initialDirectory[MAX_PATH], *dotAddress, *slashAddress;
|
||||
OPENFILENAME openFileName;
|
||||
BOOL result;
|
||||
int tmp;
|
||||
DWORD commonFlags;
|
||||
|
||||
// Get directory path from given filename
|
||||
strcpy(initialDirectory, filename);
|
||||
dotAddress = strrchr(initialDirectory, '.');
|
||||
if (dotAddress != NULL) {
|
||||
slashAddress = strrchr(initialDirectory, '\\');
|
||||
if (slashAddress < dotAddress)
|
||||
*(slashAddress + 1) = 0;
|
||||
}
|
||||
|
||||
// Clear filename
|
||||
if (type != 0)
|
||||
*filename = 0;
|
||||
|
||||
// Set open file name options
|
||||
memset(&openFileName, 0, sizeof(OPENFILENAME));
|
||||
openFileName.lStructSize = sizeof(OPENFILENAME);
|
||||
openFileName.hwndOwner = RCT2_GLOBAL(0x009E2D70, HWND);
|
||||
openFileName.lpstrFile = filename;
|
||||
openFileName.nMaxFile = MAX_PATH;
|
||||
openFileName.lpstrInitialDir = initialDirectory;
|
||||
openFileName.lpstrTitle = title;
|
||||
|
||||
// Copy filter name
|
||||
strcpy((char*)0x01423800, filterName);
|
||||
|
||||
// Copy filter pattern
|
||||
strcpy((char*)0x01423800 + strlen(filterName) + 1, filterPattern);
|
||||
*((char*)(0x01423800 + strlen(filterName) + 1 + strlen(filterPattern) + 1)) = 0;
|
||||
openFileName.lpstrFilter = (char*)0x01423800;
|
||||
|
||||
//
|
||||
tmp = RCT2_GLOBAL(0x009E2C74, uint32);
|
||||
if (RCT2_GLOBAL(0x009E2BB8, uint32) == 2 && RCT2_GLOBAL(0x009E1AF8, uint32) == 1)
|
||||
RCT2_GLOBAL(0x009E2C74, uint32) = 1;
|
||||
|
||||
// Open dialog
|
||||
commonFlags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
|
||||
if (type == 0) {
|
||||
openFileName.Flags = commonFlags | OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT;
|
||||
result = GetSaveFileName(&openFileName);
|
||||
} else if (type == 1) {
|
||||
openFileName.Flags = commonFlags | OFN_NONETWORKBUTTON | OFN_FILEMUSTEXIST;
|
||||
result = GetOpenFileName(&openFileName);
|
||||
}
|
||||
|
||||
//
|
||||
RCT2_GLOBAL(0x009E2C74, uint32) = tmp;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void osinterface_show_messagebox(char* message)
|
||||
{
|
||||
MessageBox(NULL, message, "OpenRCT2", MB_OK);
|
||||
}
|
||||
|
||||
char* osinterface_open_directory_browser(char *title)
|
||||
{
|
||||
BROWSEINFO bi;
|
||||
char pszBuffer[MAX_PATH];
|
||||
LPITEMIDLIST pidl;
|
||||
LPMALLOC lpMalloc;
|
||||
|
||||
// Initialize COM
|
||||
if (FAILED(CoInitializeEx(0, COINIT_APARTMENTTHREADED))) {
|
||||
CoUninitialize();
|
||||
|
||||
log_error("Error opening directory browse window");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get a pointer to the shell memory allocator
|
||||
if (FAILED(SHGetMalloc(&lpMalloc))) {
|
||||
CoUninitialize();
|
||||
|
||||
log_error("Error opening directory browse window");
|
||||
return 0;
|
||||
}
|
||||
|
||||
bi.hwndOwner = NULL;
|
||||
bi.pidlRoot = NULL;
|
||||
bi.pszDisplayName = pszBuffer;
|
||||
bi.lpszTitle = _T(title);
|
||||
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
|
||||
bi.lpfn = NULL;
|
||||
bi.lParam = 0;
|
||||
|
||||
char *outPath = NULL;
|
||||
|
||||
if (pidl = SHBrowseForFolder(&bi)) {
|
||||
// Copy the path directory to the buffer
|
||||
if (SHGetPathFromIDList(pidl, pszBuffer)) {
|
||||
// Store pszBuffer (and the path) in the outPath
|
||||
outPath = (char*) malloc(strlen(pszBuffer)+1);
|
||||
strcpy(outPath, pszBuffer);
|
||||
}
|
||||
}
|
||||
CoUninitialize();
|
||||
return outPath;
|
||||
}
|
||||
|
||||
char* osinterface_get_orct2_homefolder()
|
||||
{
|
||||
char *path=NULL;
|
||||
path = malloc(sizeof(char) * MAX_PATH);
|
||||
if (path == NULL){
|
||||
log_fatal("Error allocating memory!");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
path[0] = '\0';
|
||||
|
||||
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, path)))
|
||||
strcat(path, "\\OpenRCT2");
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
char *osinterface_get_orct2_homesubfolder(const char *subFolder)
|
||||
{
|
||||
char *path = osinterface_get_orct2_homefolder();
|
||||
strcat(path, "\\");
|
||||
strcat(path, subFolder);
|
||||
return path;
|
||||
}
|
||||
|
||||
char osinterface_get_path_separator()
|
||||
{
|
||||
return '\\';
|
||||
}
|
|
@ -1,117 +0,0 @@
|
|||
/*****************************************************************************
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef _SDL_INTERFACE_H_
|
||||
#define _SDL_INTERFACE_H_
|
||||
|
||||
#include <windows.h>
|
||||
#include "../common.h"
|
||||
|
||||
enum {
|
||||
CURSOR_UP = 0,
|
||||
CURSOR_DOWN = 1,
|
||||
CURSOR_CHANGED = 2,
|
||||
CURSOR_RELEASED = CURSOR_UP | CURSOR_CHANGED,
|
||||
CURSOR_PRESSED = CURSOR_DOWN | CURSOR_CHANGED,
|
||||
};
|
||||
|
||||
enum{
|
||||
CURSOR_ARROW = 0,
|
||||
CURSOR_BLANK = 1,
|
||||
CURSOR_UP_ARROW = 2,
|
||||
CURSOR_UP_DOWN_ARROW = 3,
|
||||
CURSOR_HAND_POINT = 4,
|
||||
CURSOR_ZZZ = 5,
|
||||
CURSOR_DIAGONAL_ARROWS = 6,
|
||||
CURSOR_PICKER = 7,
|
||||
CURSOR_TREE_DOWN = 8,
|
||||
CURSOR_FOUNTAIN_DOWN = 9,
|
||||
CURSOR_STATUE_DOWN = 10,
|
||||
CURSOR_BENCH_DOWN = 11,
|
||||
CURSOR_CROSS_HAIR = 12,
|
||||
CURSOR_BIN_DOWN = 13,
|
||||
CURSOR_LAMPPOST_DOWN = 14,
|
||||
CURSOR_FENCE_DOWN = 15,
|
||||
CURSOR_FLOWER_DOWN = 16,
|
||||
CURSOR_PATH_DOWN = 17,
|
||||
CURSOR_DIG_DOWN = 18,
|
||||
CURSOR_WATER_DOWN = 19,
|
||||
CURSOR_HOUSE_DOWN = 20,
|
||||
CURSOR_VOLCANO_DOWN = 21,
|
||||
CURSOR_WALK_DOWN = 22,
|
||||
CURSOR_PAINT_DOWN = 23,
|
||||
CURSOR_ENTRANCE_DOWN = 24,
|
||||
CURSOR_HAND_OPEN = 25,
|
||||
CURSOR_HAND_CLOSED = 26
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
int x, y;
|
||||
unsigned char left, middle, right, any;
|
||||
int wheel;
|
||||
int old;
|
||||
} openrct2_cursor;
|
||||
|
||||
typedef struct {
|
||||
uint32 installlevel;
|
||||
char title[260];
|
||||
char path[260];
|
||||
uint32 var_20C;
|
||||
uint8 pad_210[0x100];
|
||||
char addon[16][0x80];
|
||||
uint32 addons; //0xB10
|
||||
} rct2_install_info;
|
||||
|
||||
extern openrct2_cursor gCursorState;
|
||||
extern const unsigned char *gKeysState;
|
||||
extern unsigned char *gKeysPressed;
|
||||
extern unsigned int gLastKeyPressed;
|
||||
extern int gTextInputCursorPosition;
|
||||
|
||||
void osinterface_start_text_input(char* buffer, int max_length);
|
||||
void osinterface_stop_text_input();
|
||||
void osinterface_init();
|
||||
void osinterface_process_messages();
|
||||
void osinterface_draw();
|
||||
void osinterface_free();
|
||||
void osinterface_update_palette(char* colours, int start_index, int num_colours);
|
||||
|
||||
void osinterface_set_fullscreen_mode(int mode);
|
||||
|
||||
void osinterface_progressbar_setmax(int max);
|
||||
void osinterface_progressbar_setpos(int pos);
|
||||
|
||||
void osinterface_set_cursor(char cursor);
|
||||
|
||||
HANDLE osinterface_file_open(const char* filename);
|
||||
int osinterface_file_read(HANDLE handle, void* data, int size);
|
||||
int osinterface_file_close(HANDLE handle);
|
||||
|
||||
int osinterface_open_common_file_dialog(int type, char *title, char *filename, char *filterPattern, char *filterName);
|
||||
void osinterface_show_messagebox(char* message);
|
||||
char* osinterface_open_directory_browser(char *title);
|
||||
|
||||
char* osinterface_get_orct2_homefolder();
|
||||
char *osinterface_get_orct2_homesubfolder(const char *subFolder);
|
||||
|
||||
char osinterface_get_path_separator();
|
||||
int osinterface_scancode_to_rct_keycode(int sdl_key);
|
||||
|
||||
#endif
|
|
@ -21,6 +21,8 @@
|
|||
#ifndef _PLATFORM_H_
|
||||
#define _PLATFORM_H_
|
||||
|
||||
#include <SDL.h>
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
#ifndef MAX_PATH
|
||||
|
@ -29,12 +31,57 @@
|
|||
|
||||
#define INVALID_HANDLE -1
|
||||
|
||||
typedef struct {
|
||||
int width, height;
|
||||
} resolution;
|
||||
|
||||
typedef struct {
|
||||
const char *path;
|
||||
uint64 size;
|
||||
uint64 last_modified;
|
||||
} file_info;
|
||||
|
||||
typedef struct {
|
||||
int x, y;
|
||||
unsigned char left, middle, right, any;
|
||||
int wheel;
|
||||
int old;
|
||||
} openrct2_cursor;
|
||||
|
||||
enum {
|
||||
CURSOR_UP = 0,
|
||||
CURSOR_DOWN = 1,
|
||||
CURSOR_CHANGED = 2,
|
||||
CURSOR_RELEASED = CURSOR_UP | CURSOR_CHANGED,
|
||||
CURSOR_PRESSED = CURSOR_DOWN | CURSOR_CHANGED,
|
||||
};
|
||||
|
||||
extern openrct2_cursor gCursorState;
|
||||
extern const unsigned char *gKeysState;
|
||||
extern unsigned char *gKeysPressed;
|
||||
extern unsigned int gLastKeyPressed;
|
||||
extern int gTextInputCursorPosition;
|
||||
|
||||
extern int gResolutionsAllowAnyAspectRatio;
|
||||
extern int gNumResolutions;
|
||||
extern resolution *gResolutions;
|
||||
extern SDL_Window *gWindow;
|
||||
|
||||
// Platform shared definitions
|
||||
void platform_update_fullscreen_resolutions();
|
||||
void platform_get_closest_resolution(int inWidth, int inHeight, int *outWidth, int *outHeight);
|
||||
void platform_init();
|
||||
void platform_draw();
|
||||
void platform_free();
|
||||
void platform_update_palette(char* colours, int start_index, int num_colours);
|
||||
void platform_set_fullscreen_mode(int mode);
|
||||
void platform_set_cursor(char cursor);
|
||||
void platform_process_messages();
|
||||
char *platform_get_orct2_homesubfolder();
|
||||
int platform_scancode_to_rct_keycode(int sdl_key);
|
||||
void platform_start_text_input(char* buffer, int max_length);
|
||||
void platform_stop_text_input();
|
||||
|
||||
// Platform specific definitions
|
||||
char platform_get_path_separator();
|
||||
int platform_file_exists(const char *path);
|
||||
|
@ -44,10 +91,28 @@ int platform_lock_single_instance();
|
|||
int platform_enumerate_files_begin(const char *pattern);
|
||||
int platform_enumerate_files_next(int handle, file_info *outFileInfo);
|
||||
void platform_enumerate_files_end(int handle);
|
||||
int platform_file_move(const char *srcPath, const char *dstPath);
|
||||
int platform_file_delete(const char *path);
|
||||
void platform_hide_cursor();
|
||||
void platform_show_cursor();
|
||||
void platform_get_cursor_position(int *x, int *y);
|
||||
void platform_set_cursor_position(int x, int y);
|
||||
unsigned int platform_get_ticks();
|
||||
char *platform_get_orct2_homefolder();
|
||||
void platform_show_messagebox(char *message);
|
||||
int platform_open_common_file_dialog(int type, char *title, char *filename, char *filterPattern, char *filterName);
|
||||
char *platform_open_directory_browser(char *title);
|
||||
|
||||
// Windows specific definitions
|
||||
#ifdef _WIN32
|
||||
// Defining WIN32_LEAN_AND_MEAN breaks dsound.h in audio.h (uncomment when dsound is finally removed)
|
||||
// #ifndef WIN32_LEAN_AND_MEAN
|
||||
// #define WIN32_LEAN_AND_MEAN
|
||||
// #endif
|
||||
#include <windows.h>
|
||||
|
||||
int windows_get_registry_install_info(rct2_install_info *installInfo, char *source, char *font, uint8 charset);
|
||||
HWND windows_get_window_handle();
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -18,3 +18,651 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <SDL.h>
|
||||
#include "../addresses.h"
|
||||
#include "../config.h"
|
||||
#include "../cursors.h"
|
||||
#include "../drawing/drawing.h"
|
||||
#include "../interface/keyboard_shortcut.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../input.h"
|
||||
#include "platform.h"
|
||||
|
||||
typedef void(*update_palette_func)(char*, int, int);
|
||||
|
||||
openrct2_cursor gCursorState;
|
||||
const unsigned char *gKeysState;
|
||||
unsigned char *gKeysPressed;
|
||||
unsigned int gLastKeyPressed;
|
||||
char* gTextInput;
|
||||
int gTextInputLength;
|
||||
int gTextInputMaxLength;
|
||||
int gTextInputCursorPosition = 0;
|
||||
|
||||
int gNumResolutions = 0;
|
||||
resolution *gResolutions = NULL;
|
||||
int gResolutionsAllowAnyAspectRatio = 0;
|
||||
|
||||
SDL_Window *gWindow;
|
||||
|
||||
static SDL_Surface *_surface;
|
||||
static SDL_Palette *_palette;
|
||||
static int _screenBufferSize;
|
||||
static void *_screenBuffer;
|
||||
static SDL_Cursor* _cursors[CURSOR_COUNT];
|
||||
static const int _fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP };
|
||||
static unsigned int _lastGestureTimestamp;
|
||||
static float _gestureRadius;
|
||||
|
||||
static void platform_create_window();
|
||||
static void platform_load_cursors();
|
||||
static void platform_unload_cursors();
|
||||
|
||||
int resolution_sort_func(const void *pa, const void *pb)
|
||||
{
|
||||
const resolution *a = (resolution*)pa;
|
||||
const resolution *b = (resolution*)pb;
|
||||
|
||||
int areaA = a->width * a->height;
|
||||
int areaB = b->width * b->height;
|
||||
|
||||
if (areaA == areaB) return 0;
|
||||
if (areaA < areaB) return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void platform_update_fullscreen_resolutions()
|
||||
{
|
||||
int i, displayIndex, numDisplayModes;
|
||||
SDL_DisplayMode mode;
|
||||
resolution *resLook, *resPlace;
|
||||
float desktopAspectRatio, aspectRatio;
|
||||
|
||||
// Query number of display modes
|
||||
displayIndex = SDL_GetWindowDisplayIndex(gWindow);
|
||||
numDisplayModes = SDL_GetNumDisplayModes(displayIndex);
|
||||
|
||||
// Get desktop aspect ratio
|
||||
SDL_GetDesktopDisplayMode(displayIndex, &mode);
|
||||
desktopAspectRatio = (float)mode.w / mode.h;
|
||||
|
||||
if (gResolutions != NULL)
|
||||
free(gResolutions);
|
||||
|
||||
// Get resolutions
|
||||
gNumResolutions = numDisplayModes;
|
||||
gResolutions = malloc(gNumResolutions * sizeof(resolution));
|
||||
|
||||
gNumResolutions = 0;
|
||||
for (i = 0; i < numDisplayModes; i++) {
|
||||
SDL_GetDisplayMode(displayIndex, i, &mode);
|
||||
|
||||
aspectRatio = (float)mode.w / mode.h;
|
||||
if (gResolutionsAllowAnyAspectRatio || fabs(desktopAspectRatio - aspectRatio) < 0.0001f) {
|
||||
gResolutions[gNumResolutions].width = mode.w;
|
||||
gResolutions[gNumResolutions].height = mode.h;
|
||||
gNumResolutions++;
|
||||
}
|
||||
}
|
||||
|
||||
// Sort by area
|
||||
qsort(gResolutions, gNumResolutions, sizeof(resolution), resolution_sort_func);
|
||||
|
||||
// Remove duplicates
|
||||
resPlace = &gResolutions[0];
|
||||
for (int i = 1; i < gNumResolutions; i++) {
|
||||
resLook = &gResolutions[i];
|
||||
if (resLook->width != resPlace->width || resLook->height != resPlace->height)
|
||||
*++resPlace = *resLook;
|
||||
}
|
||||
|
||||
gNumResolutions = (int)(resPlace - &gResolutions[0]) + 1;
|
||||
|
||||
// Update config fullscreen resolution if not set
|
||||
if (gGeneral_config.fullscreen_width == -1 || gGeneral_config.fullscreen_height == -1) {
|
||||
gGeneral_config.fullscreen_width = gResolutions[gNumResolutions - 1].width;
|
||||
gGeneral_config.fullscreen_height = gResolutions[gNumResolutions - 1].height;
|
||||
}
|
||||
}
|
||||
|
||||
void platform_get_closest_resolution(int inWidth, int inHeight, int *outWidth, int *outHeight)
|
||||
{
|
||||
int i, destinationArea, areaDiff, closestAreaDiff, closestWidth, closestHeight;
|
||||
|
||||
closestAreaDiff = -1;
|
||||
destinationArea = inWidth * inHeight;
|
||||
for (i = 0; i < gNumResolutions; i++) {
|
||||
// Check if exact match
|
||||
if (gResolutions[i].width == inWidth && gResolutions[i].height == inHeight) {
|
||||
closestWidth = gResolutions[i].width;
|
||||
closestHeight = gResolutions[i].height;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if area is closer to best match
|
||||
areaDiff = abs((gResolutions[i].width * gResolutions[i].height) - destinationArea);
|
||||
if (closestAreaDiff == -1 || areaDiff < closestAreaDiff) {
|
||||
closestAreaDiff = areaDiff;
|
||||
closestWidth = gResolutions[i].width;
|
||||
closestHeight = gResolutions[i].height;
|
||||
}
|
||||
}
|
||||
|
||||
if (closestAreaDiff != -1) {
|
||||
*outWidth = closestWidth;
|
||||
*outHeight = closestHeight;
|
||||
} else {
|
||||
*outWidth = 640;
|
||||
*outHeight = 480;
|
||||
}
|
||||
}
|
||||
|
||||
void platform_draw()
|
||||
{
|
||||
// Lock the surface before setting its pixels
|
||||
if (SDL_MUSTLOCK(_surface))
|
||||
if (SDL_LockSurface(_surface) < 0) {
|
||||
RCT2_ERROR("locking failed %s", SDL_GetError());
|
||||
return;
|
||||
}
|
||||
|
||||
// Copy pixels from the virtual screen buffer to the surface
|
||||
memcpy(_surface->pixels, _screenBuffer, _surface->pitch * _surface->h);
|
||||
|
||||
// Unlock the surface
|
||||
if (SDL_MUSTLOCK(_surface))
|
||||
SDL_UnlockSurface(_surface);
|
||||
|
||||
// Copy the surface to the window
|
||||
if (SDL_BlitSurface(_surface, NULL, SDL_GetWindowSurface(gWindow), NULL)) {
|
||||
RCT2_ERROR("SDL_BlitSurface %s", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
if (SDL_UpdateWindowSurface(gWindow)) {
|
||||
RCT2_ERROR("SDL_UpdateWindowSurface %s", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void platform_resize(int width, int height)
|
||||
{
|
||||
rct_drawpixelinfo *screenDPI;
|
||||
int newScreenBufferSize;
|
||||
void *newScreenBuffer;
|
||||
|
||||
if (_surface != NULL)
|
||||
SDL_FreeSurface(_surface);
|
||||
if (_palette != NULL)
|
||||
SDL_FreePalette(_palette);
|
||||
|
||||
_surface = SDL_CreateRGBSurface(0, width, height, 8, 0, 0, 0, 0);
|
||||
_palette = SDL_AllocPalette(256);
|
||||
|
||||
if (!_surface || !_palette) {
|
||||
RCT2_ERROR("%p || %p == NULL %s", _surface, _palette, SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (SDL_SetSurfacePalette(_surface, _palette)) {
|
||||
RCT2_ERROR("SDL_SetSurfacePalette failed %s", SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
newScreenBufferSize = _surface->pitch * _surface->h;
|
||||
newScreenBuffer = malloc(newScreenBufferSize);
|
||||
if (_screenBuffer == NULL) {
|
||||
memset(newScreenBuffer, 0, newScreenBufferSize);
|
||||
} else {
|
||||
memcpy(newScreenBuffer, _screenBuffer, min(_screenBufferSize, newScreenBufferSize));
|
||||
if (newScreenBufferSize - _screenBufferSize > 0)
|
||||
memset((uint8*)newScreenBuffer + _screenBufferSize, 0, newScreenBufferSize - _screenBufferSize);
|
||||
free(_screenBuffer);
|
||||
}
|
||||
|
||||
_screenBuffer = newScreenBuffer;
|
||||
_screenBufferSize = newScreenBufferSize;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) = width;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) = height;
|
||||
|
||||
screenDPI = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo);
|
||||
screenDPI->bits = _screenBuffer;
|
||||
screenDPI->x = 0;
|
||||
screenDPI->y = 0;
|
||||
screenDPI->width = width;
|
||||
screenDPI->height = height;
|
||||
screenDPI->pitch = _surface->pitch - _surface->w;
|
||||
|
||||
RCT2_GLOBAL(0x009ABDF0, uint8) = 6;
|
||||
RCT2_GLOBAL(0x009ABDF1, uint8) = 3;
|
||||
RCT2_GLOBAL(0x009ABDF2, uint8) = 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_WIDTH, sint16) = 64;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, sint16) = 8;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32) = (width >> 6) + 1;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, sint32) = (height >> 3) + 1;
|
||||
|
||||
window_resize_gui(width, height);
|
||||
window_relocate_windows(width, height);
|
||||
|
||||
gfx_invalidate_screen();
|
||||
}
|
||||
|
||||
void platform_update_palette(char* colours, int start_index, int num_colours)
|
||||
{
|
||||
SDL_Color base[256];
|
||||
SDL_Surface *surface;
|
||||
int i;
|
||||
|
||||
surface = SDL_GetWindowSurface(gWindow);
|
||||
if (!surface) {
|
||||
RCT2_ERROR("SDL_GetWindowSurface failed %s", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 256; i++) {
|
||||
base[i].r = colours[2];
|
||||
base[i].g = colours[1];
|
||||
base[i].b = colours[0];
|
||||
base[i].a = 0;
|
||||
colours += 4;
|
||||
}
|
||||
|
||||
if (SDL_SetPaletteColors(_palette, base, 0, 256)) {
|
||||
RCT2_ERROR("SDL_SetPaletteColors failed %s", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void platform_process_messages()
|
||||
{
|
||||
SDL_Event e;
|
||||
|
||||
gLastKeyPressed = 0;
|
||||
// gCursorState.wheel = 0;
|
||||
gCursorState.left &= ~CURSOR_CHANGED;
|
||||
gCursorState.middle &= ~CURSOR_CHANGED;
|
||||
gCursorState.right &= ~CURSOR_CHANGED;
|
||||
gCursorState.old = 0;
|
||||
|
||||
while (SDL_PollEvent(&e)) {
|
||||
switch (e.type) {
|
||||
case SDL_QUIT:
|
||||
// rct2_finish();
|
||||
rct2_quit();
|
||||
break;
|
||||
case SDL_WINDOWEVENT:
|
||||
if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
|
||||
platform_resize(e.window.data1, e.window.data2);
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
RCT2_GLOBAL(0x0142406C, int) = e.motion.x;
|
||||
RCT2_GLOBAL(0x01424070, int) = e.motion.y;
|
||||
|
||||
gCursorState.x = e.motion.x;
|
||||
gCursorState.y = e.motion.y;
|
||||
break;
|
||||
case SDL_MOUSEWHEEL:
|
||||
gCursorState.wheel += e.wheel.y * 128;
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
RCT2_GLOBAL(0x01424318, int) = e.button.x;
|
||||
RCT2_GLOBAL(0x0142431C, int) = e.button.y;
|
||||
switch (e.button.button) {
|
||||
case SDL_BUTTON_LEFT:
|
||||
store_mouse_input(1);
|
||||
gCursorState.left = CURSOR_PRESSED;
|
||||
gCursorState.old = 1;
|
||||
break;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
gCursorState.middle = CURSOR_PRESSED;
|
||||
break;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
store_mouse_input(3);
|
||||
gCursorState.right = CURSOR_PRESSED;
|
||||
gCursorState.old = 2;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
RCT2_GLOBAL(0x01424318, int) = e.button.x;
|
||||
RCT2_GLOBAL(0x0142431C, int) = e.button.y;
|
||||
switch (e.button.button) {
|
||||
case SDL_BUTTON_LEFT:
|
||||
store_mouse_input(2);
|
||||
gCursorState.left = CURSOR_RELEASED;
|
||||
gCursorState.old = 3;
|
||||
break;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
gCursorState.middle = CURSOR_RELEASED;
|
||||
break;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
store_mouse_input(4);
|
||||
gCursorState.right = CURSOR_RELEASED;
|
||||
gCursorState.old = 4;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
if (e.key.keysym.sym == SDLK_KP_ENTER){
|
||||
// Map Keypad enter to regular enter.
|
||||
e.key.keysym.scancode = SDL_SCANCODE_RETURN;
|
||||
}
|
||||
|
||||
gLastKeyPressed = e.key.keysym.sym;
|
||||
gKeysPressed[e.key.keysym.scancode] = 1;
|
||||
if (e.key.keysym.sym == SDLK_RETURN && e.key.keysym.mod & KMOD_ALT) {
|
||||
int targetMode = gGeneral_config.fullscreen_mode == 0 ? 2 : 0;
|
||||
platform_set_fullscreen_mode(targetMode);
|
||||
gGeneral_config.fullscreen_mode = targetMode;
|
||||
config_save();
|
||||
break;
|
||||
}
|
||||
|
||||
// Text input
|
||||
|
||||
// If backspace and we have input text with a cursor position none zero
|
||||
if (e.key.keysym.sym == SDLK_BACKSPACE && gTextInputLength > 0 && gTextInput && gTextInputCursorPosition){
|
||||
// When at max length don't shift the data left
|
||||
// as it would buffer overflow.
|
||||
if (gTextInputCursorPosition != gTextInputMaxLength)
|
||||
memmove(gTextInput + gTextInputCursorPosition - 1, gTextInput + gTextInputCursorPosition, gTextInputMaxLength - gTextInputCursorPosition - 1);
|
||||
gTextInput[gTextInputLength - 1] = '\0';
|
||||
gTextInputCursorPosition--;
|
||||
gTextInputLength--;
|
||||
}
|
||||
if (e.key.keysym.sym == SDLK_END){
|
||||
gTextInputCursorPosition = gTextInputLength;
|
||||
}
|
||||
if (e.key.keysym.sym == SDLK_HOME){
|
||||
gTextInputCursorPosition = 0;
|
||||
}
|
||||
if (e.key.keysym.sym == SDLK_DELETE && gTextInputLength > 0 && gTextInput && gTextInputCursorPosition != gTextInputLength){
|
||||
memmove(gTextInput + gTextInputCursorPosition, gTextInput + gTextInputCursorPosition + 1, gTextInputMaxLength - gTextInputCursorPosition - 1);
|
||||
gTextInput[gTextInputMaxLength - 1] = '\0';
|
||||
gTextInputLength--;
|
||||
}
|
||||
if (e.key.keysym.sym == SDLK_LEFT && gTextInput){
|
||||
if (gTextInputCursorPosition) gTextInputCursorPosition--;
|
||||
}
|
||||
else if (e.key.keysym.sym == SDLK_RIGHT && gTextInput){
|
||||
if (gTextInputCursorPosition < gTextInputLength) gTextInputCursorPosition++;
|
||||
}
|
||||
break;
|
||||
case SDL_MULTIGESTURE:
|
||||
if (e.mgesture.numFingers == 2) {
|
||||
if (e.mgesture.timestamp > _lastGestureTimestamp + 1000)
|
||||
_gestureRadius = 0;
|
||||
_lastGestureTimestamp = e.mgesture.timestamp;
|
||||
_gestureRadius += e.mgesture.dDist;
|
||||
|
||||
// Zoom gesture
|
||||
const int tolerance = 128;
|
||||
int gesturePixels = (int)(_gestureRadius * RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16));
|
||||
if (gesturePixels > tolerance) {
|
||||
_gestureRadius = 0;
|
||||
keyboard_shortcut_handle_command(SHORTCUT_ZOOM_VIEW_IN);
|
||||
} else if (gesturePixels < -tolerance) {
|
||||
_gestureRadius = 0;
|
||||
keyboard_shortcut_handle_command(SHORTCUT_ZOOM_VIEW_OUT);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_TEXTINPUT:
|
||||
if (gTextInputLength < gTextInputMaxLength && gTextInput){
|
||||
// Convert the utf-8 code into rct ascii
|
||||
char new_char;
|
||||
if (!(e.text.text[0] & 0x80))
|
||||
new_char = *e.text.text;
|
||||
else if (!(e.text.text[0] & 0x20))
|
||||
new_char = ((e.text.text[0] & 0x1F) << 6) | (e.text.text[1] & 0x3F);
|
||||
|
||||
// If inserting in center of string make space for new letter
|
||||
if (gTextInputLength > gTextInputCursorPosition){
|
||||
memmove(gTextInput + gTextInputCursorPosition + 1, gTextInput + gTextInputCursorPosition, gTextInputMaxLength - gTextInputCursorPosition - 1);
|
||||
gTextInput[gTextInputCursorPosition] = new_char;
|
||||
gTextInputLength++;
|
||||
}
|
||||
else gTextInput[gTextInputLength++] = new_char;
|
||||
|
||||
gTextInputCursorPosition++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gCursorState.any = gCursorState.left | gCursorState.middle | gCursorState.right;
|
||||
|
||||
// Updates the state of the keys
|
||||
int numKeys = 256;
|
||||
gKeysState = SDL_GetKeyboardState(&numKeys);
|
||||
}
|
||||
|
||||
static void platform_close_window()
|
||||
{
|
||||
if (gWindow != NULL)
|
||||
SDL_DestroyWindow(gWindow);
|
||||
if (_surface != NULL)
|
||||
SDL_FreeSurface(_surface);
|
||||
if (_palette != NULL)
|
||||
SDL_FreePalette(_palette);
|
||||
platform_unload_cursors();
|
||||
}
|
||||
|
||||
void platform_init()
|
||||
{
|
||||
platform_create_window();
|
||||
gKeysPressed = malloc(sizeof(unsigned char) * 256);
|
||||
memset(gKeysPressed, 0, sizeof(unsigned char) * 256);
|
||||
// RCT2_CALLPROC(0x00404584); // dinput_init()
|
||||
}
|
||||
|
||||
static void platform_create_window()
|
||||
{
|
||||
int width, height;
|
||||
|
||||
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||
RCT2_ERROR("SDL_Init %s", SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
platform_load_cursors();
|
||||
RCT2_CALLPROC_EBPSAFE(0x0068371D);
|
||||
|
||||
// Get window size
|
||||
width = gGeneral_config.window_width;
|
||||
height = gGeneral_config.window_height;
|
||||
if (width == -1) width = 640;
|
||||
if (height == -1) height = 480;
|
||||
|
||||
RCT2_GLOBAL(0x009E2D8C, sint32) = 0;
|
||||
|
||||
// Create window in window first rather than fullscreen so we have the display the window is on first
|
||||
gWindow = SDL_CreateWindow(
|
||||
"OpenRCT2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_RESIZABLE
|
||||
);
|
||||
if (!gWindow) {
|
||||
log_fatal("SDL_CreateWindow failed %s", SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// Set the update palette function pointer
|
||||
RCT2_GLOBAL(0x009E2BE4, update_palette_func) = platform_update_palette;
|
||||
|
||||
// Initialise the surface, palette and draw buffer
|
||||
platform_resize(width, height);
|
||||
|
||||
platform_update_fullscreen_resolutions();
|
||||
platform_set_fullscreen_mode(gGeneral_config.fullscreen_mode);
|
||||
}
|
||||
|
||||
int platform_scancode_to_rct_keycode(int sdl_key)
|
||||
{
|
||||
char keycode = (char)SDL_GetKeyFromScancode((SDL_Scancode)sdl_key);
|
||||
|
||||
// Until we reshufle the text files to use the new positions
|
||||
// this will suffice to move the majority to the correct positions.
|
||||
// Note any special buttons PgUp PgDwn are mapped wrong.
|
||||
if (keycode >= 'a' && keycode <= 'z')
|
||||
keycode = toupper(keycode);
|
||||
|
||||
return keycode;
|
||||
}
|
||||
|
||||
void platform_free()
|
||||
{
|
||||
free(gKeysPressed);
|
||||
|
||||
platform_close_window();
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
void platform_start_text_input(char* buffer, int max_length)
|
||||
{
|
||||
SDL_StartTextInput();
|
||||
gTextInputMaxLength = max_length - 1;
|
||||
gTextInput = buffer;
|
||||
gTextInputCursorPosition = strnlen(gTextInput, max_length);
|
||||
gTextInputLength = gTextInputCursorPosition;
|
||||
}
|
||||
|
||||
void platform_stop_text_input()
|
||||
{
|
||||
SDL_StopTextInput();
|
||||
gTextInput = NULL;
|
||||
}
|
||||
|
||||
static void platform_unload_cursors()
|
||||
{
|
||||
for (int i = 0; i < CURSOR_COUNT; i++)
|
||||
if (_cursors[i] != NULL)
|
||||
SDL_FreeCursor(_cursors[i]);
|
||||
}
|
||||
|
||||
void platform_set_fullscreen_mode(int mode)
|
||||
{
|
||||
int width, height;
|
||||
|
||||
mode = _fullscreen_modes[mode];
|
||||
|
||||
// HACK Changing window size when in fullscreen usually has no effect
|
||||
if (mode == SDL_WINDOW_FULLSCREEN)
|
||||
SDL_SetWindowFullscreen(gWindow, 0);
|
||||
|
||||
// Set window size
|
||||
if (mode == SDL_WINDOW_FULLSCREEN) {
|
||||
platform_update_fullscreen_resolutions();
|
||||
platform_get_closest_resolution(gGeneral_config.fullscreen_width, gGeneral_config.fullscreen_height, &width, &height);
|
||||
SDL_SetWindowSize(gWindow, width, height);
|
||||
} else if (mode == 0) {
|
||||
SDL_SetWindowSize(gWindow, gGeneral_config.window_width, gGeneral_config.window_height);
|
||||
}
|
||||
|
||||
if (SDL_SetWindowFullscreen(gWindow, mode)) {
|
||||
log_fatal("SDL_SetWindowFullscreen %s", SDL_GetError());
|
||||
exit(1);
|
||||
|
||||
// TODO try another display mode rather than just exiting the game
|
||||
}
|
||||
}
|
||||
|
||||
char *platform_get_orct2_homesubfolder(const char *subFolder)
|
||||
{
|
||||
char seperator = platform_get_path_separator();
|
||||
|
||||
char *path = platform_get_orct2_homefolder();
|
||||
strcat(path, &seperator);
|
||||
strcat(path, subFolder);
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is not quite the same as the below function as we don't want to
|
||||
* derfererence the cursor before the function.
|
||||
* rct2: 0x0407956
|
||||
*/
|
||||
void platform_set_cursor(char cursor)
|
||||
{
|
||||
SDL_SetCursor(_cursors[cursor]);
|
||||
}
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0068352C
|
||||
*/
|
||||
static void platform_load_cursors()
|
||||
{
|
||||
RCT2_GLOBAL(0x14241BC, uint32) = 2;
|
||||
HINSTANCE hInst = RCT2_GLOBAL(RCT2_ADDRESS_HINSTANCE, HINSTANCE);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ARROW, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x74));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_BLANK, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA1));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_UP_ARROW, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x6D));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_UP_DOWN_ARROW, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x6E));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_POINT, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x70));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ZZZ, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x78));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_DIAGONAL_ARROWS, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x77));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_PICKER, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x7C));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_TREE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x83));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_FOUNTAIN_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x7F));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_STATUE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x80));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_BENCH_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x81));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_CROSS_HAIR, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x82));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_BIN_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x84));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_LAMPPOST_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x85));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_FENCE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8A));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_FLOWER_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x89));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_PATH_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8B));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_DIG_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8D));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_WATER_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8E));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HOUSE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x8F));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_VOLCANO_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x90));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_WALK_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x91));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_PAINT_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x9E));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ENTRANCE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x9F));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_OPEN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA6));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_CLOSED, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA5));
|
||||
|
||||
_cursors[0] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW);
|
||||
_cursors[1] = SDL_CreateCursor(blank_cursor_data, blank_cursor_mask, 32, 32, BLANK_CURSOR_HOTX, BLANK_CURSOR_HOTY);
|
||||
_cursors[2] = SDL_CreateCursor(up_arrow_cursor_data, up_arrow_cursor_mask, 32, 32, UP_ARROW_CURSOR_HOTX, UP_ARROW_CURSOR_HOTY);
|
||||
_cursors[3] = SDL_CreateCursor(up_down_arrow_cursor_data, up_down_arrow_cursor_mask, 32, 32, UP_DOWN_ARROW_CURSOR_HOTX, UP_DOWN_ARROW_CURSOR_HOTY);
|
||||
_cursors[4] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND);
|
||||
_cursors[5] = SDL_CreateCursor(zzz_cursor_data, zzz_cursor_mask, 32, 32, ZZZ_CURSOR_HOTX, ZZZ_CURSOR_HOTY);
|
||||
_cursors[6] = SDL_CreateCursor(diagonal_arrow_cursor_data, diagonal_arrow_cursor_mask, 32, 32, DIAGONAL_ARROW_CURSOR_HOTX, DIAGONAL_ARROW_CURSOR_HOTY);
|
||||
_cursors[7] = SDL_CreateCursor(picker_cursor_data, picker_cursor_mask, 32, 32, PICKER_CURSOR_HOTX, PICKER_CURSOR_HOTY);
|
||||
_cursors[8] = SDL_CreateCursor(tree_down_cursor_data, tree_down_cursor_mask, 32, 32, TREE_DOWN_CURSOR_HOTX, TREE_DOWN_CURSOR_HOTY);
|
||||
_cursors[9] = SDL_CreateCursor(fountain_down_cursor_data, fountain_down_cursor_mask, 32, 32, FOUNTAIN_DOWN_CURSOR_HOTX, FOUNTAIN_DOWN_CURSOR_HOTY);
|
||||
_cursors[10] = SDL_CreateCursor(statue_down_cursor_data, statue_down_cursor_mask, 32, 32, STATUE_DOWN_CURSOR_HOTX, STATUE_DOWN_CURSOR_HOTY);
|
||||
_cursors[11] = SDL_CreateCursor(bench_down_cursor_data, bench_down_cursor_mask, 32, 32, BENCH_DOWN_CURSOR_HOTX, BENCH_DOWN_CURSOR_HOTY);
|
||||
_cursors[12] = SDL_CreateCursor(cross_hair_cursor_data, cross_hair_cursor_mask, 32, 32, CROSS_HAIR_CURSOR_HOTX, CROSS_HAIR_CURSOR_HOTY);
|
||||
_cursors[13] = SDL_CreateCursor(bin_down_cursor_data, bin_down_cursor_mask, 32, 32, BIN_DOWN_CURSOR_HOTX, BIN_DOWN_CURSOR_HOTY);
|
||||
_cursors[14] = SDL_CreateCursor(lamppost_down_cursor_data, lamppost_down_cursor_mask, 32, 32, LAMPPOST_DOWN_CURSOR_HOTX, LAMPPOST_DOWN_CURSOR_HOTY);
|
||||
_cursors[15] = SDL_CreateCursor(fence_down_cursor_data, fence_down_cursor_mask, 32, 32, FENCE_DOWN_CURSOR_HOTX, FENCE_DOWN_CURSOR_HOTY);
|
||||
_cursors[16] = SDL_CreateCursor(flower_down_cursor_data, flower_down_cursor_mask, 32, 32, FLOWER_DOWN_CURSOR_HOTX, FLOWER_DOWN_CURSOR_HOTY);
|
||||
_cursors[17] = SDL_CreateCursor(path_down_cursor_data, path_down_cursor_mask, 32, 32, PATH_DOWN_CURSOR_HOTX, PATH_DOWN_CURSOR_HOTY);
|
||||
_cursors[18] = SDL_CreateCursor(dig_down_cursor_data, dig_down_cursor_mask, 32, 32, DIG_DOWN_CURSOR_HOTX, DIG_DOWN_CURSOR_HOTY);
|
||||
_cursors[19] = SDL_CreateCursor(water_down_cursor_data, water_down_cursor_mask, 32, 32, WATER_DOWN_CURSOR_HOTX, WATER_DOWN_CURSOR_HOTY);
|
||||
_cursors[20] = SDL_CreateCursor(house_down_cursor_data, house_down_cursor_mask, 32, 32, HOUSE_DOWN_CURSOR_HOTX, HOUSE_DOWN_CURSOR_HOTY);
|
||||
_cursors[21] = SDL_CreateCursor(volcano_down_cursor_data, volcano_down_cursor_mask, 32, 32, VOLCANO_DOWN_CURSOR_HOTX, VOLCANO_DOWN_CURSOR_HOTY);
|
||||
_cursors[22] = SDL_CreateCursor(walk_down_cursor_data, walk_down_cursor_mask, 32, 32, WALK_DOWN_CURSOR_HOTX, WALK_DOWN_CURSOR_HOTY);
|
||||
_cursors[23] = SDL_CreateCursor(paint_down_cursor_data, paint_down_cursor_mask, 32, 32, PAINT_DOWN_CURSOR_HOTX, PAINT_DOWN_CURSOR_HOTY);
|
||||
_cursors[24] = SDL_CreateCursor(entrance_down_cursor_data, entrance_down_cursor_mask, 32, 32, ENTRANCE_DOWN_CURSOR_HOTX, ENTRANCE_DOWN_CURSOR_HOTY);
|
||||
_cursors[25] = SDL_CreateCursor(hand_open_cursor_data, hand_open_cursor_mask, 32, 32, HAND_OPEN_CURSOR_HOTX, HAND_OPEN_CURSOR_HOTY);
|
||||
_cursors[26] = SDL_CreateCursor(hand_closed_cursor_data, hand_closed_cursor_mask, 32, 32, HAND_CLOSED_CURSOR_HOTX, HAND_CLOSED_CURSOR_HOTY);
|
||||
platform_set_cursor(CURSOR_ARROW);
|
||||
RCT2_GLOBAL(0x14241BC, uint32) = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407D80
|
||||
*/
|
||||
int platform_get_cursor_pos(int* x, int* y)
|
||||
{
|
||||
POINT point;
|
||||
GetCursorPos(&point);
|
||||
*x = point.x;
|
||||
*y = point.y;
|
||||
}
|
|
@ -20,7 +20,9 @@
|
|||
|
||||
#ifdef _WIN32
|
||||
|
||||
#include <shlobj.h>
|
||||
#include <windows.h>
|
||||
#include <SDL_syswm.h>
|
||||
#include "../addresses.h"
|
||||
#include "../cmdline.h"
|
||||
#include "../openrct2.h"
|
||||
|
@ -70,7 +72,7 @@ __declspec(dllexport) int StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevInsta
|
|||
// Get command line arguments in standard form
|
||||
argv = CommandLineToArgvA(lpCmdLine, &argc);
|
||||
runGame = cmdline_run(argv, argc);
|
||||
LocalFree(argv);
|
||||
GlobalFree(argv);
|
||||
|
||||
if (runGame)
|
||||
openrct2_launch();
|
||||
|
@ -190,6 +192,16 @@ void platform_enumerate_files_end(int handle)
|
|||
enumFileInfo->active = 0;
|
||||
}
|
||||
|
||||
int platform_file_move(const char *srcPath, const char *dstPath)
|
||||
{
|
||||
return MoveFileA(srcPath, dstPath);
|
||||
}
|
||||
|
||||
int platform_file_delete(const char *path)
|
||||
{
|
||||
return DeleteFileA(path);
|
||||
}
|
||||
|
||||
void platform_hide_cursor()
|
||||
{
|
||||
ShowCursor(FALSE);
|
||||
|
@ -223,6 +235,203 @@ unsigned int platform_get_ticks()
|
|||
return GetTickCount();
|
||||
}
|
||||
|
||||
char* platform_get_orct2_homefolder()
|
||||
{
|
||||
char *path = NULL;
|
||||
path = malloc(sizeof(char) * MAX_PATH);
|
||||
if (path == NULL){
|
||||
log_fatal("Error allocating memory!");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
path[0] = '\0';
|
||||
|
||||
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, path)))
|
||||
strcat(path, "\\OpenRCT2");
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
void platform_show_messagebox(char *message)
|
||||
{
|
||||
MessageBoxA(windows_get_window_handle(), message, "OpenRCT2", MB_OK);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x004080EA
|
||||
*/
|
||||
int platform_open_common_file_dialog(int type, char *title, char *filename, char *filterPattern, char *filterName)
|
||||
{
|
||||
char initialDirectory[MAX_PATH], *dotAddress, *slashAddress;
|
||||
OPENFILENAME openFileName;
|
||||
BOOL result;
|
||||
int tmp;
|
||||
DWORD commonFlags;
|
||||
|
||||
// Get directory path from given filename
|
||||
strcpy(initialDirectory, filename);
|
||||
dotAddress = strrchr(initialDirectory, '.');
|
||||
if (dotAddress != NULL) {
|
||||
slashAddress = strrchr(initialDirectory, '\\');
|
||||
if (slashAddress < dotAddress)
|
||||
*(slashAddress + 1) = 0;
|
||||
}
|
||||
|
||||
// Clear filename
|
||||
if (type != 0)
|
||||
*filename = 0;
|
||||
|
||||
// Set open file name options
|
||||
memset(&openFileName, 0, sizeof(OPENFILENAME));
|
||||
openFileName.lStructSize = sizeof(OPENFILENAME);
|
||||
openFileName.hwndOwner = windows_get_window_handle();
|
||||
openFileName.lpstrFile = filename;
|
||||
openFileName.nMaxFile = MAX_PATH;
|
||||
openFileName.lpstrInitialDir = initialDirectory;
|
||||
openFileName.lpstrTitle = title;
|
||||
|
||||
// Copy filter name
|
||||
strcpy((char*)0x01423800, filterName);
|
||||
|
||||
// Copy filter pattern
|
||||
strcpy((char*)0x01423800 + strlen(filterName) + 1, filterPattern);
|
||||
*((char*)(0x01423800 + strlen(filterName) + 1 + strlen(filterPattern) + 1)) = 0;
|
||||
openFileName.lpstrFilter = (char*)0x01423800;
|
||||
|
||||
//
|
||||
tmp = RCT2_GLOBAL(0x009E2C74, uint32);
|
||||
if (RCT2_GLOBAL(0x009E2BB8, uint32) == 2 && RCT2_GLOBAL(0x009E1AF8, uint32) == 1)
|
||||
RCT2_GLOBAL(0x009E2C74, uint32) = 1;
|
||||
|
||||
// Open dialog
|
||||
commonFlags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
|
||||
if (type == 0) {
|
||||
openFileName.Flags = commonFlags | OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT;
|
||||
result = GetSaveFileName(&openFileName);
|
||||
} else if (type == 1) {
|
||||
openFileName.Flags = commonFlags | OFN_NONETWORKBUTTON | OFN_FILEMUSTEXIST;
|
||||
result = GetOpenFileName(&openFileName);
|
||||
}
|
||||
|
||||
//
|
||||
RCT2_GLOBAL(0x009E2C74, uint32) = tmp;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
char *platform_open_directory_browser(char *title)
|
||||
{
|
||||
BROWSEINFO bi;
|
||||
char pszBuffer[MAX_PATH];
|
||||
LPITEMIDLIST pidl;
|
||||
LPMALLOC lpMalloc;
|
||||
|
||||
// Initialize COM
|
||||
if (FAILED(CoInitializeEx(0, COINIT_APARTMENTTHREADED))) {
|
||||
CoUninitialize();
|
||||
|
||||
log_error("Error opening directory browse window");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get a pointer to the shell memory allocator
|
||||
if (FAILED(SHGetMalloc(&lpMalloc))) {
|
||||
CoUninitialize();
|
||||
|
||||
log_error("Error opening directory browse window");
|
||||
return 0;
|
||||
}
|
||||
|
||||
bi.hwndOwner = NULL;
|
||||
bi.pidlRoot = NULL;
|
||||
bi.pszDisplayName = pszBuffer;
|
||||
bi.lpszTitle = title;
|
||||
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
|
||||
bi.lpfn = NULL;
|
||||
bi.lParam = 0;
|
||||
|
||||
char *outPath = NULL;
|
||||
|
||||
if (pidl = SHBrowseForFolder(&bi)) {
|
||||
// Copy the path directory to the buffer
|
||||
if (SHGetPathFromIDList(pidl, pszBuffer)) {
|
||||
// Store pszBuffer (and the path) in the outPath
|
||||
outPath = (char*) malloc(strlen(pszBuffer)+1);
|
||||
strcpy(outPath, pszBuffer);
|
||||
}
|
||||
}
|
||||
CoUninitialize();
|
||||
return outPath;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00407978
|
||||
*/
|
||||
int windows_get_registry_install_info(rct2_install_info *installInfo, char *source, char *font, uint8 charset)
|
||||
{
|
||||
char subkeyInfogrames[MAX_PATH], subkeyFishTechGroup[MAX_PATH], keyName[100];
|
||||
LOGFONTA lf;
|
||||
HKEY hKey;
|
||||
DWORD type, size;
|
||||
|
||||
strcpy(subkeyInfogrames, "Software\\Infogrames\\");
|
||||
strcat(subkeyInfogrames, source);
|
||||
strcpy(subkeyFishTechGroup, "Software\\Fish Technology Group\\");
|
||||
strcat(subkeyFishTechGroup, source);
|
||||
|
||||
memset(&lf, 0, sizeof(lf));
|
||||
lf.lfCharSet = charset;
|
||||
lf.lfHeight = 12;
|
||||
lf.lfWeight = 400;
|
||||
strcpy(lf.lfFaceName, font);
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_HFONT, HFONT) = CreateFontIndirectA(&lf);
|
||||
|
||||
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, subkeyInfogrames, &hKey) != ERROR_SUCCESS)
|
||||
return 0;
|
||||
|
||||
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, subkeyFishTechGroup, &hKey) != ERROR_SUCCESS)
|
||||
return 0;
|
||||
|
||||
|
||||
size = 260;
|
||||
RegQueryValueExA(hKey, "Title", 0, &type, installInfo->title, &size);
|
||||
|
||||
size = 260;
|
||||
RegQueryValueExA(hKey, "Path", 0, &type, installInfo->path, &size);
|
||||
|
||||
installInfo->var_20C = 235960;
|
||||
|
||||
size = 4;
|
||||
RegQueryValueExA(hKey, "InstallLevel", 0, &type, (LPBYTE)&installInfo->installLevel, &size);
|
||||
for (int i = 0; i <= 15; i++) {
|
||||
sprintf(keyName, "AddonPack%d", i);
|
||||
size = sizeof(installInfo->expansionPackNames[i]);
|
||||
if (RegQueryValueExA(hKey, keyName, 0, &type, installInfo->expansionPackNames[i], &size) == ERROR_SUCCESS)
|
||||
installInfo->activeExpansionPacks |= (1 << i);
|
||||
}
|
||||
|
||||
RegCloseKey(hKey);
|
||||
return 1;
|
||||
}
|
||||
|
||||
HWND windows_get_window_handle()
|
||||
{
|
||||
SDL_SysWMinfo wmInfo;
|
||||
|
||||
if (gWindow == NULL)
|
||||
return NULL;
|
||||
|
||||
SDL_VERSION(&wmInfo.version);
|
||||
if (SDL_GetWindowWMInfo(gWindow, &wmInfo) != SDL_TRUE) {
|
||||
log_error("SDL_GetWindowWMInfo failed %s", SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
return wmInfo.info.win.window;
|
||||
}
|
||||
|
||||
/**
|
||||
* http://alter.org.ua/en/docs/win/args/
|
||||
*/
|
||||
|
@ -243,11 +452,13 @@ PCHAR *CommandLineToArgvA(PCHAR CmdLine, int *_argc)
|
|||
i = ((len + 2) / 2)*sizeof(PVOID) + sizeof(PVOID);
|
||||
|
||||
argv = (PCHAR*)GlobalAlloc(GMEM_FIXED,
|
||||
i + (len + 2)*sizeof(CHAR));
|
||||
i + (len + 2)*sizeof(CHAR) + 1);
|
||||
|
||||
_argv = (PCHAR)(((PUCHAR)argv) + i);
|
||||
|
||||
argc = 0;
|
||||
// Add in virtual 1st command line argument, process path, for arg_parse's sake.
|
||||
argv[0] = 0;
|
||||
argc = 1;
|
||||
argv[argc] = _argv;
|
||||
in_QM = FALSE;
|
||||
in_TEXT = FALSE;
|
||||
|
|
|
@ -0,0 +1,347 @@
|
|||
/*****************************************************************************
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef _RCT1_H_
|
||||
#define _RCT1_H_
|
||||
|
||||
#include "management/award.h"
|
||||
#include "management/news_item.h"
|
||||
#include "management/research.h"
|
||||
#include "rct2.h"
|
||||
#include "ride/ride.h"
|
||||
#include "world/banner.h"
|
||||
#include "world/map.h"
|
||||
#include "world/sprite.h"
|
||||
|
||||
typedef struct {
|
||||
uint16 x;
|
||||
uint16 y;
|
||||
uint16 z;
|
||||
uint8 direction;
|
||||
} rct1_entrance;
|
||||
|
||||
/**
|
||||
* RCT1,AA,LL scenario / saved game structure.
|
||||
* size: 0x1F850C
|
||||
*/
|
||||
typedef struct {
|
||||
uint16 month;
|
||||
uint16 day;
|
||||
uint32 ticks;
|
||||
uint32 random_a;
|
||||
uint32 random_b;
|
||||
rct_map_element map_elements[0xC000];
|
||||
uint32 unk_counter;
|
||||
rct_sprite sprites[5000];
|
||||
uint16 next_sprite_index;
|
||||
uint16 first_vehicle_sprite_index;
|
||||
uint16 first_peep_sprite_index;
|
||||
uint16 first_duck_sprite_index;
|
||||
uint16 first_litter_sprite_index;
|
||||
uint16 first_oversized_ride_car_sprite_index;
|
||||
uint16 sprites_available;
|
||||
uint16 num_vehicle_sprites;
|
||||
uint16 num_peep_sprites;
|
||||
uint16 num_duck_sprites;
|
||||
uint16 num_litter_sprites;
|
||||
uint16 num_oversized_ride_car_sprites;
|
||||
uint32 park_name_string_index;
|
||||
uint32 unk_198830;
|
||||
money32 cash;
|
||||
money32 loan;
|
||||
uint32 park_flags;
|
||||
money16 park_entrance_fee;
|
||||
rct1_entrance park_entrance;
|
||||
uint8 unk_198849;
|
||||
rct2_peep_spawn peep_spawn[2];
|
||||
uint8 unk_198856;
|
||||
uint8 research_level;
|
||||
uint32 unk_198858;
|
||||
uint8 available_rides[32];
|
||||
uint8 available_vehicles[32];
|
||||
uint32 ride_feature_1[128];
|
||||
uint32 ride_feature_2[128];
|
||||
uint16 guests_in_park;
|
||||
uint16 unk_198C9E;
|
||||
money32 expenditure[14 * 16];
|
||||
uint32 guests_in_park_2;
|
||||
uint8 unk_199024;
|
||||
uint8 handman_colour;
|
||||
uint8 mechanic_colour;
|
||||
uint8 security_guard_colour;
|
||||
uint8 available_scenery[128];
|
||||
uint16 available_banners;
|
||||
uint8 unk_1990AA[94];
|
||||
uint16 park_rating;
|
||||
uint8 park_rating_history[32];
|
||||
uint8 guests_in_park_history[32];
|
||||
uint8 research_priority;
|
||||
uint8 research_progress;
|
||||
uint8 last_research_item;
|
||||
uint8 last_research_ride;
|
||||
uint8 last_research_category;
|
||||
uint8 last_research_flag;
|
||||
rct_research_item research_items[200];
|
||||
uint8 next_research_item;
|
||||
uint8 next_research_ride;
|
||||
uint8 next_research_category;
|
||||
uint8 next_research_flag;
|
||||
uint16 unk_19953C;
|
||||
uint32 unk_19953E;
|
||||
uint16 cheat_detection_land_owned;
|
||||
uint16 unk_199544;
|
||||
money16 median_recommended_park_entry_fee;
|
||||
money32 max_loan;
|
||||
money16 guest_initial_cash;
|
||||
uint8 guest_initial_hunger;
|
||||
uint8 guest_initial_thirst;
|
||||
uint8 scenario_objective_type;
|
||||
uint8 scenario_objective_years;
|
||||
uint16 unk_199552;
|
||||
money32 scenario_objective_currency;
|
||||
uint16 scenario_objective_num_guests;
|
||||
uint8 marketing_status[20];
|
||||
uint8 marketing_assoc[20];
|
||||
uint8 unk_199582[2];
|
||||
money32 cash_history[128];
|
||||
money32 total_expenditure;
|
||||
money32 profit;
|
||||
uint8 unk_199788[8];
|
||||
money32 weekly_profit_history[128];
|
||||
money32 park_value;
|
||||
money32 park_value_history[128];
|
||||
uint32 scenario_objective_score;
|
||||
uint32 num_admissions;
|
||||
money32 admission_total_income;
|
||||
money32 company_value;
|
||||
uint8 thought_timer[16];
|
||||
rct_award awards[4];
|
||||
money16 land_price;
|
||||
money16 construction_rights_price;
|
||||
uint16 unk_199BCC;
|
||||
uint16 unk_199BCE;
|
||||
uint32 unk_199BD0;
|
||||
char username[64];
|
||||
uint32 game_version;
|
||||
money32 objective_completion_company_value;
|
||||
uint32 finance_checksum;
|
||||
uint16 num_rides;
|
||||
uint16 cheat_detection_neg_num_rides;
|
||||
uint16 cheat_detection_max_owned_tiles;
|
||||
uint16 cheat_detection_neg_max_owned_tiles;
|
||||
uint32 finance_checksum_3;
|
||||
uint32 scenario_slot_index_checksum;
|
||||
char scenario_winner[32];
|
||||
uint32 finance_checksum_2;
|
||||
char copyright_notice[40];
|
||||
uint16 cheat_detection_sv6_sc4[4];
|
||||
uint16 unk_199C84;
|
||||
uint16 unk_199C86;
|
||||
uint16 map_size_unk_a;
|
||||
uint16 map_size_unk_b;
|
||||
uint16 map_size;
|
||||
uint16 map_size_unk_c;
|
||||
uint32 same_price_flags;
|
||||
uint16 unk_199C94;
|
||||
uint8 unk_199C96[3];
|
||||
uint8 water_colour;
|
||||
uint16 unk_199C9A;
|
||||
rct_research_item research_items_LL[180];
|
||||
uint8 unk_19A020[5468];
|
||||
rct_banner banners[100];
|
||||
char string_table[32][1024];
|
||||
uint32 game_time_counter;
|
||||
rct_ride rides[255];
|
||||
uint16 unk_game_time_counter;
|
||||
uint16 view_x;
|
||||
uint16 view_y;
|
||||
uint8 view_zoom;
|
||||
uint8 view_rotation;
|
||||
uint8 animated_objects[6000];
|
||||
uint32 num_animated_objects;
|
||||
uint8 unk_1CADBC[12];
|
||||
uint16 scrolling_text_step;
|
||||
uint32 unk_1CADCA;
|
||||
uint16 unk_1CADCE;
|
||||
uint8 unk_1CADD0[116];
|
||||
rct_ride_measurement ride_measurements[8];
|
||||
uint32 next_guest_index;
|
||||
uint16 game_counter_5;
|
||||
uint8 patrol_areas[0x3C00];
|
||||
uint8 unk_1F42AA[116];
|
||||
uint8 unk_1F431E[4];
|
||||
uint8 unk_1F4322[8];
|
||||
uint8 climate;
|
||||
uint8 unk_1F432B;
|
||||
uint16 climate_timer;
|
||||
uint8 weather;
|
||||
uint8 target_weather;
|
||||
uint8 temperature;
|
||||
uint8 target_temperature;
|
||||
uint8 thunder_frequency;
|
||||
uint8 target_thunder_frequency;
|
||||
uint8 weather_gloom;
|
||||
uint8 target_weather_gloom;
|
||||
uint8 rain;
|
||||
uint8 target_rain;
|
||||
rct_news_item messages[61];
|
||||
char scenario_name[62];
|
||||
uint16 scenario_slot_index;
|
||||
uint32 scenario_flags;
|
||||
uint8 unk_1F8358[432];
|
||||
uint32 expansion_pack_checksum;
|
||||
} rct1_s4;
|
||||
|
||||
enum {
|
||||
RCT1_RIDE_TYPE_NULL = 255,
|
||||
RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER = 0,
|
||||
RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_MINIATURE_RAILROAD,
|
||||
RCT1_RIDE_TYPE_MONORAIL,
|
||||
RCT1_RIDE_TYPE_SUSPENDED_SINGLE_RAIL_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_BOAT_HIRE,
|
||||
RCT1_RIDE_TYPE_WOODEN_CRAZY_RODENT_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_CAR_RIDE,
|
||||
RCT1_RIDE_TYPE_WHOA_BELLY,
|
||||
RCT1_RIDE_TYPE_BOBSLED_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_OBSERVATION_TOWER,
|
||||
RCT1_RIDE_TYPE_STEEL_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_WATER_SLIDE,
|
||||
RCT1_RIDE_TYPE_MINE_TRAIN_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_CHAIRLIFT,
|
||||
RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_HEDGE_MAZE,
|
||||
RCT1_RIDE_TYPE_SPIRAL_SLIDE,
|
||||
RCT1_RIDE_TYPE_GO_KARTS,
|
||||
RCT1_RIDE_TYPE_LOG_FLUME,
|
||||
RCT1_RIDE_TYPE_RIVER_RAPIDS,
|
||||
RCT1_RIDE_TYPE_BUMPER_CARS,
|
||||
RCT1_RIDE_TYPE_SWINGING_SHIP,
|
||||
RCT1_RIDE_TYPE_SWINGING_INVERTER_SHIP,
|
||||
RCT1_RIDE_TYPE_ICE_CREAM_STALL,
|
||||
RCT1_RIDE_TYPE_FRIES_STALL,
|
||||
RCT1_RIDE_TYPE_DRINK_STALL,
|
||||
RCT1_RIDE_TYPE_COTTON_CANDY_STALL,
|
||||
RCT1_RIDE_TYPE_BURGER_BAR,
|
||||
RCT1_RIDE_TYPE_MERRY_GO_ROUND,
|
||||
RCT1_RIDE_TYPE_BALLOON_STALL,
|
||||
RCT1_RIDE_TYPE_INFORMATION_KIOSK,
|
||||
RCT1_RIDE_TYPE_BATHROOM,
|
||||
RCT1_RIDE_TYPE_FERRIS_WHEEL,
|
||||
RCT1_RIDE_TYPE_MOTION_SIMULATOR,
|
||||
RCT1_RIDE_TYPE_3D_CINEMA,
|
||||
RCT1_RIDE_TYPE_GRAVITRON,
|
||||
RCT1_RIDE_TYPE_SPACE_RINGS,
|
||||
RCT1_RIDE_TYPE_REVERSE_WHOA_BELLY_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_SOUVENIR_STALL,
|
||||
RCT1_RIDE_TYPE_VERTICAL_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_PIZZA_STALL,
|
||||
RCT1_RIDE_TYPE_SCRAMBLED_EGGS,
|
||||
RCT1_RIDE_TYPE_HAUNTED_HOUSE,
|
||||
RCT1_RIDE_TYPE_POPCORN_STALL,
|
||||
RCT1_RIDE_TYPE_CIRCUS_SHOW,
|
||||
RCT1_RIDE_TYPE_GHOST_TRAIN,
|
||||
RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_HOT_DOG_STALL,
|
||||
RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL,
|
||||
RCT1_RIDE_TYPE_HAT_STALL,
|
||||
RCT1_RIDE_TYPE_CANDY_APPLE_STAND,
|
||||
RCT1_RIDE_TYPE_VIRGINIA_REEL,
|
||||
RCT1_RIDE_TYPE_RIVER_RIDE,
|
||||
RCT1_RIDE_TYPE_CYCLE_MONORAIL,
|
||||
RCT1_RIDE_TYPE_FLYING_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_SUSPENDED_MONORAIL,
|
||||
RCT1_RIDE_TYPE_40,
|
||||
RCT1_RIDE_TYPE_WOODEN_REVERSER_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_HEARTLINE_TWISTER_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_MINIATURE_GOLF,
|
||||
RCT1_RIDE_TYPE_44,
|
||||
RCT1_RIDE_TYPE_ROTO_DROP,
|
||||
RCT1_RIDE_TYPE_FLYING_SAUCERS,
|
||||
RCT1_RIDE_TYPE_CROOKED_HOUSE,
|
||||
RCT1_RIDE_TYPE_CYCLE_RAILWAY,
|
||||
RCT1_RIDE_TYPE_SUSPENDED_LOOPING_ROLLER_COASTER,
|
||||
RCT1_RIDE_TYPE_WATER_COASTER,
|
||||
RCT1_RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER,
|
||||
RCT1_RIDE_TYPE_INVERTED_WILD_MOUSE_COASTER,
|
||||
RCT1_RIDE_TYPE_JET_SKIS,
|
||||
RCT1_RIDE_TYPE_T_SHIRT_STALL,
|
||||
RCT1_RIDE_TYPE_RAFT_RIDE,
|
||||
RCT1_RIDE_TYPE_DOUGHNUT_SHOP,
|
||||
RCT1_RIDE_TYPE_ENTERPRISE,
|
||||
RCT1_RIDE_TYPE_COFFEE_SHOP,
|
||||
RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL,
|
||||
RCT1_RIDE_TYPE_LEMONADE_STALL
|
||||
};
|
||||
|
||||
typedef struct{
|
||||
uint8 type; // 0x00
|
||||
uint8 vehicle_type; // 0x01
|
||||
uint32 special_track_flags; // 0x02
|
||||
uint8 operating_mode; // 0x06
|
||||
uint8 vehicle_colour_version; // 0x07 Vehicle colour type in first two bits, Version in bits 3,4
|
||||
uint8 body_trim_colour[24]; // 0x08
|
||||
uint8 track_spine_colour_rct1; // 0x20
|
||||
uint8 track_rail_colour_rct1; // 0x21
|
||||
uint8 track_support_colour_rct1; // 0x22
|
||||
uint8 departure_control_flags; // 0x23
|
||||
uint8 number_of_trains; // 0x24
|
||||
uint8 cars_per_train; // 0x25
|
||||
uint8 min_wait_time; // 0x26
|
||||
uint8 max_wait_time; // 0x27
|
||||
uint8 speed; // 0x28
|
||||
uint8 max_speed; // 0x29
|
||||
uint8 average_speed; // 0x2A
|
||||
uint16 ride_length; // 0x2B
|
||||
uint8 max_positive_vertical_g; // 0x2D
|
||||
uint8 max_negitive_vertical_g; // 0x2E
|
||||
uint8 max_lateral_g; // 0x2F
|
||||
union {
|
||||
uint8 inversions; // 0x30
|
||||
uint8 holes; // 0x30
|
||||
};
|
||||
uint8 drops; // 0x31
|
||||
uint8 highest_drop_height; // 0x32
|
||||
uint8 excitement; // 0x33
|
||||
uint8 intensity; // 0x34
|
||||
uint8 nausea; // 0x35
|
||||
uint8 pad_36[2];
|
||||
union{
|
||||
uint16 start_track_data_original; // 0x38
|
||||
uint8 track_spine_colour[4]; // 0x38
|
||||
};
|
||||
uint8 track_rail_colour[4]; // 0x3C
|
||||
union{
|
||||
uint8 track_support_colour[4]; // 0x40
|
||||
uint8 wall_type[4]; // 0x40
|
||||
};
|
||||
uint8 pad_41[0x83];
|
||||
uint16 start_track_data_AA_CF; // 0xC4
|
||||
}rct_track_td4; // Information based off RCTTechDepot
|
||||
|
||||
#endif
|
||||
|
64
src/rct2.c
64
src/rct2.c
|
@ -35,7 +35,6 @@
|
|||
#include "management/news_item.h"
|
||||
#include "object.h"
|
||||
#include "openrct2.h"
|
||||
#include "platform/osinterface.h"
|
||||
#include "platform/platform.h"
|
||||
#include "ride/ride.h"
|
||||
#include "ride/track.h"
|
||||
|
@ -93,7 +92,7 @@ int rct2_init()
|
|||
|
||||
gfx_load_g1();
|
||||
gfx_load_character_widths();
|
||||
osinterface_init();
|
||||
platform_init();
|
||||
audio_init1();//RCT2_CALLPROC_EBPSAFE(0x006BA8E0); // init_audio();
|
||||
viewport_init_all();
|
||||
news_item_init_queue();
|
||||
|
@ -104,7 +103,7 @@ int rct2_init()
|
|||
ride_init_all();
|
||||
window_guest_list_init_vars_a();
|
||||
sub_6BD3A4();// RCT2_CALLPROC_EBPSAFE(0x006BD3A4); //Peep?
|
||||
map_init();
|
||||
map_init(150);
|
||||
park_init();
|
||||
RCT2_CALLPROC_EBPSAFE(0x0066B5C0); // 0x0066B5C0 (part of 0x0066B3E8) screen_game_create_windows()
|
||||
date_reset();
|
||||
|
@ -119,6 +118,7 @@ int rct2_init()
|
|||
gfx_clear(RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo), 10);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) = gGeneral_config.play_intro ? 8 : 255;
|
||||
|
||||
log_verbose("initialising game finished");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -128,13 +128,15 @@ int rct2_init()
|
|||
*/
|
||||
int rct2_init_directories()
|
||||
{
|
||||
// windows_get_registry_install_info((rct2_install_info*)0x009AA10C, "RollerCoaster Tycoon 2 Setup", "MS Sans Serif", 0);
|
||||
|
||||
// check install directory
|
||||
if (!platform_directory_exists(gGeneral_config.game_path)) {
|
||||
log_verbose("install directory does not exist, %s", gGeneral_config.game_path);
|
||||
if (!config_find_or_browse_install_directory()) {
|
||||
log_fatal("Invalid RCT2 installation path. Please correct in config.ini.");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
strcpy(RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH, char), gGeneral_config.game_path);
|
||||
|
@ -222,7 +224,10 @@ int rct2_open_file(const char *path)
|
|||
strcpy(scenarioBasic.path, path);
|
||||
scenario_load_and_play_from_path(scenarioBasic.path);
|
||||
} else if (_stricmp(extension, "td6") == 0 || _stricmp(extension, "td4") == 0) {
|
||||
return 1;
|
||||
} else if (!_stricmp(extension, "td6") || !_stricmp(extension, "td4")) {
|
||||
// TODO track design install
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -233,10 +238,10 @@ int rct2_open_file(const char *path)
|
|||
* rct2: 0x00674C95
|
||||
*/
|
||||
int check_file_paths()
|
||||
{
|
||||
{
|
||||
for (int pathId = 0; pathId < PATH_ID_END; pathId++)
|
||||
if (!check_file_path(pathId))
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -251,24 +256,7 @@ int check_file_path(int pathId)
|
|||
HANDLE file = CreateFile(path, FILE_GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
|
||||
|
||||
switch (pathId) {
|
||||
case PATH_ID_GAMECFG:
|
||||
case PATH_ID_SCORES:
|
||||
case PATH_ID_TRACKSIDX:
|
||||
case PATH_ID_PLUGIN:
|
||||
// Do nothing; these will be created later if they do not exist yet
|
||||
break;
|
||||
|
||||
case PATH_ID_CUSTOM1:
|
||||
if (file != INVALID_HANDLE_VALUE)
|
||||
RCT2_GLOBAL(0x009AF164, unsigned int) = SetFilePointer(file, 0, 0, FILE_END); // Store file size in music_custom1_size @ 0x009AF164
|
||||
break;
|
||||
|
||||
case PATH_ID_CUSTOM2:
|
||||
if (file != INVALID_HANDLE_VALUE)
|
||||
RCT2_GLOBAL(0x009AF16E, unsigned int) = SetFilePointer(file, 0, 0, FILE_END); // Store file size in music_custom2_size @ 0x009AF16E
|
||||
break;
|
||||
|
||||
default:
|
||||
case PATH_ID_G1:
|
||||
if (file == INVALID_HANDLE_VALUE) {
|
||||
// A data file is missing from the installation directory. The original implementation
|
||||
// asks for a CD-ROM path at this point and stores it in cdrom_path @ 0x9AA318.
|
||||
|
@ -281,6 +269,16 @@ int check_file_path(int pathId)
|
|||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case PATH_ID_CUSTOM1:
|
||||
if (file != INVALID_HANDLE_VALUE)
|
||||
RCT2_GLOBAL(0x009AF164, unsigned int) = SetFilePointer(file, 0, 0, FILE_END); // Store file size in music_custom1_size @ 0x009AF164
|
||||
break;
|
||||
|
||||
case PATH_ID_CUSTOM2:
|
||||
if (file != INVALID_HANDLE_VALUE)
|
||||
RCT2_GLOBAL(0x009AF16E, unsigned int) = SetFilePointer(file, 0, 0, FILE_END); // Store file size in music_custom2_size @ 0x009AF16E
|
||||
break;
|
||||
}
|
||||
|
||||
if (file != INVALID_HANDLE_VALUE)
|
||||
|
@ -294,11 +292,11 @@ int check_file_path(int pathId)
|
|||
* rct2: 0x00674C0B
|
||||
*/
|
||||
int check_files_integrity()
|
||||
{
|
||||
{
|
||||
int i;
|
||||
const char *path;
|
||||
HANDLE file;
|
||||
WIN32_FIND_DATA find_data;
|
||||
WIN32_FIND_DATA find_data;
|
||||
|
||||
for (i = 0; files_to_check[i].pathId != PATH_ID_END; i++) {
|
||||
path = get_file_path(files_to_check[i].pathId);
|
||||
|
@ -324,16 +322,12 @@ void rct2_update_2()
|
|||
|
||||
tick = timeGetTime();
|
||||
|
||||
RCT2_GLOBAL(0x009DE588, sint16) = tick2 = tick - RCT2_GLOBAL(0x009DE580, sint32);
|
||||
if (RCT2_GLOBAL(0x009DE588, sint16) > 500)
|
||||
RCT2_GLOBAL(0x009DE588, sint16) = 500;
|
||||
tick2 = tick - RCT2_GLOBAL(0x009DE580, sint32);
|
||||
RCT2_GLOBAL(0x009DE588, sint16) = tick2 = min(tick2, 500);
|
||||
|
||||
RCT2_GLOBAL(0x009DE580, sint32) = tick;
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint8) == 0)
|
||||
RCT2_GLOBAL(0x009DE584, sint32) += tick2;
|
||||
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint8) == 0)
|
||||
RCT2_GLOBAL(0x009DE584, sint32) += tick2;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0)
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PALETTE_EFFECT_FRAME_NO, sint32) += tick2;
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_ON_TUTORIAL, uint8) != 0)
|
||||
RCT2_GLOBAL(0x009DE588, sint16) = 31;
|
||||
|
@ -513,4 +507,4 @@ void *rct2_realloc(void *block, size_t numBytes)
|
|||
void rct2_free(void *block)
|
||||
{
|
||||
RCT2_CALLPROC_1(0x004068DE, void*, block);
|
||||
}
|
||||
}
|
||||
|
|
20
src/rct2.h
20
src/rct2.h
|
@ -43,6 +43,11 @@ typedef unsigned short uint16;
|
|||
typedef unsigned long uint32;
|
||||
typedef unsigned long long uint64;
|
||||
|
||||
typedef char utf8;
|
||||
typedef wchar_t utf16;
|
||||
typedef utf8* utf8string;
|
||||
typedef utf16* utf16string;
|
||||
|
||||
#define rol8(x, shift) (((uint8)(x) << (shift)) | ((uint8)(x) >> (8 - (shift))))
|
||||
#define ror8(x, shift) (((uint8)(x) >> (shift)) | ((uint8)(x) << (8 - (shift))))
|
||||
#define rol16(x, shift) (((uint16)(x) << (shift)) | ((uint16)(x) >> (16 - (shift))))
|
||||
|
@ -98,11 +103,22 @@ typedef fixed32_1dp money32;
|
|||
// Construct a money value in the format MONEY(10,70) to represent 10.70. Fractional part must be two digits.
|
||||
#define MONEY(whole, fraction) ((whole) * 10 + ((fraction) / 10))
|
||||
|
||||
#define MONEY_FREE MONEY(0,00)
|
||||
#define MONEY32_UNDEFINED ((money32)0x80000000)
|
||||
|
||||
typedef void (EMPTY_ARGS_VOID_POINTER)();
|
||||
typedef unsigned short rct_string_id;
|
||||
|
||||
typedef struct {
|
||||
uint32 installLevel;
|
||||
char title[260];
|
||||
char path[260];
|
||||
uint32 var_20C;
|
||||
uint8 pad_210[256];
|
||||
char expansionPackNames[16][128];
|
||||
uint32 activeExpansionPacks; //0xB10
|
||||
} rct2_install_info;
|
||||
|
||||
enum {
|
||||
// Although this is labeled a flag it actually means when
|
||||
// zero the screen is in playing mode.
|
||||
|
@ -178,6 +194,7 @@ enum {
|
|||
PATH_ID_CSS44,
|
||||
PATH_ID_CSS45,
|
||||
PATH_ID_CSS46,
|
||||
PATH_ID_CSS50,
|
||||
PATH_ID_END
|
||||
};
|
||||
|
||||
|
@ -245,7 +262,8 @@ static const char * const file_paths[] =
|
|||
"Data\\CSS43.DAT",
|
||||
"Data\\CSS44.DAT",
|
||||
"Data\\CSS45.DAT",
|
||||
"Data\\CSS46.DAT"
|
||||
"Data\\CSS46.DAT",
|
||||
"Data\\CSS50.DAT"
|
||||
};
|
||||
|
||||
// Files to check (rct2 @ 0x0097FB5A)
|
||||
|
|
314
src/ride/ride.c
314
src/ride/ride.c
|
@ -26,10 +26,10 @@
|
|||
#include "../interface/window.h"
|
||||
#include "../localisation/date.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../management/finance.h"
|
||||
#include "../management/news_item.h"
|
||||
#include "../peep/peep.h"
|
||||
#include "../peep/staff.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../scenario.h"
|
||||
#include "../util/util.h"
|
||||
#include "../windows/error.h"
|
||||
|
@ -247,6 +247,7 @@ money32 ride_calculate_income_per_hour(rct_ride *ride)
|
|||
|
||||
shopItem = entry->shop_item_secondary;
|
||||
if (shopItem != 255) {
|
||||
priceMinusCost += ride->price_secondary;
|
||||
priceMinusCost -= get_shop_item_cost(shopItem);
|
||||
priceMinusCost /= 2;
|
||||
}
|
||||
|
@ -266,47 +267,42 @@ money32 ride_calculate_income_per_hour(rct_ride *ride)
|
|||
*/
|
||||
rct_map_element *sub_6CAF80(int rideIndex, int *outX, int *outY)
|
||||
{
|
||||
rct_map_element *resultMapElement, *mapElement;
|
||||
map_element_iterator it;
|
||||
rct_map_element *resultMapElement;
|
||||
int foundSpecialTrackPiece;
|
||||
|
||||
resultMapElement = (rct_map_element*)-1;
|
||||
foundSpecialTrackPiece = 0;
|
||||
|
||||
uint16 x, y;
|
||||
for (x = 0; x < 256; x++) {
|
||||
for (y = 0; y < 256; y++) {
|
||||
// Iterate through map elements on tile
|
||||
int tileIndex = (y << 8) | x;
|
||||
mapElement = TILE_MAP_ELEMENT_POINTER(tileIndex);
|
||||
do {
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) != MAP_ELEMENT_TYPE_TRACK)
|
||||
continue;
|
||||
if (rideIndex != mapElement->properties.track.ride_index)
|
||||
continue;
|
||||
map_element_iterator_begin(&it);
|
||||
do {
|
||||
if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_TRACK)
|
||||
continue;
|
||||
if (rideIndex != it.element->properties.track.ride_index)
|
||||
continue;
|
||||
|
||||
// Found a track piece for target ride
|
||||
// Found a track piece for target ride
|
||||
|
||||
// Check if its a ???
|
||||
int specialTrackPiece = (
|
||||
(mapElement->properties.track.type != 2 && mapElement->properties.track.type != 3) &&
|
||||
(RCT2_ADDRESS(0x0099BA64, uint8)[mapElement->properties.track.type * 16] & 0x10)
|
||||
);
|
||||
// Check if its a ???
|
||||
int specialTrackPiece = (
|
||||
(it.element->properties.track.type != 2 && it.element->properties.track.type != 3) &&
|
||||
(RCT2_ADDRESS(0x0099BA64, uint8)[it.element->properties.track.type * 16] & 0x10)
|
||||
);
|
||||
|
||||
// Set result tile to this track piece if first found track or a ???
|
||||
if (resultMapElement == (rct_map_element*)-1 || specialTrackPiece) {
|
||||
resultMapElement = mapElement;
|
||||
// Set result tile to this track piece if first found track or a ???
|
||||
if (resultMapElement == (rct_map_element*)-1 || specialTrackPiece) {
|
||||
resultMapElement = it.element;
|
||||
|
||||
if (outX != NULL) *outX = x * 32;
|
||||
if (outY != NULL) *outY = y * 32;
|
||||
}
|
||||
|
||||
if (specialTrackPiece) {
|
||||
foundSpecialTrackPiece = 1;
|
||||
return resultMapElement;
|
||||
}
|
||||
} while (!(mapElement->flags & MAP_ELEMENT_FLAG_LAST_TILE) && mapElement++);
|
||||
if (outX != NULL) *outX = it.x * 32;
|
||||
if (outY != NULL) *outY = it.y * 32;
|
||||
}
|
||||
}
|
||||
|
||||
if (specialTrackPiece) {
|
||||
foundSpecialTrackPiece = 1;
|
||||
return resultMapElement;
|
||||
}
|
||||
} while (map_element_iterator_next(&it));
|
||||
|
||||
return resultMapElement;
|
||||
}
|
||||
|
||||
|
@ -511,12 +507,20 @@ int ride_create_ride(ride_list_item listItem)
|
|||
*/
|
||||
void ride_construct_new(ride_list_item listItem)
|
||||
{
|
||||
rct_window *w;
|
||||
int rideIndex;
|
||||
|
||||
rideIndex = ride_create_ride(listItem);
|
||||
if (rideIndex == -1)
|
||||
return;
|
||||
if (rideIndex != -1)
|
||||
ride_construct(rideIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006B4857
|
||||
*/
|
||||
void ride_construct(int rideIndex)
|
||||
{
|
||||
rct_window *w;
|
||||
|
||||
// Open construction window
|
||||
// HACK In the original game this created a mouse up event. This has been
|
||||
|
@ -669,7 +673,7 @@ static void ride_remove_peeps(int rideIndex)
|
|||
continue;
|
||||
|
||||
peep_decrement_num_riders(peep);
|
||||
if (peep->state == PEEP_STATE_QUEUING_FRONT && peep->var_2C == 0)
|
||||
if (peep->state == PEEP_STATE_QUEUING_FRONT && peep->sub_state == 0)
|
||||
RCT2_CALLPROC_X(0x006966A9, 0, 0, 0, 0, (int)peep, 0, 0);
|
||||
|
||||
invalidate_sprite((rct_sprite*)peep);
|
||||
|
@ -677,11 +681,11 @@ static void ride_remove_peeps(int rideIndex)
|
|||
if (exitDirection == 255) {
|
||||
x = peep->next_x + 16;
|
||||
y = peep->next_y + 16;
|
||||
z = (peep->next_z & 0xFF) * 8;
|
||||
if ((peep->next_z >> 8) & 4)
|
||||
z = peep->next_z * 8;
|
||||
if (peep->next_var_29 & 4)
|
||||
z += 8;
|
||||
z++;
|
||||
sprite_move(exitX, exitY, exitZ, (rct_sprite*)peep);
|
||||
sprite_move(x, y, z, (rct_sprite*)peep);
|
||||
} else {
|
||||
sprite_move(exitX, exitY, exitZ, (rct_sprite*)peep);
|
||||
peep->sprite_direction = exitDirection;
|
||||
|
@ -723,7 +727,7 @@ void sub_6C9627()
|
|||
&x,
|
||||
&y,
|
||||
RCT2_GLOBAL(0x00F440AC, uint16),
|
||||
RCT2_GLOBAL(0x00F440AE, uint8) & 3,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) & 3,
|
||||
RCT2_GLOBAL(0x00F440AF, uint8),
|
||||
0,
|
||||
0,
|
||||
|
@ -881,7 +885,7 @@ int ride_modify(rct_map_element *mapElement, int x, int y)
|
|||
ride_remove_peeps(rideIndex);
|
||||
|
||||
// Check if element is a station entrance or exit
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_ENTRANCE)
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE)
|
||||
return ride_modify_entrance_or_exit(mapElement, x, y);
|
||||
|
||||
constructionWindow = ride_create_or_find_construction_window(rideIndex);
|
||||
|
@ -905,7 +909,7 @@ int ride_modify(rct_map_element *mapElement, int x, int y)
|
|||
RCT2_GLOBAL(0x00F440A8, uint16) = x;
|
||||
RCT2_GLOBAL(0x00F440AA, uint16) = y;
|
||||
RCT2_GLOBAL(0x00F440AC, uint16) = z;
|
||||
RCT2_GLOBAL(0x00F440AE, uint8) = direction;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction;
|
||||
RCT2_GLOBAL(0x00F440AF, uint8) = type;
|
||||
RCT2_GLOBAL(0x00F440B0, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F440B1, uint8) = 0;
|
||||
|
@ -925,7 +929,7 @@ int ride_modify(rct_map_element *mapElement, int x, int y)
|
|||
RCT2_GLOBAL(0x00F440A8, uint16) = x;
|
||||
RCT2_GLOBAL(0x00F440AA, uint16) = y;
|
||||
RCT2_GLOBAL(0x00F440AC, uint16) = z;
|
||||
RCT2_GLOBAL(0x00F440AE, uint8) = direction;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction;
|
||||
RCT2_GLOBAL(0x00F440AF, uint8) = type;
|
||||
RCT2_GLOBAL(0x00F440B0, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F440B1, uint8) = 0;
|
||||
|
@ -937,7 +941,7 @@ int ride_modify(rct_map_element *mapElement, int x, int y)
|
|||
RCT2_GLOBAL(0x00F440A8, uint16) = x;
|
||||
RCT2_GLOBAL(0x00F440AA, uint16) = y;
|
||||
RCT2_GLOBAL(0x00F440AC, uint16) = z;
|
||||
RCT2_GLOBAL(0x00F440AE, uint8) = direction;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction;
|
||||
RCT2_GLOBAL(0x00F440AF, uint8) = type;
|
||||
RCT2_GLOBAL(0x00F440B0, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F440B1, uint8) = 0;
|
||||
|
@ -988,7 +992,7 @@ int sub_6CC3FB(int rideIndex)
|
|||
RCT2_GLOBAL(0x00F440B6, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F440B7, uint8) = 0;
|
||||
|
||||
RCT2_GLOBAL(0x00F440AE, uint8) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F440A6, uint8) = 4;
|
||||
RCT2_GLOBAL(0x00F440B0, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F440B1, uint8) = 0;
|
||||
|
@ -1072,7 +1076,7 @@ static void ride_update(int rideIndex)
|
|||
ride->var_14D |= 2;
|
||||
|
||||
if (ride->upkeep_cost != (money16)0xFFFF)
|
||||
ride->profit = (money16)(ride->income_per_hour - ((money32)ride->upkeep_cost * 16));
|
||||
ride->profit = (ride->income_per_hour - ((money32)ride->upkeep_cost * 16));
|
||||
}
|
||||
|
||||
// Ride specific updates
|
||||
|
@ -1124,6 +1128,23 @@ static void ride_chairlift_update(rct_ride *ride)
|
|||
map_invalidate_tile(x, y, z, z + (4 * 8));
|
||||
}
|
||||
|
||||
/* rct2: 0x0069A3D7
|
||||
* Updates the ride popularity
|
||||
* edi : ride
|
||||
* bl : pop_amount
|
||||
* pop_amount can be zero if peep visited but did not purchase.
|
||||
*/
|
||||
void ride_update_popularity(rct_ride* ride, uint8 pop_amount){
|
||||
ride->popularity_next += pop_amount;
|
||||
ride->popularity_time_out++;
|
||||
if (ride->popularity_time_out < 25)return;
|
||||
|
||||
ride->popularity = ride->popularity_next;
|
||||
ride->popularity_next = 0;
|
||||
ride->popularity_time_out = 0;
|
||||
ride->var_14D |= 1;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AC545
|
||||
|
@ -1548,7 +1569,7 @@ static void ride_call_mechanic(int rideIndex, rct_peep *mechanic, int forInspect
|
|||
peep_decrement_num_riders(mechanic);
|
||||
mechanic->state = forInspection ? PEEP_STATE_HEADING_TO_INSPECTION : PEEP_STATE_ANSWERING;
|
||||
peep_window_state_update(mechanic);
|
||||
mechanic->var_2C = 0;
|
||||
mechanic->sub_state = 0;
|
||||
ride->mechanic_status = RIDE_MECHANIC_STATUS_HEADING;
|
||||
ride->var_14D |= 0x20;
|
||||
ride->mechanic = mechanic->sprite_index;
|
||||
|
@ -1625,13 +1646,13 @@ rct_peep *find_closest_mechanic(int x, int y, int forInspection)
|
|||
continue;
|
||||
|
||||
if (forInspection) {
|
||||
if ((peep->state != PEEP_STATE_HEADING_TO_INSPECTION || peep->var_2C >= 4) && peep->state != PEEP_STATE_PATROLLING)
|
||||
if ((peep->state != PEEP_STATE_HEADING_TO_INSPECTION || peep->sub_state >= 4) && peep->state != PEEP_STATE_PATROLLING)
|
||||
continue;
|
||||
|
||||
if (!(peep->staff_orders & 2))
|
||||
continue;
|
||||
} else {
|
||||
if (peep->state != PEEP_STATE_PATROLLING && !(peep->staff_orders & 1))
|
||||
if (peep->state != PEEP_STATE_PATROLLING || !(peep->staff_orders & 1))
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -2031,29 +2052,35 @@ void ride_check_all_reachable()
|
|||
* rct2: 0x006B7C59
|
||||
* @return 1 if the coordinate is reachable or has no entrance, 0 otherwise
|
||||
*/
|
||||
static int ride_entrance_exit_is_reachable(uint16 coordinate, rct_ride* ride, int index) {
|
||||
int x = ((coordinate >> 8) & 0xFF) << 5, // cx
|
||||
y = (coordinate & 0xFF) << 5; // ax
|
||||
uint8 station_height = ride->station_heights[index];
|
||||
int tile_idx = ((x << 8) | y) >> 5;
|
||||
rct_map_element* tile = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*)[tile_idx];
|
||||
static int ride_entrance_exit_is_reachable(uint16 coordinate, rct_ride* ride, int index)
|
||||
{
|
||||
int x, y, z;
|
||||
rct_map_element *mapElement;
|
||||
|
||||
while(1) {
|
||||
uint8 element_type = tile->type & MAP_ELEMENT_TYPE_MASK;
|
||||
if (element_type == MAP_ELEMENT_TYPE_ENTRANCE && station_height == tile->base_height) {
|
||||
break;
|
||||
} else if (tile->flags & MAP_ELEMENT_FLAG_LAST_TILE) {
|
||||
return 1;
|
||||
}
|
||||
tile++;
|
||||
x = coordinate & 0xFF;
|
||||
y = (coordinate >> 8) & 0xFF;
|
||||
z = ride->station_heights[index];
|
||||
mapElement = map_get_first_element_at(x, y);
|
||||
|
||||
for (;;) {
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE && z == mapElement->base_height) {
|
||||
break;
|
||||
} else if (map_element_is_last_for_tile(mapElement)) {
|
||||
return 1;
|
||||
}
|
||||
mapElement++;
|
||||
}
|
||||
|
||||
uint8 face_direction = tile->type & 3;
|
||||
y -= RCT2_ADDRESS(0x00993CCC, sint16)[face_direction * 2];
|
||||
x -= RCT2_ADDRESS(0x00993CCE, sint16)[face_direction * 2];
|
||||
tile_idx = ((x << 8) | y) >> 5;
|
||||
uint8 face_direction = mapElement->type & 3;
|
||||
|
||||
return map_coord_is_connected(tile_idx, station_height, face_direction);
|
||||
x *= 32;
|
||||
y *= 32;
|
||||
x -= RCT2_ADDRESS(0x00993CCC, sint16)[face_direction * 2];
|
||||
y -= RCT2_ADDRESS(0x00993CCE, sint16)[face_direction * 2];
|
||||
x /= 32;
|
||||
y /= 32;
|
||||
|
||||
return map_coord_is_connected(x, y, z, face_direction);
|
||||
}
|
||||
|
||||
static void ride_entrance_exit_connected(rct_ride* ride, int ride_idx)
|
||||
|
@ -2086,64 +2113,66 @@ static void ride_entrance_exit_connected(rct_ride* ride, int ride_idx)
|
|||
|
||||
static void ride_shop_connected(rct_ride* ride, int ride_idx)
|
||||
{
|
||||
rct_ride* ride_back = ride;
|
||||
int x, y, count;
|
||||
rct_map_element *mapElement;
|
||||
|
||||
uint16 coordinate = ride->station_starts[0];
|
||||
if (coordinate == 0xFFFF)
|
||||
return;
|
||||
|
||||
int x = ((coordinate >> 8) & 0xFF) << 5, // cx
|
||||
y = (coordinate & 0xFF) << 5; // ax
|
||||
x = (coordinate & 0xFF);
|
||||
y = (coordinate >> 8) & 0xFF;
|
||||
|
||||
rct_map_element* tile = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*)[coordinate];
|
||||
|
||||
for (; ; tile++){
|
||||
uint8 element_type = tile->type & MAP_ELEMENT_TYPE_MASK;
|
||||
if(element_type == MAP_ELEMENT_TYPE_TRACK && tile->properties.track.ride_index == ride_idx)
|
||||
break;
|
||||
if(tile->flags & MAP_ELEMENT_FLAG_LAST_TILE)
|
||||
return;
|
||||
}
|
||||
mapElement = map_get_first_element_at(x, y);
|
||||
do {
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK && mapElement->properties.track.ride_index == ride_idx)
|
||||
break;
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
|
||||
uint16 entrance_directions = 0;
|
||||
uint8 track_type = tile->properties.track.type;
|
||||
ride = &g_ride_list[tile->properties.track.ride_index];
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + ride->type * 8, uint32) & 0x80000) {
|
||||
uint8 track_type = mapElement->properties.track.type;
|
||||
ride = &g_ride_list[mapElement->properties.track.ride_index];
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + ride->type * 8, uint32) & 0x80000) {
|
||||
entrance_directions = RCT2_ADDRESS(0x0099CA64, uint8)[track_type * 16];
|
||||
} else {
|
||||
} else {
|
||||
entrance_directions = RCT2_ADDRESS(0x0099BA64, uint8)[track_type * 16];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint8 tile_direction = tile->type & MAP_ELEMENT_DIRECTION_MASK;
|
||||
uint8 tile_direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK;
|
||||
entrance_directions <<= tile_direction;
|
||||
entrance_directions = ((entrance_directions >> 12) | entrance_directions) & 0xF;
|
||||
|
||||
// now each bit in entrance_directions stands for an entrance direction to check
|
||||
// Now each bit in entrance_directions stands for an entrance direction to check
|
||||
if (entrance_directions == 0)
|
||||
return;
|
||||
|
||||
for (int count = 0; entrance_directions != 0; ++count) {
|
||||
// Turn x, y from tiles into units
|
||||
x *= 32;
|
||||
y *= 32;
|
||||
|
||||
for (count = 0; entrance_directions != 0; count++) {
|
||||
if (!(entrance_directions & 1)) {
|
||||
entrance_directions >>= 1;
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
entrance_directions >>= 1;
|
||||
|
||||
uint8 face_direction = count ^ 2; // flip direction north<->south, east<->west
|
||||
int y2 = y - RCT2_ADDRESS(0x00993CCC, sint16)[face_direction * 2];
|
||||
int x2 = x - RCT2_ADDRESS(0x00993CCE, sint16)[face_direction * 2];
|
||||
int tile_idx = ((x2 << 8) | y2) >> 5;
|
||||
// Flip direction north<->south, east<->west
|
||||
uint8 face_direction = count ^ 2;
|
||||
|
||||
if (map_coord_is_connected(tile_idx, tile->base_height, face_direction))
|
||||
return;
|
||||
}
|
||||
|
||||
// name of ride is parameter of the format string
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = ride->name;
|
||||
int y2 = y - RCT2_ADDRESS(0x00993CCE, sint16)[face_direction * 2];
|
||||
int x2 = x - RCT2_ADDRESS(0x00993CCC, sint16)[face_direction * 2];
|
||||
|
||||
if (map_coord_is_connected(x2 / 32, y2 / 32, mapElement->base_height, face_direction))
|
||||
return;
|
||||
}
|
||||
|
||||
// Name of ride is parameter of the format string
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = ride->name;
|
||||
RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments;
|
||||
news_item_add_to_queue(1, STR_ENTRANCE_NOT_CONNECTED, ride_idx);
|
||||
|
||||
ride->connected_message_throttle = 3;
|
||||
ride->connected_message_throttle = 3;
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
@ -2242,7 +2271,7 @@ static void ride_entrance_set_map_tooltip(rct_map_element *mapElement)
|
|||
|
||||
void ride_set_map_tooltip(rct_map_element *mapElement)
|
||||
{
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_ENTRANCE) {
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) {
|
||||
ride_entrance_set_map_tooltip(mapElement);
|
||||
} else {
|
||||
if (
|
||||
|
@ -2659,4 +2688,81 @@ void ride_music_update_final()
|
|||
}
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
#pragma endregion
|
||||
|
||||
void ride_set_name(int rideIndex, const char *name)
|
||||
{
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_RENAME_RIDE_ATTRACTION;
|
||||
game_do_command(1, (rideIndex << 8) | 1, 0, *((int*)(name + 0)), GAME_COMMAND_SET_RIDE_NAME, *((int*)(name + 8)), *((int*)(name + 4)));
|
||||
game_do_command(2, (rideIndex << 8) | 1, 0, *((int*)(name + 12)), GAME_COMMAND_SET_RIDE_NAME, *((int*)(name + 20)), *((int*)(name + 16)));
|
||||
game_do_command(0, (rideIndex << 8) | 1, 0, *((int*)(name + 24)), GAME_COMMAND_SET_RIDE_NAME, *((int*)(name + 32)), *((int*)(name + 28)));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006B578B
|
||||
*/
|
||||
void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp)
|
||||
{
|
||||
rct_window *w;
|
||||
rct_ride *ride;
|
||||
rct_string_id newUserStringId;
|
||||
char oldName[128];
|
||||
static char newName[128];
|
||||
|
||||
int rideIndex = (*ebx >> 8) & 0xFF;
|
||||
int nameChunkIndex = *eax & 0xFFFF;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS * 4;
|
||||
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
|
||||
int nameChunkOffset = nameChunkIndex - 1;
|
||||
if (nameChunkOffset < 0)
|
||||
nameChunkOffset = 2;
|
||||
nameChunkOffset *= 12;
|
||||
RCT2_GLOBAL(newName + nameChunkOffset + 0, uint32) = *edx;
|
||||
RCT2_GLOBAL(newName + nameChunkOffset + 4, uint32) = *ebp;
|
||||
RCT2_GLOBAL(newName + nameChunkOffset + 8, uint32) = *edi;
|
||||
}
|
||||
|
||||
if (nameChunkIndex != 0) {
|
||||
*ebx = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
ride = GET_RIDE(rideIndex);
|
||||
format_string(oldName, ride->name, &ride->name_arguments);
|
||||
if (strcmp(oldName, newName) == 0) {
|
||||
*ebx = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (newName[0] == 0) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_INVALID_RIDE_ATTRACTION_NAME;
|
||||
*ebx = MONEY32_UNDEFINED;
|
||||
return;
|
||||
}
|
||||
|
||||
newUserStringId = user_string_allocate(4, newName);
|
||||
if (newUserStringId == 0) {
|
||||
*ebx = MONEY32_UNDEFINED;
|
||||
return;
|
||||
}
|
||||
|
||||
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
|
||||
// Free the old ride name
|
||||
user_string_free(ride->name);
|
||||
|
||||
ride->name = newUserStringId;
|
||||
|
||||
gfx_invalidate_screen();
|
||||
|
||||
// Force ride list window refresh
|
||||
w = window_find_by_class(WC_RIDE_LIST);
|
||||
if (w != NULL)
|
||||
w->no_list_items = 0;
|
||||
} else {
|
||||
user_string_free(newUserStringId);
|
||||
}
|
||||
|
||||
*ebx = 0;
|
||||
}
|
|
@ -173,14 +173,16 @@ typedef struct {
|
|||
};
|
||||
uint16 reliability; // 0x146
|
||||
uint16 var_148;
|
||||
uint16 var_14A;
|
||||
uint8 pad_14C;
|
||||
uint8 satisfaction; // 0x14A
|
||||
uint8 satisfaction_time_out; // 0x14B
|
||||
uint8 satisfaction_next; // 0x14C
|
||||
uint8 var_14D;
|
||||
uint8 pad_14E[0x02];
|
||||
uint32 total_customers; // 0x150
|
||||
money32 total_profit; // 0x154
|
||||
uint16 var_158;
|
||||
uint8 pad_15A;
|
||||
uint8 popularity; // 0x158
|
||||
uint8 popularity_time_out; // 0x159 Updated every purchase and ?possibly by time?
|
||||
uint8 popularity_next; // 0x15A When timeout reached this will be the next popularity
|
||||
uint8 num_riders; // 0x15B
|
||||
uint8 music_tune_id; // 0x15C
|
||||
uint8 var_15D;
|
||||
|
@ -218,8 +220,8 @@ typedef struct {
|
|||
uint8 var_1A1;
|
||||
uint8 var_1A2;
|
||||
uint8 var_1A3;
|
||||
uint32 no_primary_items_sold;
|
||||
uint32 no_secondary_items_sold;
|
||||
uint32 no_primary_items_sold; // 0x1A4
|
||||
uint32 no_secondary_items_sold; // 0x1A8
|
||||
uint8 var_1AC;
|
||||
uint8 var_1AD;
|
||||
uint8 var_1AE;
|
||||
|
@ -610,9 +612,11 @@ void reset_all_ride_build_dates();
|
|||
void ride_update_favourited_stat();
|
||||
void ride_update_all();
|
||||
void ride_check_all_reachable();
|
||||
void ride_update_popularity(rct_ride* ride, uint8 pop_amount);
|
||||
rct_map_element *sub_6CAF80(int rideIndex, int *outX, int *outY);
|
||||
rct_map_element *ride_find_track_gap(rct_map_element *startTrackElement, int *outX, int *outY);
|
||||
void ride_construct_new(ride_list_item listItem);
|
||||
void ride_construct(int rideIndex);
|
||||
int ride_modify(rct_map_element *trackMapElement, int x, int y);
|
||||
void ride_get_status(int rideIndex, int *formatSecondary, int *argument);
|
||||
rct_peep *ride_get_assigned_mechanic(rct_ride *ride);
|
||||
|
@ -634,4 +638,7 @@ void ride_set_map_tooltip(rct_map_element *mapElement);
|
|||
int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint16 sampleRate, uint32 position, uint8 *tuneId);
|
||||
void ride_music_update_final();
|
||||
|
||||
void ride_set_name(int rideIndex, const char *name);
|
||||
void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -236,11 +236,11 @@ static void ride_ratings_update_state_2()
|
|||
y = RCT2_GLOBAL(0x0138B586, uint16) / 32;
|
||||
z = RCT2_GLOBAL(0x0138B588, uint16) / 8;
|
||||
|
||||
mapElement = TILE_MAP_ELEMENT_POINTER(y * 256 + x);
|
||||
mapElement = map_get_first_element_at(x, y);
|
||||
trackType = RCT2_GLOBAL(0x0138B592, uint8);
|
||||
|
||||
do {
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) != MAP_ELEMENT_TYPE_TRACK)
|
||||
if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK)
|
||||
continue;
|
||||
if (mapElement->base_height != z)
|
||||
continue;
|
||||
|
@ -271,7 +271,7 @@ static void ride_ratings_update_state_2()
|
|||
RCT2_GLOBAL(0x0138B588, uint16) = z;
|
||||
RCT2_GLOBAL(0x0138B592, uint8) = mapElement->properties.track.type;
|
||||
}
|
||||
} while (!((mapElement++)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
|
||||
_rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE;
|
||||
}
|
||||
|
@ -333,11 +333,11 @@ static void ride_ratings_update_state_5()
|
|||
y = RCT2_GLOBAL(0x0138B586, uint16) / 32;
|
||||
z = RCT2_GLOBAL(0x0138B588, uint16) / 8;
|
||||
|
||||
mapElement = TILE_MAP_ELEMENT_POINTER(y * 256 + x);
|
||||
mapElement = map_get_first_element_at(x, y);
|
||||
trackType = RCT2_GLOBAL(0x0138B592, uint8);
|
||||
|
||||
do {
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) != MAP_ELEMENT_TYPE_TRACK)
|
||||
if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK)
|
||||
continue;
|
||||
if (mapElement->base_height != z)
|
||||
continue;
|
||||
|
@ -363,7 +363,7 @@ static void ride_ratings_update_state_5()
|
|||
RCT2_GLOBAL(0x0138B588, uint16) = z;
|
||||
RCT2_GLOBAL(0x0138B592, uint8) = mapElement->properties.track.type;
|
||||
}
|
||||
} while (!((mapElement++)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
|
||||
_rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE;
|
||||
}
|
||||
|
@ -733,18 +733,18 @@ static int ride_ratings_get_scenery_score(rct_ride *ride)
|
|||
|
||||
// Count surrounding scenery items
|
||||
numSceneryItems = 0;
|
||||
for (yy = y - 5; yy <= y + 5; yy++) {
|
||||
for (xx = x - 5; xx <= x + 5; xx++) {
|
||||
for (yy = max(y - 5, 0); yy <= y + 5; yy++) {
|
||||
for (xx = max(x - 5, 0); xx <= x + 5; xx++) {
|
||||
// Count scenery items on this tile
|
||||
mapElement = TILE_MAP_ELEMENT_POINTER(yy * 256 + xx);
|
||||
mapElement = map_get_first_element_at(xx, yy);
|
||||
do {
|
||||
if (mapElement->flags & 0x10)
|
||||
if (mapElement->flags & (1 << 4))
|
||||
continue;
|
||||
|
||||
type = mapElement->type & MAP_ELEMENT_TYPE_MASK;
|
||||
type = map_element_get_type(mapElement);
|
||||
if (type == MAP_ELEMENT_TYPE_SCENERY || type == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE)
|
||||
numSceneryItems++;
|
||||
} while (!((mapElement++)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -294,16 +294,13 @@ rct_map_element *ride_get_station_start_track_element(rct_ride *ride, int statio
|
|||
y = ride->station_starts[stationIndex] >> 8;
|
||||
z = ride->station_heights[stationIndex];
|
||||
|
||||
// Get first element of the tile
|
||||
mapElement = TILE_MAP_ELEMENT_POINTER(y * 256 + x);
|
||||
|
||||
// Find the station track element
|
||||
mapElement = map_get_first_element_at(x, y);
|
||||
do {
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_TRACK && z == mapElement->base_height)
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK && z == mapElement->base_height)
|
||||
return mapElement;
|
||||
|
||||
mapElement++;
|
||||
} while (!((mapElement - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -312,16 +309,12 @@ rct_map_element *ride_get_station_exit_element(rct_ride *ride, int x, int y, int
|
|||
{
|
||||
rct_map_element *mapElement;
|
||||
|
||||
// Get first element of the tile
|
||||
mapElement = TILE_MAP_ELEMENT_POINTER(y * 256 + x);
|
||||
|
||||
// Find the station track element
|
||||
mapElement = map_get_first_element_at(x, y);
|
||||
do {
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_ENTRANCE && z == mapElement->base_height)
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE && z == mapElement->base_height)
|
||||
return mapElement;
|
||||
|
||||
mapElement++;
|
||||
} while (!((mapElement - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
|
||||
return NULL;
|
||||
}
|
875
src/ride/track.c
875
src/ride/track.c
|
@ -19,9 +19,14 @@
|
|||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../game.h"
|
||||
#include "../interface/viewport.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../platform/platform.h"
|
||||
#include "../rct1.h"
|
||||
#include "../util/sawyercoding.h"
|
||||
#include "../util/util.h"
|
||||
#include "../world/park.h"
|
||||
#include "ride.h"
|
||||
#include "track.h"
|
||||
|
||||
|
@ -220,13 +225,223 @@ const rct_trackdefinition gTrackDefinitions[] = {
|
|||
{ TRACK_HALF_LOOP_2, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN
|
||||
};
|
||||
|
||||
uint32* sub_6AB49A(rct_object_entry* entry){
|
||||
rct_object_entry* object_list_entry = object_list_find(entry);
|
||||
|
||||
if (object_list_entry == NULL) return NULL;
|
||||
|
||||
// Return the address of the last value of the list entry
|
||||
return (((uint32*)object_get_next(object_list_entry)) - 1);
|
||||
}
|
||||
|
||||
static void get_track_idx_path(char *path)
|
||||
{
|
||||
char *homePath = platform_get_orct2_homefolder();
|
||||
sprintf(path, "%s%c%s", homePath, platform_get_path_separator(), "tracks.idx");
|
||||
free(homePath);
|
||||
}
|
||||
|
||||
static void track_list_query_directory(int *outTotalFiles){
|
||||
int enumFileHandle;
|
||||
file_info enumFileInfo;
|
||||
|
||||
*outTotalFiles = 0;
|
||||
|
||||
// Enumerate through each track in the directory
|
||||
enumFileHandle = platform_enumerate_files_begin(RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char));
|
||||
if (enumFileHandle == INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
while (platform_enumerate_files_next(enumFileHandle, &enumFileInfo)) {
|
||||
(*outTotalFiles)++;
|
||||
}
|
||||
platform_enumerate_files_end(enumFileHandle);
|
||||
}
|
||||
|
||||
static int track_list_cache_save(int fileCount, uint8* track_list_cache, uint32 track_list_size){
|
||||
char path[MAX_PATH];
|
||||
FILE *file;
|
||||
|
||||
log_verbose("saving track list cache (tracks.idx)");
|
||||
get_track_idx_path(path);
|
||||
file = fopen(path, "wb");
|
||||
if (file == NULL) {
|
||||
log_error("Failed to save %s", path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
fwrite(&fileCount, sizeof(int), 1, file);
|
||||
fwrite(track_list_cache, track_list_size, 1, file);
|
||||
uint8 last_entry = 0xFE;
|
||||
fwrite(&last_entry, 1, 1, file);
|
||||
fclose(file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8* track_list_cache_load(int totalFiles){
|
||||
char path[MAX_PATH];
|
||||
FILE *file;
|
||||
|
||||
log_verbose("loading track list cache (tracks.idx)");
|
||||
get_track_idx_path(path);
|
||||
file = fopen(path, "rb");
|
||||
if (file == NULL) {
|
||||
log_error("Failed to load %s", path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8* track_list_cache;
|
||||
uint32 fileCount;
|
||||
// Remove 4 for the file count variable
|
||||
long track_list_size = fsize(file) - 4;
|
||||
|
||||
if (track_list_size < 0) return 0;
|
||||
|
||||
fread(&fileCount, 4, 1, file);
|
||||
|
||||
if (fileCount != totalFiles){
|
||||
log_verbose("Track file count is different.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
track_list_cache = malloc(track_list_size);
|
||||
fread(track_list_cache, track_list_size, 1, file);
|
||||
return track_list_cache;
|
||||
}
|
||||
|
||||
void track_list_populate(ride_list_item item, uint8* track_list_cache){
|
||||
uint8* track_pointer = track_list_cache;
|
||||
|
||||
uint8 cur_track_entry_index = 0;
|
||||
for (uint8 track_type = *track_pointer++; track_type != 0xFE;
|
||||
track_pointer += strlen(track_pointer) + 1,
|
||||
track_type = *track_pointer++){
|
||||
rct_object_entry* track_object = (rct_object_entry*)track_pointer;
|
||||
track_pointer += sizeof(rct_object_entry);
|
||||
|
||||
if (track_type != item.type){
|
||||
continue;
|
||||
}
|
||||
|
||||
uint8 entry_type, entry_index;
|
||||
if (item.entry_index != 0xFF){
|
||||
|
||||
if (!find_object_in_entry_group(track_object, &entry_type, &entry_index))continue;
|
||||
|
||||
if (item.entry_index != entry_index)continue;
|
||||
}
|
||||
else{
|
||||
if (find_object_in_entry_group(track_object, &entry_type, &entry_index)){
|
||||
if (GET_RIDE_ENTRY(entry_index)->var_008 & 0x3000)continue;
|
||||
}
|
||||
else{
|
||||
uint32* esi = sub_6AB49A(track_object);
|
||||
if (esi == NULL) continue;
|
||||
if (*esi & 0x1000000)continue;
|
||||
}
|
||||
}
|
||||
|
||||
// If cur_track_entry_index is greater than max number of tracks
|
||||
if (cur_track_entry_index >= 1000){
|
||||
RCT2_GLOBAL(0xF635ED, uint8) |= 1;
|
||||
break;
|
||||
}
|
||||
|
||||
uint8 track_entry_index = 0;
|
||||
uint8 isBelow = 0;
|
||||
for (; track_entry_index != cur_track_entry_index; track_entry_index++){
|
||||
if (strcicmp(track_pointer, &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128]) < 0){
|
||||
isBelow = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isBelow == 1){
|
||||
memmove(
|
||||
&RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128 + 128],
|
||||
&RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128],
|
||||
(cur_track_entry_index - track_entry_index) * 128);
|
||||
}
|
||||
|
||||
strcpy(&RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128], track_pointer);
|
||||
cur_track_entry_index++;
|
||||
}
|
||||
|
||||
RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[cur_track_entry_index * 128] = '\0';
|
||||
free(track_list_cache);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006CED50
|
||||
*/
|
||||
void track_load_list(ride_list_item item)
|
||||
{
|
||||
RCT2_CALLPROC_X(0x006CED50, 0, 0, 0, *((uint16*)&item), 0, 0, 0);
|
||||
RCT2_GLOBAL(0xF635ED, uint8) = 0;
|
||||
|
||||
if (item.type < 0x80){
|
||||
rct_ride_type* ride_type = gRideTypeList[item.entry_index];
|
||||
if (!(ride_type->var_008 & 0x2000)){
|
||||
item.entry_index = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
int totalFiles;
|
||||
|
||||
track_list_query_directory(&totalFiles);
|
||||
|
||||
uint8* track_list_cache;
|
||||
|
||||
if (item.type == 0xFC || !(track_list_cache = track_list_cache_load(totalFiles))){
|
||||
uint8* new_track_file;
|
||||
|
||||
new_track_file = malloc(0x40000);
|
||||
|
||||
uint8* new_file_pointer = new_track_file;
|
||||
file_info enumFileInfo;
|
||||
|
||||
int enumFileHandle = platform_enumerate_files_begin(RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char));
|
||||
if (enumFileHandle == INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
while (platform_enumerate_files_next(enumFileHandle, &enumFileInfo)) {
|
||||
if (new_file_pointer > new_track_file + 0x3FF00)break;
|
||||
|
||||
char path[MAX_PATH];
|
||||
subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), enumFileInfo.path);
|
||||
|
||||
rct_track_td6* loaded_track = load_track_design(path);
|
||||
if (loaded_track){
|
||||
*new_file_pointer++ = loaded_track->type;
|
||||
}
|
||||
else{
|
||||
*new_file_pointer++ = 0xFF;
|
||||
}
|
||||
memcpy(new_file_pointer, &loaded_track->vehicle_object, sizeof(rct_object_entry));
|
||||
new_file_pointer += sizeof(rct_object_entry);
|
||||
|
||||
int file_name_length = strlen(enumFileInfo.path);
|
||||
strcpy(new_file_pointer, enumFileInfo.path);
|
||||
new_file_pointer += file_name_length + 1;
|
||||
}
|
||||
platform_enumerate_files_end(enumFileHandle);
|
||||
|
||||
if (!track_list_cache_save(totalFiles, new_track_file, new_file_pointer - new_track_file)){
|
||||
log_error("Track list failed to save.");
|
||||
return;
|
||||
}
|
||||
free(new_track_file);
|
||||
|
||||
track_list_cache = track_list_cache_load(totalFiles);
|
||||
if (!track_list_cache){
|
||||
log_error("Track list failed to load after new save");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
track_list_populate(item, track_list_cache);
|
||||
free(track_list_cache);
|
||||
//RCT2_CALLPROC_X(0x006CED50, 0, 0, 0, *((uint16*)&item), 0, 0, 0);
|
||||
}
|
||||
|
||||
static void read(void *dst, void **src, int length)
|
||||
|
@ -240,30 +455,28 @@ static void read(void *dst, void **src, int length)
|
|||
* rct2: 0x0067726A
|
||||
* path: 0x0141EF68
|
||||
*/
|
||||
int sub_67726A(const char *path)
|
||||
rct_track_td6* load_track_design(const char *path)
|
||||
{
|
||||
FILE *fp;
|
||||
long fpLength;
|
||||
const char *ch;
|
||||
char trackFilename[MAX_PATH], *fpBuffer, *decoded, *src, *dst;
|
||||
char *fpBuffer, *decoded, *src;
|
||||
int i, decodedLength;
|
||||
uint8* edi;
|
||||
|
||||
RCT2_GLOBAL(0x009AAC54, uint8) = 1;
|
||||
|
||||
// Get filename
|
||||
ch = strrchr(path, '\\');
|
||||
ch = ch == NULL ? path : ch + 1;
|
||||
dst = trackFilename;
|
||||
while (*ch != 0 && *ch != '.') {
|
||||
*dst++ = *ch++;
|
||||
}
|
||||
*dst = 0;
|
||||
|
||||
fp = fopen(path, "rb");
|
||||
if (fp == NULL)
|
||||
return 0;
|
||||
|
||||
char* track_name_pointer = (char*)path;
|
||||
while (*track_name_pointer++ != '\0');
|
||||
while (*--track_name_pointer != '\\');
|
||||
char* default_name = RCT2_ADDRESS(0x009E3504, char);
|
||||
// Copy the track name for use as the default name of this ride
|
||||
while (*++track_name_pointer != '.')*default_name++ = *track_name_pointer;
|
||||
*default_name++ = '\0';
|
||||
|
||||
// Read whole file into a buffer
|
||||
fpLength = fsize(fp);
|
||||
fpBuffer = malloc(fpLength);
|
||||
|
@ -280,100 +493,500 @@ int sub_67726A(const char *path)
|
|||
realloc(decoded, decodedLength);
|
||||
free(fpBuffer);
|
||||
|
||||
rct_track_td6* track_design = RCT2_ADDRESS(0x009D8178, rct_track_td6);
|
||||
// Read decoded data
|
||||
src = decoded;
|
||||
memset((void*)0x009D81D8, 0, 67);
|
||||
read((void*)0x009D8178, &src, 32);
|
||||
// Clear top of track_design as this is not loaded from the td4 files
|
||||
memset(&track_design->track_spine_colour, 0, 67);
|
||||
// Read start of track_design
|
||||
read(track_design, &src, 32);
|
||||
|
||||
uint8 al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
|
||||
if (al >= 2)
|
||||
read((void*)0x009D8198, &src, 40);
|
||||
uint8 version = track_design->var_07 >> 2;
|
||||
|
||||
read((void*)0x009D81C0, &src, 24);
|
||||
al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
|
||||
if (al != 0)
|
||||
read((void*)0x009D81D8, &src, al == 1 ? 140 : 67);
|
||||
|
||||
read((void*)0x009D821B, &src, 24572);
|
||||
al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
|
||||
if (al < 2) {
|
||||
if (RCT2_GLOBAL(0x009D8178, uint8) == 20) {
|
||||
edi = (uint8*)0x009D821B;
|
||||
while (*edi != 0) {
|
||||
edi += 4;
|
||||
}
|
||||
edi += 4;
|
||||
memset(edi, 255, (uint8*)0x009DE217 - edi);
|
||||
} else {
|
||||
edi = (uint8*)0x009D821B;
|
||||
while (*edi != 255) {
|
||||
edi += 2;
|
||||
}
|
||||
edi++;
|
||||
memset(edi, 255, (uint8*)0x009DE217 - edi);
|
||||
}
|
||||
if (version > 2){
|
||||
free(decoded);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// In td6 there are 32 sets of two byte vehicle colour specifiers
|
||||
// In td4 there are 12 sets so the remaining 20 need to be read.
|
||||
if (version == 2)
|
||||
read(&track_design->vehicle_colours[12], &src, 40);
|
||||
|
||||
read(&track_design->pad_48, &src, 24);
|
||||
|
||||
// In td4 (version AA/CF) and td6 both start actual track data at 0xA3
|
||||
if (version > 0)
|
||||
read(&track_design->track_spine_colour, &src, version == 1 ? 140 : 67);
|
||||
|
||||
uint8* track_elements = RCT2_ADDRESS(0x9D821B, uint8);
|
||||
// Read the actual track data.
|
||||
read(track_elements, &src, 24572);
|
||||
|
||||
uint8* final_track_element_location = track_elements + 24572;
|
||||
free(decoded);
|
||||
|
||||
//
|
||||
al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
|
||||
if (al > 2)
|
||||
return 0;
|
||||
// td4 files require some work to be recognised as td6.
|
||||
if (version < 2) {
|
||||
|
||||
if (al <= 1) {
|
||||
edi = (uint8*)0x009D8180;
|
||||
// Set any element passed the tracks to 0xFF
|
||||
if (track_design->type == RIDE_TYPE_MAZE) {
|
||||
uint32* maze_element = (uint32*)track_elements;
|
||||
while (*maze_element != 0) {
|
||||
maze_element++;
|
||||
}
|
||||
maze_element++;
|
||||
memset(maze_element, 255, final_track_element_location - (uint8*)maze_element);
|
||||
} else {
|
||||
uint8* track_element = track_elements;
|
||||
while (*track_element != 255) {
|
||||
track_element += 2;
|
||||
}
|
||||
track_element++;
|
||||
memset(track_element, 255, final_track_element_location - track_element);
|
||||
}
|
||||
|
||||
// Edit the colours to use the new versions
|
||||
// Unsure why it is 67
|
||||
edi = (uint8*)&track_design->vehicle_colours;
|
||||
for (i = 0; i < 67; i++)
|
||||
*edi++ = RCT2_ADDRESS(0x0097F0BC, uint8)[*edi];
|
||||
|
||||
edi = (uint8*)0x009D81D8;
|
||||
// Edit the colours to use the new versions
|
||||
edi = (uint8*)&track_design->track_spine_colour;
|
||||
for (i = 0; i < 12; i++)
|
||||
*edi++ = RCT2_ADDRESS(0x0097F0BC, uint8)[*edi];
|
||||
|
||||
RCT2_GLOBAL(0x009D81D2, uint8) >>= 1;
|
||||
if (!RCT2_CALLPROC_X(0x00677530, 0, 0, 0, 0, 0, 0, 0))
|
||||
RCT2_GLOBAL(0x009D8178, uint8) = 255;
|
||||
// Highest drop height is 1bit = 3/4 a meter in td6
|
||||
// Highest drop height is 1bit = 1/3 a meter in td4
|
||||
// Not sure if this is correct??
|
||||
track_design->highest_drop_height >>= 1;
|
||||
if (0x100 & RCT2_CALLPROC_X(0x00677530, 0, 0, 0, 0, 0, 0, 0))
|
||||
track_design->type = RIDE_TYPE_NULL;
|
||||
|
||||
if (RCT2_GLOBAL(0x009D8178, uint8) == 4)
|
||||
RCT2_GLOBAL(0x009D8178, uint8) = 255;
|
||||
if (track_design->type == RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER)
|
||||
track_design->type = RIDE_TYPE_NULL;
|
||||
|
||||
if (RCT2_GLOBAL(0x009D8178, uint8) == 0)
|
||||
RCT2_GLOBAL(0x009D8178, uint8) = 52;
|
||||
if (track_design->type == RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER)
|
||||
track_design->type = RIDE_TYPE_WOODEN_ROLLER_COASTER;
|
||||
|
||||
if (RCT2_GLOBAL(0x009D8178, uint8) == 19) {
|
||||
if (RCT2_GLOBAL(0x009D817E, uint8) == 3)
|
||||
RCT2_GLOBAL(0x009D817E, uint8) = 35;
|
||||
if (RCT2_GLOBAL(0x009D8179, uint8) == 79) {
|
||||
if (RCT2_GLOBAL(0x009D817E, uint8) == 2)
|
||||
RCT2_GLOBAL(0x009D817E, uint8) = 1;
|
||||
if (track_design->type == RIDE_TYPE_CORKSCREW_ROLLER_COASTER) {
|
||||
if (track_design->var_06 == 3)
|
||||
track_design->var_06 = 35;
|
||||
if (track_design->vehicle_type == 79) {
|
||||
if (track_design->var_06 == 2)
|
||||
track_design->var_06 = 1;
|
||||
}
|
||||
}
|
||||
|
||||
int unk1 = RCT2_GLOBAL(0x009D8179, uint8);
|
||||
if (RCT2_GLOBAL(0x009D8178, uint8) == 20) {
|
||||
unk1 = 0x0097F66C;
|
||||
rct_object_entry* vehicle_object;
|
||||
if (track_design->type == RIDE_TYPE_MAZE) {
|
||||
vehicle_object = RCT2_ADDRESS(0x0097F66C, rct_object_entry);
|
||||
} else {
|
||||
if (unk1 == 3 && RCT2_GLOBAL(0x009D8178, uint8) == 3)
|
||||
unk1 = 80;
|
||||
unk1 = 0x0097F0DC + (unk1 * 16);
|
||||
int vehicle_type = track_design->vehicle_type;
|
||||
if (vehicle_type == 3 && track_design->type == RIDE_TYPE_INVERTED_ROLLER_COASTER)
|
||||
vehicle_type = 80;
|
||||
vehicle_object = &RCT2_ADDRESS(0x0097F0DC, rct_object_entry)[vehicle_type];
|
||||
}
|
||||
|
||||
memcpy((void*)0x009D81E8, (void*)unk1, 16);
|
||||
memcpy(&track_design->vehicle_object, vehicle_object, sizeof(rct_object_entry));
|
||||
for (i = 0; i < 32; i++)
|
||||
RCT2_ADDRESS(0x009D81FA, uint8)[i] = RCT2_ADDRESS(0x009D8181, uint8)[i * 2];
|
||||
track_design->vehicle_additional_colour[i] = track_design->vehicle_colours[i].trim_colour;
|
||||
|
||||
RCT2_GLOBAL(0x009D81F8, uint8) = 255;
|
||||
RCT2_GLOBAL(0x009D81F9, uint8) = 255;
|
||||
RCT2_GLOBAL(0x009D821A, uint8) = 5;
|
||||
track_design->space_required_x = 255;
|
||||
track_design->space_required_y = 255;
|
||||
track_design->var_A2 = 5;
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(0x009D81C8, uint8) = min(
|
||||
RCT2_GLOBAL(0x009D81C8, uint8),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + 5 + (RCT2_GLOBAL(0x009D8178, uint8) * 8), uint8)
|
||||
track_design->var_50 = min(
|
||||
track_design->var_50,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + 5 + (track_design->type * 8), uint8)
|
||||
);
|
||||
|
||||
return track_design;
|
||||
}
|
||||
|
||||
/* rct2: 0x006D1DCE*/
|
||||
void reset_track_list_cache(){
|
||||
int* track_list_cache = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_DESIGN_INDEX_CACHE, int);
|
||||
for (int i = 0; i < 4; ++i){
|
||||
track_list_cache[i] = -1;
|
||||
}
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_NEXT_INDEX_CACHE, uint32) = 0;
|
||||
}
|
||||
|
||||
/* rct2: 0x006D1C68 */
|
||||
int backup_map(){
|
||||
RCT2_GLOBAL(0xF440ED, uint8*) = malloc(0xED600);
|
||||
if (RCT2_GLOBAL(0xF440ED, uint32) == 0) return 0;
|
||||
|
||||
RCT2_GLOBAL(0xF440F1, uint8*) = malloc(0x40000);
|
||||
if (RCT2_GLOBAL(0xF440F1, uint32) == 0){
|
||||
free(RCT2_GLOBAL(0xF440ED, uint8*));
|
||||
return 0;
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(0xF440F5, uint8*) = malloc(14);
|
||||
if (RCT2_GLOBAL(0xF440F5, uint32) == 0){
|
||||
free(RCT2_GLOBAL(0xF440ED, uint8*));
|
||||
free(RCT2_GLOBAL(0xF440F1, uint8*));
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32* map_elements = RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, uint32);
|
||||
memcpy(RCT2_GLOBAL(0xF440ED, uint32*), map_elements, 0xED600);
|
||||
|
||||
uint32* tile_map_pointers = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, uint32);
|
||||
memcpy(RCT2_GLOBAL(0xF440F1, uint32*), tile_map_pointers, 0x40000);
|
||||
|
||||
uint8* backup_info = RCT2_GLOBAL(0xF440F5, uint8*);
|
||||
*(uint32*)backup_info = RCT2_GLOBAL(0x0140E9A4, uint32);
|
||||
*(uint16*)(backup_info + 4) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16);
|
||||
*(uint16*)(backup_info + 6) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, uint16);
|
||||
*(uint16*)(backup_info + 8) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16);
|
||||
*(uint32*)(backup_info + 10) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* rct2: 0x006D2378 */
|
||||
void reload_map_backup(){
|
||||
uint32* map_elements = RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, uint32);
|
||||
memcpy(map_elements, RCT2_GLOBAL(0xF440ED, uint32*), 0xED600);
|
||||
|
||||
uint32* tile_map_pointers = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, uint32);
|
||||
memcpy(tile_map_pointers, RCT2_GLOBAL(0xF440F1, uint32*), 0x40000);
|
||||
|
||||
uint8* backup_info = RCT2_GLOBAL(0xF440F5, uint8*);
|
||||
RCT2_GLOBAL(0x0140E9A4, uint32) = *(uint32*)backup_info;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = *(uint16*)(backup_info + 4);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, uint16) = *(uint16*)(backup_info + 6);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) = *(uint16*)(backup_info + 8);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = *(uint32*)(backup_info + 10);
|
||||
|
||||
free(RCT2_GLOBAL(0xF440ED, uint8*));
|
||||
free(RCT2_GLOBAL(0xF440F1, uint8*));
|
||||
free(RCT2_GLOBAL(0xF440F5, uint8*));
|
||||
}
|
||||
|
||||
/* rct2: 0x006D1D9A */
|
||||
void blank_map(){
|
||||
|
||||
// These values were previously allocated in backup map but
|
||||
// it seems more fitting to place in this function
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = 0x1FE0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, uint16) = 0x20FE;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) = 0x100;
|
||||
|
||||
rct_map_element* map_element;
|
||||
for (int i = 0; i < MAX_TILE_MAP_ELEMENT_POINTERS; i++) {
|
||||
map_element = GET_MAP_ELEMENT(i);
|
||||
map_element->type = MAP_ELEMENT_TYPE_SURFACE;
|
||||
map_element->flags = MAP_ELEMENT_FLAG_LAST_TILE;
|
||||
map_element->base_height = 2;
|
||||
map_element->clearance_height = 0;
|
||||
map_element->properties.surface.slope = 0;
|
||||
map_element->properties.surface.terrain = 0;
|
||||
map_element->properties.surface.grass_length = 1;
|
||||
map_element->properties.surface.ownership = OWNERSHIP_OWNED;
|
||||
}
|
||||
map_update_tile_pointers();
|
||||
}
|
||||
|
||||
/* rct2: 0x006ABDB0 */
|
||||
void load_track_scenery_objects(){
|
||||
uint8 entry_index = RCT2_GLOBAL(0xF44157, uint8);
|
||||
rct_object_entry_extended* object_entry = &object_entry_groups[0].entries[entry_index];
|
||||
|
||||
rct_object_entry* copied_entry = RCT2_ADDRESS(0xF43414, rct_object_entry);
|
||||
memcpy(copied_entry, object_entry, sizeof(rct_object_entry));
|
||||
|
||||
object_unload_all();
|
||||
object_load(-1, copied_entry, 0);
|
||||
uint8 entry_type;
|
||||
find_object_in_entry_group(copied_entry, &entry_type, &entry_index);
|
||||
RCT2_GLOBAL(0xF44157, uint8) = entry_index;
|
||||
|
||||
rct_track_td6* track_design = RCT2_ADDRESS(0x009D8178, rct_track_td6);
|
||||
uint8* track_elements = RCT2_ADDRESS(0x9D821B, uint8);
|
||||
|
||||
if (track_design->type == RIDE_TYPE_MAZE){
|
||||
// Skip all of the maze track elements
|
||||
while (*(uint32*)track_elements != 0)track_elements += 4;
|
||||
track_elements += 4;
|
||||
}
|
||||
else{
|
||||
// Skip track_elements
|
||||
while (*track_elements != 255) track_elements += 2;
|
||||
track_elements++;
|
||||
|
||||
// Skip entrance exit elements
|
||||
while (*track_elements != 255) track_elements += 6;
|
||||
track_elements++;
|
||||
}
|
||||
|
||||
while (*track_elements != 255){
|
||||
if (!find_object_in_entry_group((rct_object_entry*)track_elements, &entry_type, &entry_index)){
|
||||
object_load(-1, (rct_object_entry*)track_elements, 0);
|
||||
}
|
||||
// Skip object and location/direction/colour
|
||||
track_elements += sizeof(rct_object_entry) + 6;
|
||||
}
|
||||
|
||||
sub_6A9FC0();
|
||||
}
|
||||
|
||||
/**
|
||||
* Places a virtual track. This can involve highlighting the surface tiles and showing the track layout. It is also used by
|
||||
* the track preview window to place the whole track.
|
||||
* Depending on the value of bl it modifies the function.
|
||||
* bl == 0, Draw outlines on the ground
|
||||
* bl == 3, Returns the z value of a succesful placement
|
||||
* bl == 5, Returns cost to create the track. Places the track. (used by the preview)
|
||||
* bl == 6, Clear white outlined track.
|
||||
* rct2: 0x006D01B3
|
||||
*/
|
||||
int sub_6D01B3(int bl, int x, int y, int z)
|
||||
{
|
||||
int eax, ebx, ecx, edx, esi, edi, ebp;
|
||||
eax = x;
|
||||
ebx = bl;
|
||||
ecx = y;
|
||||
edx = z;
|
||||
esi = 0;
|
||||
edi = 0;
|
||||
ebp = 0;
|
||||
RCT2_CALLFUNC_X(0x006D01B3, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
return *((short*)&ebx);
|
||||
}
|
||||
|
||||
/* rct2: 0x006D2189
|
||||
* ebx = ride_id
|
||||
* cost = edi
|
||||
*/
|
||||
int sub_6D2189(int* cost, uint8* ride_id){
|
||||
RCT2_GLOBAL(0xF44151, uint8) = 0;
|
||||
rct_track_td6* track_design = RCT2_ADDRESS(0x009D8178, rct_track_td6);
|
||||
uint8 entry_type, entry_index;
|
||||
|
||||
if (!find_object_in_entry_group(&track_design->vehicle_object, &entry_type, &entry_index))
|
||||
entry_index = 0xFF;
|
||||
|
||||
int eax = 0, ebx, ecx = 0, edx, esi, edi = 0, ebp = 0;
|
||||
ebx = 41;
|
||||
edx = track_design->type | (entry_index << 8);
|
||||
esi = GAME_COMMAND_6;
|
||||
|
||||
if (0x80000000 == game_do_command_p(GAME_COMMAND_6, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp)) return 1;
|
||||
|
||||
// bh
|
||||
*ride_id = edi & 0xFF;
|
||||
|
||||
rct_ride* ride = GET_RIDE(*ride_id);
|
||||
|
||||
uint8* ride_name = RCT2_ADDRESS(0x9E3504, uint8);
|
||||
rct_string_id new_ride_name = user_string_allocate(132, ride_name);
|
||||
|
||||
if (new_ride_name){
|
||||
rct_string_id old_name = ride->name;
|
||||
ride->name = new_ride_name;
|
||||
user_string_free(old_name);
|
||||
}
|
||||
|
||||
uint8 version = track_design->var_07 >> 2;
|
||||
|
||||
if (version == 2){
|
||||
ride->entrance_style = track_design->entrance_style;
|
||||
}
|
||||
|
||||
if (version != 0){
|
||||
memcpy(&ride->track_colour_main, &track_design->track_spine_colour, 4);
|
||||
memcpy(&ride->track_colour_additional, &track_design->track_rail_colour, 4);
|
||||
memcpy(&ride->track_colour_supports, &track_design->track_support_colour, 4);
|
||||
}
|
||||
else{
|
||||
memset(&ride->track_colour_main, track_design->track_spine_colour_rct1, 4);
|
||||
memset(&ride->track_colour_additional, track_design->track_rail_colour_rct1, 4);
|
||||
memset(&ride->track_colour_supports, track_design->track_support_colour_rct1, 4);
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(0x009D8150, uint8) |= 1;
|
||||
uint8 backup_rotation = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8);
|
||||
uint32 backup_park_flags = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_FORBID_HIGH_CONSTRUCTION;
|
||||
int map_size = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) << 4;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 0;
|
||||
int z = sub_6D01B3(3, map_size, map_size, 16);
|
||||
|
||||
if (RCT2_GLOBAL(0xF4414E, uint8) & 4){
|
||||
RCT2_GLOBAL(0xF44151, uint8) |= 2;
|
||||
}
|
||||
//dx
|
||||
z += 16 - RCT2_GLOBAL(0xF44129, uint16);
|
||||
|
||||
int bl = 5;
|
||||
if (RCT2_GLOBAL(0xF4414E, uint8) & 2){
|
||||
bl |= 0x80;
|
||||
RCT2_GLOBAL(0xF44151, uint8) |= 1;
|
||||
}
|
||||
edi = sub_6D01B3((*ride_id << 8) | bl, map_size, map_size, z);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) = backup_park_flags;
|
||||
|
||||
if (edi != 0x80000000){
|
||||
|
||||
if (!find_object_in_entry_group(&track_design->vehicle_object, &entry_type, &entry_index)){
|
||||
RCT2_GLOBAL(0xF44151, uint8) |= 4;
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = backup_rotation;
|
||||
RCT2_GLOBAL(0x009D8150, uint8) &= ~1;
|
||||
*cost = edi;
|
||||
return 1;
|
||||
}
|
||||
else{
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = backup_rotation;
|
||||
user_string_free(ride->name);
|
||||
ride->type = RIDE_TYPE_NULL;
|
||||
RCT2_GLOBAL(0x009D8150, uint8) &= ~1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* rct2: 0x006D235B */
|
||||
void sub_6D235B(uint8 ride_id){
|
||||
rct_ride* ride = GET_RIDE(ride_id);
|
||||
user_string_free(ride->name);
|
||||
ride->type = RIDE_TYPE_NULL;
|
||||
}
|
||||
|
||||
/* rct2: 0x006D1EF0 */
|
||||
void draw_track_preview(uint8** preview){
|
||||
// Make a copy of the map
|
||||
if (!backup_map())return;
|
||||
|
||||
blank_map();
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER){
|
||||
load_track_scenery_objects();
|
||||
}
|
||||
|
||||
int cost;
|
||||
uint8 ride_id;
|
||||
|
||||
if (!sub_6D2189(&cost, &ride_id)){
|
||||
memset(preview, 0, TRACK_PREVIEW_IMAGE_SIZE * 4);
|
||||
reload_map_backup();
|
||||
return;
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_COST, money32) = cost;
|
||||
|
||||
rct_viewport* view = RCT2_ADDRESS(0x9D8161, rct_viewport);
|
||||
rct_drawpixelinfo* dpi = RCT2_ADDRESS(0x9D8151, rct_drawpixelinfo);
|
||||
int left, top, right, bottom;
|
||||
|
||||
int center_x = (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_X_MAX, sint16) + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_X_MIN, sint16)) / 2 + 16;
|
||||
int center_y = (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_Y_MAX, sint16) + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_Y_MIN, sint16)) / 2 + 16;
|
||||
int center_z = (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_Z_MIN, sint16) + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_Z_MAX, sint16)) / 2;
|
||||
|
||||
int width = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_X_MAX, sint16) - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_X_MIN, sint16);
|
||||
int height = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_Y_MAX, sint16) - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_Y_MIN, sint16);
|
||||
|
||||
if (width < height)
|
||||
width = height;
|
||||
|
||||
int zoom_level = 1;
|
||||
|
||||
if (width > 1120)
|
||||
zoom_level = 2;
|
||||
|
||||
if (width > 2240)
|
||||
zoom_level = 3;
|
||||
|
||||
width = 370 << zoom_level;
|
||||
height = 217 << zoom_level;
|
||||
|
||||
int x = center_y - center_x - width / 2;
|
||||
int y = (center_y + center_x) / 2 - center_z - height / 2;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = 0;
|
||||
|
||||
view->width = 370;
|
||||
view->height = 217;
|
||||
view->view_width = width;
|
||||
view->view_height = height;
|
||||
view->x = 0;
|
||||
view->y = 0;
|
||||
view->view_x = x;
|
||||
view->view_y = y;
|
||||
view->zoom = zoom_level;
|
||||
view->flags = VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_INVISIBLE_SPRITES;
|
||||
|
||||
dpi->zoom_level = zoom_level;
|
||||
dpi->x = 0;
|
||||
dpi->y = 0;
|
||||
dpi->width = 370;
|
||||
dpi->height = 217;
|
||||
dpi->pitch = 0;
|
||||
dpi->bits = (char*)preview;
|
||||
|
||||
top = y;
|
||||
left = x;
|
||||
bottom = y + height;
|
||||
right = x + width;
|
||||
|
||||
viewport_paint(view, dpi, left, top, right, bottom);
|
||||
|
||||
dpi->bits += TRACK_PREVIEW_IMAGE_SIZE;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = 1;
|
||||
x = -center_y - center_x - width / 2;
|
||||
y = (center_y - center_x) / 2 - center_z - height / 2;
|
||||
|
||||
view->view_x = x;
|
||||
view->view_y = y;
|
||||
top = y;
|
||||
left = x;
|
||||
bottom = y + height;
|
||||
right = x + width;
|
||||
|
||||
viewport_paint(view, dpi, left, top, right, bottom);
|
||||
|
||||
dpi->bits += TRACK_PREVIEW_IMAGE_SIZE;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = 2;
|
||||
x = center_x - center_y - width / 2;
|
||||
y = (-center_y - center_x) / 2 - center_z - height / 2;
|
||||
|
||||
view->view_x = x;
|
||||
view->view_y = y;
|
||||
top = y;
|
||||
left = x;
|
||||
bottom = y + height;
|
||||
right = x + width;
|
||||
|
||||
viewport_paint(view, dpi, left, top, right, bottom);
|
||||
|
||||
dpi->bits += TRACK_PREVIEW_IMAGE_SIZE;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = 3;
|
||||
x = center_x + center_y - width / 2;
|
||||
y = (center_x - center_y) / 2 - center_z - height / 2;
|
||||
|
||||
view->view_x = x;
|
||||
view->view_y = y;
|
||||
top = y;
|
||||
left = x;
|
||||
bottom = y + height;
|
||||
right = x + width;
|
||||
|
||||
viewport_paint(view, dpi, left, top, right, bottom);
|
||||
|
||||
sub_6D235B(ride_id);
|
||||
reload_map_backup();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* I don't think preview is a necessary output argument. It can be obtained easily using the track design structure.
|
||||
|
@ -382,45 +995,55 @@ int sub_67726A(const char *path)
|
|||
rct_track_design *track_get_info(int index, uint8** preview)
|
||||
{
|
||||
rct_track_design *trackDesign;
|
||||
uint8 *trackDesignList = (uint8*)0x00F441EC;
|
||||
uint8 *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8);
|
||||
int i;
|
||||
|
||||
trackDesign = NULL;
|
||||
|
||||
// Check if track design has already been loaded
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (index == RCT2_ADDRESS(0x00F44109, uint32)[i]) {
|
||||
trackDesign = &RCT2_GLOBAL(0x00F44105, rct_track_design*)[i];
|
||||
if (index == RCT2_ADDRESS(RCT2_ADDRESS_TRACK_DESIGN_INDEX_CACHE, uint32)[i]) {
|
||||
trackDesign = &RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_CACHE, rct_track_design*)[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (trackDesign == NULL) {
|
||||
// Load track design
|
||||
i = RCT2_GLOBAL(0x00F44119, uint32);
|
||||
RCT2_GLOBAL(0x00F44119, uint32)++;
|
||||
if (RCT2_GLOBAL(0x00F44119, uint32) >= 4)
|
||||
RCT2_GLOBAL(0x00F44119, uint32) = 0;
|
||||
i = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_NEXT_INDEX_CACHE, uint32)++;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_NEXT_INDEX_CACHE, uint32) >= 4)
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_NEXT_INDEX_CACHE, uint32) = 0;
|
||||
|
||||
RCT2_ADDRESS(0x00F44109, uint32)[i] = index;
|
||||
subsitute_path((char*)0x0141EF68, (char*)RCT2_ADDRESS_TRACKS_PATH, trackDesignList + (index * 128));
|
||||
if (!sub_67726A((char*)0x0141EF68)) {
|
||||
RCT2_ADDRESS(RCT2_ADDRESS_TRACK_DESIGN_INDEX_CACHE, uint32)[i] = index;
|
||||
|
||||
char track_path[MAX_PATH] = { 0 };
|
||||
subsitute_path(track_path, (char*)RCT2_ADDRESS_TRACKS_PATH, trackDesignList + (index * 128));
|
||||
|
||||
rct_track_td6* loaded_track = NULL;
|
||||
|
||||
log_verbose("Loading track: %s", trackDesignList + (index * 128));
|
||||
|
||||
if (!(loaded_track = load_track_design(track_path))) {
|
||||
if (preview != NULL) *preview = NULL;
|
||||
log_error("Failed to load track: %s", trackDesignList + (index * 128));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
trackDesign = &RCT2_GLOBAL(0x00F44105, rct_track_design*)[i];
|
||||
trackDesign = &RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_CACHE, rct_track_design*)[i];
|
||||
|
||||
// Copy the track design apart from the preview image
|
||||
memcpy(&trackDesign->track_td6, loaded_track, sizeof(rct_track_td6));
|
||||
// Load in a new preview image, calculate cost variable, calculate var_06
|
||||
draw_track_preview((uint8**)trackDesign->preview);
|
||||
//RCT2_CALLPROC_X(0x006D1EF0, 0, 0, 0, 0, 0, (int)&trackDesign->preview, 0);
|
||||
|
||||
memcpy(trackDesign, (void*)0x009D8178, 163);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006D1EF0);
|
||||
|
||||
trackDesign->cost = RCT2_GLOBAL(0x00F4411D, money32);
|
||||
trackDesign->var_06 = RCT2_GLOBAL(0x00F44151, uint8) & 7;
|
||||
trackDesign->track_td6.cost = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_COST, money32);
|
||||
trackDesign->track_td6.var_06 = RCT2_GLOBAL(0x00F44151, uint8) & 7;
|
||||
}
|
||||
|
||||
// Set preview to correct preview image based on rotation
|
||||
if (preview != NULL)
|
||||
*preview = trackDesign->preview[RCT2_GLOBAL(0x00F440AE, uint8)];
|
||||
*preview = trackDesign->preview[RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8)];
|
||||
|
||||
return trackDesign;
|
||||
}
|
||||
|
@ -431,7 +1054,47 @@ rct_track_design *track_get_info(int index, uint8** preview)
|
|||
*/
|
||||
int track_rename(const char *text)
|
||||
{
|
||||
return (RCT2_CALLPROC_X(0x006D3664, 0, 0, 0, (int)text, 0, 0, 0) & 0x100) != 0;
|
||||
const char* txt_chr = text;
|
||||
|
||||
while (*txt_chr != '\0'){
|
||||
switch (*txt_chr){
|
||||
case '.':
|
||||
case '/':
|
||||
case '\\':
|
||||
case '*':
|
||||
case '?':
|
||||
// Invalid characters
|
||||
RCT2_GLOBAL(0x141E9AC, uint16) = 3353;
|
||||
return 0;
|
||||
}
|
||||
txt_chr++;
|
||||
}
|
||||
|
||||
char new_path[MAX_PATH];
|
||||
subsitute_path(new_path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), text);
|
||||
strcat(new_path, ".TD6");
|
||||
|
||||
rct_window* w = window_find_by_class(WC_TRACK_DESIGN_LIST);
|
||||
|
||||
char old_path[MAX_PATH];
|
||||
subsitute_path(old_path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, char)[128 * w->track_list.var_482]);
|
||||
|
||||
if (!platform_file_move(old_path, new_path)) {
|
||||
RCT2_GLOBAL(0x141E9AC, uint16) = 3354;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ride_list_item item = { 0xFC, 0 };
|
||||
track_load_list(item);
|
||||
|
||||
item.type = RCT2_GLOBAL(0xF44158, uint8);
|
||||
item.entry_index = RCT2_GLOBAL(0xF44159, uint8);
|
||||
track_load_list(item);
|
||||
|
||||
reset_track_list_cache();
|
||||
|
||||
window_invalidate(w);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -440,5 +1103,25 @@ int track_rename(const char *text)
|
|||
*/
|
||||
int track_delete()
|
||||
{
|
||||
return (RCT2_CALLPROC_X(0x006D3761, 0, 0, 0, 0, 0, 0, 0) & 0x100) != 0;
|
||||
}
|
||||
rct_window* w = window_find_by_class(WC_TRACK_DESIGN_LIST);
|
||||
|
||||
char path[MAX_PATH];
|
||||
subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, char)[128 * w->track_list.var_482]);
|
||||
|
||||
if (!platform_file_delete(path)) {
|
||||
RCT2_GLOBAL(0x141E9AC, uint16) = 3355;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ride_list_item item = { 0xFC, 0 };
|
||||
track_load_list(item);
|
||||
|
||||
item.type = RCT2_GLOBAL(0xF44158, uint8);
|
||||
item.entry_index = RCT2_GLOBAL(0xF44159, uint8);
|
||||
track_load_list(item);
|
||||
|
||||
reset_track_list_cache();
|
||||
|
||||
window_invalidate(w);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
#include "../common.h"
|
||||
#include "ride.h"
|
||||
#include "../object.h"
|
||||
|
||||
typedef struct {
|
||||
uint8 type;
|
||||
|
@ -34,21 +35,85 @@ typedef struct {
|
|||
uint8 pad[2];
|
||||
} rct_trackdefinition;
|
||||
|
||||
/**
|
||||
* Size: 0x0A
|
||||
*/
|
||||
typedef struct {
|
||||
uint8 var_00;
|
||||
sint16 x;
|
||||
sint16 y;
|
||||
uint8 pad_05[3];
|
||||
uint8 var_08;
|
||||
uint8 unk_09;
|
||||
} rct_preview_track;
|
||||
|
||||
/**
|
||||
* Size: 0x04
|
||||
*/
|
||||
typedef struct {
|
||||
union {
|
||||
uint32 all;
|
||||
struct {
|
||||
sint8 x;
|
||||
sint8 y;
|
||||
uint8 unk_2;
|
||||
uint8 type;
|
||||
};
|
||||
};
|
||||
} rct_maze_element;
|
||||
|
||||
/* Size: 0x02 */
|
||||
typedef struct{
|
||||
uint8 type;
|
||||
uint8 flags;
|
||||
}rct_track_element;
|
||||
|
||||
enum{
|
||||
TRACK_ELEMENT_FLAG_CHAIN_LIFT = (1<<7),
|
||||
TRACK_ELEMENT_FLAG_INVERTED = (1<<6),
|
||||
TRACK_ELEMENT_FLAG_TERMINAL_STATION = (1<<3),
|
||||
};
|
||||
|
||||
#define TRACK_ELEMENT_FLAG_MAGNITUDE_MASK 0x0F
|
||||
#define TRACK_ELEMENT_FLAG_COLOUR_MASK 0x30
|
||||
#define TRACK_ELEMENT_FLAG_STATION_NO_MASK 0x02
|
||||
|
||||
#define TRACK_PREVIEW_IMAGE_SIZE (370 * 217)
|
||||
|
||||
/* size: 0x2 */
|
||||
typedef struct{
|
||||
uint8 body_colour;
|
||||
uint8 trim_colour;
|
||||
} rct_track_vehicle_colour;
|
||||
|
||||
/**
|
||||
* Track design structure.
|
||||
* size: 0x4E72B
|
||||
*/
|
||||
typedef struct {
|
||||
uint8 type; // 0x00
|
||||
uint8 pad_01;
|
||||
uint8 vehicle_type;
|
||||
money32 cost; // 0x02
|
||||
uint8 var_06;
|
||||
uint8 var_07;
|
||||
uint8 pad_08[0x42];
|
||||
uint8 total_air_time; // 0x4A
|
||||
uint8 pad_4B[0x06];
|
||||
rct_track_vehicle_colour vehicle_colours[32]; // 0x08
|
||||
union{
|
||||
uint8 pad_48;
|
||||
uint8 track_spine_colour_rct1; // 0x48
|
||||
};
|
||||
union{
|
||||
uint8 entrance_style; // 0x49
|
||||
uint8 track_rail_colour_rct1; // 0x49
|
||||
};
|
||||
union{
|
||||
uint8 total_air_time; // 0x4A
|
||||
uint8 track_support_colour_rct1; // 0x4A
|
||||
};
|
||||
uint8 pad_4B;
|
||||
uint8 number_of_trains; // 0x4C
|
||||
uint8 number_of_cars_per_train; // 0x4D
|
||||
uint8 pad_4E[2];
|
||||
uint8 var_50;
|
||||
uint8 max_speed; // 0x51
|
||||
uint8 average_speed; // 0x52
|
||||
uint16 ride_length; // 0x53
|
||||
|
@ -64,15 +129,24 @@ typedef struct {
|
|||
uint8 excitement; // 0x5B
|
||||
uint8 intensity; // 0x5C
|
||||
uint8 nausea; // 0x5D
|
||||
uint8 pad_5E[0x0E];
|
||||
uint8 pad_5E[2];
|
||||
uint8 track_spine_colour[4]; // 0x60
|
||||
uint8 track_rail_colour[4]; // 0x64
|
||||
uint8 track_support_colour[4]; // 0x68
|
||||
uint32 var_6C;
|
||||
uint8 pad_70[0x10];
|
||||
rct_object_entry vehicle_object; // 0x70
|
||||
uint8 space_required_x; // 0x80
|
||||
uint8 space_required_y; // 0x81
|
||||
uint8 pad_82[0x21];
|
||||
uint8 vehicle_additional_colour[32]; // 0x82
|
||||
uint8 var_A2;
|
||||
} rct_track_td6;
|
||||
|
||||
typedef struct{
|
||||
rct_track_td6 track_td6;
|
||||
uint8 preview[4][TRACK_PREVIEW_IMAGE_SIZE]; // 0xA3
|
||||
} rct_track_design;
|
||||
|
||||
|
||||
enum {
|
||||
TRACK_NONE = 0,
|
||||
|
||||
|
@ -133,7 +207,10 @@ enum {
|
|||
void track_load_list(ride_list_item item);
|
||||
int sub_67726A(const char *path);
|
||||
rct_track_design *track_get_info(int index, uint8** preview);
|
||||
rct_track_td6* load_track_design(const char *path);
|
||||
int track_rename(const char *text);
|
||||
int track_delete();
|
||||
void reset_track_list_cache();
|
||||
int sub_6D01B3(int bl, int x, int y, int z);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,280 @@
|
|||
/*****************************************************************************
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "track_data.h"
|
||||
|
||||
const rct_track_coordinates TrackCoordinates[256] = {
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 16, 0, 0 },
|
||||
{ 0, 0, 0, 64, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 32, 0, 0 },
|
||||
{ 0, 0, 0, 32, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 16, 0, 0, 0 },
|
||||
{ 0, 0, 64, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 32, 0, 0, 0 },
|
||||
{ 0, 0, 32, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 3, 0, 0, -64, -64 },
|
||||
{ 0, 1, 0, 0, -64, 64 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 3, 0, 0, -64, -64 },
|
||||
{ 0, 1, 0, 0, -64, 64 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 3, 0, 64, -64, -64 },
|
||||
{ 0, 1, 0, 64, -64, 64 },
|
||||
{ 0, 3, 64, 0, -64, -64 },
|
||||
{ 0, 1, 64, 0, -64, 64 },
|
||||
{ 0, 0, 0, 0, -64, -32 },
|
||||
{ 0, 0, 0, 0, -64, 32 },
|
||||
{ 0, 0, 0, 0, -32, -32 },
|
||||
{ 0, 0, 0, 0, -32, 32 },
|
||||
{ 0, 3, 0, 0, -32, -32 },
|
||||
{ 0, 1, 0, 0, -32, 32 },
|
||||
{ 0, 3, 0, 0, -32, -32 },
|
||||
{ 0, 1, 0, 0, -32, 32 },
|
||||
{ 0, 3, 0, 32, -32, -32 },
|
||||
{ 0, 1, 0, 32, -32, 32 },
|
||||
{ 0, 3, 32, 0, -32, -32 },
|
||||
{ 0, 1, 32, 0, -32, 32 },
|
||||
{ 0, 3, 0, 0, 0, 0 },
|
||||
{ 0, 1, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 16, -64, 0 },
|
||||
{ 0, 0, 0, 16, -64, 0 },
|
||||
{ 0, 0, 0, -16, -64, 0 },
|
||||
{ 0, 0, 0, -16, -64, 0 },
|
||||
{ 0, 2, 0, 152, -32, 0 },
|
||||
{ 0, 2, 0, -152, 32, 0 },
|
||||
{ 0, 3, 0, 80, -32, -32 },
|
||||
{ 0, 1, 0, 80, -32, 32 },
|
||||
{ 0, 3, 0, -80, -32, -32 },
|
||||
{ 0, 1, 0, -80, -32, 32 },
|
||||
{ 0, 0, 0, 24, 0, 0 },
|
||||
{ 0, 0, 0, 24, 0, 0 },
|
||||
{ 0, 0, 24, 0, 0, 0 },
|
||||
{ 0, 0, 24, 0, 0, 0 },
|
||||
{ 0, 0, 0, 96, 32, 0 },
|
||||
{ 0, 0, 0, 32, 32, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 16, 0, 0 },
|
||||
{ 0, 0, 0, 64, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 32, 0, 0 },
|
||||
{ 0, 0, 0, 32, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 16, 0, 0, 0 },
|
||||
{ 0, 0, 64, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 32, 0, 0, 0 },
|
||||
{ 0, 0, 32, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 3, 0, 0, -64, -64 },
|
||||
{ 0, 1, 0, 0, -64, 64 },
|
||||
{ 0, 0, 0, 0, -64, -32 },
|
||||
{ 0, 0, 0, 0, -64, 32 },
|
||||
{ 0, 3, 0, 0, -32, -32 },
|
||||
{ 0, 1, 0, 0, -32, 32 },
|
||||
{ 0, 2, 0, 16, 0, -96 },
|
||||
{ 0, 2, 0, 16, 0, 96 },
|
||||
{ 0, 2, 16, 0, 0, -96 },
|
||||
{ 0, 2, 16, 0, 0, 96 },
|
||||
{ 0, 2, 0, 16, 0, -160 },
|
||||
{ 0, 2, 0, 16, 0, 160 },
|
||||
{ 0, 2, 16, 0, 0, -160 },
|
||||
{ 0, 2, 16, 0, 0, 160 },
|
||||
{ 0, 3, 0, 64, 0, 0 },
|
||||
{ 0, 1, 0, 64, 0, 0 },
|
||||
{ 0, 3, 64, 0, 0, 0 },
|
||||
{ 0, 1, 64, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 3, 0, 16, -64, -64 },
|
||||
{ 0, 1, 0, 16, -64, 64 },
|
||||
{ 0, 3, 16, 0, -64, -64 },
|
||||
{ 0, 1, 16, 0, -64, 64 },
|
||||
{ 0, 3, 0, 16, -64, -64 },
|
||||
{ 0, 1, 0, 16, -64, 64 },
|
||||
{ 0, 3, 16, 0, -64, -64 },
|
||||
{ 0, 1, 16, 0, -64, 64 },
|
||||
{ 0, 0, 0, 16, 0, 0 },
|
||||
{ 0, 0, 0, 16, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 16, 0, 0, 0 },
|
||||
{ 0, 0, 16, 0, 0, 0 },
|
||||
{ 0, 0, 16, 16, -128, 0 },
|
||||
{ 0, 0, 0, 88, -96, 0 },
|
||||
{ 0, 0, 0, 88, -96, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 88, 0, -96, 0 },
|
||||
{ 0, 0, 88, 0, -96, 0 },
|
||||
{ 0, 0, 0, -96, -96, 0 },
|
||||
{ 0, 0, 0, 240, -160, 0 },
|
||||
{ 0, 0, 0, 80, 32, 0 },
|
||||
{ 0, 0, 0, 32, 32, 0 },
|
||||
{ 0, 0, 32, 0, 32, 0 },
|
||||
{ 0, 0, 0, 56, 32, 0 },
|
||||
{ 0, 0, 56, 0, 0, 0 },
|
||||
{ 0, 0, 0, 56, 0, 0 },
|
||||
{ 0, 0, 56, 0, 32, 0 },
|
||||
{ 0, 0, 24, 0, 0, 0 },
|
||||
{ 0, 7, 0, 0, -64, -32 },
|
||||
{ 0, 4, 0, 0, -64, 32 },
|
||||
{ 4, 0, 0, 0, -64, 32 },
|
||||
{ 4, 1, 0, 0, -32, 64 },
|
||||
{ 0, 7, 0, 0, -64, -32 },
|
||||
{ 0, 4, 0, 0, -64, 32 },
|
||||
{ 4, 0, 0, 0, -64, 32 },
|
||||
{ 4, 1, 0, 0, -32, 64 },
|
||||
{ 4, 4, 0, 0, -32, 32 },
|
||||
{ 4, 4, 0, 16, -32, 32 },
|
||||
{ 4, 4, 0, 64, -32, 32 },
|
||||
{ 4, 4, 0, 8, -32, 32 },
|
||||
{ 4, 4, 0, 32, -32, 32 },
|
||||
{ 4, 4, 0, 32, -32, 32 },
|
||||
{ 4, 4, 0, 8, -32, 32 },
|
||||
{ 4, 4, 16, 0, -32, 32 },
|
||||
{ 4, 4, 64, 0, -32, 32 },
|
||||
{ 4, 4, 8, 0, -32, 32 },
|
||||
{ 4, 4, 32, 0, -32, 32 },
|
||||
{ 4, 4, 32, 0, -32, 32 },
|
||||
{ 4, 4, 8, 0, -32, 32 },
|
||||
{ 4, 4, 0, 24, -32, 32 },
|
||||
{ 4, 4, 0, 24, -32, 32 },
|
||||
{ 4, 4, 24, 0, -32, 32 },
|
||||
{ 4, 4, 24, 0, -32, 32 },
|
||||
{ 4, 4, 0, 0, -32, 32 },
|
||||
{ 4, 4, 0, 0, -32, 32 },
|
||||
{ 4, 4, 0, 0, -32, 32 },
|
||||
{ 4, 4, 0, 0, -32, 32 },
|
||||
{ 4, 4, 0, 8, -32, 32 },
|
||||
{ 4, 4, 0, 8, -32, 32 },
|
||||
{ 4, 4, 0, 8, -32, 32 },
|
||||
{ 4, 4, 0, 8, -32, 32 },
|
||||
{ 4, 4, 8, 0, -32, 32 },
|
||||
{ 4, 4, 8, 0, -32, 32 },
|
||||
{ 4, 4, 8, 0, -32, 32 },
|
||||
{ 4, 4, 8, 0, -32, 32 },
|
||||
{ 4, 4, 0, 0, -32, 32 },
|
||||
{ 4, 4, 0, 0, -32, 32 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 32, -64, 0 },
|
||||
{ 0, 0, 0, 32, -64, 0 },
|
||||
{ 0, 0, 0, -32, -64, 0 },
|
||||
{ 0, 0, 0, -32, -64, 0 },
|
||||
{ 0, 3, 0, 24, -32, -32 },
|
||||
{ 0, 1, 0, 24, -32, 32 },
|
||||
{ 0, 3, 24, 0, -32, -32 },
|
||||
{ 0, 1, 24, 0, -32, 32 },
|
||||
{ 0, 0, 0, 16, 0, 0 },
|
||||
{ 0, 2, 0, 280, -64, -32 },
|
||||
{ 0, 2, 0, 280, -64, 32 },
|
||||
{ 0, 2, 0, -280, 64, -32 },
|
||||
{ 0, 2, 0, -280, 64, 32 },
|
||||
{ 0, 0, 0, -16, -64, 0 },
|
||||
{ 0, 0, 0, -16, -64, 0 },
|
||||
{ 0, 0, 0, 16, -64, 0 },
|
||||
{ 0, 0, 0, 16, -64, 0 },
|
||||
{ 0, 2, 0, 120, -32, 0 },
|
||||
{ 0, 2, 0, -120, 32, 0 },
|
||||
{ 0, 3, 0, 48, -32, -32 },
|
||||
{ 0, 1, 0, 48, -32, 32 },
|
||||
{ 0, 3, 0, -48, -32, -32 },
|
||||
{ 0, 1, 0, -48, -32, 32 },
|
||||
{ 0, 2, 0, 32, 0, 0 },
|
||||
{ 0, 2, 0, -32, 0, 0 },
|
||||
{ 0, 0, 0, 0, -160, 0 },
|
||||
{ 0, 0, 0, 0, -160, 0 },
|
||||
{ 0, 0, 0, 0, -32, 0 },
|
||||
{ 0, 0, 0, 0, -32, 0 },
|
||||
{ 0, 0, 0, 0, -32, 0 },
|
||||
{ 0, 1, 0, 0, -32, 32 },
|
||||
{ 0, 3, 0, 0, -32, -32 },
|
||||
{ 0, 2, 0, -96, -96, 0 },
|
||||
{ 0, 2, 0, 128, 64, 0 },
|
||||
{ 0, 2, 0, -128, -96, 0 },
|
||||
{ 0, 3, 0, 16, -32, -32 },
|
||||
{ 0, 1, 0, 16, -32, 32 },
|
||||
{ 0, 0, 0, 0, -64, 0 },
|
||||
{ 0, 0, 0, 0, -64, 0 },
|
||||
{ 0, 0, 0, 0, -32, 0 },
|
||||
{ 0, 0, 80, 0, 32, 0 },
|
||||
{ 0, 0, 240, 0, -160, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 3, 0, 32, -32, -32 },
|
||||
{ 0, 1, 0, 32, -32, 32 },
|
||||
{ 0, 3, 32, 0, -32, -32 },
|
||||
{ 0, 1, 32, 0, -32, 32 },
|
||||
{ 0, 3, 0, 64, -64, -64 },
|
||||
{ 0, 1, 0, 64, -64, 64 },
|
||||
{ 0, 3, 64, 0, -64, -64 },
|
||||
{ 0, 1, 64, 0, -64, 64 },
|
||||
{ 0, 0, 0, 16, 0, 0 },
|
||||
{ 0, 0, 0, 16, 0, 0 },
|
||||
{ 0, 0, 0, 16, 0, 0 },
|
||||
{ 0, 0, 0, 16, 0, 0 },
|
||||
{ 0, 0, 16, 0, 0, 0 },
|
||||
{ 0, 0, 16, 0, 0, 0 },
|
||||
{ 0, 0, 16, 0, 0, 0 },
|
||||
{ 0, 0, 16, 0, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 0, 8, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 0, 8, 0, 0, 0 },
|
||||
{ 0, 3, 0, 96, 0, 32 },
|
||||
{ 0, 1, 0, 96, 0, -32 },
|
||||
{ 0, 3, 96, 0, 0, 32 },
|
||||
{ 0, 1, 96, 0, 0, -32 },
|
||||
{ 0, 2, 0, 96, 64, 0 },
|
||||
{ 0, 2, 0, -128, -96, 0 },
|
||||
{ 0, 2, 0, 128, 64, 0 }
|
||||
};
|
|
@ -17,31 +17,17 @@
|
|||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
#include "../common.h"
|
||||
|
||||
#ifndef _TOOLBAR_H_
|
||||
#define _TOOLBAR_H_
|
||||
/* size 0x0A */
|
||||
typedef struct{
|
||||
sint8 rotation_negative; // 0x00
|
||||
sint8 rotation_positive; // 0x01
|
||||
sint16 z_negative; // 0x02
|
||||
sint16 z_positive; // 0x04
|
||||
sint16 x; // 0x06
|
||||
sint16 y; // 0x08
|
||||
}rct_track_coordinates;
|
||||
|
||||
#include "interface/window.h"
|
||||
#include "interface/widget.h"
|
||||
|
||||
typedef enum {
|
||||
DDIDX_UNDERGROUND_INSIDE = 0,
|
||||
DDIDX_HIDE_BASE = 1,
|
||||
DDIDX_HIDE_VERTICAL = 2,
|
||||
DDIDX_SEETHROUGH_RIDES = 4,
|
||||
DDIDX_SEETHROUGH_SCENARY = 5,
|
||||
DDIDX_INVISIBLE_SUPPORTS = 6,
|
||||
DDIDX_INVISIBLE_PEEPS = 7,
|
||||
DDIDX_LAND_HEIGHTS = 9,
|
||||
DDIDX_TRACK_HEIGHTS = 10,
|
||||
DDIDX_PATH_HEIGHTS = 11,
|
||||
} TOP_TOOLBAR_VIEW_MENU_DDIDX;
|
||||
|
||||
void top_toolbar_init_view_menu(rct_window* window, rct_widget* widget);
|
||||
void top_toolbar_view_menu_dropdown(short dropdownIndex);
|
||||
|
||||
void toggle_footpath_window();
|
||||
void toggle_land_window(rct_window* topToolbar, int widgetIndex);
|
||||
void toggle_clear_scenery_window(rct_window* topToolbar, int widgetIndex);
|
||||
void toggle_water_window(rct_window* topToolbar, int widgetIndex);
|
||||
#endif
|
||||
// 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3
|
||||
extern const rct_track_coordinates TrackCoordinates[256];
|
132
src/scenario.c
132
src/scenario.c
|
@ -39,6 +39,8 @@
|
|||
#include "world/park.h"
|
||||
#include "world/sprite.h"
|
||||
|
||||
static int scenario_create_ducks();
|
||||
|
||||
/**
|
||||
* Loads only the basic information from a scenario.
|
||||
* rct2: 0x006761D6
|
||||
|
@ -271,13 +273,13 @@ int scenario_load_and_play_from_path(const char *path)
|
|||
|
||||
// Set park name
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_RENAME_PARK;
|
||||
game_do_command(1, 1, 0, *((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 0)), GAME_COMMAND_33,
|
||||
game_do_command(1, 1, 0, *((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 0)), GAME_COMMAND_SET_PARK_NAME,
|
||||
*((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 8)),
|
||||
*((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 4)));
|
||||
game_do_command(2, 1, 0, *((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 12)), GAME_COMMAND_33,
|
||||
game_do_command(2, 1, 0, *((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 12)), GAME_COMMAND_SET_PARK_NAME,
|
||||
*((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 20)),
|
||||
*((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 16)));
|
||||
game_do_command(0, 1, 0, *((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 24)), GAME_COMMAND_33,
|
||||
game_do_command(0, 1, 0, *((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 24)), GAME_COMMAND_SET_PARK_NAME,
|
||||
*((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 32)),
|
||||
*((int*)(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER + 28)));
|
||||
|
||||
|
@ -327,12 +329,11 @@ int scenario_load_and_play_from_path(const char *path)
|
|||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_18;
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x006837E3); // (palette related)
|
||||
load_palette();
|
||||
|
||||
gfx_invalidate_screen();
|
||||
RCT2_GLOBAL(0x009DEA66, uint16) = 0;
|
||||
RCT2_GLOBAL(0x009DEA5C, uint16) = 62000; // (doesn't appear to ever be read)
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -596,21 +597,24 @@ void scenario_update()
|
|||
|
||||
if ((current_days_in_month * next_month_tick) >> 16 != (current_days_in_month * month_tick) >> 16) {
|
||||
// daily checks
|
||||
finance_update_daily_profit(); // daily profit update
|
||||
finance_update_daily_profit();
|
||||
RCT2_CALLPROC_EBPSAFE(0x0069C35E); // some kind of peeps days_visited update loop
|
||||
get_local_time();
|
||||
RCT2_CALLPROC_EBPSAFE(0x0066A13C); // objective 6 dragging
|
||||
if (objective_type == 10 || objective_type == 9 || objective_type == 8 ||
|
||||
objective_type == 6 || objective_type == 5) {
|
||||
RCT2_CALLPROC_EBPSAFE(0x0066A13C); // objective 6 dragging
|
||||
switch (objective_type) {
|
||||
case OBJECTIVE_REPLAY_LOAN_AND_PARK_VALUE:
|
||||
case OBJECTIVE_FINISH_5_ROLLERCOASTERS:
|
||||
case OBJECTIVE_10_ROLLERCOASTERS_LENGTH:
|
||||
case OBJECTIVE_GUESTS_AND_RATING:
|
||||
case OBJECTIVE_10_ROLLERCOASTERS:
|
||||
scenario_objectives_check();
|
||||
break;
|
||||
}
|
||||
|
||||
window_invalidate_by_class(WC_BOTTOM_TOOLBAR);
|
||||
}
|
||||
|
||||
|
||||
//if ( (unsigned int)((4 * current_day) & 0xFFFF) >= 0xFFEFu) {
|
||||
if ( next_month_tick % 0x4000 == 0) {
|
||||
if (next_month_tick % 0x4000 == 0) {
|
||||
// weekly checks
|
||||
finance_pay_wages();
|
||||
finance_pay_research();
|
||||
|
@ -621,18 +625,9 @@ void scenario_update()
|
|||
ride_update_favourited_stat();
|
||||
|
||||
if (month <= 1 && RCT2_GLOBAL(0x009ADAE0, sint32) != -1 && RCT2_GLOBAL(0x009ADAE0 + 14, uint16) & 1) {
|
||||
for (int i = 0; i < 100; ++i) {
|
||||
int carry;
|
||||
RCT2_CALLPROC_EBPSAFE(0x006744A9); // clears carry flag on failure -.-
|
||||
#ifdef _MSC_VER
|
||||
__asm mov carry, 0;
|
||||
__asm adc carry, 0;
|
||||
#else
|
||||
__asm__ ( "mov %[carry], 0; " : [carry] "+m" (carry) );
|
||||
__asm__ ( "adc %[carry], 0; " : [carry] "+m" (carry) );
|
||||
#endif
|
||||
|
||||
if (!carry)
|
||||
// 100 attempts at finding some water to create a few ducks at
|
||||
for (int i = 0; i < 100; i++) {
|
||||
if (scenario_create_ducks())
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -640,7 +635,6 @@ void scenario_update()
|
|||
park_calculate_size();
|
||||
}
|
||||
|
||||
//if ( (unsigned int)((2 * current_day) & 0xFFFF) >= 0xFFF8) {
|
||||
if (next_month_tick % 0x8000 == 0) {
|
||||
// fortnightly
|
||||
finance_pay_ride_upkeep();
|
||||
|
@ -656,13 +650,67 @@ void scenario_update()
|
|||
scenario_entrance_fee_too_high_check();
|
||||
award_update_all();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006E37D2
|
||||
*/
|
||||
*
|
||||
* rct2: 0x006744A9
|
||||
*/
|
||||
static int scenario_create_ducks()
|
||||
{
|
||||
int i, j, r, c, x, y, waterZ, centreWaterZ, x2, y2;
|
||||
|
||||
r = scenario_rand();
|
||||
x = ((r >> 16) & 0xFFFF) & 0x7F;
|
||||
y = (r & 0xFFFF) & 0x7F;
|
||||
x = (x + 64) * 32;
|
||||
y = (y + 64) * 32;
|
||||
|
||||
if (!map_is_location_in_park(x, y))
|
||||
return 0;
|
||||
|
||||
centreWaterZ = (map_element_height(x, y) >> 16) & 0xFFFF;
|
||||
if (centreWaterZ == 0)
|
||||
return 0;
|
||||
|
||||
// Check 7x7 area around centre tile
|
||||
x2 = x - (32 * 3);
|
||||
y2 = y - (32 * 3);
|
||||
c = 0;
|
||||
for (i = 0; i < 7; i++) {
|
||||
for (j = 0; j < 7; j++) {
|
||||
waterZ = (map_element_height(x2, y2) >> 16) & 0xFFFF;
|
||||
if (waterZ == centreWaterZ)
|
||||
c++;
|
||||
|
||||
x2 += 32;
|
||||
}
|
||||
x2 -= 224;
|
||||
y2 += 32;
|
||||
}
|
||||
|
||||
// Must be at least 25 water tiles of the same height in 7x7 area
|
||||
if (c < 25)
|
||||
return 0;
|
||||
|
||||
// Set x, y to the centre of the tile
|
||||
x += 16;
|
||||
y += 16;
|
||||
c = (scenario_rand() & 3) + 2;
|
||||
for (i = 0; i < c; i++) {
|
||||
r = scenario_rand();
|
||||
x2 = (r >> 16) & 0x7F;
|
||||
y2 = (r & 0xFFFF) & 0x7F;
|
||||
create_duck(x + x2 - 64, y + y2 - 64);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006E37D2
|
||||
*/
|
||||
unsigned int scenario_rand()
|
||||
{
|
||||
int eax = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32);
|
||||
|
@ -676,26 +724,22 @@ unsigned int scenario_rand()
|
|||
*/
|
||||
void scenario_prepare_rides_for_save()
|
||||
{
|
||||
int i, x, y;
|
||||
rct_map_element *mapElement;
|
||||
int i;
|
||||
rct_ride *ride;
|
||||
map_element_iterator it;
|
||||
|
||||
int isFiveCoasterObjective = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_FINISH_5_ROLLERCOASTERS;
|
||||
|
||||
// Set all existing track to be indestructible
|
||||
for (y = 0; y < 256; y++) {
|
||||
for (x = 0; x < 256; x++) {
|
||||
mapElement = TILE_MAP_ELEMENT_POINTER(y * 256 + x);
|
||||
do {
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_TRACK) {
|
||||
if (isFiveCoasterObjective)
|
||||
mapElement->flags |= 0x40;
|
||||
else
|
||||
mapElement->flags &= ~0x40;
|
||||
}
|
||||
} while (!((mapElement++)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
map_element_iterator_begin(&it);
|
||||
do {
|
||||
if (map_element_get_type(it.element) == MAP_ELEMENT_TYPE_TRACK) {
|
||||
if (isFiveCoasterObjective)
|
||||
it.element->flags |= 0x40;
|
||||
else
|
||||
it.element->flags &= ~0x40;
|
||||
}
|
||||
}
|
||||
} while (map_element_iterator_next(&it));
|
||||
|
||||
// Set all existing rides to have indestructible track
|
||||
FOR_ALL_RIDES(i, ride) {
|
||||
|
@ -725,7 +769,7 @@ int scenario_prepare_for_save()
|
|||
}
|
||||
|
||||
if (s6Info->name[0] == 0)
|
||||
format_string(s6Info->name, RCT2_GLOBAL(0x013573D4, rct_string_id), (void*)0x013573D8);
|
||||
format_string(s6Info->name, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), (void*)RCT2_ADDRESS_PARK_NAME_ARGS);
|
||||
|
||||
s6Info->objective_type = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8);
|
||||
s6Info->objective_arg_1 = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_YEAR, uint8);
|
||||
|
|
|
@ -143,14 +143,24 @@ static void scenario_list_sort()
|
|||
}
|
||||
|
||||
/**
|
||||
* Basic scenario information compare function for sorting.
|
||||
* rct2: 0x00677C08
|
||||
*/
|
||||
* Basic scenario information compare function for sorting.
|
||||
* rct2: 0x00677C08
|
||||
*/
|
||||
static int scenario_list_sort_compare(const void *a, const void *b)
|
||||
{
|
||||
return strcmp(((rct_scenario_basic*)a)->name, ((rct_scenario_basic*)b)->name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the path for the scenario scores path.
|
||||
*/
|
||||
static void scenario_scores_get_path(char *outPath)
|
||||
{
|
||||
char *homePath = platform_get_orct2_homefolder();
|
||||
sprintf(outPath, "%s%c%s", homePath, platform_get_path_separator(), "scores.dat");
|
||||
free(homePath);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006775A8
|
||||
|
@ -158,6 +168,9 @@ static int scenario_list_sort_compare(const void *a, const void *b)
|
|||
static int scenario_scores_load()
|
||||
{
|
||||
FILE *file;
|
||||
char scoresPath[MAX_PATH];
|
||||
|
||||
scenario_scores_get_path(scoresPath);
|
||||
|
||||
// Free scenario list if already allocated
|
||||
if (gScenarioList != NULL) {
|
||||
|
@ -166,10 +179,15 @@ static int scenario_scores_load()
|
|||
}
|
||||
|
||||
// Try and load the scores file
|
||||
file = fopen(get_file_path(PATH_ID_SCORES), "rb");
|
||||
|
||||
// First check user folder and then fallback to install directory
|
||||
file = fopen(scoresPath, "rb");
|
||||
if (file == NULL) {
|
||||
RCT2_ERROR("Unable to load scenario scores.");
|
||||
return 0;
|
||||
file = fopen(get_file_path(PATH_ID_SCORES), "rb");
|
||||
if (file == NULL) {
|
||||
RCT2_ERROR("Unable to load scenario scores.");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Load header
|
||||
|
@ -206,8 +224,11 @@ static int scenario_scores_load()
|
|||
int scenario_scores_save()
|
||||
{
|
||||
FILE *file;
|
||||
|
||||
file = fopen(get_file_path(PATH_ID_SCORES), "wb");
|
||||
char scoresPath[MAX_PATH];
|
||||
|
||||
scenario_scores_get_path(scoresPath);
|
||||
|
||||
file = fopen(scoresPath, "wb");
|
||||
if (file == NULL) {
|
||||
RCT2_ERROR("Unable to save scenario scores.");
|
||||
return 0;
|
||||
|
|
18
src/title.c
18
src/title.c
|
@ -90,7 +90,9 @@ static void title_create_windows();
|
|||
*/
|
||||
void title_load()
|
||||
{
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint8) & 1)
|
||||
log_verbose("loading title");
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) & 1)
|
||||
RCT2_CALLPROC_X(0x00667C15, 0, 1, 0, 0, 0, 0, 0);//Game pause toggle
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_TITLE_DEMO;
|
||||
|
@ -101,7 +103,7 @@ void title_load()
|
|||
ride_init_all();
|
||||
window_guest_list_init_vars_a();
|
||||
sub_6BD3A4(); // RCT2_CALLPROC_EBPSAFE(0x006BD3A4);
|
||||
map_init();
|
||||
map_init(150);
|
||||
park_init();
|
||||
date_reset();
|
||||
climate_reset(CLIMATE_COOL_AND_WET);
|
||||
|
@ -117,6 +119,8 @@ void title_load()
|
|||
title_init_showcase();
|
||||
gfx_invalidate_screen();
|
||||
RCT2_GLOBAL(0x009DEA66, uint16) = 0;
|
||||
|
||||
log_verbose("loading title finished");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -167,9 +171,11 @@ static void title_update_showcase()
|
|||
_scriptWaitCounter = (*_currentScript++) * 32;
|
||||
break;
|
||||
case TITLE_SCRIPT_LOAD:
|
||||
if (!scenario_load(get_file_path(PATH_ID_SIXFLAGS_MAGICMOUNTAIN))) {
|
||||
log_fatal("OpenRCT2 can not currently cope when unable to load title screen scenario.");
|
||||
exit(-1);
|
||||
if (scenario_load(get_file_path(PATH_ID_SIXFLAGS_MAGICMOUNTAIN))) {
|
||||
log_verbose("loaded title scenario");
|
||||
} else {
|
||||
load_palette();
|
||||
title_create_windows();
|
||||
}
|
||||
|
||||
w = window_get_main();
|
||||
|
@ -264,7 +270,7 @@ void title_update()
|
|||
screenshot_check();
|
||||
title_handle_keyboard_input();
|
||||
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint8) == 0) {
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) {
|
||||
title_update_showcase();
|
||||
game_logic_update();
|
||||
start_title_music();//title_play_music();
|
||||
|
|
200
src/toolbar.c
200
src/toolbar.c
|
@ -1,200 +0,0 @@
|
|||
/*****************************************************************************
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "rct2.h"
|
||||
#include "addresses.h"
|
||||
#include "input.h"
|
||||
#include "toolbar.h"
|
||||
#include "localisation/string_ids.h"
|
||||
#include "interface/viewport.h"
|
||||
#include "interface/window.h"
|
||||
#include "windows/dropdown.h"
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066CDE4
|
||||
*/
|
||||
void top_toolbar_init_view_menu(rct_window* w, rct_widget* widget) {
|
||||
gDropdownItemsFormat[0] = 1156;
|
||||
gDropdownItemsFormat[1] = 1156;
|
||||
gDropdownItemsFormat[2] = 1156;
|
||||
gDropdownItemsFormat[3] = 0;
|
||||
gDropdownItemsFormat[4] = 1156;
|
||||
gDropdownItemsFormat[5] = 1156;
|
||||
gDropdownItemsFormat[6] = 1156;
|
||||
gDropdownItemsFormat[7] = 1156;
|
||||
gDropdownItemsFormat[8] = 0;
|
||||
gDropdownItemsFormat[9] = 1156;
|
||||
gDropdownItemsFormat[10] = 1156;
|
||||
gDropdownItemsFormat[11] = 1156;
|
||||
|
||||
gDropdownItemsArgs[0] = STR_UNDERGROUND_VIEW;
|
||||
gDropdownItemsArgs[1] = STR_REMOVE_BASE_LAND;
|
||||
gDropdownItemsArgs[2] = STR_REMOVE_VERTICAL_FACES;
|
||||
gDropdownItemsArgs[4] = STR_SEE_THROUGH_RIDES;
|
||||
gDropdownItemsArgs[5] = STR_SEE_THROUGH_SCENERY;
|
||||
gDropdownItemsArgs[6] = STR_INVISIBLE_SUPPORTS;
|
||||
gDropdownItemsArgs[7] = STR_INVISIBLE_PEOPLE;
|
||||
gDropdownItemsArgs[9] = STR_HEIGHT_MARKS_ON_LAND;
|
||||
gDropdownItemsArgs[10] = STR_HEIGHT_MARKS_ON_RIDE_TRACKS;
|
||||
gDropdownItemsArgs[11] = STR_HEIGHT_MARKS_ON_PATHS;
|
||||
|
||||
window_dropdown_show_text(
|
||||
w->x + widget->left,
|
||||
w->y + widget->top,
|
||||
widget->bottom - widget->top + 1,
|
||||
w->colours[1] | 0x80,
|
||||
0,
|
||||
12
|
||||
);
|
||||
|
||||
// Set checkmarks
|
||||
rct_viewport* mainViewport = window_get_main()->viewport;
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE)
|
||||
gDropdownItemsChecked |= (1 << 0);
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_HIDE_BASE)
|
||||
gDropdownItemsChecked |= (1 << 1);
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_HIDE_VERTICAL)
|
||||
gDropdownItemsChecked |= (1 << 2);
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_RIDES)
|
||||
gDropdownItemsChecked |= (1 << 4);
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_SCENERY)
|
||||
gDropdownItemsChecked |= (1 << 5);
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
|
||||
gDropdownItemsChecked |= (1 << 6);
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_PEEPS)
|
||||
gDropdownItemsChecked |= (1 << 7);
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_LAND_HEIGHTS)
|
||||
gDropdownItemsChecked |= (1 << 9);
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_TRACK_HEIGHTS)
|
||||
gDropdownItemsChecked |= (1 << 10);
|
||||
if (mainViewport->flags & VIEWPORT_FLAG_PATH_HEIGHTS)
|
||||
gDropdownItemsChecked |= (1 << 11);
|
||||
|
||||
RCT2_GLOBAL(0x9DEBA2, uint16) = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066CF8A
|
||||
*/
|
||||
void top_toolbar_view_menu_dropdown(short dropdownIndex) {
|
||||
if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16);
|
||||
rct_window* w = window_get_main();
|
||||
if (w) {
|
||||
switch (dropdownIndex) {
|
||||
case DDIDX_UNDERGROUND_INSIDE:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_UNDERGROUND_INSIDE;
|
||||
break;
|
||||
case DDIDX_HIDE_BASE:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_HIDE_BASE;
|
||||
break;
|
||||
case DDIDX_HIDE_VERTICAL:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_HIDE_VERTICAL;
|
||||
break;
|
||||
case DDIDX_SEETHROUGH_RIDES:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_RIDES;
|
||||
break;
|
||||
case DDIDX_SEETHROUGH_SCENARY:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_SCENERY;
|
||||
break;
|
||||
case DDIDX_INVISIBLE_SUPPORTS:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_SUPPORTS;
|
||||
break;
|
||||
case DDIDX_INVISIBLE_PEEPS:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_PEEPS;
|
||||
break;
|
||||
case DDIDX_LAND_HEIGHTS:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_LAND_HEIGHTS;
|
||||
break;
|
||||
case DDIDX_TRACK_HEIGHTS:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_TRACK_HEIGHTS;
|
||||
break;
|
||||
case DDIDX_PATH_HEIGHTS:
|
||||
w->viewport->flags ^= VIEWPORT_FLAG_PATH_HEIGHTS;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
window_invalidate(w);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066CCE7
|
||||
*/
|
||||
void toggle_footpath_window() {
|
||||
if (window_find_by_class(WC_FOOTPATH) == NULL) {
|
||||
window_footpath_open();
|
||||
} else {
|
||||
tool_cancel();
|
||||
window_close_by_class(WC_FOOTPATH);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* rct2: 0x0066CD54
|
||||
*/
|
||||
void toggle_land_window(rct_window* topToolbar, int widgetIndex) {
|
||||
if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == 1 && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) == 7) {
|
||||
tool_cancel();
|
||||
} else {
|
||||
show_gridlines();
|
||||
tool_set(topToolbar, widgetIndex, 18);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 1;
|
||||
window_land_open();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* rct2: 0x0066CD0C
|
||||
*/
|
||||
void toggle_clear_scenery_window(rct_window* topToolbar, int widgetIndex) {
|
||||
if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == 1 && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) == 16) {
|
||||
tool_cancel();
|
||||
} else {
|
||||
show_gridlines();
|
||||
tool_set(topToolbar, widgetIndex, 12);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 2;
|
||||
window_clear_scenery_open();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* rct2: 0x0066CD9C
|
||||
*/
|
||||
void toggle_water_window(rct_window* topToolbar, int widgetIndex) {
|
||||
if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == 1 && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) == 8) {
|
||||
tool_cancel();
|
||||
} else {
|
||||
show_gridlines();
|
||||
tool_set(topToolbar, widgetIndex, 19);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 1;
|
||||
window_water_open();
|
||||
}
|
||||
}
|
|
@ -412,3 +412,28 @@ static void encode_chunk_rotate(char *buffer, int length)
|
|||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
int sawyercoding_detect_file_type(char *src, int length)
|
||||
{
|
||||
int i;
|
||||
|
||||
// Currently can't detect TD4, as the checksum is the same as SC4 (need alternative method)
|
||||
|
||||
uint32 checksum = *((uint32*)&src[length - 4]);
|
||||
uint32 actualChecksum = 0;
|
||||
for (i = 0; i < length - 4; i++) {
|
||||
actualChecksum = (actualChecksum & 0xFFFFFF00) | (((actualChecksum & 0xFF) + (uint8)src[i]) & 0xFF);
|
||||
actualChecksum = rol32(actualChecksum, 3);
|
||||
}
|
||||
|
||||
switch (checksum - actualChecksum) {
|
||||
case +108156: return FILE_VERSION_RCT1 | FILE_TYPE_SV4;
|
||||
case -108156: return FILE_VERSION_RCT1 | FILE_TYPE_SC4;
|
||||
case +110001: return FILE_VERSION_RCT1_AA | FILE_TYPE_SV4;
|
||||
case -110001: return FILE_VERSION_RCT1_AA | FILE_TYPE_SC4;
|
||||
case +120001: return FILE_VERSION_RCT1_LL | FILE_TYPE_SV4;
|
||||
case -120001: return FILE_VERSION_RCT1_LL | FILE_TYPE_SC4;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
|
@ -35,6 +35,18 @@ enum {
|
|||
CHUNK_ENCODING_ROTATE
|
||||
};
|
||||
|
||||
enum {
|
||||
FILE_VERSION_MASK = (3 << 0),
|
||||
FILE_VERSION_RCT1 = (0 << 0),
|
||||
FILE_VERSION_RCT1_AA = (1 << 0),
|
||||
FILE_VERSION_RCT1_LL = (2 << 0),
|
||||
|
||||
FILE_TYPE_MASK = (3 << 2),
|
||||
FILE_TYPE_TD4 = (0 << 2),
|
||||
FILE_TYPE_SV4 = (1 << 2),
|
||||
FILE_TYPE_SC4 = (2 << 2)
|
||||
};
|
||||
|
||||
int sawyercoding_validate_checksum(FILE *file);
|
||||
uint32 sawyercoding_calculate_checksum(uint8* buffer, uint32 length);
|
||||
int sawyercoding_read_chunk(FILE *file, uint8 *buffer);
|
||||
|
@ -44,4 +56,6 @@ int sawyercoding_decode_sc4(char *src, char *dst, int length);
|
|||
int sawyercoding_encode_sv4(char *src, char *dst, int length);
|
||||
int sawyercoding_decode_td6(char *src, char *dst, int length);
|
||||
|
||||
int sawyercoding_detect_file_type(char *src, int length);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -75,4 +75,14 @@ int bitscanforward(int source)
|
|||
return i;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* case insensitve compare */
|
||||
int strcicmp(char const *a, char const *b)
|
||||
{
|
||||
for (;; a++, b++) {
|
||||
int d = tolower(*a) - tolower(*b);
|
||||
if (d != 0 || !*a)
|
||||
return d;
|
||||
}
|
||||
}
|
|
@ -31,5 +31,6 @@ void path_set_extension(char *path, const char *extension);
|
|||
long fsize(FILE *fp);
|
||||
|
||||
int bitscanforward(int source);
|
||||
int strcicmp(char const *a, char const *b);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -136,13 +136,15 @@ void window_banner_open(rct_windownumber number)
|
|||
|
||||
int view_x = gBanners[w->number].x << 5;
|
||||
int view_y = gBanners[w->number].y << 5;
|
||||
int ebp = ((view_y << 8) | view_x) >> 5;
|
||||
|
||||
rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(ebp);
|
||||
|
||||
while(1){
|
||||
if (((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_BANNER) &&
|
||||
(map_element->properties.banner.index == w->number)) break;
|
||||
rct_map_element* map_element = map_get_first_element_at(view_x / 32, view_y / 32);
|
||||
while(1) {
|
||||
if (
|
||||
(map_element_get_type(map_element) == MAP_ELEMENT_TYPE_BANNER) &&
|
||||
(map_element->properties.banner.index == w->number)
|
||||
) {
|
||||
break;
|
||||
}
|
||||
|
||||
map_element++;
|
||||
}
|
||||
|
@ -186,10 +188,10 @@ static void window_banner_mouseup()
|
|||
int x = banner->x << 5;
|
||||
int y = banner->y << 5;
|
||||
|
||||
rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(((y << 8) | x) >> 5);
|
||||
rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32);
|
||||
|
||||
while (1){
|
||||
if (((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_BANNER) &&
|
||||
if ((map_element_get_type(map_element) == MAP_ELEMENT_TYPE_BANNER) &&
|
||||
(map_element->properties.banner.index == w->number)) break;
|
||||
map_element++;
|
||||
}
|
||||
|
@ -285,17 +287,13 @@ static void window_banner_dropdown()
|
|||
|
||||
text_buffer[0] = banner->text_colour + FORMAT_COLOUR_CODE_START;
|
||||
|
||||
int string_id = 0, ebx = 0, ecx = 128, edx = 0, ebp = 0, esi = 0;
|
||||
// Allocate text_buffer to a new string_id?
|
||||
RCT2_CALLFUNC_X(0x6C421D, &string_id, &ebx, &ecx, &edx, &esi, (int*)&text_buffer, &ebp);
|
||||
|
||||
if (string_id){
|
||||
rct_string_id stringId = user_string_allocate(128, text_buffer);
|
||||
if (stringId != 0) {
|
||||
rct_string_id prev_string_id = banner->string_idx;
|
||||
banner->string_idx = string_id;
|
||||
banner->string_idx = stringId;
|
||||
user_string_free(prev_string_id);
|
||||
window_invalidate(w);
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
window_error_open(2984, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id));
|
||||
}
|
||||
break;
|
||||
|
@ -322,16 +320,13 @@ static void window_banner_textinput()
|
|||
text_buffer[0] = banner->text_colour + FORMAT_COLOUR_CODE_START;
|
||||
strncpy(text_buffer + 1, text, 32);
|
||||
|
||||
int string_id = 0, ebx = 0, ecx = 128, edx = 0, ebp = 0, esi = 0;
|
||||
RCT2_CALLFUNC_X(0x6C421D, &string_id, &ebx, &ecx, &edx, &esi, (int*)&text_buffer, &ebp);
|
||||
|
||||
if (string_id){
|
||||
rct_string_id stringId = user_string_allocate(128, text_buffer);
|
||||
if (stringId) {
|
||||
rct_string_id prev_string_id = banner->string_idx;
|
||||
banner->string_idx = string_id;
|
||||
banner->string_idx = stringId;
|
||||
user_string_free(prev_string_id);
|
||||
window_invalidate(w);
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
window_error_open(2984, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "../interface/widget.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../world/park.h"
|
||||
#include "../peep/peep.h"
|
||||
#include "../ride/ride.h"
|
||||
#include "../scenario.h"
|
||||
|
@ -288,42 +289,32 @@ static void cheat_set_grass_length(int length)
|
|||
|
||||
static void cheat_water_plants()
|
||||
{
|
||||
int x, y;
|
||||
rct_map_element *mapElement;
|
||||
map_element_iterator it;
|
||||
|
||||
for (y = 0; y < 256; y++) {
|
||||
for (x = 0; x < 256; x++) {
|
||||
mapElement = TILE_MAP_ELEMENT_POINTER(y * 256 + x);
|
||||
do {
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_SCENERY) {
|
||||
mapElement->properties.scenery.age = 0;
|
||||
}
|
||||
} while (!((mapElement++)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
map_element_iterator_begin(&it);
|
||||
do {
|
||||
if (map_element_get_type(it.element) == MAP_ELEMENT_TYPE_SCENERY) {
|
||||
it.element->properties.scenery.age = 0;
|
||||
}
|
||||
}
|
||||
} while (map_element_iterator_next(&it));
|
||||
|
||||
gfx_invalidate_screen();
|
||||
}
|
||||
|
||||
static void cheat_fix_vandalism()
|
||||
{
|
||||
int x, y;
|
||||
rct_map_element *mapElement;
|
||||
map_element_iterator it;
|
||||
|
||||
for (y = 0; y < 256; y++) {
|
||||
for (x = 0; x < 256; x++) {
|
||||
mapElement = TILE_MAP_ELEMENT_POINTER(y * 256 + x);
|
||||
do {
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) != MAP_ELEMENT_TYPE_PATH)
|
||||
continue;
|
||||
map_element_iterator_begin(&it);
|
||||
do {
|
||||
if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_PATH)
|
||||
continue;
|
||||
|
||||
if ((mapElement->properties.path.additions & 0x0F) == 0)
|
||||
continue;
|
||||
if ((it.element->properties.path.additions & 0x0F) == 0)
|
||||
continue;
|
||||
|
||||
mapElement->flags &= ~MAP_ELEMENT_FLAG_BROKEN;
|
||||
} while (!((mapElement++)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
}
|
||||
}
|
||||
it.element->flags &= ~MAP_ELEMENT_FLAG_BROKEN;
|
||||
} while (map_element_iterator_next(&it));
|
||||
|
||||
gfx_invalidate_screen();
|
||||
}
|
||||
|
@ -488,8 +479,7 @@ static void window_cheats_misc_mouseup()
|
|||
w->widgets[widgetIndex].image = w->widgets[widgetIndex].image == 2767 ? 2768 : 2767;
|
||||
break;
|
||||
case WIDX_OPEN_CLOSE_PARK:
|
||||
game_do_command(0, 1, 0, park_is_open() ? 0 : 0x101, GAME_COMMAND_SET_PARK_OPEN, 0, 0);
|
||||
window_invalidate_by_class(WC_PARK_INFORMATION);
|
||||
park_set_open(park_is_open() ? 0 : 1);
|
||||
break;
|
||||
case WIDX_DECREASE_GAME_SPEED:
|
||||
game_reduce_game_speed();
|
||||
|
@ -685,20 +675,15 @@ void window_cheats_misc_tool_down(){
|
|||
// in the middle of a tile.
|
||||
dest_x += 16;
|
||||
dest_y += 16;
|
||||
|
||||
// Set the tile coordinate to top left of tile
|
||||
int tile_y = dest_y & 0xFFE0;
|
||||
int tile_x = dest_x & 0xFFE0;
|
||||
int tile_x = (dest_x & 0xFFE0) >> 5;
|
||||
int tile_y = (dest_y & 0xFFE0) >> 5;
|
||||
|
||||
ebp = ((tile_y << 8) | tile_x) >> 5;
|
||||
|
||||
rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(ebp);
|
||||
|
||||
while (1){
|
||||
if ((map_element->type & MAP_ELEMENT_TYPE_MASK) != MAP_ELEMENT_TYPE_SURFACE){
|
||||
map_element->clearance_height = 0;
|
||||
rct_map_element *mapElement = map_get_first_element_at(tile_x, tile_y);
|
||||
do {
|
||||
if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SURFACE) {
|
||||
mapElement->clearance_height = 0;
|
||||
}
|
||||
if (map_element->flags & MAP_ELEMENT_FLAG_LAST_TILE)
|
||||
break;
|
||||
map_element++;
|
||||
}
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
}
|
|
@ -150,6 +150,14 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo
|
|||
// Set the widgets
|
||||
gDropdownNumItems = num_items;
|
||||
_dropdown_num_rows = num_items;
|
||||
|
||||
width = _dropdown_item_width * _dropdown_num_columns + 3;
|
||||
int height = _dropdown_item_height * _dropdown_num_rows + 3;
|
||||
if (x + width > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16))
|
||||
x = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - width);
|
||||
if (y + height > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16))
|
||||
y = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - height);
|
||||
|
||||
window_dropdown_widgets[WIDX_BACKGROUND].bottom = _dropdown_item_height * num_items + 3;
|
||||
window_dropdown_widgets[WIDX_BACKGROUND].right = _dropdown_item_width + 3;
|
||||
|
||||
|
|
|
@ -28,12 +28,12 @@
|
|||
#include "../interface/viewport.h"
|
||||
#include "../interface/widget.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../platform/platform.h"
|
||||
#include "../title.h"
|
||||
#include "../util/util.h"
|
||||
#include "error.h"
|
||||
|
||||
enum WINDOW_EDITOR_TOP_TOOLBAR_WIDGET_IDX {
|
||||
enum {
|
||||
WIDX_PREVIOUS_IMAGE, // 1
|
||||
WIDX_PREVIOUS_STEP_BUTTON, // 2
|
||||
WIDX_NEXT_IMAGE, // 4
|
||||
|
@ -166,8 +166,8 @@ void window_editor_bottom_toolbar_jump_back_to_object_selection() {
|
|||
*/
|
||||
void window_editor_bottom_toolbar_jump_back_to_landscape_editor() {
|
||||
window_close_all();
|
||||
RCT2_CALLPROC(0x006DFED0);
|
||||
RCT2_CALLPROC(0x006DFEE4);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006DFED0);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006DFEE4);
|
||||
g_editor_step = EDITOR_STEP_LANDSCAPE_EDITOR;
|
||||
window_map_open();
|
||||
gfx_invalidate_screen();
|
||||
|
@ -274,7 +274,7 @@ static int show_save_scenario_dialog(char *resultPath)
|
|||
format_string(filterName, STR_RCT2_SCENARIO_FILE, NULL);
|
||||
|
||||
pause_sounds();
|
||||
result = osinterface_open_common_file_dialog(0, title, filename, "*.SC6", filterName);
|
||||
result = platform_open_common_file_dialog(0, title, filename, "*.SC6", filterName);
|
||||
unpause_sounds();
|
||||
|
||||
if (result)
|
||||
|
|
|
@ -19,13 +19,13 @@
|
|||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../cursors.h"
|
||||
#include "../input.h"
|
||||
#include "../interface/widget.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../management/research.h"
|
||||
#include "../object.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../world/scenery.h"
|
||||
|
||||
#pragma region Widgets
|
||||
|
|
|
@ -87,7 +87,7 @@ void window_editor_main_open()
|
|||
RCT2_GLOBAL(0x009E32B3, uint8) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_TYPE, uint8) = 0;
|
||||
|
||||
window_editor_top_toolbar_open();
|
||||
window_top_toolbar_open();
|
||||
window_editor_bottom_toolbar_open();
|
||||
}
|
||||
|
||||
|
|
|
@ -19,33 +19,75 @@
|
|||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../audio/audio.h"
|
||||
#include "../game.h"
|
||||
#include "../interface/widget.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../object.h"
|
||||
#include "../ride/track.h"
|
||||
#include "error.h"
|
||||
|
||||
enum {
|
||||
WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_SMALL_SCENERY,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_LARGE_SCENERY,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_WALLS_FENCES,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_PATH_SIGNS,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_FOOTPATHS,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_PATH_EXTRAS,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_SCENERY_GROUPS,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_PARK_ENTRANCE,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_WATER,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_SCENARIO_DESCRIPTION,
|
||||
WINDOW_OBJECT_SELECTION_PAGE_COUNT
|
||||
};
|
||||
|
||||
#pragma region Widgets
|
||||
|
||||
enum WINDOW_STAFF_LIST_WIDGET_IDX {
|
||||
WIDX_EDITOR_OBJECT_SELECTION_BACKGROUND, // 0, 1
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TITLE, // 1, 2
|
||||
WIDX_EDITOR_OBJECT_SELECTION_CLOSE, // 2, 4
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_CONTENT_PANEL, // 3, 8
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_1, // 4, 10
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_2, // 5, 20
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_3, // 6, 40
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_4, // 7, 80
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_5, // 8, 100
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_6, // 9, 200
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_7, // 10, 400
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_8, // 11, 800
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_9, // 12, 1000
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_10, // 13, 2000
|
||||
WIDX_EDITOR_OBJECT_SELECTION_TAB_11, // 14, 4000
|
||||
WIDX_EDITOR_OBJECT_SELECTION_DROPDOWN1, // 15, 8000
|
||||
WIDX_EDITOR_OBJECT_SELECTION_LIST, // 16, 10000
|
||||
WIDX_EDITOR_OBJECT_SELECTION_FLATBTN, // 17, 20000
|
||||
WIDX_EDITOR_OBJECT_SELECTION_DROPDOWN2, // 18, 40000
|
||||
WIDX_BACKGROUND, // 0, 1
|
||||
WIDX_TITLE, // 1, 2
|
||||
WIDX_CLOSE, // 2, 4
|
||||
WIDX_TAB_CONTENT_PANEL, // 3, 8
|
||||
WIDX_TAB_1, // 4, 10
|
||||
WIDX_TAB_2, // 5, 20
|
||||
WIDX_TAB_3, // 6, 40
|
||||
WIDX_TAB_4, // 7, 80
|
||||
WIDX_TAB_5, // 8, 100
|
||||
WIDX_TAB_6, // 9, 200
|
||||
WIDX_TAB_7, // 10, 400
|
||||
WIDX_TAB_8, // 11, 800
|
||||
WIDX_TAB_9, // 12, 1000
|
||||
WIDX_TAB_10, // 13, 2000
|
||||
WIDX_TAB_11, // 14, 4000
|
||||
WIDX_DROPDOWN1, // 15, 8000
|
||||
WIDX_LIST, // 16, 10000
|
||||
WIDX_PREVIEW, // 17, 20000
|
||||
WIDX_DROPDOWN2, // 18, 40000
|
||||
};
|
||||
|
||||
static rct_widget window_editor_object_selection_widgets[] = {
|
||||
{ WWT_FRAME, 0, 0, 599, 0, 399, 0xFFFFFFFF, STR_NONE },
|
||||
{ WWT_CAPTION, 0, 1, 598, 1, 14, 3181, STR_WINDOW_TITLE_TIP },
|
||||
{ WWT_CLOSEBOX, 0, 587, 597, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
|
||||
{ WWT_RESIZE, 1, 0, 599, 43, 399, 0xFFFFFFFF, STR_NONE },
|
||||
{ WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 220, 250, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 251, 281, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 282, 312, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_TAB, 1, 313, 343, 17, 43, 0x2000144E, 1812 },
|
||||
{ WWT_DROPDOWN_BUTTON, 0, 470, 591, 23, 34, STR_OBJECT_SELECTION_ADVANCED, STR_OBJECT_SELECTION_ADVANCED_TIP },
|
||||
{ WWT_SCROLL, 1, 4, 291, 46, 386, 2, STR_NONE },
|
||||
{ WWT_FLATBTN, 1, 391, 504, 46, 159, 0xFFFFFFFF, STR_NONE },
|
||||
{ WWT_DROPDOWN_BUTTON, 0, 384, 595, 24, 35, STR_INSTALL_NEW_TRACK_DESIGN, STR_INSTALL_NEW_TRACK_DESIGN_TIP },
|
||||
{ WIDGETS_END }
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
@ -54,10 +96,18 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX {
|
|||
|
||||
static void window_editor_object_selection_emptysub() { }
|
||||
|
||||
static void window_editor_object_selection_close();
|
||||
static void window_editor_object_selection_mouseup();
|
||||
static void window_editor_object_selection_scrollgetsize();
|
||||
static void window_editor_object_selection_scroll_mousedown();
|
||||
static void window_editor_object_selection_scroll_mouseover();
|
||||
static void window_editor_object_selection_tooltip();
|
||||
static void window_editor_object_selection_invalidate();
|
||||
static void window_editor_object_selection_paint();
|
||||
static void window_editor_object_selection_scrollpaint();
|
||||
|
||||
static void* window_editor_object_selection_events[] = {
|
||||
(void*)0x006AB199,
|
||||
window_editor_object_selection_close,
|
||||
(void*)window_editor_object_selection_mouseup,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
|
@ -72,24 +122,71 @@ static void* window_editor_object_selection_events[] = {
|
|||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)0x006AB031,
|
||||
(void*)0x006AB0B6,
|
||||
(void*)window_editor_object_selection_scrollgetsize,
|
||||
(void*)window_editor_object_selection_scroll_mousedown,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)0x006AB079,
|
||||
(void*)window_editor_object_selection_scroll_mouseover,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)0x006AB058,
|
||||
(void*)window_editor_object_selection_tooltip,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)window_editor_object_selection_emptysub,
|
||||
(void*)0x006AA9FD,
|
||||
(void*)0x006AAB56,
|
||||
(void*)0x006AADA3
|
||||
(void*)window_editor_object_selection_invalidate,
|
||||
(void*)window_editor_object_selection_paint,
|
||||
(void*)window_editor_object_selection_scrollpaint
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
static void window_editor_object_set_page(rct_window *w, int page);
|
||||
static void window_editor_object_selection_set_pressed_tab(rct_window *w);
|
||||
static void window_editor_object_selection_select_default_objects();
|
||||
static int window_editor_object_selection_select_object(int flags, rct_object_entry *entry);
|
||||
static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry);
|
||||
static void window_editor_object_selection_manage_tracks();
|
||||
static void editor_load_selected_objects();
|
||||
|
||||
static rct_object_entry DefaultSelectedObjects[] = {
|
||||
// Objects that are always required
|
||||
{ 0x00000087, { "SCGTREES" }, 0 }, // Scenery: Trees
|
||||
{ 0x00000087, { "SCGSHRUB" }, 0 }, // Scenery: Shrubs and Ornaments
|
||||
{ 0x00000087, { "SCGGARDN" }, 0 }, // Scenery: Gardens
|
||||
{ 0x00000087, { "SCGFENCE" }, 0 }, // Scenery: Fences and Walls
|
||||
{ 0x00000087, { "SCGWALLS" }, 0 }, // Scenery: Walls and Roofs
|
||||
{ 0x00000087, { "SCGPATHX" }, 0 }, // Scenery: Signs and Items for Footpaths
|
||||
{ 0x00000085, { "TARMAC " }, 0 }, // Footpath: Tarmac
|
||||
|
||||
// An initial default selection
|
||||
{ 0x000080FF, { "TWIST1 " }, 0 }, // Ride: Twist
|
||||
{ 0x00008000, { "PTCT1 " }, 0 }, // Ride: Wooden Roller Coaster (Wooden Roller Coaster Trains)
|
||||
{ 0x00008000, { "ZLDB " }, 0 }, // Ride: Junior Roller Coaster (Ladybird Trains)
|
||||
{ 0x00008000, { "LFB1 " }, 0 }, // Ride: Log Flume
|
||||
{ 0x00008000, { "VCR " }, 0 }, // Ride: Vintage Cars
|
||||
{ 0x00008000, { "MGR1 " }, 0 }, // Ride: Merry-Go-Round
|
||||
{ 0x00008000, { "TLT1 " }, 0 }, // Ride: Restroom
|
||||
{ 0x00008000, { "ATM1 " }, 0 }, // Ride: Cash Machine
|
||||
{ 0x00008000, { "FAID1 " }, 0 }, // Ride: First Aid Room
|
||||
{ 0x00008000, { "INFOK " }, 0 }, // Ride: Information Kiosk
|
||||
{ 0x00008000, { "DRNKS " }, 0 }, // Ride: Drinks Stall
|
||||
{ 0x00008000, { "CNDYF " }, 0 }, // Ride: Cotten Candy Stall
|
||||
{ 0x00008000, { "BURGB " }, 0 }, // Ride: Burger Bar
|
||||
{ 0x00008000, { "BALLN " }, 0 }, // Ride: Balloon Stall
|
||||
{ 0x00008000, { "ARRT1 " }, 0 }, // Ride: Corkscrew Roller Coaster
|
||||
{ 0x00008000, { "RBOAT " }, 0 }, // Ride: Rowing Boats
|
||||
{ 0x00008800, { "PKENT1 " }, 0 }, // Park Entrace: Traditional Park Entrance
|
||||
{ 0x00008900, { "WTRCYAN " }, 0 }, // Water: Natural Water
|
||||
{ 0x00008500, { "TARMACB " }, 0 }, // Footpath: Brown Tarmac Footpath
|
||||
{ 0x00008500, { "PATHSPC " }, 0 }, // Footpath: Space Style Footpath
|
||||
{ 0x00008500, { "PATHDIR " }, 0 }, // Footpath: Dirt Footpath
|
||||
{ 0x00008500, { "PATHCRZ " }, 0 }, // Footpath: Crazy Paving Footpath
|
||||
{ 0x00008500, { "PATHASH " }, 0 }, // Footpath: Ash Footpath
|
||||
|
||||
// The following are for all random map generation features to work out the box
|
||||
{ 0x00000087, { "SCGJUNGL" }, 0 }, // Jungle Themeing
|
||||
{ 0x00000087, { "SCGSNOW " }, 0 }, // Snow and Ice Themeing
|
||||
{ 0x00000087, { "SCGWATER" }, 0 } // Water Feature Themeing
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -106,6 +203,10 @@ void window_editor_object_selection_open()
|
|||
RCT2_CALLPROC_EBPSAFE(0x006AB211);
|
||||
RCT2_CALLPROC_EBPSAFE(0x006AA770);
|
||||
|
||||
// Not really where its called, but easy way to change default objects for now
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR)
|
||||
window_editor_object_selection_select_default_objects();
|
||||
|
||||
window = window_create(
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2 - 300,
|
||||
max(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) / 2 - 200, 28),
|
||||
|
@ -115,14 +216,14 @@ void window_editor_object_selection_open()
|
|||
WC_EDITOR_OBJECT_SELECTION,
|
||||
WF_STICK_TO_FRONT
|
||||
);
|
||||
window->widgets = (rct_widget*)0x009ADB00;
|
||||
window->widgets = window_editor_object_selection_widgets;
|
||||
|
||||
window->enabled_widgets =
|
||||
(1 << WIDX_EDITOR_OBJECT_SELECTION_DROPDOWN1) |
|
||||
(1 << WIDX_EDITOR_OBJECT_SELECTION_DROPDOWN2) |
|
||||
(1 << WIDX_EDITOR_OBJECT_SELECTION_CLOSE);
|
||||
(1 << WIDX_DROPDOWN1) |
|
||||
(1 << WIDX_DROPDOWN2) |
|
||||
(1 << WIDX_CLOSE);
|
||||
|
||||
for (int i = WIDX_EDITOR_OBJECT_SELECTION_TAB_1; i <= WIDX_EDITOR_OBJECT_SELECTION_TAB_11; i++)
|
||||
for (int i = WIDX_TAB_1; i <= WIDX_TAB_11; i++)
|
||||
window->enabled_widgets |= (1LL << i);
|
||||
window_init_scroll_widgets(window);
|
||||
|
||||
|
@ -135,6 +236,35 @@ void window_editor_object_selection_open()
|
|||
window->colours[2] = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AB199
|
||||
*/
|
||||
static void window_editor_object_selection_close()
|
||||
{
|
||||
rct_window* w;
|
||||
window_get_register(w);
|
||||
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) &
|
||||
(SCREEN_FLAGS_SCENARIO_EDITOR |
|
||||
SCREEN_FLAGS_TRACK_DESIGNER |
|
||||
SCREEN_FLAGS_TRACK_MANAGER))
|
||||
)return;
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x6ABB66);
|
||||
editor_load_selected_objects();
|
||||
sub_6A9FC0();
|
||||
object_free_scenario_text();
|
||||
RCT2_CALLPROC_EBPSAFE(0x6AB316);
|
||||
RCT2_CALLPROC_EBPSAFE(0x685675);
|
||||
RCT2_CALLPROC_EBPSAFE(0x68585B);
|
||||
window_new_ride_init_vars();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AAFAB
|
||||
*/
|
||||
static void window_editor_object_selection_mouseup()
|
||||
{
|
||||
rct_window *w;
|
||||
|
@ -143,33 +273,33 @@ static void window_editor_object_selection_mouseup()
|
|||
window_widget_get_registers(w, widgetIndex);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_CLOSE:
|
||||
case WIDX_CLOSE:
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0);
|
||||
break;
|
||||
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_1:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_2:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_3:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_4:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_5:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_6:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_7:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_8:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_9:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_10:
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_TAB_11:
|
||||
window_editor_object_set_page(w, widgetIndex - WIDX_EDITOR_OBJECT_SELECTION_TAB_1);
|
||||
case WIDX_TAB_1:
|
||||
case WIDX_TAB_2:
|
||||
case WIDX_TAB_3:
|
||||
case WIDX_TAB_4:
|
||||
case WIDX_TAB_5:
|
||||
case WIDX_TAB_6:
|
||||
case WIDX_TAB_7:
|
||||
case WIDX_TAB_8:
|
||||
case WIDX_TAB_9:
|
||||
case WIDX_TAB_10:
|
||||
case WIDX_TAB_11:
|
||||
window_editor_object_set_page(w, widgetIndex - WIDX_TAB_1);
|
||||
break;
|
||||
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_DROPDOWN1:
|
||||
case WIDX_DROPDOWN1:
|
||||
w->list_information_type ^= 1;
|
||||
window_invalidate(w);
|
||||
break;
|
||||
|
||||
case WIDX_EDITOR_OBJECT_SELECTION_DROPDOWN2:
|
||||
case WIDX_DROPDOWN2:
|
||||
if (w->selected_list_item != -1) {
|
||||
w->selected_list_item = -1;
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A982D); // object_free_scenario_text();
|
||||
object_free_scenario_text();
|
||||
}
|
||||
window_invalidate(w);
|
||||
|
||||
|
@ -183,6 +313,409 @@ static void window_editor_object_selection_mouseup()
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AB031
|
||||
*/
|
||||
static void window_editor_object_selection_scrollgetsize()
|
||||
{
|
||||
rct_window *w;
|
||||
short scrollIndex;
|
||||
int numItems, width, height;
|
||||
|
||||
window_scroll_get_registers(w, scrollIndex);
|
||||
|
||||
numItems = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER) ?
|
||||
RCT2_GLOBAL(0x00F43412, uint16) :
|
||||
RCT2_ADDRESS(0x00F433E1, uint16)[w->selected_tab];
|
||||
|
||||
width = 0;
|
||||
height = numItems * 12;
|
||||
window_scrollsize_set_registers(width, height);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AB0B6
|
||||
*/
|
||||
static void window_editor_object_selection_scroll_mousedown()
|
||||
{
|
||||
short x, y, scrollIndex;
|
||||
rct_window *w;
|
||||
|
||||
window_scrollmouse_get_registers(w, scrollIndex, x, y);
|
||||
|
||||
uint8 object_selection_flags;
|
||||
rct_object_entry* installed_entry;
|
||||
int selected_object = get_object_from_object_selection((w->selected_tab & 0xFF), y, &object_selection_flags, &installed_entry);
|
||||
if (selected_object == -1 || (object_selection_flags & 0x20))
|
||||
return;
|
||||
|
||||
window_invalidate(w);
|
||||
|
||||
sound_play_panned(SOUND_CLICK_1, RCT2_GLOBAL(0x142406C,uint32), 0, 0, 0);
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) {
|
||||
if (!window_editor_object_selection_select_object(1, installed_entry))
|
||||
return;
|
||||
|
||||
window_close(w);
|
||||
|
||||
//This function calls window_track_list_open
|
||||
window_editor_object_selection_manage_tracks();
|
||||
return;
|
||||
}
|
||||
|
||||
int ebx = 6;
|
||||
// If already selected
|
||||
if (!(object_selection_flags & 1))
|
||||
ebx = 7;
|
||||
|
||||
RCT2_GLOBAL(0xF43411, uint8) = 0;
|
||||
if (!window_editor_object_selection_select_object(ebx, installed_entry)) {
|
||||
rct_string_id error_title = ebx & 1 ?
|
||||
STR_UNABLE_TO_SELECT_THIS_OBJECT :
|
||||
STR_UNABLE_TO_DE_SELECT_THIS_OBJECT;
|
||||
|
||||
window_error_open(error_title, RCT2_GLOBAL(0x141E9AC, uint16));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!RCT2_GLOBAL(0xF43411, uint8) & 1)
|
||||
return;
|
||||
|
||||
window_error_open(STR_WARNING_TOO_MANY_OBJECTS_SELECTED, STR_NOT_ALL_OBJECTS_IN_THIS_SCENERY_GROUP_COULD_BE_SELECTED);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AB079
|
||||
*/
|
||||
static void window_editor_object_selection_scroll_mouseover()
|
||||
{
|
||||
rct_window *w;
|
||||
rct_object_entry *installedEntry;
|
||||
int selectedObject;
|
||||
short x, y, scrollIndex;
|
||||
uint8 objectSelectionFlags;
|
||||
|
||||
window_scrollmouse_get_registers(w, scrollIndex, x, y);
|
||||
|
||||
selectedObject = get_object_from_object_selection(
|
||||
w->selected_tab & 0xFF, y, &objectSelectionFlags, &installedEntry
|
||||
);
|
||||
if (objectSelectionFlags & 0x20)
|
||||
selectedObject = -1;
|
||||
|
||||
if (selectedObject == w->selected_list_item)
|
||||
return;
|
||||
|
||||
w->selected_list_item = selectedObject;
|
||||
w->var_494 = (uint32)installedEntry;
|
||||
object_free_scenario_text();
|
||||
if (selectedObject != -1)
|
||||
object_get_scenario_text(installedEntry);
|
||||
|
||||
window_invalidate(w);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AB058
|
||||
*/
|
||||
static void window_editor_object_selection_tooltip()
|
||||
{
|
||||
rct_window *w;
|
||||
short widgetIndex;
|
||||
|
||||
window_scroll_get_registers(w, widgetIndex);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_TAB_1:
|
||||
case WIDX_TAB_2:
|
||||
case WIDX_TAB_3:
|
||||
case WIDX_TAB_4:
|
||||
case WIDX_TAB_5:
|
||||
case WIDX_TAB_6:
|
||||
case WIDX_TAB_7:
|
||||
case WIDX_TAB_8:
|
||||
case WIDX_TAB_9:
|
||||
case WIDX_TAB_10:
|
||||
case WIDX_TAB_11:
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) =
|
||||
STR_OBJECT_SELECTION_RIDE_VEHICLES_ATTRACTIONS + (widgetIndex - WIDX_TAB_1);
|
||||
break;
|
||||
default:
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = STR_LIST;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AA9FD
|
||||
*/
|
||||
static void window_editor_object_selection_invalidate()
|
||||
{
|
||||
int i, x;
|
||||
rct_window *w;
|
||||
rct_widget *widget;
|
||||
|
||||
window_get_register(w);
|
||||
|
||||
// Set pressed widgets
|
||||
w->pressed_widgets |= 1 << WIDX_PREVIEW;
|
||||
window_editor_object_selection_set_pressed_tab(w);
|
||||
if (w->list_information_type & 1)
|
||||
w->pressed_widgets |= (1 << WIDX_DROPDOWN1);
|
||||
else
|
||||
w->pressed_widgets &= ~(1 << WIDX_DROPDOWN1);
|
||||
|
||||
// Set window title and buttons
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = STR_OBJECT_SELECTION_RIDE_VEHICLES_ATTRACTIONS + w->selected_tab;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) {
|
||||
w->widgets[WIDX_TITLE].image = STR_TRACK_DESIGNS_MANAGER_SELECT_RIDE_TYPE;
|
||||
w->widgets[WIDX_CLOSE].type = WWT_EMPTY;
|
||||
w->widgets[WIDX_DROPDOWN2].type = WWT_DROPDOWN_BUTTON;
|
||||
} else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) {
|
||||
w->widgets[WIDX_TITLE].image = STR_ROLLER_COASTER_DESIGNER_SELECT_RIDE_TYPES_VEHICLES;
|
||||
w->widgets[WIDX_CLOSE].type = WWT_CLOSEBOX;
|
||||
w->widgets[WIDX_DROPDOWN2].type = WWT_EMPTY;
|
||||
} else {
|
||||
w->widgets[WIDX_TITLE].image = STR_OBJECT_SELECTION;
|
||||
w->widgets[WIDX_CLOSE].type = WWT_CLOSEBOX;
|
||||
w->widgets[WIDX_DROPDOWN2].type = WWT_EMPTY;
|
||||
}
|
||||
|
||||
// Align tabs, hide advanced ones
|
||||
x = 3;
|
||||
for (i = 0; i < WINDOW_OBJECT_SELECTION_PAGE_COUNT; i++) {
|
||||
widget = &w->widgets[WIDX_TAB_1 + i];
|
||||
|
||||
if (!(w->list_information_type & 1) && ((1 << i) & 0x5E)) {
|
||||
widget->type = WWT_EMPTY;
|
||||
} else {
|
||||
widget->type = WWT_TAB;
|
||||
widget->left = x;
|
||||
widget->right = x + 30;
|
||||
x += 31;
|
||||
}
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_MANAGER | SCREEN_FLAGS_TRACK_DESIGNER)) {
|
||||
w->widgets[WIDX_DROPDOWN1].type = WWT_EMPTY;
|
||||
for (i = 1; i < WINDOW_OBJECT_SELECTION_PAGE_COUNT; i++)
|
||||
w->widgets[WIDX_TAB_1 + i].type = WWT_EMPTY;
|
||||
x = 150;
|
||||
} else {
|
||||
w->widgets[WIDX_DROPDOWN1].type = WWT_DROPDOWN_BUTTON;
|
||||
x = 300;
|
||||
}
|
||||
|
||||
w->widgets[WIDX_LIST].right = 587 - x;
|
||||
w->widgets[WIDX_PREVIEW].left = 537 - (x >> 1);
|
||||
w->widgets[WIDX_PREVIEW].right = w->widgets[WIDX_PREVIEW].left + 113;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AAB56
|
||||
*/
|
||||
static void window_editor_object_selection_paint()
|
||||
{
|
||||
int i, x, y, width, numSelected, totalSelectable, type;
|
||||
rct_window *w;
|
||||
rct_drawpixelinfo *dpi;
|
||||
rct_widget *widget;
|
||||
rct_object_entry *highlightedEntry;
|
||||
rct_string_id stringId;
|
||||
uint8 *text;
|
||||
char *datName, *name, *stringBuffer;
|
||||
|
||||
window_paint_get_registers(w, dpi);
|
||||
|
||||
window_draw_widgets(w, dpi);
|
||||
|
||||
// Draw tabs
|
||||
for (i = 0; i < WINDOW_OBJECT_SELECTION_PAGE_COUNT; i++) {
|
||||
widget = &w->widgets[WIDX_TAB_1 + i];
|
||||
if (widget->type == WWT_EMPTY)
|
||||
continue;
|
||||
|
||||
x = w->x + widget->left;
|
||||
y = w->y + widget->top;
|
||||
gfx_draw_sprite(dpi, 5458 + i, x, y, 0);
|
||||
}
|
||||
|
||||
// Preview background
|
||||
widget = &w->widgets[WIDX_PREVIEW];
|
||||
gfx_fill_rect(
|
||||
dpi,
|
||||
w->x + widget->left + 1,
|
||||
w->y + widget->top + 1,
|
||||
w->x + widget->right - 1,
|
||||
w->y + widget->bottom - 1,
|
||||
RCT2_ADDRESS(0x0141FC44, uint8)[w->colours[1] * 8]
|
||||
);
|
||||
|
||||
// Draw number of selected items
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) {
|
||||
x = w->x + 3;
|
||||
y = w->y + w->height - 12;
|
||||
|
||||
numSelected = RCT2_ADDRESS(0x00F433F7, uint16)[w->selected_tab];
|
||||
totalSelectable = object_entry_group_counts[w->selected_tab];
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER)
|
||||
totalSelectable = 4;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = numSelected;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 2, uint16) = totalSelectable;
|
||||
gfx_draw_string_left(dpi, 3164, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, 0, x, y);
|
||||
}
|
||||
|
||||
if (w->selected_list_item == -1 || RCT2_GLOBAL(0x009ADAF8, sint32) == -1)
|
||||
return;
|
||||
|
||||
highlightedEntry = (rct_object_entry*)w->var_494;
|
||||
type = highlightedEntry->flags & 0x0F;
|
||||
|
||||
// Draw preview
|
||||
widget = &w->widgets[WIDX_PREVIEW];
|
||||
x = w->x + (widget->left + widget->right) / 2 + 1;
|
||||
y = w->y + (widget->top + widget->bottom) / 2 + 1;
|
||||
object_paint(type, 3, type, x, y, 0, (int)dpi, RCT2_GLOBAL(0x009ADAF8, sint32));
|
||||
|
||||
// Draw name of object
|
||||
x = w->x + (widget->left + widget->right) / 2 + 1;
|
||||
y = w->y + widget->bottom + 3;
|
||||
width = w->width - w->widgets[WIDX_LIST].right - 6;
|
||||
|
||||
// Skip object dat name
|
||||
text = (char*)(highlightedEntry + 1);
|
||||
datName = text;
|
||||
do {
|
||||
text++;
|
||||
} while (*(text - 1) != 0);
|
||||
text += 4;
|
||||
name = text;
|
||||
|
||||
RCT2_GLOBAL(0x009BC677, uint8) = 14;
|
||||
|
||||
stringId = 3165;
|
||||
stringBuffer = (char*)language_get_string(3165) + 1;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) {
|
||||
// Skip name
|
||||
do {
|
||||
text++;
|
||||
} while (*(text - 1) != 0);
|
||||
text += 4;
|
||||
text += *text++ * 16;
|
||||
text += *text++ * 16;
|
||||
|
||||
if (RCT2_GLOBAL(text, uint32) & 0x1000000) {
|
||||
strcpy(stringBuffer, name);
|
||||
} else {
|
||||
int eax = *text;
|
||||
if (*text == 0xFF) {
|
||||
eax = *(text + 1);
|
||||
if (*(text + 1) == 0xFF)
|
||||
eax = *(text + 2);
|
||||
}
|
||||
format_string(stringBuffer, eax + 2, NULL);
|
||||
}
|
||||
} else {
|
||||
strcpy(stringBuffer, name);
|
||||
}
|
||||
gfx_draw_string_centred_clipped(dpi, stringId, NULL, 0, x, y, width);
|
||||
|
||||
// Draw description of object
|
||||
x = w->x + w->widgets[WIDX_LIST].right + 4;
|
||||
y += 15;
|
||||
object_paint(type, 259, type, x, y, (int)w, (int)dpi, RCT2_GLOBAL(0x009ADAF8, sint32));
|
||||
|
||||
// Draw object dat name
|
||||
strcpy(stringBuffer, datName);
|
||||
gfx_draw_string_right(dpi, stringId, NULL, 0, w->x + w->width - 5, w->y + w->height - 3 - 12);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AADA3
|
||||
*/
|
||||
static void window_editor_object_selection_scrollpaint()
|
||||
{
|
||||
int x, y, i, colour, colour2, numObjects, type;
|
||||
short scrollIndex;
|
||||
rct_object_entry *entry;
|
||||
rct_window *w;
|
||||
rct_drawpixelinfo *dpi;
|
||||
uint8 *itemFlags;
|
||||
|
||||
window_scrollpaint_get_registers(w, dpi, scrollIndex);
|
||||
|
||||
colour = RCT2_ADDRESS(0x0141FC48, uint8)[w->colours[1] * 8];
|
||||
colour = (colour << 24) | (colour << 16) | (colour << 8) | colour;
|
||||
gfx_clear(dpi, colour);
|
||||
|
||||
numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32);
|
||||
entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
|
||||
itemFlags = RCT2_GLOBAL(0x009ADAEC, uint8*);
|
||||
y = 0;
|
||||
for (i = 0; i < numObjects; i++) {
|
||||
type = entry->flags & 0x0F;
|
||||
if (type == w->selected_tab && !(*itemFlags & 0x20)) {
|
||||
if (y + 12 >= dpi->y && y <= dpi->y + dpi->height) {
|
||||
// Draw checkbox
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && !(*itemFlags & 0x20))
|
||||
gfx_fill_rect_inset(dpi, 2, y, 11, y + 10, w->colours[1], 0xE0);
|
||||
|
||||
// Highlight background
|
||||
colour = 142;
|
||||
if (entry == (rct_object_entry*)w->var_494 && !(*itemFlags & 0x20)) {
|
||||
gfx_fill_rect(dpi, 0, y, w->width, y + 11, 0x2000031);
|
||||
colour = 14;
|
||||
}
|
||||
|
||||
// Draw checkmark
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && (*itemFlags & 1)) {
|
||||
x = 2;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = colour == 14 ? -2 : -1;
|
||||
colour2 = w->colours[1] & 0x7F;
|
||||
if (*itemFlags & 0x1C)
|
||||
colour2 |= 0x40;
|
||||
|
||||
gfx_draw_string(dpi, (char*)0x009DED72, colour2, x, y);
|
||||
}
|
||||
|
||||
// Draw text
|
||||
char *buffer = (char*)0x0141ED68;
|
||||
*buffer = colour;
|
||||
strcpy(buffer + 1, object_get_name(entry));
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) {
|
||||
while (*buffer != 0 && *buffer != 9)
|
||||
buffer++;
|
||||
|
||||
*buffer = 0;
|
||||
}
|
||||
|
||||
if (*itemFlags & 0x20) {
|
||||
colour = w->colours[1] & 0x7F;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1;
|
||||
} else {
|
||||
colour = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224;
|
||||
}
|
||||
x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15;
|
||||
gfx_draw_string(dpi, (char*)0x0141ED68, colour, x, y);
|
||||
}
|
||||
y += 12;
|
||||
}
|
||||
|
||||
entry = object_get_next(entry);
|
||||
itemFlags++;
|
||||
}
|
||||
}
|
||||
|
||||
static void window_editor_object_set_page(rct_window *w, int page)
|
||||
{
|
||||
if (w->selected_tab == page)
|
||||
|
@ -192,6 +725,133 @@ static void window_editor_object_set_page(rct_window *w, int page)
|
|||
w->selected_list_item = -1;
|
||||
w->var_494 = 0xFFFFFFFF;
|
||||
w->scrolls[0].v_top = 0;
|
||||
RCT2_CALLPROC_EBPSAFE(0x006A982D); // object_free_scenario_text();
|
||||
object_free_scenario_text();
|
||||
window_invalidate(w);
|
||||
}
|
||||
|
||||
static void window_editor_object_selection_set_pressed_tab(rct_window *w)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < WINDOW_OBJECT_SELECTION_PAGE_COUNT; i++)
|
||||
w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i));
|
||||
w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->selected_tab);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AA7E9
|
||||
*/
|
||||
static void window_editor_object_selection_select_default_objects()
|
||||
{
|
||||
int i;
|
||||
|
||||
if (RCT2_GLOBAL(0x00F433F7, uint16) == 0)
|
||||
return;
|
||||
|
||||
for (i = 0; i < countof(DefaultSelectedObjects); i++)
|
||||
window_editor_object_selection_select_object(7, &DefaultSelectedObjects[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AB54F
|
||||
*/
|
||||
static int window_editor_object_selection_select_object(int flags, rct_object_entry *entry)
|
||||
{
|
||||
return (RCT2_CALLPROC_X(0x006AB54F, 0, flags, 0, 0, 0, 0, (int)entry) & 0x100) == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the y coordinate of the clicked on scroll list
|
||||
* and converts this into an object selection.
|
||||
* Returns the position in the list.
|
||||
* Object_selection_flags, installed_entry also populated
|
||||
*
|
||||
* rct2: 0x006AA703
|
||||
*/
|
||||
static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry)
|
||||
{
|
||||
*installed_entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
|
||||
uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
|
||||
int object_count = 0;
|
||||
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){
|
||||
if (((*installed_entry)->flags & 0xF) == object_type){
|
||||
if (!(*selection_flags & 0x20)){
|
||||
y -= 12;
|
||||
*object_selection_flags = *selection_flags;
|
||||
if (y < 0)return object_count;
|
||||
object_count++;
|
||||
}
|
||||
}
|
||||
|
||||
*installed_entry = object_get_next(*installed_entry);
|
||||
selection_flags++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006D33E2
|
||||
*/
|
||||
static void window_editor_object_selection_manage_tracks()
|
||||
{
|
||||
RCT2_GLOBAL(0x1357404, sint32) = -1;
|
||||
RCT2_GLOBAL(0x1357408, sint32) = -1;
|
||||
RCT2_GLOBAL(0x135740C, sint32) = -1;
|
||||
RCT2_GLOBAL(0x1357410, sint32) = -1;
|
||||
|
||||
for (int i = 0; i < 128; ++i){
|
||||
RCT2_ADDRESS(0x1357444, uint32)[i] = RCT2_ADDRESS(0x97C468, uint32)[i];
|
||||
RCT2_ADDRESS(0x1357644, uint32)[i] = RCT2_ADDRESS(0x97C5D4, uint32)[i];
|
||||
}
|
||||
|
||||
for (int i = 0; i < 8; ++i){
|
||||
RCT2_ADDRESS(0x1357424, sint32)[i] = -1;
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(0x141F570, uint8) = 7;
|
||||
|
||||
int entry_index = 0;
|
||||
for (; ((int)object_entry_groups[0].chunks[entry_index]) == -1; ++entry_index);
|
||||
|
||||
RCT2_GLOBAL(0xF44157, uint8) = entry_index;
|
||||
|
||||
rct_ride_type* ride_entry = GET_RIDE_ENTRY(entry_index);
|
||||
uint8* ride_type_array = &ride_entry->var_00C;
|
||||
|
||||
int ride_type;
|
||||
for (int i = 0; (ride_type = ride_type_array[i]) == 0xFF; i++);
|
||||
RCT2_GLOBAL(0xF44158, uint8) = ride_type;
|
||||
|
||||
ride_list_item item = { ride_type, entry_index };
|
||||
track_load_list(item);
|
||||
window_track_list_open(item);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006ABBBE
|
||||
*/
|
||||
static void editor_load_selected_objects()
|
||||
{
|
||||
uint8 *selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
|
||||
rct_object_entry *installed_entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*);
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) == 0)
|
||||
return;
|
||||
|
||||
for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i != 0; i--, selection_flags++) {
|
||||
if (*selection_flags & 1) {
|
||||
uint8 entry_index, entry_type;
|
||||
if (!find_object_in_entry_group(installed_entry, &entry_type, &entry_index)){
|
||||
int chunk_size;
|
||||
if (!object_load(-1, installed_entry, &chunk_size)) {
|
||||
log_error("Failed to load entry %.8s", installed_entry->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
installed_entry = object_get_next(installed_entry);
|
||||
}
|
||||
}
|
|
@ -25,6 +25,7 @@
|
|||
#include "../interface/widget.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../scenario.h"
|
||||
#include "../world/park.h"
|
||||
#include "dropdown.h"
|
||||
#include "error.h"
|
||||
|
||||
|
@ -230,6 +231,15 @@ static uint64 window_editor_objective_options_page_enabled_widgets[] = {
|
|||
(1 << WIDX_TAB_2)
|
||||
};
|
||||
|
||||
static uint64 window_editor_objective_options_page_hold_down_widgets[] = {
|
||||
(1 << WIDX_OBJECTIVE_ARG_1_INCREASE) |
|
||||
(1 << WIDX_OBJECTIVE_ARG_1_DECREASE) |
|
||||
(1 << WIDX_OBJECTIVE_ARG_2_INCREASE) |
|
||||
(1 << WIDX_OBJECTIVE_ARG_2_DECREASE),
|
||||
|
||||
0
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
/**
|
||||
|
@ -254,12 +264,12 @@ void window_editor_objective_options_open()
|
|||
WF_10
|
||||
);
|
||||
w->widgets = window_editor_objective_options_main_widgets;
|
||||
w->enabled_widgets = window_editor_objective_options_page_enabled_widgets[0];
|
||||
w->enabled_widgets = window_editor_objective_options_page_enabled_widgets[WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN];
|
||||
w->pressed_widgets = 0;
|
||||
w->var_020 = 0x00003600;
|
||||
w->hold_down_widgets = window_editor_objective_options_page_hold_down_widgets[WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN];
|
||||
window_init_scroll_widgets(w);
|
||||
w->var_4AE = 0;
|
||||
w->selected_tab = 0;
|
||||
w->selected_tab = WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN;
|
||||
w->no_list_items = 0;
|
||||
w->selected_list_item = -1;
|
||||
RCT2_CALLPROC_X(0x00672609, 0, 0, 0, 0, (int)w, 0, 0);
|
||||
|
@ -327,7 +337,7 @@ static void window_editor_objective_options_set_page(rct_window *w, int page)
|
|||
w->no_list_items = 0;
|
||||
w->selected_list_item = -1;
|
||||
w->enabled_widgets = window_editor_objective_options_page_enabled_widgets[page];
|
||||
w->var_020 = page == WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN ? 0x3600 : 0;
|
||||
w->hold_down_widgets = window_editor_objective_options_page_hold_down_widgets[page];
|
||||
w->event_handlers = window_editor_objective_options_page_events[page];
|
||||
w->widgets = window_editor_objective_options_widgets[page];
|
||||
window_invalidate(w);
|
||||
|
@ -405,7 +415,7 @@ static void window_editor_objective_options_main_mouseup()
|
|||
break;
|
||||
case WIDX_PARK_NAME:
|
||||
RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
window_text_input_open(w, WIDX_PARK_NAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, RCT2_GLOBAL(0x013573D4, rct_string_id), 0, 32);
|
||||
window_text_input_open(w, WIDX_PARK_NAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), 0, 32);
|
||||
break;
|
||||
case WIDX_SCENARIO_NAME:
|
||||
strcpy((char*)0x009BC677, s6Info->name);
|
||||
|
@ -799,13 +809,10 @@ static void window_editor_objective_options_main_textinput()
|
|||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_PARK_NAME:
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_RENAME_PARK;
|
||||
game_do_command(1, 1, 0, *((int*)(text + 0)), GAME_COMMAND_33, *((int*)(text + 8)), *((int*)(text + 4)));
|
||||
game_do_command(2, 1, 0, *((int*)(text + 12)), GAME_COMMAND_33, *((int*)(text + 20)), *((int*)(text + 16)));
|
||||
game_do_command(0, 1, 0, *((int*)(text + 24)), GAME_COMMAND_33, *((int*)(text + 32)), *((int*)(text + 28)));
|
||||
park_set_name(text);
|
||||
|
||||
if (s6Info->name[0] == 0)
|
||||
format_string(s6Info->name, RCT2_GLOBAL(0x013573D4, uint16), (void*)0x013573D8);
|
||||
format_string(s6Info->name, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), (void*)RCT2_ADDRESS_PARK_NAME_ARGS);
|
||||
break;
|
||||
case WIDX_SCENARIO_NAME:
|
||||
strncpy(s6Info->name, text, 64);
|
||||
|
@ -1018,7 +1025,7 @@ static void window_editor_objective_options_main_paint()
|
|||
if (stex != NULL) {
|
||||
RCT2_GLOBAL(0x013CE952 + 0, uint16) = stex->park_name;
|
||||
} else {
|
||||
RCT2_GLOBAL(0x013CE952 + 0, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 0, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id);
|
||||
}
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x0013573D8, uint32);
|
||||
gfx_draw_string_left_clipped(dpi, 3298, (void*)0x013CE952, 0, x, y, width);
|
||||
|
|
|
@ -319,7 +319,7 @@ static uint64 window_editor_scenario_options_page_enabled_widgets[] = {
|
|||
0x007F7B74
|
||||
};
|
||||
|
||||
static uint32 dword_9A9DE8[] = {
|
||||
static uint32 window_editor_scenario_options_page_hold_down_widgets[] = {
|
||||
0x000DB600,
|
||||
0x0006DB00,
|
||||
0x00031B00
|
||||
|
@ -350,7 +350,7 @@ void window_editor_scenario_options_open()
|
|||
);
|
||||
w->widgets = window_editor_scenario_options_widgets[0];
|
||||
w->enabled_widgets = window_editor_scenario_options_page_enabled_widgets[0];
|
||||
w->var_020 = dword_9A9DE8[0];
|
||||
w->hold_down_widgets = window_editor_scenario_options_page_hold_down_widgets[0];
|
||||
window_init_scroll_widgets(w);
|
||||
w->var_4AE = 0;
|
||||
w->page = 0;
|
||||
|
@ -422,7 +422,7 @@ static void window_editor_scenario_options_set_page(rct_window *w, int page)
|
|||
w->frame_no = 0;
|
||||
w->var_492 = 0;
|
||||
w->enabled_widgets = window_editor_scenario_options_page_enabled_widgets[page];
|
||||
w->var_020 = dword_9A9DE8[page];
|
||||
w->hold_down_widgets = window_editor_scenario_options_page_hold_down_widgets[page];
|
||||
w->event_handlers = window_editor_scenario_options_page_events[page];
|
||||
w->widgets = window_editor_scenario_options_widgets[page];
|
||||
window_invalidate(w);
|
||||
|
|
|
@ -1,407 +0,0 @@
|
|||
/*****************************************************************************
|
||||
* Copyright (c) 2014 Dániel Tar, 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 <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../localisation/string_ids.h"
|
||||
#include "../sprites.h"
|
||||
#include "../game.h"
|
||||
#include "../editor.h"
|
||||
#include "../toolbar.h"
|
||||
#include "../interface/viewport.h"
|
||||
#include "../interface/widget.h"
|
||||
#include "../interface/window.h"
|
||||
#include "dropdown.h"
|
||||
|
||||
enum WINDOW_EDITOR_TOP_TOOLBAR_WIDGET_IDX {
|
||||
WIDX_PAUSE, // 0, 1
|
||||
WIDX_FILE_MENU, // 1, 2
|
||||
WIDX_ZOOM_OUT, // 2, 4
|
||||
WIDX_ZOOM_IN, // 3, 8
|
||||
WIDX_ROTATE, // 4, 10
|
||||
WIDX_VIEW_MENU, // 5, 20
|
||||
WIDX_MAP, // 6, 40
|
||||
WIDX_LAND, // 7, 80
|
||||
WIDX_WATER, // 8, 100
|
||||
WIDX_SCENERY, // 9, 200
|
||||
WIDX_PATH, // 10, 400
|
||||
WIDX_CONSTRUCT_RIDE, // 11, 800
|
||||
WIDX_UNUSED1, // 12, 1000
|
||||
WIDX_UNUSED2, // 13, 2000
|
||||
WIDX_UNUSED3, // 14, 4000
|
||||
WIDX_UNUSED4, // 15, 8000
|
||||
WIDX_CLEAR_SCENERY, // 16, 10000
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
DDIDX_SE_LOAD_LANDSCAPE = 0,
|
||||
DDIDX_SE_SAVE_LANDSCAPE = 1,
|
||||
DDIDX_SE_ABOUT = 3,
|
||||
DDIDX_SE_OPTIONS = 4,
|
||||
DDIDX_SE_SCREENSHOT = 5,
|
||||
DDIDX_SE_QUIT_GAME = 7,
|
||||
} SCENARIO_EDITOR_FILE_MENU_DDIDX;
|
||||
|
||||
typedef enum {
|
||||
DDIDX_TD_ABOUT = 0,
|
||||
DDIDX_TD_OPTIONS = 1,
|
||||
DDIDX_TD_SCREENSHOT = 2,
|
||||
DDIDX_TD_QUIT_GAME = 4,
|
||||
} TRACK_DESINGER_FILE_MENU_DDIDX;
|
||||
|
||||
static rct_widget window_editor_top_toolbar_widgets[] = {
|
||||
{ WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 1 0x009A9844
|
||||
{ WWT_TRNBTN, 0, 0, 29, 0, 27, 0x20000000 | SPR_TOOLBAR_FILE, STR_DISC_AND_GAME_OPTIONS_TIP }, // 2 0x009A9854
|
||||
{ WWT_TRNBTN, 1, 40, 69, 0, 27, 0x20000000 | SPR_TOOLBAR_ZOOM_OUT, STR_ZOOM_OUT_TIP }, // 4 0x009A9864
|
||||
{ WWT_TRNBTN, 1, 70, 99, 0, 27, 0x20000000 | SPR_TOOLBAR_ZOOM_IN, STR_ZOOM_IN_TIP }, // 8 0x009A9874
|
||||
{ WWT_TRNBTN, 1, 100, 129, 0, 27, 0x20000000 | SPR_TOOLBAR_ROTATE, STR_ROTATE_TIP }, // 10 0x009A9884
|
||||
{ WWT_TRNBTN, 1, 130, 159, 0, 27, 0x20000000 | SPR_TOOLBAR_VIEW, STR_VIEW_OPTIONS_TIP }, // 20 0x009A9894
|
||||
{ WWT_TRNBTN, 1, 160, 189, 0, 27, 0x20000000 | SPR_TOOLBAR_MAP, STR_SHOW_MAP_TIP }, // 40 0x009A98A4
|
||||
{ WWT_TRNBTN, 2, 267, 296, 0, 27, 0x20000000 | SPR_TOOLBAR_LAND, STR_ADJUST_LAND_TIP }, // 80 0x009A98B4
|
||||
{ WWT_TRNBTN, 2, 297, 326, 0, 27, 0x20000000 | SPR_TOOLBAR_WATER, STR_ADJUST_WATER_TIP }, // 100 0x009A98C4
|
||||
{ WWT_TRNBTN, 2, 327, 356, 0, 27, 0x20000000 | SPR_TOOLBAR_SCENERY, STR_PLACE_SCENERY_TIP }, // 200 0x009A98D4
|
||||
{ WWT_TRNBTN, 2, 357, 386, 0, 27, 0x20000000 | SPR_TOOLBAR_FOOTPATH, STR_BUILD_FOOTPATH_TIP }, // 400 0x009A98E4
|
||||
{ WWT_TRNBTN, 2, 387, 416, 0, 27, 0x20000000 | SPR_TOOLBAR_CONSTRUCT_RIDE, STR_BUILD_RIDE_TIP }, // 800 0x009A98F4
|
||||
{ WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 1000 0x009A9904
|
||||
{ WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 2000 0x009A9914
|
||||
{ WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 4000 0x009A9924
|
||||
{ WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 8000 0x009A9934
|
||||
{ WWT_TRNBTN, 2, 560, 589, 0, 27, 0x20000000 | SPR_TOOLBAR_CLEAR_SCENERY, STR_CLEAR_SCENERY_TIP }, // 10000 0x009A9944
|
||||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
static void window_editor_top_toolbar_emptysub() { }
|
||||
|
||||
static void window_editor_top_toolbar_mouseup();
|
||||
static void window_editor_top_toolbar_resize();
|
||||
static void window_editor_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget);
|
||||
static void window_editor_top_toolbar_dropdown();
|
||||
static void window_editor_top_toolbar_invalidate();
|
||||
static void window_editor_top_toolbar_paint();
|
||||
|
||||
static void* window_editor_top_toolbar_events[] = {
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_mouseup, //(void*)0x0066f9d7, // mouseup
|
||||
window_editor_top_toolbar_resize, //(void*)0x0066fada, // resize
|
||||
window_editor_top_toolbar_mousedown, //(void*)0x0066fa57, // mousedown
|
||||
window_editor_top_toolbar_dropdown, //(void*)0x0066fa38, // dropdown
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
(void*)0x0066fb0e,
|
||||
(void*)0x0066fb5c,
|
||||
(void*)0x0066fb37,
|
||||
(void*)0x0066fc44,
|
||||
(void*)0x0066fa74,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_emptysub,
|
||||
window_editor_top_toolbar_invalidate, // (void*)0x0066f87d, // oninvalidate
|
||||
window_editor_top_toolbar_paint, //(void*)0x0066f9d1, // onpaint
|
||||
window_editor_top_toolbar_emptysub
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates the main editor top toolbar window.
|
||||
* rct2: 0x0066EFC8 (part of 0x0066EF38)
|
||||
*/
|
||||
void window_editor_top_toolbar_open()
|
||||
{
|
||||
rct_window* window;
|
||||
|
||||
window = window_create(0, 0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 28,
|
||||
(uint32*)window_editor_top_toolbar_events,
|
||||
WC_TOP_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5);
|
||||
window->widgets = window_editor_top_toolbar_widgets;
|
||||
|
||||
window->enabled_widgets |=
|
||||
(1 << WIDX_ZOOM_IN) |
|
||||
(1 << WIDX_ZOOM_OUT) |
|
||||
(1 << WIDX_ROTATE) |
|
||||
(1 << WIDX_FILE_MENU) |
|
||||
(1 << WIDX_LAND) |
|
||||
(1 << WIDX_VIEW_MENU) |
|
||||
(1 << WIDX_SCENERY) |
|
||||
(1 << WIDX_WATER) |
|
||||
(1 << WIDX_PATH) |
|
||||
(1 << WIDX_MAP) |
|
||||
(1 << WIDX_CONSTRUCT_RIDE) |
|
||||
(1 << WIDX_CLEAR_SCENERY);
|
||||
|
||||
window_init_scroll_widgets(window);
|
||||
window->colours[0] = 7;
|
||||
window->colours[1] = 12;
|
||||
window->colours[2] = 24;
|
||||
window->colours[3] = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066C957
|
||||
*/
|
||||
static void window_editor_top_toolbar_mouseup()
|
||||
{
|
||||
short widgetIndex;
|
||||
rct_window *w, *mainWindow;
|
||||
|
||||
window_widget_get_registers(w, widgetIndex);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_ZOOM_IN:
|
||||
if ((mainWindow = window_get_main()) != NULL)
|
||||
window_zoom_in(mainWindow);
|
||||
break;
|
||||
case WIDX_ZOOM_OUT:
|
||||
if ((mainWindow = window_get_main()) != NULL)
|
||||
window_zoom_out(mainWindow);
|
||||
break;
|
||||
case WIDX_ROTATE:
|
||||
if ((mainWindow = window_get_main()) != NULL)
|
||||
window_rotate_camera(mainWindow);
|
||||
break;
|
||||
case WIDX_SCENERY:
|
||||
if (!tool_set(w, WIDX_SCENERY, 0)) {
|
||||
RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 6);
|
||||
window_scenery_open();
|
||||
}
|
||||
break;
|
||||
case WIDX_PATH:
|
||||
toggle_footpath_window();
|
||||
break;
|
||||
case WIDX_LAND:
|
||||
toggle_land_window(w, WIDX_LAND);
|
||||
break;
|
||||
case WIDX_CLEAR_SCENERY:
|
||||
toggle_clear_scenery_window(w, WIDX_CLEAR_SCENERY);
|
||||
break;
|
||||
case WIDX_WATER:
|
||||
toggle_water_window(w, WIDX_WATER);
|
||||
break;
|
||||
case WIDX_MAP:
|
||||
window_map_open();
|
||||
break;
|
||||
case WIDX_CONSTRUCT_RIDE:
|
||||
window_new_ride_open();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066FADA
|
||||
*/
|
||||
static void window_editor_top_toolbar_resize() {
|
||||
rct_window *mainWindow = window_get_main();
|
||||
rct_window *w;
|
||||
|
||||
window_get_register(w);
|
||||
|
||||
int eax = 0;
|
||||
|
||||
if ((w->disabled_widgets & 0xFF) == 0)
|
||||
eax |= (1 << 3);
|
||||
|
||||
if ((w->disabled_widgets & 0xFF) == 3)
|
||||
eax |= (1 << 2);
|
||||
|
||||
RCT2_CALLPROC_X(0x006ECE14, 0, 0, 0, 0, (int)w, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066FA57
|
||||
*/
|
||||
static void window_editor_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget)
|
||||
{
|
||||
if (widgetIndex == WIDX_FILE_MENU) {
|
||||
short dropdownItemCount = 8;
|
||||
gDropdownItemsFormat[0] = STR_LOAD_LANDSCAPE;
|
||||
gDropdownItemsFormat[1] = STR_SAVE_LANDSCAPE;
|
||||
gDropdownItemsFormat[2] = 0;
|
||||
gDropdownItemsFormat[3] = STR_ABOUT;
|
||||
gDropdownItemsFormat[4] = STR_OPTIONS;
|
||||
gDropdownItemsFormat[5] = STR_SCREENSHOT;
|
||||
gDropdownItemsFormat[6] = 0;
|
||||
gDropdownItemsFormat[7] = STR_QUIT_SCENARIO_EDITOR;
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) {
|
||||
dropdownItemCount = 5;
|
||||
gDropdownItemsFormat[0] = STR_ABOUT;
|
||||
gDropdownItemsFormat[1] = STR_OPTIONS;
|
||||
gDropdownItemsFormat[2] = STR_SCREENSHOT;
|
||||
gDropdownItemsFormat[3] = 0;
|
||||
gDropdownItemsFormat[4] = STR_QUIT_TRACK_DESIGNS_MANAGER;
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) {
|
||||
gDropdownItemsFormat[4] = STR_QUIT_ROLLERCOASTER_DESIGNER;
|
||||
}
|
||||
}
|
||||
|
||||
window_dropdown_show_text(w->x + widget->left, w->y + widget->top,
|
||||
widget->bottom - widget->top + 1, w->colours[0] | 0x80, 0x80, dropdownItemCount);
|
||||
} else if (widgetIndex == WIDX_VIEW_MENU) {
|
||||
top_toolbar_init_view_menu(w, widget);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066FA38
|
||||
*/
|
||||
void window_editor_top_toolbar_dropdown() {
|
||||
short widgetIndex, dropdownIndex;
|
||||
rct_window* w;
|
||||
|
||||
window_dropdown_get_registers(w, widgetIndex, dropdownIndex);
|
||||
|
||||
if (widgetIndex == WIDX_FILE_MENU) {
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) {
|
||||
if (dropdownIndex == DDIDX_TD_ABOUT) {
|
||||
window_about_open();
|
||||
} else if (dropdownIndex == DDIDX_TD_OPTIONS) {
|
||||
window_options_open();
|
||||
} else if (dropdownIndex == DDIDX_TD_SCREENSHOT) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREENSHOT_COUNTDOWN, sint8) = 10;
|
||||
} else if (dropdownIndex == DDIDX_TD_QUIT_GAME) {
|
||||
window_close_by_number(WC_MANAGE_TRACK_DESIGN, w->number);
|
||||
window_close_by_number(WC_TRACK_DELETE_PROMPT, w->number);
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0);
|
||||
}
|
||||
} else {
|
||||
if (dropdownIndex == DDIDX_SE_LOAD_LANDSCAPE) {
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0);
|
||||
} else if (dropdownIndex == DDIDX_SE_SAVE_LANDSCAPE) {
|
||||
RCT2_CALLPROC(0x0066FE2A);
|
||||
} else if (dropdownIndex == DDIDX_SE_ABOUT) {
|
||||
window_about_open();
|
||||
} else if (dropdownIndex == DDIDX_SE_OPTIONS) {
|
||||
window_options_open();
|
||||
} else if (dropdownIndex == DDIDX_SE_SCREENSHOT) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREENSHOT_COUNTDOWN, sint8) = 10;
|
||||
} else if (dropdownIndex == DDIDX_SE_QUIT_GAME) {
|
||||
window_close_by_number(WC_MANAGE_TRACK_DESIGN, w->number);
|
||||
window_close_by_number(WC_TRACK_DELETE_PROMPT, w->number);
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0);
|
||||
}
|
||||
}
|
||||
} else if (widgetIndex == WIDX_VIEW_MENU) {
|
||||
top_toolbar_view_menu_dropdown(dropdownIndex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066F87D
|
||||
*/
|
||||
void window_editor_top_toolbar_invalidate()
|
||||
{
|
||||
rct_window *w;
|
||||
|
||||
window_get_register(w);
|
||||
|
||||
sint16 screenWidth = max(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 640);
|
||||
|
||||
window_editor_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].left = screenWidth - 30;
|
||||
window_editor_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].right =
|
||||
window_editor_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].left + 29;
|
||||
|
||||
window_editor_top_toolbar_widgets[WIDX_PATH].left = screenWidth - 30;
|
||||
window_editor_top_toolbar_widgets[WIDX_PATH].right =
|
||||
window_editor_top_toolbar_widgets[WIDX_PATH].left + 29;
|
||||
|
||||
window_editor_top_toolbar_widgets[WIDX_SCENERY].left =
|
||||
window_editor_top_toolbar_widgets[WIDX_PATH].left - 30;
|
||||
window_editor_top_toolbar_widgets[WIDX_SCENERY].right =
|
||||
window_editor_top_toolbar_widgets[WIDX_SCENERY].left + 29;
|
||||
|
||||
window_editor_top_toolbar_widgets[WIDX_WATER].left =
|
||||
window_editor_top_toolbar_widgets[WIDX_SCENERY].left - 30;
|
||||
window_editor_top_toolbar_widgets[WIDX_WATER].right =
|
||||
window_editor_top_toolbar_widgets[WIDX_WATER].left + 29;
|
||||
|
||||
window_editor_top_toolbar_widgets[WIDX_LAND].left =
|
||||
window_editor_top_toolbar_widgets[WIDX_WATER].left - 30;
|
||||
window_editor_top_toolbar_widgets[WIDX_LAND].right =
|
||||
window_editor_top_toolbar_widgets[WIDX_LAND].left + 29;
|
||||
|
||||
window_editor_top_toolbar_widgets[WIDX_CLEAR_SCENERY].left =
|
||||
window_editor_top_toolbar_widgets[WIDX_LAND].left - 30;
|
||||
window_editor_top_toolbar_widgets[WIDX_CLEAR_SCENERY].right =
|
||||
window_editor_top_toolbar_widgets[WIDX_CLEAR_SCENERY].left + 29;
|
||||
|
||||
window_editor_top_toolbar_widgets[WIDX_ZOOM_OUT].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_ZOOM_IN].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_ROTATE].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_VIEW_MENU].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_MAP].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_CLEAR_SCENERY].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_LAND].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_WATER].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_SCENERY].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_PATH].type = WWT_EMPTY;
|
||||
window_editor_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].type = WWT_EMPTY;
|
||||
|
||||
|
||||
if (g_editor_step == EDITOR_STEP_LANDSCAPE_EDITOR) {
|
||||
window_editor_top_toolbar_widgets[WIDX_ZOOM_OUT].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_ZOOM_IN].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_ROTATE].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_VIEW_MENU].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_MAP].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_CLEAR_SCENERY].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_LAND].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_WATER].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_SCENERY].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_PATH].type = WWT_TRNBTN;
|
||||
} else if (g_editor_step == EDITOR_STEP_ROLLERCOASTER_DESIGNER) {
|
||||
window_editor_top_toolbar_widgets[WIDX_ZOOM_OUT].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_ZOOM_IN].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_ROTATE].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_VIEW_MENU].type = WWT_TRNBTN;
|
||||
window_editor_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].type = WWT_TRNBTN;
|
||||
}
|
||||
|
||||
if (window_find_by_class(0x94) == NULL)
|
||||
w->pressed_widgets &= ~(1 << WIDX_PATH);
|
||||
else
|
||||
w->pressed_widgets |= (1 << WIDX_PATH);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066F9D1
|
||||
*/
|
||||
static void window_editor_top_toolbar_paint()
|
||||
{
|
||||
rct_window *w;
|
||||
rct_drawpixelinfo *dpi;
|
||||
|
||||
window_paint_get_registers(w, dpi);
|
||||
|
||||
window_draw_widgets(w, dpi);
|
||||
}
|
|
@ -508,6 +508,17 @@ static uint32 window_finances_page_enabled_widgets[] = {
|
|||
(1 << WIDX_SCENERY_AND_THEMING)
|
||||
};
|
||||
|
||||
static uint32 window_finances_page_hold_down_widgets[] = {
|
||||
(1 << WIDX_LOAN_INCREASE) |
|
||||
(1 << WIDX_LOAN_DECREASE),
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
const int window_finances_tab_animation_loops[] = { 16, 32, 32, 32, 38, 16 };
|
||||
|
@ -527,28 +538,24 @@ void window_finances_open()
|
|||
w = window_bring_to_front_by_class(WC_FINANCES);
|
||||
if (w == NULL) {
|
||||
w = window_create_auto_pos(530, 257, window_finances_page_events[0], WC_FINANCES, WF_10);
|
||||
w->widgets = window_finances_page_widgets[0];
|
||||
w->enabled_widgets = 0x1BF4;
|
||||
w->number = 0;
|
||||
w->page = 0;
|
||||
w->frame_no = 0;
|
||||
w->disabled_widgets = 0;
|
||||
w->colours[0] = 1;
|
||||
w->colours[1] = 19;
|
||||
w->colours[2] = 19;
|
||||
research_update_uncompleted_types();
|
||||
}
|
||||
|
||||
w->page = 0;
|
||||
w->page = WINDOW_FINANCES_PAGE_SUMMARY;
|
||||
window_invalidate(w);
|
||||
w->width = 530;
|
||||
w->height = 257;
|
||||
window_invalidate(w);
|
||||
|
||||
w->widgets = window_finances_page_widgets[0];
|
||||
w->enabled_widgets = window_finances_page_enabled_widgets[0];
|
||||
w->var_020 = RCT2_GLOBAL(0x00988E3C, uint32);
|
||||
w->event_handlers = window_finances_page_events[0];
|
||||
w->widgets = window_finances_page_widgets[WINDOW_FINANCES_PAGE_SUMMARY];
|
||||
w->enabled_widgets = window_finances_page_enabled_widgets[WINDOW_FINANCES_PAGE_SUMMARY];
|
||||
w->hold_down_widgets = window_finances_page_hold_down_widgets[WINDOW_FINANCES_PAGE_SUMMARY];
|
||||
w->event_handlers = window_finances_page_events[WINDOW_FINANCES_PAGE_SUMMARY];
|
||||
w->pressed_widgets = 0;
|
||||
w->disabled_widgets = 0;
|
||||
window_init_scroll_widgets(w);
|
||||
|
@ -599,13 +606,13 @@ static void window_finances_summary_mousedown(int widgetIndex, rct_window*w, rct
|
|||
case WIDX_LOAN_INCREASE:
|
||||
newLoan = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) + MONEY(1000, 00);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_BORROW_ANY_MORE_MONEY;
|
||||
game_do_command(0, 1, 0, newLoan, GAME_COMMAND_SET_CURRENT_LOAN, 0, 0);
|
||||
finance_set_loan(newLoan);
|
||||
break;
|
||||
case WIDX_LOAN_DECREASE:
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) > 0) {
|
||||
newLoan = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) - MONEY(1000, 00);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_PAY_BACK_LOAN;
|
||||
game_do_command(0, 1, 0, newLoan, GAME_COMMAND_SET_CURRENT_LOAN, 0, 0);
|
||||
finance_set_loan(newLoan);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -1177,9 +1184,8 @@ static void window_finances_marketing_invalidate()
|
|||
|
||||
// Count number of active campaigns
|
||||
int numActiveCampaigns = 0;
|
||||
uint8 *campaignDaysLeft = RCT2_ADDRESS(0x01358102, uint8);
|
||||
for (i = 0; i < ADVERTISING_CAMPAIGN_COUNT; i++)
|
||||
if (campaignDaysLeft[i] != 0)
|
||||
if (gMarketingCampaignDaysLeft[i] != 0)
|
||||
numActiveCampaigns++;
|
||||
|
||||
int y = max(1, numActiveCampaigns) * 10 + 92;
|
||||
|
@ -1204,7 +1210,7 @@ static void window_finances_marketing_invalidate()
|
|||
continue;
|
||||
}
|
||||
|
||||
if (campaignDaysLeft[i] != 0)
|
||||
if (gMarketingCampaignDaysLeft[i] != 0)
|
||||
continue;
|
||||
|
||||
campaginButton->type = WWT_DROPDOWN_BUTTON;
|
||||
|
@ -1235,27 +1241,24 @@ static void window_finances_marketing_paint()
|
|||
y = w->y + 62;
|
||||
|
||||
int noCampaignsActive = 1;
|
||||
uint8 *campaignDaysLeft = RCT2_ADDRESS(0x01358102, uint8);
|
||||
uint8 *campaignRideIndex = RCT2_ADDRESS(0x01358116, uint8);
|
||||
|
||||
for (i = 0; i < ADVERTISING_CAMPAIGN_COUNT; i++) {
|
||||
if (campaignDaysLeft[i] == 0)
|
||||
if (gMarketingCampaignDaysLeft[i] == 0)
|
||||
continue;
|
||||
|
||||
noCampaignsActive = 0;
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32);
|
||||
|
||||
// Set special parameters
|
||||
switch (i) {
|
||||
case ADVERTISING_CAMPAIGN_RIDE_FREE:
|
||||
case ADVERTISING_CAMPAIGN_RIDE:
|
||||
ride = GET_RIDE(campaignRideIndex[i]);
|
||||
ride = GET_RIDE(gMarketingCampaignRideIndex[i]);
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = ride->name;
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments;
|
||||
break;
|
||||
case ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE:
|
||||
shopString = campaignRideIndex[i] + 2016; // STR_BALLOONS+
|
||||
shopString = gMarketingCampaignRideIndex[i] + 2016; // STR_BALLOONS+
|
||||
if (shopString >= 2048) // STR_AN_UMBRELLA
|
||||
shopString += 96; // STR_ON_RIDE_PHOTOS+
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = shopString;
|
||||
|
@ -1266,7 +1269,7 @@ static void window_finances_marketing_paint()
|
|||
gfx_draw_string_left_clipped(dpi, STR_VOUCHERS_FOR_FREE_ENTRY_TO + i, (void*)0x013CE952, 0, x + 4, y, 296);
|
||||
|
||||
// Duration
|
||||
weeksRemainingStringId = (STR_MARKETING_1_WEEK - 1) + (campaignDaysLeft[i] % 128);
|
||||
weeksRemainingStringId = (STR_MARKETING_1_WEEK - 1) + (gMarketingCampaignDaysLeft[i] % 128);
|
||||
gfx_draw_string_left(dpi, STR_MARKETING_WEEKS_REMAINING, &weeksRemainingStringId, 0, x + 304, y);
|
||||
|
||||
y += 10;
|
||||
|
@ -1294,7 +1297,7 @@ static void window_finances_marketing_paint()
|
|||
continue;
|
||||
}
|
||||
|
||||
if (campaignDaysLeft[i] != 0)
|
||||
if (gMarketingCampaignDaysLeft[i] != 0)
|
||||
continue;
|
||||
|
||||
money32 pricePerWeek = AdvertisingCampaignPricePerWeek[i];
|
||||
|
@ -1344,7 +1347,7 @@ static void window_finances_research_mouseup()
|
|||
case WIDX_SCENERY_AND_THEMING:
|
||||
activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16);
|
||||
activeResearchTypes ^= 1 << (widgetIndex - WIDX_TRANSPORT_RIDES);
|
||||
game_do_command(0, (1 << 8) | 1, 0, activeResearchTypes, GAME_COMMAND_SET_RESEARCH_FUNDING, 0, 0);
|
||||
research_set_priority(activeResearchTypes);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1396,7 +1399,7 @@ static void window_finances_research_dropdown()
|
|||
if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON || dropdownIndex == -1)
|
||||
return;
|
||||
|
||||
game_do_command(0, 1, 0, dropdownIndex, GAME_COMMAND_SET_RESEARCH_FUNDING, 0, 0);
|
||||
research_set_funding(dropdownIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1493,7 +1496,7 @@ static void window_finances_set_page(rct_window *w, int page)
|
|||
}
|
||||
|
||||
w->enabled_widgets = window_finances_page_enabled_widgets[page];
|
||||
w->var_020 = RCT2_ADDRESS(0x00988E3C, uint32)[page];
|
||||
w->hold_down_widgets = window_finances_page_hold_down_widgets[page];
|
||||
w->event_handlers = window_finances_page_events[page];
|
||||
w->widgets = window_finances_page_widgets[page];
|
||||
w->disabled_widgets = 0;
|
||||
|
|
|
@ -728,7 +728,7 @@ static void window_footpath_start_bridge_at_point(int screenX, int screenY)
|
|||
if (x == 0x8000)
|
||||
return;
|
||||
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_SURFACE) {
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_SURFACE) {
|
||||
// ?
|
||||
uint8 dl = ((mapElement->properties.surface.slope & 0x0F) << direction) & 0xFF;
|
||||
uint8 dh = dl;
|
||||
|
@ -739,7 +739,7 @@ static void window_footpath_start_bridge_at_point(int screenX, int screenY)
|
|||
z += 2;
|
||||
} else {
|
||||
z = mapElement->base_height;
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_PATH) {
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) {
|
||||
if (mapElement->properties.path.type & 4) {
|
||||
if (direction == (mapElement->properties.path.type & 3))
|
||||
z += 2;
|
||||
|
@ -837,9 +837,9 @@ static rct_map_element *footpath_get_map_element_to_remove()
|
|||
z = (RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_Z, uint16) >> 3) & 0xFF;
|
||||
zLow = z - 2;
|
||||
|
||||
mapElement = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*)[y * 256 + x];
|
||||
mapElement = map_get_first_element_at(x, y);
|
||||
do {
|
||||
if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_PATH) {
|
||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) {
|
||||
if (mapElement->base_height == z) {
|
||||
if (mapElement->properties.path.type & 4)
|
||||
if (((mapElement->properties.path.type & 3) ^ 2) != RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8))
|
||||
|
@ -854,7 +854,7 @@ static rct_map_element *footpath_get_map_element_to_remove()
|
|||
return mapElement;
|
||||
}
|
||||
}
|
||||
} while (!((mapElement++)->flags & MAP_ELEMENT_FLAG_LAST_TILE));
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -47,21 +47,26 @@ enum WINDOW_GAME_BOTTOM_TOOLBAR_WIDGET_IDX {
|
|||
WIDX_DATE
|
||||
};
|
||||
|
||||
|
||||
// Right panel needs to be a bit bigger than original so dates like "22nd September, Year 126" can fit.
|
||||
// Left panel size was also increased for symmetry.
|
||||
#define WIDTH_MOD 22
|
||||
|
||||
rct_widget window_game_bottom_toolbar_widgets[] = {
|
||||
{ WWT_IMGBTN, 0, 0x0000, 0x0077, 0, 33, 0xFFFFFFFF, STR_NONE }, // Left outset panel
|
||||
{ WWT_IMGBTN, 0, 0x0002, 0x0075, 2, 31, 0xFFFFFFFF, STR_NONE }, // Left inset panel
|
||||
{ WWT_FLATBTN, 0, 0x0002, 0x0075, 1, 12, 0xFFFFFFFF, STR_PROFIT_PER_WEEK_AND_PARK_VALUE_TIP }, // Money window
|
||||
{ WWT_FLATBTN, 0, 0x0002, 0x0075, 11, 22, 0xFFFFFFFF, STR_NONE }, // Guests window
|
||||
{ WWT_FLATBTN, 0, 0x0002, 0x0075, 21, 31, 0xFFFFFFFF, STR_PARK_RATING_TIP }, // Park rating window
|
||||
{ WWT_IMGBTN, 0, 0x0000, 0x0077+WIDTH_MOD, 0, 33, 0xFFFFFFFF, STR_NONE }, // Left outset panel
|
||||
{ WWT_IMGBTN, 0, 0x0002, 0x0075+WIDTH_MOD, 2, 31, 0xFFFFFFFF, STR_NONE }, // Left inset panel
|
||||
{ WWT_FLATBTN, 0, 0x0002, 0x0075+WIDTH_MOD, 1, 12, 0xFFFFFFFF, STR_PROFIT_PER_WEEK_AND_PARK_VALUE_TIP }, // Money window
|
||||
{ WWT_FLATBTN, 0, 0x0002, 0x0075+WIDTH_MOD, 11, 22, 0xFFFFFFFF, STR_NONE }, // Guests window
|
||||
{ WWT_FLATBTN, 0, 0x0002, 0x0075+WIDTH_MOD, 21, 31, 0xFFFFFFFF, STR_PARK_RATING_TIP }, // Park rating window
|
||||
|
||||
{ WWT_IMGBTN, 2, 0x0078, 0x0207, 0, 33, 0xFFFFFFFF, STR_NONE }, // Middle outset panel
|
||||
{ WWT_25, 2, 0x007A, 0x0205, 2, 31, 0xFFFFFFFF, STR_NONE }, // Middle inset panel
|
||||
{ WWT_FLATBTN, 2, 0x007D, 0x0094, 5, 28, 0xFFFFFFFF, STR_SHOW_SUBJECT_TIP }, // Associated news item window
|
||||
{ WWT_FLATBTN, 2, 0x01EB, 0x0202, 5, 28, SPR_LOCATE, STR_LOCATE_SUBJECT_TIP }, // Scroll to news item target
|
||||
{ WWT_IMGBTN, 2, 0x0078+WIDTH_MOD, 0x0207-WIDTH_MOD, 0, 33, 0xFFFFFFFF, STR_NONE }, // Middle outset panel
|
||||
{ WWT_25, 2, 0x007A+WIDTH_MOD, 0x0205-WIDTH_MOD, 2, 31, 0xFFFFFFFF, STR_NONE }, // Middle inset panel
|
||||
{ WWT_FLATBTN, 2, 0x007D+WIDTH_MOD, 0x0094+WIDTH_MOD, 5, 28, 0xFFFFFFFF, STR_SHOW_SUBJECT_TIP }, // Associated news item window
|
||||
{ WWT_FLATBTN, 2, 0x01EB-WIDTH_MOD, 0x0202-WIDTH_MOD, 5, 28, SPR_LOCATE, STR_LOCATE_SUBJECT_TIP }, // Scroll to news item target
|
||||
|
||||
{ WWT_IMGBTN, 0, 0x0208, 0x027F, 0, 33, 0xFFFFFFFF, STR_NONE }, // Right outset panel
|
||||
{ WWT_IMGBTN, 0, 0x020A, 0x027D, 2, 31, 0xFFFFFFFF, STR_NONE }, // Right inset panel
|
||||
{ WWT_FLATBTN, 0, 0x020A, 0x027D, 2, 13, 0xFFFFFFFF, 2290 }, // Date
|
||||
{ WWT_IMGBTN, 0, 0x0208-WIDTH_MOD, 0x027F, 0, 33, 0xFFFFFFFF, STR_NONE }, // Right outset panel
|
||||
{ WWT_IMGBTN, 0, 0x020A-WIDTH_MOD, 0x027D, 2, 31, 0xFFFFFFFF, STR_NONE }, // Right inset panel
|
||||
{ WWT_FLATBTN, 0, 0x020A-WIDTH_MOD, 0x027D, 2, 13, 0xFFFFFFFF, 2290 }, // Date
|
||||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
|
@ -268,7 +273,7 @@ static void window_game_bottom_toolbar_invalidate()
|
|||
window_game_bottom_toolbar_widgets[WIDX_RIGHT_OUTSET].right = x;
|
||||
x -= 2;
|
||||
window_game_bottom_toolbar_widgets[WIDX_RIGHT_INSET].right = x;
|
||||
x -= 115;
|
||||
x -= (115 + WIDTH_MOD);
|
||||
window_game_bottom_toolbar_widgets[WIDX_RIGHT_INSET].left = x;
|
||||
x -= 2;
|
||||
window_game_bottom_toolbar_widgets[WIDX_RIGHT_OUTSET].left = x;
|
||||
|
@ -441,16 +446,16 @@ static void window_game_bottom_toolbar_draw_park_rating(rct_drawpixelinfo *dpi,
|
|||
{
|
||||
short bar_width;
|
||||
|
||||
bar_width = (factor * 90) / 256;
|
||||
gfx_fill_rect_inset(dpi, x, y + 1, x + 93, y + 9, w->colours[1], 48);
|
||||
if (!(colour & 0x80000000) || RCT2_GLOBAL(0x009DEA6E, uint8) != 0 || (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint8) & 8)) {
|
||||
bar_width = (factor * (90 + WIDTH_MOD)) / 256;
|
||||
gfx_fill_rect_inset(dpi, x, y + 1, x + (93 + WIDTH_MOD), y + 9, w->colours[1], 48);
|
||||
if (!(colour & 0x80000000) || RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 || (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint8) & 8)) {
|
||||
if (bar_width > 2)
|
||||
gfx_fill_rect_inset(dpi, x + 2, y + 2, x + bar_width - 1, y + 8, colour & 0x7FFFFFFF, 0);
|
||||
}
|
||||
|
||||
// Draw thumbs on the sides
|
||||
gfx_draw_sprite(dpi, SPR_RATING_LOW, x - 14, y, 0);
|
||||
gfx_draw_sprite(dpi, SPR_RATING_HIGH, x + 92, y, 0);
|
||||
gfx_draw_sprite(dpi, SPR_RATING_HIGH, x + (92 + WIDTH_MOD), y, 0);
|
||||
}
|
||||
|
||||
static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi, rct_window *w)
|
||||
|
@ -472,20 +477,16 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi,
|
|||
y = window_game_bottom_toolbar_widgets[WIDX_RIGHT_OUTSET].top + w->y + 2;
|
||||
|
||||
// Date
|
||||
char *freeStr = (char*)0x009BC677;
|
||||
freeStr[0] = FORMAT_STRINGID;
|
||||
freeStr[1] = ' ';
|
||||
freeStr[2] = FORMAT_MONTHYEAR;
|
||||
freeStr[3] = 0;
|
||||
|
||||
int month = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7;
|
||||
int year = date_get_year(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16)) + 1;
|
||||
int month = date_get_month(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7);
|
||||
int day = ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) * days_in_month[month]) >> 16) & 0xFF;
|
||||
|
||||
RCT2_GLOBAL(0x013CE952, short) = STR_DATE_DAY_1 + day;
|
||||
RCT2_GLOBAL(0x013CE954, short) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16);
|
||||
RCT2_GLOBAL(0x013CE954, short) = month;
|
||||
RCT2_GLOBAL(0x013CE956, short) = year;
|
||||
gfx_draw_string_centred(
|
||||
dpi,
|
||||
3165,
|
||||
2737,
|
||||
x,
|
||||
y,
|
||||
(RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWCLASS, rct_windowclass) == 2 && RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX, sint32) == WIDX_DATE ? 2 : w->colours[0] & 0x7F),
|
||||
|
|
|
@ -1,719 +0,0 @@
|
|||
/*****************************************************************************
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../game.h"
|
||||
#include "../input.h"
|
||||
#include "../sprites.h"
|
||||
#include "../toolbar.h"
|
||||
#include "../audio/audio.h"
|
||||
#include "../interface/widget.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../interface/viewport.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "dropdown.h"
|
||||
#include "scenery.h"
|
||||
|
||||
enum {
|
||||
WIDX_PAUSE,
|
||||
WIDX_FILE_MENU,
|
||||
WIDX_ZOOM_OUT,
|
||||
WIDX_ZOOM_IN,
|
||||
WIDX_ROTATE,
|
||||
WIDX_VIEW_MENU,
|
||||
WIDX_MAP,
|
||||
|
||||
WIDX_LAND,
|
||||
WIDX_WATER,
|
||||
WIDX_SCENERY,
|
||||
WIDX_PATH,
|
||||
WIDX_CONSTRUCT_RIDE,
|
||||
WIDX_RIDES,
|
||||
WIDX_PARK,
|
||||
WIDX_STAFF,
|
||||
WIDX_GUESTS,
|
||||
WIDX_CLEAR_SCENERY,
|
||||
|
||||
//WIDX_FASTFORWARD,
|
||||
WIDX_FINANCES,
|
||||
WIDX_RESEARCH
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
DDIDX_LOAD_GAME = 0,
|
||||
DDIDX_SAVE_GAME = 1,
|
||||
DDIDX_ABOUT = 3,
|
||||
DDIDX_OPTIONS = 4,
|
||||
DDIDX_SCREENSHOT = 5,
|
||||
DDIDX_QUIT_GAME = 7,
|
||||
} FILE_MENU_DDIDX;
|
||||
|
||||
static rct_widget window_game_top_toolbar_widgets[] = {
|
||||
{ WWT_TRNBTN, 0, 0x0000, 0x001D, 0, 27, 0x20000000 | SPR_TOOLBAR_PAUSE, STR_PAUSE_GAME_TIP }, // Pause
|
||||
{ WWT_TRNBTN, 0, 0x001E + 30, 0x003B + 30, 0, 27, 0x20000000 | SPR_TOOLBAR_FILE, STR_DISC_AND_GAME_OPTIONS_TIP }, // File menu
|
||||
{ WWT_TRNBTN, 1, 0x0046 + 30, 0x0063 + 30, 0, 27, 0x20000000 | SPR_TOOLBAR_ZOOM_OUT, STR_ZOOM_OUT_TIP }, // Zoom out
|
||||
{ WWT_TRNBTN, 1, 0x0064 + 30, 0x0081 + 30, 0, 27, 0x20000000 | SPR_TOOLBAR_ZOOM_IN, STR_ZOOM_IN_TIP }, // Zoom in
|
||||
{ WWT_TRNBTN, 1, 0x0082 + 30, 0x009F + 30, 0, 27, 0x20000000 | SPR_TOOLBAR_ROTATE, STR_ROTATE_TIP }, // Rotate camera
|
||||
{ WWT_TRNBTN, 1, 0x00A0 + 30, 0x00BD + 30, 0, 27, 0x20000000 | SPR_TOOLBAR_VIEW, STR_VIEW_OPTIONS_TIP }, // Transparancy menu
|
||||
{ WWT_TRNBTN, 1, 0x00BE + 30, 0x00DB + 30, 0, 27, 0x20000000 | SPR_TOOLBAR_MAP, STR_SHOW_MAP_TIP }, // Map
|
||||
|
||||
{ WWT_TRNBTN, 2, 0x010B, 0x0128, 0, 27, 0x20000000 | SPR_TOOLBAR_LAND, STR_ADJUST_LAND_TIP }, // Land
|
||||
{ WWT_TRNBTN, 2, 0x0129, 0x0146, 0, 27, 0x20000000 | SPR_TOOLBAR_WATER, STR_ADJUST_WATER_TIP }, // Water
|
||||
{ WWT_TRNBTN, 2, 0x0147, 0x0164, 0, 27, 0x20000000 | SPR_TOOLBAR_SCENERY, STR_PLACE_SCENERY_TIP }, // Scenery
|
||||
{ WWT_TRNBTN, 2, 0x0165, 0x0182, 0, 27, 0x20000000 | SPR_TOOLBAR_FOOTPATH, STR_BUILD_FOOTPATH_TIP }, // Path
|
||||
{ WWT_TRNBTN, 2, 0x0183, 0x01A0, 0, 27, 0x20000000 | SPR_TOOLBAR_CONSTRUCT_RIDE, STR_BUILD_RIDE_TIP }, // Construct ride
|
||||
{ WWT_TRNBTN, 3, 0x01EA, 0x0207, 0, 27, 0x20000000 | SPR_TOOLBAR_RIDES, STR_RIDES_IN_PARK_TIP }, // Rides
|
||||
{ WWT_TRNBTN, 3, 0x0208, 0x0225, 0, 27, 0x20000000 | SPR_TOOLBAR_PARK, STR_PARK_INFORMATION_TIP }, // Park
|
||||
{ WWT_TRNBTN, 3, 0x0226, 0x0243, 0, 27, 0x20000000 | 0x15F9, STR_STAFF_TIP }, // Staff
|
||||
{ WWT_TRNBTN, 3, 0x0230, 0x024D, 0, 27, 0x20000000 | SPR_TOOLBAR_GUESTS, STR_GUESTS_TIP }, // Guests
|
||||
{ WWT_TRNBTN, 2, 0x0230, 0x024D, 0, 27, 0x20000000 | SPR_TOOLBAR_CLEAR_SCENERY, STR_CLEAR_SCENERY_TIP }, // Clear scenery
|
||||
|
||||
//{ WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_NONE }, // Fast forward
|
||||
{ WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 3235 }, // Finances
|
||||
{ WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 2275 }, // Research
|
||||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
static void window_game_top_toolbar_emptysub() { }
|
||||
static void window_game_top_toolbar_mouseup();
|
||||
static void window_game_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget);
|
||||
static void window_game_top_toolbar_dropdown();
|
||||
static void window_game_top_toolbar_tool_update();
|
||||
static void window_game_top_toolbar_tool_down();
|
||||
static void window_game_top_toolbar_tool_drag();
|
||||
static void window_game_top_toolbar_invalidate();
|
||||
static void window_game_top_toolbar_paint();
|
||||
|
||||
static void* window_game_top_toolbar_events[] = {
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_mouseup,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_mousedown,
|
||||
window_game_top_toolbar_dropdown,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_tool_update,
|
||||
window_game_top_toolbar_tool_down,
|
||||
window_game_top_toolbar_tool_drag,
|
||||
(void*)0x0066CC5B,
|
||||
(void*)0x0066CA58,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_emptysub,
|
||||
window_game_top_toolbar_invalidate,
|
||||
window_game_top_toolbar_paint,
|
||||
window_game_top_toolbar_emptysub
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates the main game top toolbar window.
|
||||
* rct2: 0x0066B485 (part of 0x0066B3E8)
|
||||
*/
|
||||
void window_game_top_toolbar_open()
|
||||
{
|
||||
rct_window* window;
|
||||
|
||||
window = window_create(
|
||||
0, 0,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 28,
|
||||
(uint32*)window_game_top_toolbar_events,
|
||||
WC_TOP_TOOLBAR,
|
||||
WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5
|
||||
);
|
||||
window->widgets = window_game_top_toolbar_widgets;
|
||||
|
||||
window->enabled_widgets |=
|
||||
(1 << WIDX_PAUSE) |
|
||||
(1 << WIDX_FILE_MENU) |
|
||||
(1 << WIDX_ZOOM_OUT) |
|
||||
(1 << WIDX_ZOOM_IN) |
|
||||
(1 << WIDX_ROTATE) |
|
||||
(1 << WIDX_VIEW_MENU) |
|
||||
(1 << WIDX_MAP) |
|
||||
(1 << WIDX_LAND) |
|
||||
(1 << WIDX_WATER) |
|
||||
(1 << WIDX_SCENERY) |
|
||||
(1 << WIDX_PATH) |
|
||||
(1 << WIDX_CONSTRUCT_RIDE) |
|
||||
(1 << WIDX_RIDES) |
|
||||
(1 << WIDX_PARK) |
|
||||
(1 << WIDX_STAFF) |
|
||||
(1 << WIDX_GUESTS) |
|
||||
(1 << WIDX_CLEAR_SCENERY) |
|
||||
//(1ULL << WIDX_FASTFORWARD) |
|
||||
(1ULL << WIDX_FINANCES) |
|
||||
(1ULL << WIDX_RESEARCH);
|
||||
|
||||
window_init_scroll_widgets(window);
|
||||
window->colours[0] = 7;
|
||||
window->colours[1] = 12;
|
||||
window->colours[2] = 24;
|
||||
window->colours[3] = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066C957
|
||||
*/
|
||||
static void window_game_top_toolbar_mouseup()
|
||||
{
|
||||
short widgetIndex;
|
||||
rct_window *w, *mainWindow;
|
||||
|
||||
window_widget_get_registers(w, widgetIndex);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_PAUSE:
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_TOGGLE_PAUSE, 0, 0);
|
||||
break;
|
||||
// case WIDX_FASTFORWARD:
|
||||
// // This is an excellent place to add in debugging statements and
|
||||
// // print routines, that will be triggered when you press the
|
||||
// // button in the game. Use "git update-index --skip-worktree
|
||||
// // src/window_game_top_toolbar" to avoid committing these changes to
|
||||
// // version control.
|
||||
// window_cheats_open();
|
||||
// break;
|
||||
|
||||
case WIDX_ZOOM_OUT:
|
||||
if ((mainWindow = window_get_main()) != NULL)
|
||||
window_zoom_out(mainWindow);
|
||||
break;
|
||||
case WIDX_ZOOM_IN:
|
||||
if ((mainWindow = window_get_main()) != NULL)
|
||||
window_zoom_in(mainWindow);
|
||||
break;
|
||||
case WIDX_ROTATE:
|
||||
if ((mainWindow = window_get_main()) != NULL)
|
||||
window_rotate_camera(mainWindow);
|
||||
break;
|
||||
case WIDX_CLEAR_SCENERY:
|
||||
toggle_clear_scenery_window(w, WIDX_CLEAR_SCENERY);
|
||||
break;
|
||||
case WIDX_LAND:
|
||||
toggle_land_window(w, WIDX_LAND);
|
||||
break;
|
||||
case WIDX_WATER:
|
||||
toggle_water_window(w, WIDX_WATER);
|
||||
break;
|
||||
case WIDX_SCENERY:
|
||||
if (!tool_set(w, WIDX_SCENERY, 0)) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6;
|
||||
window_scenery_open();
|
||||
}
|
||||
break;
|
||||
case WIDX_PATH:
|
||||
toggle_footpath_window();
|
||||
break;
|
||||
case WIDX_CONSTRUCT_RIDE:
|
||||
window_new_ride_open();
|
||||
break;
|
||||
case WIDX_RIDES:
|
||||
window_ride_list_open();
|
||||
break;
|
||||
case WIDX_PARK:
|
||||
window_park_entrance_open();
|
||||
break;
|
||||
case WIDX_STAFF:
|
||||
window_staff_list_open();
|
||||
break;
|
||||
case WIDX_GUESTS:
|
||||
window_guest_list_open();
|
||||
break;
|
||||
case WIDX_FINANCES:
|
||||
window_finances_open();
|
||||
break;
|
||||
case WIDX_RESEARCH:
|
||||
window_research_open();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066CA3B
|
||||
*/
|
||||
static void window_game_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget)
|
||||
{
|
||||
switch (widgetIndex) {
|
||||
case WIDX_FILE_MENU:
|
||||
gDropdownItemsFormat[0] = STR_LOAD_GAME;
|
||||
gDropdownItemsFormat[1] = STR_SAVE_GAME;
|
||||
gDropdownItemsFormat[2] = 0;
|
||||
gDropdownItemsFormat[3] = STR_ABOUT;
|
||||
gDropdownItemsFormat[4] = STR_OPTIONS;
|
||||
gDropdownItemsFormat[5] = STR_SCREENSHOT;
|
||||
gDropdownItemsFormat[6] = 0;
|
||||
gDropdownItemsFormat[7] = STR_QUIT_GAME;
|
||||
window_dropdown_show_text(
|
||||
w->x + widget->left,
|
||||
w->y + widget->top,
|
||||
widget->bottom - widget->top + 1,
|
||||
w->colours[0] | 0x80,
|
||||
0x80,
|
||||
8
|
||||
);
|
||||
break;
|
||||
case WIDX_VIEW_MENU:
|
||||
top_toolbar_init_view_menu(w, widget);
|
||||
break;
|
||||
case WIDX_MAP:
|
||||
gDropdownItemsFormat[0] = 2523;
|
||||
gDropdownItemsFormat[1] = 2780;
|
||||
window_dropdown_show_text(
|
||||
w->x + widget->left,
|
||||
w->y + widget->top,
|
||||
widget->bottom - widget->top + 1,
|
||||
w->colours[1] | 0x80,
|
||||
0,
|
||||
2
|
||||
);
|
||||
RCT2_GLOBAL(0x9DEBA2, uint16) = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066C9EA
|
||||
*/
|
||||
static void window_game_top_toolbar_dropdown()
|
||||
{
|
||||
short widgetIndex, dropdownIndex;
|
||||
rct_window* w;
|
||||
|
||||
window_dropdown_get_registers(w, widgetIndex, dropdownIndex);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_FILE_MENU:
|
||||
switch (dropdownIndex) {
|
||||
case DDIDX_LOAD_GAME: // load game
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0);
|
||||
break;
|
||||
case DDIDX_SAVE_GAME: // save game
|
||||
tool_cancel();
|
||||
save_game();
|
||||
break;
|
||||
case DDIDX_ABOUT: // about
|
||||
window_about_open();
|
||||
break;
|
||||
case DDIDX_OPTIONS: // options
|
||||
window_options_open();
|
||||
break;
|
||||
case DDIDX_SCREENSHOT: // screenshot
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREENSHOT_COUNTDOWN, sint8) = 10;
|
||||
break;
|
||||
case DDIDX_QUIT_GAME: // quit game
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case WIDX_VIEW_MENU:
|
||||
top_toolbar_view_menu_dropdown(dropdownIndex);
|
||||
break;
|
||||
case WIDX_MAP:
|
||||
if (dropdownIndex == -1)
|
||||
dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16);
|
||||
switch (dropdownIndex) {
|
||||
case 0:
|
||||
window_map_open();
|
||||
break;
|
||||
case 1:
|
||||
window_viewport_open();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066C810
|
||||
*/
|
||||
static void window_game_top_toolbar_invalidate()
|
||||
{
|
||||
int x;
|
||||
rct_window *w;
|
||||
|
||||
window_get_register(w);
|
||||
|
||||
// Anchor the right half of the buttons to the right
|
||||
x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16);
|
||||
if (x < 640)
|
||||
x = 640;
|
||||
x--;
|
||||
window_game_top_toolbar_widgets[WIDX_GUESTS].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_GUESTS].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_STAFF].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_STAFF].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_PARK].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_PARK].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_RIDES].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_RIDES].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_RESEARCH].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_RESEARCH].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_FINANCES].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_FINANCES].left = x;
|
||||
x -= 11;
|
||||
window_game_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_PATH].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_PATH].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_SCENERY].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_SCENERY].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_WATER].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_WATER].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_LAND].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_LAND].left = x;
|
||||
x -= 1;
|
||||
window_game_top_toolbar_widgets[WIDX_CLEAR_SCENERY].right = x;
|
||||
x -= 29;
|
||||
window_game_top_toolbar_widgets[WIDX_CLEAR_SCENERY].left = x;
|
||||
x = 0;
|
||||
window_game_top_toolbar_widgets[WIDX_PAUSE].left = x;
|
||||
x += 29;
|
||||
window_game_top_toolbar_widgets[WIDX_PAUSE].right = x;
|
||||
// x += 1;
|
||||
// window_game_top_toolbar_widgets[WIDX_FASTFORWARD].left = x;
|
||||
// x += 29;
|
||||
// window_game_top_toolbar_widgets[WIDX_FASTFORWARD].right = x;
|
||||
x += 1;
|
||||
window_game_top_toolbar_widgets[WIDX_FILE_MENU].left = x;
|
||||
x += 29;
|
||||
window_game_top_toolbar_widgets[WIDX_FILE_MENU].right = x;
|
||||
x += 11;
|
||||
window_game_top_toolbar_widgets[WIDX_ZOOM_OUT].left = x;
|
||||
x += 29;
|
||||
window_game_top_toolbar_widgets[WIDX_ZOOM_OUT].right = x;
|
||||
x += 1;
|
||||
window_game_top_toolbar_widgets[WIDX_ZOOM_IN].left = x;
|
||||
x += 29;
|
||||
window_game_top_toolbar_widgets[WIDX_ZOOM_IN].right = x;
|
||||
x += 1;
|
||||
window_game_top_toolbar_widgets[WIDX_ROTATE].left = x;
|
||||
x += 29;
|
||||
window_game_top_toolbar_widgets[WIDX_ROTATE].right = x;
|
||||
x += 1;
|
||||
window_game_top_toolbar_widgets[WIDX_VIEW_MENU].left = x;
|
||||
x += 29;
|
||||
window_game_top_toolbar_widgets[WIDX_VIEW_MENU].right = x;
|
||||
x += 1;
|
||||
window_game_top_toolbar_widgets[WIDX_MAP].left = x;
|
||||
x += 29;
|
||||
window_game_top_toolbar_widgets[WIDX_MAP].right = x;
|
||||
|
||||
// Footpath button pressed down
|
||||
if (window_find_by_class(WC_FOOTPATH) == NULL)
|
||||
w->pressed_widgets &= ~(1 << WIDX_PATH);
|
||||
else
|
||||
w->pressed_widgets |= (1 << WIDX_PATH);
|
||||
|
||||
// Fast forward button pressed down
|
||||
// if (0)
|
||||
// w->pressed_widgets |= (1 << WIDX_FASTFORWARD);
|
||||
// else
|
||||
// w->pressed_widgets &= ~(1 << WIDX_FASTFORWARD);
|
||||
|
||||
if (!(RCT2_GLOBAL(0x009DEA6E, uint32) & 1))
|
||||
w->pressed_widgets &= ~(1 << WIDX_PAUSE);
|
||||
else
|
||||
w->pressed_widgets |= (1 << WIDX_PAUSE);
|
||||
|
||||
// Zoomed out/in disable. Not sure where this code is in the original.
|
||||
if (window_get_main()->viewport->zoom == 0){
|
||||
w->disabled_widgets |= (1 << WIDX_ZOOM_IN);
|
||||
}
|
||||
else if (window_get_main()->viewport->zoom == 3){
|
||||
w->disabled_widgets |= (1 << WIDX_ZOOM_OUT);
|
||||
}
|
||||
else
|
||||
{
|
||||
w->disabled_widgets &= ~((1 << WIDX_ZOOM_IN) | (1 << WIDX_ZOOM_OUT));
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) {
|
||||
window_game_top_toolbar_widgets[WIDX_FINANCES].type = WWT_EMPTY;
|
||||
}
|
||||
else{
|
||||
window_game_top_toolbar_widgets[WIDX_FINANCES].type = WWT_TRNBTN;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066C8EC
|
||||
*/
|
||||
static void window_game_top_toolbar_paint()
|
||||
{
|
||||
int x, y, imgId;
|
||||
rct_window *w;
|
||||
rct_drawpixelinfo *dpi;
|
||||
|
||||
window_paint_get_registers(w, dpi);
|
||||
|
||||
window_draw_widgets(w, dpi);
|
||||
|
||||
// Draw staff button image (setting masks to the staff colours)
|
||||
x = w->x + window_game_top_toolbar_widgets[WIDX_STAFF].left;
|
||||
y = w->y + window_game_top_toolbar_widgets[WIDX_STAFF].top;
|
||||
imgId = 5627;
|
||||
if (widget_is_pressed(w, WIDX_STAFF))
|
||||
imgId++;
|
||||
imgId |= (RCT2_GLOBAL(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8) << 19) | 0xA0000000 | (RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, uint8) << 24);
|
||||
gfx_draw_sprite(dpi, imgId, x, y, 0);
|
||||
|
||||
// Draw research button
|
||||
x = w->x + window_game_top_toolbar_widgets[WIDX_RESEARCH].left - 1;
|
||||
y = w->y + window_game_top_toolbar_widgets[WIDX_RESEARCH].top;
|
||||
imgId = SPR_TAB_FINANCES_RESEARCH_0;
|
||||
gfx_draw_sprite(dpi, imgId, x, y, 0);
|
||||
|
||||
// Draw finances button
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)){
|
||||
x = w->x + window_game_top_toolbar_widgets[WIDX_FINANCES].left + 3;
|
||||
y = w->y + window_game_top_toolbar_widgets[WIDX_FINANCES].top + 1;
|
||||
imgId = SPR_FINANCE;
|
||||
gfx_draw_sprite(dpi, imgId, x, y, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* rct2: 0x6e2cc6
|
||||
*/
|
||||
static void window_game_top_toolbar_scenery_tool_down(short x, short y, rct_window* w, short widgetIndex){
|
||||
RCT2_CALLPROC_EBPSAFE(0x006E2712);
|
||||
if (window_scenery_is_repaint_scenery_tool_on & 1){
|
||||
//6e3158
|
||||
RCT2_CALLPROC_X(0x6E2CC6, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
}
|
||||
|
||||
int selected_tab = window_scenery_selected_scenery_by_tab[window_scenery_active_tab_index];
|
||||
if (selected_tab == -1) return;
|
||||
|
||||
sint16 grid_x, grid_y, grid_z;
|
||||
uint8 item_colour;
|
||||
uint8 model_type;
|
||||
int ebp = selected_tab;
|
||||
|
||||
{
|
||||
int eax = x, ebx = y, ecx = 0, edx = 0, esi = 0, edi = 0;
|
||||
RCT2_CALLFUNC_X(0x6E1F34, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
item_colour = edi;
|
||||
model_type = (ebx & 0xFF00) >> 8;
|
||||
grid_x = eax;
|
||||
grid_y = ecx;
|
||||
grid_z = edx;
|
||||
}
|
||||
|
||||
if (grid_x == 0x8000)return;
|
||||
|
||||
if (ebp >= 1024){
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1161;
|
||||
|
||||
// The return value will be banner id but the input is colour
|
||||
int banner_id = item_colour;
|
||||
|
||||
int ebx = (model_type << 8) | 1;
|
||||
|
||||
{
|
||||
int esi = 0, eax = grid_x, ecx = grid_y, edx = grid_z;
|
||||
game_do_command_p(GAME_COMMAND_50, &eax, &ebx, &ecx, &edx, &esi, &banner_id, &ebp);
|
||||
}
|
||||
|
||||
if (ebx == 0x80000000)return;
|
||||
|
||||
sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16));
|
||||
|
||||
window_banner_open(banner_id);
|
||||
}
|
||||
else if (ebp >= 768){
|
||||
//6e301c
|
||||
RCT2_CALLPROC_X(0x6E2CC6, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
}
|
||||
else if (ebp >= 512){
|
||||
//6e2f2e
|
||||
RCT2_CALLPROC_X(0x6E2CC6, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
}
|
||||
else if (ebp >= 256){
|
||||
//6e2eda
|
||||
RCT2_CALLPROC_X(0x6E2CC6, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
}
|
||||
else{
|
||||
//6e2d2d
|
||||
RCT2_CALLPROC_X(0x6E2CC6, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066CB25
|
||||
*/
|
||||
static void window_game_top_toolbar_tool_update()
|
||||
{
|
||||
short widgetIndex;
|
||||
rct_window *w;
|
||||
short x, y;
|
||||
|
||||
window_tool_get_registers(w, widgetIndex, x, y);
|
||||
|
||||
switch (widgetIndex){
|
||||
case WIDX_CLEAR_SCENERY:
|
||||
RCT2_CALLPROC_X(0x0068E213, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
break;
|
||||
case WIDX_LAND:
|
||||
RCT2_CALLPROC_X(0x00664280, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
break;
|
||||
case WIDX_WATER:
|
||||
RCT2_CALLPROC_X(0x006E6BDC, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
break;
|
||||
case WIDX_SCENERY:
|
||||
RCT2_CALLPROC_X(0x006E287B, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* rct2: 0x0066CB73
|
||||
*/
|
||||
static void window_game_top_toolbar_tool_down(){
|
||||
short widgetIndex;
|
||||
rct_window* w;
|
||||
short x, y;
|
||||
|
||||
window_tool_get_registers(w, widgetIndex, x, y);
|
||||
|
||||
switch (widgetIndex){
|
||||
case WIDX_CLEAR_SCENERY:
|
||||
if (!RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0))
|
||||
break;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 3438;
|
||||
|
||||
game_do_command(
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16),
|
||||
1,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16),
|
||||
0,
|
||||
GAME_COMMAND_CLEAR_SCENERY,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16)
|
||||
);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 12;
|
||||
break;
|
||||
case WIDX_LAND:
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16)&(1 << 0)){
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1387;
|
||||
game_do_command(
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16),
|
||||
1,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) | (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) << 8),
|
||||
GAME_COMMAND_CHANGE_SURFACE_STYLE,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16)
|
||||
);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 3;
|
||||
}
|
||||
break;
|
||||
case WIDX_WATER:
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16)&(1 << 0)){
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 3;
|
||||
}
|
||||
break;
|
||||
case WIDX_SCENERY:
|
||||
window_game_top_toolbar_scenery_tool_down(x, y, w, widgetIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0066CB4E
|
||||
*/
|
||||
static void window_game_top_toolbar_tool_drag()
|
||||
{
|
||||
short widgetIndex;
|
||||
rct_window *w;
|
||||
short x, y;
|
||||
|
||||
window_tool_get_registers(w, widgetIndex, x, y);
|
||||
|
||||
switch (widgetIndex){
|
||||
case WIDX_CLEAR_SCENERY:
|
||||
if (window_find_by_class(WC_ERROR) != NULL)
|
||||
break;
|
||||
|
||||
if (!RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0))
|
||||
break;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 3438;
|
||||
|
||||
game_do_command(
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16),
|
||||
1,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16),
|
||||
0,
|
||||
GAME_COMMAND_CLEAR_SCENERY,
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16),
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16)
|
||||
);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 12;
|
||||
break;
|
||||
case WIDX_LAND:
|
||||
RCT2_CALLPROC_X(0x00664454, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
break;
|
||||
case WIDX_WATER:
|
||||
RCT2_CALLPROC_X(0x006E6D4B, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
break;
|
||||
case WIDX_SCENERY:
|
||||
RCT2_CALLPROC_X(0x006E2CBC, x, y, 0, widgetIndex, (int)w, 0, 0);
|
||||
break;
|
||||
}
|
||||
}
|
|
@ -516,7 +516,7 @@ void window_guest_open(rct_peep* peep){
|
|||
|
||||
window->widgets = window_guest_page_widgets[WINDOW_GUEST_OVERVIEW];
|
||||
window->enabled_widgets = window_guest_page_enabled_widgets[WINDOW_GUEST_OVERVIEW];
|
||||
window->var_020 = RCT2_GLOBAL(0x981D54,uint32);
|
||||
window->hold_down_widgets = 0;
|
||||
window->event_handlers = window_guest_page_events[WINDOW_GUEST_OVERVIEW];
|
||||
window->pressed_widgets = 0;
|
||||
|
||||
|
@ -568,7 +568,7 @@ void window_guest_overview_resize(){
|
|||
window_get_register(w);
|
||||
|
||||
window_guest_disable_widgets(w);
|
||||
RCT2_CALLPROC_EBPSAFE(w->event_handlers[WE_INVALIDATE]);
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
|
||||
|
||||
widget_invalidate(w, WIDX_MARQUEE);
|
||||
|
||||
|
@ -627,7 +627,7 @@ void window_guest_overview_mouse_up(){
|
|||
sprite_move(0x8000, peep->y, peep->z, (rct_sprite*)peep);
|
||||
peep_decrement_num_riders(peep);
|
||||
peep->state = PEEP_STATE_PICKED;
|
||||
peep->var_2C = 0;
|
||||
peep->sub_state = 0;
|
||||
peep_window_state_update(peep);
|
||||
break;
|
||||
case WIDX_RENAME:
|
||||
|
@ -670,7 +670,7 @@ void window_guest_set_page(rct_window* w, int page){
|
|||
}
|
||||
|
||||
w->enabled_widgets = window_guest_page_enabled_widgets[page];
|
||||
w->var_020 = RCT2_ADDRESS(0x981D54,uint32)[page];
|
||||
w->hold_down_widgets = 0;
|
||||
w->event_handlers = window_guest_page_events[page];
|
||||
w->pressed_widgets = 0;
|
||||
w->widgets = window_guest_page_widgets[page];
|
||||
|
@ -1376,7 +1376,7 @@ void window_guest_stats_bars_paint(int value, int x, int y, rct_window *w, rct_d
|
|||
int blink_flag = colour & (1 << 0x1F); //0x80000000
|
||||
colour &= ~(1 << 0x1F);
|
||||
if (!blink_flag ||
|
||||
RCT2_GLOBAL(0x009DEA6E, uint8) != 0 ||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 ||
|
||||
(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 8) == 0)
|
||||
{
|
||||
if (value <= 2)
|
||||
|
|
|
@ -165,7 +165,9 @@ void window_map_open()
|
|||
(1 << WIDX_BUILD_PARK_ENTRANCE) |
|
||||
(1 << WIDX_ROTATE_90) |
|
||||
(1 << WIDX_PEOPLE_STARTING_POSITION);
|
||||
w->var_020 |= 0x300;
|
||||
w->hold_down_widgets =
|
||||
(1 << WIDX_MAP_SIZE_SPINNER_UP) |
|
||||
(1 << WIDX_MAP_SIZE_SPINNER_DOWN);
|
||||
window_init_scroll_widgets(w);
|
||||
|
||||
window_map_set_bounds(w);
|
||||
|
@ -342,10 +344,10 @@ static void window_map_mousedown(int widgetIndex, rct_window*w, rct_widget* widg
|
|||
// The normal map window doesn't have widget 8 or 9.
|
||||
// I assume these widgets refer to the Scenario Editor's map window.
|
||||
if (widgetIndex == 8) {
|
||||
RCT2_CALLPROC_EBPSAFE(0x0068D641);
|
||||
RCT2_CALLPROC_X(0x0068D641, 0, 0, 0, widgetIndex, (int)w, 0, 0);
|
||||
}
|
||||
else if (widgetIndex == 9) {
|
||||
RCT2_CALLPROC_EBPSAFE(0x0068D6B4);
|
||||
RCT2_CALLPROC_X(0x0068D6B4, 0, 0, 0, widgetIndex, (int)w, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -355,7 +357,7 @@ static void window_map_mousedown(int widgetIndex, rct_window*w, rct_widget* widg
|
|||
*/
|
||||
static void window_map_update(rct_window *w)
|
||||
{
|
||||
RCT2_CALLPROC_EBPSAFE(0x0068D7FB);
|
||||
RCT2_CALLPROC_X(0x0068D7FB, 0, 0, 0, 0, (int)w, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -381,7 +383,11 @@ static void window_map_scrollgetsize()
|
|||
*/
|
||||
static void window_map_scrollmousedown()
|
||||
{
|
||||
RCT2_CALLPROC_EBPSAFE(0x0068D726);
|
||||
short x, y, scrollIndex;
|
||||
rct_window *w;
|
||||
|
||||
window_scrollmouse_get_registers(w, scrollIndex, x, y);
|
||||
RCT2_CALLPROC_X(0x0068D726, scrollIndex, 0, x, y, (int)w, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -626,11 +632,11 @@ static void window_map_scrollpaint()
|
|||
*g1_element = pushed_g1_element;
|
||||
|
||||
if (w->selected_tab == 0)
|
||||
RCT2_CALLPROC_EBPSAFE(0x68DADA); //draws dots representing guests
|
||||
RCT2_CALLPROC_X(0x68DADA, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing guests
|
||||
else
|
||||
RCT2_CALLPROC_EBPSAFE(0x68DBC1); //draws dots representing trains
|
||||
RCT2_CALLPROC_X(0x68DBC1, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing trains
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x68D8CE); //draws the HUD rectangle on the map
|
||||
RCT2_CALLPROC_X(0x68D8CE, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws the HUD rectangle on the map
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,646 @@
|
|||
/*****************************************************************************
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "../addresses.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../input.h"
|
||||
#include "../interface/widget.h"
|
||||
#include "../interface/viewport.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../sprites.h"
|
||||
#include "../windows/scenery.h"
|
||||
#include "../world/mapgen.h"
|
||||
#include "dropdown.h"
|
||||
|
||||
enum {
|
||||
WINDOW_MAPGEN_PAGE_BASE,
|
||||
WINDOW_MAPGEN_PAGE_RANDOM,
|
||||
WINDOW_MAPGEN_PAGE_COUNT
|
||||
};
|
||||
|
||||
enum {
|
||||
WIDX_BACKGROUND,
|
||||
WIDX_TITLE,
|
||||
WIDX_CLOSE,
|
||||
WIDX_PAGE_BACKGROUND,
|
||||
WIDX_TAB_1,
|
||||
WIDX_TAB_2,
|
||||
|
||||
WIDX_GENERATE,
|
||||
|
||||
WIDX_MAP_SIZE = 7,
|
||||
WIDX_MAP_SIZE_UP,
|
||||
WIDX_MAP_SIZE_DOWN,
|
||||
WIDX_BASE_HEIGHT,
|
||||
WIDX_BASE_HEIGHT_UP,
|
||||
WIDX_BASE_HEIGHT_DOWN,
|
||||
WIDX_WATER_LEVEL,
|
||||
WIDX_WATER_LEVEL_UP,
|
||||
WIDX_WATER_LEVEL_DOWN,
|
||||
WIDX_FLOOR_TEXTURE,
|
||||
WIDX_WALL_TEXTURE,
|
||||
|
||||
WIDX_RANDOM_TERRAIN = 7,
|
||||
WIDX_PLACE_TREES,
|
||||
};
|
||||
|
||||
#pragma region Widgets
|
||||
|
||||
static rct_widget window_mapgen_base_widgets[] = {
|
||||
{ WWT_FRAME, 0, 0, 299, 0, 195, 0xFFFFFFFF, STR_NONE },
|
||||
{ WWT_CAPTION, 0, 1, 298, 1, 14, 2690, STR_WINDOW_TITLE_TIP },
|
||||
{ WWT_CLOSEBOX, 0, 287, 297, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
|
||||
{ WWT_RESIZE, 1, 0, 299, 43, 195, 0xFFFFFFFF, STR_NONE },
|
||||
{ WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_NONE },
|
||||
{ WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_NONE },
|
||||
|
||||
{ WWT_DROPDOWN_BUTTON, 1, 104, 198, 52, 63, 2694, STR_NONE },
|
||||
|
||||
{ WWT_SPINNER, 1, 104, 198, 52, 63, STR_NONE, STR_NONE },
|
||||
{ WWT_DROPDOWN_BUTTON, 1, 187, 197, 53, 57, STR_NUMERIC_UP, STR_NONE },
|
||||
{ WWT_DROPDOWN_BUTTON, 1, 187, 197, 58, 62, STR_NUMERIC_DOWN, STR_NONE },
|
||||
{ WWT_SPINNER, 1, 104, 198, 70, 81, STR_NONE, STR_NONE },
|
||||
{ WWT_DROPDOWN_BUTTON, 1, 187, 197, 71, 75, STR_NUMERIC_UP, STR_NONE },
|
||||
{ WWT_DROPDOWN_BUTTON, 1, 187, 197, 76, 80, STR_NUMERIC_DOWN, STR_NONE },
|
||||
{ WWT_SPINNER, 1, 104, 198, 88, 99, STR_NONE, STR_NONE },
|
||||
{ WWT_DROPDOWN_BUTTON, 1, 187, 197, 89, 93, STR_NUMERIC_UP, STR_NONE },
|
||||
{ WWT_DROPDOWN_BUTTON, 1, 187, 197, 94, 98, STR_NUMERIC_DOWN, STR_NONE },
|
||||
{ WWT_FLATBTN, 1, 104, 150, 106, 141, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP },
|
||||
{ WWT_FLATBTN, 1, 151, 197, 106, 141, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP },
|
||||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
static rct_widget window_mapgen_random_widgets[] = {
|
||||
{ WWT_FRAME, 0, 0, 299, 0, 195, 0xFFFFFFFF, STR_NONE },
|
||||
{ WWT_CAPTION, 0, 1, 298, 1, 14, 2690, STR_WINDOW_TITLE_TIP },
|
||||
{ WWT_CLOSEBOX, 0, 287, 297, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
|
||||
{ WWT_RESIZE, 1, 0, 299, 43, 195, 0xFFFFFFFF, STR_NONE },
|
||||
{ WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_NONE },
|
||||
{ WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_NONE },
|
||||
|
||||
{ WWT_DROPDOWN_BUTTON, 1, 104, 198, 52, 63, 2694, STR_NONE },
|
||||
|
||||
{ WWT_CHECKBOX, 1, 4, 198, 52, 63, 2695, STR_NONE },
|
||||
{ WWT_CHECKBOX, 1, 4, 198, 70, 81, 2696, STR_NONE },
|
||||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
static rct_widget *window_mapgen_page_widgets[] = {
|
||||
window_mapgen_base_widgets,
|
||||
window_mapgen_random_widgets
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Events
|
||||
|
||||
static void window_mapgen_emptysub() { }
|
||||
|
||||
static void window_mapgen_base_mouseup();
|
||||
static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_widget* widget);
|
||||
static void window_mapgen_base_dropdown();
|
||||
static void window_mapgen_base_update(rct_window *w);
|
||||
static void window_mapgen_base_invalidate();
|
||||
static void window_mapgen_base_paint();
|
||||
static void window_mapgen_random_mouseup();
|
||||
static void window_mapgen_random_mousedown(int widgetIndex, rct_window*w, rct_widget* widget);
|
||||
static void window_mapgen_random_update(rct_window *w);
|
||||
static void window_mapgen_random_invalidate();
|
||||
static void window_mapgen_random_paint();
|
||||
|
||||
static void* window_mapgen_base_events[] = {
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_base_mouseup,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_base_mousedown,
|
||||
window_mapgen_base_dropdown,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_base_update,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_base_invalidate,
|
||||
window_mapgen_base_paint,
|
||||
window_mapgen_emptysub
|
||||
};
|
||||
|
||||
static void* window_mapgen_random_events[] = {
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_random_mouseup,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_random_mousedown,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_random_update,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_emptysub,
|
||||
window_mapgen_random_invalidate,
|
||||
window_mapgen_random_paint,
|
||||
window_mapgen_emptysub
|
||||
};
|
||||
|
||||
static void* window_mapgen_page_events[] = {
|
||||
window_mapgen_base_events,
|
||||
window_mapgen_random_events
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Enabled widgets
|
||||
|
||||
static uint32 window_mapgen_page_enabled_widgets[] = {
|
||||
(1 << WIDX_CLOSE) |
|
||||
(1 << WIDX_TAB_1) |
|
||||
(1 << WIDX_TAB_2) |
|
||||
(1 << WIDX_GENERATE) |
|
||||
(1 << WIDX_MAP_SIZE_UP) |
|
||||
(1 << WIDX_MAP_SIZE_DOWN) |
|
||||
(1 << WIDX_BASE_HEIGHT_UP) |
|
||||
(1 << WIDX_BASE_HEIGHT_DOWN) |
|
||||
(1 << WIDX_WATER_LEVEL_UP) |
|
||||
(1 << WIDX_WATER_LEVEL_DOWN) |
|
||||
(1 << WIDX_FLOOR_TEXTURE) |
|
||||
(1 << WIDX_WALL_TEXTURE),
|
||||
|
||||
(1 << WIDX_CLOSE) |
|
||||
(1 << WIDX_TAB_1) |
|
||||
(1 << WIDX_TAB_2) |
|
||||
(1 << WIDX_GENERATE) |
|
||||
(1 << WIDX_RANDOM_TERRAIN) |
|
||||
(1 << WIDX_PLACE_TREES)
|
||||
};
|
||||
|
||||
static uint32 window_mapgen_page_hold_down_widgets[] = {
|
||||
(1 << WIDX_MAP_SIZE_UP) |
|
||||
(1 << WIDX_MAP_SIZE_DOWN) |
|
||||
(1 << WIDX_BASE_HEIGHT_UP) |
|
||||
(1 << WIDX_BASE_HEIGHT_DOWN) |
|
||||
(1 << WIDX_WATER_LEVEL_UP) |
|
||||
(1 << WIDX_WATER_LEVEL_DOWN),
|
||||
|
||||
0
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
const int window_mapgen_tab_animation_loops[] = { 16, 16 };
|
||||
|
||||
static void window_mapgen_set_page(rct_window *w, int page);
|
||||
static void window_mapgen_set_pressed_tab(rct_window *w);
|
||||
static void window_mapgen_anchor_border_widgets(rct_window *w);
|
||||
static void window_mapgen_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w);
|
||||
|
||||
static char window_land_floor_texture_order[] = {
|
||||
TERRAIN_SAND_DARK, TERRAIN_SAND_LIGHT, TERRAIN_DIRT, TERRAIN_GRASS_CLUMPS, TERRAIN_GRASS,
|
||||
TERRAIN_ROCK, TERRAIN_SAND, TERRAIN_MARTIAN, TERRAIN_CHECKERBOARD, TERRAIN_ICE,
|
||||
TERRAIN_GRID_RED, TERRAIN_GRID_YELLOW, TERRAIN_GRID_BLUE, TERRAIN_GRID_GREEN
|
||||
};
|
||||
|
||||
static char window_land_wall_texture_order[] = {
|
||||
TERRAIN_EDGE_ROCK, TERRAIN_EDGE_WOOD_RED,
|
||||
TERRAIN_EDGE_WOOD_BLACK, TERRAIN_EDGE_ICE,
|
||||
0, 0
|
||||
};
|
||||
|
||||
static int _mapSize = 150;
|
||||
static int _baseHeight = 12;
|
||||
static int _waterLevel = 6;
|
||||
static int _floorTexture = TERRAIN_GRASS;
|
||||
static int _wallTexture = TERRAIN_EDGE_ROCK;
|
||||
static int _randomTerrrain = 1;
|
||||
static int _placeTrees = 1;
|
||||
|
||||
rct_window *window_mapgen_open()
|
||||
{
|
||||
rct_window *w;
|
||||
|
||||
w = window_bring_to_front_by_class(WC_MAPGEN);
|
||||
if (w == NULL) {
|
||||
w = window_create(
|
||||
(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 300) / 2,
|
||||
(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 200) / 2,
|
||||
300,
|
||||
200,
|
||||
window_mapgen_page_events[0],
|
||||
WC_MAPGEN,
|
||||
WF_10
|
||||
);
|
||||
w->number = 0;
|
||||
w->frame_no = 0;
|
||||
w->colours[0] = 12;
|
||||
w->colours[1] = 24;
|
||||
w->colours[2] = 24;
|
||||
}
|
||||
|
||||
w->page = WINDOW_MAPGEN_PAGE_BASE;
|
||||
window_invalidate(w);
|
||||
w->widgets = window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_BASE];
|
||||
w->enabled_widgets = window_mapgen_page_enabled_widgets[WINDOW_MAPGEN_PAGE_BASE];
|
||||
w->hold_down_widgets = window_mapgen_page_hold_down_widgets[WINDOW_MAPGEN_PAGE_BASE];
|
||||
w->event_handlers = window_mapgen_page_events[WINDOW_MAPGEN_PAGE_BASE];
|
||||
w->pressed_widgets = 0;
|
||||
w->disabled_widgets = 0;
|
||||
window_init_scroll_widgets(w);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
#pragma region Base page
|
||||
|
||||
static void window_mapgen_base_mouseup()
|
||||
{
|
||||
short widgetIndex;
|
||||
rct_window *w;
|
||||
mapgen_settings mapgenSettings;
|
||||
|
||||
window_widget_get_registers(w, widgetIndex);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_CLOSE:
|
||||
window_close(w);
|
||||
break;
|
||||
case WIDX_TAB_1:
|
||||
case WIDX_TAB_2:
|
||||
window_mapgen_set_page(w, widgetIndex - WIDX_TAB_1);
|
||||
break;
|
||||
case WIDX_GENERATE:
|
||||
mapgenSettings.mapSize = _mapSize;
|
||||
mapgenSettings.height = _baseHeight + 2;
|
||||
mapgenSettings.waterLevel = _waterLevel + 2;
|
||||
mapgenSettings.floor = _floorTexture;
|
||||
mapgenSettings.wall = _wallTexture;
|
||||
|
||||
mapgen_generate_blank(&mapgenSettings);
|
||||
gfx_invalidate_screen();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_widget* widget)
|
||||
{
|
||||
int i;
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_MAP_SIZE_UP:
|
||||
_mapSize = min(_mapSize + 1, 256);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_MAP_SIZE_DOWN:
|
||||
_mapSize = max(_mapSize - 1, 16);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_BASE_HEIGHT_UP:
|
||||
_baseHeight = min(_baseHeight + 2, 60);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_BASE_HEIGHT_DOWN:
|
||||
_baseHeight = max(_baseHeight - 2, 0);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_WATER_LEVEL_UP:
|
||||
_waterLevel = min(_waterLevel + 2, 54);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_WATER_LEVEL_DOWN:
|
||||
_waterLevel = max(_waterLevel - 2, 0);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_FLOOR_TEXTURE:
|
||||
for (i = 0; i < 14; i++) {
|
||||
gDropdownItemsFormat[i] = -1;
|
||||
gDropdownItemsArgs[i] = SPR_FLOOR_TEXTURE_GRASS + window_land_floor_texture_order[i];
|
||||
if (window_land_floor_texture_order[i] == _floorTexture)
|
||||
RCT2_GLOBAL(0x009DEBA2, sint16) = i;
|
||||
}
|
||||
window_dropdown_show_image(
|
||||
w->x + widget->left, w->y + widget->top,
|
||||
widget->bottom - widget->top,
|
||||
w->colours[2],
|
||||
0,
|
||||
14,
|
||||
47, 36,
|
||||
gAppropriateImageDropdownItemsPerRow[14]
|
||||
);
|
||||
break;
|
||||
case WIDX_WALL_TEXTURE:
|
||||
for (i = 0; i < 4; i++) {
|
||||
gDropdownItemsFormat[i] = -1;
|
||||
gDropdownItemsArgs[i] = SPR_WALL_TEXTURE_ROCK + window_land_wall_texture_order[i];
|
||||
if (window_land_wall_texture_order[i] == _wallTexture)
|
||||
RCT2_GLOBAL(0x009DEBA2, sint16) = i;
|
||||
}
|
||||
window_dropdown_show_image(
|
||||
w->x + widget->left, w->y + widget->top,
|
||||
widget->bottom - widget->top,
|
||||
w->colours[2],
|
||||
0,
|
||||
4,
|
||||
47, 36,
|
||||
gAppropriateImageDropdownItemsPerRow[4]
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void window_mapgen_base_dropdown()
|
||||
{
|
||||
int type;
|
||||
short dropdownIndex, widgetIndex;
|
||||
rct_window *w;
|
||||
|
||||
window_dropdown_get_registers(w, widgetIndex, dropdownIndex);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_FLOOR_TEXTURE:
|
||||
if (dropdownIndex == -1)
|
||||
dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16);
|
||||
|
||||
type = (dropdownIndex == -1) ?
|
||||
_floorTexture :
|
||||
*((uint32*)&gDropdownItemsArgs[dropdownIndex]) - SPR_FLOOR_TEXTURE_GRASS;
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) == type) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) = 255;
|
||||
} else {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) = type;
|
||||
_floorTexture = type;
|
||||
}
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_WALL_TEXTURE:
|
||||
if (dropdownIndex == -1)
|
||||
dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16);
|
||||
|
||||
type = (dropdownIndex == -1) ?
|
||||
_wallTexture :
|
||||
*((uint32*)&gDropdownItemsArgs[dropdownIndex]) - SPR_WALL_TEXTURE_ROCK;
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) == type) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) = 255;
|
||||
} else {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) = type;
|
||||
_wallTexture = type;
|
||||
}
|
||||
window_invalidate(w);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void window_mapgen_base_update(rct_window *w)
|
||||
{
|
||||
// Tab animation
|
||||
if (++w->frame_no >= window_mapgen_tab_animation_loops[w->page])
|
||||
w->frame_no = 0;
|
||||
widget_invalidate(w, WIDX_TAB_1);
|
||||
}
|
||||
|
||||
static void window_mapgen_base_invalidate()
|
||||
{
|
||||
rct_window *w;
|
||||
|
||||
window_get_register(w);
|
||||
|
||||
if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_BASE]) {
|
||||
w->widgets = window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_BASE];
|
||||
window_init_scroll_widgets(w);
|
||||
}
|
||||
|
||||
w->widgets[WIDX_FLOOR_TEXTURE].image = SPR_FLOOR_TEXTURE_GRASS + _floorTexture;
|
||||
w->widgets[WIDX_WALL_TEXTURE].image = SPR_WALL_TEXTURE_ROCK + _wallTexture;
|
||||
|
||||
window_mapgen_set_pressed_tab(w);
|
||||
window_mapgen_anchor_border_widgets(w);
|
||||
}
|
||||
|
||||
static void window_mapgen_base_paint()
|
||||
{
|
||||
uint16 arg;
|
||||
rct_window *w;
|
||||
rct_drawpixelinfo *dpi;
|
||||
|
||||
window_paint_get_registers(w, dpi);
|
||||
|
||||
window_draw_widgets(w, dpi);
|
||||
window_mapgen_draw_tab_images(dpi, w);
|
||||
|
||||
gfx_draw_string_left(dpi, STR_MAP_SIZE, 0, 0, w->x + 4, w->y + w->widgets[WIDX_MAP_SIZE].top + 1);
|
||||
gfx_draw_string_left(dpi, 2691, 0, 0, w->x + 4, w->y + w->widgets[WIDX_BASE_HEIGHT].top + 1);
|
||||
gfx_draw_string_left(dpi, 2692, 0, 0, w->x + 4, w->y + w->widgets[WIDX_WATER_LEVEL].top + 1);
|
||||
gfx_draw_string_left(dpi, 2693, 0, 0, w->x + 4, w->y + w->widgets[WIDX_FLOOR_TEXTURE].top + 1);
|
||||
|
||||
uint16 mapSizeArgs[2] = { _mapSize, _mapSize };
|
||||
gfx_draw_string_left(dpi, 839, mapSizeArgs, w->colours[1], w->x + w->widgets[WIDX_MAP_SIZE].left + 1, w->y + w->widgets[WIDX_MAP_SIZE].top + 1);
|
||||
|
||||
arg = (_baseHeight - 12) / 2;
|
||||
gfx_draw_string_left(dpi, 1737, &arg, w->colours[1], w->x + w->widgets[WIDX_BASE_HEIGHT].left + 1, w->y + w->widgets[WIDX_BASE_HEIGHT].top + 1);
|
||||
|
||||
arg = (_waterLevel - 12) / 2;
|
||||
gfx_draw_string_left(dpi, 1737, &arg, w->colours[1], w->x + w->widgets[WIDX_WATER_LEVEL].left + 1, w->y + w->widgets[WIDX_WATER_LEVEL].top + 1);
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Random page
|
||||
|
||||
static void window_mapgen_random_mouseup()
|
||||
{
|
||||
rct_window * w;
|
||||
short widgetIndex;
|
||||
mapgen_settings mapgenSettings;
|
||||
|
||||
window_widget_get_registers(w, widgetIndex);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_CLOSE:
|
||||
window_close(w);
|
||||
break;
|
||||
case WIDX_TAB_1:
|
||||
case WIDX_TAB_2:
|
||||
window_mapgen_set_page(w, widgetIndex - WIDX_TAB_1);
|
||||
break;
|
||||
case WIDX_GENERATE:
|
||||
mapgenSettings.mapSize = _mapSize;
|
||||
mapgenSettings.height = _baseHeight + 2;
|
||||
mapgenSettings.waterLevel = _waterLevel + 2;
|
||||
mapgenSettings.floor = _randomTerrrain ? -1 : _floorTexture;
|
||||
mapgenSettings.wall = _randomTerrrain ? -1 : _wallTexture;
|
||||
mapgenSettings.trees = _placeTrees;
|
||||
|
||||
mapgen_generate(&mapgenSettings);
|
||||
gfx_invalidate_screen();
|
||||
break;
|
||||
case WIDX_RANDOM_TERRAIN:
|
||||
_randomTerrrain ^= 1;
|
||||
break;
|
||||
case WIDX_PLACE_TREES:
|
||||
_placeTrees ^= 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void window_mapgen_random_mousedown(int widgetIndex, rct_window *w, rct_widget* widget)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static void window_mapgen_random_update(rct_window *w)
|
||||
{
|
||||
// Tab animation
|
||||
if (++w->frame_no >= window_mapgen_tab_animation_loops[w->page])
|
||||
w->frame_no = 0;
|
||||
widget_invalidate(w, WIDX_TAB_2);
|
||||
}
|
||||
|
||||
static void window_mapgen_random_invalidate()
|
||||
{
|
||||
rct_window *w;
|
||||
|
||||
window_get_register(w);
|
||||
|
||||
if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_RANDOM]) {
|
||||
w->widgets = window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_RANDOM];
|
||||
window_init_scroll_widgets(w);
|
||||
}
|
||||
|
||||
w->pressed_widgets = 0;
|
||||
if (_randomTerrrain)
|
||||
w->pressed_widgets |= 1 << WIDX_RANDOM_TERRAIN;
|
||||
if (_placeTrees)
|
||||
w->pressed_widgets |= 1 << WIDX_PLACE_TREES;
|
||||
|
||||
window_mapgen_set_pressed_tab(w);
|
||||
window_mapgen_anchor_border_widgets(w);
|
||||
}
|
||||
|
||||
static void window_mapgen_random_paint()
|
||||
{
|
||||
rct_window *w;
|
||||
rct_drawpixelinfo *dpi;
|
||||
|
||||
window_paint_get_registers(w, dpi);
|
||||
|
||||
window_draw_widgets(w, dpi);
|
||||
window_mapgen_draw_tab_images(dpi, w);
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Common
|
||||
|
||||
static void window_mapgen_set_page(rct_window *w, int page)
|
||||
{
|
||||
w->page = page;
|
||||
w->frame_no = 0;
|
||||
if (w->viewport != NULL) {
|
||||
w->viewport->width = 0;
|
||||
w->viewport = NULL;
|
||||
}
|
||||
|
||||
w->enabled_widgets = window_mapgen_page_enabled_widgets[page];
|
||||
w->hold_down_widgets = window_mapgen_page_hold_down_widgets[page];
|
||||
w->event_handlers = window_mapgen_page_events[page];
|
||||
w->widgets = window_mapgen_page_widgets[page];
|
||||
w->disabled_widgets = 0;
|
||||
w->pressed_widgets = 0;
|
||||
|
||||
window_init_scroll_widgets(w);
|
||||
window_invalidate(w);
|
||||
}
|
||||
|
||||
static void window_mapgen_set_pressed_tab(rct_window *w)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < WINDOW_MAPGEN_PAGE_COUNT; i++)
|
||||
w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i));
|
||||
w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page);
|
||||
}
|
||||
|
||||
static void window_mapgen_anchor_border_widgets(rct_window *w)
|
||||
{
|
||||
int width = w->widgets[WIDX_GENERATE].right - w->widgets[WIDX_GENERATE].left;
|
||||
int height = w->widgets[WIDX_GENERATE].bottom - w->widgets[WIDX_GENERATE].top;
|
||||
|
||||
w->widgets[WIDX_GENERATE].left = w->width - 3 - width;
|
||||
w->widgets[WIDX_GENERATE].right = w->width - 3;
|
||||
w->widgets[WIDX_GENERATE].bottom = w->height - 3;
|
||||
w->widgets[WIDX_GENERATE].top = w->height - 3 - height;
|
||||
|
||||
w->widgets[WIDX_BACKGROUND].right = w->width - 1;
|
||||
w->widgets[WIDX_BACKGROUND].bottom = w->height - 1;
|
||||
w->widgets[WIDX_PAGE_BACKGROUND].right = w->width - 1;
|
||||
w->widgets[WIDX_PAGE_BACKGROUND].bottom = w->height - 3 - height - 3;
|
||||
w->widgets[WIDX_TITLE].right = w->width - 2;
|
||||
w->widgets[WIDX_CLOSE].left = w->width - 13;
|
||||
w->widgets[WIDX_CLOSE].right = w->width - 3;
|
||||
}
|
||||
|
||||
static void window_mapgen_draw_tab_image(rct_drawpixelinfo *dpi, rct_window *w, int page, int spriteIndex)
|
||||
{
|
||||
int widgetIndex = WIDX_TAB_1 + page;
|
||||
|
||||
if (!(w->disabled_widgets & (1LL << widgetIndex))) {
|
||||
if (w->page == page) {
|
||||
int frame = w->frame_no / 2;
|
||||
if (page == WINDOW_MAPGEN_PAGE_BASE)
|
||||
frame %= 8;
|
||||
spriteIndex += frame;
|
||||
}
|
||||
|
||||
gfx_draw_sprite(dpi, spriteIndex, w->x + w->widgets[widgetIndex].left, w->y + w->widgets[widgetIndex].top, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void window_mapgen_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#pragma endregion
|
|
@ -152,7 +152,9 @@ void window_new_campaign_open(sint16 campaignType)
|
|||
(1 << WIDX_WEEKS_INCREASE_BUTTON) |
|
||||
(1 << WIDX_WEEKS_DECREASE_BUTTON) |
|
||||
(1 << WIDX_START_BUTTON);
|
||||
w->var_020 = 0x300;
|
||||
w->hold_down_widgets =
|
||||
(1 << WIDX_WEEKS_INCREASE_BUTTON) |
|
||||
(1 << WIDX_WEEKS_DECREASE_BUTTON);
|
||||
window_init_scroll_widgets(w);
|
||||
w->colours[0] = 19;
|
||||
w->colours[1] = 19;
|
||||
|
@ -232,8 +234,7 @@ static void window_new_campaign_mouseup()
|
|||
window_close(w);
|
||||
break;
|
||||
case WIDX_START_BUTTON:
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_START_MARKETING_CAMPAIGN;
|
||||
game_do_command(0, (w->campaign.no_weeks << 8) | 1, 0, (w->campaign.ride_id << 8) | w->campaign.campaign_type, GAME_COMMAND_START_MARKETING_CAMPAIGN, 0, 0);
|
||||
marketing_start_campaign(w->campaign.campaign_type, w->campaign.ride_id, w->campaign.no_weeks);
|
||||
window_close(w);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -658,7 +658,7 @@ static void window_new_ride_scrollmousedown()
|
|||
|
||||
window_scrollmouse_get_registers(w, scrollIndex, x, y);
|
||||
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint8) != 0)
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0)
|
||||
return;
|
||||
|
||||
item = window_new_ride_scroll_get_ride_list_item_at(w, x, y);
|
||||
|
|
|
@ -35,9 +35,10 @@
|
|||
#include "../interface/widget.h"
|
||||
#include "../interface/window.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../platform/platform.h"
|
||||
#include "../sprites.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "dropdown.h"
|
||||
#include "error.h"
|
||||
|
||||
enum {
|
||||
WINDOW_OPTIONS_PAGE_DISPLAY,
|
||||
|
@ -87,6 +88,8 @@ enum WINDOW_OPTIONS_WIDGET_IDX {
|
|||
WIDX_SOUND_QUALITY_DROPDOWN,
|
||||
WIDX_SOUND_SW_BUFFER_CHECKBOX,
|
||||
WIDX_SOUND_PAUSED_CHECKBOX,
|
||||
WIDX_TITLE_MUSIC,
|
||||
WIDX_TITLE_MUSIC_DROPDOWN,
|
||||
|
||||
WIDX_SCREEN_EDGE_SCROLLING,
|
||||
WIDX_HOTKEY_DROPDOWN,
|
||||
|
@ -96,7 +99,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX {
|
|||
};
|
||||
|
||||
#define WW 310
|
||||
#define WH 135
|
||||
#define WH 153
|
||||
|
||||
static rct_widget window_options_widgets[] = {
|
||||
{ WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE },
|
||||
|
@ -140,6 +143,8 @@ static rct_widget window_options_widgets[] = {
|
|||
{ WWT_DROPDOWN_BUTTON, 0, 288, 298, 84, 93, 876, STR_NONE },
|
||||
{ WWT_CHECKBOX, 0, 10, 299, 99, 110, STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING, STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING_TIP },
|
||||
{ WWT_CHECKBOX, 0, 10, 229, 114, 125, STR_SOUND, STR_NONE }, // enable/disable sound
|
||||
{ WWT_DROPDOWN, 0, 155, 299, 130, 141, STR_NONE, STR_NONE }, // title music
|
||||
{ WWT_DROPDOWN_BUTTON, 0, 288, 298, 131, 140, 876, STR_NONE },
|
||||
|
||||
// Controls tab
|
||||
{ WWT_CHECKBOX, 2, 10, 299, 53, 64, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP },
|
||||
|
@ -228,6 +233,8 @@ void window_options_open()
|
|||
(1ULL << WIDX_MUSIC_DROPDOWN) |
|
||||
(1ULL << WIDX_SOUND_QUALITY) |
|
||||
(1ULL << WIDX_SOUND_QUALITY_DROPDOWN) |
|
||||
(1ULL << WIDX_TITLE_MUSIC) |
|
||||
(1ULL << WIDX_TITLE_MUSIC_DROPDOWN) |
|
||||
(1ULL << WIDX_LANGUAGE) |
|
||||
(1ULL << WIDX_LANGUAGE_DROPDOWN) |
|
||||
(1ULL << WIDX_CURRENCY) |
|
||||
|
@ -386,6 +393,18 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget*
|
|||
|
||||
gDropdownItemsChecked = 1 << gSound_config.sound_quality;
|
||||
break;
|
||||
case WIDX_TITLE_MUSIC_DROPDOWN:
|
||||
num_items = 3;
|
||||
|
||||
for (i = 0; i < num_items; i++) {
|
||||
gDropdownItemsFormat[i] = 1142;
|
||||
gDropdownItemsArgs[i] = 2739 + i;
|
||||
}
|
||||
|
||||
window_options_show_dropdown(w, widget, num_items);
|
||||
|
||||
gDropdownItemsChecked = 1 << gGeneral_config.title_music;
|
||||
break;
|
||||
case WIDX_CURRENCY_DROPDOWN:
|
||||
num_items = 10;
|
||||
|
||||
|
@ -409,7 +428,30 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget*
|
|||
gDropdownItemsChecked = 1 << gGeneral_config.measurement_format;
|
||||
break;
|
||||
case WIDX_RESOLUTION_DROPDOWN:
|
||||
// RCT2_CALLPROC_EBPSAFE(0x006BB2AF);
|
||||
{
|
||||
platform_update_fullscreen_resolutions();
|
||||
|
||||
int selectedResolution = -1;
|
||||
for (i = 0; i < gNumResolutions; i++) {
|
||||
resolution *resolution = &gResolutions[i];
|
||||
|
||||
gDropdownItemsFormat[i] = 1142;
|
||||
|
||||
uint16 *args = (uint16*)&gDropdownItemsArgs[i];
|
||||
args[0] = 839;
|
||||
args[1] = resolution->width;
|
||||
args[2] = resolution->height;
|
||||
|
||||
if (resolution->width == gGeneral_config.fullscreen_width && resolution->height == gGeneral_config.fullscreen_height)
|
||||
selectedResolution = i;
|
||||
}
|
||||
|
||||
window_options_show_dropdown(w, widget, gNumResolutions);
|
||||
|
||||
if (selectedResolution != -1 && selectedResolution < 32)
|
||||
gDropdownItemsChecked = 1 << selectedResolution;
|
||||
}
|
||||
|
||||
break;
|
||||
case WIDX_FULLSCREEN_DROPDOWN:
|
||||
gDropdownItemsFormat[0] = 1142;
|
||||
|
@ -516,6 +558,15 @@ static void window_options_dropdown()
|
|||
config_save();
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_TITLE_MUSIC_DROPDOWN:
|
||||
if (dropdownIndex == 1 && !platform_file_exists(get_file_path(PATH_ID_CSS50))) {
|
||||
window_error_open(2742, 2743);
|
||||
} else {
|
||||
gGeneral_config.title_music = (sint8)dropdownIndex;
|
||||
config_save();
|
||||
window_invalidate(w);
|
||||
}
|
||||
break;
|
||||
case WIDX_CURRENCY_DROPDOWN:
|
||||
gGeneral_config.currency_format = (sint8)dropdownIndex;
|
||||
config_save();
|
||||
|
@ -527,13 +578,19 @@ static void window_options_dropdown()
|
|||
window_options_update_height_markers();
|
||||
break;
|
||||
case WIDX_RESOLUTION_DROPDOWN:
|
||||
#ifdef _MSC_VER
|
||||
__asm movzx ax, dropdownIndex
|
||||
#else
|
||||
__asm__ ( "movzx ax, %[dropdownIndex] " : : [dropdownIndex] "g" ((char)dropdownIndex) );
|
||||
#endif
|
||||
// the switch replaces ax value
|
||||
RCT2_CALLPROC_EBPSAFE(0x006BB37D);
|
||||
{
|
||||
resolution *resolution = &gResolutions[dropdownIndex];
|
||||
if (resolution->width != gGeneral_config.fullscreen_width || resolution->height != gGeneral_config.fullscreen_height) {
|
||||
gGeneral_config.fullscreen_width = resolution->width;
|
||||
gGeneral_config.fullscreen_height = resolution->height;
|
||||
|
||||
if (gGeneral_config.fullscreen_mode == SDL_WINDOW_FULLSCREEN)
|
||||
platform_set_fullscreen_mode(SDL_WINDOW_FULLSCREEN);
|
||||
|
||||
config_save();
|
||||
gfx_invalidate_screen();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WIDX_FULLSCREEN_DROPDOWN:
|
||||
if (dropdownIndex != gGeneral_config.fullscreen_mode){
|
||||
|
@ -544,7 +601,10 @@ static void window_options_dropdown()
|
|||
w->disabled_widgets &= ~(1 << WIDX_RESOLUTION_DROPDOWN);
|
||||
w->disabled_widgets &= ~(1 << WIDX_RESOLUTION);
|
||||
}
|
||||
osinterface_set_fullscreen_mode(dropdownIndex);
|
||||
platform_set_fullscreen_mode(dropdownIndex);
|
||||
|
||||
gGeneral_config.fullscreen_mode = (uint8)dropdownIndex;
|
||||
config_save();
|
||||
}
|
||||
break;
|
||||
case WIDX_TEMPERATURE_DROPDOWN:
|
||||
|
@ -592,8 +652,8 @@ static void window_options_invalidate()
|
|||
switch (w->page) {
|
||||
case WINDOW_OPTIONS_PAGE_DISPLAY:
|
||||
// resolution
|
||||
RCT2_GLOBAL(0x013CE952 + 16, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_RESOLUTION_WIDTH, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 18, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_RESOLUTION_HEIGHT, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 16, uint16) = gGeneral_config.fullscreen_width;
|
||||
RCT2_GLOBAL(0x013CE952 + 18, uint16) = gGeneral_config.fullscreen_height;
|
||||
RCT2_GLOBAL(0x013CE952 + 12, uint16) = 2773 + gGeneral_config.fullscreen_mode;
|
||||
|
||||
// landscape tile smoothing checkbox
|
||||
|
@ -681,6 +741,8 @@ static void window_options_invalidate()
|
|||
window_options_widgets[WIDX_SOUND_QUALITY_DROPDOWN].type = WWT_DROPDOWN_BUTTON;
|
||||
window_options_widgets[WIDX_SOUND_SW_BUFFER_CHECKBOX].type = WWT_CHECKBOX;
|
||||
window_options_widgets[WIDX_SOUND_PAUSED_CHECKBOX].type = WWT_CHECKBOX;
|
||||
window_options_widgets[WIDX_TITLE_MUSIC].type = WWT_DROPDOWN;
|
||||
window_options_widgets[WIDX_TITLE_MUSIC_DROPDOWN].type = WWT_DROPDOWN_BUTTON;
|
||||
break;
|
||||
case WINDOW_OPTIONS_PAGE_INPUT:
|
||||
// screen edge scrolling checkbox
|
||||
|
@ -770,6 +832,15 @@ static void window_options_paint()
|
|||
case WINDOW_OPTIONS_PAGE_AUDIO:
|
||||
gfx_draw_string_left(dpi, STR_MUSIC, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_MUSIC].top + 1);
|
||||
gfx_draw_string_left(dpi, STR_SOUND_QUALITY, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_SOUND_QUALITY].top + 1);
|
||||
gfx_draw_string_left(dpi, 2738, w, 12, w->x + 10, w->y + window_options_widgets[WIDX_TITLE_MUSIC].top + 1);
|
||||
gfx_draw_string_left(
|
||||
dpi,
|
||||
2739 + gGeneral_config.title_music,
|
||||
NULL,
|
||||
12,
|
||||
w->x + window_options_widgets[WIDX_TITLE_MUSIC].left + 1,
|
||||
w->y + window_options_widgets[WIDX_TITLE_MUSIC].top
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -791,7 +862,7 @@ static void window_options_show_dropdown(rct_window *w, rct_widget *widget, int
|
|||
static void window_options_update_height_markers()
|
||||
{
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, uint16) = gGeneral_config.show_height_as_units ?
|
||||
0 : (gGeneral_config.show_height_as_units + 1) * 256;
|
||||
0 : (gGeneral_config.measurement_format + 1) * 256;
|
||||
config_save();
|
||||
gfx_invalidate_screen();
|
||||
}
|
||||
|
|
|
@ -572,6 +572,19 @@ static uint32 window_park_page_enabled_widgets[] = {
|
|||
(1 << WIDX_TAB_7)
|
||||
};
|
||||
|
||||
static uint32 window_park_page_hold_down_widgets[] = {
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
(1 << WIDX_INCREASE_PRICE) |
|
||||
(1 << WIDX_DECREASE_PRICE),
|
||||
|
||||
0,
|
||||
0,
|
||||
0
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
static void window_park_init_viewport(rct_window *w);
|
||||
|
@ -611,12 +624,18 @@ rct_window *window_park_open()
|
|||
*
|
||||
* rct2: 0x00667F8B
|
||||
*/
|
||||
void window_park_set_disabled_tabs(rct_window *w)
|
||||
static void window_park_set_disabled_tabs(rct_window *w)
|
||||
{
|
||||
// Disable price tab if money is disabled
|
||||
w->disabled_widgets = (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) ? (1 << WIDX_TAB_4) : 0;
|
||||
}
|
||||
|
||||
static void window_park_prepare_window_title_text()
|
||||
{
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32);
|
||||
}
|
||||
|
||||
#pragma region Entrance page
|
||||
|
||||
/**
|
||||
|
@ -694,7 +713,7 @@ static void window_park_entrance_mouseup()
|
|||
break;
|
||||
case WIDX_RENAME:
|
||||
RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
window_text_input_open(w, WIDX_RENAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, RCT2_GLOBAL(0x013573D4, rct_string_id), 0, 32);
|
||||
window_text_input_open(w, WIDX_RENAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), 0, 32);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -755,19 +774,17 @@ static void window_park_entrance_dropdown()
|
|||
|
||||
window_dropdown_get_registers(w, widgetIndex, dropdownIndex);
|
||||
|
||||
|
||||
if (widgetIndex == WIDX_OPEN_OR_CLOSE) {
|
||||
if (dropdownIndex == -1)
|
||||
dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16);
|
||||
|
||||
if (dropdownIndex != 0) {
|
||||
dropdownIndex &= 0x00FF;
|
||||
dropdownIndex |= 0x0100;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = 1724;
|
||||
park_set_open(1);
|
||||
} else {
|
||||
dropdownIndex &= 0x00FF;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = 1723;
|
||||
park_set_open(0);
|
||||
}
|
||||
game_do_command(0, 1, 0, dropdownIndex, GAME_COMMAND_SET_PARK_OPEN, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -869,14 +886,8 @@ static void window_park_entrance_textinput()
|
|||
|
||||
window_textinput_get_registers(w, widgetIndex, result, text);
|
||||
|
||||
if (widgetIndex == WIDX_RENAME) {
|
||||
if (result) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_RENAME_PARK;
|
||||
game_do_command(1, 1, 0, *((int*)(text + 0)), GAME_COMMAND_33, *((int*)(text + 8)), *((int*)(text + 4)));
|
||||
game_do_command(2, 1, 0, *((int*)(text + 12)), GAME_COMMAND_33, *((int*)(text + 20)), *((int*)(text + 16)));
|
||||
game_do_command(0, 1, 0, *((int*)(text + 24)), GAME_COMMAND_33, *((int*)(text + 32)), *((int*)(text + 28)));
|
||||
}
|
||||
}
|
||||
if (widgetIndex == WIDX_RENAME && result)
|
||||
park_set_name(text);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -896,8 +907,8 @@ static void window_park_entrance_invalidate()
|
|||
window_park_set_pressed_tab(w);
|
||||
|
||||
// Set open / close park button state
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32);
|
||||
window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].image = park_is_open() ? SPR_OPEN : SPR_CLOSED;
|
||||
|
||||
// Only allow closing of park for guest / rating objective
|
||||
|
@ -1070,7 +1081,7 @@ void window_park_rating_open()
|
|||
window_invalidate(window);
|
||||
window->widgets = window_park_rating_widgets;
|
||||
window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_RATING];
|
||||
window->var_020 = 0;
|
||||
window->hold_down_widgets = window_park_page_hold_down_widgets[WINDOW_PARK_PAGE_RATING];
|
||||
window->event_handlers = (uint32*)window_park_rating_events;
|
||||
window_init_scroll_widgets(window);
|
||||
}
|
||||
|
@ -1133,9 +1144,7 @@ static void window_park_rating_invalidate()
|
|||
}
|
||||
|
||||
window_park_set_pressed_tab(w);
|
||||
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
window_park_prepare_window_title_text();
|
||||
|
||||
window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_7);
|
||||
window_park_anchor_border_widgets(w);
|
||||
|
@ -1204,7 +1213,7 @@ void window_park_guests_open()
|
|||
window_invalidate(window);
|
||||
window->widgets = window_park_guests_widgets;
|
||||
window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_GUESTS];
|
||||
window->var_020 = 0;
|
||||
window->hold_down_widgets = window_park_page_hold_down_widgets[WINDOW_PARK_PAGE_GUESTS];
|
||||
window->event_handlers = (uint32*)window_park_guests_events;
|
||||
window_init_scroll_widgets(window);
|
||||
}
|
||||
|
@ -1268,9 +1277,7 @@ static void window_park_guests_invalidate()
|
|||
}
|
||||
|
||||
window_park_set_pressed_tab(w);
|
||||
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
window_park_prepare_window_title_text();
|
||||
|
||||
window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_7);
|
||||
window_park_anchor_border_widgets(w);
|
||||
|
@ -1367,12 +1374,12 @@ static void window_park_price_mousedown(int widgetIndex, rct_window*w, rct_widge
|
|||
window_park_set_page(w, widgetIndex - WIDX_TAB_1);
|
||||
break;
|
||||
case WIDX_INCREASE_PRICE:
|
||||
newFee = min(1000, RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, uint16) + 10);
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_SET_PARK_ENTRANCE_FEE, newFee, 0);
|
||||
newFee = min(MONEY(100,00), RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) + MONEY(1,00));
|
||||
park_set_entrance_fee(newFee);
|
||||
break;
|
||||
case WIDX_DECREASE_PRICE:
|
||||
newFee = max(0, RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, uint16) - 10);
|
||||
game_do_command(0, 1, 0, 0, GAME_COMMAND_SET_PARK_ENTRANCE_FEE, newFee, 0);
|
||||
newFee = max(MONEY(0,00), RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) - MONEY(1,00));
|
||||
park_set_entrance_fee(newFee);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1405,9 +1412,7 @@ static void window_park_price_invalidate()
|
|||
}
|
||||
|
||||
window_park_set_pressed_tab(w);
|
||||
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
window_park_prepare_window_title_text();
|
||||
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) {
|
||||
window_park_price_widgets[WIDX_PRICE].type = WWT_12;
|
||||
|
@ -1527,9 +1532,7 @@ static void window_park_stats_invalidate()
|
|||
}
|
||||
|
||||
window_park_set_pressed_tab(w);
|
||||
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
window_park_prepare_window_title_text();
|
||||
|
||||
window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_7);
|
||||
window_park_anchor_border_widgets(w);
|
||||
|
@ -1610,7 +1613,7 @@ void window_park_objective_open()
|
|||
window_invalidate(window);
|
||||
window->widgets = window_park_objective_widgets;
|
||||
window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_OBJECTIVE];
|
||||
window->var_020 = 0;
|
||||
window->hold_down_widgets = window_park_page_hold_down_widgets[WINDOW_PARK_PAGE_OBJECTIVE];
|
||||
window->event_handlers = (uint32*)window_park_objective_events;
|
||||
window_init_scroll_widgets(window);
|
||||
window->x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) / 2 - 115;
|
||||
|
@ -1709,10 +1712,7 @@ static void window_park_objective_invalidate()
|
|||
window_get_register(w);
|
||||
|
||||
window_park_set_pressed_tab(w);
|
||||
|
||||
// Set window title arguments
|
||||
*((uint16*)0x013CE952) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
*((uint32*)0x013CE954) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
window_park_prepare_window_title_text();
|
||||
|
||||
//
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SCENARIO_COMPLETE_NAME_INPUT)
|
||||
|
@ -1800,7 +1800,7 @@ void window_park_awards_open()
|
|||
window_invalidate(window);
|
||||
window->widgets = window_park_awards_widgets;
|
||||
window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_AWARDS];
|
||||
window->var_020 = 0;
|
||||
window->hold_down_widgets = window_park_page_hold_down_widgets[WINDOW_PARK_PAGE_AWARDS];
|
||||
window->event_handlers = (uint32*)window_park_awards_events;
|
||||
window_init_scroll_widgets(window);
|
||||
}
|
||||
|
@ -1863,9 +1863,7 @@ static void window_park_awards_invalidate()
|
|||
}
|
||||
|
||||
window_park_set_pressed_tab(w);
|
||||
|
||||
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
window_park_prepare_window_title_text();
|
||||
|
||||
window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_7);
|
||||
window_park_anchor_border_widgets(w);
|
||||
|
@ -1937,7 +1935,7 @@ static void window_park_set_page(rct_window *w, int page)
|
|||
}
|
||||
|
||||
w->enabled_widgets = window_park_page_enabled_widgets[page];
|
||||
w->var_020 = RCT2_GLOBAL(0x0097BAE0 + (page * 4), uint32);
|
||||
w->hold_down_widgets = window_park_page_hold_down_widgets[page];
|
||||
w->event_handlers = window_park_page_events[page];
|
||||
w->widgets = window_park_page_widgets[page];
|
||||
window_park_set_disabled_tabs(w);
|
||||
|
|
|
@ -249,7 +249,7 @@ void window_research_open()
|
|||
|
||||
w->widgets = window_research_page_widgets[0];
|
||||
w->enabled_widgets = window_research_page_enabled_widgets[0];
|
||||
w->var_020 = RCT2_GLOBAL(0x00988E3C, uint32);
|
||||
w->hold_down_widgets = 0;
|
||||
w->event_handlers = window_research_page_events[0];
|
||||
w->pressed_widgets = 0;
|
||||
w->disabled_widgets = 0;
|
||||
|
@ -430,7 +430,7 @@ static void window_research_funding_mouseup()
|
|||
case WIDX_SCENERY_AND_THEMING:
|
||||
activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16);
|
||||
activeResearchTypes ^= 1 << (widgetIndex - WIDX_TRANSPORT_RIDES);
|
||||
game_do_command(0, (1 << 8) | 1, 0, activeResearchTypes, GAME_COMMAND_SET_RESEARCH_FUNDING, 0, 0);
|
||||
research_set_priority(activeResearchTypes);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -482,7 +482,7 @@ static void window_research_funding_dropdown()
|
|||
if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON || dropdownIndex == -1)
|
||||
return;
|
||||
|
||||
game_do_command(0, 1, 0, dropdownIndex, GAME_COMMAND_SET_RESEARCH_FUNDING, 0, 0);
|
||||
research_set_funding(dropdownIndex);
|
||||
window_invalidate(w);
|
||||
}
|
||||
|
||||
|
@ -591,7 +591,7 @@ static void window_research_set_page(rct_window *w, int page)
|
|||
}
|
||||
|
||||
w->enabled_widgets = window_research_page_enabled_widgets[page];
|
||||
w->var_020 = RCT2_ADDRESS(0x00988E3C, uint32)[page];
|
||||
w->hold_down_widgets = 0;
|
||||
w->event_handlers = window_research_page_events[page];
|
||||
w->widgets = window_research_page_widgets[page];
|
||||
w->disabled_widgets = 0;
|
||||
|
|
|
@ -36,18 +36,18 @@
|
|||
|
||||
#define var_496(w) RCT2_GLOBAL((int)w + 0x496, uint16)
|
||||
|
||||
enum WINDOW_PARK_PAGE {
|
||||
WINDOW_PARK_PAGE_MAIN,
|
||||
WINDOW_PARK_PAGE_VEHICLE,
|
||||
WINDOW_PARK_PAGE_OPERATING,
|
||||
WINDOW_PARK_PAGE_MAINTENANCE,
|
||||
WINDOW_PARK_PAGE_COLOUR,
|
||||
WINDOW_PARK_PAGE_MUSIC,
|
||||
WINDOW_PARK_PAGE_MEASUREMENTS,
|
||||
WINDOW_PARK_PAGE_GRAPHS,
|
||||
WINDOW_PARK_PAGE_INCOME,
|
||||
WINDOW_PARK_PAGE_CUSTOMER,
|
||||
WINDOW_PARK_PAGE_COUNT
|
||||
enum {
|
||||
WINDOW_RIDE_PAGE_MAIN,
|
||||
WINDOW_RIDE_PAGE_VEHICLE,
|
||||
WINDOW_RIDE_PAGE_OPERATING,
|
||||
WINDOW_RIDE_PAGE_MAINTENANCE,
|
||||
WINDOW_RIDE_PAGE_COLOUR,
|
||||
WINDOW_RIDE_PAGE_MUSIC,
|
||||
WINDOW_RIDE_PAGE_MEASUREMENTS,
|
||||
WINDOW_RIDE_PAGE_GRAPHS,
|
||||
WINDOW_RIDE_PAGE_INCOME,
|
||||
WINDOW_RIDE_PAGE_CUSTOMER,
|
||||
WINDOW_RIDE_PAGE_COUNT
|
||||
};
|
||||
|
||||
#pragma region Widgets
|
||||
|
@ -489,6 +489,19 @@ const uint64 window_ride_page_enabled_widgets[] = {
|
|||
0x000000000001FFF4
|
||||
};
|
||||
|
||||
const uint64 window_ride_page_hold_down_widgets[] = {
|
||||
0x0000000000000000,
|
||||
0x0000000000000000,
|
||||
0x00000000330D8000,
|
||||
0x0000000000000000,
|
||||
0x0000000000000000,
|
||||
0x0000000000000000,
|
||||
0x0000000000000000,
|
||||
0x0000000000000000,
|
||||
0x0000000000630000,
|
||||
0x0000000000000000
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Events
|
||||
|
@ -944,7 +957,7 @@ static void window_ride_draw_tab_image(rct_drawpixelinfo *dpi, rct_window *w, in
|
|||
*/
|
||||
static void window_ride_draw_tab_main(rct_drawpixelinfo *dpi, rct_window *w)
|
||||
{
|
||||
int widgetIndex = WIDX_TAB_1 + WINDOW_PARK_PAGE_MAIN;
|
||||
int widgetIndex = WIDX_TAB_1 + WINDOW_RIDE_PAGE_MAIN;
|
||||
|
||||
if (!(w->disabled_widgets & (1LL << widgetIndex))) {
|
||||
int spriteIndex;
|
||||
|
@ -953,17 +966,17 @@ static void window_ride_draw_tab_main(rct_drawpixelinfo *dpi, rct_window *w)
|
|||
switch (gRideClassifications[rideType]) {
|
||||
case RIDE_CLASS_RIDE:
|
||||
spriteIndex = 5442;
|
||||
if (w->page == WINDOW_PARK_PAGE_MAIN)
|
||||
if (w->page == WINDOW_RIDE_PAGE_MAIN)
|
||||
spriteIndex += (w->frame_no / 4) % 16;
|
||||
break;
|
||||
case RIDE_CLASS_SHOP_OR_STALL:
|
||||
spriteIndex = 5351;
|
||||
if (w->page == WINDOW_PARK_PAGE_MAIN)
|
||||
if (w->page == WINDOW_RIDE_PAGE_MAIN)
|
||||
spriteIndex += (w->frame_no / 4) % 16;
|
||||
break;
|
||||
case RIDE_CLASS_KIOSK_OR_FACILITY:
|
||||
spriteIndex = 5367;
|
||||
if (w->page == WINDOW_PARK_PAGE_MAIN)
|
||||
if (w->page == WINDOW_RIDE_PAGE_MAIN)
|
||||
spriteIndex += (w->frame_no / 4) % 8;
|
||||
break;
|
||||
}
|
||||
|
@ -985,7 +998,7 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w)
|
|||
rct_ride_type *rideEntry;
|
||||
vehicle_colour vehicleColour;
|
||||
|
||||
widgetIndex = WIDX_TAB_1 + WINDOW_PARK_PAGE_VEHICLE;
|
||||
widgetIndex = WIDX_TAB_1 + WINDOW_RIDE_PAGE_VEHICLE;
|
||||
widget = &w->widgets[widgetIndex];
|
||||
|
||||
if (!(w->disabled_widgets & (1LL << widgetIndex))) {
|
||||
|
@ -993,7 +1006,7 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w)
|
|||
y = widget->top + 1;
|
||||
width = widget->right - x;
|
||||
height = widget->bottom - 3 - y;
|
||||
if (w->page == WINDOW_PARK_PAGE_VEHICLE)
|
||||
if (w->page == WINDOW_RIDE_PAGE_VEHICLE)
|
||||
height += 4;
|
||||
|
||||
x += w->x;
|
||||
|
@ -1026,7 +1039,7 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w)
|
|||
vehicleColour = ride_get_vehicle_colour(ride, 0);
|
||||
|
||||
spriteIndex = 32;
|
||||
if (w->page == WINDOW_PARK_PAGE_VEHICLE)
|
||||
if (w->page == WINDOW_RIDE_PAGE_VEHICLE)
|
||||
spriteIndex += w->frame_no;
|
||||
spriteIndex /= (RCT2_GLOBAL(ebp + 0x2C, uint16) & 0x800) ? 4 : 2;
|
||||
spriteIndex &= RCT2_GLOBAL(ebp + 0x1A, uint16);
|
||||
|
@ -1047,12 +1060,12 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w)
|
|||
static void window_ride_draw_tab_customer(rct_drawpixelinfo *dpi, rct_window *w)
|
||||
{
|
||||
int spriteIndex;
|
||||
int widgetIndex = WIDX_TAB_1 + WINDOW_PARK_PAGE_CUSTOMER;
|
||||
int widgetIndex = WIDX_TAB_1 + WINDOW_RIDE_PAGE_CUSTOMER;
|
||||
rct_widget *widget = &w->widgets[widgetIndex];
|
||||
|
||||
if (!(w->disabled_widgets & (1LL << widgetIndex))) {
|
||||
spriteIndex = 0;
|
||||
if (w->page == WINDOW_PARK_PAGE_CUSTOMER)
|
||||
if (w->page == WINDOW_RIDE_PAGE_CUSTOMER)
|
||||
spriteIndex = w->var_492 & ~3;
|
||||
|
||||
spriteIndex += RCT2_GLOBAL(RCT2_GLOBAL(0x00982708, uint32), uint32);
|
||||
|
@ -1070,15 +1083,15 @@ static void window_ride_draw_tab_customer(rct_drawpixelinfo *dpi, rct_window *w)
|
|||
static void window_ride_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
|
||||
{
|
||||
window_ride_draw_tab_vehicle(dpi, w);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_PARK_PAGE_OPERATING, 5201);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_PARK_PAGE_MAINTENANCE, 5205);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_PARK_PAGE_INCOME, 5253);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_RIDE_PAGE_OPERATING, 5201);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_RIDE_PAGE_MAINTENANCE, 5205);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_RIDE_PAGE_INCOME, 5253);
|
||||
window_ride_draw_tab_main(dpi, w);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_PARK_PAGE_MEASUREMENTS, 5229);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_PARK_PAGE_COLOUR, 5221);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_PARK_PAGE_GRAPHS, 5237);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_RIDE_PAGE_MEASUREMENTS, 5229);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_RIDE_PAGE_COLOUR, 5221);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_RIDE_PAGE_GRAPHS, 5237);
|
||||
window_ride_draw_tab_customer(dpi, w);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_PARK_PAGE_MUSIC, 5335);
|
||||
window_ride_draw_tab_image(dpi, w, WINDOW_RIDE_PAGE_MUSIC, 5335);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1150,14 +1163,14 @@ rct_window *window_ride_main_open(int rideIndex)
|
|||
}
|
||||
}
|
||||
|
||||
w->page = 0;
|
||||
w->page = WINDOW_RIDE_PAGE_MAIN;
|
||||
w->width = 316;
|
||||
w->height = 180;
|
||||
window_invalidate(w);
|
||||
w->widgets = window_ride_page_widgets[0];
|
||||
w->enabled_widgets = 0x007DBFF4;
|
||||
w->var_020 = 0;
|
||||
w->event_handlers = window_ride_page_events[0];
|
||||
w->widgets = window_ride_page_widgets[WINDOW_RIDE_PAGE_MAIN];
|
||||
w->enabled_widgets = window_ride_page_enabled_widgets[WINDOW_RIDE_PAGE_MAIN];
|
||||
w->hold_down_widgets = window_ride_page_hold_down_widgets[WINDOW_RIDE_PAGE_MAIN];
|
||||
w->event_handlers = window_ride_page_events[WINDOW_RIDE_PAGE_MAIN];
|
||||
w->pressed_widgets = 0;
|
||||
RCT2_CALLPROC_X(0x006AEB9F, 0, 0, 0, 0, (int)w, 0, 0);
|
||||
window_init_scroll_widgets(w);
|
||||
|
@ -1196,14 +1209,14 @@ rct_window *window_ride_open_station(int rideIndex, int stationIndex)
|
|||
tool_cancel();
|
||||
}
|
||||
|
||||
w->page = WINDOW_PARK_PAGE_MAIN;
|
||||
w->page = WINDOW_RIDE_PAGE_MAIN;
|
||||
w->width = 316;
|
||||
w->height = 180;
|
||||
window_invalidate(w);
|
||||
|
||||
w->widgets = window_ride_page_widgets[w->page];
|
||||
w->enabled_widgets = window_ride_page_enabled_widgets[w->page];
|
||||
w->var_020 = RCT2_ADDRESS(0x0098DD68, uint32)[w->page];
|
||||
w->hold_down_widgets = window_ride_page_hold_down_widgets[w->page];
|
||||
w->event_handlers = window_ride_page_events[w->page];
|
||||
w->pressed_widgets = 0;
|
||||
RCT2_CALLPROC_X(0x006AEB9F, 0, 0, 0, 0, (int)w, 0, 0);
|
||||
|
@ -1225,7 +1238,7 @@ rct_window *window_ride_open_track(rct_map_element *mapElement)
|
|||
{
|
||||
int rideIndex = mapElement->properties.track.ride_index;
|
||||
if (
|
||||
((mapElement->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_ENTRANCE) ||
|
||||
(map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) ||
|
||||
(RCT2_ADDRESS(0x0099BA64, uint8)[mapElement->properties.track.type * 16] & 0x10)
|
||||
) {
|
||||
// Open ride window in station view
|
||||
|
@ -1305,14 +1318,14 @@ rct_window *window_ride_open_vehicle(rct_vehicle *vehicle)
|
|||
w->ride.var_482 = -1;
|
||||
}
|
||||
|
||||
w->page = WINDOW_PARK_PAGE_MAIN;
|
||||
w->page = WINDOW_RIDE_PAGE_MAIN;
|
||||
w->width = 316;
|
||||
w->height = 180;
|
||||
window_invalidate(w);
|
||||
|
||||
w->widgets = window_ride_page_widgets[w->page];
|
||||
w->enabled_widgets = window_ride_page_enabled_widgets[w->page];
|
||||
w->var_020 = RCT2_ADDRESS(0x0098DD68, uint32)[w->page];
|
||||
w->hold_down_widgets = window_ride_page_hold_down_widgets[w->page];
|
||||
w->event_handlers = window_ride_page_events[w->page];
|
||||
w->pressed_widgets = 0;
|
||||
RCT2_CALLPROC_X(0x006AEB9F, 0, 0, 0, 0, (int)w, 0, 0);
|
||||
|
@ -1339,7 +1352,7 @@ static void window_ride_set_page(rct_window *w, int page)
|
|||
|
||||
// Set listen only to viewport
|
||||
listen = 0;
|
||||
if (page == WINDOW_PARK_PAGE_MAIN && w->page == WINDOW_PARK_PAGE_MAIN && w->viewport != NULL && !(w->viewport->flags & VIEWPORT_FLAG_SOUND_ON))
|
||||
if (page == WINDOW_RIDE_PAGE_MAIN && w->page == WINDOW_RIDE_PAGE_MAIN && w->viewport != NULL && !(w->viewport->flags & VIEWPORT_FLAG_SOUND_ON))
|
||||
listen++;
|
||||
|
||||
w->page = page;
|
||||
|
@ -1351,7 +1364,7 @@ static void window_ride_set_page(rct_window *w, int page)
|
|||
}
|
||||
|
||||
w->enabled_widgets = window_ride_page_enabled_widgets[page];
|
||||
w->var_020 = RCT2_ADDRESS(0x0098DD68, uint32)[page];
|
||||
w->hold_down_widgets = window_ride_page_hold_down_widgets[page];
|
||||
w->event_handlers = window_ride_page_events[page];
|
||||
w->pressed_widgets = 0;
|
||||
w->widgets = window_ride_page_widgets[page];
|
||||
|
@ -1371,7 +1384,7 @@ static void window_ride_set_page(rct_window *w, int page)
|
|||
static void window_ride_set_pressed_tab(rct_window *w)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < WINDOW_PARK_PAGE_COUNT; i++)
|
||||
for (i = 0; i < WINDOW_RIDE_PAGE_COUNT; i++)
|
||||
w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i));
|
||||
w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page);
|
||||
}
|
||||
|
@ -1395,7 +1408,7 @@ static void window_ride_anchor_border_widgets(rct_window *w)
|
|||
*/
|
||||
static void window_ride_init_viewport(rct_window *w)
|
||||
{
|
||||
if (w->page != WINDOW_PARK_PAGE_MAIN) return;
|
||||
if (w->page != WINDOW_RIDE_PAGE_MAIN) return;
|
||||
|
||||
rct_ride* ride = GET_RIDE(w->number);
|
||||
int eax = w->viewport_focus_coordinates.var_480 - 1;
|
||||
|
@ -1552,39 +1565,6 @@ static void window_ride_rename(rct_window *w)
|
|||
window_text_input_open(w, WIDX_RENAME, STR_RIDE_ATTRACTION_NAME, STR_ENTER_NEW_NAME_FOR_THIS_RIDE_ATTRACTION, ride->name, ride->name_arguments, 32);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AF3B3
|
||||
*/
|
||||
static void window_ride_locate(rct_window *w)
|
||||
{
|
||||
rct_window *mainWindow;
|
||||
int xy, x, y, z;
|
||||
|
||||
if (w->viewport->width == 0)
|
||||
return;
|
||||
|
||||
xy = w->ride.var_482;
|
||||
z = w->ride.var_486;
|
||||
if (xy == -1)
|
||||
return;
|
||||
|
||||
if (xy & 0x80000000) {
|
||||
rct_sprite *sprite = &g_sprite_list[xy & 0xFFFF];
|
||||
x = sprite->unknown.x;
|
||||
y = sprite->unknown.y;
|
||||
z = sprite->unknown.z;
|
||||
} else {
|
||||
x = (xy & ~0xC0000000) & 0xFFFF;
|
||||
y = (xy & ~0xC0000000) >> 16;
|
||||
z = z >> 16;
|
||||
}
|
||||
|
||||
mainWindow = window_get_main();
|
||||
if (mainWindow != NULL)
|
||||
window_scroll_to_location(mainWindow, x, y, z);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AF17E
|
||||
|
@ -1619,7 +1599,7 @@ static void window_ride_main_mouseup()
|
|||
window_ride_rename(w);
|
||||
break;
|
||||
case WIDX_LOCATE:
|
||||
window_ride_locate(w);
|
||||
window_scroll_to_viewport(w);
|
||||
break;
|
||||
case WIDX_DEMOLISH:
|
||||
window_ride_demolish_prompt_open(w->number);
|
||||
|
@ -1932,10 +1912,7 @@ static void window_ride_main_textinput()
|
|||
if (widgetIndex != WIDX_RENAME || !result)
|
||||
return;
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_RENAME_RIDE_ATTRACTION;
|
||||
game_do_command(1, (w->number << 8) | 1, 0, *((int*)(text + 0)), GAME_COMMAND_SET_RIDE_NAME, *((int*)(text + 8)), *((int*)(text + 4)));
|
||||
game_do_command(2, (w->number << 8) | 1, 0, *((int*)(text + 12)), GAME_COMMAND_SET_RIDE_NAME, *((int*)(text + 20)), *((int*)(text + 16)));
|
||||
game_do_command(0, (w->number << 8) | 1, 0, *((int*)(text + 24)), GAME_COMMAND_SET_RIDE_NAME, *((int*)(text + 32)), *((int*)(text + 28)));
|
||||
ride_set_name(w->number, text);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2431,7 +2408,7 @@ static void window_ride_vehicle_invalidate()
|
|||
|
||||
// Vehicle type
|
||||
window_ride_vehicle_widgets[WIDX_VEHICLE_TYPE].image = rideEntry->name;
|
||||
if (var_496(w) <= 1 && (w->enabled_widgets & (1 << WIDX_TAB_10))) {
|
||||
if (var_496(w) <= 1 || (rideEntry->var_008 & (1 << 13))) {
|
||||
window_ride_vehicle_widgets[WIDX_VEHICLE_TYPE].type = WWT_14;
|
||||
window_ride_vehicle_widgets[WIDX_VEHICLE_TYPE_DROPDOWN].type = WWT_EMPTY;
|
||||
w->enabled_widgets &= ~(1 << WIDX_VEHICLE_TYPE);
|
||||
|
@ -2508,18 +2485,24 @@ static void window_ride_vehicle_paint()
|
|||
if (!(rideEntry->var_008 & 0x2000) && var_496(w) > 1) {
|
||||
// Excitement Factor
|
||||
factor = rideEntry->excitement_multipler;
|
||||
gfx_draw_string_left(dpi, 3125, &factor, 0, x, y);
|
||||
y += 10;
|
||||
if (factor > 0) {
|
||||
gfx_draw_string_left(dpi, 3125, &factor, 0, x, y);
|
||||
y += 10;
|
||||
}
|
||||
|
||||
// Intensity Factor
|
||||
factor = rideEntry->intensity_multipler;
|
||||
gfx_draw_string_left(dpi, 3126, &factor, 0, x, y);
|
||||
y += 10;
|
||||
if (factor > 0) {
|
||||
gfx_draw_string_left(dpi, 3126, &factor, 0, x, y);
|
||||
y += 10;
|
||||
}
|
||||
|
||||
// Nausea Factor
|
||||
factor = rideEntry->nausea_multipler;
|
||||
gfx_draw_string_left(dpi, 3127, &factor, 0, x, y);
|
||||
y += 10;
|
||||
if (factor > 0) {
|
||||
gfx_draw_string_left(dpi, 3127, &factor, 0, x, y);
|
||||
y += 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3090,6 +3073,7 @@ static void window_ride_operating_invalidate()
|
|||
break;
|
||||
case RIDE_MODE_STATION_TO_STATION:
|
||||
RCT2_GLOBAL(0x013CE964, uint16) = (ride->var_0D0 * 9) / 4;
|
||||
format = 1331;
|
||||
caption = STR_SPEED;
|
||||
tooltip = STR_SPEED_TIP;
|
||||
break;
|
||||
|
@ -3221,7 +3205,7 @@ static void window_ride_maintenance_draw_bar(rct_window *w, rct_drawpixelinfo *d
|
|||
gfx_fill_rect_inset(dpi, x, y, x + 149, y + 8, w->colours[1], 0x30);
|
||||
if (unk & (1 << 31)) {
|
||||
unk &= ~(1 << 31);
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint8) == 0 && (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 8))
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0 && (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 8))
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5449,23 +5433,23 @@ static void window_ride_income_invalidate()
|
|||
window_ride_income_widgets[WIDX_PRIMARY_PRICE].image = STR_FREE;
|
||||
|
||||
primaryItem = 31;
|
||||
if (ride->type != RIDE_TYPE_BATHROOM) {
|
||||
if ((primaryItem = (sint8)rideEntry->shop_item) != -1) {
|
||||
window_ride_income_widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WWT_CHECKBOX;
|
||||
if (primaryItem < 32) {
|
||||
if (RCT2_GLOBAL(0x01358838, uint32) & (1 << primaryItem))
|
||||
w->pressed_widgets |= (1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK);
|
||||
if (ride->type == RIDE_TYPE_BATHROOM || ((primaryItem = (sint8)rideEntry->shop_item) != -1)) {
|
||||
window_ride_income_widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WWT_CHECKBOX;
|
||||
if (primaryItem < 32) {
|
||||
if (RCT2_GLOBAL(0x01358838, uint32) & (1 << primaryItem))
|
||||
w->pressed_widgets |= (1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK);
|
||||
|
||||
if (primaryItem != 31)
|
||||
window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].image = 1960 + primaryItem;
|
||||
} else {
|
||||
primaryItem -= 32;
|
||||
if (RCT2_GLOBAL(0x0135934C, uint32) & (1 << primaryItem))
|
||||
w->pressed_widgets |= (1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK);
|
||||
|
||||
window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].image = 2100 + primaryItem;
|
||||
}
|
||||
if (primaryItem != 31)
|
||||
window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].image = 1960 + primaryItem;
|
||||
}
|
||||
else {
|
||||
primaryItem -= 32;
|
||||
if (RCT2_GLOBAL(0x0135934C, uint32) & (1 << primaryItem))
|
||||
w->pressed_widgets |= (1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK);
|
||||
|
||||
window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].image = 2100 + primaryItem;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Get secondary item
|
||||
|
@ -5496,7 +5480,7 @@ static void window_ride_income_invalidate()
|
|||
w->pressed_widgets |= (1 << WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK);
|
||||
} else {
|
||||
secondaryItem -= 32;
|
||||
if (RCT2_GLOBAL(0x0135884C, uint32) & (1 << secondaryItem))
|
||||
if (RCT2_GLOBAL(0x0135934C, uint32) & (1 << secondaryItem))
|
||||
w->pressed_widgets |= (1 << WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK);
|
||||
}
|
||||
|
||||
|
@ -5570,9 +5554,9 @@ static void window_ride_income_paint()
|
|||
profit = ride->price_secondary;
|
||||
|
||||
stringId = STR_PROFIT_PER_ITEM_SOLD;
|
||||
profit -= primaryItem < 32 ?
|
||||
RCT2_GLOBAL(0x00982164 + (primaryItem * 8), uint16) :
|
||||
RCT2_GLOBAL(0x00982144 + (primaryItem * 8), uint16);
|
||||
profit -= secondaryItem < 32 ?
|
||||
RCT2_GLOBAL(0x00982164 + (secondaryItem * 8), uint16) :
|
||||
RCT2_GLOBAL(0x00982144 + (secondaryItem * 8), uint16);
|
||||
if (profit < 0) {
|
||||
profit *= -1;
|
||||
stringId = STR_LOSS_PER_ITEM_SOLD;
|
||||
|
@ -5752,7 +5736,7 @@ static void window_ride_customer_paint()
|
|||
y += 10;
|
||||
|
||||
// Popularity
|
||||
popularity = ride->var_158 & 0xFF;
|
||||
popularity = ride->popularity;
|
||||
if (popularity == 255) {
|
||||
stringId = STR_POPULARITY_UNKNOWN;
|
||||
} else {
|
||||
|
@ -5763,7 +5747,7 @@ static void window_ride_customer_paint()
|
|||
y += 10;
|
||||
|
||||
// Satisfaction
|
||||
satisfaction = ride->var_14A & 0xFF;
|
||||
satisfaction = ride->satisfaction;
|
||||
if (satisfaction == 255) {
|
||||
stringId = STR_SATISFACTION_UNKNOWN;
|
||||
} else {
|
||||
|
|
|
@ -189,7 +189,7 @@ rct_window *window_construction_open()
|
|||
RCT2_GLOBAL(0x00F440B6, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F440B7, uint8) = 0;
|
||||
|
||||
RCT2_GLOBAL(0x00F440AE, uint8) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F440A6, uint8) = 4;
|
||||
RCT2_GLOBAL(0x00F440B0, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F440B1, uint8) = 0;
|
||||
|
@ -216,12 +216,12 @@ void window_construction_close(){
|
|||
rct_map_element* map_element = sub_6CAF80(ride_id, &x, &y);
|
||||
|
||||
if ((int)map_element == -1){
|
||||
int eax = RCT2_GLOBAL(0x009DEA6E, uint8);
|
||||
int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8);
|
||||
|
||||
RCT2_GLOBAL(0x009DEA6E, uint8) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0;
|
||||
game_do_command(0, 9, 0, ride_id, GAME_COMMAND_7, 0, 0);
|
||||
|
||||
RCT2_GLOBAL(0x009DEA6E, uint8) = eax;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -247,12 +247,12 @@ void window_construction_maze_close(){
|
|||
rct_ride* ride = GET_RIDE(ride_id);
|
||||
|
||||
if (ride->overall_view == 0xFFFF){
|
||||
int eax = RCT2_GLOBAL(0x009DEA6E, uint8);
|
||||
int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8);
|
||||
|
||||
RCT2_GLOBAL(0x009DEA6E, uint8) = 0;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0;
|
||||
game_do_command(0, 9, 0, ride_id, GAME_COMMAND_7, 0, 0);
|
||||
|
||||
RCT2_GLOBAL(0x009DEA6E, uint8) = eax;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -314,11 +314,11 @@ void window_construction_mouseup_demolish(rct_window* w){
|
|||
if (RCT2_GLOBAL(0xF440A6, uint8) != 2){
|
||||
//6c9cc4
|
||||
int eax = RCT2_GLOBAL(0xF440A8, uint16),
|
||||
ebx = RCT2_GLOBAL(0xF440AF, uint8) || (RCT2_GLOBAL(0xF440AE, uint8) << 8),
|
||||
ebx = RCT2_GLOBAL(0xF440AF, uint8) || (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) << 8),
|
||||
ecx = RCT2_GLOBAL(0xF440AA, uint16),
|
||||
edx = RCT2_GLOBAL(0xF440AC, uint16);
|
||||
|
||||
sub_6C683D(&eax, &ecx, edx, RCT2_GLOBAL(0xF440AE, uint8), RCT2_GLOBAL(0xF440AF, uint8) & 0x3FF, 0, 0, 0);
|
||||
sub_6C683D(&eax, &ecx, edx, RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8), RCT2_GLOBAL(0xF440AF, uint8) & 0x3FF, 0, 0, 0);
|
||||
}
|
||||
|
||||
int ride_id = RCT2_GLOBAL(0xF440A7, uint8);
|
||||
|
|
|
@ -471,16 +471,16 @@ static void window_ride_list_scrollpaint()
|
|||
break;
|
||||
case INFORMATION_TYPE_POPULARITY:
|
||||
formatSecondary = STR_POPULARITY_UNKNOWN_LABEL;
|
||||
if ((ride->var_158 & 0xFF) != 255) {
|
||||
if (ride->popularity != 255) {
|
||||
formatSecondary = STR_POPULARITY_LABEL;
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint16) = (ride->var_158 & 0xFF) * 4;
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint16) = ride->popularity * 4;
|
||||
}
|
||||
break;
|
||||
case INFORMATION_TYPE_SATISFACTION:
|
||||
formatSecondary = STR_SATISFACTION_UNKNOWN_LABEL;
|
||||
if ((ride->var_14A & 0xFF) != 255) {
|
||||
if (ride->satisfaction != 255) {
|
||||
formatSecondary = STR_SATISFACTION_LABEL;
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint16) = (ride->var_14A & 0xFF) * 5;
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint16) = ride->satisfaction * 5;
|
||||
}
|
||||
break;
|
||||
case INFORMATION_TYPE_PROFIT:
|
||||
|
@ -616,7 +616,7 @@ static void window_ride_list_refresh_list(rct_window *w)
|
|||
case INFORMATION_TYPE_POPULARITY:
|
||||
while (--current_list_position >= 0) {
|
||||
otherRide = &g_ride_list[w->list_item_positions[current_list_position]];
|
||||
if ((ride->var_158 & 0xFF) * 4 <= (otherRide->var_158 & 0xFF) * 4)
|
||||
if (ride->popularity * 4 <= otherRide->popularity * 4)
|
||||
break;
|
||||
|
||||
window_bubble_list_item(w, current_list_position);
|
||||
|
@ -625,7 +625,7 @@ static void window_ride_list_refresh_list(rct_window *w)
|
|||
case INFORMATION_TYPE_SATISFACTION:
|
||||
while (--current_list_position >= 0) {
|
||||
otherRide = &g_ride_list[w->list_item_positions[current_list_position]];
|
||||
if ((ride->var_14A & 0xFF) * 5 <= (otherRide->var_14A & 0xFF) * 5)
|
||||
if (ride->satisfaction * 5 <= otherRide->satisfaction * 5)
|
||||
break;
|
||||
|
||||
window_bubble_list_item(w, current_list_position);
|
||||
|
|
|
@ -164,7 +164,7 @@ void window_save_prompt_open()
|
|||
window->colours[0] = 154;
|
||||
|
||||
// Pause the game
|
||||
RCT2_GLOBAL(0x009DEA6E, uint8) |= 2;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) |= 2;
|
||||
pause_sounds();
|
||||
window_invalidate_by_class(WC_TOP_TOOLBAR);
|
||||
|
||||
|
@ -215,7 +215,7 @@ void window_save_prompt_open()
|
|||
static void window_save_prompt_close()
|
||||
{
|
||||
// Unpause the game
|
||||
RCT2_GLOBAL(0x009DEA6E, uint8) &= ~2;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) &= ~2;
|
||||
unpause_sounds();
|
||||
window_invalidate_by_class(WC_TOP_TOOLBAR);
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include "../interface/window.h"
|
||||
#include "../interface/widget.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../platform/platform.h"
|
||||
|
||||
#define WW 340
|
||||
#define WH 240
|
||||
|
@ -257,7 +257,7 @@ static void window_shortcut_scrollpaint()
|
|||
|
||||
uint16 shortcut_entry = gShortcutKeys[i];
|
||||
if (shortcut_entry != 0xFFFF){
|
||||
RCT2_GLOBAL(0x13CE958, uint16) = STR_INDIVIDUAL_KEYS_BASE + osinterface_scancode_to_rct_keycode(shortcut_entry & 0xFF);
|
||||
RCT2_GLOBAL(0x13CE958, uint16) = STR_INDIVIDUAL_KEYS_BASE + platform_scancode_to_rct_keycode(shortcut_entry & 0xFF);
|
||||
//Display the modifer
|
||||
if (shortcut_entry & 0x100){
|
||||
RCT2_GLOBAL(0x13CE956, uint16) = STR_SHIFT_PLUS;
|
||||
|
|
|
@ -169,12 +169,11 @@ void window_sign_open(rct_windownumber number)
|
|||
|
||||
int view_x = gBanners[w->number].x << 5;
|
||||
int view_y = gBanners[w->number].y << 5;
|
||||
int ebp = ((view_y << 8) | view_x) >> 5;
|
||||
|
||||
rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(ebp);
|
||||
rct_map_element* map_element = map_get_first_element_at(view_x / 32, view_y / 32);
|
||||
|
||||
while (1){
|
||||
if ((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE){
|
||||
if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) {
|
||||
int ebx = map_element->properties.scenerymultiple.type;
|
||||
ebx |= (map_element->properties.scenerymultiple.index & 0x3) << 8;
|
||||
rct_scenery_entry* scenery_entry = g_largeSceneryEntries[ebx];
|
||||
|
@ -213,7 +212,7 @@ void window_sign_open(rct_windownumber number)
|
|||
view_z,
|
||||
0,
|
||||
-1
|
||||
);
|
||||
);
|
||||
|
||||
w->viewport->flags = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES) ? VIEWPORT_FLAG_GRIDLINES : 0;
|
||||
w->flags |= WF_2;
|
||||
|
@ -234,7 +233,7 @@ static void window_sign_mouseup()
|
|||
|
||||
rct_string_id string_id;
|
||||
|
||||
rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(((y << 8) | x) >> 5);
|
||||
rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_CLOSE:
|
||||
|
@ -242,7 +241,7 @@ static void window_sign_mouseup()
|
|||
break;
|
||||
case WIDX_SIGN_DEMOLISH:
|
||||
while (1){
|
||||
if ((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE){
|
||||
if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) {
|
||||
int ebx = map_element->properties.scenerymultiple.type;
|
||||
ebx |= (map_element->properties.scenerymultiple.index & 0x3) << 8;
|
||||
rct_scenery_entry* scenery_entry = g_largeSceneryEntries[ebx];
|
||||
|
@ -320,10 +319,10 @@ static void window_sign_dropdown()
|
|||
int x = banner->x << 5;
|
||||
int y = banner->y << 5;
|
||||
|
||||
rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(((y << 8) | x) >> 5);
|
||||
rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32);
|
||||
|
||||
while (1){
|
||||
if ((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE){
|
||||
if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) {
|
||||
int ebx = map_element->properties.scenerymultiple.type;
|
||||
ebx |= (map_element->properties.scenerymultiple.index & 0x3) << 8;
|
||||
rct_scenery_entry* scenery_entry = g_largeSceneryEntries[ebx];
|
||||
|
@ -361,17 +360,15 @@ static void window_sign_textinput()
|
|||
if (widgetIndex == WIDX_SIGN_TEXT && result) {
|
||||
|
||||
if (*text != 0){
|
||||
int string_id = 0, ebx = 0, ecx = 128, edx = 0, ebp = 0, esi = 0;
|
||||
RCT2_CALLFUNC_X(0x6C421D, &string_id, &ebx, &ecx, &edx, &esi, (int*)&text, &ebp);
|
||||
if (string_id){
|
||||
rct_string_id string_id = user_string_allocate(128, text);
|
||||
if (string_id != 0) {
|
||||
rct_string_id prev_string_id = banner->string_idx;
|
||||
banner->string_idx = string_id;
|
||||
user_string_free(prev_string_id);
|
||||
|
||||
banner->flags &= ~(BANNER_FLAG_2);
|
||||
gfx_invalidate_screen();
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
window_error_open(2984, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id));
|
||||
}
|
||||
}
|
||||
|
@ -499,12 +496,11 @@ void window_sign_small_open(rct_windownumber number){
|
|||
|
||||
int view_x = gBanners[w->number].x << 5;
|
||||
int view_y = gBanners[w->number].y << 5;
|
||||
int ebp = ((view_y << 8) | view_x) >> 5;
|
||||
|
||||
rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(ebp);
|
||||
|
||||
rct_map_element* map_element = map_get_first_element_at(view_x / 32, view_y / 32);
|
||||
|
||||
while (1){
|
||||
if ((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_FENCE){
|
||||
if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_FENCE) {
|
||||
rct_scenery_entry* scenery_entry = g_wallSceneryEntries[map_element->properties.fence.slope];
|
||||
if (scenery_entry->wall.var_0D != 0xFF){
|
||||
if (map_element->properties.fence.item[0] == w->number)
|
||||
|
@ -538,7 +534,7 @@ void window_sign_small_open(rct_windownumber number){
|
|||
view_z,
|
||||
0,
|
||||
-1
|
||||
);
|
||||
);
|
||||
|
||||
w->viewport->flags = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES) ? VIEWPORT_FLAG_GRIDLINES : 0;
|
||||
w->flags |= WF_2;
|
||||
|
@ -559,7 +555,7 @@ static void window_sign_small_mouseup()
|
|||
|
||||
rct_string_id string_id;
|
||||
|
||||
rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(((y << 8) | x) >> 5);
|
||||
rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32);
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_CLOSE:
|
||||
|
@ -567,7 +563,7 @@ static void window_sign_small_mouseup()
|
|||
break;
|
||||
case WIDX_SIGN_DEMOLISH:
|
||||
while (1){
|
||||
if ((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_FENCE){
|
||||
if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_FENCE) {
|
||||
rct_scenery_entry* scenery_entry = g_wallSceneryEntries[map_element->properties.fence.slope];
|
||||
if (scenery_entry->wall.var_0D != 0xFF){
|
||||
if (map_element->properties.fence.item[0] == w->number)
|
||||
|
@ -626,10 +622,10 @@ static void window_sign_small_dropdown()
|
|||
int x = banner->x << 5;
|
||||
int y = banner->y << 5;
|
||||
|
||||
rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(((y << 8) | x) >> 5);
|
||||
rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32);
|
||||
|
||||
while (1){
|
||||
if ((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_FENCE){
|
||||
if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_FENCE) {
|
||||
rct_scenery_entry* scenery_entry = g_wallSceneryEntries[map_element->properties.fence.slope];
|
||||
if (scenery_entry->wall.var_0D != 0xFF){
|
||||
if (map_element->properties.fence.item[0] == w->number)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue