diff --git a/data/language/english.txt b/data/language/english.txt
index 993121e79b..0c7ad629b2 100644
--- a/data/language/english.txt
+++ b/data/language/english.txt
@@ -836,7 +836,7 @@ STR_0834 :{SMALLFONT}{BLACK}Disk and game options
STR_0835 :Game initialization failed
STR_0836 :Unable to start game in a minimized state
STR_0837 :Unable to initialize graphics system
-STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{13}{13}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code
+STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code
STR_0839 :{UINT16} x {UINT16}
STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16}
STR_0841 :Desktop window
@@ -847,18 +847,18 @@ STR_0845 :1152x864 full screen
STR_0846 :1280x1024 full screen
STR_0847 :About 'RollerCoaster Tycoon 2'
STR_0848 :RollerCoaster Tycoon 2
-STR_0849 :{14}Version 2.01.028
-STR_0850 :{14}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved
-STR_0851 :{14}Designed and programmed by Chris Sawyer
-STR_0852 :{14}Graphics by Simon Foster
-STR_0853 :{14}Sound and music by Allister Brimble
-STR_0854 :{14}Additional sounds recorded by David Ellis
-STR_0855 :{14}Representation by Jacqui Lyons at Marjacq Ltd.
-STR_0856 :{14}Thanks to:-
-STR_0857 :{14}Peter James Adcock, Joe Booth, and John Wardley
-STR_0858 :{14}
-STR_0859 :{14}
-STR_0860 :{14}
+STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028
+STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved
+STR_0851 :{WINDOW_COLOUR_2}Designed and programmed by Chris Sawyer
+STR_0852 :{WINDOW_COLOUR_2}Graphics by Simon Foster
+STR_0853 :{WINDOW_COLOUR_2}Sound and music by Allister Brimble
+STR_0854 :{WINDOW_COLOUR_2}Additional sounds recorded by David Ellis
+STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd.
+STR_0856 :{WINDOW_COLOUR_2}Thanks to:-
+STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, and John Wardley
+STR_0858 :{WINDOW_COLOUR_2}
+STR_0859 :{WINDOW_COLOUR_2}
+STR_0860 :{WINDOW_COLOUR_2}
STR_0861 :
STR_0862 :
STR_0863 :
@@ -982,8 +982,8 @@ STR_0980 :New Thrill Rides
STR_0981 :New Water Rides
STR_0982 :New Shops & Stalls
STR_0983 :Research & Development
-STR_0984 :{14}{UP}{BLACK} {CURRENCY2DP}
-STR_0985 :{14}{DOWN}{BLACK} {CURRENCY2DP}
+STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP}
+STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP}
STR_0986 :{BLACK}{CURRENCY2DP}
STR_0987 :Too many rides/attractions
STR_0988 :Can't create new ride/attraction...
@@ -993,7 +993,7 @@ STR_0991 :Station platform
STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction
STR_0993 :Demolish ride/attraction
STR_0994 :Demolish
-STR_0995 :{13}Are you sure you want to completely demolish {STRINGID}?
+STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}?
STR_0996 :Overall view
STR_0997 :{SMALLFONT}{BLACK}View selection
STR_0998 :No more stations allowed on this ride
@@ -1048,7 +1048,7 @@ 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...{5}File contains invalid data!
+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
@@ -1140,8 +1140,8 @@ STR_1138 :{SMALLFONT}{BLACK}Select additional color 2
STR_1139 :{SMALLFONT}{BLACK}Select support structure color
STR_1140 :{SMALLFONT}{BLACK}Select vehicle color scheme option
STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify
-STR_1142 :{1}{SMALLFONT}{STRINGID}
-STR_1143 :{RIGHTGUILLEMET}{1}{SMALLFONT}{STRINGID}
+STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID}
+STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID}
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
@@ -1154,15 +1154,15 @@ STR_1152 :Any load
STR_1153 :Height Marks on Ride Tracks
STR_1154 :Height Marks on Land
STR_1155 :Height Marks on Paths
-STR_1156 :{1}{SMALLFONT}{STRINGID}
-STR_1157 :{TICK}{1}{SMALLFONT}{STRINGID}
+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_1162 :{OUTLINE}{TOPAZ}{STRINGID}
-STR_1163 :{STRINGID}{5}(Right-Click to Modify)
-STR_1164 :{STRINGID}{5}(Right-Click to Remove)
+STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify)
+STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove)
STR_1165 :{STRINGID} - {STRINGID} {COMMA16}
STR_1166 :Can't lower water level here...
STR_1167 :Can't raise water level here...
@@ -1191,7 +1191,7 @@ STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section
STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section
STR_1191 :{BLACK}{STRINGID}
STR_1192 :{OUTLINE}{RED}{STRINGID}
-STR_1193 :{14}{STRINGID}
+STR_1193 :{WINDOW_COLOUR_2}{STRINGID}
STR_1194 :Closed
STR_1195 :Test Run
STR_1196 :Open
@@ -1204,16 +1204,16 @@ STR_1202 :1 person in queue line
STR_1203 :{COMMA16} people in queue line
STR_1204 :{COMMA16} minute queue time
STR_1205 :{COMMA16} minutes queue time
-STR_1206 :{14}Wait for:
-STR_1207 :{14}Leave if another train arrives at station
-STR_1208 :{14}Leave if another boat arrives at station
+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 :{14}Minimum waiting time:
-STR_1212 :{14}Maximum waiting time:
+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 :{14}Synchronize with adjacent stations
+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_1218 :{BLACK}{SMALLUP}
@@ -1327,7 +1327,7 @@ STR_1325 :{COMMA16} courses
STR_1326 :Course {COMMA16}
STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE}
STR_1328 :Level land required
-STR_1329 :{14}Launch speed:
+STR_1329 :{WINDOW_COLOUR_2}Launch speed:
STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station
STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY}
STR_1332 :{VELOCITY}
@@ -1338,27 +1338,27 @@ STR_1336 :{STRINGID} - Station {POP16}{COMMA16} Entrance
STR_1337 :{STRINGID} - Exit{POP16}{POP16}
STR_1338 :{STRINGID} - Station {POP16}{COMMA16} Exit
STR_1339 :{BLACK}No test results yet...
-STR_1340 :{14}Max. speed: {BLACK}{VELOCITY}
-STR_1341 :{14}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID}
+STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY}
+STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID}
STR_1342 :{DURATION}
STR_1343 :{DURATION} /
-STR_1344 :{14}Ride length: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID}
+STR_1344 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID}
STR_1345 :{LENGTH}
STR_1346 :{LENGTH} /
-STR_1347 :{14}Average speed: {BLACK}{VELOCITY}
-STR_1348 :{14}Max. positive vertical G's: {BLACK}{COMMA2DP32}g
-STR_1349 :{14}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g
-STR_1350 :{14}Max. negative vertical G's: {BLACK}{COMMA2DP32}g
-STR_1351 :{14}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g
-STR_1352 :{14}Max. lateral G's: {BLACK}{COMMA2DP32}g
-STR_1353 :{14}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g
-STR_1354 :{14}Highest drop height: {BLACK}{LENGTH}
-STR_1355 :{14}Drops: {BLACK}{COMMA16}
-STR_1356 :{14}Inversions: {BLACK}{COMMA16}
-STR_1357 :{14}Holes: {BLACK}{COMMA16}
-STR_1358 :{14}Total 'air' time: {BLACK}{COMMA2DP32}secs
-STR_1359 :{14}Queue time: {BLACK}{COMMA16} minute
-STR_1360 :{14}Queue time: {BLACK}{COMMA16} minutes
+STR_1347 :{WINDOW_COLOUR_2}Average speed: {BLACK}{VELOCITY}
+STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g
+STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g
+STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g
+STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g
+STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g
+STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g
+STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH}
+STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16}
+STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16}
+STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16}
+STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs
+STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute
+STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes
STR_1361 :Can't change speed...
STR_1362 :Can't change launch speed...
STR_1363 :Too high for supports!
@@ -1405,18 +1405,18 @@ STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction
STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE}
STR_1405 :{SMALLFONT}{BLACK}Mirror image
STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design)
-STR_1407 :{14}Build this...
-STR_1408 :{14}Cost: {BLACK}{CURRENCY}
+STR_1407 :{WINDOW_COLOUR_2}Build this...
+STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY}
STR_1409 :Entry/Exit Platform
STR_1410 :Vertical Tower
STR_1411 :{STRINGID} in the way
-STR_1412 :{15}Data logging not available for this type of ride
-STR_1413 :{15}Data logging will start when next {STRINGID} leaves {STRINGID}
+STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride
+STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID}
STR_1414 :{SMALLFONT}{BLACK}{DURATION}
-STR_1415 :{14}Velocity
-STR_1416 :{14}Altitude
-STR_1417 :{14}Vert.G's
-STR_1418 :{14}Lat.G's
+STR_1415 :{WINDOW_COLOUR_2}Velocity
+STR_1416 :{WINDOW_COLOUR_2}Altitude
+STR_1417 :{WINDOW_COLOUR_2}Vert.G's
+STR_1418 :{WINDOW_COLOUR_2}Lat.G's
STR_1419 :{SMALLFONT}{BLACK}{VELOCITY}
STR_1420 :{SMALLFONT}{BLACK}{LENGTH}
STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g
@@ -1425,8 +1425,8 @@ STR_1423 :{SMALLFONT}{BLACK}Queue line path
STR_1424 :{SMALLFONT}{BLACK}Footpath
STR_1425 :Footpath
STR_1426 :Queue Line
-STR_1427 :{14}Customers: {BLACK}{COMMA32} per hour
-STR_1428 :{14}Admission price:
+STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour
+STR_1428 :{WINDOW_COLOUR_2}Admission price:
STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP}
STR_1430 :Free
STR_1431 :Walking
@@ -1447,16 +1447,16 @@ STR_1445 :Watching construction of {STRINGID}
STR_1446 :Looking at scenery
STR_1447 :Leaving the park
STR_1448 :Watching new ride being constructed
-STR_1449 :{SPRITE} {STRINGID}{5}({STRINGID})
-STR_1450 :{23}{MEDIUMFONT}{20}
-STR_1451 :{STRINGID}{5}({STRINGID})
+STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID})
+STR_1450 :{INLINE_SPRITE}{MEDIUMFONT}{20}
+STR_1451 :{STRINGID}{NEWLINE}({STRINGID})
STR_1452 :Guest's name
STR_1453 :Enter name for this guest:-
STR_1454 :Can't name guest...
STR_1455 :Invalid name for guest
-STR_1456 :{14}Cash spent: {BLACK}{CURRENCY2DP}
-STR_1457 :{14}Cash in pocket: {BLACK}{CURRENCY2DP}
-STR_1458 :{14}Time in park: {BLACK}{REALTIME}
+STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP}
+STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP}
+STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME}
STR_1459 :Track style
STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track
STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track
@@ -1469,15 +1469,15 @@ STR_1467 :Helix down (large)
STR_1468 :Staff
STR_1469 :Ride must start and end with stations
STR_1470 :Station not long enough
-STR_1471 :{14}Speed:
+STR_1471 :{WINDOW_COLOUR_2}Speed:
STR_1472 :{SMALLFONT}{BLACK}Speed of this ride
-STR_1473 :{14}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID})
-STR_1474 :{14}Excitement rating: {BLACK}Not yet available
-STR_1475 :{14}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID})
-STR_1476 :{14}Intensity rating: {BLACK}Not yet available
-STR_1477 :{14}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID})
-STR_1478 :{14}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID})
-STR_1479 :{14}Nausea rating: {BLACK}Not yet available
+STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID})
+STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available
+STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID})
+STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available
+STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID})
+STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID})
+STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available
STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES}
STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES}
STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES}
@@ -1652,31 +1652,31 @@ 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 :{14}Recent thoughts:
+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 :{14}Preferred ride
-STR_1658 :{14}intensity: {BLACK}less than {COMMA16}
-STR_1659 :{14}intensity: {BLACK}between {COMMA16} and {COMMA16}
-STR_1660 :{14}intensity: {BLACK}more than {COMMA16}
-STR_1661 :{14}Nausea tolerance: {BLACK}{STRINGID}
-STR_1662 :{14}Happiness:
-STR_1663 :{14}Nausea:
-STR_1664 :{14}Energy:
-STR_1665 :{14}Hunger:
-STR_1666 :{14}Thirst:
-STR_1667 :{14}Bathroom:
-STR_1668 :{14}Satisfaction: {BLACK}Unknown
-STR_1669 :{14}Satisfaction: {BLACK}{COMMA16}%
-STR_1670 :{14}Total customers: {BLACK}{COMMA32}
-STR_1671 :{14}Total profit: {BLACK}{CURRENCY2DP}
+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:
+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}
+STR_1671 :{WINDOW_COLOUR_2}Total profit: {BLACK}{CURRENCY2DP}
STR_1672 :Brakes
STR_1673 :Spinning Control Toggle Track
STR_1674 :Brake speed
STR_1675 :{POP16}{VELOCITY}
STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes
-STR_1677 :{14}Popularity: {BLACK}Unknown
-STR_1678 :{14}Popularity: {BLACK}{COMMA16}%
+STR_1677 :{WINDOW_COLOUR_2}Popularity: {BLACK}Unknown
+STR_1678 :{WINDOW_COLOUR_2}Popularity: {BLACK}{COMMA16}%
STR_1679 :Helix up (left)
STR_1680 :Helix up (right)
STR_1681 :Helix down (left)
@@ -1688,9 +1688,9 @@ STR_1686 :Base size 5 x 1
STR_1687 :Water splash
STR_1688 :Base size 4 x 1
STR_1689 :Block brakes
-STR_1690 :{14}{STRINGID}{5}{BLACK}{STRINGID}
-STR_1691 :{14} Cost: {BLACK}{CURRENCY}
-STR_1692 :{14} Cost: {BLACK}from {CURRENCY}
+STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID}
+STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY}
+STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY}
STR_1693 :{SMALLFONT}{BLACK}Guests
STR_1694 :{SMALLFONT}{BLACK}Staff
STR_1695 :{SMALLFONT}{BLACK}Income and costs
@@ -1709,11 +1709,11 @@ STR_1707 :Too many staff in game
STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member
STR_1709 :Sack staff
STR_1710 :Yes
-STR_1711 :{13}Are you sure you want to sack {STRINGID}?
-STR_1712 :{23}{247}{19}
-STR_1713 :{23}{248}{19}
-STR_1714 :{23}{249}{19}
-STR_1715 :{23}{250}{19}
+STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}?
+STR_1712 :{INLINE_SPRITE}{247}{19}
+STR_1713 :{INLINE_SPRITE}{248}{19}
+STR_1714 :{INLINE_SPRITE}{249}{19}
+STR_1715 :{INLINE_SPRITE}{250}{19}
STR_1716 :Invalid name for park
STR_1717 :Can't rename park...
STR_1718 :Park Name
@@ -1732,7 +1732,7 @@ STR_1730 :{RED}Closed - -
STR_1731 :{WHITE}{STRINGID} - -
STR_1732 :Build
STR_1733 :Mode
-STR_1734 :{14}Number of laps:
+STR_1734 :{WINDOW_COLOUR_2}Number of laps:
STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit
STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16}
STR_1737 :{COMMA16}
@@ -1740,12 +1740,12 @@ STR_1738 :Can't change number of laps...
STR_1739 :Race won by guest {INT32}
STR_1740 :Race won by {STRINGID}
STR_1741 :Not yet constructed !
-STR_1742 :{14}Max. people on ride:
+STR_1742 :{WINDOW_COLOUR_2}Max. people on ride:
STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time
STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16}
STR_1745 :{COMMA16}
STR_1746 :Can't change this...
-STR_1747 :{14}Time limit:
+STR_1747 :{WINDOW_COLOUR_2}Time limit:
STR_1748 :{SMALLFONT}{BLACK}Time limit for ride
STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION}
STR_1750 :{DURATION}
@@ -1754,8 +1754,8 @@ STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park
STR_1753 :{SMALLFONT}{BLACK}Show summarized list of guests in park
STR_1754 :{BLACK}{COMMA16} guests
STR_1755 :{BLACK}{COMMA16} guest
-STR_1756 :{14}Admission price:
-STR_1757 :{14}Reliability: {1}{255}{BLACK}{COMMA16}%
+STR_1756 :{WINDOW_COLOUR_2}Admission price:
+STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}%
STR_1758 :{SMALLFONT}{BLACK}Build mode
STR_1759 :{SMALLFONT}{BLACK}Move mode
STR_1760 :{SMALLFONT}{BLACK}Fill-in mode
@@ -1767,7 +1767,7 @@ STR_1765 :On-ride photo section
STR_1766 :Reverser turntable
STR_1767 :Spinning tunnel
STR_1768 :Can't change number of swings...
-STR_1769 :{14}Number of swings:
+STR_1769 :{WINDOW_COLOUR_2}Number of swings:
STR_1770 :{SMALLFONT}{BLACK}Number of complete swings
STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16}
STR_1772 :{COMMA16}
@@ -1775,21 +1775,21 @@ STR_1773 :Only one on-ride photo section allowed per ride
STR_1774 :Only one cable lift hill allowed per ride
STR_1775 :Off
STR_1776 :On
-STR_1777 :{14}Music:
+STR_1777 :{WINDOW_COLOUR_2}Music:
STR_1778 :{STRINGID} - -
-STR_1779 :{23}{254}{19}
-STR_1780 :{23}{255}{19}
-STR_1781 :{23}
-STR_1782 :{23}{1}{20}
-STR_1783 :{23}{2}{20}
-STR_1784 :{23}{3}{20}
-STR_1785 :{23}{4}{20}
-STR_1786 :{23}{5}{20}
-STR_1787 :{23}{6}{20}
-STR_1788 :{23}{TINYFONT}{20}
-STR_1789 :{23}{BIGFONT}{20}
+STR_1779 :{INLINE_SPRITE}{254}{19}
+STR_1780 :{INLINE_SPRITE}{255}{19}
+STR_1781 :{INLINE_SPRITE}
+STR_1782 :{INLINE_SPRITE}{MOVE_X}{20}
+STR_1783 :{INLINE_SPRITE}{ADJUST_PALETTE}{20}
+STR_1784 :{INLINE_SPRITE}{3}{20}
+STR_1785 :{INLINE_SPRITE}{4}{20}
+STR_1786 :{INLINE_SPRITE}{NEWLINE}{20}
+STR_1787 :{INLINE_SPRITE}{NEWLINE_SMALLER}{20}
+STR_1788 :{INLINE_SPRITE}{TINYFONT}{20}
+STR_1789 :{INLINE_SPRITE}{BIGFONT}{20}
STR_1790 :{SMALLFONT}{BLACK}Select uniform color for this type of staff
-STR_1791 :{14}Uniform color:
+STR_1791 :{WINDOW_COLOUR_2}Uniform color:
STR_1792 :Responding to {STRINGID} breakdown call
STR_1793 :Heading to {STRINGID} for an inspection
STR_1794 :Fixing {STRINGID}
@@ -1806,9 +1806,9 @@ STR_1804 :Doors stuck open
STR_1805 :Vehicle malfunction
STR_1806 :Brakes failure
STR_1807 :Control failure
-STR_1808 :{14}Last breakdown: {BLACK}{STRINGID}
-STR_1809 :{14}Current breakdown: {OUTLINE}{RED}{STRINGID}
-STR_1810 :{14}Carrying:
+STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID}
+STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID}
+STR_1810 :{WINDOW_COLOUR_2}Carrying:
STR_1811 :Can't build this here...
STR_1812 :{SMALLFONT}{BLACK}{STRINGID}
STR_1813 :Miscellaneous Objects
@@ -1816,11 +1816,11 @@ STR_1814 :Actions
STR_1815 :Thoughts
STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list
STR_1817 :({COMMA16})
-STR_1818 :{14}All guests
-STR_1819 :{14}All guests (summarized)
-STR_1820 :{14}Guests {STRINGID}
-STR_1821 :{14}Guests thinking {STRINGID}
-STR_1822 :{14}Guests thinking about {POP16}{STRINGID}
+STR_1818 :{WINDOW_COLOUR_2}All guests
+STR_1819 :{WINDOW_COLOUR_2}All guests (summarized)
+STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID}
+STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID}
+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
@@ -1845,18 +1845,18 @@ STR_1843 :Favorite of: {COMMA16} guests
STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list
STR_1845 :{MONTHYEAR}
STR_1846 :{COMMA16} guests
-STR_1847 :{23}{OUTLINE}{20}
-STR_1848 :{23}{SMALLFONT}{20}
-STR_1849 :{14}Play music
+STR_1847 :{INLINE_SPRITE}{OUTLINE}{20}
+STR_1848 :{INLINE_SPRITE}{SMALLFONT}{20}
+STR_1849 :{WINDOW_COLOUR_2}Play music
STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride
-STR_1851 :{14}Running cost: {BLACK}{CURRENCY2DP} per hour
-STR_1852 :{14}Running cost: {BLACK}Unknown
-STR_1853 :{14}Built: {BLACK}This Year
-STR_1854 :{14}Built: {BLACK}Last Year
-STR_1855 :{14}Built: {BLACK}{COMMA16} Years Ago
-STR_1856 :{14}Profit per item sold: {BLACK}{CURRENCY2DP}
-STR_1857 :{14}Loss per item sold: {BLACK}{CURRENCY2DP}
-STR_1858 :{14}Cost: {BLACK}{CURRENCY} per month
+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
@@ -1867,16 +1867,16 @@ STR_1865 :Security Guard
STR_1866 :Entertainer
STR_1867 :{BLACK}{COMMA16} {STRINGID}
STR_1868 :Can't change number of rotations...
-STR_1869 :{14}Number of rotations:
+STR_1869 :{WINDOW_COLOUR_2}Number of rotations:
STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations
STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16}
STR_1872 :{COMMA16}
-STR_1873 :{14}Income: {BLACK}{CURRENCY} per hour
-STR_1874 :{14}Profit: {BLACK}{CURRENCY} per hour
+STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY} per hour
+STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY} per hour
STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID}
-STR_1876 :{14}{23}{251}{19}
-STR_1877 :{14}{23}{252}{19}
-STR_1878 :{14}Inspection:
+STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}
+STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}
+STR_1878 :{WINDOW_COLOUR_2}Inspection:
STR_1879 :Every 10 minutes
STR_1880 :Every 20 minutes
STR_1881 :Every 30 minutes
@@ -1885,36 +1885,36 @@ STR_1883 :Every hour
STR_1884 :Every 2 hours
STR_1885 :Never
STR_1886 :Inspecting {STRINGID}
-STR_1887 :{14}Time since last inspection: {BLACK}{COMMA16} minutes
-STR_1888 :{14}Time since last inspection: {BLACK}more than 4 hours
-STR_1889 :{14}Down-Time: {1}{255}{BLACK}{COMMA16}%
+STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes
+STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours
+STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}%
STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride
STR_1891 :No {STRINGID} in park yet!
STR_1892 :RollerCoaster Tycoon 2
STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive:-
-STR_1894 :{14}{STRINGID} sold: {BLACK}{COMMA32}
+STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32}
STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction
-STR_1896 :{14}Expenditure/Income
-STR_1897 :{14}Ride construction
-STR_1898 :{14}Ride running costs
-STR_1899 :{14}Land purchase
-STR_1900 :{14}Landscaping
-STR_1901 :{14}Park entrance tickets
-STR_1902 :{14}Ride tickets
-STR_1903 :{14}Shop sales
-STR_1904 :{14}Shop stock
-STR_1905 :{14}Food/drink sales
-STR_1906 :{14}Food/drink stock
-STR_1907 :{14}Staff wages
-STR_1908 :{14}Marketing
-STR_1909 :{14}Research
-STR_1910 :{14}Loan interest
+STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income
+STR_1897 :{WINDOW_COLOUR_2}Ride construction
+STR_1898 :{WINDOW_COLOUR_2}Ride running costs
+STR_1899 :{WINDOW_COLOUR_2}Land purchase
+STR_1900 :{WINDOW_COLOUR_2}Landscaping
+STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets
+STR_1902 :{WINDOW_COLOUR_2}Ride tickets
+STR_1903 :{WINDOW_COLOUR_2}Shop sales
+STR_1904 :{WINDOW_COLOUR_2}Shop stock
+STR_1905 :{WINDOW_COLOUR_2}Food/drink sales
+STR_1906 :{WINDOW_COLOUR_2}Food/drink stock
+STR_1907 :{WINDOW_COLOUR_2}Staff wages
+STR_1908 :{WINDOW_COLOUR_2}Marketing
+STR_1909 :{WINDOW_COLOUR_2}Research
+STR_1910 :{WINDOW_COLOUR_2}Loan interest
STR_1911 :{BLACK} at {COMMA16}% per year
STR_1912 :{MONTH}
STR_1913 :{BLACK}+{CURRENCY2DP}
STR_1914 :{BLACK}{CURRENCY2DP}
STR_1915 :{RED}{CURRENCY2DP}
-STR_1916 :{14}Loan:
+STR_1916 :{WINDOW_COLOUR_2}Loan:
STR_1917 :{POP16}{POP16}{POP16}{CURRENCY}
STR_1918 :Can't borrow any more money!
STR_1919 :Not enough cash available!
@@ -1927,7 +1927,7 @@ STR_1925 :Can't place person here...
STR_1926 :{SMALLFONT}
STR_1927 :{YELLOW}{STRINGID} has broken down
STR_1928 :{RED}{STRINGID} has crashed!
-STR_1929 :{RED}{STRINGID} still hasn't been fixed{5}Check where your mechanics are and consider organizing them better
+STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better
STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area)
STR_1931 :{STRINGID} has joined the queue line for {STRINGID}
STR_1932 :{STRINGID} is on {STRINGID}
@@ -1953,39 +1953,39 @@ STR_1951 :Park Value Graph
STR_1952 :Profit Graph
STR_1953 :Marketing
STR_1954 :Research Funding
-STR_1955 :{14}Number of circuits:
+STR_1955 :{WINDOW_COLOUR_2}Number of circuits:
STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride
STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16}
STR_1958 :{COMMA16}
STR_1959 :Can't change number of circuits...
-STR_1960 :{14}Balloon price:
-STR_1961 :{14}Cuddly Toy price:
-STR_1962 :{14}Park Map price:
-STR_1963 :{14}On-Ride Photo price:
-STR_1964 :{14}Umbrella price:
-STR_1965 :{14}Drink price:
-STR_1966 :{14}Burger price:
-STR_1967 :{14}Fries price:
-STR_1968 :{14}Ice Cream price:
-STR_1969 :{14}Cotton Candy price:
-STR_1970 :{14}
-STR_1971 :{14}
-STR_1972 :{14}
-STR_1973 :{14}Pizza price:
-STR_1974 :{14}
-STR_1975 :{14}Popcorn price:
-STR_1976 :{14}Hot Dog price:
-STR_1977 :{14}Tentacle price:
-STR_1978 :{14}Hat price:
-STR_1979 :{14}Candy Apple price:
-STR_1980 :{14}T-Shirt price:
-STR_1981 :{14}Donut price:
-STR_1982 :{14}Coffee price:
-STR_1983 :{14}
-STR_1984 :{14}Fried Chicken price:
-STR_1985 :{14}Lemonade price:
-STR_1986 :{14}
-STR_1987 :{14}
+STR_1960 :{WINDOW_COLOUR_2}Balloon price:
+STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price:
+STR_1962 :{WINDOW_COLOUR_2}Park Map price:
+STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price:
+STR_1964 :{WINDOW_COLOUR_2}Umbrella price:
+STR_1965 :{WINDOW_COLOUR_2}Drink price:
+STR_1966 :{WINDOW_COLOUR_2}Burger price:
+STR_1967 :{WINDOW_COLOUR_2}Fries price:
+STR_1968 :{WINDOW_COLOUR_2}Ice Cream price:
+STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price:
+STR_1970 :{WINDOW_COLOUR_2}
+STR_1971 :{WINDOW_COLOUR_2}
+STR_1972 :{WINDOW_COLOUR_2}
+STR_1973 :{WINDOW_COLOUR_2}Pizza price:
+STR_1974 :{WINDOW_COLOUR_2}
+STR_1975 :{WINDOW_COLOUR_2}Popcorn price:
+STR_1976 :{WINDOW_COLOUR_2}Hot Dog price:
+STR_1977 :{WINDOW_COLOUR_2}Tentacle price:
+STR_1978 :{WINDOW_COLOUR_2}Hat price:
+STR_1979 :{WINDOW_COLOUR_2}Candy Apple price:
+STR_1980 :{WINDOW_COLOUR_2}T-Shirt price:
+STR_1981 :{WINDOW_COLOUR_2}Donut price:
+STR_1982 :{WINDOW_COLOUR_2}Coffee price:
+STR_1983 :{WINDOW_COLOUR_2}
+STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price:
+STR_1985 :{WINDOW_COLOUR_2}Lemonade price:
+STR_1986 :{WINDOW_COLOUR_2}
+STR_1987 :{WINDOW_COLOUR_2}
STR_1988 :Balloon
STR_1989 :Cuddly Toy
STR_1990 :Park Map
@@ -2098,28 +2098,28 @@ STR_2096 :Fried Chicken
STR_2097 :Lemonade
STR_2098 :Empty Box
STR_2099 :Empty Bottle
-STR_2100 :{14}On-Ride Photo price:
-STR_2101 :{14}On-Ride Photo price:
-STR_2102 :{14}On-Ride Photo price:
-STR_2103 :{14}Pretzel price:
-STR_2104 :{14}Hot Chocolate price:
-STR_2105 :{14}Iced Tea price:
-STR_2106 :{14}Funnel Cake price:
-STR_2107 :{14}Sunglasses price:
-STR_2108 :{14}Beef Noodles price:
-STR_2109 :{14}Fried Rice Noodles price:
-STR_2110 :{14}Wonton Soup price:
-STR_2111 :{14}Meatball Soup price:
-STR_2112 :{14}Fruit Juice price:
-STR_2113 :{14}Soybean Milk price:
-STR_2114 :{14}Sujongkwa price:
-STR_2115 :{14}Sub Sandwich price:
-STR_2116 :{14}Cookie price:
-STR_2117 :{14}
-STR_2118 :{14}
-STR_2119 :{14}
-STR_2120 :{14}Roast Sausage price:
-STR_2121 :{14}
+STR_2100 :{WINDOW_COLOUR_2}On-Ride Photo price:
+STR_2101 :{WINDOW_COLOUR_2}On-Ride Photo price:
+STR_2102 :{WINDOW_COLOUR_2}On-Ride Photo price:
+STR_2103 :{WINDOW_COLOUR_2}Pretzel price:
+STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price:
+STR_2105 :{WINDOW_COLOUR_2}Iced Tea price:
+STR_2106 :{WINDOW_COLOUR_2}Funnel Cake price:
+STR_2107 :{WINDOW_COLOUR_2}Sunglasses price:
+STR_2108 :{WINDOW_COLOUR_2}Beef Noodles price:
+STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price:
+STR_2110 :{WINDOW_COLOUR_2}Wonton Soup price:
+STR_2111 :{WINDOW_COLOUR_2}Meatball Soup price:
+STR_2112 :{WINDOW_COLOUR_2}Fruit Juice price:
+STR_2113 :{WINDOW_COLOUR_2}Soybean Milk price:
+STR_2114 :{WINDOW_COLOUR_2}Sujongkwa price:
+STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price:
+STR_2116 :{WINDOW_COLOUR_2}Cookie price:
+STR_2117 :{WINDOW_COLOUR_2}
+STR_2118 :{WINDOW_COLOUR_2}
+STR_2119 :{WINDOW_COLOUR_2}
+STR_2120 :{WINDOW_COLOUR_2}Roast Sausage price:
+STR_2121 :{WINDOW_COLOUR_2}
STR_2122 :On-Ride Photo
STR_2123 :On-Ride Photo
STR_2124 :On-Ride Photo
@@ -2213,20 +2213,20 @@ STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park
STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park
STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park
STR_2214 :Construction not possible while game is paused!
-STR_2215 :{STRINGID}{5}({STRINGID})
-STR_2216 :{14}{COMMA16}{DEGREE}C
-STR_2217 :{14}{COMMA16}F
-STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{5}Check whether it is stuck or has stalled
+STR_2215 :{STRINGID}{NEWLINE}({STRINGID})
+STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C
+STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F
+STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled
STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID}
-STR_2220 :{14}Park Rating: {BLACK}{COMMA16}
+STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16}
STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16}
STR_2222 :{SMALLFONT}{BLACK}{STRINGID}
-STR_2223 :{14}Guests in park: {BLACK}{COMMA16}
-STR_2224 :{14}Cash: {BLACK}{CURRENCY2DP}
-STR_2225 :{14}Cash: {RED}{CURRENCY2DP}
-STR_2226 :{14}Park value: {BLACK}{CURRENCY}
-STR_2227 :{14}Company value: {BLACK}{CURRENCY}
-STR_2228 :{14}Last month's profit from food/drink and{5}merchandise sales: {BLACK}{CURRENCY}
+STR_2223 :{WINDOW_COLOUR_2}Guests in park: {BLACK}{COMMA16}
+STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP}
+STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP}
+STR_2226 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY}
+STR_2227 :{WINDOW_COLOUR_2}Company value: {BLACK}{CURRENCY}
+STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY}
STR_2229 :Slope up to vertical
STR_2230 :Vertical track
STR_2231 :Holding brake for drop
@@ -2247,8 +2247,8 @@ STR_2245 :October
STR_2246 :November
STR_2247 :December
STR_2248 :Can't demolish ride/attraction...
-STR_2249 :{BABYBLUE}New ride/attraction now available:-{5}{STRINGID}
-STR_2250 :{BABYBLUE}New scenery/themeing now available:-{5}{STRINGID}
+STR_2249 :{BABYBLUE}New ride/attraction now available:-{NEWLINE}{STRINGID}
+STR_2250 :{BABYBLUE}New scenery/themeing now available:-{NEWLINE}{STRINGID}
STR_2251 :Can only be built on paths!
STR_2252 :Can only be built across paths!
STR_2253 :Transport Rides
@@ -2263,15 +2263,15 @@ STR_2261 :Minimum funding
STR_2262 :Normal funding
STR_2263 :Maximum funding
STR_2264 :Research funding
-STR_2265 :{14}Cost: {BLACK}{CURRENCY} per month
+STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month
STR_2266 :Research priorities
STR_2267 :Currently in development
STR_2268 :Last development
-STR_2269 :{14}Type: {BLACK}{STRINGID}
-STR_2270 :{14}Progress: {BLACK}{STRINGID}
-STR_2271 :{14}Expected: {BLACK}{STRINGID}
-STR_2272 :{14}Ride/attraction:{5}{BLACK}{STRINGID}
-STR_2273 :{14}Scenery/themeing:{5}{BLACK}{STRINGID}
+STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID}
+STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID}
+STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID}
+STR_2272 :{WINDOW_COLOUR_2}Ride/attraction:{NEWLINE}{BLACK}{STRINGID}
+STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID}
STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development
STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development
STR_2276 :{SMALLFONT}{BLACK}Show research & development status
@@ -2290,46 +2290,46 @@ STR_2288 :Unknown
STR_2289 :{STRINGID} {STRINGID}
STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID}
STR_2291 :Select scenario for new game
-STR_2292 :{14}Rides been on:
+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}{14} paid to enter park
-STR_2297 :{BLACK}{CURRENCY2DP}{14} spent on {BLACK}{COMMA16} ride
-STR_2298 :{BLACK}{CURRENCY2DP}{14} spent on {BLACK}{COMMA16} rides
-STR_2299 :{BLACK}{CURRENCY2DP}{14} spent on {BLACK}{COMMA16} item of food
-STR_2300 :{BLACK}{CURRENCY2DP}{14} spent on {BLACK}{COMMA16} items of food
-STR_2301 :{BLACK}{CURRENCY2DP}{14} spent on {BLACK}{COMMA16} drink
-STR_2302 :{BLACK}{CURRENCY2DP}{14} spent on {BLACK}{COMMA16} drinks
-STR_2303 :{BLACK}{CURRENCY2DP}{14} spent on {BLACK}{COMMA16} souvenir
-STR_2304 :{BLACK}{CURRENCY2DP}{14} spent on {BLACK}{COMMA16} souvenirs
+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
STR_2305 :Track design files
STR_2306 :Save track design
STR_2307 :Select {STRINGID} design
STR_2308 :{STRINGID} Track Designs
STR_2309 :Install New Track Design
STR_2310 :Build custom design
-STR_2311 :{14}Excitement rating: {BLACK}{COMMA2DP32} (approx.)
-STR_2312 :{14}Intensity rating: {BLACK}{COMMA2DP32} (approx.)
-STR_2313 :{14}Nausea rating: {BLACK}{COMMA2DP32} (approx.)
-STR_2314 :{14}Ride length: {BLACK}{STRINGID}
-STR_2315 :{14}Cost: {BLACK}around {CURRENCY}
-STR_2316 :{14}Space required: {BLACK}{COMMA16} x {COMMA16} blocks
-STR_2317 :{14}Sound Quality:
+STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.)
+STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.)
+STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.)
+STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID}
+STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY}
+STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks
+STR_2317 :{WINDOW_COLOUR_2}Sound Quality:
STR_2318 :Low
STR_2319 :Medium
STR_2320 :High
-STR_2321 :{14}Number of rides/attractions: {BLACK}{COMMA16}
-STR_2322 :{14}Staff: {BLACK}{COMMA16}
-STR_2323 :{14}Park size: {BLACK}{COMMA32}m{SQUARED}
-STR_2324 :{14}Park size: {BLACK}{COMMA32}sq.ft.
+STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16}
+STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16}
+STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED}
+STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft.
STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park
STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park
STR_2327 :Options
-STR_2328 :{14}Currency:
-STR_2329 :{14}Distance and Speed:
-STR_2330 :{14}Temperature:
-STR_2331 :{14}Height Labels:
+STR_2328 :{WINDOW_COLOUR_2}Currency:
+STR_2329 :{WINDOW_COLOUR_2}Distance and Speed:
+STR_2330 :{WINDOW_COLOUR_2}Temperature:
+STR_2331 :{WINDOW_COLOUR_2}Height Labels:
STR_2332 :Units
STR_2333 :Sound
STR_2334 :Pounds ({POUND})
@@ -2347,18 +2347,18 @@ STR_2345 :Metric
STR_2346 :Display
STR_2347 :{RED}{STRINGID} has drowned!
STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member
-STR_2349 :{14}Wages: {BLACK}{CURRENCY} per month
-STR_2350 :{14}Employed: {BLACK}{MONTHYEAR}
-STR_2351 :{14}Lawns mown: {BLACK}{COMMA16}
-STR_2352 :{14}Gardens watered: {BLACK}{COMMA16}
-STR_2353 :{14}Litter swept: {BLACK}{COMMA16}
-STR_2354 :{14}Bins emptied: {BLACK}{COMMA16}
-STR_2355 :{14}Rides fixed: {BLACK}{COMMA16}
-STR_2356 :{14}Rides inspected: {BLACK}{COMMA16}
+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
STR_2358 :Units
STR_2359 :Real Values
-STR_2360 :{14}Display Resolution:
+STR_2360 :{WINDOW_COLOUR_2}Display Resolution:
STR_2361 :Landscape Smoothing
STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off
STR_2363 :Gridlines on Landscape
@@ -2382,7 +2382,7 @@ STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water
STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water
STR_2382 :Land
STR_2383 :Water
-STR_2384 :{14}Your objective:
+STR_2384 :{WINDOW_COLOUR_2}Your objective:
STR_2385 :{BLACK}None
STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600
STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR}
@@ -2407,27 +2407,27 @@ STR_2405 :Build 10 roller coasters of a given length
STR_2406 :Finish building 5 roller coasters
STR_2407 :Repay loan and achieve a given park value
STR_2408 :Monthly profit from food/merchandise
-STR_2409 :{14}Marketing campaigns in operation
+STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation
STR_2410 :{BLACK}None
-STR_2411 :{14}Marketing campaigns available
+STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available
STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign
STR_2413 :{BLACK}({CURRENCY2DP} per week)
STR_2414 :(Not Selected)
-STR_2415 :{14}Ride:
-STR_2416 :{14}Item:
-STR_2417 :{14}Length of time:
+STR_2415 :{WINDOW_COLOUR_2}Ride:
+STR_2416 :{WINDOW_COLOUR_2}Item:
+STR_2417 :{WINDOW_COLOUR_2}Length of time:
STR_2418 :Free entry to {STRINGID}
STR_2419 :Free ride on {STRINGID}
STR_2420 :Half-price entry to {STRINGID}
STR_2421 :Free {STRINGID}
STR_2422 :Advertising campaign for {STRINGID}
STR_2423 :Advertising campaign for {STRINGID}
-STR_2424 :{14}Vouchers for free entry to the park
-STR_2425 :{14}Vouchers for free rides on a particular ride
-STR_2426 :{14}Vouchers for half-price entry to the park
-STR_2427 :{14}Vouchers for free food or drink
-STR_2428 :{14}Advertising campaign for the park
-STR_2429 :{14}Advertising campaign for a particular ride
+STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park
+STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride
+STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park
+STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink
+STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park
+STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride
STR_2430 :{BLACK}Vouchers for free entry to {STRINGID}
STR_2431 :{BLACK}Vouchers for free ride on {STRINGID}
STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID}
@@ -2441,8 +2441,8 @@ STR_2439 :4 weeks
STR_2440 :5 weeks
STR_2441 :6 weeks
STR_2442 :{BLACK}({STRINGID} remaining)
-STR_2443 :{14}Cost per week: {BLACK}{CURRENCY2DP}
-STR_2444 :{14}Total cost: {BLACK}{CURRENCY2DP}
+STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP}
+STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP}
STR_2445 :Start this marketing campaign
STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished
STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished
@@ -2450,8 +2450,8 @@ STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park ha
STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished
STR_2450 :{YELLOW}Your advertising campaign for the park has finished
STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished
-STR_2452 :{14}Cash (less loan): {BLACK}{CURRENCY2DP}
-STR_2453 :{14}Cash (less loan): {RED}{CURRENCY2DP}
+STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP}
+STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP}
STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} -
STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} -
STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} -
@@ -2481,8 +2481,8 @@ STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time
STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time
STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time
STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY}
-STR_2483 :{14}Weekly profit: {BLACK}+{CURRENCY2DP}
-STR_2484 :{14}Weekly profit: {RED}{CURRENCY2DP}
+STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP}
+STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP}
STR_2485 :Controls
STR_2486 :General
STR_2487 :Show 'real' names of guests
@@ -2779,56 +2779,56 @@ STR_2777 :???
STR_2778 :???
STR_2779 :???
STR_2780 :???
-STR_2781 :{STRINGID}:{1}{195}{STRINGID}{STRINGID}
+STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID}
STR_2782 :SHIFT +
STR_2783 :CTRL +
STR_2784 :Change keyboard shortcut
-STR_2785 :{14}Press new shortcut key for:-{5}{OPENQUOTES}{STRINGID}{ENDQUOTES}
+STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:-{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES}
STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key
-STR_2787 :{14}Park value: {BLACK}{CURRENCY}
-STR_2788 :{14}Congratulations !{5}{BLACK}You achieved your objective with a company value of {CURRENCY} !
-STR_2789 :{14}You have failed your objective !
+STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY}
+STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} !
+STR_2789 :{WINDOW_COLOUR_2}You have failed your objective !
STR_2790 :Enter name into scenario chart
STR_2791 :Enter name
STR_2792 :Please enter your name for the scenario chart:-
STR_2793 :{SMALLFONT}(Completed by {STRINGID})
-STR_2794 :{14}Completed by: {BLACK}{STRINGID}{5}{14} with a company value of: {BLACK}{CURRENCY}
+STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY}
STR_2795 :Sort
STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed
STR_2797 :Scroll view when pointer at screen edge
STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge
STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments
-STR_2800 :{14}Total admissions: {BLACK}{COMMA32}
-STR_2801 :{14}Income from admissions: {BLACK}{CURRENCY2DP}
+STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32}
+STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP}
STR_2802 :Map
STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map
STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map
STR_2805 :{SMALLFONT}{BLACK}Show map of park
-STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{5}Check where your handymen are and consider organizing them better
-STR_2807 :{RED}Guests are complaining about the amount of litter in your park{5}Check where your handymen are and consider organizing them better
-STR_2808 :{RED}Guests are complaining about the vandalism in your park{5}Check where your security guards are and consider organizing them better
+STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better
+STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better
+STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better
STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food
STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks
STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park
-STR_2812 :{RED}Guests are getting lost or stuck{5}Check whether the layout of your footpaths needs improving to help the guests find their way around
-STR_2813 :{RED}Your park entrance fee is too high!{5}Reduce your entrance fee or improve the value of the park to attract more guests
-STR_2814 :{14}Most untidy park award
-STR_2815 :{14}Tidiest park award
-STR_2816 :{14}Award for the park with the best roller coasters
-STR_2817 :{14}Best value park award
-STR_2818 :{14}Most beautiful park award
-STR_2819 :{14}Worst value park award
-STR_2820 :{14}Safest park award
-STR_2821 :{14}Best staff award
-STR_2822 :{14}Best park food award
-STR_2823 :{14}Worst park food award
-STR_2824 :{14}Best park restrooms award
-STR_2825 :{14}Most disappointing park award
-STR_2826 :{14}Best water rides award
-STR_2827 :{14}Best custom-designed rides award
-STR_2828 :{14}Most dazzling ride color schemes award
-STR_2829 :{14}Most confusing park layout award
-STR_2830 :{14}Best gentle ride award
+STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around
+STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests
+STR_2814 :{WINDOW_COLOUR_2}Most untidy park award
+STR_2815 :{WINDOW_COLOUR_2}Tidiest park award
+STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best roller coasters
+STR_2817 :{WINDOW_COLOUR_2}Best value park award
+STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award
+STR_2819 :{WINDOW_COLOUR_2}Worst value park award
+STR_2820 :{WINDOW_COLOUR_2}Safest park award
+STR_2821 :{WINDOW_COLOUR_2}Best staff award
+STR_2822 :{WINDOW_COLOUR_2}Best park food award
+STR_2823 :{WINDOW_COLOUR_2}Worst park food award
+STR_2824 :{WINDOW_COLOUR_2}Best park restrooms award
+STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award
+STR_2826 :{WINDOW_COLOUR_2}Best water rides award
+STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award
+STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride color schemes award
+STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award
+STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award
STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'!
STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'!
STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best roller coasters'!
@@ -2846,124 +2846,124 @@ STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the
STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of color schemes'!
STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'!
STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'!
-STR_2848 :{14}No recent awards
+STR_2848 :{WINDOW_COLOUR_2}No recent awards
STR_2849 :New scenario installed successfully
STR_2850 :New track design installed successfully
STR_2851 :Scenario already installed
STR_2852 :Track design already installed
STR_2853 :Forbidden by the local authority!
-STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{5}Construct a path to the entrance
-STR_2855 :{RED}{STRINGID} has no path leading from its exit !{5}Construct a path from the ride exit
-STR_2856 :{14}Tutorial
-STR_2857 :{14}(Press a key or mouse button to take control)
+STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance
+STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit
+STR_2856 :{WINDOW_COLOUR_2}Tutorial
+STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control)
STR_2858 :Can't start marketing campaign...
STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running
STR_2860 :Infogrames Interactive credits...
-STR_2861 :{14}Licensed to Infogrames Interactive Inc.
+STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc.
STR_2862 :Music acknowledgements...
STR_2863 :Music acknowledgements
-STR_2864 :{14}March - Children of the Regiment: (Fucik) non copyright
-STR_2865 :{14}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO
-STR_2866 :{14}In Continental Mood: (Composer unknown) Copyright Control
-STR_2867 :{14}Wedding Journey: (Traditional)
-STR_2868 :{14}Tales from the Vienna Woods: (Johann Strauss) non copyright
-STR_2869 :{14}Slavonic Dance: (Traditional)
-STR_2870 :{14}Das Alpenhorn: (Traditional)
-STR_2871 :{14}The Blond Sailor: (Traditional)
-STR_2872 :{14}Overture - Poet and Peasant: (Suppe) non copyright
-STR_2873 :{14}Waltz Medley: (Johann Strauss) non copyright
-STR_2874 :{14}Bella Bella Bimba: (Traditional)
-STR_2875 :{14}Original recordings (P) 1976 C.J.Mears Organization, used with consent
-STR_2876 :{14}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2877 :{14}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2878 :{14}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2879 :{14}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2880 :{14}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2881 :{14}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2882 :{14}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2883 :{14}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2884 :{14}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2885 :{14}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2886 :{14}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2887 :{14}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2888 :{14}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2889 :{14}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2890 :{14}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2891 :{14}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2892 :{14}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2893 :{14}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2894 :{14}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer
-STR_2895 :{14}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2896 :{14}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2897 :{14}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2898 :{14}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2899 :{14}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2900 :{14}
-STR_2901 :{14}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES})
-STR_2902 :{14}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer
-STR_2903 :{14}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2904 :{14}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2905 :{14}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2906 :{14}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2907 :{14}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
-STR_2908 :{14}Infogrames Interactive
-STR_2909 :{14}Senior Producer: Thomas J. Zahorik
-STR_2910 :{14}Executive Producer: Bill Levay
-STR_2911 :{14}Senior Marketing Product Manager: Scott Triola
-STR_2912 :{14}V.P. of Product Development: Scott Walker
-STR_2913 :{14}General Manager: John Hurlbut
-STR_2914 :{14}Director of Quality Assurance: Michael Craighead
-STR_2915 :{14}Q.A. Certification Manager: Kurt Boutin
-STR_2916 :{14}Q.A. Certification Lead: Mark Huggins
-STR_2917 :{14}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail
-STR_2918 :{14}Clif McClure, Erik Maramaldi, Erik Jeffery
-STR_2919 :{14}Director of Marketing: Ann Marie Bland
-STR_2920 :{14}Manager of Creative Services: Steve Martin
-STR_2921 :{14}Manager of Editorial & Documentation Services: Elizabeth Mackney
-STR_2922 :{14}Graphic Designer: Paul Anselmi
-STR_2923 :{14}Copywriter: Kurt Carlson
-STR_2924 :{14}Special Thanks to: Peter Matiss
-STR_2925 :{14}Engineering Specialist: Ken Edwards
-STR_2926 :{14}Engineering Services Manager: Luis Rivas
-STR_2927 :{14}Lead Compatibility Analyst: Geoffrey Smith
-STR_2928 :{14}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin
-STR_2929 :{14}Lead Tester: Daniel Frisoli
-STR_2930 :{14}Senior Tester: Matt Pantaleoni
-STR_2931 :{14}
-STR_2932 :{14}
-STR_2933 :{14}
-STR_2934 :{14}
-STR_2935 :{14}
-STR_2936 :{14}
-STR_2937 :{14}
-STR_2938 :{14}
-STR_2939 :{14}
-STR_2940 :{14}
-STR_2941 :{14}
-STR_2942 :{14}
-STR_2943 :{14}
-STR_2944 :{14}
-STR_2945 :{14}
-STR_2946 :{14}
-STR_2947 :{14}
-STR_2948 :{14}
-STR_2949 :{14}
-STR_2950 :{14}
-STR_2951 :{14}
-STR_2952 :{14}
-STR_2953 :{14}
-STR_2954 :{14}
-STR_2955 :{14}
-STR_2956 :{14}
-STR_2957 :{14}
-STR_2958 :{14}
-STR_2959 :{14}
-STR_2960 :{14}
-STR_2961 :{14}
-STR_2962 :{14}
-STR_2963 :{14}
-STR_2964 :{14}
-STR_2965 :{14}
+STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright
+STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO
+STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) Copyright Control
+STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional)
+STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright
+STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional)
+STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional)
+STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional)
+STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright
+STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright
+STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional)
+STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent
+STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer
+STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2900 :{WINDOW_COLOUR_2}
+STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES})
+STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer
+STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer
+STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive
+STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik
+STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay
+STR_2911 :{WINDOW_COLOUR_2}Senior Marketing Product Manager: Scott Triola
+STR_2912 :{WINDOW_COLOUR_2}V.P. of Product Development: Scott Walker
+STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut
+STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead
+STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin
+STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins
+STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail
+STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery
+STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland
+STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin
+STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney
+STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi
+STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson
+STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss
+STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards
+STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas
+STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith
+STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin
+STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli
+STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni
+STR_2931 :{WINDOW_COLOUR_2}
+STR_2932 :{WINDOW_COLOUR_2}
+STR_2933 :{WINDOW_COLOUR_2}
+STR_2934 :{WINDOW_COLOUR_2}
+STR_2935 :{WINDOW_COLOUR_2}
+STR_2936 :{WINDOW_COLOUR_2}
+STR_2937 :{WINDOW_COLOUR_2}
+STR_2938 :{WINDOW_COLOUR_2}
+STR_2939 :{WINDOW_COLOUR_2}
+STR_2940 :{WINDOW_COLOUR_2}
+STR_2941 :{WINDOW_COLOUR_2}
+STR_2942 :{WINDOW_COLOUR_2}
+STR_2943 :{WINDOW_COLOUR_2}
+STR_2944 :{WINDOW_COLOUR_2}
+STR_2945 :{WINDOW_COLOUR_2}
+STR_2946 :{WINDOW_COLOUR_2}
+STR_2947 :{WINDOW_COLOUR_2}
+STR_2948 :{WINDOW_COLOUR_2}
+STR_2949 :{WINDOW_COLOUR_2}
+STR_2950 :{WINDOW_COLOUR_2}
+STR_2951 :{WINDOW_COLOUR_2}
+STR_2952 :{WINDOW_COLOUR_2}
+STR_2953 :{WINDOW_COLOUR_2}
+STR_2954 :{WINDOW_COLOUR_2}
+STR_2955 :{WINDOW_COLOUR_2}
+STR_2956 :{WINDOW_COLOUR_2}
+STR_2957 :{WINDOW_COLOUR_2}
+STR_2958 :{WINDOW_COLOUR_2}
+STR_2959 :{WINDOW_COLOUR_2}
+STR_2960 :{WINDOW_COLOUR_2}
+STR_2961 :{WINDOW_COLOUR_2}
+STR_2962 :{WINDOW_COLOUR_2}
+STR_2963 :{WINDOW_COLOUR_2}
+STR_2964 :{WINDOW_COLOUR_2}
+STR_2965 :{WINDOW_COLOUR_2}
STR_2966 :
STR_2967 :
STR_2968 :
@@ -3055,7 +3055,7 @@ STR_3053 :Golf hole E
STR_3054 :Loading...
STR_3055 :White
STR_3056 :Translucent
-STR_3057 :{14}Construction Marker:
+STR_3057 :{WINDOW_COLOUR_2}Construction Marker:
STR_3058 :Brick walls
STR_3059 :Hedges
STR_3060 :Ice blocks
@@ -3069,12 +3069,12 @@ STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks
STR_3068 :Other Parks
STR_3069 :Top Section
STR_3070 :Slope to Level
-STR_3071 :{14}Same price throughout park
+STR_3071 :{WINDOW_COLOUR_2}Same price throughout park
STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park
-STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{5}If you haven't raised the park rating in 4 weeks, your park will be closed down
-STR_3074 :{RED}WARNING: Your park rating is still below 700 !{5}You have 3 weeks to raise the park rating
-STR_3075 :{RED}WARNING: Your park rating is still below 700 !{5}You have only 2 weeks to raise the park rating, or your park will be closed down
-STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{5}In just 7 days your park will be closed down unless you can raise the rating
+STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down
+STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating
+STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down
+STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating
STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down !
STR_3078 :Plain entrance
STR_3079 :Wooden entrance
@@ -3091,9 +3091,9 @@ STR_3089 :Space entrance
STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station
STR_3091 :You are not allowed to remove this section!
STR_3092 :You are not allowed to move or modify the station for this ride!
-STR_3093 :{14}Favorite: {BLACK}{STRINGID}
+STR_3093 :{WINDOW_COLOUR_2}Favorite: {BLACK}{STRINGID}
STR_3094 :N/A
-STR_3095 :{14}Lift hill chain speed:
+STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed:
STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY}
STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed
STR_3098 :Can't change lift hill speed...
@@ -3108,7 +3108,7 @@ STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilitie
STR_3107 :Close
STR_3108 :Test
STR_3109 :Open
-STR_3110 :{14}Block Sections: {BLACK}{COMMA16}
+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
STR_3113 :Select a different design
@@ -3120,12 +3120,12 @@ STR_3118 :{BLACK}{STRINGID} is heading for the ride
STR_3119 :{BLACK}{STRINGID} is fixing the ride
STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride
STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy
-STR_3122 :{14}Favorite ride of: {BLACK}{COMMA16} guest
-STR_3123 :{14}Favorite ride of: {BLACK}{COMMA16} guests
+STR_3122 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guest
+STR_3123 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guests
STR_3124 :Broken {STRINGID}
-STR_3125 :{14}Excitement Factor: {BLACK}+{COMMA16}%
-STR_3126 :{14}Intensity Factor: {BLACK}+{COMMA16}%
-STR_3127 :{14}Nausea Factor: {BLACK}+{COMMA16}%
+STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}%
+STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}%
+STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}%
STR_3128 :Save Track Design
STR_3129 :Save Track Design with Scenery
STR_3130 :Save
@@ -3140,7 +3140,7 @@ STR_3138 :Reset Selection
STR_3139 :Cable lift unable to work in this operating mode
STR_3140 :Cable lift hill must start immediately after station
STR_3141 :Multi-circuit per ride not possible with cable lift hill
-STR_3142 :{14}Capacity: {BLACK}{STRINGID}
+STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID}
STR_3143 :{SMALLFONT}{BLACK}Show people on map
STR_3144 :{SMALLFONT}{BLACK}Show rides and stalls on map
STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left
@@ -3165,8 +3165,8 @@ STR_3163 :Installing new data:
STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16})
STR_3165 :
STR_3166 :{BLACK}(ID:
-STR_3167 :{14}Includes: {BLACK}{COMMA16} objects
-STR_3168 :{14}Text: {BLACK}{STRINGID}
+STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects
+STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID}
STR_3169 :Data for the following object not found:
STR_3170 :Not enough space for graphics
STR_3171 :Too many objects of this type selected
@@ -3194,9 +3194,9 @@ STR_3192 :Park Entrance
STR_3193 :Water
STR_3194 :Scenario Description
STR_3195 :Invention List
-STR_3196 :{14}Research Group: {BLACK}{STRINGID}
-STR_3197 :{14}Items pre-invented at start of game:
-STR_3198 :{14}Items to invent during game:
+STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID}
+STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game:
+STR_3198 :{WINDOW_COLOUR_2}Items to invent during game:
STR_3199 :Random Shuffle
STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game
STR_3201 :Object Selection
@@ -3209,7 +3209,7 @@ STR_3207 :Roller Coaster Designer
STR_3208 :Track Designs Manager
STR_3209 :Back to Previous Step:
STR_3210 :Forward to Next Step:
-STR_3211 :{14}Map size:
+STR_3211 :{WINDOW_COLOUR_2}Map size:
STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16}
STR_3213 :Can't decrease map size any further
STR_3214 :Can't increase map size any further
@@ -3238,14 +3238,14 @@ STR_3236 :{SMALLFONT}{BLACK}Show guest options
STR_3237 :{SMALLFONT}{BLACK}Show park options
STR_3238 :No Money
STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions
-STR_3240 :{14}Initial cash:
-STR_3241 :{14}Initial loan:
-STR_3242 :{14}Maximum loan size:
-STR_3243 :{14}Annual interest rate:
+STR_3240 :{WINDOW_COLOUR_2}Initial cash:
+STR_3241 :{WINDOW_COLOUR_2}Initial loan:
+STR_3242 :{WINDOW_COLOUR_2}Maximum loan size:
+STR_3243 :{WINDOW_COLOUR_2}Annual interest rate:
STR_3244 :Forbid marketing campaigns
STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns
-STR_3246 :{14}{CURRENCY}
-STR_3247 :{14}{COMMA16}%
+STR_3246 :{WINDOW_COLOUR_2}{CURRENCY}
+STR_3247 :{WINDOW_COLOUR_2}{COMMA16}%
STR_3248 :Can't increase initial cash any further!
STR_3249 :Can't reduce initial cash any further!
STR_3250 :Can't increase initial loan any further!
@@ -3258,10 +3258,10 @@ STR_3256 :Guests prefer less intense rides
STR_3257 :{SMALLFONT}{BLACK}Select whether guests should generally prefer less intense rides only
STR_3258 :Guests prefer more intense rides
STR_3259 :{SMALLFONT}{BLACK}Select whether guests should generally prefer more intense rides only
-STR_3260 :{14}Cash per guest (average):
-STR_3261 :{14}Guests initial happiness:
-STR_3262 :{14}Guests initial hunger:
-STR_3263 :{14}Guests initial thirst:
+STR_3260 :{WINDOW_COLOUR_2}Cash per guest (average):
+STR_3261 :{WINDOW_COLOUR_2}Guests initial happiness:
+STR_3262 :{WINDOW_COLOUR_2}Guests initial hunger:
+STR_3263 :{WINDOW_COLOUR_2}Guests initial thirst:
STR_3264 :Can't increase this any further!
STR_3265 :Can't reduce this any further!
STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides
@@ -3275,19 +3275,19 @@ STR_3273 :Park rating higher difficult level
STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging
STR_3275 :Guest generation higher difficult level
STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract guests to the park
-STR_3277 :{14}Cost to buy land:
-STR_3278 :{14}Cost to buy construction rights:
+STR_3277 :{WINDOW_COLOUR_2}Cost to buy land:
+STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights:
STR_3279 :Free park entry / Pay per ride
STR_3280 :Pay to enter park / Free rides
-STR_3281 :{14}Entry price:
+STR_3281 :{WINDOW_COLOUR_2}Entry price:
STR_3282 :{SMALLFONT}{BLACK}Select objective and park name
STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved
STR_3284 :Objective Selection
STR_3285 :Preserved Rides
STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario
-STR_3287 :{14}Objective:
+STR_3287 :{WINDOW_COLOUR_2}Objective:
STR_3288 :{SMALLFONT}{BLACK}Select climate
-STR_3289 :{14}Climate:
+STR_3289 :{WINDOW_COLOUR_2}Climate:
STR_3290 :Cool and wet
STR_3291 :Warm
STR_3292 :Hot and dry
@@ -3296,35 +3296,35 @@ STR_3294 :Change...
STR_3295 :{SMALLFONT}{BLACK}Change name of park
STR_3296 :{SMALLFONT}{BLACK}Change name of scenario
STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario
-STR_3298 :{14}Park Name: {BLACK}{STRINGID}
-STR_3299 :{14}Park/Scenario Details:
-STR_3300 :{14}Scenario Name: {BLACK}{STRINGID}
-STR_3301 :{14}Objective Date:
-STR_3302 :{14}{MONTHYEAR}
-STR_3303 :{14}Number of guests:
-STR_3304 :{14}Park value:
-STR_3305 :{14}Monthly income:
-STR_3306 :{14}Monthly profit:
-STR_3307 :{14}Minimum length:
-STR_3308 :{14}Excitement rating:
-STR_3309 :{14}{COMMA16}
-STR_3310 :{14}{LENGTH}
-STR_3311 :{14}{COMMA2DP32}
-STR_3312 :{14}Rides/attractions under a preservation order:
+STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID}
+STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details:
+STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID}
+STR_3301 :{WINDOW_COLOUR_2}Objective Date:
+STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR}
+STR_3303 :{WINDOW_COLOUR_2}Number of guests:
+STR_3304 :{WINDOW_COLOUR_2}Park value:
+STR_3305 :{WINDOW_COLOUR_2}Monthly income:
+STR_3306 :{WINDOW_COLOUR_2}Monthly profit:
+STR_3307 :{WINDOW_COLOUR_2}Minimum length:
+STR_3308 :{WINDOW_COLOUR_2}Excitement rating:
+STR_3309 :{WINDOW_COLOUR_2}{COMMA16}
+STR_3310 :{WINDOW_COLOUR_2}{LENGTH}
+STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32}
+STR_3312 :{WINDOW_COLOUR_2}Rides/attractions under a preservation order:
STR_3313 :Scenario Name
STR_3314 :Enter name for scenario:-
STR_3315 :Park/Scenario Details
STR_3316 :Enter description of this scenario:-
STR_3317 :No details yet
STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in
-STR_3319 :{14}Scenario Group:
+STR_3319 :{WINDOW_COLOUR_2}Scenario Group:
STR_3320 :Unable to save scenario file...
STR_3321 :New objects installed successfully
-STR_3322 :{14}Objective: {BLACK}{STRINGID}
+STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID}
STR_3323 :Missing object data, ID:
STR_3324 :Requires Add-On Pack:
STR_3325 :Requires an Add-On Pack
-STR_3326 :{14}(no image)
+STR_3326 :{WINDOW_COLOUR_2}(no image)
STR_3327 :Starting positions for people not set
STR_3328 :Can't advance to next editor stage...
STR_3329 :Park entrance not yet built
@@ -3355,7 +3355,7 @@ STR_3353 :New name contains invalid characters
STR_3354 :Another file exists with this name, or file is write-protected
STR_3355 :File is write-protected or locked
STR_3356 :Delete File
-STR_3357 :{14}Are you sure you want to permanently delete {STRINGID} ?
+STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ?
STR_3358 :Can't delete track design...
STR_3359 :{BLACK}No track designs of this type
STR_3360 :Warning!
diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj
index 13000f7d9b..44dc57fb20 100644
--- a/projects/openrct2.vcxproj
+++ b/projects/openrct2.vcxproj
@@ -27,6 +27,7 @@
+
@@ -70,6 +71,7 @@
+
@@ -106,6 +108,7 @@
+
@@ -211,6 +214,9 @@
true
winmm.lib;sdl2.lib;%(AdditionalDependencies)
+
+ xcopy /Y "$(ProjectDir)\..\Data\Language\*.*" "$(TargetDir)\Data\Language\"
+
diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters
index 0c0b4d87e9..9b8d8f81bd 100644
--- a/projects/openrct2.vcxproj.filters
+++ b/projects/openrct2.vcxproj.filters
@@ -150,6 +150,9 @@
Header Files
+
+ Header Files
+
@@ -350,6 +353,12 @@
Source Files
+
+ Source Files
+
+
+ Windows
+
diff --git a/src/addresses.h b/src/addresses.h
index b2e7533375..06f16b39ac 100644
--- a/src/addresses.h
+++ b/src/addresses.h
@@ -172,6 +172,8 @@
//32bit (pixel_offset 24 bit)(pixel_colour 8 bit)
#define RCT2_ADDRESS_RAIN_PIXEL_STORE 0x00EDF850
+#define RCT2_ADDRESS_UNCOMPLETED_RESEARCH_TYPES 0x00EE787C
+
#define RCT2_ADDRESS_MAP_IMAGE_DATA 0x00F1AD68
#define RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS 0x00F3EF92
@@ -247,6 +249,8 @@
#define RCT2_ADDRESS_MECHANIC_COLOUR 0x01357BCE
#define RCT2_ADDRESS_SECURITY_COLOUR 0x01357BCF
+#define RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES 0x01357CF2
+
#define RCT2_ADDRESS_MAP_SIZE 0x01358834
#define RCT2_ADDRESS_PARK_SIZE 0x013580EA
diff --git a/src/finance.h b/src/finance.h
index ace3b157ae..02e0dc6aab 100644
--- a/src/finance.h
+++ b/src/finance.h
@@ -32,6 +32,7 @@ enum {
RCT_EXPENDITURE_TYPE_INTEREST = 13
};
+extern const money32 research_cost_table[4];
void finance_payment(money32 amount, rct_expenditure_type type);
void finance_pay_wages();
diff --git a/src/game.c b/src/game.c
index 76f2b113d7..255362b4e6 100644
--- a/src/game.c
+++ b/src/game.c
@@ -429,7 +429,7 @@ void update_rain_animation()
(rct_drawpixelinfo*)RCT2_ADDRESS_SCREEN_DPI,
RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, uint32),
RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_X, sint16),
- RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_Y, sint16)
+ RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_Y, sint16), 0
);
}
@@ -2092,7 +2092,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58];
*/
int game_do_command(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp)
{
- game_do_command_p(esi, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
+ return game_do_command_p(esi, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
}
/**
diff --git a/src/game.h b/src/game.h
index 103f3b63ec..92f11036ad 100644
--- a/src/game.h
+++ b/src/game.h
@@ -67,10 +67,10 @@ enum GAME_COMMAND {
GAME_COMMAND_42,
GAME_COMMAND_43,
GAME_COMMAND_44,
- GAME_COMMAND_45,
- GAME_COMMAND_46,
+ GAME_COMMAND_SET_CURRENT_LOAN, // 45
+ GAME_COMMAND_SET_RESEARCH_FUNDING, // 46
GAME_COMMAND_47,
- GAME_COMMAND_48,
+ GAME_COMMAND_START_MARKETING_CAMPAIGN, // 48
GAME_COMMAND_49,
GAME_COMMAND_50,
GAME_COMMAND_51,
diff --git a/src/gfx.c b/src/gfx.c
index bfdea7ccbd..59350e680d 100644
--- a/src/gfx.c
+++ b/src/gfx.c
@@ -189,7 +189,7 @@ void gfx_load_character_widths(){
for (int i = 0; i < 0xE0; ++i){
memset(drawing_surface, 0, sizeof(drawing_surface));
- gfx_draw_sprite(&dpi, i + 0x10D5, -1, 0);
+ gfx_draw_sprite(&dpi, i + 0x10D5, -1, 0, 0);
for (int x = 0; x < 8; ++x){
uint8 val = 0;
@@ -251,9 +251,8 @@ void gfx_draw_line_on_buffer(rct_drawpixelinfo *dpi, char colour, int y, int x,
if (y < 0)return;
if (y >= dpi->height)return;
//Check to make sure we are drawing at least a pixel
- if (!no_pixels) return;
+ if (!no_pixels) no_pixels++;
- no_pixels++;
x -= dpi->x;
//If x coord outside range leave
@@ -701,7 +700,7 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui
for (; height > 0; height -= (1<width << zoom_level);
uint8* next_unknown_pointer = unknown_pointer + (uint32)(source_image->width << zoom_level);
- uint8* next_dest_pointer = dest_pointer + dest_dpi->width + dest_dpi->pitch;
+ uint8* next_dest_pointer = dest_pointer + (dest_dpi->width >> zoom_level) + dest_dpi->pitch;
for (int no_pixels = width; no_pixels > 0; no_pixels -= (1< 0; height -= (1<width<width + dest_dpi->pitch;
+ uint8* next_dest_pointer = dest_pointer + (dest_dpi->width >> zoom_level) + dest_dpi->pitch;
for (int no_pixels = width; no_pixels > 0; no_pixels -= (1< 0; height -= (1<width << zoom_level);
- uint8* next_dest_pointer = dest_pointer + dest_dpi->width + dest_dpi->pitch;
+ uint8* next_dest_pointer = dest_pointer + (dest_dpi->width >> zoom_level) + dest_dpi->pitch;
for (int no_pixels = width; no_pixels > 0; no_pixels -= (1<flags & G1_FLAG_BMP)){//Not tested
for (; height > 0; height-=(1<width << zoom_level);
- uint8* next_dest_pointer = dest_pointer + dest_dpi->width + dest_dpi->pitch;
+ uint8* next_dest_pointer = dest_pointer + (dest_dpi->width >> zoom_level) + dest_dpi->pitch;
for (int no_pixels = width; no_pixels > 0; no_pixels -= (1< 0; height -= (1<width << zoom_level);
uint8* next_unknown_pointer = unknown_pointer + (uint32)(source_image->width << zoom_level);
- uint8* next_dest_pointer = dest_pointer + dest_dpi->width + dest_dpi->pitch;
+ uint8* next_dest_pointer = dest_pointer + (dest_dpi->width >> zoom_level) + dest_dpi->pitch;
for (int no_pixels = width; no_pixels > 0; no_pixels -= (1< 0; height -= (1<width << zoom_level);
- uint8* next_dest_pointer = dest_pointer + dest_dpi->width + dest_dpi->pitch;
+ uint8* next_dest_pointer = dest_pointer + (dest_dpi->width >> zoom_level) + dest_dpi->pitch;
for (int no_pixels = width; no_pixels > 0; no_pixels -= (1<zoom_level;
-
uint8* next_source_pointer;
uint8* next_dest_pointer = dest_bits_pointer;
@@ -884,9 +882,9 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point
for (; no_pixels > 0; no_pixels -= (1< 0; no_pixels -= (1<width + (int)dpi->pitch;
+ next_dest_pointer += (int)(dpi->width >> zoom_level) + (int)dpi->pitch;
}
}
-
-void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint8* palette_pointer, uint8* unknown_pointer);
/**
*
* rct2: 0x0067A28E
- * image_id (ebx)
+ * image_id (ebx)
+ * image_id as below
+ * 0b_111X_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX image_type
+ * 0b_XXX1_11XX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX image_sub_type (unknown pointer)
+ * 0b_XXX1_1111_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX secondary_colour
+ * 0b_XXXX_XXXX_1111_1XXX_XXXX_XXXX_XXXX_XXXX primary_colour
+ * 0b_XXXX_X111_1111_1XXX_XXXX_XXXX_XXXX_XXXX palette_ref
+ * 0b_XXXX_XXXX_XXXX_X111_1111_1111_1111_1111 image_id (offset to g1)
* x (cx)
* y (dx)
+ * dpi (esi)
+ * tertiary_colour (ebp)
*/
-void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y)
+void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 tertiary_colour)
{
+ //RCT2_CALLPROC_X(0x0067A28E, 0, image_id, x, y, 0, (int)dpi, tertiary_colour);
+ //return;
- int eax = 0, ebx = image_id, ecx = x, edx = y, esi = 0, edi = (int)dpi, ebp = 0;
int image_type = (image_id & 0xE0000000) >> 28;
int image_sub_type = (image_id & 0x1C000000) >> 26;
+
uint8* palette_pointer = NULL;
uint8 palette[0x100];
+
RCT2_GLOBAL(0x00EDF81C, uint32) = image_id & 0xE0000000;
- eax = (image_id >> 26) & 0x7;
uint8* unknown_pointer = (uint8*)(RCT2_ADDRESS(0x9E3CE4, uint32*)[image_sub_type]);
- RCT2_GLOBAL(0x009E3CDC, uint32) = RCT2_GLOBAL(0x009E3CE4 + eax * 4, uint32);
+ RCT2_GLOBAL(0x009E3CDC, uint32) = (uint32)unknown_pointer;
if (image_type && !(image_type & IMAGE_TYPE_UNKNOWN)) {
-
+ uint8 palette_ref = (image_id >> 19) & 0xFF;
if (!(image_type & IMAGE_TYPE_MIX_BACKGROUND)){
- eax = image_id;
- eax >>= 19;
- eax &= 0xFF;
unknown_pointer = NULL;
RCT2_GLOBAL(0x009E3CDC, uint32) = 0;
}
else{
- eax = image_id;
- eax >>= 19;
- eax &= 0x7F;
+ palette_ref &= 0x7F;
}
- eax = palette_to_g1_offset[eax];// RCT2_GLOBAL(eax * 4 + 0x97FCBC, uint32);
- palette_pointer = ((rct_g1_element*)RCT2_ADDRESS_G1_ELEMENTS)[eax].offset;
+ uint16 palette_offset = palette_to_g1_offset[palette_ref];
+ palette_pointer = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[palette_offset].offset;
RCT2_GLOBAL(0x9ABDA4, uint32) = (uint32)palette_pointer;
}
else if (image_type && !(image_type & IMAGE_TYPE_USE_PALETTE)){
- //Has not been tested
RCT2_GLOBAL(0x9E3CDC, uint32) = 0;
unknown_pointer = NULL;
- eax = image_id;
- eax >>= 19;
- //push edx/y
- eax &= 0x1F;
- ebp = palette_to_g1_offset[ebp]; //RCT2_GLOBAL(ebp * 4 + 0x97FCBC, uint32); //ebp has not been set to anything before this! ??
- //Possibly another variable input?!
- eax = palette_to_g1_offset[eax]; //RCT2_GLOBAL(eax * 4 + 0x97FCBC, uint32);
- ebp <<= 0x4;
- eax <<= 0x4;
- ebp = RCT2_GLOBAL(ebp + RCT2_ADDRESS_G1_ELEMENTS, uint32);
- eax = RCT2_GLOBAL(eax + RCT2_ADDRESS_G1_ELEMENTS, uint32);
- edx = *((uint32*)(eax + 0xF3));
- esi = *((uint32*)(eax + 0xF7));
- RCT2_GLOBAL(0x9ABFFF, uint32) = edx;
- RCT2_GLOBAL(0x9AC003, uint32) = esi;
- edx = *((uint32*)(ebp + 0xF3));
- esi = *((uint32*)(ebp + 0xF7));
- esi = *((uint32*)(eax + 0xF7));
+ uint32 primary_offset = palette_to_g1_offset[(image_id >> 19) & 0x1F];
+ uint32 secondary_offset = palette_to_g1_offset[(image_id >> 24) & 0x1F];
+ uint32 tertiary_offset = palette_to_g1_offset[tertiary_colour];
- edx = *((uint32*)(eax + 0xFB));
- esi = *((uint32*)(ebp + 0xFB));
+ rct_g1_element* primary_colour = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[primary_offset];
+ rct_g1_element* secondary_colour = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[secondary_offset];
+ rct_g1_element* tertiary_colour = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[tertiary_offset];
- eax = image_id;
- RCT2_GLOBAL(0x9AC007, uint32) = edx;
- eax >>= 24;
- RCT2_GLOBAL(0x9ABF42, uint32) = esi;
- eax &= 0x1F;
+ memcpy((uint8*)0x9ABFFF, &primary_colour->offset[0xF3], 12);
+ memcpy((uint8*)0x9ABFD6, &secondary_colour->offset[0xF3], 12);
+ memcpy((uint8*)0x9ABF3A, &tertiary_colour->offset[0xF3], 12);
//image_id
RCT2_GLOBAL(0xEDF81C, uint32) |= 0x20000000;
- image_id |= IMAGE_TYPE_USE_PALETTE;
+ image_id |= IMAGE_TYPE_USE_PALETTE << 28;
- eax = palette_to_g1_offset[eax]; //RCT2_GLOBAL(eax * 4 + 0x97FCBC, uint32);
- eax <<= 4;
- eax = RCT2_GLOBAL(eax + RCT2_ADDRESS_G1_ELEMENTS, uint32);
- edx = *((uint32*)(eax + 0xF3));
- esi = *((uint32*)(eax + 0xF7));
- RCT2_GLOBAL(0x9ABFD6, uint32) = edx;
- RCT2_GLOBAL(0x9ABFDA, uint32) = esi;
- edx = *((uint32*)(eax + 0xFB));
RCT2_GLOBAL(0x9ABDA4, uint32) = 0x9ABF0C;
palette_pointer = (uint8*)0x9ABF0C;
- RCT2_GLOBAL(0x9ABFDE, uint32) = edx;
- edx = y;
-
}
else if (image_type){
RCT2_GLOBAL(0x9E3CDC, uint32) = 0;
@@ -1046,25 +1021,8 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in
int image_type = (image_id & 0xE0000000) >> 28;
rct_g1_element* g1_source = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[image_element]);
-
- if ( dpi->zoom_level && (g1_source->flags & (1<<4)) ){
- rct_drawpixelinfo zoomed_dpi = {
- .bits = dpi->bits,
- .x = dpi->x >> 1,
- .y = dpi->y >> 1,
- .height = dpi->height>>1,
- .width = dpi->width>>1,
- .pitch = (dpi->width+dpi->pitch)-(dpi->width>>1),//In the actual code this is dpi->pitch but that doesn't seem correct.
- .zoom_level = dpi->zoom_level - 1
- };
- gfx_draw_sprite_palette_set(&zoomed_dpi, (image_type << 28) | (image_element - g1_source->zoomed_offset), x >> 1, y >> 1, palette_pointer, unknown_pointer);
- return;
- }
- if ( dpi->zoom_level && (g1_source->flags & (1<<5)) ){
- return;
- }
- //Zooming code has been integrated into main code.
+ //Zooming code has been integrated into main code but is not working.
//if (dpi->zoom_level >= 1){ //These have not been tested
// //something to do with zooming
// if (dpi->zoom_level == 1){
@@ -1078,13 +1036,30 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in
// RCT2_CALLPROC_X(0x0067FAAE, 0, (int)g1_source, x, y, 0, (int)dpi, 0);
// return;
//}
+ if ( dpi->zoom_level && (g1_source->flags & (1<<4)) ){
+ rct_drawpixelinfo zoomed_dpi = {
+ .bits = dpi->bits,
+ .x = dpi->x >> 1,
+ .y = dpi->y >> 1,
+ .height = dpi->height>>1,
+ .width = dpi->width>>1,
+ .pitch = dpi->pitch,
+ .zoom_level = dpi->zoom_level - 1
+ };
+ gfx_draw_sprite_palette_set(&zoomed_dpi, (image_type << 28) | (image_element - g1_source->zoomed_offset), x >> 1, y >> 1, palette_pointer, unknown_pointer);
+ return;
+ }
+ if ( dpi->zoom_level && (g1_source->flags & (1<<5)) ){
+ return;
+ }
//Its used super often so we will define it to a seperate variable.
int zoom_level = dpi->zoom_level;
+ uint16 zoom_mask = 0xFFFF << zoom_level;
//This will be the height of the drawn image
int height = g1_source->height >> zoom_level;
//This is the start y coordinate on the destination
- int dest_start_y = y - dpi->y + g1_source->y_offset;
+ sint16 dest_start_y = ((sint16)y + g1_source->y_offset - dpi->y) >> zoom_level;
//This is the start y coordinate on the source
int source_start_y = 0;
@@ -1106,20 +1081,20 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in
int dest_end_y = dest_start_y + height;
- if (dest_end_y > dpi->height){
+ if (dest_end_y > (dpi->height >> zoom_level)){
//If the destination y is outside of the drawing
//image reduce the height of the image
- height -= dest_end_y - dpi->height;
- //If the image no longer has anything to draw
- if (height <= 0)return;
+ height -= dest_end_y - (dpi->height >> zoom_level);
}
-
+ //If the image no longer has anything to draw
+ if (height <= 0)return;
+
//This will be the width of the drawn image
int width = g1_source->width >> zoom_level;
//This is the source start x coordinate
int source_start_x = 0;
//This is the destination start x coordinate
- int dest_start_x = x - dpi->x + g1_source->x_offset;
+ sint16 dest_start_x = ((sint16)x + g1_source->x_offset - dpi->x) >> zoom_level;
if (dest_start_x < 0){
//If the destination is negative reduce the width
@@ -1137,10 +1112,10 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in
int dest_end_x = dest_start_x + width;
- if (dest_end_x > dpi->width){
+ if (dest_end_x > (dpi->width>>zoom_level)){
//If the destination x is outside of the drawing area
//reduce the image width.
- width -= dest_end_x - dpi->width;
+ width -= dest_end_x - (dpi->width >> zoom_level);
//If there is no image to draw.
if (width <= 0)return;
}
@@ -1148,7 +1123,7 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in
uint8* dest_pointer = (uint8*)dpi->bits;
//Move the pointer to the start point of the destination
- dest_pointer += (dpi->width + dpi->pitch)*dest_start_y + dest_start_x;
+ dest_pointer += ((dpi->width >> zoom_level) + dpi->pitch)*dest_start_y + dest_start_x;
height <<= zoom_level;
width <<= zoom_level;
@@ -2217,7 +2192,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in
eax = ebx & 0x7FFFF;
g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[eax]);
- gfx_draw_sprite(dpi, ebx, max_x, max_y);
+ gfx_draw_sprite(dpi, ebx, max_x, max_y, 0);
max_x = max_x + g1_element->width;
break;
@@ -2379,4 +2354,33 @@ void gfx_draw_rain(int left, int top, int width, int height, uint32 x_start, uin
pattern_y_pos++;
pattern_y_pos %= pattern_y_space;
}
+}
+
+void draw_string_left_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y)
+{
+ char buffer[128];
+ int width;
+
+ format_string(buffer, format, args);
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224;
+ width = gfx_get_string_width(buffer);
+ gfx_draw_string(dpi, buffer, colour, x, y);
+ gfx_fill_rect(dpi, x, y + 11, x + width, y + 11, text_palette[1]);
+ if (text_palette[2] != 0)
+ gfx_fill_rect(dpi, x + 1, y + 12, x + width + 1, y + 12, text_palette[2]);
+}
+
+void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y)
+{
+ char buffer[128];
+ int width;
+
+ format_string(buffer, format, args);
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224;
+ width = gfx_get_string_width(buffer);
+ x -= width;
+ gfx_draw_string(dpi, buffer, colour, x, y);
+ gfx_fill_rect(dpi, x, y + 11, x + width, y + 11, text_palette[1]);
+ if (text_palette[2] != 0)
+ gfx_fill_rect(dpi, x + 1, y + 12, x + width + 1, y + 12, text_palette[2]);
}
\ No newline at end of file
diff --git a/src/gfx.h b/src/gfx.h
index f57cc558f6..476f7420ac 100644
--- a/src/gfx.h
+++ b/src/gfx.h
@@ -43,7 +43,7 @@ typedef struct {
sint16 x_offset; // 0x08
sint16 y_offset; // 0x0A
uint16 flags; // 0x0C
- sint16 zoomed_offset; // 0x0E
+ uint16 zoomed_offset; // 0x0E
} rct_g1_element;
enum{
@@ -70,9 +70,9 @@ void gfx_draw_pixel(rct_drawpixelinfo *dpi, int x, int y, int colour);
void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int colour);
void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bottom, int colour);
void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short right, short bottom, int colour, short _si);
-void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y);
+void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 tertiary_colour);
void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint8* palette_pointer, uint8* unknown_pointer);
-void gfx_draw_string(rct_drawpixelinfo *dpi, char *format, int colour, int x, int y);
+void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, int y);
void gfx_transpose_palette(int pal, unsigned char product);
void gfx_draw_string_left(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y);
@@ -96,4 +96,7 @@ void gfx_draw_rain(int left, int top, int width, int height, uint32 x_start, uin
rct_drawpixelinfo* clip_drawpixelinfo(rct_drawpixelinfo* dpi, int left, int width, int top, int height);
+void draw_string_left_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y);
+void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y);
+
#endif
diff --git a/src/graph.c b/src/graph.c
new file mode 100644
index 0000000000..d29dab4415
--- /dev/null
+++ b/src/graph.c
@@ -0,0 +1,176 @@
+/*****************************************************************************
+ * Copyright (c) 2014 Ted John, Peter Hill, 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 .
+ *****************************************************************************/
+
+#include "addresses.h"
+#include "date.h"
+#include "graph.h"
+#include "string_ids.h"
+
+static void graph_draw_months_uint8(rct_drawpixelinfo *dpi, uint8 *history, int count, int baseX, int baseY)
+{
+ int i, x, y, yearOver32, currentMonth, currentDay;
+
+ currentMonth = date_get_month(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16));
+ currentDay = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16);
+ yearOver32 = (currentMonth * 4) + (currentDay >> 14) - 31;
+ x = baseX;
+ y = baseY;
+ for (i = count - 1; i >= 0; i--) {
+ if (history[i] != 0 && history[i] != 255 && yearOver32 % 4 == 0) {
+ // Draw month text
+ RCT2_GLOBAL(0x013CE952, uint32) = ((yearOver32 / 4) + 8) % 8 + STR_MONTH_SHORT_MAR;
+ gfx_draw_string_centred(dpi, 2222, x, y - 10, 0, (void*)0x013CE952);
+
+ // Draw month mark
+ gfx_fill_rect(dpi, x, y, x, y + 3, 10);
+ }
+
+ yearOver32 = (yearOver32 + 1) % 32;
+ x += 6;
+ }
+}
+
+static void graph_draw_line_a_uint8(rct_drawpixelinfo *dpi, uint8 *history, int count, int baseX, int baseY)
+{
+ int i, x, y, lastX, lastY;
+ lastX = -1;
+ x = baseX;
+ for (i = count - 1; i >= 0; i--) {
+ if (history[i] != 0 && history[i] != 255) {
+ y = baseY + (history[i] * 100) / 256;
+
+ if (lastX != -1) {
+ gfx_draw_line(dpi, lastX + 1, lastY + 1, x + 1, y + 1, 10);
+ gfx_draw_line(dpi, lastX, lastY + 1, x, y + 1, 10);
+ }
+ if (i == 0)
+ gfx_fill_rect(dpi, x, y, x + 2, y + 2, 10);
+
+ lastX = x;
+ lastY = y;
+ }
+ x += 6;
+ }
+}
+
+static void graph_draw_line_b_uint8(rct_drawpixelinfo *dpi, uint8 *history, int count, int baseX, int baseY)
+{
+ int i, x, y, lastX, lastY;
+
+ lastX = -1;
+ x = baseX;
+ for (i = count - 1; i >= 0; i--) {
+ if (history[i] != 0 && history[i] != 255) {
+ y = baseY + (history[i] * 100) / 256;
+
+ if (lastX != -1)
+ gfx_draw_line(dpi, lastX, lastY, x, y, 21);
+ if (i == 0)
+ gfx_fill_rect(dpi, x - 1, y - 1, x + 1, y + 1, 21);
+
+ lastX = x;
+ lastY = y;
+ }
+ x += 6;
+ }
+}
+
+void graph_draw_uint8(rct_drawpixelinfo *dpi, uint8 *history, int count, int baseX, int baseY)
+{
+ graph_draw_months_uint8(dpi, history, count, baseX, baseY);
+ graph_draw_line_a_uint8(dpi, history, count, baseX, baseY);
+ graph_draw_line_b_uint8(dpi, history, count, baseX, baseY);
+}
+
+static void graph_draw_months_money32(rct_drawpixelinfo *dpi, money32 *history, int count, int baseX, int baseY)
+{
+ int i, x, y, yearOver32, currentMonth, currentDay;
+
+ currentMonth = date_get_month(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16));
+ currentDay = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16);
+ yearOver32 = (currentMonth * 4) + (currentDay >> 14) - 31;
+ x = baseX;
+ y = baseY;
+ for (i = count - 1; i >= 0; i--) {
+ if (history[i] != 0x80000000 && yearOver32 % 4 == 0) {
+ // Draw month text
+ sint32 monthFormat = ((yearOver32 / 4) + 8) % 8 + STR_MONTH_SHORT_MAR;
+ gfx_draw_string_centred(dpi, 2222, x, y - 10, 0, &monthFormat);
+
+ // Draw month mark
+ gfx_fill_rect(dpi, x, y, x, y + 3, 10);
+ }
+
+ yearOver32 = (yearOver32 + 1) % 32;
+ x += 6;
+ }
+}
+
+static void graph_draw_line_a_money32(rct_drawpixelinfo *dpi, money32 *history, int count, int baseX, int baseY, int modifier, int offset)
+{
+ int i, x, y, lastX, lastY;
+ lastX = -1;
+ x = baseX;
+ for (i = count - 1; i >= 0; i--) {
+ if (history[i] != 0x80000000) {
+ y = baseY + 170 - 6 - ((((history[i] >> modifier) + offset) * 170) / 256);
+
+ if (lastX != -1) {
+ gfx_draw_line(dpi, lastX + 1, lastY + 1, x + 1, y + 1, 10);
+ gfx_draw_line(dpi, lastX, lastY + 1, x, y + 1, 10);
+ }
+ if (i == 0)
+ gfx_fill_rect(dpi, x, y, x + 2, y + 2, 10);
+
+ lastX = x;
+ lastY = y;
+ }
+ x += 6;
+ }
+}
+
+static void graph_draw_line_b_money32(rct_drawpixelinfo *dpi, money32 *history, int count, int baseX, int baseY, int modifier, int offset)
+{
+ int i, x, y, lastX, lastY;
+
+ lastX = -1;
+ x = baseX;
+ for (i = count - 1; i >= 0; i--) {
+ if (history[i] != 0x80000000) {
+ y = baseY + 170 - 6 - ((((history[i] >> modifier) + offset) * 170) / 256);
+
+ if (lastX != -1)
+ gfx_draw_line(dpi, lastX, lastY, x, y, 21);
+ if (i == 0)
+ gfx_fill_rect(dpi, x - 1, y - 1, x + 1, y + 1, 21);
+
+ lastX = x;
+ lastY = y;
+ }
+ x += 6;
+ }
+}
+
+void graph_draw_money32(rct_drawpixelinfo *dpi, money32 *history, int count, int baseX, int baseY, int modifier, int offset)
+{
+ graph_draw_months_money32(dpi, history, count, baseX, baseY);
+ graph_draw_line_a_money32(dpi, history, count, baseX, baseY, modifier, offset);
+ graph_draw_line_b_money32(dpi, history, count, baseX, baseY, modifier, offset);
+}
\ No newline at end of file
diff --git a/src/graph.h b/src/graph.h
new file mode 100644
index 0000000000..03622b7a2c
--- /dev/null
+++ b/src/graph.h
@@ -0,0 +1,30 @@
+/*****************************************************************************
+ * Copyright (c) 2014 Ted John, Peter Hill, 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 .
+ *****************************************************************************/
+
+#ifndef _GRAPH_H_
+#define _GRAPH_H_
+
+#include "gfx.h"
+#include "rct2.h"
+
+void graph_draw_uint8(rct_drawpixelinfo *dpi, uint8 *history, int count, int baseX, int baseY);
+void graph_draw_money32(rct_drawpixelinfo *dpi, money32 *history, int count, int baseX, int baseY, int modifier, int offset);
+
+#endif
\ No newline at end of file
diff --git a/src/intro.c b/src/intro.c
index 2d19d04312..75f3c853cb 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -104,10 +104,10 @@ void intro_update()
129);
// Draw the logo
- gfx_draw_sprite(screenDPI, SPR_INTRO_INFOGRAMES_00, (screenWidth / 2) - 320 + 69, _tick_counter + 69);
- gfx_draw_sprite(screenDPI, SPR_INTRO_INFOGRAMES_10, (screenWidth / 2) - 320 + 319, _tick_counter + 69);
- gfx_draw_sprite(screenDPI, SPR_INTRO_INFOGRAMES_01, (screenWidth / 2) - 320 + 69, _tick_counter + 319);
- gfx_draw_sprite(screenDPI, SPR_INTRO_INFOGRAMES_11, (screenWidth / 2) - 320 + 319, _tick_counter + 319);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_INFOGRAMES_00, (screenWidth / 2) - 320 + 69, _tick_counter + 69, 0);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_INFOGRAMES_10, (screenWidth / 2) - 320 + 319, _tick_counter + 69, 0);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_INFOGRAMES_01, (screenWidth / 2) - 320 + 69, _tick_counter + 319, 0);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_INFOGRAMES_11, (screenWidth / 2) - 320 + 319, _tick_counter + 319, 0);
// Check if logo is off the screen .ish
if (_tick_counter > 520) {
@@ -145,8 +145,8 @@ void intro_update()
gfx_clear(screenDPI, 10);
// Draw Chris Sawyer logo
- gfx_draw_sprite(screenDPI, SPR_INTRO_CHRIS_SAWYER_00, (screenWidth / 2) - 320 + 70, _tick_counter);
- gfx_draw_sprite(screenDPI, SPR_INTRO_CHRIS_SAWYER_10, (screenWidth / 2) - 320 + 320, _tick_counter);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_CHRIS_SAWYER_00, (screenWidth / 2) - 320 + 70, _tick_counter, 0);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_CHRIS_SAWYER_10, (screenWidth / 2) - 320 + 320, _tick_counter, 0);
// Check if logo is at 259 pixels
if (_tick_counter == 259) {
@@ -171,12 +171,12 @@ void intro_update()
gfx_clear(screenDPI, 245);
// Draw RollerCoaster Tycoon 2 logo
- gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_00, (screenWidth / 2) - 320 + 0, 0);
- gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_10, (screenWidth / 2) - 320 + 220, 0);
- gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_20, (screenWidth / 2) - 320 + 440, 0);
- gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_01, (screenWidth / 2) - 320 + 0, 240);
- gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_11, (screenWidth / 2) - 320 + 220, 240);
- gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_21, (screenWidth / 2) - 320 + 440, 240);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_00, (screenWidth / 2) - 320 + 0, 0, 0);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_10, (screenWidth / 2) - 320 + 220, 0, 0);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_20, (screenWidth / 2) - 320 + 440, 0, 0);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_01, (screenWidth / 2) - 320 + 0, 240, 0);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_11, (screenWidth / 2) - 320 + 220, 240, 0);
+ gfx_draw_sprite(screenDPI, SPR_INTRO_LOGO_21, (screenWidth / 2) - 320 + 440, 240, 0);
// Set palette thing
gfx_transpose_palette(23224, 0);
diff --git a/src/marketing.c b/src/marketing.c
index 57808a3a73..5d94454cae 100644
--- a/src/marketing.c
+++ b/src/marketing.c
@@ -26,6 +26,15 @@
#include "string_ids.h"
#include "window.h"
+const money16 AdvertisingCampaignPricePerWeek[] = {
+ MONEY(50,00), // PARK_ENTRY_FREE,
+ MONEY(50,00), // RIDE_FREE,
+ MONEY(50,00), // PARK_ENTRY_HALF_PRICE,
+ MONEY(50,00), // FOOD_OR_DRINK_FREE,
+ MONEY(350,00), // PARK,
+ MONEY(200,00) // RIDE,
+};
+
const int advertisingCampaignGuestGenerationProbabilities[] = { 400, 300, 200, 200, 250, 200 };
int marketing_get_campaign_guest_generation_probability(int campaign)
diff --git a/src/marketing.h b/src/marketing.h
index 43e99796c9..f5ee816d3d 100644
--- a/src/marketing.h
+++ b/src/marketing.h
@@ -33,6 +33,8 @@ enum {
ADVERTISING_CAMPAIGN_COUNT
};
+extern const money16 AdvertisingCampaignPricePerWeek[6];
+
int marketing_get_campaign_guest_generation_probability(int campaign);
void marketing_update();
void marketing_set_guest_campaign(rct_peep *peep, int campaign);
diff --git a/src/park.c b/src/park.c
index 4adfba5abf..ba0457c3fc 100644
--- a/src/park.c
+++ b/src/park.c
@@ -475,7 +475,7 @@ static rct_peep *park_generate_new_guest()
spawn.direction ^= 2;
peep = peep_generate(spawn.x, spawn.y, spawn.z * 16);
if (peep != NULL) {
- peep->var_1E = spawn.direction << 3;
+ peep->sprite_direction = spawn.direction << 3;
// Get the centre point of the tile the peep is on
peep->var_32 = (peep->x & 0xFFE0) + 16;
diff --git a/src/peep.h b/src/peep.h
index fc6406212d..838564136c 100644
--- a/src/peep.h
+++ b/src/peep.h
@@ -330,7 +330,7 @@ typedef struct {
sint16 var_18;
sint16 var_1A;
sint16 var_1C;
- uint8 var_1E;
+ uint8 sprite_direction;
uint8 pad_1F[3];
uint16 name_string_idx; // 0x22
uint16 next_x; // 0x24
diff --git a/src/sprite.h b/src/sprite.h
index f42388dd8e..701d448cbc 100644
--- a/src/sprite.h
+++ b/src/sprite.h
@@ -29,6 +29,13 @@
#include "peep.h"
#include "vehicle.h"
+enum SPRITE_IDENTIFIER{
+ SPRITE_IDENTIFIER_VEHICLE = 0,
+ SPRITE_IDENTIFIER_PEEP = 1,
+ SPRITE_IDENTIFIER_FLOATING_TEXT = 2,
+ SPRITE_IDENTIFIER_LITTER = 3,
+};
+
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 pad_01;
@@ -42,10 +49,18 @@ typedef struct {
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
+ uint16 pad_14;
+ sint16 var_16; //x related
+ sint16 var_18; //y related
+ sint16 var_1A; //x related
+ sint16 var_1C; //y related
+ uint8 sprite_direction; //direction of sprite?
} rct_unk_sprite;
typedef struct {
- uint32 pad_00;
+ uint8 sprite_identifier; // 0x00
+ uint8 var_01; // 0x01
+ uint16 var_02; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 var_08;
diff --git a/src/sprites.h b/src/sprites.h
index 0067235d1b..ba86b98915 100644
--- a/src/sprites.h
+++ b/src/sprites.h
@@ -87,6 +87,15 @@ enum {
SPR_TAB_ADMISSION_6 = SPR_TAB_ADMISSION_0 + 6,
SPR_TAB_ADMISSION_7 = SPR_TAB_ADMISSION_0 + 7,
+ SPR_TAB_FINANCES_SUMMARY_0 = 5261,
+ SPR_TAB_FINANCES_SUMMARY_1 = SPR_TAB_FINANCES_SUMMARY_0 + 1,
+ SPR_TAB_FINANCES_SUMMARY_2 = SPR_TAB_FINANCES_SUMMARY_0 + 2,
+ SPR_TAB_FINANCES_SUMMARY_3 = SPR_TAB_FINANCES_SUMMARY_0 + 3,
+ SPR_TAB_FINANCES_SUMMARY_4 = SPR_TAB_FINANCES_SUMMARY_0 + 4,
+ SPR_TAB_FINANCES_SUMMARY_5 = SPR_TAB_FINANCES_SUMMARY_0 + 5,
+ SPR_TAB_FINANCES_SUMMARY_6 = SPR_TAB_FINANCES_SUMMARY_0 + 6,
+ SPR_TAB_FINANCES_SUMMARY_7 = SPR_TAB_FINANCES_SUMMARY_0 + 7,
+
SPR_TAB_STATS_0 = 5277,
SPR_TAB_STATS_1 = SPR_TAB_STATS_0 + 1,
SPR_TAB_STATS_2 = SPR_TAB_STATS_0 + 2,
@@ -111,6 +120,8 @@ enum {
SPR_PEEP_LARGE_FACE_ANGRY = 5314,
+ SPR_TAB_FINANCES_RESEARCH_0 = 5327,
+
SPR_TAB_SHOPS_AND_STALLS_0 = 5351,
SPR_TAB_SHOPS_AND_STALLS_1 = SPR_TAB_SHOPS_AND_STALLS_0 + 1,
SPR_TAB_SHOPS_AND_STALLS_2 = SPR_TAB_SHOPS_AND_STALLS_0 + 2,
@@ -137,6 +148,14 @@ enum {
SPR_TAB_KIOSKS_AND_FACILITIES_6 = SPR_TAB_KIOSKS_AND_FACILITIES_0 + 6,
SPR_TAB_KIOSKS_AND_FACILITIES_7 = SPR_TAB_KIOSKS_AND_FACILITIES_0 + 7,
+ SPR_TAB_FINANCES_FINANCIAL_GRAPH_0 = 5375,
+
+ SPR_TAB_FINANCES_PROFIT_GRAPH_0 = 5391,
+
+ SPR_TAB_FINANCES_VALUE_GRAPH_0 = 5407,
+
+ SPR_TAB_FINANCES_MARKETING_0 = 5423,
+
SPR_TAB_RIDE_0 = 5442,
SPR_TAB_RIDE_1 = SPR_TAB_RIDE_0 + 1,
SPR_TAB_RIDE_2 = SPR_TAB_RIDE_0 + 2,
diff --git a/src/string_ids.c b/src/string_ids.c
index caf7ece170..9fafdc888b 100644
--- a/src/string_ids.c
+++ b/src/string_ids.c
@@ -1089,7 +1089,6 @@ format_code_token format_code_tokens[] = {
{ FORMAT_NEWLINE_X_Y, "NEWLINE_X_Y" },
{ FORMAT_INLINE_SPRITE, "INLINE_SPRITE" },
{ FORMAT_ENDQUOTES, "ENDQUOTES" },
- { FORMAT_ARGUMENT_CODE_START, "ARGUMENT_CODE_START" },
{ FORMAT_COMMA32, "COMMA32" },
{ FORMAT_INT32, "INT32" },
{ FORMAT_COMMA2DP32, "COMMA2DP32" },
@@ -1109,7 +1108,6 @@ format_code_token format_code_tokens[] = {
{ FORMAT_REALTIME, "REALTIME" },
{ FORMAT_LENGTH, "LENGTH" },
{ FORMAT_SPRITE, "SPRITE" },
- { FORMAT_COLOUR_CODE_START, "COLOUR_CODE_START" },
{ FORMAT_BLACK, "BLACK" },
{ FORMAT_GREY, "GREY" },
{ FORMAT_WHITE, "WHITE" },
@@ -1124,7 +1122,6 @@ format_code_token format_code_tokens[] = {
{ FORMAT_LIGHTPINK, "LIGHTPINK" },
{ FORMAT_PEARLAQUA, "PEARLAQUA" },
{ FORMAT_PALESILVER, "PALESILVER" },
- { FORMAT_COLOUR_CODE_END, "COLOUR_CODE_END" },
{ FORMAT_AMINUSCULE, "AMINUSCULE" },
{ FORMAT_UP, "UP" },
{ FORMAT_POUND, "POUND" },
@@ -1153,7 +1150,7 @@ char format_get_code(const char *token)
{
int i;
for (i = 0; i < countof(format_code_tokens); i++)
- if (strcmpi(token, format_code_tokens[i].token) == 0)
+ if (_strcmpi(token, format_code_tokens[i].token) == 0)
return format_code_tokens[i].code;
return 0;
}
@@ -1172,7 +1169,7 @@ const char *format_get_token(char code)
void format_string_part_from_raw(char **dest, const char *src, char **args);
void format_string_part(char **dest, rct_string_id format, char **args);
-void format_integer(char **dest, int value)
+void format_integer(char **dest, long long value)
{
int digit;
char *dst = *dest;
@@ -1212,7 +1209,7 @@ void format_integer(char **dest, int value)
*dest = finish;
}
-void format_comma_separated_integer(char **dest, int value)
+void format_comma_separated_integer(char **dest, long long value)
{
int digit, groupIndex;
char *dst = *dest;
@@ -1260,7 +1257,7 @@ void format_comma_separated_integer(char **dest, int value)
*dest = finish;
}
-void format_comma_separated_fixed_2dp(char **dest, int value)
+void format_comma_separated_fixed_2dp(char **dest, long long value)
{
int digit, groupIndex;
char *dst = *dest;
@@ -1317,9 +1314,9 @@ void format_comma_separated_fixed_2dp(char **dest, int value)
*dest = finish;
}
-void format_currency(char **dest, int value)
+void format_currency(char **dest, long long value)
{
- rct_currency_spec *currencySpec = &g_currency_specs[gGeneral_config.currency_format];
+ const rct_currency_spec *currencySpec = &g_currency_specs[gGeneral_config.currency_format];
int rate = currencySpec->rate;
value *= rate;
@@ -1349,9 +1346,9 @@ void format_currency(char **dest, int value)
}
}
-void format_currency_2dp(char **dest, int value)
+void format_currency_2dp(char **dest, long long value)
{
- rct_currency_spec *currencySpec = &g_currency_specs[gGeneral_config.currency_format];
+ const rct_currency_spec *currencySpec = &g_currency_specs[gGeneral_config.currency_format];
int rate = currencySpec->rate;
value *= rate;
diff --git a/src/string_ids.h b/src/string_ids.h
index 070f76b229..cd65236f5b 100644
--- a/src/string_ids.h
+++ b/src/string_ids.h
@@ -280,6 +280,7 @@ enum {
STR_CONSTRUCT_THE_SELECTED_FOOTPATH_SECTION_TIP = 1189,
STR_REMOVE_PREVIOUS_FOOTPATH_SECTION_TIP = 1190,
STR_COST = 1191,
+ STR_LOSS = 1192,
STR_CLOSED = 1194,
STR_TEST_RUN = 1195,
@@ -415,6 +416,32 @@ enum {
STR_INSPECTING_RIDE = 1886,
STR_BUILD_RIDE_TIP = 1895,
+ STR_FINANCES_SUMMARY_EXPENDITURE_INCOME = 1896,
+ STR_FINANCES_SUMMARY_RIDE_CONSTRUCTION = 1897,
+ STR_FINANCES_SUMMARY_RIDE_RUNNING_COSTS = 1898,
+ STR_FINANCES_SUMMARY_LAND_PURCHASE = 1899,
+ STR_FINANCES_SUMMARY_LANDSCAPING = 1900,
+ STR_FINANCES_SUMMARY_PARK_ENTRANCE_TICKETS = 1901,
+ STR_FINANCES_SUMMARY_RIDE_TICKETS = 1902,
+ STR_FINANCES_SUMMARY_SHOP_SALES = 1903,
+ STR_FINANCES_SUMMARY_SHOP_STOCK = 1904,
+ STR_FINANCES_SUMMARY_FOOD_DRINK_SALES = 1905,
+ STR_FINANCES_SUMMARY_FOOD_DRINK_STOCK = 1906,
+ STR_FINANCES_SUMMARY_STAFF_WAGES = 1907,
+ STR_FINANCES_SUMMARY_MARKETING = 1908,
+ STR_FINANCES_SUMMARY_RESEARCH = 1909,
+ STR_FINANCES_SUMMARY_LOAN_INTEREST = 1910,
+
+ STR_FINANCES_SUMMARY_AT_X_PER_YEAR = 1911,
+ STR_FINANCES_SUMMARY_MONTH_HEADING = 1912,
+ STR_FINANCES_SUMMARY_INCOME_VALUE = 1913,
+ STR_FINANCES_SUMMARY_EXPENDITURE_VALUE = 1914,
+ STR_FINANCES_SUMMARY_LOSS_VALUE = 1915,
+ STR_FINANCES_SUMMARY_LOAN = 1916,
+
+ STR_CANT_BORROW_ANY_MORE_MONEY = 1918,
+ STR_NOT_ENOUGH_CASH_AVAILABLE = 1919,
+ STR_CANT_PAY_BACK_LOAN = 1920,
STR_START_NEW_GAME_TIP = 1921,
STR_CONTINUE_SAVED_GAME_TIP = 1922,
@@ -449,6 +476,11 @@ enum {
STR_PARK_RATING_TIP = 2221,
STR_GUESTS_IN_PARK_LABEL = 2223,
+ STR_CASH_LABEL = 2224,
+ STR_CASH_NEGATIVE_LABEL = 2225,
+ STR_PARK_VALUE_LABEL = 2226,
+ STR_COMPANY_VALUE_LABEL = 2227,
+ STR_LAST_MONTH_PROFIT_FROM_FOOD_DRINK_MERCHANDISE_SALES_LABEL = 2228,
STR_PARK_INFORMATION_TIP = 2233,
STR_RECENT_MESSAGES = 2234,
@@ -474,7 +506,13 @@ enum {
STR_RESEARCH_SHOPS_AND_STALLS = 2258,
STR_RESEARCH_SCENERY_AND_THEMING = 2259,
+ STR_NO_FUNDING = 2260,
+ STR_MINIMUM_FUNDING = 2261,
+ STR_NORMAL_FUNDING = 2262,
+ STR_MAXIMUM_FUNDING = 2263,
+
STR_RESEARCH_FUNDING_ = 2264,
+ STR_RESEARCH_COST_PER_MONTH = 2265,
STR_RESEARCH_PRIORITIES = 2266,
STR_FINANCES_RESEARCH = 2275,
@@ -554,8 +592,40 @@ enum {
STR_OBJECTIVE_MONTHLY_FOOD_INCOME = STR_OBJECTIVE_NONE + 11,
STR_MARKETING_CAMPAIGNS_IN_OPERATION = 2409,
+ STR_MARKETING_CAMPAGINS_NONE = 2410,
STR_MARKETING_CAMPAIGNS_AVAILABLE = 2411,
STR_START_THIS_MARKETING_CAMPAIGN = 2412,
+ STR_MARKETING_PER_WEEK = 2413,
+ STR_MARKETING_NOT_SELECTED = 2414,
+ STR_MARKETING_RIDE = 2415,
+ STR_MARKETING_ITEM = 2416,
+
+ STR_LENGTH_OF_TIME = 2417,
+
+ STR_MARKETING_VOUCHERS_FOR_FREE_ENTRY_TO_THE_PARK = 2424,
+ STR_MARKETING_VOUCHERS_FOR_FREE_RIDES_ON_A_PARTICULAR_RIDE = 2425,
+ STR_MARKETING_VOUCHERS_FOR_HALF_PRICE_ENTRY_TO_THE_PARK = 2426,
+ STR_MARKETING_VOUCHERS_FOR_FREE_FOOD_OR_DRINK = 2427,
+ STR_MARKETING_ADVERTISING_CAMPAIGN_FOR_THE_PARK = 2428,
+ STR_MARKETING_ADVERTISING_CAMPAIGN_FOR_A_PARTICULAR_RIDE = 2429,
+
+ STR_VOUCHERS_FOR_FREE_ENTRY_TO = 2430,
+ STR_VOUCHERS_FOR_FREE_RIDE_ON = 2431,
+ STR_VOUCHERS_FOR_HALF_PRICE_ENTRY_TO = 2432,
+ STR_VOUCHERS_FOR_FREE = 2433,
+ STR_ADVERTISING_CAMPAIGN_FOR_1 = 2434,
+ STR_ADVERTISING_CAMPAIGN_FOR_2 = 2435,
+
+ STR_MARKETING_1_WEEK = 2436,
+ STR_MARKETING_2_WEEKS = 2437,
+ STR_MARKETING_3_WEEKS = 2438,
+ STR_MARKETING_4_WEEKS = 2439,
+ STR_MARKETING_5_WEEKS = 2440,
+ STR_MARKETING_6_WEEKS = 2441,
+ STR_MARKETING_WEEKS_REMAINING = 2442,
+ STR_MARKETING_COST_PER_WEEK = 2443,
+ STR_MARKETING_TOTAL_COST = 2444,
+ STR_MARKETING_START_THIS_MARKETING_CAMPAIGN = 2445,
STR_MARKETING_FINISHED_BASE = 2446,
STR_MARKETING_FINISHED_FREE_ENTRY = 2446,
@@ -565,6 +635,12 @@ enum {
STR_MARKETING_FINISHED_PARK_ADS = 2450,
STR_MARKETING_FINISHED_RIDE_ADS = 2451,
+ STR_FINANCES_FINANCIAL_GRAPH_CASH_LESS_LOAN_POSITIVE = 2452,
+ STR_FINANCES_FINANCIAL_GRAPH_CASH_LESS_LOAN_NEGATIVE = 2453,
+ STR_FINANCES_FINANCIAL_GRAPH_CASH_VALUE = 2454,
+ STR_FINANCES_FINANCIAL_GRAPH_CASH_VALUE_POSITIVE = 2455,
+ STR_FINANCES_FINANCIAL_GRAPH_CASH_VALUE_NEGATIVE = 2456,
+
STR_FINANCES_SHOW_SUMMARY_TAB_TIP = 2457,
STR_FINANCES_SHOW_CASH_TAB_TIP = 2458,
STR_FINANCES_SHOW_PARK_VALUE_TAB_TIP = 2459,
@@ -589,6 +665,8 @@ enum {
STR_RESEARCH_NEW_SCENERY_AND_THEMING = 2476,
STR_PROFIT_PER_WEEK_AND_PARK_VALUE_TIP = 2482,
+ STR_FINANCES_WEEKLY_PROFIT_POSITIVE = 2483,
+ STR_FINANCES_WEEKLY_PROFIT_LOSS = 2484,
STR_CONTROLS = 2485,
STR_GENERAL = 2486,
@@ -596,6 +674,8 @@ enum {
STR_REAL_NAME_TIP = 2488,
STR_HOTKEY = 2489,
+ STR_FINACNES_PARK_VALUE = 2787,
+
STR_ENTER_NAME_INTO_SCENARIO_CHART = 2790,
STR_COMPLETED_BY_WITH_COMPANY_VALUE = 2794,
@@ -667,6 +747,7 @@ enum {
STR_TUTORIAL = 2856,
STR_PRESS_KEY_OR_MOUSE_BUTTON_FOR_CONTROL = 2857,
+ STR_CANT_START_MARKETING_CAMPAIGN = 2858,
STR_INFOGRAMES_INTERACTIVE_CREDITS = 2860,
STR_LICENSED_TO_INFOGRAMES_INTERACTIVE_INC = 2861,
diff --git a/src/viewport.c b/src/viewport.c
index 7db4522f8c..ca82a26202 100644
--- a/src/viewport.c
+++ b/src/viewport.c
@@ -33,6 +33,28 @@
rct_viewport* g_viewport_list = RCT2_ADDRESS(RCT2_ADDRESS_VIEWPORT_LIST, rct_viewport);
+typedef struct paint_struct paint_struct;
+
+struct paint_struct{
+ uint32 image_id; // 0x00
+ uint32 var_04;
+ uint16 attached_x; // 0x08
+ uint16 attached_y; // 0x0A
+ uint8 var_0C;
+ uint8 pad_0D;
+ paint_struct* next_attached_ps; //0x0E
+ uint8 pad_12[2];
+ uint16 x; // 0x14
+ uint16 y; // 0x16
+ uint8 pad_18[2];
+ uint8 var_1A;
+ uint8 pad_1B;
+ paint_struct* attached_ps; //0x1C
+ paint_struct* var_20;
+ paint_struct* var_24;
+ uint8 sprite_type; //0x28
+};
+
/**
* This is not a viewport function. It is used to setup many variables for
* multiple things.
@@ -267,10 +289,232 @@ void sub_0x68615B(int ebp){
RCT2_GLOBAL(0xF1AD24, uint32) = 0;
}
+/***
+ *
+ * rct2: 0x00688596
+ * Part of 0x688485
+ */
+void paint_attached_ps(paint_struct* ps, paint_struct* attached_ps, rct_drawpixelinfo* dpi){
+ for (; attached_ps; attached_ps = attached_ps->next_attached_ps){
+ sint16 x = attached_ps->attached_x + ps->x;
+ sint16 y = attached_ps->attached_y + ps->y;
+
+ int image_id = attached_ps->image_id;
+ if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_SEETHROUGH_RIDES){
+ if (ps->sprite_type == 3){
+ if (image_id & 0x40000000){
+ image_id &= 0x7FFFF;
+ image_id |= 0x41880000;
+ }
+ }
+ }
+
+ if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_SEETHROUGH_SCENERY){
+ if (ps->sprite_type == 5){
+ if (image_id & 0x40000000){
+ image_id &= 0x7FFFF;
+ image_id |= 0x41880000;
+ }
+ }
+ }
+
+ if (!(attached_ps->var_0C & 1)){
+ gfx_draw_sprite(dpi, image_id, x, y, ps->var_04);
+ }
+ else{
+ RCT2_CALLPROC_X(0x00681DE2, 0, image_id, x, y, 0, (int)dpi, attached_ps->var_04);
+ }
+ }
+}
+
+void sub_688485(){
+ //RCT2_CALLPROC_EBPSAFE(0x688485);
+ //return;
+ rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
+ paint_struct* ps = RCT2_GLOBAL(0xEE7884, paint_struct*);
+ paint_struct* previous_ps = ps->var_24;
+
+ for (ps = ps->var_24; ps;){
+ sint16 x = ps->x;
+ sint16 y = ps->y;
+ if (ps->sprite_type == 2){
+ if (dpi->zoom_level >= 1){
+ x &= 0xFFFE;
+ y &= 0xFFFE;
+ if (dpi->zoom_level >= 2){
+ x &= 0xFFFC;
+ y &= 0xFFFC;
+ }
+ }
+ }
+ int image_id = ps->image_id;
+ if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_SEETHROUGH_RIDES){
+ if (ps->sprite_type == 3){
+ if (!(image_id & 0x40000000)){
+ image_id &= 0x7FFFF;
+ image_id |= 0x41880000;
+ }
+ }
+ }
+ if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_UNDERGROUND_INSIDE){
+ if (ps->sprite_type == 9){
+ if (!(image_id & 0x40000000)){
+ image_id &= 0x7FFFF;
+ image_id |= 0x41880000;
+ }
+ }
+ }
+ if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_SEETHROUGH_SCENERY){
+ if (ps->sprite_type == 10 || ps->sprite_type == 12 || ps->sprite_type == 9 || ps->sprite_type == 5){
+ if (!(image_id & 0x40000000)){
+ image_id &= 0x7FFFF;
+ image_id |= 0x41880000;
+ }
+ }
+ }
+
+ if (!(ps->var_1A & 1))
+ gfx_draw_sprite(dpi, image_id, x, y, ps->var_04);
+ else
+ RCT2_CALLPROC_X(0x00681DE2, 0, image_id, x, y, 0, (int)dpi, ps->var_04);
+
+ if (ps->var_20 != 0){
+ ps = ps->var_20;
+ continue;
+ }
+
+ paint_attached_ps(ps, ps->attached_ps, dpi);
+ ps = previous_ps->var_24;
+ previous_ps = ps;
+ }
+
+}
+
+int sub_0x686806(rct_sprite* sprite, int eax, int ecx, int edx){
+ int ebp = (eax >> 8) & 0xFF;
+ edx <<= 16;
+ ebp += RCT2_GLOBAL(0x9DEA56, uint16);
+ RCT2_GLOBAL(0xF1AD28, uint32) = 0;
+ RCT2_GLOBAL(0xF1AD2C, uint32) = 0;
+ edx = (edx >> 16) | (ebp << 16);
+ ebp = RCT2_GLOBAL(0xEE7888, uint32);
+ if ((uint32)ebp >= RCT2_GLOBAL(0xEE7880, uint32)) return 1;
+ //686840 not finished
+
+ return 0;
+}
+
+/**
+* Litter Paint Setup??
+* rct2: 0x006736FC
+*/
+void sub_0x6736FC(rct_litter* litter, int ebx, int edx){
+ rct_drawpixelinfo* dpi;
+
+ dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
+ if (dpi->zoom_level != 0)return; //If zoomed at all no litter drawn
+
+ int ebp = litter->var_01;
+ //push litter
+ ebx >>= 3;
+ ebx &= RCT2_ADDRESS(0x97EF6C, uint32)[ebp * 2 + 1];
+ ebx += RCT2_ADDRESS(0x97EF6C, uint32)[ebp * 2];
+ int ecx = 0;
+ int edi = 4;
+ int esi = 4;
+ int eax = 0xFF00;
+ RCT2_GLOBAL(0x9DEA52, uint16) = 0xFFFC;
+ RCT2_GLOBAL(0x9DEA54, uint16) = 0xFFFC;
+ RCT2_GLOBAL(0x9DEA56, uint16) = edx + 2;
+
+ switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION,uint32)){
+ case 0:
+ //0x686806
+ break;
+ case 1:
+ //0x6869b2
+ break;
+ case 2:
+ //0x686b6f
+ break;
+ case 3:
+ //0x686d31
+ break;
+ }
+}
+
+
+/**
+* Paint Quadrant
+* rct2: 0x0069E8B0
+*/
+void sub_0x69E8B0(uint32 eax, uint32 ecx){
+ uint32 _eax = eax, _ecx = ecx;
+ rct_drawpixelinfo* dpi;
+
+
+ if (RCT2_GLOBAL(0x9DEA6F,uint8) & 1) return;
+
+ dpi = RCT2_GLOBAL(0x140E9A8,rct_drawpixelinfo*);
+
+ if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & 0x4000)return;
+
+ if (dpi->zoom_level > 2) return;
+
+ if (eax > 0x2000)return;
+ if (ecx > 0x2000)return;
+
+ //push eax, ecx
+ eax = (eax&0x1FE0)<<3 | (ecx>>5);
+ int sprite_idx = RCT2_ADDRESS(0xF1EF60, uint16)[eax];
+ if (sprite_idx == SPRITE_INDEX_NULL) return;
+
+ for (rct_sprite* spr = &g_sprite_list[sprite_idx]; sprite_idx != SPRITE_INDEX_NULL; sprite_idx = spr->unknown.var_02){
+ spr = &g_sprite_list[sprite_idx];
+ dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
+
+ if (dpi->y + dpi->height <= spr->unknown.var_18) continue;
+ if (spr->unknown.var_1C <= dpi->y)continue;
+ if (dpi->x + dpi->width <= spr->unknown.var_16)continue;
+ if (spr->unknown.var_1A <= dpi->x)continue;
+
+ int ebx = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32);
+ RCT2_GLOBAL(0x9DE578, uint32) = (uint32)spr;
+ int ebp = spr->unknown.sprite_identifier;
+ ebx <<= 3;
+ eax = spr->unknown.x;
+ ebx += spr->unknown.sprite_direction;
+ ecx = spr->unknown.y;
+ ebx &= 0x1F;
+ RCT2_GLOBAL(0x9DE568, uint16) = spr->unknown.x;
+ RCT2_GLOBAL(0x9DE570, uint8) = 2;
+ RCT2_GLOBAL(0x9DE56C, uint16) = spr->unknown.y;
+ int edx = spr->unknown.z;
+ switch (spr->unknown.sprite_identifier){
+ case SPRITE_IDENTIFIER_VEHICLE:
+ RCT2_CALLPROC_X(0x6D4244, eax, ebx, ecx, edx, (int)spr, (int)dpi, ebp);
+ break;
+ case SPRITE_IDENTIFIER_PEEP:
+ RCT2_CALLPROC_X(0x68F0FB, eax, ebx, ecx, edx, (int)spr, (int)dpi, ebp);
+ break;
+ case SPRITE_IDENTIFIER_FLOATING_TEXT:
+ RCT2_CALLPROC_X(0x672AC9, eax, ebx, ecx, edx, (int)spr, (int)dpi, ebp);
+ break;
+ case SPRITE_IDENTIFIER_LITTER:
+ RCT2_CALLPROC_X(0x6736FC, eax, ebx, ecx, edx, (int)spr, (int)dpi, ebp);
+ break;
+ //I am pretty sure there are no other sprite identifier types
+ }
+ //RCT2_CALLPROC_X(RCT2_ADDRESS(0x98BC40,uint32)[spr->unknown.sprite_identifier], eax, ebx, ecx, edx, (int)spr, (int)dpi, ebp);
+ }
+
+ //RCT2_CALLPROC_X(0x69E8B0, _eax, 0, _ecx, 0, 0, 0, 0);
+ //return;
+}
+
/**
*
-* rct2: 0x0068615B
-* ebp: ebp
+* rct2: 0x0068B6C2
*/
void sub_0x68B6C2(){
rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
@@ -294,16 +538,16 @@ void sub_0x68B6C2(){
dx >>= 5;
for (int i = dx; i > 0; --i){
RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
cx += 0x20;
ax -= 0x20;
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax += 0x20;
RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax += 0x20;
cx -= 0x20;
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
cx += 0x20;
}
break;
@@ -326,16 +570,16 @@ void sub_0x68B6C2(){
dx >>= 5;
for (int i = dx; i > 0; i--){
RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax -= 0x20;
cx -= 0x20;
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
cx += 0x20;
RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax += 0x20;
cx += 0x20;
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax -= 0x20;
}
break;
@@ -357,16 +601,16 @@ void sub_0x68B6C2(){
dx >>= 5;
for (int i = dx; i > 0; i--){
RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax += 0x20;
cx -= 0x20;
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax -= 0x20;
RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax -= 0x20;
cx += 0x20;
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
cx -= 0x20;
}
break;
@@ -389,16 +633,16 @@ void sub_0x68B6C2(){
dx >>= 5;
for (int i = dx; i > 0; i--){
RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax += 0x20;
cx += 0x20;
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
cx -= 0x20;
RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0);
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax -= 0x20;
cx -= 0x20;
- RCT2_CALLPROC_X(0x69E8B0, ax, 0, cx, 0, 0, 0, 0);
+ sub_0x69E8B0(ax, cx);
ax += 0x20;
}
break;
@@ -498,8 +742,9 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in
sub_0x68615B(0xEE788C); //Memory copy
sub_0x68B6C2();
//RCT2_CALLPROC_X(0x68B6C2, 0, 0, 0, 0, 0, 0, 0); //Big function call 4 rotation versions
- RCT2_CALLFUNC_X(0x688217, &start_x, &ebx, &ecx, (int*)&bits_pointer, &esi, (int*)&dpi2, &ebp); //Move memory
- RCT2_CALLFUNC_X(0x688485, &start_x, &ebx, &ecx, (int*)&bits_pointer, &esi, (int*)&dpi2, &ebp); //Big function call
+ RCT2_CALLPROC_X(0x688217, start_x, ebx, ecx, (int)bits_pointer, esi, (int)dpi2, ebp); //Move memory
+ sub_688485();
+ //RCT2_CALLPROC_EBPSAFE(0x688485); //Big function call
int weather_colour = RCT2_ADDRESS(0x98195C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER_GLOOM, uint8)];
if ((weather_colour != -1) && (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & 0x4000) && (RCT2_GLOBAL(0x9DEA6F, uint8) & 1)){
diff --git a/src/viewport.h b/src/viewport.h
index 13019e953b..f934b93adc 100644
--- a/src/viewport.h
+++ b/src/viewport.h
@@ -42,6 +42,7 @@ enum {
VIEWPORT_FLAG_15 = (1 << 15)
};
+
// rct2: 0x014234BC
extern rct_viewport* g_viewport_list;
diff --git a/src/widget.c b/src/widget.c
index 9278815ba0..3cf0aeb95c 100644
--- a/src/widget.c
+++ b/src/widget.c
@@ -157,8 +157,6 @@ void widget_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
widget_scroll_draw(dpi, w, widgetIndex);
break;
case WWT_CHECKBOX:
- widget_checkbox_draw(dpi, w, widgetIndex);
- break;
case WWT_24:
widget_checkbox_draw(dpi, w, widgetIndex);
break;
@@ -204,7 +202,7 @@ static void widget_frame_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetI
// Draw the resize sprite at the bottom right corner
l = w->x + widget->right - 18;
t = w->y + widget->bottom - 18;
- gfx_draw_sprite(dpi, SPR_RESIZE | 0x20000000 | (colour << 19), l, t);
+ gfx_draw_sprite(dpi, SPR_RESIZE | 0x20000000 | (colour << 19), l, t, 0);
}
/**
@@ -241,7 +239,7 @@ static void widget_resize_draw(rct_drawpixelinfo *dpi, rct_window *w, int widget
// Draw the resize sprite at the bottom right corner
l = w->x + widget->right - 18;
t = w->y + widget->bottom - 18;
- gfx_draw_sprite(dpi, SPR_RESIZE | 0x20000000 | (colour << 19), l, t);
+ gfx_draw_sprite(dpi, SPR_RESIZE | 0x20000000 | (colour << 19), l, t, 0);
}
/**
@@ -324,7 +322,7 @@ static void widget_tab_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetInd
image = widget->image + 2;
// Draw coloured image
- gfx_draw_sprite(dpi, image | colour, l, t);
+ gfx_draw_sprite(dpi, image | colour, l, t, 0);
}
/**
@@ -414,9 +412,9 @@ static void widget_text_unknown(rct_drawpixelinfo *dpi, rct_window *w, int widge
widget = &w->widgets[widgetIndex];
// Get the colour
-// colour = w->colours[widget->colour];
+ colour = w->colours[widget->colour];
// do not use widget color as this is already used as background for the text_button
- colour = 2;
+ // colour = 2;
// Resolve the absolute ltrb
l = w->x + widget->left;
@@ -631,13 +629,13 @@ static void widget_caption_draw(rct_drawpixelinfo *dpi, rct_window *w, int widge
//
if (w->var_4B8 != -1) {
- gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B8)) << 19, l + 1, t + 1);
+ gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B8)) << 19, l + 1, t + 1, 0);
if (w->width > 638)
- gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B8)) << 19, l + 1 + 638, t + 1);
+ gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B8)) << 19, l + 1 + 638, t + 1, 0);
if (w->var_4B9 != -1) {
- gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B9)) << 19, l + 1, t + 1);
+ gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B9)) << 19, l + 1, t + 1, 0);
if (w->width > 638)
- gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B9)) << 19, l + 1 + 638, t + 1);
+ gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B9)) << 19, l + 1 + 638, t + 1, 0);
}
//
@@ -942,7 +940,7 @@ static void widget_draw_image(rct_drawpixelinfo *dpi, rct_window *w, int widgetI
else
image |= colour << 19;
- gfx_draw_sprite(dpi, image, l, t);
+ gfx_draw_sprite(dpi, image, l, t, 0);
}
}
diff --git a/src/window.c b/src/window.c
index d7fa7cd63f..fe9363d2d4 100644
--- a/src/window.c
+++ b/src/window.c
@@ -909,7 +909,22 @@ void window_rotate_camera(rct_window *w)
*/
void window_zoom_in(rct_window *w)
{
- RCT2_CALLPROC_X(0x006887A6, 0, 0, 0, 0, (int)w, 0, 0);
+ rct_viewport* v = w->viewport;
+
+ // Prevent zooming more than possible.
+ if (v->zoom <= 0) {
+ return;
+ }
+
+ v->zoom--;
+
+ v->view_width /= 2;
+ v->view_height /= 2;
+
+ w->saved_view_x += v->view_width >> 1;
+ w->saved_view_y += v->view_height >> 1;
+
+ RCT2_CALLPROC_X(0x006EB13A, 0, 0, 0, 0, (int)w, 0, 0);
}
/**
@@ -918,7 +933,25 @@ void window_zoom_in(rct_window *w)
*/
void window_zoom_out(rct_window *w)
{
- RCT2_CALLPROC_X(0x006887E0, 0, 0, 0, 0, (int)w, 0, 0);
+ rct_viewport* v = w->viewport;
+
+ // Prevent zooming more than possible.
+ if (v->zoom >= 3) {
+ return;
+ }
+
+ v->zoom++;
+
+ int width = v->view_width;
+ int height = v->view_height;
+
+ v->view_width *= 2;
+ v->view_height *= 2;
+
+ w->saved_view_x -= width / 2;
+ w->saved_view_y -= height >> 1;
+
+ RCT2_CALLPROC_X(0x006EB13A, 0, 0, 0, 0, (int)w, 0, 0);
}
/**
@@ -1310,8 +1343,8 @@ void window_bubble_list_item(rct_window* w, int item_position){
void window_resize_gui(int width, int height)
{
if (RCT2_GLOBAL(0x9DEA68, uint8) & 0xE){
- //Scenario editor version
- RCT2_CALLPROC_EBPSAFE(0x66F0DD);
+ window_resize_gui_scenario_editor(width, height);
+ return;
}
rct_window* mainWind = window_get_main();
if (mainWind){
@@ -1363,3 +1396,42 @@ void window_resize_gui(int width, int height)
exitWind->y = height - 64;
}
}
+
+/**
+* rct2: 0x0066F0DD
+*/
+void window_resize_gui_scenario_editor(int width, int height)
+{
+ rct_window* mainWind = window_get_main();
+ if (mainWind) {
+ rct_viewport* viewport = mainWind->viewport;
+ mainWind->width = width;
+ mainWind->height = height;
+ RCT2_GLOBAL(0x9A9834, uint16) = width - 1;
+ RCT2_GLOBAL(0x9A9838, uint16) = height - 1;
+ viewport->width = width;
+ viewport->height = height;
+ viewport->view_width = width << viewport->zoom;
+ viewport->view_height = height << viewport->zoom;
+ if (mainWind->widgets != NULL && mainWind->widgets[0].type == WWT_VIEWPORT){
+ mainWind->widgets[0].right = width;
+ mainWind->widgets[0].bottom = height;
+ }
+ }
+
+ rct_window* topWind = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (topWind){
+ topWind->width = max(640, width);
+ }
+
+ rct_window* bottomWind = window_find_by_id(WC_BOTTOM_TOOLBAR, 0);
+ if (bottomWind){
+ bottomWind->y = height - 32;
+ bottomWind->width = max(640, width);
+ RCT2_GLOBAL(0x9A997C, uint16) = bottomWind->width - 1;
+ RCT2_GLOBAL(0x9A997A, uint16) = bottomWind->width - 200;
+ RCT2_GLOBAL(0x9A998A, uint16) = bottomWind->width - 198;
+ RCT2_GLOBAL(0x9A998C, uint16) = bottomWind->width - 3;
+ }
+
+}
diff --git a/src/window.h b/src/window.h
index 2bf0c07ada..700e07d6dc 100644
--- a/src/window.h
+++ b/src/window.h
@@ -346,6 +346,7 @@ void tool_cancel();
// Open window functions
void window_main_open();
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_game_bottom_toolbar_open();
void window_about_open();
@@ -371,6 +372,7 @@ void window_park_guests_open();
void window_park_objective_open();
void window_park_rating_open();
void window_finances_open();
+void window_new_campaign_open(int campaignType);
void window_ride_list_open();
void window_banner_open();
void window_cheats_open();
@@ -385,4 +387,38 @@ void window_staff_init_vars();
void window_event_helper(rct_window* w, short widgetIndex, WINDOW_EVENTS event);
+#ifdef _MSC_VER
+ #define window_get_register(w) \
+ __asm mov w, esi
+
+ #define window_mouse_up_get_registers(w, widgetIndex) \
+ __asm mov widgetIndex, dx \
+ __asm mov w, esi
+
+ #define window_dropdown_get_registers(w, widgetIndex, dropdownIndex) \
+ __asm mov dropdownIndex, ax \
+ __asm mov widgetIndex, dx \
+ __asm mov w, esi
+
+ #define window_paint_get_registers(w, dpi) \
+ __asm mov w, esi \
+ __asm mov dpi, edi
+#else
+ #define window_get_register(w) \
+ __asm__ ( "mov %[w], esi " : [w] "+m" (w) );
+
+ #define window_mouse_up_get_registers(w, widgetIndex) \
+ __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); \
+ __asm__ ( "mov %[w], esi " : [w] "+m" (w) );
+
+ #define window_dropdown_get_registers(w, widgetIndex, dropdownIndex) \
+ __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); \
+ __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); \
+ __asm__ ( "mov %[w], esi " : [w] "+m" (w) );
+
+ #define window_paint_get_registers(w, dpi) \
+ __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); \
+ __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) );
+#endif
+
#endif
diff --git a/src/window_about.c b/src/window_about.c
index 36159bdce0..f707439b26 100644
--- a/src/window_about.c
+++ b/src/window_about.c
@@ -200,8 +200,8 @@ static void window_about_paint()
gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_7, x, y, 0, (void*)0x009E2D28);
// Images
- gfx_draw_sprite(dpi, SPR_CREDITS_CHRIS_SAWYER_SMALL, w->x + 92, w->y + 40);
- gfx_draw_sprite(dpi, SPR_CREDITS_INFOGRAMES, w->x + 50, w->y + 247);
+ gfx_draw_sprite(dpi, SPR_CREDITS_CHRIS_SAWYER_SMALL, w->x + 92, w->y + 40, 0);
+ gfx_draw_sprite(dpi, SPR_CREDITS_INFOGRAMES, w->x + 50, w->y + 247, 0);
// Licence
gfx_draw_string_left(dpi, STR_LICENSED_TO_INFOGRAMES_INTERACTIVE_INC, 0, 0, w->x + 157, w->y + 257);
diff --git a/src/window_cheats.c b/src/window_cheats.c
index 7c6453be6e..2289be7b79 100644
--- a/src/window_cheats.c
+++ b/src/window_cheats.c
@@ -508,7 +508,7 @@ static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
sprite_idx = 5261;
if (w->page == WINDOW_CHEATS_PAGE_MONEY)
sprite_idx += (w->frame_no / 2) % 8;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_1].left, w->y + w->widgets[WIDX_TAB_1].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_1].left, w->y + w->widgets[WIDX_TAB_1].top, 0);
}
// Guests tab
@@ -516,13 +516,13 @@ static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
sprite_idx = 5568;
if (w->page == WINDOW_CHEATS_PAGE_GUESTS)
sprite_idx += (w->frame_no / 3) % 8;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_2].left, w->y + w->widgets[WIDX_TAB_2].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_2].left, w->y + w->widgets[WIDX_TAB_2].top, 0);
}
// Misc tab
if (!(w->disabled_widgets & (1 << WIDX_TAB_3))) {
sprite_idx = SPR_TAB_QUESTION;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_3].left, w->y + w->widgets[WIDX_TAB_3].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_3].left, w->y + w->widgets[WIDX_TAB_3].top, 0);
}
}
diff --git a/src/window_dropdown.c b/src/window_dropdown.c
index 905fc33951..f091d36812 100644
--- a/src/window_dropdown.c
+++ b/src/window_dropdown.c
@@ -330,7 +330,7 @@ static void window_dropdown_paint()
dpi,
image,
w->x + 2 + (cell_x * _dropdown_item_width),
- w->y + 2 + (cell_y * _dropdown_item_height)
+ w->y + 2 + (cell_y * _dropdown_item_height), 0
);
} else {
// Text item
diff --git a/src/window_finances.c b/src/window_finances.c
index 6d5d146f61..d29c79e727 100644
--- a/src/window_finances.c
+++ b/src/window_finances.c
@@ -19,9 +19,18 @@
*****************************************************************************/
#include "addresses.h"
+#include "date.h"
+#include "finance.h"
+#include "game.h"
+#include "graph.h"
+#include "marketing.h"
+#include "ride.h"
+#include "scenario.h"
#include "string_ids.h"
+#include "sprites.h"
#include "widget.h"
#include "window.h"
+#include "window_dropdown.h"
enum {
WINDOW_FINANCES_PAGE_SUMMARY,
@@ -49,7 +58,9 @@ enum {
WIDX_LOAN_INCREASE,
WIDX_LOAN_DECREASE,
- WIDX_CAMPAIGN_1 = 12,
+ WIDX_ACITVE_CAMPAGINS_GROUP = 10,
+ WIDX_CAMPAGINS_AVAILABLE_GROUP,
+ WIDX_CAMPAIGN_1,
WIDX_CAMPAIGN_2,
WIDX_CAMPAIGN_3,
WIDX_CAMPAIGN_4,
@@ -151,10 +162,10 @@ static rct_widget window_finances_marketing_widgets[] = {
};
static rct_widget window_finances_research_widgets[] = {
- { WWT_FRAME, 0, 0, 529, 0, 256, 0xFFFFFFFF, STR_NONE },
- { WWT_CAPTION, 0, 1, 528, 1, 14, STR_RESEARCH_FUNDING, STR_WINDOW_TITLE_TIP },
- { WWT_CLOSEBOX, 0, 517, 527, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
- { WWT_RESIZE, 1, 0, 529, 43, 256, 0xFFFFFFFF, STR_NONE },
+ { WWT_FRAME, 0, 0, 319, 0, 206, 0xFFFFFFFF, STR_NONE },
+ { WWT_CAPTION, 0, 1, 318, 1, 14, STR_RESEARCH_FUNDING, STR_WINDOW_TITLE_TIP },
+ { WWT_CLOSEBOX, 0, 307, 317, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
+ { WWT_RESIZE, 1, 0, 319, 43, 206, 0xFFFFFFFF, STR_NONE },
{ WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_FINANCES_SHOW_SUMMARY_TAB_TIP },
{ WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_FINANCES_SHOW_CASH_TAB_TIP },
{ WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_FINANCES_SHOW_PARK_VALUE_TAB_TIP },
@@ -188,13 +199,240 @@ static rct_widget *window_finances_page_widgets[] = {
#pragma region Events
+static void window_finances_emptysub() { }
+
+static void window_finances_summary_mouseup();
+static void window_finances_summary_mousedown(int widgetIndex, rct_window*w, rct_widget* widget);
+static void window_finances_summary_update(rct_window *w);
+static void window_finances_summary_invalidate();
+static void window_finances_summary_paint();
+
+static void window_finances_financial_graph_mouseup();
+static void window_finances_financial_graph_update(rct_window *w);
+static void window_finances_financial_graph_invalidate();
+static void window_finances_financial_graph_paint();
+
+static void window_finances_park_value_graph_mouseup();
+static void window_finances_park_value_graph_update(rct_window *w);
+static void window_finances_park_value_graph_invalidate();
+static void window_finances_park_value_graph_paint();
+
+static void window_finances_profit_graph_mouseup();
+static void window_finances_profit_graph_update(rct_window *w);
+static void window_finances_profit_graph_invalidate();
+static void window_finances_profit_graph_paint();
+
+static void window_finances_marketing_mouseup();
+static void window_finances_marketing_update(rct_window *w);
+static void window_finances_marketing_invalidate();
+static void window_finances_marketing_paint();
+
+static void window_finances_research_mouseup();
+static void window_finances_research_mousedown(int widgetIndex, rct_window*w, rct_widget* widget);
+static void window_finances_research_dropdown();
+static void window_finances_research_update(rct_window *w);
+static void window_finances_research_invalidate();
+static void window_finances_research_paint();
+
+// 0x00988EB8
+static void* window_finances_summary_events[] = {
+ window_finances_emptysub,
+ window_finances_summary_mouseup,
+ window_finances_emptysub,
+ window_finances_summary_mousedown,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_summary_update,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_summary_invalidate,
+ window_finances_summary_paint,
+ window_finances_emptysub
+};
+
+// 0x00988F28
+static void* window_finances_financial_graph_events[] = {
+ window_finances_emptysub,
+ window_finances_financial_graph_mouseup,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_financial_graph_update,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_financial_graph_invalidate,
+ window_finances_financial_graph_paint,
+ window_finances_emptysub
+};
+
+// 0x00988F98
+static void* window_finances_value_graph_events[] = {
+ window_finances_emptysub,
+ window_finances_park_value_graph_mouseup,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_park_value_graph_update,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_park_value_graph_invalidate,
+ window_finances_park_value_graph_paint,
+ window_finances_emptysub
+};
+
+// 0x00989008
+static void* window_finances_profit_graph_events[] = {
+ window_finances_emptysub,
+ window_finances_profit_graph_mouseup,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_profit_graph_update,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_profit_graph_invalidate,
+ window_finances_profit_graph_paint,
+ window_finances_emptysub
+};
+
+// 0x00989078
+static void* window_finances_marketing_events[] = {
+ window_finances_emptysub,
+ window_finances_marketing_mouseup,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_marketing_update,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_marketing_invalidate,
+ window_finances_marketing_paint,
+ window_finances_emptysub
+};
+
+// 0x009890E8
+static void* window_finances_research_events[] = {
+ window_finances_emptysub,
+ window_finances_research_mouseup,
+ window_finances_emptysub,
+ window_finances_research_mousedown,
+ window_finances_research_dropdown,
+ window_finances_emptysub,
+ window_finances_research_update,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_emptysub,
+ window_finances_research_invalidate,
+ window_finances_research_paint,
+ window_finances_emptysub
+};
+
static void* window_finances_page_events[] = {
- (void*)0x00988EB8,
- (void*)0x00988F28,
- (void*)0x00988F98,
- (void*)0x00989008,
- (void*)0x00989078,
- (void*)0x009890E8
+ window_finances_summary_events,
+ window_finances_financial_graph_events,
+ window_finances_value_graph_events,
+ window_finances_profit_graph_events,
+ window_finances_marketing_events,
+ window_finances_research_events
};
#pragma endregion
@@ -275,6 +513,7 @@ const int window_finances_tab_animation_loops[] = { 16, 32, 32, 32, 38, 16 };
static void window_finances_set_page(rct_window *w, int page);
static void window_finances_set_pressed_tab(rct_window *w);
+static void window_finances_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w);
/**
*
@@ -325,17 +564,7 @@ static void window_finances_summary_mouseup()
short widgetIndex;
rct_window *w;
- #ifdef _MSC_VER
- __asm mov widgetIndex, dx
- #else
- __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) );
- #endif
-
- #ifdef _MSC_VER
- __asm mov w, esi
- #else
- __asm__ ( "mov %[w], esi " : [w] "+m" (w) );
- #endif
+ window_mouse_up_get_registers(w, widgetIndex);
if (widgetIndex == WIDX_CLOSE)
window_close(w);
@@ -343,6 +572,30 @@ static void window_finances_summary_mouseup()
window_finances_set_page(w, widgetIndex - WIDX_TAB_1);
}
+/**
+ *
+ * rct2: 0x0069CAB0
+ */
+static void window_finances_summary_mousedown(int widgetIndex, rct_window*w, rct_widget* widget)
+{
+ money32 newLoan;
+
+ switch (widgetIndex) {
+ 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);
+ 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);
+ }
+ break;
+ }
+}
+
/**
*
* rct2: 0x0069CBA6
@@ -363,14 +616,10 @@ static void window_finances_summary_invalidate()
{
rct_window *w;
- #ifdef _MSC_VER
- __asm mov w, esi
- #else
- __asm__ ( "mov %[w], esi " : [w] "+m" (w) );
- #endif
+ window_get_register(w);
- if (w->widgets != window_finances_page_widgets[0]) {
- w->widgets = window_finances_page_widgets[0];
+ if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_SUMMARY]) {
+ w->widgets = window_finances_page_widgets[WINDOW_FINANCES_PAGE_SUMMARY];
window_init_scroll_widgets(w);
}
@@ -378,6 +627,839 @@ static void window_finances_summary_invalidate()
RCT2_GLOBAL(0x013CE952 + 6, money32) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32);
}
+/**
+ *
+ * rct2: 0x0069C771
+ */
+static void window_finances_summary_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+ int i, j, x, y;
+
+ window_paint_get_registers(w, dpi);
+
+ window_draw_widgets(w, dpi);
+ window_finances_draw_tab_images(dpi, w);
+
+ x = w->x + 8;
+ y = w->y + 47;
+
+ // Expenditure / Income heading
+ draw_string_left_underline(dpi, STR_FINANCES_SUMMARY_EXPENDITURE_INCOME, NULL, 0, x, y - 1);
+ y += 14;
+
+ // Expenditure / Income row labels
+ for (i = 0; i < 14; i++) {
+ // Darken every even row
+ if (i % 2 == 0)
+ gfx_fill_rect(dpi, x, y, x + 513 - 2, y + 9, RCT2_GLOBAL(0x0141FC4A + (w->colours[1] * 8), uint8) | 0x1000000);
+
+ gfx_draw_string_left(dpi, STR_FINANCES_SUMMARY_RIDE_CONSTRUCTION + i, NULL, 0, x, y - 1);
+ y += 10;
+ }
+
+ // Expenditure / Income values for each month
+ x = w->x + 118;
+ sint16 currentMonthYear = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16);
+ for (i = 4; i >= 0; i--) {
+ y = w->y + 47;
+
+ sint16 monthyear = currentMonthYear - i;
+ if (monthyear < 0)
+ continue;
+
+ // Month heading
+ RCT2_GLOBAL(0x0013CE952, uint16) = STR_FINANCES_SUMMARY_MONTH_HEADING;
+ RCT2_GLOBAL(0x0013CE952 + 2, uint16) = monthyear;
+ draw_string_right_underline(
+ dpi,
+ monthyear == currentMonthYear ? 1193 : 1191,
+ (void*)0x0013CE952,
+ 0,
+ x + 80,
+ y - 1
+ );
+ y += 14;
+
+ // Month expenditures
+ money32 profit = 0;
+ money32 *expenditures = &RCT2_ADDRESS(RCT2_ADDRESS_EXPENDITURE_TABLE, money32)[i * 14];
+ for (j = 0; j < 14; j++) {
+ money32 expenditure = expenditures[j];
+ if (expenditure != 0) {
+ profit += expenditure;
+ gfx_draw_string_right(
+ dpi,
+ expenditure >= 0 ? STR_FINANCES_SUMMARY_INCOME_VALUE : STR_FINANCES_SUMMARY_EXPENDITURE_VALUE,
+ &expenditure,
+ 0,
+ x + 80,
+ y - 1
+ );
+ }
+ y += 10;
+ }
+ y += 4;
+
+ // Month profit
+ gfx_draw_string_right(
+ dpi,
+ profit >= 0 ? STR_FINANCES_SUMMARY_INCOME_VALUE : STR_FINANCES_SUMMARY_LOSS_VALUE,
+ &profit,
+ 0,
+ x + 80,
+ y - 1
+ );
+ gfx_fill_rect(dpi, x + 10, y - 2, x + 10 + 70, y - 2, 10);
+
+ x += 80;
+ }
+
+
+ // Horizontal rule below expenditure / income table
+ gfx_fill_rect_inset(dpi, w->x + 8, w->y + 223, w->x + 8 + 513, w->y + 223 + 1, w->colours[1], 0x20);
+
+ // Loan and interest rate
+ gfx_draw_string_left(dpi, STR_FINANCES_SUMMARY_LOAN, NULL, 0, w->x + 4, w->y + 229);
+ RCT2_GLOBAL(0x0013CE952, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_INTEREST_RATE, uint8);
+ gfx_draw_string_left(dpi, STR_FINANCES_SUMMARY_AT_X_PER_YEAR, (void*)0x0013CE952, 0, w->x + 156, w->y + 229);
+
+ // Current cash
+ RCT2_GLOBAL(0x0013CE952, money32) = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32));
+ gfx_draw_string_left(dpi, STR_CASH_LABEL, (void*)0x0013CE952, 0, w->x + 4, w->y + 244);
+
+ // Objective related financial information
+ if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_MONTHLY_FOOD_INCOME) {
+ // Last month's profit from food, drink and merchandise
+ money32 lastMonthProfit = 0;
+ if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16) != 0) {
+ lastMonthProfit += RCT2_GLOBAL(0x01357898, money32);
+ lastMonthProfit += RCT2_GLOBAL(0x0135789C, money32);
+ lastMonthProfit += RCT2_GLOBAL(0x013578A0, money32);
+ lastMonthProfit += RCT2_GLOBAL(0x013578A4, money32);
+ }
+ RCT2_GLOBAL(0x0013CE952, money32) = lastMonthProfit;
+ gfx_draw_string_left(dpi, STR_LAST_MONTH_PROFIT_FROM_FOOD_DRINK_MERCHANDISE_SALES_LABEL, (void*)0x0013CE952, 0, w->x + 280, w->y + 229);
+ } else {
+ // Park value and company value
+ gfx_draw_string_left(dpi, STR_PARK_VALUE_LABEL, (void*)RCT2_ADDRESS_CURRENT_PARK_VALUE, 0, w->x + 280, w->y + 229);
+ gfx_draw_string_left(dpi, STR_COMPANY_VALUE_LABEL, (void*)RCT2_ADDRESS_CURRENT_COMPANY_VALUE, 0, w->x + 280, w->y + 244);
+ }
+}
+
+#pragma endregion
+
+#pragma region Financial graph page
+
+/**
+ *
+ * rct2: 0x0069CF70
+ */
+static void window_finances_financial_graph_mouseup()
+{
+ short widgetIndex;
+ rct_window *w;
+
+ window_mouse_up_get_registers(w, widgetIndex);
+
+ if (widgetIndex == WIDX_CLOSE)
+ window_close(w);
+ else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_6)
+ window_finances_set_page(w, widgetIndex - WIDX_TAB_1);
+}
+
+/**
+ *
+ * rct2: 0x0069CF8B
+ */
+static void window_finances_financial_graph_update(rct_window *w)
+{
+ // Tab animation
+ if (++w->frame_no >= window_finances_tab_animation_loops[w->page])
+ w->frame_no = 0;
+ widget_invalidate(w->classification, w->number, WIDX_TAB_2);
+}
+
+/**
+ *
+ * rct2: 0x0069CBDB
+ */
+static void window_finances_financial_graph_invalidate()
+{
+ rct_window *w;
+
+ window_get_register(w);
+
+ if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_FINANCIAL_GRAPH]) {
+ w->widgets = window_finances_page_widgets[WINDOW_FINANCES_PAGE_FINANCIAL_GRAPH];
+ window_init_scroll_widgets(w);
+ }
+
+ window_finances_set_pressed_tab(w);
+}
+
+/**
+ *
+ * rct2: 0x0069CC10
+ */
+static void window_finances_financial_graph_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+ int i, x, y, graphLeft, graphTop, graphRight, graphBottom;
+
+ window_paint_get_registers(w, dpi);
+
+ window_draw_widgets(w, dpi);
+ window_finances_draw_tab_images(dpi, w);
+
+ rct_widget *pageWidget = &window_finances_cash_widgets[WIDX_PAGE_BACKGROUND];
+ graphLeft = w->x + pageWidget->left + 4;
+ graphTop = w->y + pageWidget->top + 15;
+ graphRight = w->x + pageWidget->right - 4;
+ graphBottom = w->y + pageWidget->bottom - 4;
+
+ // Cash (less loan)
+ money32 cashLessLoan =
+ DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32)) -
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32);
+
+ gfx_draw_string_left(
+ dpi,
+ cashLessLoan >= 0 ?
+ STR_FINANCES_FINANCIAL_GRAPH_CASH_LESS_LOAN_POSITIVE : STR_FINANCES_FINANCIAL_GRAPH_CASH_LESS_LOAN_NEGATIVE,
+ &cashLessLoan,
+ 0,
+ graphLeft,
+ graphTop - 11
+ );
+
+ // Graph
+ gfx_fill_rect_inset(dpi, graphLeft, graphTop, graphRight, graphBottom, w->colours[1], 0x30);
+
+ // Calculate the Y axis scale (log2 of highest [+/-]balance)
+ int yAxisScale = 0;
+ money32 *balanceHistory = RCT2_ADDRESS(RCT2_ADDRESS_BALANCE_HISTORY, money32);
+ for (i = 0; i < 64; i++) {
+ money32 balance = balanceHistory[i];
+ if (balance == 0x80000000)
+ continue;
+
+ // Modifier balance then keep halfing until less than 127 pixels
+ balance = abs(balance) >> yAxisScale;
+ while (balance > 127) {
+ balance /= 2;
+ yAxisScale++;
+ }
+ }
+
+ // Y axis labels
+ x = graphLeft + 18;
+ y = graphTop + 14;
+ money32 axisBase;
+ for (axisBase = MONEY(12,00); axisBase >= MONEY(-12,00); axisBase -= MONEY(6,00)) {
+ money32 axisValue = axisBase << yAxisScale;
+ gfx_draw_string_right(dpi, STR_FINANCES_FINANCIAL_GRAPH_CASH_VALUE, &axisValue, 0, x + 70, y);
+ y += 39;
+ }
+
+ // X axis labels and values
+ x = graphLeft + 98;
+ y = graphTop + 17;
+ graph_draw_money32(dpi, balanceHistory, 64, x, y, yAxisScale, 128);
+}
+
+#pragma endregion
+
+#pragma region Value graph page
+
+/**
+ *
+ * rct2: 0x0069D338
+ */
+static void window_finances_park_value_graph_mouseup()
+{
+ short widgetIndex;
+ rct_window *w;
+
+ window_mouse_up_get_registers(w, widgetIndex);
+
+ if (widgetIndex == WIDX_CLOSE)
+ window_close(w);
+ else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_6)
+ window_finances_set_page(w, widgetIndex - WIDX_TAB_1);
+}
+
+/**
+ *
+ * rct2: 0x0069D353
+ */
+static void window_finances_park_value_graph_update(rct_window *w)
+{
+ // Tab animation
+ if (++w->frame_no >= window_finances_tab_animation_loops[w->page])
+ w->frame_no = 0;
+ widget_invalidate(w->classification, w->number, WIDX_TAB_2);
+}
+
+/**
+ *
+ * rct2: 0x0069CFC0
+ */
+static void window_finances_park_value_graph_invalidate()
+{
+ rct_window *w;
+
+ window_get_register(w);
+
+ if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_VALUE_GRAPH]) {
+ w->widgets = window_finances_page_widgets[WINDOW_FINANCES_PAGE_VALUE_GRAPH];
+ window_init_scroll_widgets(w);
+ }
+
+ window_finances_set_pressed_tab(w);
+}
+
+/**
+ *
+ * rct2: 0x0069CFF5
+ */
+static void window_finances_park_value_graph_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+ int i, x, y, graphLeft, graphTop, graphRight, graphBottom;
+
+ window_paint_get_registers(w, dpi);
+
+ window_draw_widgets(w, dpi);
+ window_finances_draw_tab_images(dpi, w);
+
+ rct_widget *pageWidget = &window_finances_cash_widgets[WIDX_PAGE_BACKGROUND];
+ graphLeft = w->x + pageWidget->left + 4;
+ graphTop = w->y + pageWidget->top + 15;
+ graphRight = w->x + pageWidget->right - 4;
+ graphBottom = w->y + pageWidget->bottom - 4;
+
+ // Park value
+ money32 parkValue = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, money32);
+ gfx_draw_string_left(
+ dpi,
+ STR_FINACNES_PARK_VALUE,
+ &parkValue,
+ 0,
+ graphLeft,
+ graphTop - 11
+ );
+
+ // Graph
+ gfx_fill_rect_inset(dpi, graphLeft, graphTop, graphRight, graphBottom, w->colours[1], 0x30);
+
+ // Calculate the Y axis scale (log2 of highest [+/-]balance)
+ int yAxisScale = 0;
+ money32 *parkValueHistory = RCT2_ADDRESS(RCT2_ADDRESS_PARK_VALUE_HISTORY, money32);
+ for (i = 0; i < 64; i++) {
+ money32 balance = parkValueHistory[i];
+ if (balance == 0x80000000)
+ continue;
+
+ // Modifier balance then keep halfing until less than 255 pixels
+ balance = abs(balance) >> yAxisScale;
+ while (balance > 255) {
+ balance /= 2;
+ yAxisScale++;
+ }
+ }
+
+ // Y axis labels
+ x = graphLeft + 18;
+ y = graphTop + 14;
+ money32 axisBase;
+ for (axisBase = MONEY(24,00); axisBase >= MONEY(0,00); axisBase -= MONEY(6,00)) {
+ money32 axisValue = axisBase << yAxisScale;
+ gfx_draw_string_right(dpi, STR_FINANCES_FINANCIAL_GRAPH_CASH_VALUE, &axisValue, 0, x + 70, y);
+ y += 39;
+ }
+
+ // X axis labels and values
+ x = graphLeft + 98;
+ y = graphTop + 17;
+ graph_draw_money32(dpi, parkValueHistory, 64, x, y, yAxisScale, 0);
+}
+
+#pragma endregion
+
+#pragma region Profit graph page
+
+/**
+ *
+ * rct2: 0x0069D715
+ */
+static void window_finances_profit_graph_mouseup()
+{
+ short widgetIndex;
+ rct_window *w;
+
+ window_mouse_up_get_registers(w, widgetIndex);
+
+ if (widgetIndex == WIDX_CLOSE)
+ window_close(w);
+ else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_6)
+ window_finances_set_page(w, widgetIndex - WIDX_TAB_1);
+}
+
+/**
+ *
+ * rct2: 0x0069D730
+ */
+static void window_finances_profit_graph_update(rct_window *w)
+{
+ // Tab animation
+ if (++w->frame_no >= window_finances_tab_animation_loops[w->page])
+ w->frame_no = 0;
+ widget_invalidate(w->classification, w->number, WIDX_TAB_2);
+}
+
+/**
+ *
+ * rct2: 0x0069D388
+ */
+static void window_finances_profit_graph_invalidate()
+{
+ rct_window *w;
+
+ window_get_register(w);
+
+ if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_PROFIT_GRAPH]) {
+ w->widgets = window_finances_page_widgets[WINDOW_FINANCES_PAGE_PROFIT_GRAPH];
+ window_init_scroll_widgets(w);
+ }
+
+ window_finances_set_pressed_tab(w);
+}
+
+/**
+ *
+ * rct2: 0x0069D3BD
+ */
+static void window_finances_profit_graph_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+ int i, x, y, graphLeft, graphTop, graphRight, graphBottom;
+
+ window_paint_get_registers(w, dpi);
+
+ window_draw_widgets(w, dpi);
+ window_finances_draw_tab_images(dpi, w);
+
+ rct_widget *pageWidget = &window_finances_cash_widgets[WIDX_PAGE_BACKGROUND];
+ graphLeft = w->x + pageWidget->left + 4;
+ graphTop = w->y + pageWidget->top + 15;
+ graphRight = w->x + pageWidget->right - 4;
+ graphBottom = w->y + pageWidget->bottom - 4;
+
+ // Weekly profit
+ money32 weeklyPofit = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PROFIT, money32);
+ gfx_draw_string_left(
+ dpi,
+ weeklyPofit >= 0 ? STR_FINANCES_WEEKLY_PROFIT_POSITIVE : STR_FINANCES_WEEKLY_PROFIT_LOSS,
+ &weeklyPofit,
+ 0,
+ graphLeft,
+ graphTop - 11
+ );
+
+ // Graph
+ gfx_fill_rect_inset(dpi, graphLeft, graphTop, graphRight, graphBottom, w->colours[1], 0x30);
+
+ // Calculate the Y axis scale (log2 of highest [+/-]balance)
+ int yAxisScale = 0;
+ money32 *weeklyProfitHistory = RCT2_ADDRESS(RCT2_ADDRESS_WEEKLY_PROFIT_HISTORY, money32);
+ for (i = 0; i < 64; i++) {
+ money32 balance = weeklyProfitHistory[i];
+ if (balance == 0x80000000)
+ continue;
+
+ // Modifier balance then keep halfing until less than 127 pixels
+ balance = abs(balance) >> yAxisScale;
+ while (balance > 127) {
+ balance /= 2;
+ yAxisScale++;
+ }
+ }
+
+ // Y axis labels
+ x = graphLeft + 18;
+ y = graphTop + 14;
+ money32 axisBase;
+ for (axisBase = MONEY(12,00); axisBase >= MONEY(-12,00); axisBase -= MONEY(6,00)) {
+ money32 axisValue = axisBase << yAxisScale;
+ gfx_draw_string_right(dpi, STR_FINANCES_FINANCIAL_GRAPH_CASH_VALUE, &axisValue, 0, x + 70, y);
+ y += 39;
+ }
+
+ // X axis labels and values
+ x = graphLeft + 98;
+ y = graphTop + 17;
+ graph_draw_money32(dpi, weeklyProfitHistory, 64, x, y, yAxisScale, 128);
+}
+
+#pragma endregion
+
+#pragma region Marketing page
+
+/**
+ *
+ * rct2: 0x0069D9F9
+ */
+static void window_finances_marketing_mouseup()
+{
+ short widgetIndex;
+ rct_window *w;
+
+ window_mouse_up_get_registers(w, widgetIndex);
+
+ if (widgetIndex == WIDX_CLOSE)
+ window_close(w);
+ else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_6)
+ window_finances_set_page(w, widgetIndex - WIDX_TAB_1);
+ else if (widgetIndex >= WIDX_CAMPAIGN_1 && widgetIndex <= WIDX_CAMPAIGN_6)
+ window_new_campaign_open(widgetIndex - WIDX_CAMPAIGN_1);
+
+}
+
+/**
+ *
+ * rct2: 0x0069DA2F
+ */
+static void window_finances_marketing_update(rct_window *w)
+{
+ // Tab animation
+ if (++w->frame_no >= window_finances_tab_animation_loops[w->page])
+ w->frame_no = 0;
+ widget_invalidate(w->classification, w->number, WIDX_TAB_5);
+}
+
+/**
+ *
+ * rct2: 0x0069D765
+ */
+static void window_finances_marketing_invalidate()
+{
+ rct_window *w;
+ int i;
+
+ window_get_register(w);
+
+ if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_MARKETING]) {
+ w->widgets = window_finances_page_widgets[WINDOW_FINANCES_PAGE_MARKETING];
+ window_init_scroll_widgets(w);
+ }
+
+ window_finances_set_pressed_tab(w);
+
+ // 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)
+ numActiveCampaigns++;
+
+ int y = max(1, numActiveCampaigns) * 10 + 92;
+
+ // Update group box positions
+ window_finances_marketing_widgets[WIDX_ACITVE_CAMPAGINS_GROUP].bottom = y - 20;
+ window_finances_marketing_widgets[WIDX_CAMPAGINS_AVAILABLE_GROUP].top = y - 13;
+
+ // Update new campagin button visibility
+ for (i = 0; i < ADVERTISING_CAMPAIGN_COUNT; i++) {
+ rct_widget *campaginButton = &window_finances_marketing_widgets[WIDX_CAMPAIGN_1 + i];
+
+ campaginButton->type = 0;
+
+ // Do not allow park entry campaigns if park entry is free
+ if (
+ (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) && (
+ i == ADVERTISING_CAMPAIGN_PARK_ENTRY_FREE ||
+ i == ADVERTISING_CAMPAIGN_PARK_ENTRY_HALF_PRICE
+ )
+ ) {
+ continue;
+ }
+
+ if (campaignDaysLeft[i] != 0)
+ continue;
+
+ campaginButton->type = WWT_DROPDOWN_BUTTON;
+ campaginButton->top = y;
+ campaginButton->bottom = y + 11;
+ y += 12;
+ }
+}
+
+/**
+ *
+ * rct2: 0x0069D834
+ */
+static void window_finances_marketing_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+ int i, x, y;
+ rct_ride *ride;
+ rct_string_id shopString, weeksRemainingStringId;
+
+ window_paint_get_registers(w, dpi);
+
+ window_draw_widgets(w, dpi);
+ window_finances_draw_tab_images(dpi, w);
+
+ x = w->x + 8;
+ 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)
+ continue;
+
+ noCampaignsActive = 0;
+ RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16);
+ RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
+
+ // Set special parameters
+ switch (i) {
+ case ADVERTISING_CAMPAIGN_RIDE_FREE:
+ case ADVERTISING_CAMPAIGN_RIDE:
+ ride = GET_RIDE(campaignRideIndex[i]);
+ RCT2_GLOBAL(0x013CE952, uint16) = ride->var_04A;
+ RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->var_04C;
+ break;
+ case ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE:
+ shopString = campaignRideIndex[i] + 2016; // STR_BALLOONS+
+ if (shopString >= 2048) // STR_AN_UMBRELLA
+ shopString += 96; // STR_ON_RIDE_PHOTOS+
+ RCT2_GLOBAL(0x013CE952, uint16) = shopString;
+ break;
+ }
+
+ // Advertisement
+ 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);
+ gfx_draw_string_left(dpi, STR_MARKETING_WEEKS_REMAINING, &weeksRemainingStringId, 0, x + 304, y);
+
+ y += 10;
+ }
+
+ if (noCampaignsActive) {
+ gfx_draw_string_left(dpi, STR_MARKETING_CAMPAGINS_NONE, NULL, 0, x + 4, y);
+ y += 10;
+ }
+ y += 31;
+
+ // Draw campaign button text
+ for (i = 0; i < ADVERTISING_CAMPAIGN_COUNT; i++) {
+ rct_widget *campaginButton = &window_finances_marketing_widgets[WIDX_CAMPAIGN_1 + i];
+
+ campaginButton->type = 0;
+
+ // Do not allow park entry campaigns if park entry is free
+ if (
+ (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) && (
+ i == ADVERTISING_CAMPAIGN_PARK_ENTRY_FREE ||
+ i == ADVERTISING_CAMPAIGN_PARK_ENTRY_HALF_PRICE
+ )
+ ) {
+ continue;
+ }
+
+ if (campaignDaysLeft[i] != 0)
+ continue;
+
+ money32 pricePerWeek = AdvertisingCampaignPricePerWeek[i];
+
+ // Draw button text
+ gfx_draw_string_left(dpi, STR_MARKETING_VOUCHERS_FOR_FREE_ENTRY_TO_THE_PARK + i, NULL, 0, x + 4, y - 1);
+ gfx_draw_string_left(dpi, STR_MARKETING_PER_WEEK, &pricePerWeek, 0, x + 310, y - 1);
+
+ y += 12;
+ }
+}
+
+#pragma endregion
+
+#pragma region Research page
+
+/**
+ *
+ * rct2: 0x0069DB3F
+ */
+static void window_finances_research_mouseup()
+{
+ rct_window * w;
+ short widgetIndex;
+ int activeResearchTypes;
+
+ window_mouse_up_get_registers(w, widgetIndex);
+
+ switch (widgetIndex) {
+ case WIDX_CLOSE:
+ window_close(w);
+ break;
+ case WIDX_TAB_1:
+ case WIDX_TAB_2:
+ case WIDX_TAB_3:
+ case WIDX_TAB_4:
+ case WIDX_TAB_5:
+ case WIDX_TAB_6:
+ window_finances_set_page(w, widgetIndex - WIDX_TAB_1);
+ break;
+ case WIDX_TRANSPORT_RIDES:
+ case WIDX_GENTLE_RIDES:
+ case WIDX_ROLLER_COASTERS:
+ case WIDX_THRILL_RIDES:
+ case WIDX_WATER_RIDES:
+ case WIDX_SHOPS_AND_STALLS:
+ 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);
+ break;
+ }
+}
+
+/**
+ *
+ * rct2: 0x0069DB66
+ */
+static void window_finances_research_mousedown(int widgetIndex, rct_window *w, rct_widget* widget)
+{
+ rct_widget *dropdownWidget;
+ int i;
+
+ if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON)
+ return;
+
+ dropdownWidget = widget - 1;
+
+ for (i = 0; i < 4; i++) {
+ gDropdownItemsFormat[i] = 1142;
+ gDropdownItemsArgs[i] = STR_NO_FUNDING + i;
+ }
+ window_dropdown_show_text_custom_width(
+ w->x + dropdownWidget->left,
+ w->y + dropdownWidget->top,
+ dropdownWidget->bottom - dropdownWidget->top + 1,
+ w->colours[1],
+ 0x80,
+ 4,
+ dropdownWidget->right - dropdownWidget->left - 3
+ );
+
+ int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
+ gDropdownItemsChecked = (1 << currentResearchLevel);
+}
+
+/**
+ *
+ * rct2: 0x0069DB6D
+ */
+static void window_finances_research_dropdown()
+{
+ rct_window *w;
+ short widgetIndex;
+ short dropdownIndex;
+
+ window_dropdown_get_registers(w, widgetIndex, dropdownIndex);
+
+ if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON || dropdownIndex == -1)
+ return;
+
+ game_do_command(0, 1, 0, dropdownIndex, GAME_COMMAND_SET_RESEARCH_FUNDING, 0, 0);
+}
+
+/**
+ *
+ * rct2: 0x0069DC23
+ */
+static void window_finances_research_update(rct_window *w)
+{
+ // Tab animation
+ if (++w->frame_no >= window_finances_tab_animation_loops[w->page])
+ w->frame_no = 0;
+ widget_invalidate(w->classification, w->number, WIDX_TAB_6);
+}
+
+/**
+ *
+ * rct2: 0x0069DA64
+ */
+static void window_finances_research_invalidate()
+{
+ rct_window *w;
+
+ window_get_register(w);
+
+ if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_RESEARCH]) {
+ w->widgets = window_finances_page_widgets[WINDOW_FINANCES_PAGE_RESEARCH];
+ window_init_scroll_widgets(w);
+ }
+
+ window_finances_set_pressed_tab(w);
+
+ int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
+
+ // Current funding
+ window_finances_research_widgets[WIDX_RESEARCH_FUNDING].image = STR_NO_FUNDING + currentResearchLevel;
+
+ // Checkboxes
+ int activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16);
+ int uncompletedResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_UNCOMPLETED_RESEARCH_TYPES, uint16);
+ for (int i = 0; i < 7; i++) {
+ int mask = 1 << i;
+ int widgetMask = 1 << (i + WIDX_TRANSPORT_RIDES);
+
+ // Set checkbox disabled if research type is complete
+ if (uncompletedResearchTypes & mask) {
+ w->disabled_widgets &= ~widgetMask;
+
+ // Set checkbox ticked if research type is active
+ if (activeResearchTypes & mask)
+ w->pressed_widgets |= widgetMask;
+ else
+ w->pressed_widgets &= ~widgetMask;
+ } else {
+ w->disabled_widgets |= widgetMask;
+ w->pressed_widgets &= ~widgetMask;
+ }
+ }
+}
+
+/**
+ *
+ * rct2: 0x0069DAF0
+ */
+static void window_finances_research_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+
+ window_paint_get_registers(w, dpi);
+
+ window_draw_widgets(w, dpi);
+ window_finances_draw_tab_images(dpi, w);
+
+ int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
+ money32 currentResearchCostPerWeek = research_cost_table[currentResearchLevel];
+ gfx_draw_string_left(dpi, STR_RESEARCH_COST_PER_MONTH, ¤tResearchCostPerWeek, 0, w->x + 10, w->y + 77);
+}
+
#pragma endregion
#pragma region Common
@@ -397,8 +1479,10 @@ 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->event_handlers = window_finances_page_events[page];
w->widgets = window_finances_page_widgets[page];
w->disabled_widgets = 0;
+ w->pressed_widgets = 0;
window_invalidate(w);
if (w->page == WINDOW_FINANCES_PAGE_RESEARCH) {
@@ -423,4 +1507,30 @@ static void window_finances_set_pressed_tab(rct_window *w)
w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page);
}
+static void window_finances_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_FINANCES_PAGE_SUMMARY)
+ 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_finances_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
+{
+ window_finances_draw_tab_image(dpi, w, WINDOW_FINANCES_PAGE_SUMMARY, SPR_TAB_FINANCES_SUMMARY_0);
+ window_finances_draw_tab_image(dpi, w, WINDOW_FINANCES_PAGE_FINANCIAL_GRAPH, SPR_TAB_FINANCES_FINANCIAL_GRAPH_0);
+ window_finances_draw_tab_image(dpi, w, WINDOW_FINANCES_PAGE_VALUE_GRAPH, SPR_TAB_FINANCES_VALUE_GRAPH_0);
+ window_finances_draw_tab_image(dpi, w, WINDOW_FINANCES_PAGE_PROFIT_GRAPH, SPR_TAB_FINANCES_PROFIT_GRAPH_0);
+ window_finances_draw_tab_image(dpi, w, WINDOW_FINANCES_PAGE_MARKETING, SPR_TAB_FINANCES_MARKETING_0);
+ window_finances_draw_tab_image(dpi, w, WINDOW_FINANCES_PAGE_RESEARCH, SPR_TAB_FINANCES_RESEARCH_0);
+}
+
#pragma endregion
\ No newline at end of file
diff --git a/src/window_footpath.c b/src/window_footpath.c
index f3cb04fbea..8e4abe0951 100644
--- a/src/window_footpath.c
+++ b/src/window_footpath.c
@@ -687,7 +687,7 @@ static void window_footpath_paint()
// Draw construction image
x = w->x + (window_footpath_widgets[WIDX_CONSTRUCT].left + window_footpath_widgets[WIDX_CONSTRUCT].right) / 2;
y = w->y + window_footpath_widgets[WIDX_CONSTRUCT].bottom - 60;
- gfx_draw_sprite(dpi, image, x, y);
+ gfx_draw_sprite(dpi, image, x, y, 0);
// Draw build this... label
x = w->x + (window_footpath_widgets[WIDX_CONSTRUCT].left + window_footpath_widgets[WIDX_CONSTRUCT].right) / 2;
diff --git a/src/window_game_bottom_toolbar.c b/src/window_game_bottom_toolbar.c
index 57479079c9..dac63397f1 100644
--- a/src/window_game_bottom_toolbar.c
+++ b/src/window_game_bottom_toolbar.c
@@ -474,8 +474,8 @@ static void window_game_bottom_toolbar_draw_park_rating(rct_drawpixelinfo *dpi,
}
// Draw thumbs on the sides
- gfx_draw_sprite(dpi, SPR_RATING_LOW, x - 14, y);
- gfx_draw_sprite(dpi, SPR_RATING_HIGH, x + 92, y);
+ gfx_draw_sprite(dpi, SPR_RATING_LOW, x - 14, y, 0);
+ gfx_draw_sprite(dpi, SPR_RATING_HIGH, x + 92, y, 0);
}
static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi, rct_window *w)
@@ -532,13 +532,13 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi,
x += 30;
// Current weather
- gfx_draw_sprite(dpi, climate_weather_data[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, sint8)].sprite_id, x, y);
+ gfx_draw_sprite(dpi, climate_weather_data[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, sint8)].sprite_id, x, y, 0);
// Next weather
if (climate_weather_data[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, sint8)].sprite_id != climate_weather_data[gClimateNextWeather].sprite_id) {
if (RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE_UPDATE_TIMER, sint16) < 960) {
- gfx_draw_sprite(dpi, SPR_NEXT_WEATHER, x + 27, y + 5);
- gfx_draw_sprite(dpi, climate_weather_data[gClimateNextWeather].sprite_id, x + 40, y);
+ gfx_draw_sprite(dpi, SPR_NEXT_WEATHER, x + 27, y + 5, 0);
+ gfx_draw_sprite(dpi, climate_weather_data[gClimateNextWeather].sprite_id, x + 40, y, 0);
}
}
}
@@ -582,7 +582,7 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc
y = w->y + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].top;
switch (newsItem->type) {
case NEWS_ITEM_RIDE:
- gfx_draw_sprite(dpi, SPR_RIDE, x, y);
+ gfx_draw_sprite(dpi, SPR_RIDE, x, y, 0);
break;
case NEWS_ITEM_PEEP_ON_RIDE:
case NEWS_ITEM_PEEP:
@@ -680,16 +680,16 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc
break;
case NEWS_ITEM_MONEY:
- gfx_draw_sprite(dpi, SPR_FINANCE, x, y);
+ gfx_draw_sprite(dpi, SPR_FINANCE, x, y, 0);
case NEWS_ITEM_RESEARCH:
- gfx_draw_sprite(dpi, (newsItem->assoc < 0x10000 ? SPR_NEW_RIDE : SPR_SCENERY), x, y);
+ gfx_draw_sprite(dpi, (newsItem->assoc < 0x10000 ? SPR_NEW_RIDE : SPR_SCENERY), x, y, 0);
break;
case NEWS_ITEM_PEEPS:
- gfx_draw_sprite(dpi, SPR_GUESTS, x, y);
+ gfx_draw_sprite(dpi, SPR_GUESTS, x, y, 0);
case NEWS_ITEM_AWARD:
- gfx_draw_sprite(dpi, SPR_AWARD, x, y);
+ gfx_draw_sprite(dpi, SPR_AWARD, x, y, 0);
case NEWS_ITEM_GRAPH:
- gfx_draw_sprite(dpi, SPR_GRAPH, x, y);
+ gfx_draw_sprite(dpi, SPR_GRAPH, x, y, 0);
break;
}
}
diff --git a/src/window_game_top_toolbar.c b/src/window_game_top_toolbar.c
index 1dae79fa18..ae7981d55a 100644
--- a/src/window_game_top_toolbar.c
+++ b/src/window_game_top_toolbar.c
@@ -51,6 +51,28 @@ enum {
WIDX_FASTFORWARD
};
+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;
+
+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,
+} VIEW_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
@@ -337,6 +359,8 @@ static void window_game_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct
gDropdownItemsChecked |= (1 << 10);
if (mainViewport->flags & VIEWPORT_FLAG_PATH_HEIGHTS)
gDropdownItemsChecked |= (1 << 11);
+
+ RCT2_GLOBAL(0x9DEBA2, uint16) = 0;
}
}
@@ -347,6 +371,7 @@ static void window_game_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct
static void window_game_top_toolbar_dropdown()
{
short widgetIndex, dropdownIndex;
+ rct_window* w;
#ifdef _MSC_VER
__asm mov widgetIndex, dx
@@ -363,29 +388,67 @@ static void window_game_top_toolbar_dropdown()
if (widgetIndex == WIDX_FILE_MENU) {
switch (dropdownIndex) {
- case 0: // load game
+ case DDIDX_LOAD_GAME: // load game
game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0);
break;
- case 1: // save game
+ case DDIDX_SAVE_GAME: // save game
tool_cancel();
save_game();
break;
- case 3: // about
+ case DDIDX_ABOUT: // about
window_about_open();
break;
- case 4: // options
+ case DDIDX_OPTIONS: // options
window_options_open();
//RCT2_CALLPROC_EBPSAFE(0x006BAC5B);
break;
- case 5: // screenshot
+ case DDIDX_SCREENSHOT: // screenshot
RCT2_GLOBAL(RCT2_ADDRESS_SCREENSHOT_COUNTDOWN, sint8) = 10;
break;
- case 7: // quit game
+ case DDIDX_QUIT_GAME: // quit game
game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0);
break;
}
} else if (widgetIndex == WIDX_VIEW_MENU) {
- RCT2_CALLPROC_X(0x0066CF8A, dropdownIndex, 0, 0, 0, 0, 0, 0);
+ if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16);
+ 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;
+ }
+ RCT2_CALLPROC_X(0x6EB13A, 0, 0, 0, 0, (int)w, 0, 0);
+ }
}
}
@@ -495,5 +558,5 @@ static void window_game_top_toolbar_paint()
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);
+ gfx_draw_sprite(dpi, imgId, x, y, 0);
}
diff --git a/src/window_guest_list.c b/src/window_guest_list.c
index d42b56e9ba..405cd10c3e 100644
--- a/src/window_guest_list.c
+++ b/src/window_guest_list.c
@@ -608,7 +608,7 @@ static void window_guest_list_paint()
dpi,
i,
(window_guest_list_widgets[WIDX_TAB_1].left + window_guest_list_widgets[WIDX_TAB_1].right) / 2 + w->x,
- window_guest_list_widgets[WIDX_TAB_1].bottom - 6 + w->y
+ window_guest_list_widgets[WIDX_TAB_1].bottom - 6 + w->y, 0
);
// Tab 2 image
@@ -617,7 +617,7 @@ static void window_guest_list_paint()
dpi,
5568 + i,
window_guest_list_widgets[WIDX_TAB_2].left + w->x,
- window_guest_list_widgets[WIDX_TAB_2].top + w->y
+ window_guest_list_widgets[WIDX_TAB_2].top + w->y, 0
);
// Filter description
@@ -713,11 +713,11 @@ static void window_guest_list_scrollpaint()
switch (_window_guest_list_selected_view) {
case VIEW_ACTIONS:
// Guest face
- gfx_draw_sprite(dpi, get_guest_face_sprite_small(peep), 118, y);
+ gfx_draw_sprite(dpi, get_guest_face_sprite_small(peep), 118, y, 0);
// Tracking icon
if (peep->flags & PEEP_FLAGS_TRACKING)
- gfx_draw_sprite(dpi, 5129, 112, y);
+ gfx_draw_sprite(dpi, 5129, 112, y, 0);
// Action
@@ -775,7 +775,7 @@ static void window_guest_list_scrollpaint()
// Draw guest faces
numGuests = _window_guest_list_groups_num_guests[i];
for (j = 0; j < 56 && j < numGuests; j++)
- gfx_draw_sprite(dpi, _window_guest_list_groups_guest_faces[i * 56 + j] + 5486, j * 8, y + 9);
+ gfx_draw_sprite(dpi, _window_guest_list_groups_guest_faces[i * 56 + j] + 5486, j * 8, y + 9, 0);
// Draw action
RCT2_GLOBAL(0x013CE952, uint32) = _window_guest_list_groups_argument_1[i];
diff --git a/src/window_map.c b/src/window_map.c
index b5c3a9685c..6f8d7bc872 100644
--- a/src/window_map.c
+++ b/src/window_map.c
@@ -427,7 +427,7 @@ static void window_map_paint()
gfx_draw_sprite(dpi, image_id,
w->x + w->widgets[WIDX_PEOPLE_TAB].left,
- w->y + w->widgets[WIDX_PEOPLE_TAB].top);
+ w->y + w->widgets[WIDX_PEOPLE_TAB].top, 0);
// ride/stall tab image (animated)
image_id = SPR_TAB_RIDE_0;
@@ -436,13 +436,13 @@ static void window_map_paint()
gfx_draw_sprite(dpi, image_id,
w->x + w->widgets[WIDX_RIDES_TAB].left,
- w->y + w->widgets[WIDX_RIDES_TAB].top);
+ w->y + w->widgets[WIDX_RIDES_TAB].top, 0);
// people starting position (scenario editor only)
if (w->widgets[WIDX_PEOPLE_STARTING_POSITION].type != 0) {
gfx_draw_sprite(dpi, 0x0B6E0190A,
w->x + w->widgets[WIDX_PEOPLE_STARTING_POSITION].left + 12,
- w->y + w->widgets[WIDX_PEOPLE_STARTING_POSITION].top + 18);
+ w->y + w->widgets[WIDX_PEOPLE_STARTING_POSITION].top + 18, 0);
}
if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR)) {
@@ -507,7 +507,7 @@ static void window_map_scrollpaint()
g1_element->y_offset = 0xFFF8;
g1_element->flags = 0;
- gfx_draw_sprite(dpi, 0, 0, 0);
+ gfx_draw_sprite(dpi, 0, 0, 0, 0);
*g1_element = pushed_g1_element;
diff --git a/src/window_new_campaign.c b/src/window_new_campaign.c
new file mode 100644
index 0000000000..30445ec4ea
--- /dev/null
+++ b/src/window_new_campaign.c
@@ -0,0 +1,419 @@
+/*****************************************************************************
+ * Copyright (c) 2014 Ted John, Peter Hill, 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 .
+ *****************************************************************************/
+
+#include
+#include "addresses.h"
+#include "game.h"
+#include "marketing.h"
+#include "ride.h"
+#include "string_ids.h"
+#include "widget.h"
+#include "window.h"
+#include "window_dropdown.h"
+
+#define SELECTED_RIDE_UNDEFINED ((sint16)0xFFFF)
+
+enum WINDOW_NEW_CAMPAIGN_WIDGET_IDX {
+ WIDX_BACKGROUND,
+ WIDX_TITLE,
+ WIDX_CLOSE,
+ WIDX_RIDE_LABEL,
+ WIDX_RIDE_DROPDOWN,
+ WIDX_RIDE_DROPDOWN_BUTTON,
+ WIDX_WEEKS_LABEL,
+ WIDX_WEEKS_SPINNER,
+ WIDX_WEEKS_INCREASE_BUTTON,
+ WIDX_WEEKS_DECREASE_BUTTON,
+ WIDX_START_BUTTON
+};
+
+static rct_widget window_new_campaign_widgets[] = {
+ { WWT_FRAME, 0, 0, 349, 0, 106, 0xFFFFFFFF, STR_NONE }, // panel / background
+ { WWT_CAPTION, 0, 1, 348, 1, 14, 0, STR_WINDOW_TITLE_TIP }, // title bar
+ { WWT_CLOSEBOX, 0, 337, 347, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button
+ { WWT_24, 0, 0, 139, 24, 35, 0, STR_NONE }, // ride label
+ { WWT_DROPDOWN, 0, 100, 341, 24, 35, 0, STR_NONE }, // ride dropdown
+ { WWT_DROPDOWN_BUTTON, 0, 330, 340, 25, 34, 876, STR_NONE }, // ride dropdown button
+ { WWT_24, 0, 0, 139, 41, 52, STR_LENGTH_OF_TIME, STR_NONE }, // weeks label
+ { WWT_SPINNER, 0, 120, 219, 41, 52, 0, STR_NONE }, // weeks
+ { WWT_DROPDOWN_BUTTON, 0, 208, 218, 42, 46, STR_NUMERIC_UP, STR_NONE }, // weeks +
+ { WWT_DROPDOWN_BUTTON, 0, 208, 218, 47, 51, STR_NUMERIC_DOWN, STR_NONE }, // weeks -
+ { WWT_DROPDOWN_BUTTON, 0, 14, 335, 89, 100, STR_MARKETING_START_THIS_MARKETING_CAMPAIGN, STR_NONE }, // start button
+ { WIDGETS_END }
+};
+
+
+static void window_new_campaign_emptysub() { }
+static void window_new_campaign_mouseup();
+static void window_new_campaign_mousedown(int widgetIndex, rct_window*w, rct_widget* widget);
+static void window_new_campaign_dropdown();
+static void window_new_campaign_invalidate();
+static void window_new_campaign_paint();
+
+static void* window_new_campaign_events[] = {
+ window_new_campaign_emptysub,
+ window_new_campaign_mouseup,
+ window_new_campaign_emptysub,
+ window_new_campaign_mousedown,
+ window_new_campaign_dropdown,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_emptysub,
+ window_new_campaign_invalidate,
+ window_new_campaign_paint,
+ window_new_campaign_emptysub
+};
+
+uint8 window_new_campaign_rides[MAX_RIDES];
+uint8 window_new_campaign_shop_items[64];
+
+int ride_reliability_compare(const void *a, const void *b)
+{
+ rct_ride *rideA, *rideB;
+
+ rideA = GET_RIDE(*((uint8*)a));
+ rideB = GET_RIDE(*((uint8*)b));
+ return rideB->reliability - rideA->reliability;
+}
+
+int ride_name_compare(const void *a, const void *b)
+{
+ char rideAName[256], rideBName[256];
+ rct_ride *rideA, *rideB;
+
+ rideA = GET_RIDE(*((uint8*)a));
+ rideB = GET_RIDE(*((uint8*)b));
+
+ format_string(rideAName, rideA->var_04A, &rideA->var_04C);
+ format_string(rideBName, rideB->var_04A, &rideB->var_04C);
+
+ return _strcmpi(rideAName, rideBName);
+}
+
+/**
+ *
+ * rct2: 0x0069E16F
+ */
+void window_new_campaign_open(int campaignType)
+{
+ // RCT2_CALLPROC_X(0x0069E16F, campaignType, 0, 0, 0, 0, 0, 0);
+
+ rct_window *w;
+ rct_ride *ride;
+ int i, numApplicableRides;
+
+ w = window_bring_to_front_by_id(WC_NEW_CAMPAIGN, 0);
+ if (w != NULL) {
+ if (w->var_480 == campaignType)
+ return;
+
+ window_close(w);
+ }
+
+ w = window_create_auto_pos(350, 107, (uint32*)window_new_campaign_events, WC_NEW_CAMPAIGN, 0);
+ w->widgets = window_new_campaign_widgets;
+ w->enabled_widgets =
+ (1 << WIDX_CLOSE) |
+ (1 << WIDX_RIDE_DROPDOWN) |
+ (1 << WIDX_RIDE_DROPDOWN_BUTTON) |
+ (1 << WIDX_WEEKS_INCREASE_BUTTON) |
+ (1 << WIDX_WEEKS_DECREASE_BUTTON) |
+ (1 << WIDX_START_BUTTON);
+ w->var_020 = 0x300;
+ window_init_scroll_widgets(w);
+ w->colours[0] = 19;
+ w->colours[1] = 19;
+ w->colours[2] = 19;
+
+ window_new_campaign_widgets[WIDX_TITLE].image = STR_MARKETING_VOUCHERS_FOR_FREE_ENTRY_TO_THE_PARK + campaignType;
+
+ // Campaign type
+ w->var_480 = campaignType;
+
+ // Number of weeks
+ w->var_482 = 2;
+
+ // Currently selected ride
+ w->var_484 = SELECTED_RIDE_UNDEFINED;
+
+ // Get all applicable rides
+ numApplicableRides = 0;
+ window_new_campaign_rides[0] = 255;
+ FOR_ALL_RIDES(i, ride) {
+ if (!(RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32) & 0x03820000))
+ window_new_campaign_rides[numApplicableRides++] = i;
+ }
+ window_new_campaign_rides[numApplicableRides] = 255;
+
+ // Take top 40 most reliable rides
+ if (numApplicableRides > 40) {
+ qsort(window_new_campaign_rides, countof(window_new_campaign_rides), sizeof(uint8), ride_reliability_compare);
+ numApplicableRides = 40;
+ }
+
+ // Sort rides by name
+ qsort(window_new_campaign_rides, numApplicableRides, sizeof(uint8), ride_name_compare);
+}
+
+/**
+ *
+ * rct2: 0x0069E320
+ */
+static void window_new_campaign_get_shop_items()
+{
+ int i, numItems;
+ rct_ride *ride;
+
+ uint64 items = 0;
+ FOR_ALL_RIDES(i, ride) {
+ uint8 *rideTypeInfo = RCT2_ADDRESS(0x009ACFA4, void*)[ride->subtype];
+ uint8 itemType = RCT2_GLOBAL(rideTypeInfo + 0x1C0, uint8);
+ if (itemType != 255)
+ items |= 1LL << itemType;
+ }
+
+ // Remove certain items?
+ items &= 0x0011FF78036BA3E0;
+
+ //
+ numItems = 0;
+ for (i = 0; i < 64; i++)
+ if (items & (1LL << i))
+ window_new_campaign_shop_items[numItems++] = i;
+ window_new_campaign_shop_items[numItems] = 255;
+}
+
+/**
+ *
+ * rct2: 0x0069E50B
+ */
+static void window_new_campaign_mouseup()
+{
+ rct_window *w;
+ short widgetIndex;
+
+ window_mouse_up_get_registers(w, widgetIndex);
+
+ switch (widgetIndex) {
+ case WIDX_CLOSE:
+ 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->var_482 << 8) | 1, 0, (w->var_484 << 8) | w->var_480, GAME_COMMAND_START_MARKETING_CAMPAIGN, 0, 0);
+ window_close(w);
+ break;
+ }
+}
+
+/**
+ *
+ * rct2: 0x0069E51C
+ */
+static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_widget* widget)
+{
+ rct_widget *dropdownWidget;
+
+ switch (widgetIndex) {
+ case WIDX_RIDE_DROPDOWN_BUTTON:
+ dropdownWidget = widget - 1;
+
+ if (w->var_480 == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) {
+ window_new_campaign_get_shop_items();
+ if (window_new_campaign_shop_items[0] != 255) {
+ int numItems = 0;
+ for (int i = 0; i < 40; i++) {
+ if (window_new_campaign_shop_items[i] == 255)
+ break;
+
+ rct_string_id itemStringId = window_new_campaign_shop_items[i] + 2016;
+ if (itemStringId >= 2048)
+ itemStringId += 96;
+
+ gDropdownItemsFormat[i] = 1142;
+ gDropdownItemsArgs[i] = itemStringId;
+ numItems++;
+ }
+
+ window_dropdown_show_text_custom_width(
+ w->x + dropdownWidget->left,
+ w->y + dropdownWidget->top,
+ dropdownWidget->bottom - dropdownWidget->top + 1,
+ w->colours[1],
+ 0x80,
+ numItems,
+ dropdownWidget->right - dropdownWidget->left - 3
+ );
+ }
+ } else {
+ if (window_new_campaign_rides[0] != 255) {
+ int numItems = 0;
+ for (int i = 0; i < 40; i++) {
+ if (window_new_campaign_rides[i] == 255)
+ break;
+
+ rct_ride *ride = GET_RIDE(window_new_campaign_rides[i]);
+ gDropdownItemsFormat[i] = 1142;
+ gDropdownItemsArgs[i] = (ride->var_04C << 16) | ride->var_04A;
+ numItems++;
+ }
+
+ window_dropdown_show_text_custom_width(
+ w->x + dropdownWidget->left,
+ w->y + dropdownWidget->top,
+ dropdownWidget->bottom - dropdownWidget->top + 1,
+ w->colours[1],
+ 0x80,
+ numItems,
+ dropdownWidget->right - dropdownWidget->left - 3
+ );
+ }
+ }
+ break;
+ case WIDX_WEEKS_INCREASE_BUTTON:
+ w->var_482 = min(w->var_482 + 1, 6);
+ window_invalidate(w);
+ break;
+ case WIDX_WEEKS_DECREASE_BUTTON:
+ w->var_482 = max(w->var_482 - 1, 2);
+ window_invalidate(w);
+ break;
+ }
+}
+
+/**
+ *
+ * rct2: 0x0069E537
+ */
+static void window_new_campaign_dropdown()
+{
+ rct_window *w;
+ short widgetIndex, dropdownIndex;
+
+ window_dropdown_get_registers(w, widgetIndex, dropdownIndex);
+
+ if (widgetIndex != WIDX_RIDE_DROPDOWN_BUTTON)
+ return;
+
+ if (w->var_480 == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) {
+ rct_string_id itemStringId = (uint16)gDropdownItemsArgs[dropdownIndex] - 2016;
+ if (itemStringId >= 32)
+ itemStringId -= 96;
+ w->var_484 = itemStringId;
+ } else {
+ w->var_484 = window_new_campaign_rides[dropdownIndex];
+ }
+
+ window_invalidate(w);
+}
+
+/**
+ *
+ * rct2: 0x0069E397
+ */
+static void window_new_campaign_invalidate()
+{
+ rct_window *w;
+
+ window_get_register(w);
+
+ window_new_campaign_widgets[WIDX_RIDE_LABEL].type = WWT_EMPTY;
+ window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type = WWT_EMPTY;
+ window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_EMPTY;
+ window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = STR_MARKETING_NOT_SELECTED;
+ switch (w->var_480) {
+ case ADVERTISING_CAMPAIGN_RIDE_FREE:
+ case ADVERTISING_CAMPAIGN_RIDE:
+ window_new_campaign_widgets[WIDX_RIDE_LABEL].type = WWT_24;
+ window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type = WWT_DROPDOWN;
+ window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_DROPDOWN_BUTTON;
+ window_new_campaign_widgets[WIDX_RIDE_LABEL].image = STR_MARKETING_RIDE;
+ if (w->var_484 != SELECTED_RIDE_UNDEFINED) {
+ rct_ride *ride = GET_RIDE(w->var_484);
+ window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = ride->var_04A;
+ RCT2_GLOBAL(0x013CE952, uint32) = ride->var_04C;
+ }
+ break;
+ case ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE:
+ window_new_campaign_widgets[WIDX_RIDE_LABEL].type = WWT_24;
+ window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type = WWT_DROPDOWN;
+ window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_DROPDOWN_BUTTON;
+ window_new_campaign_widgets[WIDX_RIDE_LABEL].image = STR_MARKETING_ITEM;
+ if (w->var_484 != SELECTED_RIDE_UNDEFINED) {
+ rct_string_id itemStringId = w->var_484 + 2016;
+ if (itemStringId >= 2048)
+ itemStringId += 96;
+ window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = itemStringId;
+ }
+ break;
+ }
+
+ // Set current number of weeks spinner
+ window_new_campaign_widgets[WIDX_WEEKS_SPINNER].image = (STR_MARKETING_1_WEEK - 1) + w->var_482;
+
+ // Enable / disable start button based on ride dropdown
+ w->disabled_widgets &= ~(1 << WIDX_START_BUTTON);
+ if (window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type == WWT_DROPDOWN && w->var_484 == SELECTED_RIDE_UNDEFINED)
+ w->disabled_widgets |= 1 << WIDX_START_BUTTON;
+}
+
+/**
+ *
+ * rct2: 0x0069E493
+ */
+static void window_new_campaign_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+ int x, y;
+
+ window_paint_get_registers(w, dpi);
+
+ window_draw_widgets(w, dpi);
+
+ x = w->x + 14;
+ y = w->y + 60;
+
+ // Price per week
+ money32 pricePerWeek = AdvertisingCampaignPricePerWeek[w->var_480];
+ gfx_draw_string_left(dpi, STR_MARKETING_COST_PER_WEEK, &pricePerWeek, 0, x, y);
+ y += 13;
+
+ // Total price
+ money32 totalPrice = AdvertisingCampaignPricePerWeek[w->var_480] * w->var_482;
+ gfx_draw_string_left(dpi, STR_MARKETING_TOTAL_COST, &totalPrice, 0, x, y);
+}
\ No newline at end of file
diff --git a/src/window_news.c b/src/window_news.c
index 3d2c1347ec..08bff3ae36 100644
--- a/src/window_news.c
+++ b/src/window_news.c
@@ -385,7 +385,7 @@ static void window_news_scrollpaint()
switch (newsItem->type) {
case NEWS_ITEM_RIDE:
- gfx_draw_sprite(dpi, SPR_RIDE, x, yy);
+ gfx_draw_sprite(dpi, SPR_RIDE, x, yy, 0);
break;
case NEWS_ITEM_PEEP_ON_RIDE:
// TODO
@@ -394,19 +394,19 @@ static void window_news_scrollpaint()
// TODO
break;
case NEWS_ITEM_MONEY:
- gfx_draw_sprite(dpi, SPR_FINANCE, x, yy);
+ gfx_draw_sprite(dpi, SPR_FINANCE, x, yy, 0);
break;
case NEWS_ITEM_RESEARCH:
- gfx_draw_sprite(dpi, newsItem->assoc < 0x10000 ? SPR_NEW_RIDE : SPR_SCENERY, x, yy);
+ gfx_draw_sprite(dpi, newsItem->assoc < 0x10000 ? SPR_NEW_RIDE : SPR_SCENERY, x, yy, 0);
break;
case NEWS_ITEM_PEEPS:
- gfx_draw_sprite(dpi, SPR_GUESTS, x, yy);
+ gfx_draw_sprite(dpi, SPR_GUESTS, x, yy, 0);
break;
case NEWS_ITEM_AWARD:
- gfx_draw_sprite(dpi, SPR_AWARD, x, yy);
+ gfx_draw_sprite(dpi, SPR_AWARD, x, yy, 0);
break;
case NEWS_ITEM_GRAPH:
- gfx_draw_sprite(dpi, SPR_GRAPH, x, yy);
+ gfx_draw_sprite(dpi, SPR_GRAPH, x, yy, 0);
break;
}
}
@@ -423,7 +423,7 @@ static void window_news_scrollpaint()
press = 0x20;
}
gfx_fill_rect_inset(dpi, x, yy, x + 23, yy + 23, w->colours[2], press);
- gfx_draw_sprite(dpi, SPR_LOCATE, x, yy);
+ gfx_draw_sprite(dpi, SPR_LOCATE, x, yy, 0);
}
y += 42;
diff --git a/src/window_park.c b/src/window_park.c
index 3193422309..98caf43f0e 100644
--- a/src/window_park.c
+++ b/src/window_park.c
@@ -24,6 +24,7 @@
#include "config.h"
#include "date.h"
#include "game.h"
+#include "graph.h"
#include "park.h"
#include "peep.h"
#include "ride.h"
@@ -579,9 +580,6 @@ static void window_park_anchor_border_widgets(rct_window *w);
static void window_park_align_tabs(rct_window *w);
static void window_park_set_pressed_tab(rct_window *w);
static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w);
-static void window_park_graph_draw_months(rct_drawpixelinfo *dpi, uint8 *history, int baseX, int baseY);
-static void window_park_graph_draw_line_a(rct_drawpixelinfo *dpi, uint8 *history, int baseX, int baseY);
-static void window_park_graph_draw_line_b(rct_drawpixelinfo *dpi, uint8 *history, int baseX, int baseY);
/**
*
@@ -1090,7 +1088,7 @@ static void window_park_entrance_paint()
if (w->viewport != NULL) {
window_draw_viewport(dpi, w);
if (w->viewport->flags & VIEWPORT_FLAG_SOUND_ON)
- gfx_draw_sprite(dpi, SPR_HEARING_VIEWPORT, w->x + 2, w->y + 2);
+ gfx_draw_sprite(dpi, SPR_HEARING_VIEWPORT, w->x + 2, w->y + 2, 0);
}
// Draw park closed / open label
@@ -1369,9 +1367,7 @@ static void window_park_rating_paint()
y += widget->top + 26;
history = RCT2_ADDRESS(RCT2_ADDRESS_PARK_RATING_HISTORY, uint8);
- window_park_graph_draw_months(dpi, history, x, y);
- window_park_graph_draw_line_a(dpi, history, x, y);
- window_park_graph_draw_line_b(dpi, history, x, y);
+ graph_draw_uint8(dpi, history, 32, x, y);
}
#pragma endregion
@@ -1538,9 +1534,7 @@ static void window_park_guests_paint()
y += widget->top + 26;
history = RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY, uint8);
- window_park_graph_draw_months(dpi, history, x, y);
- window_park_graph_draw_line_a(dpi, history, x, y);
- window_park_graph_draw_line_b(dpi, history, x, y);
+ graph_draw_uint8(dpi, history, 32, x, y);
}
#pragma endregion
@@ -2229,7 +2223,7 @@ static void window_park_awards_paint()
if (award->time == 0)
continue;
- gfx_draw_sprite(dpi, SPR_AWARD_MOST_UNTIDY + award->type, x, y);
+ gfx_draw_sprite(dpi, SPR_AWARD_MOST_UNTIDY + award->type, x, y, 0);
gfx_draw_string_left_wrapped(dpi, NULL, x + 34, y + 6, 180, STR_AWARD_MOST_UNTIDY + award->type, 0);
y += 32;
@@ -2322,16 +2316,16 @@ static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
// Entrance tab
if (!(w->disabled_widgets & (1 << WIDX_TAB_1)))
- gfx_draw_sprite(dpi, 5200, w->x + w->widgets[WIDX_TAB_1].left, w->y + w->widgets[WIDX_TAB_1].top);
+ gfx_draw_sprite(dpi, 5200, w->x + w->widgets[WIDX_TAB_1].left, w->y + w->widgets[WIDX_TAB_1].top, 0);
// Rating tab
if (!(w->disabled_widgets & (1 << WIDX_TAB_2))) {
sprite_idx = SPR_TAB_GRAPH_0;
if (w->page == WINDOW_PARK_PAGE_RATING)
sprite_idx += (w->frame_no / 8) % 8;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_2].left, w->y + w->widgets[WIDX_TAB_2].top);
- gfx_draw_sprite(dpi, SPR_RATING_HIGH, w->x + w->widgets[WIDX_TAB_2].left + 7, w->y + w->widgets[WIDX_TAB_2].top + 1);
- gfx_draw_sprite(dpi, SPR_RATING_LOW, w->x + w->widgets[WIDX_TAB_2].left + 16, w->y + w->widgets[WIDX_TAB_2].top + 12);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_2].left, w->y + w->widgets[WIDX_TAB_2].top, 0);
+ gfx_draw_sprite(dpi, SPR_RATING_HIGH, w->x + w->widgets[WIDX_TAB_2].left + 7, w->y + w->widgets[WIDX_TAB_2].top + 1, 0);
+ gfx_draw_sprite(dpi, SPR_RATING_LOW, w->x + w->widgets[WIDX_TAB_2].left + 16, w->y + w->widgets[WIDX_TAB_2].top + 12, 0);
}
// Guests tab
@@ -2339,7 +2333,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
sprite_idx = SPR_TAB_GRAPH_0;
if (w->page == WINDOW_PARK_PAGE_GUESTS)
sprite_idx += (w->frame_no / 8) % 8;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_3].left, w->y + w->widgets[WIDX_TAB_3].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_3].left, w->y + w->widgets[WIDX_TAB_3].top, 0);
sprite_idx = *RCT2_GLOBAL(0x00982708, sint32*) + 1;
if (w->page == WINDOW_PARK_PAGE_GUESTS)
@@ -2350,7 +2344,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
dpi,
sprite_idx,
w->x + (w->widgets[WIDX_TAB_3].left + w->widgets[WIDX_TAB_3].right) / 2,
- w->y + w->widgets[WIDX_TAB_3].bottom - 9
+ w->y + w->widgets[WIDX_TAB_3].bottom - 9, 0
);
}
@@ -2359,7 +2353,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
sprite_idx = SPR_TAB_ADMISSION_0;
if (w->page == WINDOW_PARK_PAGE_PRICE)
sprite_idx += (w->frame_no / 2) % 8;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_4].left, w->y + w->widgets[WIDX_TAB_4].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_4].left, w->y + w->widgets[WIDX_TAB_4].top, 0);
}
// Statistics tab
@@ -2367,7 +2361,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
sprite_idx = SPR_TAB_STATS_0;
if (w->page == WINDOW_PARK_PAGE_STATS)
sprite_idx += (w->frame_no / 4) % 7;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_5].left, w->y + w->widgets[WIDX_TAB_5].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_5].left, w->y + w->widgets[WIDX_TAB_5].top, 0);
}
// Objective tab
@@ -2375,81 +2369,12 @@ static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
sprite_idx = SPR_TAB_OBJECTIVE_0;
if (w->page == WINDOW_PARK_PAGE_OBJECTIVE)
sprite_idx += (w->frame_no / 4) % 16;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_6].left, w->y + w->widgets[WIDX_TAB_6].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_6].left, w->y + w->widgets[WIDX_TAB_6].top, 0);
}
// Awards tab
if (!(w->disabled_widgets & (1 << WIDX_TAB_7)))
- gfx_draw_sprite(dpi, SPR_TAB_AWARDS, w->x + w->widgets[WIDX_TAB_7].left, w->y + w->widgets[WIDX_TAB_7].top);
-}
-
-static void window_park_graph_draw_months(rct_drawpixelinfo *dpi, uint8 *history, int baseX, int baseY)
-{
- int i, x, y, yearOver32, currentMonth, currentDay;
-
- currentMonth = date_get_month(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16));
- currentDay = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16);
- yearOver32 = (currentMonth * 4) + (currentDay >> 14) - 31;
- x = baseX;
- y = baseY;
- for (i = 31; i >= 0; i--) {
- if (history[i] != 0 && history[i] != 255 && yearOver32 % 4 == 0) {
- // Draw month text
- RCT2_GLOBAL(0x013CE952, uint32) = ((yearOver32 / 4) + 8) % 8 + STR_MONTH_SHORT_MAR;
- gfx_draw_string_centred(dpi, 2222, x, y - 10, 0, (void*)0x013CE952);
-
- // Draw month mark
- gfx_fill_rect(dpi, x, y, x, y + 3, 10);
- }
-
- yearOver32 = (yearOver32 + 1) % 32;
- x += 6;
- }
-}
-
-static void window_park_graph_draw_line_a(rct_drawpixelinfo *dpi, uint8 *history, int baseX, int baseY)
-{
- int i, x, y, lastX, lastY;
- lastX = -1;
- x = baseX;
- for (i = 31; i >= 0; i--) {
- if (history[i] != 0 && history[i] != 255) {
- y = baseY + (history[i] * 100) / 256;
-
- if (lastX != -1) {
- gfx_draw_line(dpi, lastX + 1, lastY + 1, x + 1, y + 1, 10);
- gfx_draw_line(dpi, lastX, lastY + 1, x, y + 1, 10);
- }
- if (i == 0)
- gfx_fill_rect(dpi, x, y, x + 2, y + 2, 10);
-
- lastX = x;
- lastY = y;
- }
- x += 6;
- }
-}
-
-static void window_park_graph_draw_line_b(rct_drawpixelinfo *dpi, uint8 *history, int baseX, int baseY)
-{
- int i, x, y, lastX, lastY;
-
- lastX = -1;
- x = baseX;
- for (i = 31; i >= 0; i--) {
- if (history[i] != 0 && history[i] != 255) {
- y = baseY + (history[i] * 100) / 256;
-
- if (lastX != -1)
- gfx_draw_line(dpi, lastX, lastY, x, y, 21);
- if (i == 0)
- gfx_fill_rect(dpi, x - 1, y - 1, x + 1, y + 1, 21);
-
- lastX = x;
- lastY = y;
- }
- x += 6;
- }
+ gfx_draw_sprite(dpi, SPR_TAB_AWARDS, w->x + w->widgets[WIDX_TAB_7].left, w->y + w->widgets[WIDX_TAB_7].top, 0);
}
#pragma endregion
diff --git a/src/window_ride_list.c b/src/window_ride_list.c
index 323d9d40de..fec59c0f1d 100644
--- a/src/window_ride_list.c
+++ b/src/window_ride_list.c
@@ -647,19 +647,19 @@ static void window_ride_list_draw_tab_images(rct_drawpixelinfo *dpi, rct_window
sprite_idx = SPR_TAB_RIDE_0;
if (w->page == PAGE_RIDES)
sprite_idx += w->frame_no / 4;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_1].left, w->y + w->widgets[WIDX_TAB_1].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_1].left, w->y + w->widgets[WIDX_TAB_1].top, 0);
// Shops and stalls tab
sprite_idx = SPR_TAB_SHOPS_AND_STALLS_0;
if (w->page == PAGE_SHOPS_AND_STALLS)
sprite_idx += w->frame_no / 4;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_2].left, w->y + w->widgets[WIDX_TAB_2].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_2].left, w->y + w->widgets[WIDX_TAB_2].top, 0);
// Information kiosks and facilities tab
sprite_idx = SPR_TAB_KIOSKS_AND_FACILITIES_0;
if (w->page == PAGE_KIOSKS_AND_FACILITIES)
sprite_idx += (w->frame_no / 4) % 8;
- gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_3].left, w->y + w->widgets[WIDX_TAB_3].top);
+ gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_3].left, w->y + w->widgets[WIDX_TAB_3].top, 0);
}
diff --git a/src/window_staff.c b/src/window_staff.c
index 273e2462de..d23545d8f9 100644
--- a/src/window_staff.c
+++ b/src/window_staff.c
@@ -613,7 +613,7 @@ void window_staff_paint() {
dpi,
i,
(window_staff_widgets[WIDX_STAFF_HANDYMEN_TAB].left + window_staff_widgets[WIDX_STAFF_HANDYMEN_TAB].right) / 2 + w->x,
- window_staff_widgets[WIDX_STAFF_HANDYMEN_TAB].bottom - 6 + w->y
+ window_staff_widgets[WIDX_STAFF_HANDYMEN_TAB].bottom - 6 + w->y, 0
);
// Handymen tab image
@@ -625,7 +625,7 @@ void window_staff_paint() {
dpi,
i,
(window_staff_widgets[WIDX_STAFF_MECHANICS_TAB].left + window_staff_widgets[WIDX_STAFF_MECHANICS_TAB].right) / 2 + w->x,
- window_staff_widgets[WIDX_STAFF_MECHANICS_TAB].bottom - 6 + w->y
+ window_staff_widgets[WIDX_STAFF_MECHANICS_TAB].bottom - 6 + w->y, 0
);
// Security tab image
@@ -637,7 +637,7 @@ void window_staff_paint() {
dpi,
i,
(window_staff_widgets[WIDX_STAFF_SECURITY_TAB].left + window_staff_widgets[WIDX_STAFF_SECURITY_TAB].right) / 2 + w->x,
- window_staff_widgets[WIDX_STAFF_SECURITY_TAB].bottom - 6 + w->y
+ window_staff_widgets[WIDX_STAFF_SECURITY_TAB].bottom - 6 + w->y, 0
);
rct_drawpixelinfo* sprite_dpi = clip_drawpixelinfo(
@@ -658,7 +658,7 @@ void window_staff_paint() {
sprite_dpi,
i,
0x0F,
- 0x17
+ 0x17, 0
);
rct2_free(sprite_dpi);
}
@@ -739,7 +739,7 @@ void window_staff_scrollpaint()
// True if a patrol path is set for the worker
if (RCT2_ADDRESS(0x013CA672, uint8)[peep->var_C5] & 2) {
- gfx_draw_sprite(dpi, 0x13FD, 110, y - 1);
+ gfx_draw_sprite(dpi, 0x13FD, 110, y - 1, 0);
}
staffOrderIcon_x = 0x7D;
@@ -749,14 +749,14 @@ void window_staff_scrollpaint()
while (staffOrders != 0) {
if (staffOrders & 1) {
- gfx_draw_sprite(dpi, staffOrderSprite, staffOrderIcon_x, y - 1);
+ gfx_draw_sprite(dpi, staffOrderSprite, staffOrderIcon_x, y - 1, 0);
}
staffOrders = staffOrders >> 1;
staffOrderIcon_x += 9;
staffOrderSprite++;
}
} else {
- gfx_draw_sprite(dpi, peep->sprite_type - 4 + 0x13FE, staffOrderIcon_x, y - 1);
+ gfx_draw_sprite(dpi, peep->sprite_type - 4 + 0x13FE, staffOrderIcon_x, y - 1, 0);
}
}
diff --git a/src/window_title_logo.c b/src/window_title_logo.c
index 16cfaa776b..7b5bec581d 100644
--- a/src/window_title_logo.c
+++ b/src/window_title_logo.c
@@ -112,7 +112,7 @@ static void window_title_logo_paint()
#endif
- gfx_draw_sprite(dpi, SPR_MENU_LOGO, w->x, w->y);
+ gfx_draw_sprite(dpi, SPR_MENU_LOGO, w->x, w->y, 0);
x = 0;
y = 105;
diff --git a/src/window_title_scenarioselect.c b/src/window_title_scenarioselect.c
index 09d185238f..7c8c7b744a 100644
--- a/src/window_title_scenarioselect.c
+++ b/src/window_title_scenarioselect.c
@@ -386,7 +386,7 @@ static void window_scenarioselect_paint()
// Draw SixFlags image
if (scenario->flags & SCENARIO_FLAGS_SIXFLAGS)
- gfx_draw_sprite(dpi, SPR_SIX_FLAGS, w->x + w->width - 55, w->y + w->height - 75);
+ gfx_draw_sprite(dpi, SPR_SIX_FLAGS, w->x + w->width - 55, w->y + w->height - 75, 0);
// Scenario name
x = w->x + window_scenarioselect_widgets[WIDX_SCENARIOLIST].right + 4;
@@ -466,7 +466,7 @@ static void window_scenarioselect_scrollpaint()
// Check if scenario is completed
if (scenario->flags & SCENARIO_FLAGS_COMPLETED) {
// Draw completion tick
- gfx_draw_sprite(dpi, 0x5A9F, 395, y + 1);
+ gfx_draw_sprite(dpi, 0x5A9F, 395, y + 1, 0);
// Draw completion score
strcpy((char*)0x009BC677, scenario->completed_by);