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);