diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 2b406fd263..2fd8158ebe 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -11,7 +11,7 @@ assignees: '' Fill in the placeholders below. Delete any headings and placeholders that you do not fill in. --> **OS:** [e.g. Windows 10] -**Version:** [e.g. 0.3.3] +**Version:** [e.g. 0.3.4] **Commit/Build:** [e.g. 426e106] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e84ff1e7d..807d2ebb70 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ env: OPENRCT2_BUILD_SERVER: GitHub OPENRCT2_ORG_TOKEN: ${{ secrets.OPENRCT2_ORG_TOKEN }} BACKTRACE_IO_TOKEN: ${{ secrets.BACKTRACE_IO_TOKEN }} - OPENRCT2_VERSION: 0.3.3 + OPENRCT2_VERSION: 0.3.4 jobs: lint-commit: name: Lint Commit Message diff --git a/CMakeLists.txt b/CMakeLists.txt index 38fe830c56..0fa9fa1c93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,26 +180,6 @@ execute_process( ) -# Defines -if (USE_MMAP) - add_definitions(-DUSE_MMAP) -endif () -if (DISABLE_NETWORK) - add_definitions(-DDISABLE_NETWORK) -endif () -if (DISABLE_HTTP) - add_definitions(-DDISABLE_HTTP) -endif () -if (DISABLE_TTF) - add_definitions(-DNO_TTF) -endif () -if (ENABLE_LIGHTFX) - add_definitions(-D__ENABLE_LIGHTFX__) -endif () -if (ENABLE_SCRIPTING) - add_definitions(-DENABLE_SCRIPTING) -endif () - if (NOT DISABLE_DISCORD_RPC) if (UNIX AND NOT APPLE) find_package(DiscordRPC) @@ -366,6 +346,27 @@ if(NOT DISABLE_GUI) include("${ROOT_DIR}/src/openrct2-ui/CMakeLists.txt" NO_POLICY_SCOPE) endif() +# Defines +if (USE_MMAP) + target_compile_options(libopenrct2 PUBLIC -DUSE_MMAP) +endif () +if (DISABLE_NETWORK) + target_compile_options(libopenrct2 PUBLIC -DDISABLE_NETWORK) +endif () +if (DISABLE_HTTP) + target_compile_options(libopenrct2 PUBLIC -DDISABLE_HTTP) +endif () +if (DISABLE_TTF) + target_compile_options(libopenrct2 PUBLIC -DNO_TTF) +endif () +if (ENABLE_LIGHTFX) + target_compile_options(libopenrct2 PUBLIC -D__ENABLE_LIGHTFX__) +endif () +if (ENABLE_SCRIPTING) + target_compile_options(libopenrct2 PUBLIC -DENABLE_SCRIPTING) +endif () + + # g2 add_custom_command( OUTPUT g2.dat diff --git a/contributors.md b/contributors.md index c6a637b285..4213c6d9ad 100644 --- a/contributors.md +++ b/contributors.md @@ -170,6 +170,8 @@ The following people are not part of the development team, but have been contrib * Ryan D. (rctdude2) * (zrowny) * Emre Aydin (aemreaydin) +* Daniel Karandikar (DKarandikar) +* Struan Clark (xtruan) ## Toolchain * (Balletie) - macOS diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 8aa9434cf9..781ce55911 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3647,6 +3647,7 @@ STR_6449 :{WINDOW_COLOUR_2}Tracks: STR_6450 :{BLACK}“{STRING}” STR_6451 :{BLACK}“{STRING}” - {STRING} STR_6452 :{WINDOW_COLOUR_2}Sells: {BLACK}{STRING} +STR_6453 :Copy version info ############# # Scenarios # diff --git a/data/language/eo-OO.txt b/data/language/eo-OO.txt index ed4bf0b0cd..5b6eb0bd92 100644 --- a/data/language/eo-OO.txt +++ b/data/language/eo-OO.txt @@ -3695,6 +3695,7 @@ STR_6449 :{WINDOW_COLOUR_2}Kantoj: STR_6450 :{BLACK}“{STRING}” STR_6451 :{BLACK}“{STRING}” - {STRING} STR_6452 :{WINDOW_COLOUR_2}Vendas: {BLACK}{STRING} +STR_6453 :Kopii informojn de versio ############# # Scenarios # diff --git a/data/language/fr-FR.txt b/data/language/fr-FR.txt index b6f74b257d..acd1dcf617 100644 --- a/data/language/fr-FR.txt +++ b/data/language/fr-FR.txt @@ -95,6 +95,7 @@ STR_0090 :Mineur STR_0091 :Manège Inconnu (59) STR_0092 :Moteur à induction linéaire STR_0093 :Montagnes russes hybrides +STR_0094 :Montagnes russes à rail unique STR_0512 :Des voitures individuelles descendent des pentes régulières en virage STR_0513 :Grand huit que les passagers parcourent debout STR_0514 :Des voitures suspendues sous la voie se balancent dans les virages des montagnes russes @@ -175,6 +176,7 @@ STR_0599 :Des voitures individuelles descendent des pentes régulières en vi STR_0600 :Train de mine à propulsion franchissant une voie régulière et alambiquée STR_0602 :Train de montagnes russes propulsé hors de la station par des moteurs à induction linéaire et fonçant dans des inversions renversantes STR_0603 :Train de montagnes russes en bois avec des rails en acier, permettant des grandes chutes et des inversions. +STR_0604 :Les passagers parcourent une voie à rail unique dans des voitures mono-places, à travers des inversions et des virages serrés STR_0767 :Visiteur {INT32} STR_0768 :Agent d’entretien {INT32} STR_0769 :Mécanicien {INT32} @@ -3296,18 +3298,18 @@ STR_6014 :Les visiteurs ne paieront que les tickets pour entrer dans les attr STR_6015 :Incliné STR_6016 :Modifier case STR_6017 :Merci de ralentir un peu -STR_6018 :Construction d’attraction - Tourner à gauche -STR_6019 :Construction d’attraction - Tourner à droite -STR_6020 :Construction d’attraction - Utiliser la voie par défaut -STR_6021 :Construction d’attraction - Pente descendante -STR_6022 :Construction d’attraction - Pente ascendante -STR_6023 :Construction d’attraction - Activer/désactiver la remontée à chaîne -STR_6024 :Construction d’attraction - Incliner à gauche -STR_6025 :Construction d’attraction - Incliner à droite -STR_6026 :Construction d’attraction - Morceau précédent -STR_6027 :Construction d’attraction - Morceau suivante -STR_6028 :Construction d’attraction - Construire l’actuel -STR_6029 :Construction d’attraction - Démolir l’actuel +STR_6018 :Construction - Tourner à gauche +STR_6019 :Construction - Tourner à droite +STR_6020 :Construction - Utiliser la voie par défaut +STR_6021 :Construction - Pente descendante +STR_6022 :Construction - Pente ascendante +STR_6023 :Construction - Activer/désactiver la remontée à chaîne +STR_6024 :Construction - Incliner à gauche +STR_6025 :Construction - Incliner à droite +STR_6026 :Construction - Morceau précédent +STR_6027 :Construction - Morceau suivante +STR_6028 :Construction - Construire l’actuel +STR_6029 :Construction - Démolir l’actuel STR_6030 :Pipette de décor. Cliquez sur un décor sur la carte afin de sélectionner la même pièce et la construire. STR_6031 :Description du serveur : STR_6032 :Message de bienvenue du serveur : @@ -3643,20 +3645,64 @@ STR_6392 :Impossible de trouver {STRING} à cet emplacement. STR_6393 :Choix des objectifs STR_6394 :Objectif STR_6395 :Maintenance -STR_6396 :Désactiver écran de veille et économie d’énergie pour moniteur -STR_6397 :Si coché, l’écran de veille et autres paramètres d’économie d’énergie pour moniteur seront désactivés pendant qu’OpenRCT2 tourne -STR_6398 :Le fichier contient des types d'attractions non-supportés. Veuillez mettre à jour OpenRCT2. -STR_6399 :OpenRCT2 a besoin des fichiers originaux de RollerCoaster Tycoon 2 pour fonctionner. Veuillez indiquez le chemin où vous avez installé RollerCoaster Tycoon 2 dans la variable "game_path" dans le fichier config.ini, puis redémarrez OpenRCT2. -STR_6400 :J'ai téléchargé l'installeur GOG hors-ligne de RollerCoaster Tycoon 2, mais je ne l'ai pas encoré installé -STR_6401 :J'ai déjà installé RollerCoaster Tycoon 2 +STR_6396 :Désactiver écr. de veille et éco. d’énergie du moniteur +STR_6397 :Si coché, l’écran de veille et d’autres fonctionnalités d’économie d’énergie du moniteur seront désactivés pendant qu’OpenRCT2 est lancé. +STR_6398 :Le fichier contient des types d’attractions non supportés. Veuillez mettre à jour OpenRCT2 vers une version plus récente. +STR_6399 :OpenRCT2 a besoin des fichiers originaux de RollerCoaster Tycoon 2 pour fonctionner. Veuillez indiquer le chemin où vous avez installé RollerCoaster Tycoon 2 dans la variable “game_path” dans le fichier config.ini, puis redémarrez OpenRCT2. +STR_6400 :J’ai téléchargé l’installeur GOG hors-ligne de RollerCoaster Tycoon 2, mais je ne l’ai pas encore installé +STR_6401 :J’ai déjà installé RollerCoaster Tycoon 2 STR_6402 :Configuration des données OpenRCT2 -STR_6403 :Sélectionnez la situation qui s'applique dans votre cas -STR_6404 :Veuillez sélectionnez l'installeur GOG de RollerCoaster Tycoon 2. -STR_6405 :Selection installeur GOG +STR_6403 :Sélectionnez la situation qui s’applique à votre cas +STR_6404 :Veuillez sélectionnez l’installeur GOG de RollerCoaster Tycoon 2. +STR_6405 :Sélectionner l’installeur GOG STR_6406 :Installeur GOG RollerCoaster Tycoon 2 STR_6407 :Ceci peut prendre quelques minutes. -STR_6408 :Veuillez installer "innoextract" pour extraire l'installeur GOG, et redémarrez OpenRCT2. -STR_6409 :Le fichier sélectionné n'est pas l'installeur GOG hors-ligne de RollerCoaster Tycoon 2. Soit vous avez téléchargé l'installeur de GOG Galaxy ou vous avez sélectionné le mauvais fichier. +STR_6408 :Veuillez installer “innoextract” pour extraire l’installeur GOG, et redémarrez OpenRCT2. +STR_6409 :Le fichier sélectionné n’est pas l’installeur GOG hors-ligne de RollerCoaster Tycoon 2. Vous avez peut-être téléchargé l’installeur de GOG Galaxy ou sélectionné le mauvais fichier. +STR_6410 :Zoom avant/arrière +STR_6411 :Afficher les boutons de zoom dans la barre d’outils +STR_6412 :Entrée pavé numérique +STR_6413 :Maj +STR_6414 :Maj gauche +STR_6415 :Maj droite +STR_6416 :Ctrl +STR_6417 :Ctrl gauche +STR_6418 :Ctrl droite +STR_6419 :Alt +STR_6420 :Alt gauche +STR_6421 :Alt droite +STR_6422 :Cmd +STR_6423 :Cmd gauche +STR_6424 :Cmd droite +STR_6425 :Joystick gauche +STR_6426 :Joystick droite +STR_6427 :Joystick haut +STR_6428 :Joystick bas +STR_6429 :Joystick {INT32} +STR_6430 :Bouton gauche souris +STR_6431 :Bouton droite souris +STR_6432 :Bouton souris {INT32} +STR_6433 :Supprimer +STR_6434 :Supprimer toutes les combinaisons pour ce raccourci. +STR_6435 :{WINDOW_COLOUR_2}Vandales arrêtés : {BLACK}{COMMA16} +STR_6436 :Permuter la visibilité +STR_6437 :Invisible +STR_6438 :I +STR_6439 :Inspecteur de cases - Permuter la visibilité +STR_6440 :Eau transparente +STR_6441 :Au moins un objet de surface d’allée (hors file d’attente) doit être sélectionné. +STR_6442 :Au moins un objet de surface de file d’attente doit être sélectionné. +STR_6443 :Au moins un object de rambarde doit être sélectionné. +STR_6444 :Surfaces d’allée +STR_6445 :Rambardes +STR_6446 :{WINDOW_COLOUR_2}Nom de la surface : {BLACK}{STRINGID} +STR_6447 :{WINDOW_COLOUR_2}Nom de la rambarde : {BLACK}{STRINGID} +STR_6448 :Format d’objet non supporté +STR_6449 :{WINDOW_COLOUR_2}Pistes : +STR_6450 :{BLACK}“{STRING}” +STR_6451 :{BLACK}“{STRING}” - {STRING} +STR_6452 :{WINDOW_COLOUR_2}Vend : {BLACK}{STRING} +STR_6453 :Copier les informations de version ############# # Scenarios # diff --git a/data/language/it-IT.txt b/data/language/it-IT.txt index 3f769085ae..692635e7c2 100644 --- a/data/language/it-IT.txt +++ b/data/language/it-IT.txt @@ -3686,6 +3686,24 @@ STR_6432 :Mouse {INT32} STR_6433 :Rimuovi STR_6434 :Rimuovi tutte le associazioni per questa scorciatoia. STR_6435 :{WINDOW_COLOUR_2}Vandalismi fermati: {BLACK}{COMMA16} +STR_6436 :Attiva/disattiva invisibilità +STR_6437 :Invisibile +STR_6438 :I +STR_6439 :Analizzatore celle: Attiva/disattiva invisibilità +STR_6440 :Acqua trasparente +STR_6441 :Occorre selezionare almeno un oggetto di superficie sentiero di tipo non coda. +STR_6442 :Occorre selezionare almeno un oggetto di superficie sentiero code. +STR_6443 :Occorre selezionare almeno un oggetto di parapetto sentieri. +STR_6444 :Superfici sentieri +STR_6445 :Parapetti sentieri +STR_6446 :{WINDOW_COLOUR_2}Nome superficie: {BLACK}{STRINGID} +STR_6447 :{WINDOW_COLOUR_2}Nome parapetto: {BLACK}{STRINGID} +STR_6448 :Formato oggetto non supportato +STR_6449 :{WINDOW_COLOUR_2}Tracce: +STR_6450 :{BLACK}“{STRING}” +STR_6451 :{BLACK}“{STRING}” - {STRING} +STR_6452 :{WINDOW_COLOUR_2}Vende: {BLACK}{STRING} +STR_6453 :Copia info versione ############# diff --git a/data/language/ko-KR.txt b/data/language/ko-KR.txt index 894be2d486..32dd21608e 100644 --- a/data/language/ko-KR.txt +++ b/data/language/ko-KR.txt @@ -4,7 +4,7 @@ STR_0000 : STR_0001 :{STRINGID} {COMMA16} STR_0002 :스파이럴 롤러코스터 -STR_0003 :스탠드업 롤러코스터 +STR_0003 :스탠드 업 롤러코스터 STR_0004 :서스펜디드 스윙잉 코스터 STR_0005 :인버티드 롤러코스터 STR_0006 :주니어 롤러코스터 @@ -813,7 +813,7 @@ STR_1424 :보도 STR_1425 :보도 STR_1426 :대기 줄 STR_1427 :{WINDOW_COLOUR_2}손님: {BLACK}{COMMA32}명/시간 -STR_1428 :{WINDOW_COLOUR_2}입장료: +STR_1428 :{WINDOW_COLOUR_2}탑승료: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1430 :무료 STR_1431 :걷는 중 @@ -3698,6 +3698,7 @@ STR_6449 :{WINDOW_COLOUR_2}트랙: STR_6450 :{BLACK}“{STRING}” STR_6451 :{BLACK}“{STRING}” - {STRING} STR_6452 :{WINDOW_COLOUR_2}판매: {BLACK}{STRING} +STR_6453 :버전 정보 복사 ############# # Scenarios # diff --git a/data/language/pt-BR.txt b/data/language/pt-BR.txt index 666b8d3614..187c0be2fc 100644 --- a/data/language/pt-BR.txt +++ b/data/language/pt-BR.txt @@ -3695,6 +3695,7 @@ STR_6449 :{WINDOW_COLOUR_2}Trilhos: STR_6450 :{BLACK}“{STRING}” STR_6451 :{BLACK}“{STRING}” - {STRING} STR_6452 :{WINDOW_COLOUR_2}Vende: {BLACK}{STRING} +STR_6453 :Copiar informações da versão ############# # Scenarios # diff --git a/debian/changelog b/debian/changelog index d620fbad0a..1ee4a220d5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,7 +1,48 @@ -openrct2 (0.3.3-develop-1) unstable; urgency=medium +openrct2 (0.3.4-develop-1) unstable; urgency=medium * Nightly develop build. +openrct2 (0.3.4) stable; urgency=medium + + * Feature: [#13967] Track List window now displays the path to the design when debugging tools are on. + * Feature: [#14071] “Vandals stopped” statistic for security guards. + * Feature: [#14169] Lighting effects for shops and stalls. + * Feature: [#14296] Allow using early scenario completion in multiplayer. + * Feature: [#14538] [Plugin] Add property for getting current plugin api version. + * Feature: [#14620] [Plugin] Add properties related to guest generation. + * Feature: [#14636] [Plugin] Add properties related to climate and weather. + * Feature: [#14731] Opaque water (like in RCT1). + * Change: [#14496] [Plugin] Rename Object to LoadedObject to fix conflicts with Typescript's Object interface. + * Change: [#14536] [Plugin] Rename ListView to ListViewWidget to make it consistent with names of other widgets. + * Change: [#14751] “No construction above tree height” limitation now allows placing high trees. + * Change: [#14841] Redesign the About window, including new button to copy the current version info. + * Fix: [#11829] Visual glitches and crashes when using RCT1 assets from mismatched or corrupt CSG1.DAT and CSG1i.DAT files. + * Fix: [#12262] Windows can appear off screen with small screens or high scaling. + * Fix: [#13581] Opening the Options menu causes a noticeable drop in FPS. + * Fix: [#13894] Block brakes do not animate. + * Fix: [#13986] OpenGL: Track preview window, flip/rotate button do not update the thumbnail. + * Fix: [#14315] Crash when trying to rename Air Powered Vertical Coaster in Korean. + * Fix: [#14330] join_server uses default_port from config. + * Fix: [#14415] Entrances/exits are removed when built on top of each other. + * Fix: [#14449] Surface smoothing at extra zoom levels not working. + * Fix: [#14468] Cannot close Options window on Android. + * Fix: [#14493] [Plugin] isHidden only works for tile elements up to the first element with a base height of over 32. + * Fix: [#14587] Confusing message when joining server with mismatched network version. + * Fix: [#14604] American-style Steam Trains are not imported correctly from RCT1 saves. + * Fix: [#14638] The “About OpenRCT2” window cannot be themed. + * Fix: [#14682] Crash when painting Swinging Ships with invalid subtype. + * Fix: [#14707] Crash when window is closed during text input. + * Fix: [#14710] Ride/Track Design preview does not show if it costs more money than available. + * Fix: [#14774] Incorrect import of scenery research caused all scenery to be unlocked. + * Fix: [#14806] Incorrect function call in WallPlaceAction plugin code. + * Fix: [#14871] Crash when trying to place track when there are no free tile elements. + * Fix: [#14880] Unable to close changelog window when its content fails to load. + * Fix: [#14945] Incorrect drop height penalty on log flume ride. + * Fix: [#14964] Unable to build in multiplayer as client with "Build while paused" cheat enabled when the host is paused. + * Improved: [#14511] “Unlock operating limits” cheat now also unlocks all music. + * Improved: [#14712, #14716] Improve startup times. + * Improved: [#14982] Add Malgun Gothic and change Nanum Gothic filename for Korean. + openrct2 (0.3.3) stable; urgency=medium * Feature: [#12110] Add Hybrid Coaster (Rocky Mountain Construction I-Box) track type. diff --git a/distribution/changelog.txt b/distribution/changelog.txt index ba845825b4..ebb91fefa9 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,7 +1,12 @@ -0.3.3+ (in development) +0.3.4+ (in development) +------------------------------------------------------------------------ +- Improved: [#12626] Allow using RCT2 saves to mark RCT Classic (.sea) parks as finished and vice versa. + +0.3.4 (2021-07-19) ------------------------------------------------------------------------ - Feature: [#13967] Track List window now displays the path to the design when debugging tools are on. - Feature: [#14071] “Vandals stopped” statistic for security guards. +- Feature: [#14169] Lighting effects for shops and stalls. - Feature: [#14296] Allow using early scenario completion in multiplayer. - Feature: [#14538] [Plugin] Add property for getting current plugin api version. - Feature: [#14620] [Plugin] Add properties related to guest generation. @@ -10,7 +15,9 @@ - Change: [#14496] [Plugin] Rename Object to LoadedObject to fix conflicts with Typescript's Object interface. - Change: [#14536] [Plugin] Rename ListView to ListViewWidget to make it consistent with names of other widgets. - Change: [#14751] “No construction above tree height” limitation now allows placing high trees. +- Change: [#14841] Redesign the About window, including new button to copy the current version info. - Fix: [#11829] Visual glitches and crashes when using RCT1 assets from mismatched or corrupt CSG1.DAT and CSG1i.DAT files. +- Fix: [#12262] Windows can appear off screen with small screens or high scaling. - Fix: [#13581] Opening the Options menu causes a noticeable drop in FPS. - Fix: [#13894] Block brakes do not animate. - Fix: [#13986] OpenGL: Track preview window, flip/rotate button do not update the thumbnail. @@ -28,8 +35,13 @@ - Fix: [#14710] Ride/Track Design preview does not show if it costs more money than available. - Fix: [#14774] Incorrect import of scenery research caused all scenery to be unlocked. - Fix: [#14806] Incorrect function call in WallPlaceAction plugin code. +- Fix: [#14871] Crash when trying to place track when there are no free tile elements. +- Fix: [#14880] Unable to close changelog window when its content fails to load. +- Fix: [#14945] Incorrect drop height penalty on log flume ride. +- Fix: [#14964] Unable to build in multiplayer as client with "Build while paused" cheat enabled when the host is paused. - Improved: [#14511] “Unlock operating limits” cheat now also unlocks all music. -- Improved: [#14712, #14716]: Improve startup times. +- Improved: [#14712, #14716] Improve startup times. +- Improved: [#14982] Add Malgun Gothic and change Nanum Gothic filename for Korean. 0.3.3 (2021-03-13) ------------------------------------------------------------------------ diff --git a/distribution/linux/openrct2.appdata.xml b/distribution/linux/openrct2.appdata.xml index 88921eeb10..71d17709e7 100644 --- a/distribution/linux/openrct2.appdata.xml +++ b/distribution/linux/openrct2.appdata.xml @@ -66,6 +66,9 @@ none + + https://github.com/OpenRCT2/OpenRCT2/releases/tag/v0.3.4 + https://github.com/OpenRCT2/OpenRCT2/releases/tag/v0.3.3 diff --git a/distribution/macos/Info.plist b/distribution/macos/Info.plist index f7fd4c88c5..e869d6893e 100644 --- a/distribution/macos/Info.plist +++ b/distribution/macos/Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.3.3 + 0.3.4 CFBundleSignature ORCT LSMinimumSystemVersion diff --git a/distribution/readme.txt b/distribution/readme.txt index 3a1de0c05a..979fbdc003 100644 --- a/distribution/readme.txt +++ b/distribution/readme.txt @@ -1,5 +1,5 @@ -Last updated: 2021-03-13 -Release version: 0.3.3 +Last updated: 2021-07-19 +Release version: 0.3.4 ------------------------------------------------------------------------ diff --git a/readme.md b/readme.md index 9e872d4f5c..599e48b969 100644 --- a/readme.md +++ b/readme.md @@ -10,7 +10,7 @@ An open-source re-implementation of RollerCoaster Tycoon 2. A construction and m ### Download | Latest release | Latest development build | |----------------|--------------------------| -| [![OpenRCT2.org](https://img.shields.io/badge/master-v0.3.3-green.svg)](https://openrct2.org/downloads/master/latest) | [![OpenRCT2.org](https://img.shields.io/badge/develop-v0.3.3+-blue.svg)](https://openrct2.org/downloads/develop/latest) | +| [![OpenRCT2.org](https://img.shields.io/badge/master-v0.3.4-green.svg)](https://openrct2.org/downloads/master/latest) | [![OpenRCT2.org](https://img.shields.io/badge/develop-v0.3.4+-blue.svg)](https://openrct2.org/downloads/develop/latest) | --- diff --git a/scripts/setenv b/scripts/setenv index e34e5fd703..87aae819b7 100755 --- a/scripts/setenv +++ b/scripts/setenv @@ -4,7 +4,7 @@ # It should be dot sourced into your environment if [[ "$GITHUB_ACTIONS" != "true" ]]; then export OPENRCT2_BUILD_SERVER=$(hostname) - export OPENRCT2_VERSION=0.3.3 + export OPENRCT2_VERSION=0.3.4 GITHUB_REF=$(git rev-parse --symbolic-full-name HEAD) GITHUB_SHA=$(git rev-parse HEAD) fi diff --git a/src/openrct2-android/app/build.gradle b/src/openrct2-android/app/build.gradle index c3a5fae613..964213b9e2 100644 --- a/src/openrct2-android/app/build.gradle +++ b/src/openrct2-android/app/build.gradle @@ -10,7 +10,7 @@ android { targetSdkVersion 28 versionCode 2 - versionName '0.3.3' + versionName '0.3.4' externalNativeBuild { cmake { diff --git a/src/openrct2-ui/input/InputManager.h b/src/openrct2-ui/input/InputManager.h index a1f389cd55..04e3e19f8d 100644 --- a/src/openrct2-ui/input/InputManager.h +++ b/src/openrct2-ui/input/InputManager.h @@ -46,11 +46,11 @@ namespace OpenRCT2::Ui class InputManager { private: - uint32_t _lastJoystickCheck; + uint32_t _lastJoystickCheck{}; std::vector _joysticks; std::queue _events; ScreenCoordsXY _viewScroll; - uint32_t _mouseState; + uint32_t _mouseState{}; std::vector _keyboardState; void CheckJoysticks(); diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index a554534f57..62a27cda60 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -253,7 +253,8 @@ InteractionInfo ViewportInteractionGetItemRight(const ScreenCoordsXY& screenCoor if ((gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) && gEditorStep != EditorStep::RollercoasterDesigner) return info; - auto flags = static_cast(~EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water)); + constexpr auto flags = static_cast( + ~EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water)); info = get_map_coordinates_from_pos(screenCoords, flags); auto tileElement = info.Element; diff --git a/src/openrct2-ui/interface/Window.cpp b/src/openrct2-ui/interface/Window.cpp index 70cca8f993..bf11d1c644 100644 --- a/src/openrct2-ui/interface/Window.cpp +++ b/src/openrct2-ui/interface/Window.cpp @@ -86,14 +86,21 @@ static bool WindowFitsOnScreen(const ScreenCoordsXY& loc, int32_t width, int32_t return WindowFitsBetweenOthers(loc, width, height); } -static ScreenCoordsXY ClampWindowToScreen(const ScreenCoordsXY& pos, const int32_t screenWidth, const int32_t width) +static ScreenCoordsXY ClampWindowToScreen( + const ScreenCoordsXY& pos, const int32_t screenWidth, const int32_t screenHeight, const int32_t width, const int32_t height) { auto screenPos = pos; - if (screenPos.x < 0) + if (width > screenWidth || screenPos.x < 0) screenPos.x = 0; - if (screenPos.x + width > screenWidth) + else if (screenPos.x + width > screenWidth) screenPos.x = screenWidth - width; + auto toolbarAllowance = (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) ? 0 : (TOP_TOOLBAR_HEIGHT + 1); + if (height - toolbarAllowance > screenHeight || screenPos.y < toolbarAllowance) + screenPos.y = toolbarAllowance; + else if (screenPos.y + height - toolbarAllowance > screenHeight) + screenPos.y = screenHeight + toolbarAllowance - height; + return screenPos; } @@ -115,7 +122,7 @@ static ScreenCoordsXY GetAutoPositionForNewWindow(int32_t width, int32_t height) { if (WindowFitsWithinSpace(cornerPos, width, height)) { - return ClampWindowToScreen(cornerPos, screenWidth, width); + return ClampWindowToScreen(cornerPos, screenWidth, screenHeight, width, height); } } @@ -139,7 +146,7 @@ static ScreenCoordsXY GetAutoPositionForNewWindow(int32_t width, int32_t height) auto screenPos = w->windowPos + offset; if (WindowFitsWithinSpace(screenPos, width, height)) { - return ClampWindowToScreen(screenPos, screenWidth, width); + return ClampWindowToScreen(screenPos, screenWidth, screenHeight, width, height); } } } @@ -164,7 +171,7 @@ static ScreenCoordsXY GetAutoPositionForNewWindow(int32_t width, int32_t height) auto screenPos = w->windowPos + offset; if (WindowFitsOnScreen(screenPos, width, height)) { - return ClampWindowToScreen(screenPos, screenWidth, width); + return ClampWindowToScreen(screenPos, screenWidth, screenHeight, width, height); } } } @@ -180,7 +187,7 @@ static ScreenCoordsXY GetAutoPositionForNewWindow(int32_t width, int32_t height) } } - return ClampWindowToScreen(screenPos, screenWidth, width); + return ClampWindowToScreen(screenPos, screenWidth, screenHeight, width, height); } static ScreenCoordsXY GetCentrePositionForNewWindow(int32_t width, int32_t height) diff --git a/src/openrct2-ui/scripting/CustomWindow.cpp b/src/openrct2-ui/scripting/CustomWindow.cpp index e760b19247..fd0a123a30 100644 --- a/src/openrct2-ui/scripting/CustomWindow.cpp +++ b/src/openrct2-ui/scripting/CustomWindow.cpp @@ -392,7 +392,7 @@ namespace OpenRCT2::Ui::Windows { number = GetNewWindowNumber(); custom_info = new CustomWindowInfo(owner, desc); - enabled_widgets = (1 << WIDX_CLOSE); + enabled_widgets = (1ULL << WIDX_CLOSE); // Set window tab page = desc.TabIndex.value_or(0); diff --git a/src/openrct2-ui/windows/About.cpp b/src/openrct2-ui/windows/About.cpp index 9210105427..b164360a30 100644 --- a/src/openrct2-ui/windows/About.cpp +++ b/src/openrct2-ui/windows/About.cpp @@ -7,10 +7,12 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ +#include #include #include #include #include +#include #include #include #include @@ -18,9 +20,9 @@ #include static constexpr const int32_t WW = 400; -static constexpr const int32_t WH = 385; +static constexpr const int32_t WH = 352; static constexpr const rct_string_id WINDOW_TITLE = STR_ABOUT; -constexpr int32_t TABHEIGHT = 50; +static constexpr const int32_t TABHEIGHT = 50; // clang-format off enum @@ -40,9 +42,15 @@ enum WINDOW_ABOUT_WIDGET_IDX { WIDX_PAGE_START, // About OpenRCT2 - WIDX_CHANGELOG = WIDX_PAGE_START, - WIDX_JOIN_DISCORD, + WIDX_INTRO = WIDX_PAGE_START, + WIDX_OPENRCT2_LOGO, + WIDX_VERSION, + WIDX_COPY_BUILD_INFO, WIDX_NEW_VERSION, + WIDX_CHANGELOG, + WIDX_JOIN_DISCORD, + WIDX_CONTRIBUTORS, + WIDX_COPYRIGHT, }; #define WIDGETS_MAIN \ @@ -53,9 +61,15 @@ enum WINDOW_ABOUT_WIDGET_IDX { static rct_widget window_about_openrct2_widgets[] = { WIDGETS_MAIN, - MakeWidget({100, WH - TABHEIGHT - (14 + 3) * 2}, {200, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_CHANGELOG_ELLIPSIS), // changelog button - MakeWidget({100, WH - TABHEIGHT - (14 + 3) * 1}, {200, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_JOIN_DISCORD ), // "join discord" button - MakeWidget({100, WH - TABHEIGHT - (14 + 3) * 0}, {200, 14}, WindowWidgetType::Placeholder, WindowColour::Secondary, STR_UPDATE_AVAILABLE ), // "new version" button + MakeWidget({10, 60}, {WW - 20, 20}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_ABOUT_OPENRCT2_DESCRIPTION), // Introduction + MakeWidget({30, 90}, {128, 128}, WindowWidgetType::Placeholder, WindowColour::Secondary, STR_NONE), // OpenRCT2 Logo + MakeWidget({168, 100}, {173, 24}, WindowWidgetType::Placeholder, WindowColour::Secondary, STR_NONE), // Build version + MakeWidget({344, 100 }, {24, 24}, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_COPY, STR_COPY_BUILD_HASH ), // "Copy build info" button + MakeWidget({168, 115 + 24}, {200, 14}, WindowWidgetType::Placeholder, WindowColour::Secondary, STR_UPDATE_AVAILABLE ), // "new version" button + MakeWidget({168, 115 + 48}, {200, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_CHANGELOG_ELLIPSIS), // changelog button + MakeWidget({168, 115 + 72}, {200, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_JOIN_DISCORD ), // "join discord" button + MakeWidget({10, 250}, {WW - 20, 50}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_ABOUT_OPENRCT2_DESCRIPTION_2), // Contributors + MakeWidget({10, 300}, {WW - 20, 50}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_ABOUT_OPENRCT2_DESCRIPTION_3), // Copyright { WIDGETS_END } }; @@ -73,7 +87,7 @@ static rct_widget *window_about_page_widgets[] = { (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_ABOUT_OPENRCT2) | (1ULL << WIDX_TAB_ABOUT_RCT2) static uint64_t window_about_page_enabled_widgets[] = { - DEFAULT_ENABLED_WIDGETS | (1ULL << WIDX_CHANGELOG) | (1 << WIDX_JOIN_DISCORD), + DEFAULT_ENABLED_WIDGETS | (1ULL << WIDX_COPY_BUILD_INFO) | (1ULL << WIDX_CHANGELOG) | (1ULL << WIDX_JOIN_DISCORD), DEFAULT_ENABLED_WIDGETS, }; @@ -150,6 +164,9 @@ static void window_about_openrct2_mouseup(rct_window* w, rct_widgetindex widgetI case WIDX_NEW_VERSION: context_open_window_view(WV_NEW_VERSION_INFO); break; + case WIDX_COPY_BUILD_INFO: + SDL_SetClipboardText(gVersionInfoFull); + break; } } @@ -164,6 +181,7 @@ static void window_about_openrct2_common_paint(rct_window* w, rct_drawpixelinfo* ScreenCoordsXY aboutOpenRCT2Coords(w->windowPos.x + aboutOpenRCT2.left + 45, y); ScreenCoordsXY aboutRCT2Coords(w->windowPos.x + aboutRCT2.left + 45, y); + // Draw tab names { auto ft = Formatter(); ft.Add(STR_TITLE_SEQUENCE_OPENRCT2); @@ -182,33 +200,10 @@ static void window_about_openrct2_paint(rct_window* w, rct_drawpixelinfo* dpi) { window_about_openrct2_common_paint(w, dpi); - int32_t lineHeight = font_get_line_height(FontSpriteBase::MEDIUM); - - ScreenCoordsXY aboutCoords( - w->windowPos.x + (w->width / 2), w->windowPos.y + w->widgets[WIDX_PAGE_BACKGROUND].top + lineHeight); - int32_t width = w->width - 20; - - aboutCoords.y += DrawTextWrapped( - dpi, aboutCoords, width, STR_ABOUT_OPENRCT2_DESCRIPTION, {}, { w->colours[1], TextAlignment::CENTRE }) - + lineHeight; - - rct_size16 logoSize = gfx_get_sprite_size(SPR_G2_LOGO); - gfx_draw_sprite(dpi, ImageId(SPR_G2_LOGO), aboutCoords - ScreenCoordsXY{ logoSize.width / 2, 0 }); - aboutCoords.y += logoSize.height + lineHeight * 2; - - // About OpenRCT2 text - aboutCoords.y += DrawTextWrapped( - dpi, aboutCoords, width, STR_ABOUT_OPENRCT2_DESCRIPTION_2, {}, - { w->colours[1], TextAlignment::CENTRE }) - + lineHeight + 5; - - // Copyright disclaimer; hidden when using truetype fonts to prevent - // the text from overlapping the changelog button. - if (!LocalisationService_UseTrueTypeFont()) - { - DrawTextWrapped( - dpi, aboutCoords, width, STR_ABOUT_OPENRCT2_DESCRIPTION_3, {}, { w->colours[1], TextAlignment::CENTRE }); - } + // Draw logo on placeholder widget + ScreenCoordsXY logoCoords = w->windowPos + + ScreenCoordsXY(w->widgets[WIDX_OPENRCT2_LOGO].left, w->widgets[WIDX_OPENRCT2_LOGO].top); + gfx_draw_sprite(dpi, ImageId(SPR_G2_LOGO), logoCoords); // Version info utf8 buffer[256]; @@ -217,8 +212,12 @@ static void window_about_openrct2_paint(rct_window* w, rct_drawpixelinfo* dpi) auto ft = Formatter(); ft.Add(buffer); - aboutCoords.y = w->windowPos.y + WH - 25; - DrawTextWrapped(dpi, aboutCoords, width, STR_STRING, ft, { w->colours[1], TextAlignment::CENTRE }); + auto const& versionPlaceholder = w->widgets[WIDX_VERSION]; + auto width = versionPlaceholder.right - versionPlaceholder.left; + auto centreX = versionPlaceholder.left + width / 2; + auto centreY = (versionPlaceholder.top + versionPlaceholder.bottom - font_get_line_height(FontSpriteBase::MEDIUM)) / 2; + auto centrePos = w->windowPos + ScreenCoordsXY(centreX, centreY); + DrawTextWrapped(dpi, centrePos, width, STR_STRING, ft, { w->colours[1], TextAlignment::CENTRE }); } static void window_about_openrct2_invalidate(rct_window* w) diff --git a/src/openrct2-ui/windows/Banner.cpp b/src/openrct2-ui/windows/Banner.cpp index 323db0bb33..d9ffbb28c3 100644 --- a/src/openrct2-ui/windows/Banner.cpp +++ b/src/openrct2-ui/windows/Banner.cpp @@ -114,9 +114,9 @@ public: void OnOpen() override { widgets = window_banner_widgets; - enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_BANNER_TEXT) | (1 << WIDX_BANNER_NO_ENTRY) - | (1 << WIDX_BANNER_DEMOLISH) | (1 << WIDX_MAIN_COLOUR) | (1 << WIDX_TEXT_COLOUR_DROPDOWN) - | (1 << WIDX_TEXT_COLOUR_DROPDOWN_BUTTON); + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BANNER_TEXT) | (1ULL << WIDX_BANNER_NO_ENTRY) + | (1ULL << WIDX_BANNER_DEMOLISH) | (1ULL << WIDX_MAIN_COLOUR) | (1ULL << WIDX_TEXT_COLOUR_DROPDOWN) + | (1ULL << WIDX_TEXT_COLOUR_DROPDOWN_BUTTON); WindowInitScrollWidgets(this); } diff --git a/src/openrct2-ui/windows/Changelog.cpp b/src/openrct2-ui/windows/Changelog.cpp index a600a26b06..61bdc07687 100644 --- a/src/openrct2-ui/windows/Changelog.cpp +++ b/src/openrct2-ui/windows/Changelog.cpp @@ -85,6 +85,8 @@ public: */ bool SetPersonality(int personality) { + enabled_widgets = (1ULL << WIDX_CLOSE); + switch (personality) { case WV_NEW_VERSION_INFO: @@ -94,7 +96,7 @@ public: } _personality = WV_NEW_VERSION_INFO; NewVersionProcessInfo(); - enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_OPEN_URL); + enabled_widgets |= (1ULL << WIDX_OPEN_URL); widgets[WIDX_OPEN_URL].type = WindowWidgetType::Button; return true; @@ -103,7 +105,6 @@ public: { return false; } - enabled_widgets = (1 << WIDX_CLOSE); _personality = WV_CHANGELOG; return true; diff --git a/src/openrct2-ui/windows/Cheats.cpp b/src/openrct2-ui/windows/Cheats.cpp index 5a6b8f029f..5d5932ce5c 100644 --- a/src/openrct2-ui/windows/Cheats.cpp +++ b/src/openrct2-ui/windows/Cheats.cpp @@ -446,7 +446,7 @@ static rct_string_id window_cheats_page_titles[] = { class CheatsWindow final : public Window { private: - char _moneySpinnerText[MONEY_STRING_MAXLENGTH]; + char _moneySpinnerText[MONEY_STRING_MAXLENGTH]{}; money32 _moneySpinnerValue = CHEATS_MONEY_DEFAULT; int32_t _selectedStaffSpeed = 1; int32_t _parkRatingSpinnerValue{}; diff --git a/src/openrct2-ui/windows/ClearScenery.cpp b/src/openrct2-ui/windows/ClearScenery.cpp index eeedeee27d..dd54ca2a75 100644 --- a/src/openrct2-ui/windows/ClearScenery.cpp +++ b/src/openrct2-ui/windows/ClearScenery.cpp @@ -81,9 +81,9 @@ rct_window* window_clear_scenery_open() window = WindowCreate( ScreenCoordsXY(context_get_width() - WW, 29), WW, WH, &window_clear_scenery_events, WC_CLEAR_SCENERY, 0); window->widgets = window_clear_scenery_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT) | (1 << WIDX_PREVIEW) - | (1 << WIDX_SMALL_SCENERY) | (1 << WIDX_LARGE_SCENERY) | (1 << WIDX_FOOTPATH); - window->hold_down_widgets = (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_INCREMENT) | (1ULL << WIDX_DECREMENT) + | (1ULL << WIDX_PREVIEW) | (1ULL << WIDX_SMALL_SCENERY) | (1ULL << WIDX_LARGE_SCENERY) | (1ULL << WIDX_FOOTPATH); + window->hold_down_widgets = (1ULL << WIDX_INCREMENT) | (1ULL << WIDX_DECREMENT); WindowInitScrollWidgets(window); window_push_others_below(window); @@ -202,8 +202,8 @@ static void window_clear_scenery_update(rct_window* w) static void window_clear_scenery_invalidate(rct_window* w) { // Set the preview image button to be pressed down - w->pressed_widgets = (1 << WIDX_PREVIEW) | (gClearSmallScenery ? (1 << WIDX_SMALL_SCENERY) : 0) - | (gClearLargeScenery ? (1 << WIDX_LARGE_SCENERY) : 0) | (gClearFootpath ? (1 << WIDX_FOOTPATH) : 0); + w->pressed_widgets = (1ULL << WIDX_PREVIEW) | (gClearSmallScenery ? (1ULL << WIDX_SMALL_SCENERY) : 0) + | (gClearLargeScenery ? (1ULL << WIDX_LARGE_SCENERY) : 0) | (gClearFootpath ? (1ULL << WIDX_FOOTPATH) : 0); // Update the preview image (for tool sizes up to 7) window_clear_scenery_widgets[WIDX_PREVIEW].image = LandTool::SizeToSpriteIndex(gLandToolSize); diff --git a/src/openrct2-ui/windows/CustomCurrency.cpp b/src/openrct2-ui/windows/CustomCurrency.cpp index 137e115a94..b62dc1a9d3 100644 --- a/src/openrct2-ui/windows/CustomCurrency.cpp +++ b/src/openrct2-ui/windows/CustomCurrency.cpp @@ -71,10 +71,10 @@ rct_window* custom_currency_window_open() window = WindowCreateCentred(400, 100, &_windowCustomCurrencyEvents, WC_CUSTOM_CURRENCY_CONFIG, 0); window->widgets = window_custom_currency_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RATE) | (1 << WIDX_RATE_UP) | (1 << WIDX_RATE_DOWN) - | (1 << WIDX_SYMBOL_TEXT) | (1 << WIDX_AFFIX_DROPDOWN) | (1 << WIDX_AFFIX_DROPDOWN_BUTTON); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_RATE) | (1ULL << WIDX_RATE_UP) | (1ULL << WIDX_RATE_DOWN) + | (1ULL << WIDX_SYMBOL_TEXT) | (1ULL << WIDX_AFFIX_DROPDOWN) | (1ULL << WIDX_AFFIX_DROPDOWN_BUTTON); - window->hold_down_widgets = (1 << WIDX_RATE_UP) | (1 << WIDX_RATE_DOWN); + window->hold_down_widgets = (1ULL << WIDX_RATE_UP) | (1ULL << WIDX_RATE_DOWN); WindowInitScrollWidgets(window); window->colours[0] = COLOUR_LIGHT_BROWN; window->colours[1] = COLOUR_LIGHT_BROWN; diff --git a/src/openrct2-ui/windows/DebugPaint.cpp b/src/openrct2-ui/windows/DebugPaint.cpp index 28d25eea45..c67f5275c0 100644 --- a/src/openrct2-ui/windows/DebugPaint.cpp +++ b/src/openrct2-ui/windows/DebugPaint.cpp @@ -71,8 +71,9 @@ rct_window* window_debug_paint_open() &window_debug_paint_events, WC_DEBUG_PAINT, WF_STICK_TO_FRONT | WF_TRANSPARENT); window->widgets = window_debug_paint_widgets; - window->enabled_widgets = (1 << WIDX_TOGGLE_SHOW_WIDE_PATHS) | (1 << WIDX_TOGGLE_SHOW_BLOCKED_TILES) - | (1 << WIDX_TOGGLE_SHOW_BOUND_BOXES) | (1 << WIDX_TOGGLE_SHOW_SEGMENT_HEIGHTS) | (1 << WIDX_TOGGLE_SHOW_DIRTY_VISUALS); + window->enabled_widgets = (1ULL << WIDX_TOGGLE_SHOW_WIDE_PATHS) | (1ULL << WIDX_TOGGLE_SHOW_BLOCKED_TILES) + | (1ULL << WIDX_TOGGLE_SHOW_BOUND_BOXES) | (1ULL << WIDX_TOGGLE_SHOW_SEGMENT_HEIGHTS) + | (1ULL << WIDX_TOGGLE_SHOW_DIRTY_VISUALS); WindowInitScrollWidgets(window); window_push_others_below(window); diff --git a/src/openrct2-ui/windows/DemolishRidePrompt.cpp b/src/openrct2-ui/windows/DemolishRidePrompt.cpp index ada26f3c97..395bd145cf 100644 --- a/src/openrct2-ui/windows/DemolishRidePrompt.cpp +++ b/src/openrct2-ui/windows/DemolishRidePrompt.cpp @@ -82,7 +82,7 @@ rct_window* window_ride_demolish_prompt_open(Ride* ride) } w->widgets = window_ride_demolish_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_CANCEL) | (1 << WIDX_DEMOLISH); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CANCEL) | (1ULL << WIDX_DEMOLISH); WindowInitScrollWidgets(w); w->number = ride->id; _demolishRideCost = -ride_get_refund_price(ride); @@ -107,7 +107,7 @@ rct_window* window_ride_refurbish_prompt_open(Ride* ride) } w->widgets = window_ride_refurbish_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_CANCEL) | (1 << WIDX_REFURBISH); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CANCEL) | (1ULL << WIDX_REFURBISH); WindowInitScrollWidgets(w); w->number = ride->id; _demolishRideCost = -ride_get_refund_price(ride); diff --git a/src/openrct2-ui/windows/EditorBottomToolbar.cpp b/src/openrct2-ui/windows/EditorBottomToolbar.cpp index 7528a2bcff..4301a10584 100644 --- a/src/openrct2-ui/windows/EditorBottomToolbar.cpp +++ b/src/openrct2-ui/windows/EditorBottomToolbar.cpp @@ -110,8 +110,8 @@ rct_window* window_editor_bottom_toolbar_open() WC_BOTTOM_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_NO_BACKGROUND); window->widgets = window_editor_bottom_toolbar_widgets; - window->enabled_widgets |= (1 << WIDX_PREVIOUS_STEP_BUTTON) | (1 << WIDX_NEXT_STEP_BUTTON) | (1 << WIDX_PREVIOUS_IMAGE) - | (1 << WIDX_NEXT_IMAGE); + window->enabled_widgets |= (1ULL << WIDX_PREVIOUS_STEP_BUTTON) | (1ULL << WIDX_NEXT_STEP_BUTTON) + | (1ULL << WIDX_PREVIOUS_IMAGE) | (1ULL << WIDX_NEXT_IMAGE); WindowInitScrollWidgets(window); set_all_scenery_items_invented(); diff --git a/src/openrct2-ui/windows/EditorInventionsList.cpp b/src/openrct2-ui/windows/EditorInventionsList.cpp index 911af98b0e..3c174ea59c 100644 --- a/src/openrct2-ui/windows/EditorInventionsList.cpp +++ b/src/openrct2-ui/windows/EditorInventionsList.cpp @@ -256,8 +256,8 @@ rct_window* window_editor_inventions_list_open() w = WindowCreateCentred( WW, WH, &window_editor_inventions_list_events, WC_EDITOR_INVENTION_LIST, WF_NO_SCROLLING | WF_RESIZABLE); w->widgets = window_editor_inventions_list_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RESIZE) | (1 << WIDX_TAB_1) | (1 << WIDX_RANDOM_SHUFFLE) - | (1 << WIDX_MOVE_ITEMS_TO_BOTTOM) | (1 << WIDX_MOVE_ITEMS_TO_TOP); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_RESIZE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_RANDOM_SHUFFLE) + | (1ULL << WIDX_MOVE_ITEMS_TO_BOTTOM) | (1ULL << WIDX_MOVE_ITEMS_TO_TOP); WindowInitScrollWidgets(w); w->selected_tab = 0; w->research_item = nullptr; @@ -447,8 +447,8 @@ static void window_editor_inventions_list_cursor( */ static void window_editor_inventions_list_invalidate(rct_window* w) { - w->pressed_widgets |= 1 << WIDX_PREVIEW; - w->pressed_widgets |= 1 << WIDX_TAB_1; + w->pressed_widgets |= 1ULL << WIDX_PREVIEW; + w->pressed_widgets |= 1ULL << WIDX_TAB_1; w->widgets[WIDX_CLOSE].type = gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR ? WindowWidgetType::Empty : WindowWidgetType::CloseBox; diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index 3500bfd8fa..49c8d55388 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -382,9 +382,9 @@ rct_window* window_editor_object_selection_open() window->widgets = _window_editor_object_selection_widgets.data(); window->widgets[WIDX_FILTER_TEXT_BOX].string = _filter_string; - window->enabled_widgets = (1 << WIDX_ADVANCED) | (1 << WIDX_INSTALL_TRACK) | (1 << WIDX_FILTER_DROPDOWN) - | (1 << WIDX_FILTER_TEXT_BOX) | (1 << WIDX_FILTER_CLEAR_BUTTON) | (1 << WIDX_CLOSE) | (1 << WIDX_LIST_SORT_TYPE) - | (1UL << WIDX_LIST_SORT_RIDE); + window->enabled_widgets = (1ULL << WIDX_ADVANCED) | (1ULL << WIDX_INSTALL_TRACK) | (1ULL << WIDX_FILTER_DROPDOWN) + | (1ULL << WIDX_FILTER_TEXT_BOX) | (1ULL << WIDX_FILTER_CLEAR_BUTTON) | (1ULL << WIDX_CLOSE) + | (1ULL << WIDX_LIST_SORT_TYPE) | (1UL << WIDX_LIST_SORT_RIDE); _filter_flags = gConfigInterface.object_selection_filter_flags; std::fill_n(_filter_string, sizeof(_filter_string), 0x00); @@ -806,12 +806,12 @@ static void window_editor_object_selection_invalidate(rct_window* w) w->widgets[WIDX_FILTER_DROPDOWN].right = w->width - 137; // Set pressed widgets - w->pressed_widgets |= 1 << WIDX_PREVIEW; + w->pressed_widgets |= 1ULL << WIDX_PREVIEW; window_editor_object_selection_set_pressed_tab(w); if (w->list_information_type & 1) - w->pressed_widgets |= (1 << WIDX_ADVANCED); + w->pressed_widgets |= (1ULL << WIDX_ADVANCED); else - w->pressed_widgets &= ~(1 << WIDX_ADVANCED); + w->pressed_widgets &= ~(1ULL << WIDX_ADVANCED); // Set window title and buttons auto ft = Formatter::Common(); @@ -885,15 +885,16 @@ static void window_editor_object_selection_invalidate(rct_window* w) if (ridePage) { - w->enabled_widgets |= (1 << WIDX_FILTER_RIDE_TAB_ALL) | (1 << WIDX_FILTER_RIDE_TAB_TRANSPORT) - | (1 << WIDX_FILTER_RIDE_TAB_GENTLE) | (1 << WIDX_FILTER_RIDE_TAB_COASTER) | (1 << WIDX_FILTER_RIDE_TAB_THRILL) - | (1 << WIDX_FILTER_RIDE_TAB_WATER) | (1 << WIDX_FILTER_RIDE_TAB_STALL); + w->enabled_widgets |= (1ULL << WIDX_FILTER_RIDE_TAB_ALL) | (1ULL << WIDX_FILTER_RIDE_TAB_TRANSPORT) + | (1ULL << WIDX_FILTER_RIDE_TAB_GENTLE) | (1ULL << WIDX_FILTER_RIDE_TAB_COASTER) + | (1ULL << WIDX_FILTER_RIDE_TAB_THRILL) | (1ULL << WIDX_FILTER_RIDE_TAB_WATER) + | (1ULL << WIDX_FILTER_RIDE_TAB_STALL); for (int32_t i = 0; i < 7; i++) w->pressed_widgets &= ~(1 << (WIDX_FILTER_RIDE_TAB_ALL + i)); if ((_filter_flags & FILTER_RIDES) == FILTER_RIDES) - w->pressed_widgets |= (1 << WIDX_FILTER_RIDE_TAB_ALL); + w->pressed_widgets |= (1ULL << WIDX_FILTER_RIDE_TAB_ALL); else { for (int32_t i = 0; i < 6; i++) @@ -926,9 +927,10 @@ static void window_editor_object_selection_invalidate(rct_window* w) else { w->enabled_widgets &= ~( - (1 << WIDX_FILTER_RIDE_TAB_ALL) | (1 << WIDX_FILTER_RIDE_TAB_TRANSPORT) | (1 << WIDX_FILTER_RIDE_TAB_GENTLE) - | (1 << WIDX_FILTER_RIDE_TAB_COASTER) | (1 << WIDX_FILTER_RIDE_TAB_THRILL) | (1 << WIDX_FILTER_RIDE_TAB_WATER) - | (1 << WIDX_FILTER_RIDE_TAB_STALL)); + (1ULL << WIDX_FILTER_RIDE_TAB_ALL) | (1ULL << WIDX_FILTER_RIDE_TAB_TRANSPORT) + | (1ULL << WIDX_FILTER_RIDE_TAB_GENTLE) | (1ULL << WIDX_FILTER_RIDE_TAB_COASTER) + | (1ULL << WIDX_FILTER_RIDE_TAB_THRILL) | (1ULL << WIDX_FILTER_RIDE_TAB_WATER) + | (1ULL << WIDX_FILTER_RIDE_TAB_STALL)); for (int32_t i = WIDX_FILTER_RIDE_TAB_FRAME; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) w->widgets[i].type = WindowWidgetType::Empty; diff --git a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp index d958afc4d4..3d8dc31727 100644 --- a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp +++ b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp @@ -176,31 +176,31 @@ static rct_window_event_list *window_editor_objective_options_page_events[] = { #pragma region Enabled widgets static uint64_t window_editor_objective_options_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_OBJECTIVE) | - (1 << WIDX_OBJECTIVE_DROPDOWN) | - (1 << WIDX_OBJECTIVE_ARG_1_INCREASE) | - (1 << WIDX_OBJECTIVE_ARG_1_DECREASE) | - (1 << WIDX_OBJECTIVE_ARG_2_INCREASE) | - (1 << WIDX_OBJECTIVE_ARG_2_DECREASE) | - (1 << WIDX_PARK_NAME) | - (1 << WIDX_SCENARIO_NAME) | - (1 << WIDX_CATEGORY) | - (1 << WIDX_CATEGORY_DROPDOWN) | - (1 << WIDX_DETAILS), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_OBJECTIVE) | + (1ULL << WIDX_OBJECTIVE_DROPDOWN) | + (1ULL << WIDX_OBJECTIVE_ARG_1_INCREASE) | + (1ULL << WIDX_OBJECTIVE_ARG_1_DECREASE) | + (1ULL << WIDX_OBJECTIVE_ARG_2_INCREASE) | + (1ULL << WIDX_OBJECTIVE_ARG_2_DECREASE) | + (1ULL << WIDX_PARK_NAME) | + (1ULL << WIDX_SCENARIO_NAME) | + (1ULL << WIDX_CATEGORY) | + (1ULL << WIDX_CATEGORY_DROPDOWN) | + (1ULL << WIDX_DETAILS), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) }; static uint64_t window_editor_objective_options_page_hold_down_widgets[] = { - (1 << WIDX_OBJECTIVE_ARG_1_INCREASE) | - (1 << WIDX_OBJECTIVE_ARG_1_DECREASE) | - (1 << WIDX_OBJECTIVE_ARG_2_INCREASE) | - (1 << WIDX_OBJECTIVE_ARG_2_DECREASE), + (1ULL << WIDX_OBJECTIVE_ARG_1_INCREASE) | + (1ULL << WIDX_OBJECTIVE_ARG_1_DECREASE) | + (1ULL << WIDX_OBJECTIVE_ARG_2_INCREASE) | + (1ULL << WIDX_OBJECTIVE_ARG_2_DECREASE), 0 }; @@ -270,7 +270,7 @@ static void window_editor_objective_options_draw_tab_images(rct_window* w, rct_d gfx_draw_sprite(dpi, ImageId(spriteIndex), w->windowPos + ScreenCoordsXY{ widget->left, widget->top }); // Tab 2 - if (!(w->disabled_widgets & (1 << WIDX_TAB_2))) + if (!(w->disabled_widgets & (1ULL << WIDX_TAB_2))) { widget = &w->widgets[WIDX_TAB_2]; spriteIndex = SPR_TAB_RIDE_0; @@ -1126,10 +1126,10 @@ static void window_editor_objective_options_update_disabled_widgets(rct_window* const auto& rideManager = GetRideManager(); if (std::any_of(rideManager.begin(), rideManager.end(), [](const Ride& ride) { return ride.IsRide(); })) { - w->disabled_widgets &= ~(1 << WIDX_TAB_2); + w->disabled_widgets &= ~(1ULL << WIDX_TAB_2); } else { - w->disabled_widgets |= (1 << WIDX_TAB_2); + w->disabled_widgets |= (1ULL << WIDX_TAB_2); } } diff --git a/src/openrct2-ui/windows/EditorScenarioOptions.cpp b/src/openrct2-ui/windows/EditorScenarioOptions.cpp index 28e2360159..acea2a32ee 100644 --- a/src/openrct2-ui/windows/EditorScenarioOptions.cpp +++ b/src/openrct2-ui/windows/EditorScenarioOptions.cpp @@ -639,13 +639,13 @@ static void window_editor_scenario_options_financial_invalidate(rct_window* w) if (((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && (gParkFlags & PARK_FLAGS_NO_MONEY_SCENARIO)) || (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && (gParkFlags & PARK_FLAGS_NO_MONEY))) { - w->pressed_widgets |= (1 << WIDX_NO_MONEY); + w->pressed_widgets |= (1ULL << WIDX_NO_MONEY); for (int32_t i = WIDX_INITIAL_CASH; i <= WIDX_FORBID_MARKETING; i++) w->widgets[i].type = WindowWidgetType::Empty; } else { - w->pressed_widgets &= ~(1 << WIDX_NO_MONEY); + w->pressed_widgets &= ~(1ULL << WIDX_NO_MONEY); w->widgets[WIDX_INITIAL_CASH].type = WindowWidgetType::Spinner; w->widgets[WIDX_INITIAL_CASH_INCREASE].type = WindowWidgetType::Button; w->widgets[WIDX_INITIAL_CASH_DECREASE].type = WindowWidgetType::Button; @@ -662,9 +662,9 @@ static void window_editor_scenario_options_financial_invalidate(rct_window* w) } if (gParkFlags & PARK_FLAGS_FORBID_MARKETING_CAMPAIGN) - w->pressed_widgets |= (1 << WIDX_FORBID_MARKETING); + w->pressed_widgets |= (1ULL << WIDX_FORBID_MARKETING); else - w->pressed_widgets &= ~(1 << WIDX_FORBID_MARKETING); + w->pressed_widgets &= ~(1ULL << WIDX_FORBID_MARKETING); w->widgets[WIDX_CLOSE].type = (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) ? WindowWidgetType::Empty : WindowWidgetType::CloseBox; @@ -933,15 +933,15 @@ static void window_editor_scenario_options_guests_invalidate(rct_window* w) // Guests prefer less intense rides checkbox if (gParkFlags & PARK_FLAGS_PREF_LESS_INTENSE_RIDES) - w->pressed_widgets |= (1 << WIDX_GUEST_PREFER_LESS_INTENSE_RIDES); + w->pressed_widgets |= (1ULL << WIDX_GUEST_PREFER_LESS_INTENSE_RIDES); else - w->pressed_widgets &= ~(1 << WIDX_GUEST_PREFER_LESS_INTENSE_RIDES); + w->pressed_widgets &= ~(1ULL << WIDX_GUEST_PREFER_LESS_INTENSE_RIDES); // Guests prefer more intense rides checkbox if (gParkFlags & PARK_FLAGS_PREF_MORE_INTENSE_RIDES) - w->pressed_widgets |= (1 << WIDX_GUEST_PREFER_MORE_INTENSE_RIDES); + w->pressed_widgets |= (1ULL << WIDX_GUEST_PREFER_MORE_INTENSE_RIDES); else - w->pressed_widgets &= ~(1 << WIDX_GUEST_PREFER_MORE_INTENSE_RIDES); + w->pressed_widgets &= ~(1ULL << WIDX_GUEST_PREFER_MORE_INTENSE_RIDES); w->widgets[WIDX_CLOSE].type = (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) ? WindowWidgetType::Empty : WindowWidgetType::CloseBox; @@ -1285,22 +1285,22 @@ static void window_editor_scenario_options_park_invalidate(rct_window* w) // Set checkboxes pressedWidgets = w->pressed_widgets; - pressedWidgets &= ~(1 << WIDX_FORBID_TREE_REMOVAL); - pressedWidgets &= ~(1 << WIDX_FORBID_LANDSCAPE_CHANGES); - pressedWidgets &= ~(1 << WIDX_FORBID_HIGH_CONSTRUCTION); - pressedWidgets &= ~(1 << WIDX_HARD_PARK_RATING); - pressedWidgets &= ~(1 << WIDX_HARD_GUEST_GENERATION); + pressedWidgets &= ~(1ULL << WIDX_FORBID_TREE_REMOVAL); + pressedWidgets &= ~(1ULL << WIDX_FORBID_LANDSCAPE_CHANGES); + pressedWidgets &= ~(1ULL << WIDX_FORBID_HIGH_CONSTRUCTION); + pressedWidgets &= ~(1ULL << WIDX_HARD_PARK_RATING); + pressedWidgets &= ~(1ULL << WIDX_HARD_GUEST_GENERATION); if (gParkFlags & PARK_FLAGS_FORBID_TREE_REMOVAL) - pressedWidgets |= (1 << WIDX_FORBID_TREE_REMOVAL); + pressedWidgets |= (1ULL << WIDX_FORBID_TREE_REMOVAL); if (gParkFlags & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES) - pressedWidgets |= (1 << WIDX_FORBID_LANDSCAPE_CHANGES); + pressedWidgets |= (1ULL << WIDX_FORBID_LANDSCAPE_CHANGES); if (gParkFlags & PARK_FLAGS_FORBID_HIGH_CONSTRUCTION) - pressedWidgets |= (1 << WIDX_FORBID_HIGH_CONSTRUCTION); + pressedWidgets |= (1ULL << WIDX_FORBID_HIGH_CONSTRUCTION); if (gParkFlags & PARK_FLAGS_DIFFICULT_PARK_RATING) - pressedWidgets |= (1 << WIDX_HARD_PARK_RATING); + pressedWidgets |= (1ULL << WIDX_HARD_PARK_RATING); if (gParkFlags & PARK_FLAGS_DIFFICULT_GUEST_GENERATION) - pressedWidgets |= (1 << WIDX_HARD_GUEST_GENERATION); + pressedWidgets |= (1ULL << WIDX_HARD_GUEST_GENERATION); w->pressed_widgets = pressedWidgets; diff --git a/src/openrct2-ui/windows/Footpath.cpp b/src/openrct2-ui/windows/Footpath.cpp index d72c857dd7..59d06ab692 100644 --- a/src/openrct2-ui/windows/Footpath.cpp +++ b/src/openrct2-ui/windows/Footpath.cpp @@ -210,10 +210,11 @@ rct_window* window_footpath_open() window = WindowCreate(ScreenCoordsXY(0, 29), WW, WH, &window_footpath_events, WC_FOOTPATH, 0); window->widgets = window_footpath_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_FOOTPATH_TYPE) | (1 << WIDX_QUEUELINE_TYPE) - | (1 << WIDX_RAILINGS_TYPE) | (1 << WIDX_DIRECTION_NW) | (1 << WIDX_DIRECTION_NE) | (1 << WIDX_DIRECTION_SW) - | (1 << WIDX_DIRECTION_SE) | (1 << WIDX_SLOPEDOWN) | (1 << WIDX_LEVEL) | (1 << WIDX_SLOPEUP) | (1 << WIDX_CONSTRUCT) - | (1 << WIDX_REMOVE) | (1 << WIDX_CONSTRUCT_ON_LAND) | (1 << WIDX_CONSTRUCT_BRIDGE_OR_TUNNEL); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_FOOTPATH_TYPE) | (1ULL << WIDX_QUEUELINE_TYPE) + | (1ULL << WIDX_RAILINGS_TYPE) | (1ULL << WIDX_DIRECTION_NW) | (1ULL << WIDX_DIRECTION_NE) | (1ULL << WIDX_DIRECTION_SW) + | (1ULL << WIDX_DIRECTION_SE) | (1ULL << WIDX_SLOPEDOWN) | (1ULL << WIDX_LEVEL) | (1ULL << WIDX_SLOPEUP) + | (1ULL << WIDX_CONSTRUCT) | (1ULL << WIDX_REMOVE) | (1ULL << WIDX_CONSTRUCT_ON_LAND) + | (1ULL << WIDX_CONSTRUCT_BRIDGE_OR_TUNNEL); WindowInitScrollWidgets(window); window_push_others_right(window); @@ -566,9 +567,9 @@ static void window_footpath_update(rct_window* w) static void window_footpath_invalidate(rct_window* w) { // Press / unpress footpath and queue type buttons - w->pressed_widgets &= ~(1 << WIDX_FOOTPATH_TYPE); - w->pressed_widgets &= ~(1 << WIDX_QUEUELINE_TYPE); - w->pressed_widgets |= gFootpathSelection.IsQueueSelected ? (1 << WIDX_QUEUELINE_TYPE) : (1 << WIDX_FOOTPATH_TYPE); + w->pressed_widgets &= ~(1ULL << WIDX_FOOTPATH_TYPE); + w->pressed_widgets &= ~(1ULL << WIDX_QUEUELINE_TYPE); + w->pressed_widgets |= gFootpathSelection.IsQueueSelected ? (1ULL << WIDX_QUEUELINE_TYPE) : (1ULL << WIDX_FOOTPATH_TYPE); // Enable / disable construct button window_footpath_widgets[WIDX_CONSTRUCT].type = _footpathConstructionMode == PATH_CONSTRUCTION_MODE_BRIDGE_OR_TUNNEL @@ -638,7 +639,7 @@ static void window_footpath_paint(rct_window* w, rct_drawpixelinfo* dpi) ScreenCoordsXY screenCoords; WindowDrawWidgets(w, dpi); - if (!(w->disabled_widgets & (1 << WIDX_CONSTRUCT))) + if (!(w->disabled_widgets & (1ULL << WIDX_CONSTRUCT))) { // Get construction image uint8_t direction = (_footpathConstructDirection + get_current_rotation()) % 4; @@ -1325,23 +1326,23 @@ static void window_footpath_set_enabled_and_pressed_widgets() int32_t slope = gFootpathConstructSlope; if (slope == TILE_ELEMENT_SLOPE_SE_SIDE_UP) { - pressedWidgets |= (1 << WIDX_SLOPEDOWN); + pressedWidgets |= (1ULL << WIDX_SLOPEDOWN); } else if (slope == TILE_ELEMENT_SLOPE_FLAT) { - pressedWidgets |= (1 << WIDX_LEVEL); + pressedWidgets |= (1ULL << WIDX_LEVEL); } else { - pressedWidgets |= (1 << WIDX_SLOPEUP); + pressedWidgets |= (1ULL << WIDX_SLOPEUP); } // Enable / disable directional widgets direction = _footpathConstructValidDirections; if (direction != INVALID_DIRECTION) { - disabledWidgets |= (1 << WIDX_DIRECTION_NW) | (1 << WIDX_DIRECTION_NE) | (1 << WIDX_DIRECTION_SW) - | (1 << WIDX_DIRECTION_SE); + disabledWidgets |= (1ULL << WIDX_DIRECTION_NW) | (1ULL << WIDX_DIRECTION_NE) | (1ULL << WIDX_DIRECTION_SW) + | (1ULL << WIDX_DIRECTION_SE); direction = (direction + currentRotation) & 3; disabledWidgets &= ~(1 << (WIDX_DIRECTION_NW + direction)); @@ -1350,9 +1351,9 @@ static void window_footpath_set_enabled_and_pressed_widgets() else { // Disable all bridge mode widgets - disabledWidgets |= (1 << WIDX_DIRECTION_GROUP) | (1 << WIDX_DIRECTION_NW) | (1 << WIDX_DIRECTION_NE) - | (1 << WIDX_DIRECTION_SW) | (1 << WIDX_DIRECTION_SE) | (1 << WIDX_SLOPE_GROUP) | (1 << WIDX_SLOPEDOWN) - | (1 << WIDX_LEVEL) | (1 << WIDX_SLOPEUP) | (1 << WIDX_CONSTRUCT) | (1 << WIDX_REMOVE); + disabledWidgets |= (1ULL << WIDX_DIRECTION_GROUP) | (1ULL << WIDX_DIRECTION_NW) | (1ULL << WIDX_DIRECTION_NE) + | (1ULL << WIDX_DIRECTION_SW) | (1ULL << WIDX_DIRECTION_SE) | (1ULL << WIDX_SLOPE_GROUP) | (1ULL << WIDX_SLOPEDOWN) + | (1ULL << WIDX_LEVEL) | (1ULL << WIDX_SLOPEUP) | (1ULL << WIDX_CONSTRUCT) | (1ULL << WIDX_REMOVE); } w->pressed_widgets = pressedWidgets; diff --git a/src/openrct2-ui/windows/GameBottomToolbar.cpp b/src/openrct2-ui/windows/GameBottomToolbar.cpp index 709278e9de..26e35e8d90 100644 --- a/src/openrct2-ui/windows/GameBottomToolbar.cpp +++ b/src/openrct2-ui/windows/GameBottomToolbar.cpp @@ -116,9 +116,9 @@ rct_window* window_game_bottom_toolbar_open() ScreenCoordsXY(0, screenHeight - toolbar_height), screenWidth, toolbar_height, &window_game_bottom_toolbar_events, WC_BOTTOM_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_NO_BACKGROUND); window->widgets = window_game_bottom_toolbar_widgets; - window->enabled_widgets |= (1 << WIDX_LEFT_OUTSET) | (1 << WIDX_MONEY) | (1 << WIDX_GUESTS) | (1 << WIDX_PARK_RATING) - | (1 << WIDX_MIDDLE_OUTSET) | (1 << WIDX_MIDDLE_INSET) | (1 << WIDX_NEWS_SUBJECT) | (1 << WIDX_NEWS_LOCATE) - | (1 << WIDX_RIGHT_OUTSET) | (1 << WIDX_DATE); + window->enabled_widgets |= (1ULL << WIDX_LEFT_OUTSET) | (1ULL << WIDX_MONEY) | (1ULL << WIDX_GUESTS) + | (1ULL << WIDX_PARK_RATING) | (1ULL << WIDX_MIDDLE_OUTSET) | (1ULL << WIDX_MIDDLE_INSET) | (1ULL << WIDX_NEWS_SUBJECT) + | (1ULL << WIDX_NEWS_LOCATE) | (1ULL << WIDX_RIGHT_OUTSET) | (1ULL << WIDX_DATE); window->frame_no = 0; WindowInitScrollWidgets(window); @@ -309,25 +309,25 @@ static void window_game_bottom_toolbar_invalidate(rct_window* w) window_game_bottom_toolbar_widgets[WIDX_NEWS_LOCATE].type = WindowWidgetType::FlatBtn; window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].colour = 2; window_game_bottom_toolbar_widgets[WIDX_MIDDLE_INSET].colour = 2; - w->disabled_widgets &= ~(1 << WIDX_NEWS_SUBJECT); - w->disabled_widgets &= ~(1 << WIDX_NEWS_LOCATE); + w->disabled_widgets &= ~(1ULL << WIDX_NEWS_SUBJECT); + w->disabled_widgets &= ~(1ULL << WIDX_NEWS_LOCATE); // Find out if the news item is no longer valid auto subjectLoc = News::GetSubjectLocation(newsItem->Type, newsItem->Assoc); if (subjectLoc == std::nullopt) - w->disabled_widgets |= (1 << WIDX_NEWS_LOCATE); + w->disabled_widgets |= (1ULL << WIDX_NEWS_LOCATE); if (!(newsItem->TypeHasSubject())) { - w->disabled_widgets |= (1 << WIDX_NEWS_SUBJECT); + w->disabled_widgets |= (1ULL << WIDX_NEWS_SUBJECT); window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].type = WindowWidgetType::Empty; } if (newsItem->HasButton()) { - w->disabled_widgets |= (1 << WIDX_NEWS_SUBJECT); - w->disabled_widgets |= (1 << WIDX_NEWS_LOCATE); + w->disabled_widgets |= (1ULL << WIDX_NEWS_SUBJECT); + w->disabled_widgets |= (1ULL << WIDX_NEWS_LOCATE); } } } diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index 370f9a813a..47041235f1 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -270,73 +270,73 @@ void window_guest_set_colours(); // 0x981D3C static constexpr const uint32_t window_guest_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7) | - (1 << WIDX_RENAME)| - (1 << WIDX_PICKUP)| - (1 << WIDX_LOCATE)| - (1 << WIDX_TRACK), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7) | + (1ULL << WIDX_RENAME)| + (1ULL << WIDX_PICKUP)| + (1ULL << WIDX_LOCATE)| + (1ULL << WIDX_TRACK), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7) | - (1 << WIDX_RIDE_SCROLL), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7) | + (1ULL << WIDX_RIDE_SCROLL), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7) + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7) }; static constexpr const rct_size16 window_guest_page_sizes[][2] = { @@ -489,22 +489,22 @@ void window_guest_disable_widgets(rct_window* w) if (peep->CanBePickedUp()) { - if (w->disabled_widgets & (1 << WIDX_PICKUP)) + if (w->disabled_widgets & (1ULL << WIDX_PICKUP)) w->Invalidate(); } else { - disabled_widgets = (1 << WIDX_PICKUP); - if (!(w->disabled_widgets & (1 << WIDX_PICKUP))) + disabled_widgets = (1ULL << WIDX_PICKUP); + if (!(w->disabled_widgets & (1ULL << WIDX_PICKUP))) w->Invalidate(); } if (gParkFlags & PARK_FLAGS_NO_MONEY) { - disabled_widgets |= (1 << WIDX_TAB_4); // Disable finance tab if no money + disabled_widgets |= (1ULL << WIDX_TAB_4); // Disable finance tab if no money } if (!gConfigGeneral.debugging_tools) { - disabled_widgets |= (1 << WIDX_TAB_7); // Disable debug tab when debug tools not turned on + disabled_widgets |= (1ULL << WIDX_TAB_7); // Disable debug tab when debug tools not turned on } w->disabled_widgets = disabled_widgets; } @@ -731,7 +731,7 @@ void window_guest_viewport_init(rct_window* w) */ static void window_guest_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_1)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_1)) return; rct_widget* widget = &w->widgets[WIDX_TAB_1]; @@ -803,7 +803,7 @@ static void window_guest_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dp */ static void window_guest_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_2)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_2)) return; rct_widget* widget = &w->widgets[WIDX_TAB_2]; @@ -841,7 +841,7 @@ static void window_guest_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) */ static void window_guest_rides_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_3)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_3)) return; rct_widget* widget = &w->widgets[WIDX_TAB_3]; @@ -863,7 +863,7 @@ static void window_guest_rides_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) */ static void window_guest_finance_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_4)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_4)) return; rct_widget* widget = &w->widgets[WIDX_TAB_4]; @@ -885,7 +885,7 @@ static void window_guest_finance_tab_paint(rct_window* w, rct_drawpixelinfo* dpi */ static void window_guest_thoughts_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_5)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_5)) return; rct_widget* widget = &w->widgets[WIDX_TAB_5]; @@ -907,7 +907,7 @@ static void window_guest_thoughts_tab_paint(rct_window* w, rct_drawpixelinfo* dp */ static void window_guest_inventory_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_6)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_6)) return; rct_widget* widget = &w->widgets[WIDX_TAB_6]; @@ -918,7 +918,7 @@ static void window_guest_inventory_tab_paint(rct_window* w, rct_drawpixelinfo* d static void window_guest_debug_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_7)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_7)) return; rct_widget* widget = &w->widgets[WIDX_TAB_7]; @@ -1028,10 +1028,10 @@ void window_guest_overview_invalidate(rct_window* w) { return; } - w->pressed_widgets &= ~(1 << WIDX_TRACK); + w->pressed_widgets &= ~(1ULL << WIDX_TRACK); if (peep->PeepFlags & PEEP_FLAGS_TRACKING) { - w->pressed_widgets |= (1 << WIDX_TRACK); + w->pressed_widgets |= (1ULL << WIDX_TRACK); } window_guest_overview_widgets[WIDX_VIEWPORT].right = w->width - 26; diff --git a/src/openrct2-ui/windows/GuestList.cpp b/src/openrct2-ui/windows/GuestList.cpp index 8fe69021d3..35b18e76e2 100644 --- a/src/openrct2-ui/windows/GuestList.cpp +++ b/src/openrct2-ui/windows/GuestList.cpp @@ -151,9 +151,9 @@ public: void OnOpen() override { widgets = window_guest_list_widgets; - enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_PAGE_DROPDOWN) | (1 << WIDX_PAGE_DROPDOWN_BUTTON) - | (1 << WIDX_INFO_TYPE_DROPDOWN) | (1 << WIDX_INFO_TYPE_DROPDOWN_BUTTON) | (1 << WIDX_MAP) | (1 << WIDX_TRACKING) - | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_FILTER_BY_NAME); + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_PAGE_DROPDOWN) | (1ULL << WIDX_PAGE_DROPDOWN_BUTTON) + | (1ULL << WIDX_INFO_TYPE_DROPDOWN) | (1ULL << WIDX_INFO_TYPE_DROPDOWN_BUTTON) | (1ULL << WIDX_MAP) + | (1ULL << WIDX_TRACKING) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_FILTER_BY_NAME); WindowInitScrollWidgets(this); _selectedTab = TabId::Individual; diff --git a/src/openrct2-ui/windows/InstallTrack.cpp b/src/openrct2-ui/windows/InstallTrack.cpp index bfed61adc8..72e69131bc 100644 --- a/src/openrct2-ui/windows/InstallTrack.cpp +++ b/src/openrct2-ui/windows/InstallTrack.cpp @@ -113,8 +113,8 @@ rct_window* window_install_track_open(const utf8* path) rct_window* w = WindowCreate(ScreenCoordsXY(x, y), WW, WH, &window_install_track_events, WC_INSTALL_TRACK, 0); w->widgets = window_install_track_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_ROTATE) | (1 << WIDX_TOGGLE_SCENERY) | (1 << WIDX_INSTALL) - | (1 << WIDX_CANCEL); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_ROTATE) | (1ULL << WIDX_TOGGLE_SCENERY) | (1ULL << WIDX_INSTALL) + | (1ULL << WIDX_CANCEL); WindowInitScrollWidgets(w); w->track_list.track_list_being_updated = false; window_push_others_right(w); @@ -176,14 +176,14 @@ static void window_install_track_mouseup(rct_window* w, rct_widgetindex widgetIn */ static void window_install_track_invalidate(rct_window* w) { - w->pressed_widgets |= 1 << WIDX_TRACK_PREVIEW; + w->pressed_widgets |= 1ULL << WIDX_TRACK_PREVIEW; if (!gTrackDesignSceneryToggle) { - w->pressed_widgets |= (1 << WIDX_TOGGLE_SCENERY); + w->pressed_widgets |= (1ULL << WIDX_TOGGLE_SCENERY); } else { - w->pressed_widgets &= ~(1 << WIDX_TOGGLE_SCENERY); + w->pressed_widgets &= ~(1ULL << WIDX_TOGGLE_SCENERY); } } diff --git a/src/openrct2-ui/windows/Land.cpp b/src/openrct2-ui/windows/Land.cpp index acbb5adb01..ffda0b7008 100644 --- a/src/openrct2-ui/windows/Land.cpp +++ b/src/openrct2-ui/windows/Land.cpp @@ -68,9 +68,9 @@ public: void OnOpen() override { widgets = window_land_widgets; - enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_DECREMENT) | (1 << WIDX_INCREMENT) | (1 << WIDX_FLOOR) - | (1 << WIDX_WALL) | (1 << WIDX_MOUNTAINMODE) | (1 << WIDX_PAINTMODE) | (1 << WIDX_PREVIEW); - hold_down_widgets = (1 << WIDX_DECREMENT) | (1 << WIDX_INCREMENT); + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_DECREMENT) | (1ULL << WIDX_INCREMENT) | (1ULL << WIDX_FLOOR) + | (1ULL << WIDX_WALL) | (1ULL << WIDX_MOUNTAINMODE) | (1ULL << WIDX_PAINTMODE) | (1ULL << WIDX_PREVIEW); + hold_down_widgets = (1ULL << WIDX_DECREMENT) | (1ULL << WIDX_INCREMENT); WindowInitScrollWidgets(this); window_push_others_below(this); diff --git a/src/openrct2-ui/windows/LandRights.cpp b/src/openrct2-ui/windows/LandRights.cpp index 371c66983d..93f37e93ea 100644 --- a/src/openrct2-ui/windows/LandRights.cpp +++ b/src/openrct2-ui/windows/LandRights.cpp @@ -94,14 +94,14 @@ rct_window* window_land_rights_open() window = WindowCreate(ScreenCoordsXY(context_get_width() - 98, 29), 98, 94, &window_land_rights_events, WC_LAND_RIGHTS, 0); window->widgets = window_land_rights_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_DECREMENT) | (1 << WIDX_INCREMENT) | (1 << WIDX_PREVIEW) - | (1 << WIDX_BUY_LAND_RIGHTS) | (1 << WIDX_BUY_CONSTRUCTION_RIGHTS); - window->hold_down_widgets = (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_DECREMENT) | (1ULL << WIDX_INCREMENT) + | (1ULL << WIDX_PREVIEW) | (1ULL << WIDX_BUY_LAND_RIGHTS) | (1ULL << WIDX_BUY_CONSTRUCTION_RIGHTS); + window->hold_down_widgets = (1ULL << WIDX_INCREMENT) | (1ULL << WIDX_DECREMENT); WindowInitScrollWidgets(window); window_push_others_below(window); _landRightsMode = LAND_RIGHTS_MODE_BUY_LAND; - window->pressed_widgets = (1 << WIDX_BUY_LAND_RIGHTS); + window->pressed_widgets = (1ULL << WIDX_BUY_LAND_RIGHTS); gLandToolSize = 1; @@ -219,10 +219,10 @@ static void window_land_rights_update(rct_window* w) static void window_land_rights_invalidate(rct_window* w) { // Set the preview image button to be pressed down - w->pressed_widgets |= (1 << WIDX_PREVIEW) - | (1 << ((_landRightsMode == LAND_RIGHTS_MODE_BUY_LAND) ? WIDX_BUY_LAND_RIGHTS : WIDX_BUY_CONSTRUCTION_RIGHTS)); + w->pressed_widgets |= (1ULL << WIDX_PREVIEW) + | (1ULL << ((_landRightsMode == LAND_RIGHTS_MODE_BUY_LAND) ? WIDX_BUY_LAND_RIGHTS : WIDX_BUY_CONSTRUCTION_RIGHTS)); w->pressed_widgets &= ~( - 1 + 1ULL << ((_landRightsMode == LAND_RIGHTS_MODE_BUY_CONSTRUCTION_RIGHTS) ? WIDX_BUY_LAND_RIGHTS : WIDX_BUY_CONSTRUCTION_RIGHTS)); @@ -232,23 +232,23 @@ static void window_land_rights_invalidate(rct_window* w) // Disable ownership and/or construction buying functions if there are no tiles left for sale if (gLandRemainingOwnershipSales == 0) { - w->disabled_widgets |= (1 << WIDX_BUY_LAND_RIGHTS); + w->disabled_widgets |= (1ULL << WIDX_BUY_LAND_RIGHTS); window_land_rights_widgets[WIDX_BUY_LAND_RIGHTS].tooltip = STR_NO_LAND_RIGHTS_FOR_SALE_TIP; } else { - w->disabled_widgets &= ~(1 << WIDX_BUY_LAND_RIGHTS); + w->disabled_widgets &= ~(1ULL << WIDX_BUY_LAND_RIGHTS); window_land_rights_widgets[WIDX_BUY_LAND_RIGHTS].tooltip = STR_BUY_LAND_RIGHTS_TIP; } if (gLandRemainingConstructionSales == 0) { - w->disabled_widgets |= (1 << WIDX_BUY_CONSTRUCTION_RIGHTS); + w->disabled_widgets |= (1ULL << WIDX_BUY_CONSTRUCTION_RIGHTS); window_land_rights_widgets[WIDX_BUY_CONSTRUCTION_RIGHTS].tooltip = STR_NO_CONSTRUCTION_RIGHTS_FOR_SALE_TIP; } else { - w->disabled_widgets &= ~(1 << WIDX_BUY_CONSTRUCTION_RIGHTS); + w->disabled_widgets &= ~(1ULL << WIDX_BUY_CONSTRUCTION_RIGHTS); window_land_rights_widgets[WIDX_BUY_CONSTRUCTION_RIGHTS].tooltip = STR_BUY_CONSTRUCTION_RIGHTS_TIP; } } diff --git a/src/openrct2-ui/windows/LoadSave.cpp b/src/openrct2-ui/windows/LoadSave.cpp index 15254b1f11..abd026698b 100644 --- a/src/openrct2-ui/windows/LoadSave.cpp +++ b/src/openrct2-ui/windows/LoadSave.cpp @@ -265,8 +265,8 @@ rct_window* window_loadsave_open( { w = WindowCreateCentred(WW, WH, &window_loadsave_events, WC_LOADSAVE, WF_STICK_TO_FRONT | WF_RESIZABLE); w->widgets = window_loadsave_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_UP) | (1 << WIDX_NEW_FOLDER) | (1 << WIDX_NEW_FILE) - | (1 << WIDX_SORT_NAME) | (1 << WIDX_SORT_DATE) | (1 << WIDX_BROWSE) | (1 << WIDX_DEFAULT); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_UP) | (1ULL << WIDX_NEW_FOLDER) | (1ULL << WIDX_NEW_FILE) + | (1ULL << WIDX_SORT_NAME) | (1ULL << WIDX_SORT_DATE) | (1ULL << WIDX_BROWSE) | (1ULL << WIDX_DEFAULT); w->min_width = WW; w->min_height = WH / 2; @@ -275,8 +275,8 @@ rct_window* window_loadsave_open( if (!hasFilePicker) { - w->enabled_widgets &= ~(1 << WIDX_BROWSE); - w->disabled_widgets |= (1 << WIDX_BROWSE); + w->enabled_widgets &= ~(1ULL << WIDX_BROWSE); + w->disabled_widgets |= (1ULL << WIDX_BROWSE); window_loadsave_widgets[WIDX_BROWSE].type = WindowWidgetType::Empty; } } @@ -834,7 +834,7 @@ static void window_loadsave_populate_list(rct_window* w, int32_t includeNewItem, if (str_is_null_or_empty(directory) && drives) { // List Windows drives - w->disabled_widgets |= (1 << WIDX_NEW_FILE) | (1 << WIDX_NEW_FOLDER) | (1 << WIDX_UP); + w->disabled_widgets |= (1ULL << WIDX_NEW_FILE) | (1ULL << WIDX_NEW_FOLDER) | (1ULL << WIDX_UP); for (int32_t x = 0; x < 26; x++) { if (drives & (1 << x)) @@ -878,13 +878,13 @@ static void window_loadsave_populate_list(rct_window* w, int32_t includeNewItem, // Disable the Up button if the current directory is the root directory if (str_is_null_or_empty(_parentDirectory) && !drives) - w->disabled_widgets |= (1 << WIDX_UP); + w->disabled_widgets |= (1ULL << WIDX_UP); else - w->disabled_widgets &= ~(1 << WIDX_UP); + w->disabled_widgets &= ~(1ULL << WIDX_UP); // Re-enable the "new" buttons if these were disabled - w->disabled_widgets &= ~(1 << WIDX_NEW_FILE); - w->disabled_widgets &= ~(1 << WIDX_NEW_FOLDER); + w->disabled_widgets &= ~(1ULL << WIDX_NEW_FILE); + w->disabled_widgets &= ~(1ULL << WIDX_NEW_FOLDER); // List all directories auto subDirectories = Path::GetDirectories(absoluteDirectory); @@ -1161,7 +1161,7 @@ static rct_window* window_overwrite_prompt_open(const char* name, const char* pa w = WindowCreateCentred( OVERWRITE_WW, OVERWRITE_WH, &window_overwrite_prompt_events, WC_LOADSAVE_OVERWRITE_PROMPT, WF_STICK_TO_FRONT); w->widgets = window_overwrite_prompt_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_OVERWRITE_CANCEL) | (1 << WIDX_OVERWRITE_OVERWRITE); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_OVERWRITE_CANCEL) | (1ULL << WIDX_OVERWRITE_OVERWRITE); WindowInitScrollWidgets(w); diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index 63d8e37c8b..ecaf8085df 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -238,15 +238,16 @@ rct_window* window_map_open() w = WindowCreateAutoPos(245, 259, &window_map_events, WC_MAP, WF_10); w->widgets = window_map_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_PEOPLE_TAB) | (1 << WIDX_RIDES_TAB) | (1 << WIDX_MAP_SIZE_SPINNER) - | (1 << WIDX_MAP_SIZE_SPINNER_UP) | (1 << WIDX_MAP_SIZE_SPINNER_DOWN) | (1 << WIDX_LAND_TOOL) - | (1 << WIDX_LAND_TOOL_SMALLER) | (1 << WIDX_LAND_TOOL_LARGER) | (1 << WIDX_SET_LAND_RIGHTS) - | (1 << WIDX_LAND_OWNED_CHECKBOX) | (1 << WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX) | (1 << WIDX_LAND_SALE_CHECKBOX) - | (1 << WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX) | (1 << WIDX_BUILD_PARK_ENTRANCE) | (1 << WIDX_ROTATE_90) - | (1 << WIDX_PEOPLE_STARTING_POSITION) | (1 << WIDX_MAP_GENERATOR); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_PEOPLE_TAB) | (1ULL << WIDX_RIDES_TAB) + | (1ULL << WIDX_MAP_SIZE_SPINNER) | (1ULL << WIDX_MAP_SIZE_SPINNER_UP) | (1ULL << WIDX_MAP_SIZE_SPINNER_DOWN) + | (1ULL << WIDX_LAND_TOOL) | (1ULL << WIDX_LAND_TOOL_SMALLER) | (1ULL << WIDX_LAND_TOOL_LARGER) + | (1ULL << WIDX_SET_LAND_RIGHTS) | (1ULL << WIDX_LAND_OWNED_CHECKBOX) + | (1ULL << WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX) | (1ULL << WIDX_LAND_SALE_CHECKBOX) + | (1ULL << WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX) | (1ULL << WIDX_BUILD_PARK_ENTRANCE) | (1ULL << WIDX_ROTATE_90) + | (1ULL << WIDX_PEOPLE_STARTING_POSITION) | (1ULL << WIDX_MAP_GENERATOR); - w->hold_down_widgets = (1 << WIDX_MAP_SIZE_SPINNER_UP) | (1 << WIDX_MAP_SIZE_SPINNER_DOWN) | (1 << WIDX_LAND_TOOL_LARGER) - | (1 << WIDX_LAND_TOOL_SMALLER); + w->hold_down_widgets = (1ULL << WIDX_MAP_SIZE_SPINNER_UP) | (1ULL << WIDX_MAP_SIZE_SPINNER_DOWN) + | (1ULL << WIDX_LAND_TOOL_LARGER) | (1ULL << WIDX_LAND_TOOL_SMALLER); WindowInitScrollWidgets(w); @@ -694,16 +695,16 @@ static void window_map_invalidate(rct_window* w) pressedWidgets |= (1ULL << WIDX_LAND_TOOL); if (_activeTool & (1 << 3)) - pressedWidgets |= (1 << WIDX_LAND_SALE_CHECKBOX); + pressedWidgets |= (1ULL << WIDX_LAND_SALE_CHECKBOX); if (_activeTool & (1 << 2)) - pressedWidgets |= (1 << WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX); + pressedWidgets |= (1ULL << WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX); if (_activeTool & (1 << 1)) - pressedWidgets |= (1 << WIDX_LAND_OWNED_CHECKBOX); + pressedWidgets |= (1ULL << WIDX_LAND_OWNED_CHECKBOX); if (_activeTool & (1 << 0)) - pressedWidgets |= (1 << WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX); + pressedWidgets |= (1ULL << WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX); w->pressed_widgets = pressedWidgets; @@ -1570,7 +1571,7 @@ static void map_window_set_pixels(rct_window* w) for (int32_t i = 0; i < MAXIMUM_MAP_SIZE_TECHNICAL; i++) { - if (x > 0 && y > 0 && x < GetMapSizeUnits() && y < GetMapSizeUnits()) + if (!map_is_edge({ x, y })) { switch (w->selected_tab) { diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 499e169424..bb4595a14d 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -779,9 +779,9 @@ static void window_mapgen_random_invalidate(rct_window* w) w->pressed_widgets = 0; if (_randomTerrain) - w->pressed_widgets |= 1 << WIDX_RANDOM_TERRAIN; + w->pressed_widgets |= 1ULL << WIDX_RANDOM_TERRAIN; if (_placeTrees) - w->pressed_widgets |= 1 << WIDX_RANDOM_PLACE_TREES; + w->pressed_widgets |= 1ULL << WIDX_RANDOM_PLACE_TREES; window_mapgen_set_pressed_tab(w); } diff --git a/src/openrct2-ui/windows/Multiplayer.cpp b/src/openrct2-ui/windows/Multiplayer.cpp index f7b5566e3c..95bf461411 100644 --- a/src/openrct2-ui/windows/Multiplayer.cpp +++ b/src/openrct2-ui/windows/Multiplayer.cpp @@ -111,10 +111,10 @@ static rct_widget *window_multiplayer_page_widgets[] = { }; static constexpr const uint64_t window_multiplayer_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_TAB3) | (1 << WIDX_TAB4), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_TAB3) | (1 << WIDX_TAB4), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_TAB3) | (1 << WIDX_TAB4) | (1 << WIDX_DEFAULT_GROUP) | (1 << WIDX_DEFAULT_GROUP_DROPDOWN) | (1 << WIDX_ADD_GROUP) | (1 << WIDX_REMOVE_GROUP) | (1 << WIDX_RENAME_GROUP) | (1 << WIDX_SELECTED_GROUP) | (1 << WIDX_SELECTED_GROUP_DROPDOWN), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_TAB3) | (1 << WIDX_TAB4) | (1 << WIDX_LOG_CHAT_CHECKBOX) | (1 << WIDX_LOG_SERVER_ACTIONS_CHECKBOX) | (1 << WIDX_KNOWN_KEYS_ONLY_CHECKBOX), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB1) | (1ULL << WIDX_TAB2) | (1ULL << WIDX_TAB3) | (1ULL << WIDX_TAB4), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB1) | (1ULL << WIDX_TAB2) | (1ULL << WIDX_TAB3) | (1ULL << WIDX_TAB4), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB1) | (1ULL << WIDX_TAB2) | (1ULL << WIDX_TAB3) | (1ULL << WIDX_TAB4) | (1ULL << WIDX_DEFAULT_GROUP) | (1ULL << WIDX_DEFAULT_GROUP_DROPDOWN) | (1ULL << WIDX_ADD_GROUP) | (1ULL << WIDX_REMOVE_GROUP) | (1ULL << WIDX_RENAME_GROUP) | (1ULL << WIDX_SELECTED_GROUP) | (1ULL << WIDX_SELECTED_GROUP_DROPDOWN), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB1) | (1ULL << WIDX_TAB2) | (1ULL << WIDX_TAB3) | (1ULL << WIDX_TAB4) | (1ULL << WIDX_LOG_CHAT_CHECKBOX) | (1ULL << WIDX_LOG_SERVER_ACTIONS_CHECKBOX) | (1ULL << WIDX_KNOWN_KEYS_ONLY_CHECKBOX), }; static constexpr rct_string_id WindowMultiplayerPageTitles[] = { diff --git a/src/openrct2-ui/windows/NetworkStatus.cpp b/src/openrct2-ui/windows/NetworkStatus.cpp index af556fb4c0..5866110b8a 100644 --- a/src/openrct2-ui/windows/NetworkStatus.cpp +++ b/src/openrct2-ui/windows/NetworkStatus.cpp @@ -66,7 +66,7 @@ rct_window* window_network_status_open(const char* text, close_callback onClose) window = WindowCreateCentred(420, 90, &window_network_status_events, WC_NETWORK_STATUS, WF_10 | WF_TRANSPARENT); window->widgets = window_network_status_widgets; - window->enabled_widgets = 1 << WIDX_CLOSE; + window->enabled_widgets = 1ULL << WIDX_CLOSE; WindowInitScrollWidgets(window); window->no_list_items = 0; window->selected_list_item = -1; diff --git a/src/openrct2-ui/windows/NewCampaign.cpp b/src/openrct2-ui/windows/NewCampaign.cpp index cdd7d2e63b..3be0a7a6ed 100644 --- a/src/openrct2-ui/windows/NewCampaign.cpp +++ b/src/openrct2-ui/windows/NewCampaign.cpp @@ -150,9 +150,9 @@ public: void OnOpen() override { widgets = window_new_campaign_widgets; - 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); - hold_down_widgets = (1 << WIDX_WEEKS_INCREASE_BUTTON) | (1 << WIDX_WEEKS_DECREASE_BUTTON); + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_RIDE_DROPDOWN) | (1ULL << WIDX_RIDE_DROPDOWN_BUTTON) + | (1ULL << WIDX_WEEKS_INCREASE_BUTTON) | (1ULL << WIDX_WEEKS_DECREASE_BUTTON) | (1ULL << WIDX_START_BUTTON); + hold_down_widgets = (1ULL << WIDX_WEEKS_INCREASE_BUTTON) | (1ULL << WIDX_WEEKS_DECREASE_BUTTON); WindowInitScrollWidgets(this); } diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index 82da5cd19c..6bdcc02b25 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -429,9 +429,9 @@ rct_window* window_new_ride_open() w = WindowCreateAutoPos(WW, WH, &window_new_ride_events, WC_CONSTRUCT_RIDE, WF_10); w->widgets = window_new_ride_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) - | (1 << WIDX_TAB_5) | (1 << WIDX_TAB_6) | (1 << WIDX_TAB_7) | (1 << WIDX_LAST_DEVELOPMENT_BUTTON) - | (1 << WIDX_RESEARCH_FUNDING_BUTTON); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) + | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_TAB_5) | (1ULL << WIDX_TAB_6) | (1ULL << WIDX_TAB_7) + | (1ULL << WIDX_LAST_DEVELOPMENT_BUTTON) | (1ULL << WIDX_RESEARCH_FUNDING_BUTTON); window_new_ride_populate_list(); WindowInitScrollWidgets(w); diff --git a/src/openrct2-ui/windows/News.cpp b/src/openrct2-ui/windows/News.cpp index cccbdd6056..2fa7db71f9 100644 --- a/src/openrct2-ui/windows/News.cpp +++ b/src/openrct2-ui/windows/News.cpp @@ -44,7 +44,7 @@ static rct_widget window_news_widgets[] = { class NewsWindow final : public Window { private: - int32_t _pressedNewsItemIndex, _pressedButtonIndex, _suspendUpdateTicks; + int32_t _pressedNewsItemIndex{}, _pressedButtonIndex{}, _suspendUpdateTicks{}; static int32_t CalculateItemHeight() { return 4 * font_get_line_height(FontSpriteBase::SMALL) + 2; @@ -54,7 +54,7 @@ public: void OnOpen() override { widgets = window_news_widgets; - enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_SETTINGS); + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_SETTINGS); WindowInitScrollWidgets(this); _pressedNewsItemIndex = -1; diff --git a/src/openrct2-ui/windows/NewsOptions.cpp b/src/openrct2-ui/windows/NewsOptions.cpp index c6860bd317..5c0cc4c564 100644 --- a/src/openrct2-ui/windows/NewsOptions.cpp +++ b/src/openrct2-ui/windows/NewsOptions.cpp @@ -111,7 +111,8 @@ rct_window* window_news_options_open() { window = WindowCreateCentred(400, 300, &window_news_options_events, WC_NOTIFICATION_OPTIONS, 0); window->widgets = window_news_options_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_TAB_PARK) | (1 << WIDX_TAB_RIDE) | (1 << WIDX_TAB_GUEST); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_PARK) | (1ULL << WIDX_TAB_RIDE) + | (1ULL << WIDX_TAB_GUEST); WindowInitScrollWidgets(window); window->colours[0] = COLOUR_GREY; window->colours[1] = COLOUR_LIGHT_BLUE; diff --git a/src/openrct2-ui/windows/ObjectLoadError.cpp b/src/openrct2-ui/windows/ObjectLoadError.cpp index e82c992103..af4749cad2 100644 --- a/src/openrct2-ui/windows/ObjectLoadError.cpp +++ b/src/openrct2-ui/windows/ObjectLoadError.cpp @@ -395,8 +395,8 @@ rct_window* window_object_load_error_open(utf8* path, size_t numMissingObjects, window = WindowCreateCentred(WW, WH, &window_object_load_error_events, WC_OBJECT_LOAD_ERROR, 0); window->widgets = window_object_load_error_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_COPY_CURRENT) | (1 << WIDX_COPY_ALL) - | (1 << WIDX_DOWNLOAD_ALL); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_COPY_CURRENT) | (1ULL << WIDX_COPY_ALL) + | (1ULL << WIDX_DOWNLOAD_ALL); WindowInitScrollWidgets(window); window->colours[0] = COLOUR_LIGHT_BLUE; diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index 002b34980f..55f9347c39 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -432,120 +432,120 @@ static void window_options_update_height_markers(); #pragma region Enabled Widgets #define MAIN_OPTIONS_ENABLED_WIDGETS \ - (1 << WIDX_CLOSE) | \ - (1 << WIDX_TAB_1) | \ - (1 << WIDX_TAB_2) | \ - (1 << WIDX_TAB_3) | \ - (1 << WIDX_TAB_4) | \ - (1 << WIDX_TAB_5) | \ - (1 << WIDX_TAB_6) | \ - (1 << WIDX_TAB_7) + (1ULL << WIDX_CLOSE) | \ + (1ULL << WIDX_TAB_1) | \ + (1ULL << WIDX_TAB_2) | \ + (1ULL << WIDX_TAB_3) | \ + (1ULL << WIDX_TAB_4) | \ + (1ULL << WIDX_TAB_5) | \ + (1ULL << WIDX_TAB_6) | \ + (1ULL << WIDX_TAB_7) static uint64_t window_options_page_enabled_widgets[] = { MAIN_OPTIONS_ENABLED_WIDGETS | - (1 << WIDX_RESOLUTION) | - (1 << WIDX_RESOLUTION_DROPDOWN) | - (1 << WIDX_FULLSCREEN) | - (1 << WIDX_FULLSCREEN_DROPDOWN) | - (1 << WIDX_DRAWING_ENGINE) | - (1 << WIDX_DRAWING_ENGINE_DROPDOWN) | - (1 << WIDX_UNCAP_FPS_CHECKBOX) | - (1 << WIDX_USE_VSYNC_CHECKBOX) | - (1 << WIDX_SHOW_FPS_CHECKBOX) | - (1 << WIDX_MULTITHREADING_CHECKBOX) | - (1 << WIDX_MINIMIZE_FOCUS_LOSS) | - (1 << WIDX_STEAM_OVERLAY_PAUSE) | - (1 << WIDX_DISABLE_SCREENSAVER_LOCK) | - (1 << WIDX_SCALE) | - (1 << WIDX_SCALE_UP) | - (1 << WIDX_SCALE_DOWN) | - (1 << WIDX_SCALE_QUALITY) | - (1 << WIDX_SCALE_QUALITY_DROPDOWN), + (1ULL << WIDX_RESOLUTION) | + (1ULL << WIDX_RESOLUTION_DROPDOWN) | + (1ULL << WIDX_FULLSCREEN) | + (1ULL << WIDX_FULLSCREEN_DROPDOWN) | + (1ULL << WIDX_DRAWING_ENGINE) | + (1ULL << WIDX_DRAWING_ENGINE_DROPDOWN) | + (1ULL << WIDX_UNCAP_FPS_CHECKBOX) | + (1ULL << WIDX_USE_VSYNC_CHECKBOX) | + (1ULL << WIDX_SHOW_FPS_CHECKBOX) | + (1ULL << WIDX_MULTITHREADING_CHECKBOX) | + (1ULL << WIDX_MINIMIZE_FOCUS_LOSS) | + (1ULL << WIDX_STEAM_OVERLAY_PAUSE) | + (1ULL << WIDX_DISABLE_SCREENSAVER_LOCK) | + (1ULL << WIDX_SCALE) | + (1ULL << WIDX_SCALE_UP) | + (1ULL << WIDX_SCALE_DOWN) | + (1ULL << WIDX_SCALE_QUALITY) | + (1ULL << WIDX_SCALE_QUALITY_DROPDOWN), MAIN_OPTIONS_ENABLED_WIDGETS | - (1 << WIDX_TILE_SMOOTHING_CHECKBOX) | - (1 << WIDX_GRIDLINES_CHECKBOX) | - (1 << WIDX_UPPER_CASE_BANNERS_CHECKBOX) | - (1 << WIDX_SHOW_GUEST_PURCHASES_CHECKBOX) | - (1 << WIDX_TRANSPARENT_SCREENSHOTS_CHECKBOX) | - (1 << WIDX_VIRTUAL_FLOOR) | - (1 << WIDX_VIRTUAL_FLOOR_DROPDOWN) | - (1 << WIDX_DAY_NIGHT_CHECKBOX) | - (1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX) | - (1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX) | - (1 << WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX) | - (1 << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX), + (1ULL << WIDX_TILE_SMOOTHING_CHECKBOX) | + (1ULL << WIDX_GRIDLINES_CHECKBOX) | + (1ULL << WIDX_UPPER_CASE_BANNERS_CHECKBOX) | + (1ULL << WIDX_SHOW_GUEST_PURCHASES_CHECKBOX) | + (1ULL << WIDX_TRANSPARENT_SCREENSHOTS_CHECKBOX) | + (1ULL << WIDX_VIRTUAL_FLOOR) | + (1ULL << WIDX_VIRTUAL_FLOOR_DROPDOWN) | + (1ULL << WIDX_DAY_NIGHT_CHECKBOX) | + (1ULL << WIDX_ENABLE_LIGHT_FX_CHECKBOX) | + (1ULL << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX) | + (1ULL << WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX) | + (1ULL << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX), MAIN_OPTIONS_ENABLED_WIDGETS | - (1 << WIDX_LANGUAGE) | - (1 << WIDX_LANGUAGE_DROPDOWN) | - (1 << WIDX_CURRENCY) | - (1 << WIDX_CURRENCY_DROPDOWN) | - (1 << WIDX_DISTANCE) | - (1 << WIDX_DISTANCE_DROPDOWN) | - (1 << WIDX_TEMPERATURE) | - (1 << WIDX_TEMPERATURE_DROPDOWN) | - (1 << WIDX_HEIGHT_LABELS) | - (1 << WIDX_HEIGHT_LABELS_DROPDOWN) | - (1 << WIDX_DATE_FORMAT) | - (1 << WIDX_DATE_FORMAT_DROPDOWN), + (1ULL << WIDX_LANGUAGE) | + (1ULL << WIDX_LANGUAGE_DROPDOWN) | + (1ULL << WIDX_CURRENCY) | + (1ULL << WIDX_CURRENCY_DROPDOWN) | + (1ULL << WIDX_DISTANCE) | + (1ULL << WIDX_DISTANCE_DROPDOWN) | + (1ULL << WIDX_TEMPERATURE) | + (1ULL << WIDX_TEMPERATURE_DROPDOWN) | + (1ULL << WIDX_HEIGHT_LABELS) | + (1ULL << WIDX_HEIGHT_LABELS_DROPDOWN) | + (1ULL << WIDX_DATE_FORMAT) | + (1ULL << WIDX_DATE_FORMAT_DROPDOWN), MAIN_OPTIONS_ENABLED_WIDGETS | - (1 << WIDX_SOUND) | - (1 << WIDX_SOUND_DROPDOWN) | - (1 << WIDX_MASTER_SOUND_CHECKBOX) | - (1 << WIDX_SOUND_CHECKBOX) | - (1 << WIDX_MUSIC_CHECKBOX) | - (1 << WIDX_AUDIO_FOCUS_CHECKBOX) | - (1 << WIDX_TITLE_MUSIC) | - (1 << WIDX_TITLE_MUSIC_DROPDOWN), + (1ULL << WIDX_SOUND) | + (1ULL << WIDX_SOUND_DROPDOWN) | + (1ULL << WIDX_MASTER_SOUND_CHECKBOX) | + (1ULL << WIDX_SOUND_CHECKBOX) | + (1ULL << WIDX_MUSIC_CHECKBOX) | + (1ULL << WIDX_AUDIO_FOCUS_CHECKBOX) | + (1ULL << WIDX_TITLE_MUSIC) | + (1ULL << WIDX_TITLE_MUSIC_DROPDOWN), MAIN_OPTIONS_ENABLED_WIDGETS | - (1 << WIDX_SCREEN_EDGE_SCROLLING) | - (1 << WIDX_TRAP_CURSOR) | - (1 << WIDX_INVERT_DRAG) | - (1 << WIDX_ZOOM_TO_CURSOR) | - (1 << WIDX_HOTKEY_DROPDOWN) | - (1 << WIDX_TOOLBAR_SHOW_FINANCES) | - (1 << WIDX_TOOLBAR_SHOW_RESEARCH) | - (1 << WIDX_TOOLBAR_SHOW_CHEATS) | - (1 << WIDX_TOOLBAR_SHOW_NEWS) | - (1 << WIDX_THEMES) | - (1 << WIDX_THEMES_DROPDOWN) | - (1 << WIDX_THEMES_BUTTON) | - (1 << WIDX_TOOLBAR_SHOW_MUTE) | - (1 << WIDX_TOOLBAR_SHOW_CHAT) | - (1 << WIDX_TOOLBAR_SHOW_ZOOM), + (1ULL << WIDX_SCREEN_EDGE_SCROLLING) | + (1ULL << WIDX_TRAP_CURSOR) | + (1ULL << WIDX_INVERT_DRAG) | + (1ULL << WIDX_ZOOM_TO_CURSOR) | + (1ULL << WIDX_HOTKEY_DROPDOWN) | + (1ULL << WIDX_TOOLBAR_SHOW_FINANCES) | + (1ULL << WIDX_TOOLBAR_SHOW_RESEARCH) | + (1ULL << WIDX_TOOLBAR_SHOW_CHEATS) | + (1ULL << WIDX_TOOLBAR_SHOW_NEWS) | + (1ULL << WIDX_THEMES) | + (1ULL << WIDX_THEMES_DROPDOWN) | + (1ULL << WIDX_THEMES_BUTTON) | + (1ULL << WIDX_TOOLBAR_SHOW_MUTE) | + (1ULL << WIDX_TOOLBAR_SHOW_CHAT) | + (1ULL << WIDX_TOOLBAR_SHOW_ZOOM), MAIN_OPTIONS_ENABLED_WIDGETS | - (1 << WIDX_REAL_NAME_CHECKBOX) | - (1 << WIDX_AUTO_STAFF_PLACEMENT) | - (1 << WIDX_TITLE_SEQUENCE) | - (1 << WIDX_TITLE_SEQUENCE_DROPDOWN) | - (1 << WIDX_TITLE_SEQUENCE_BUTTON) | - (1 << WIDX_TITLE_SEQUENCE_RANDOM) | - (1 << WIDX_SCENARIO_GROUPING) | - (1 << WIDX_SCENARIO_GROUPING_DROPDOWN) | - (1 << WIDX_SCENARIO_UNLOCKING) | - (1 << WIDX_ALLOW_EARLY_COMPLETION) | - (1 << WIDX_AUTO_OPEN_SHOPS) | - (1 << WIDX_DEFAULT_INSPECTION_INTERVAL) | - (1 << WIDX_DEFAULT_INSPECTION_INTERVAL_DROPDOWN), + (1ULL << WIDX_REAL_NAME_CHECKBOX) | + (1ULL << WIDX_AUTO_STAFF_PLACEMENT) | + (1ULL << WIDX_TITLE_SEQUENCE) | + (1ULL << WIDX_TITLE_SEQUENCE_DROPDOWN) | + (1ULL << WIDX_TITLE_SEQUENCE_BUTTON) | + (1ULL << WIDX_TITLE_SEQUENCE_RANDOM) | + (1ULL << WIDX_SCENARIO_GROUPING) | + (1ULL << WIDX_SCENARIO_GROUPING_DROPDOWN) | + (1ULL << WIDX_SCENARIO_UNLOCKING) | + (1ULL << WIDX_ALLOW_EARLY_COMPLETION) | + (1ULL << WIDX_AUTO_OPEN_SHOPS) | + (1ULL << WIDX_DEFAULT_INSPECTION_INTERVAL) | + (1ULL << WIDX_DEFAULT_INSPECTION_INTERVAL_DROPDOWN), MAIN_OPTIONS_ENABLED_WIDGETS | - (1 << WIDX_DEBUGGING_TOOLS) | - (1 << WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM) | - (1 << WIDX_SAVE_PLUGIN_DATA_CHECKBOX) | - (1 << WIDX_STAY_CONNECTED_AFTER_DESYNC) | - (1 << WIDX_ALWAYS_NATIVE_LOADSAVE) | - (1 << WIDX_AUTOSAVE) | - (1 << WIDX_AUTOSAVE_DROPDOWN) | - (1 << WIDX_AUTOSAVE_AMOUNT) | - (1 << WIDX_AUTOSAVE_AMOUNT_UP) | - (1 << WIDX_AUTOSAVE_AMOUNT_DOWN) | - (1 << WIDX_PATH_TO_RCT1_TEXT) | - (1 << WIDX_PATH_TO_RCT1_BUTTON) | - (1 << WIDX_PATH_TO_RCT1_CLEAR), + (1ULL << WIDX_DEBUGGING_TOOLS) | + (1ULL << WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM) | + (1ULL << WIDX_SAVE_PLUGIN_DATA_CHECKBOX) | + (1ULL << WIDX_STAY_CONNECTED_AFTER_DESYNC) | + (1ULL << WIDX_ALWAYS_NATIVE_LOADSAVE) | + (1ULL << WIDX_AUTOSAVE) | + (1ULL << WIDX_AUTOSAVE_DROPDOWN) | + (1ULL << WIDX_AUTOSAVE_AMOUNT) | + (1ULL << WIDX_AUTOSAVE_AMOUNT_UP) | + (1ULL << WIDX_AUTOSAVE_AMOUNT_DOWN) | + (1ULL << WIDX_PATH_TO_RCT1_TEXT) | + (1ULL << WIDX_PATH_TO_RCT1_BUTTON) | + (1ULL << WIDX_PATH_TO_RCT1_CLEAR), }; // clang-format on @@ -829,23 +829,23 @@ static void window_options_display_invalidate(rct_window* w) // Disable resolution dropdown on "Windowed" and "Fullscreen (desktop)" if (gConfigGeneral.fullscreen_mode != static_cast(OpenRCT2::Ui::FULLSCREEN_MODE::FULLSCREEN)) { - w->disabled_widgets |= (1 << WIDX_RESOLUTION_DROPDOWN); - w->disabled_widgets |= (1 << WIDX_RESOLUTION); + w->disabled_widgets |= (1ULL << WIDX_RESOLUTION_DROPDOWN); + w->disabled_widgets |= (1ULL << WIDX_RESOLUTION); } else { - w->disabled_widgets &= ~(1 << WIDX_RESOLUTION_DROPDOWN); - w->disabled_widgets &= ~(1 << WIDX_RESOLUTION); + w->disabled_widgets &= ~(1ULL << WIDX_RESOLUTION_DROPDOWN); + w->disabled_widgets &= ~(1ULL << WIDX_RESOLUTION); } // Disable Steam Overlay checkbox when using software rendering. if (gConfigGeneral.drawing_engine == DrawingEngine::Software) { - w->disabled_widgets |= (1 << WIDX_STEAM_OVERLAY_PAUSE); + w->disabled_widgets |= (1ULL << WIDX_STEAM_OVERLAY_PAUSE); } else { - w->disabled_widgets &= ~(1 << WIDX_STEAM_OVERLAY_PAUSE); + w->disabled_widgets &= ~(1ULL << WIDX_STEAM_OVERLAY_PAUSE); } // Disable scaling quality dropdown when using software rendering or when using an integer scalar. @@ -853,23 +853,23 @@ static void window_options_display_invalidate(rct_window* w) if (gConfigGeneral.drawing_engine == DrawingEngine::Software || gConfigGeneral.window_scale == std::floor(gConfigGeneral.window_scale)) { - w->disabled_widgets |= (1 << WIDX_SCALE_QUALITY); - w->disabled_widgets |= (1 << WIDX_SCALE_QUALITY_DROPDOWN); + w->disabled_widgets |= (1ULL << WIDX_SCALE_QUALITY); + w->disabled_widgets |= (1ULL << WIDX_SCALE_QUALITY_DROPDOWN); } else { - w->disabled_widgets &= ~(1 << WIDX_SCALE_QUALITY); - w->disabled_widgets &= ~(1 << WIDX_SCALE_QUALITY_DROPDOWN); + w->disabled_widgets &= ~(1ULL << WIDX_SCALE_QUALITY); + w->disabled_widgets &= ~(1ULL << WIDX_SCALE_QUALITY_DROPDOWN); } // Disable changing VSync for Software engine, as we can't control its use of VSync if (gConfigGeneral.drawing_engine == DrawingEngine::Software) { - w->disabled_widgets |= (1 << WIDX_USE_VSYNC_CHECKBOX); + w->disabled_widgets |= (1ULL << WIDX_USE_VSYNC_CHECKBOX); } else { - w->disabled_widgets &= ~(1 << WIDX_USE_VSYNC_CHECKBOX); + w->disabled_widgets &= ~(1ULL << WIDX_USE_VSYNC_CHECKBOX); } WidgetSetCheckboxValue(w, WIDX_UNCAP_FPS_CHECKBOX, gConfigGeneral.uncap_fps); @@ -1058,11 +1058,11 @@ static void window_options_rendering_invalidate(rct_window* w) WidgetSetCheckboxValue(w, WIDX_ENABLE_LIGHT_FX_CHECKBOX, gConfigGeneral.enable_light_fx); if (gConfigGeneral.day_night_cycle && gConfigGeneral.drawing_engine == DrawingEngine::SoftwareWithHardwareDisplay) { - w->disabled_widgets &= ~(1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX); + w->disabled_widgets &= ~(1ULL << WIDX_ENABLE_LIGHT_FX_CHECKBOX); } else { - w->disabled_widgets |= (1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX); + w->disabled_widgets |= (1ULL << WIDX_ENABLE_LIGHT_FX_CHECKBOX); gConfigGeneral.enable_light_fx = false; } @@ -1070,11 +1070,11 @@ static void window_options_rendering_invalidate(rct_window* w) if (gConfigGeneral.day_night_cycle && gConfigGeneral.drawing_engine == DrawingEngine::SoftwareWithHardwareDisplay && gConfigGeneral.enable_light_fx) { - w->disabled_widgets &= ~(1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX); + w->disabled_widgets &= ~(1ULL << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX); } else { - w->disabled_widgets |= (1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX); + w->disabled_widgets |= (1ULL << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX); gConfigGeneral.enable_light_fx_for_vehicles = false; } @@ -1084,13 +1084,13 @@ static void window_options_rendering_invalidate(rct_window* w) if (!gConfigGeneral.render_weather_effects && !gConfigGeneral.render_weather_gloom) { WidgetSetCheckboxValue(w, WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX, true); - w->enabled_widgets &= ~(1 << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX); - w->disabled_widgets |= (1 << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX); + w->enabled_widgets &= ~(1ULL << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX); + w->disabled_widgets |= (1ULL << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX); } else { - w->enabled_widgets |= (1 << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX); - w->disabled_widgets &= ~(1 << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX); + w->enabled_widgets |= (1ULL << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX); + w->disabled_widgets &= ~(1ULL << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX); } window_options_common_invalidate_after(w); @@ -1128,7 +1128,7 @@ static void window_options_culture_mousedown(rct_window* w, rct_widgetindex widg break; case WIDX_CURRENCY_DROPDOWN: { - uint32_t num_items = EnumValue(CurrencyType::Count) + 1; // All the currencies plus the separator + constexpr auto num_items = EnumValue(CurrencyType::Count) + 1; // All the currencies plus the separator size_t num_ordinary_currencies = EnumValue(CurrencyType::Count) - 1; // All the currencies except custom currency for (size_t i = 0; i < num_ordinary_currencies; i++) @@ -1926,13 +1926,13 @@ static void window_options_misc_invalidate(rct_window* w) // Disable title sequence dropdown if set to random if (gConfigInterface.random_title_sequence) { - w->disabled_widgets |= (1 << WIDX_TITLE_SEQUENCE_DROPDOWN); - w->disabled_widgets |= (1 << WIDX_TITLE_SEQUENCE); + w->disabled_widgets |= (1ULL << WIDX_TITLE_SEQUENCE_DROPDOWN); + w->disabled_widgets |= (1ULL << WIDX_TITLE_SEQUENCE); } else { - w->disabled_widgets &= ~(1 << WIDX_TITLE_SEQUENCE_DROPDOWN); - w->disabled_widgets &= ~(1 << WIDX_TITLE_SEQUENCE); + w->disabled_widgets &= ~(1ULL << WIDX_TITLE_SEQUENCE_DROPDOWN); + w->disabled_widgets &= ~(1ULL << WIDX_TITLE_SEQUENCE); } if (gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_DIFFICULTY) diff --git a/src/openrct2-ui/windows/Park.cpp b/src/openrct2-ui/windows/Park.cpp index 0dd955388c..14386d346a 100644 --- a/src/openrct2-ui/windows/Park.cpp +++ b/src/openrct2-ui/windows/Park.cpp @@ -281,77 +281,77 @@ static rct_window_event_list *window_park_page_events[] = { #pragma region Enabled widgets static uint32_t window_park_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7) | - (1 << WIDX_OPEN_OR_CLOSE) | - (1 << WIDX_BUY_LAND_RIGHTS) | - (1 << WIDX_LOCATE) | - (1 << WIDX_RENAME) | - (1 << WIDX_CLOSE_LIGHT) | - (1 << WIDX_OPEN_LIGHT), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7) | + (1ULL << WIDX_OPEN_OR_CLOSE) | + (1ULL << WIDX_BUY_LAND_RIGHTS) | + (1ULL << WIDX_LOCATE) | + (1ULL << WIDX_RENAME) | + (1ULL << WIDX_CLOSE_LIGHT) | + (1ULL << WIDX_OPEN_LIGHT), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7) | - (1 << WIDX_INCREASE_PRICE) | - (1 << WIDX_DECREASE_PRICE), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7) | + (1ULL << WIDX_INCREASE_PRICE) | + (1ULL << WIDX_DECREASE_PRICE), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7) | - (1 << WIDX_ENTER_NAME), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7) | + (1ULL << WIDX_ENTER_NAME), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7) + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_TAB_6) | + (1ULL << WIDX_TAB_7) }; static uint32_t window_park_page_hold_down_widgets[] = { @@ -359,8 +359,8 @@ static uint32_t window_park_page_hold_down_widgets[] = { 0, 0, - (1 << WIDX_INCREASE_PRICE) | - (1 << WIDX_DECREASE_PRICE), + (1ULL << WIDX_INCREASE_PRICE) | + (1ULL << WIDX_DECREASE_PRICE), 0, 0, @@ -432,7 +432,7 @@ static rct_window* window_park_open() static void window_park_set_disabled_tabs(rct_window* w) { // Disable price tab if money is disabled - w->disabled_widgets = (gParkFlags & PARK_FLAGS_NO_MONEY) ? (1 << WIDX_TAB_4) : 0; + w->disabled_widgets = (gParkFlags & PARK_FLAGS_NO_MONEY) ? (1ULL << WIDX_TAB_4) : 0; } static void window_park_prepare_window_title_text() @@ -642,9 +642,9 @@ static void window_park_entrance_invalidate(rct_window* w) // Only allow closing of park for guest / rating objective if (gScenarioObjective.Type == OBJECTIVE_GUESTS_AND_RATING) - w->disabled_widgets |= (1 << WIDX_OPEN_OR_CLOSE) | (1 << WIDX_CLOSE_LIGHT) | (1 << WIDX_OPEN_LIGHT); + w->disabled_widgets |= (1ULL << WIDX_OPEN_OR_CLOSE) | (1ULL << WIDX_CLOSE_LIGHT) | (1ULL << WIDX_OPEN_LIGHT); else - w->disabled_widgets &= ~((1 << WIDX_OPEN_OR_CLOSE) | (1 << WIDX_CLOSE_LIGHT) | (1 << WIDX_OPEN_LIGHT)); + w->disabled_widgets &= ~((1ULL << WIDX_OPEN_OR_CLOSE) | (1ULL << WIDX_CLOSE_LIGHT) | (1ULL << WIDX_OPEN_LIGHT)); // Only allow purchase of land when there is money if (gParkFlags & PARK_FLAGS_NO_MONEY) @@ -1711,13 +1711,13 @@ static void window_park_draw_tab_images(rct_drawpixelinfo* dpi, rct_window* w) int32_t sprite_idx; // Entrance tab - if (!(w->disabled_widgets & (1 << WIDX_TAB_1))) + if (!(w->disabled_widgets & (1ULL << WIDX_TAB_1))) gfx_draw_sprite( dpi, ImageId(SPR_TAB_PARK_ENTRANCE), w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_TAB_1].left, w->widgets[WIDX_TAB_1].top }); // Rating tab - if (!(w->disabled_widgets & (1 << WIDX_TAB_2))) + if (!(w->disabled_widgets & (1ULL << WIDX_TAB_2))) { sprite_idx = SPR_TAB_GRAPH_0; if (w->page == WINDOW_PARK_PAGE_RATING) @@ -1733,7 +1733,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo* dpi, rct_window* w) } // Guests tab - if (!(w->disabled_widgets & (1 << WIDX_TAB_3))) + if (!(w->disabled_widgets & (1ULL << WIDX_TAB_3))) { sprite_idx = SPR_TAB_GRAPH_0; if (w->page == WINDOW_PARK_PAGE_GUESTS) @@ -1752,7 +1752,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo* dpi, rct_window* w) } // Price tab - if (!(w->disabled_widgets & (1 << WIDX_TAB_4))) + if (!(w->disabled_widgets & (1ULL << WIDX_TAB_4))) { sprite_idx = SPR_TAB_ADMISSION_0; if (w->page == WINDOW_PARK_PAGE_PRICE) @@ -1762,7 +1762,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo* dpi, rct_window* w) } // Statistics tab - if (!(w->disabled_widgets & (1 << WIDX_TAB_5))) + if (!(w->disabled_widgets & (1ULL << WIDX_TAB_5))) { sprite_idx = SPR_TAB_STATS_0; if (w->page == WINDOW_PARK_PAGE_STATS) @@ -1772,7 +1772,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo* dpi, rct_window* w) } // Objective tab - if (!(w->disabled_widgets & (1 << WIDX_TAB_6))) + if (!(w->disabled_widgets & (1ULL << WIDX_TAB_6))) { sprite_idx = SPR_TAB_OBJECTIVE_0; if (w->page == WINDOW_PARK_PAGE_OBJECTIVE) @@ -1782,7 +1782,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo* dpi, rct_window* w) } // Awards tab - if (!(w->disabled_widgets & (1 << WIDX_TAB_7))) + if (!(w->disabled_widgets & (1ULL << WIDX_TAB_7))) gfx_draw_sprite( dpi, ImageId(SPR_TAB_AWARDS), w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_TAB_7].left, w->widgets[WIDX_TAB_7].top }); diff --git a/src/openrct2-ui/windows/Player.cpp b/src/openrct2-ui/windows/Player.cpp index 26ea3fb4e3..640d1a73f4 100644 --- a/src/openrct2-ui/windows/Player.cpp +++ b/src/openrct2-ui/windows/Player.cpp @@ -130,17 +130,17 @@ static void window_player_update_viewport(rct_window *w, bool scroll); static void window_player_update_title(rct_window* w); static uint32_t window_player_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_GROUP) | - (1 << WIDX_GROUP_DROPDOWN) | - (1 << WIDX_LOCATE) | - (1 << WIDX_KICK), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_GROUP) | + (1ULL << WIDX_GROUP_DROPDOWN) | + (1ULL << WIDX_LOCATE) | + (1ULL << WIDX_KICK), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) }; // clang-format on diff --git a/src/openrct2-ui/windows/Research.cpp b/src/openrct2-ui/windows/Research.cpp index 724a7546e4..446b83c243 100644 --- a/src/openrct2-ui/windows/Research.cpp +++ b/src/openrct2-ui/windows/Research.cpp @@ -141,23 +141,23 @@ static rct_window_event_list *window_research_page_events[] = { #pragma region Enabled widgets static uint32_t window_research_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_LAST_DEVELOPMENT_BUTTON), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_LAST_DEVELOPMENT_BUTTON), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_RESEARCH_FUNDING) | - (1 << WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON) | - (1 << WIDX_TRANSPORT_RIDES) | - (1 << WIDX_GENTLE_RIDES) | - (1 << WIDX_ROLLER_COASTERS) | - (1 << WIDX_THRILL_RIDES) | - (1 << WIDX_WATER_RIDES) | - (1 << WIDX_SHOPS_AND_STALLS) | - (1 << WIDX_SCENERY_AND_THEMING) + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_RESEARCH_FUNDING) | + (1ULL << WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON) | + (1ULL << WIDX_TRANSPORT_RIDES) | + (1ULL << WIDX_GENTLE_RIDES) | + (1ULL << WIDX_ROLLER_COASTERS) | + (1ULL << WIDX_THRILL_RIDES) | + (1ULL << WIDX_WATER_RIDES) | + (1ULL << WIDX_SHOPS_AND_STALLS) | + (1ULL << WIDX_SCENERY_AND_THEMING) }; #pragma endregion diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 8798d50b2c..764beb5c9b 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1113,45 +1113,45 @@ static void window_ride_disable_tabs(rct_window* w) const auto& rtd = ride->GetRideTypeDescriptor(); if (!rtd.HasFlag(RIDE_TYPE_FLAG_HAS_DATA_LOGGING)) - disabled_tabs |= (1 << WIDX_TAB_8); // 0x800 + disabled_tabs |= (1ULL << WIDX_TAB_8); // 0x800 if (ride->type == RIDE_TYPE_MINI_GOLF) - disabled_tabs |= (1 << WIDX_TAB_2 | 1 << WIDX_TAB_3 | 1 << WIDX_TAB_4); // 0xE0 + disabled_tabs |= (1ULL << WIDX_TAB_2 | 1ULL << WIDX_TAB_3 | 1ULL << WIDX_TAB_4); // 0xE0 if (rtd.HasFlag(RIDE_TYPE_FLAG_NO_VEHICLES)) - disabled_tabs |= (1 << WIDX_TAB_2); // 0x20 + disabled_tabs |= (1ULL << WIDX_TAB_2); // 0x20 if (!rtd.HasFlag(RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN) && !rtd.HasFlag(RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL) && !rtd.HasFlag(RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS) && !rtd.HasFlag(RIDE_TYPE_FLAG_HAS_VEHICLE_COLOURS) && !rtd.HasFlag(RIDE_TYPE_FLAG_HAS_ENTRANCE_EXIT)) { - disabled_tabs |= (1 << WIDX_TAB_5); // 0x100 + disabled_tabs |= (1ULL << WIDX_TAB_5); // 0x100 } if (rtd.HasFlag(RIDE_TYPE_FLAG_IS_SHOP)) - disabled_tabs |= (1 << WIDX_TAB_3 | 1 << WIDX_TAB_4 | 1 << WIDX_TAB_7); // 0x4C0 + disabled_tabs |= (1ULL << WIDX_TAB_3 | 1ULL << WIDX_TAB_4 | 1ULL << WIDX_TAB_7); // 0x4C0 if (!rtd.HasFlag(RIDE_TYPE_FLAG_ALLOW_MUSIC)) { - disabled_tabs |= (1 << WIDX_TAB_6); // 0x200 + disabled_tabs |= (1ULL << WIDX_TAB_6); // 0x200 } if (ride->type == RIDE_TYPE_CASH_MACHINE || ride->type == RIDE_TYPE_FIRST_AID || (gParkFlags & PARK_FLAGS_NO_MONEY) != 0) - disabled_tabs |= (1 << WIDX_TAB_9); // 0x1000 + disabled_tabs |= (1ULL << WIDX_TAB_9); // 0x1000 if ((gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) != 0) - disabled_tabs |= (1 << WIDX_TAB_4 | 1 << WIDX_TAB_6 | 1 << WIDX_TAB_9 | 1 << WIDX_TAB_10); // 0x3280 + disabled_tabs |= (1ULL << WIDX_TAB_4 | 1ULL << WIDX_TAB_6 | 1ULL << WIDX_TAB_9 | 1ULL << WIDX_TAB_10); // 0x3280 rct_ride_entry* rideEntry = get_ride_entry(ride->subtype); if (rideEntry == nullptr) { - disabled_tabs |= 1 << WIDX_TAB_2 | 1 << WIDX_TAB_3 | 1 << WIDX_TAB_4 | 1 << WIDX_TAB_5 | 1 << WIDX_TAB_6 - | 1 << WIDX_TAB_7 | 1 << WIDX_TAB_8 | 1 << WIDX_TAB_9 | 1 << WIDX_TAB_10; + disabled_tabs |= 1ULL << WIDX_TAB_2 | 1ULL << WIDX_TAB_3 | 1ULL << WIDX_TAB_4 | 1ULL << WIDX_TAB_5 | 1ULL << WIDX_TAB_6 + | 1ULL << WIDX_TAB_7 | 1ULL << WIDX_TAB_8 | 1ULL << WIDX_TAB_9 | 1ULL << WIDX_TAB_10; } else if ((rideEntry->flags & RIDE_ENTRY_FLAG_DISABLE_COLOUR_TAB) != 0) { - disabled_tabs |= (1 << WIDX_TAB_5); + disabled_tabs |= (1ULL << WIDX_TAB_5); } w->disabled_widgets = disabled_tabs; @@ -2329,9 +2329,9 @@ static void window_ride_main_invalidate(rct_window* w) if (ride == nullptr) return; - w->disabled_widgets &= ~((1 << WIDX_DEMOLISH) | (1 << WIDX_CONSTRUCTION)); + w->disabled_widgets &= ~((1ULL << WIDX_DEMOLISH) | (1ULL << WIDX_CONSTRUCTION)); if (ride->lifecycle_flags & (RIDE_LIFECYCLE_INDESTRUCTIBLE | RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK)) - w->disabled_widgets |= (1 << WIDX_DEMOLISH); + w->disabled_widgets |= (1ULL << WIDX_DEMOLISH); auto ft = Formatter::Common(); ride->FormatNameTo(ft); @@ -3509,7 +3509,7 @@ static void window_ride_operating_invalidate(rct_window* w) ft.Add(ride->max_waiting_time); if (ride->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD) - w->pressed_widgets |= (1 << WIDX_LOAD_CHECKBOX); + w->pressed_widgets |= (1ULL << WIDX_LOAD_CHECKBOX); } else { @@ -3529,13 +3529,13 @@ static void window_ride_operating_invalidate(rct_window* w) } if (ride->depart_flags & RIDE_DEPART_LEAVE_WHEN_ANOTHER_ARRIVES) - w->pressed_widgets |= (1 << WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX); + w->pressed_widgets |= (1ULL << WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX); if (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS) - w->pressed_widgets |= (1 << WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX); + w->pressed_widgets |= (1ULL << WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX); if (ride->depart_flags & RIDE_DEPART_WAIT_FOR_MINIMUM_LENGTH) - w->pressed_widgets |= (1 << WIDX_MINIMUM_LENGTH_CHECKBOX); + w->pressed_widgets |= (1ULL << WIDX_MINIMUM_LENGTH_CHECKBOX); if (ride->depart_flags & RIDE_DEPART_WAIT_FOR_MAXIMUM_LENGTH) - w->pressed_widgets |= (1 << WIDX_MAXIMUM_LENGTH_CHECKBOX); + w->pressed_widgets |= (1ULL << WIDX_MAXIMUM_LENGTH_CHECKBOX); // Mode specific functionality ft.Rewind(); @@ -3612,7 +3612,7 @@ static void window_ride_operating_invalidate(rct_window* w) window_ride_operating_widgets[WIDX_MODE_TWEAK].text = format; window_ride_operating_widgets[WIDX_MODE_TWEAK_INCREASE].type = WindowWidgetType::Button; window_ride_operating_widgets[WIDX_MODE_TWEAK_DECREASE].type = WindowWidgetType::Button; - w->pressed_widgets &= ~(1 << WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX); + w->pressed_widgets &= ~(1ULL << WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX); } else { @@ -4012,12 +4012,12 @@ static void window_ride_maintenance_invalidate(rct_window* w) if (ride->GetRideTypeDescriptor().AvailableBreakdowns == 0 || !(ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED)) { - w->disabled_widgets |= (1 << WIDX_REFURBISH_RIDE); + w->disabled_widgets |= (1ULL << WIDX_REFURBISH_RIDE); window_ride_maintenance_widgets[WIDX_REFURBISH_RIDE].tooltip = STR_CANT_REFURBISH_NOT_NEEDED; } else { - w->disabled_widgets &= ~(1 << WIDX_REFURBISH_RIDE); + w->disabled_widgets &= ~(1ULL << WIDX_REFURBISH_RIDE); window_ride_maintenance_widgets[WIDX_REFURBISH_RIDE].tooltip = STR_REFURBISH_RIDE_TIP; } } @@ -5129,15 +5129,15 @@ static void window_ride_music_invalidate(rct_window* w) auto isMusicActivated = (ride->lifecycle_flags & RIDE_LIFECYCLE_MUSIC) != 0; if (isMusicActivated) { - w->pressed_widgets |= (1 << WIDX_PLAY_MUSIC); - w->disabled_widgets &= ~(1 << WIDX_MUSIC); - w->disabled_widgets &= ~(1 << WIDX_MUSIC_DROPDOWN); + w->pressed_widgets |= (1ULL << WIDX_PLAY_MUSIC); + w->disabled_widgets &= ~(1ULL << WIDX_MUSIC); + w->disabled_widgets &= ~(1ULL << WIDX_MUSIC_DROPDOWN); } else { - w->pressed_widgets &= ~(1 << WIDX_PLAY_MUSIC); - w->disabled_widgets |= (1 << WIDX_MUSIC); - w->disabled_widgets |= (1 << WIDX_MUSIC_DROPDOWN); + w->pressed_widgets &= ~(1ULL << WIDX_PLAY_MUSIC); + w->disabled_widgets |= (1ULL << WIDX_MUSIC); + w->disabled_widgets |= (1ULL << WIDX_MUSIC_DROPDOWN); } window_ride_anchor_border_widgets(w); @@ -5414,7 +5414,7 @@ static void window_ride_measurements_tooldown(rct_window* w, rct_widgetindex wid _lastSceneryY = screenCoords.y; _collectTrackDesignScenery = true; // Default to true in case user does not select anything valid - auto flags = EnumsToFlags( + constexpr auto flags = EnumsToFlags( ViewportInteractionItem::Scenery, ViewportInteractionItem::Footpath, ViewportInteractionItem::Wall, ViewportInteractionItem::LargeScenery); auto info = get_map_coordinates_from_pos(screenCoords, flags); @@ -5504,12 +5504,12 @@ static void window_ride_measurements_invalidate(rct_window* w) window_ride_measurements_widgets[WIDX_CANCEL_DESIGN].type = WindowWidgetType::Empty; window_ride_measurements_widgets[WIDX_SAVE_TRACK_DESIGN].type = WindowWidgetType::FlatBtn; - w->disabled_widgets |= (1 << WIDX_SAVE_TRACK_DESIGN); + w->disabled_widgets |= (1ULL << WIDX_SAVE_TRACK_DESIGN); if (ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED) { if (ride->excitement != RIDE_RATING_UNDEFINED) { - w->disabled_widgets &= ~(1 << WIDX_SAVE_TRACK_DESIGN); + w->disabled_widgets &= ~(1ULL << WIDX_SAVE_TRACK_DESIGN); window_ride_measurements_widgets[WIDX_SAVE_TRACK_DESIGN].tooltip = STR_SAVE_TRACK_DESIGN; } } @@ -5959,10 +5959,10 @@ static void window_ride_graphs_invalidate(rct_window* w) ride->FormatNameTo(ft); // Set pressed graph button type - w->pressed_widgets &= ~(1 << WIDX_GRAPH_VELOCITY); - w->pressed_widgets &= ~(1 << WIDX_GRAPH_ALTITUDE); - w->pressed_widgets &= ~(1 << WIDX_GRAPH_VERTICAL); - w->pressed_widgets &= ~(1 << WIDX_GRAPH_LATERAL); + w->pressed_widgets &= ~(1ULL << WIDX_GRAPH_VELOCITY); + w->pressed_widgets &= ~(1ULL << WIDX_GRAPH_ALTITUDE); + w->pressed_widgets &= ~(1ULL << WIDX_GRAPH_VERTICAL); + w->pressed_widgets &= ~(1ULL << WIDX_GRAPH_LATERAL); w->pressed_widgets |= (1LL << (WIDX_GRAPH_VELOCITY + (w->list_information_type & 0xFF))); // Hide graph buttons that are not applicable @@ -6519,8 +6519,8 @@ static void window_ride_income_invalidate(rct_window* w) return; // Primary item - w->pressed_widgets &= ~(1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK); - w->disabled_widgets &= ~(1 << WIDX_PRIMARY_PRICE); + w->pressed_widgets &= ~(1ULL << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK); + w->disabled_widgets &= ~(1ULL << WIDX_PRIMARY_PRICE); window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].tooltip = STR_NONE; window_ride_income_widgets[WIDX_PRIMARY_PRICE].tooltip = STR_NONE; @@ -6528,7 +6528,7 @@ static void window_ride_income_invalidate(rct_window* w) // If ride prices are locked, do not allow setting the price, unless we're dealing with a shop or toilet. if (!park_ride_prices_unlocked() && rideEntry->shop_item[0] == ShopItem::None && ride->type != RIDE_TYPE_TOILETS) { - w->disabled_widgets |= (1 << WIDX_PRIMARY_PRICE); + w->disabled_widgets |= (1ULL << WIDX_PRIMARY_PRICE); window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].tooltip = STR_RIDE_INCOME_ADMISSION_PAY_FOR_ENTRY_TIP; window_ride_income_widgets[WIDX_PRIMARY_PRICE].tooltip = STR_RIDE_INCOME_ADMISSION_PAY_FOR_ENTRY_TIP; } @@ -6550,7 +6550,7 @@ static void window_ride_income_invalidate(rct_window* w) window_ride_income_widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WindowWidgetType::Checkbox; if (shop_item_has_common_price(primaryItem)) - w->pressed_widgets |= (1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK); + w->pressed_widgets |= (1ULL << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK); window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].text = GetShopItemDescriptor(primaryItem).Naming.PriceLabel; } @@ -6578,9 +6578,9 @@ static void window_ride_income_invalidate(rct_window* w) else { // Set same price throughout park checkbox - w->pressed_widgets &= ~(1 << WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK); + w->pressed_widgets &= ~(1ULL << WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK); if (shop_item_has_common_price(secondaryItem)) - w->pressed_widgets |= (1 << WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK); + w->pressed_widgets |= (1ULL << WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK); // Show widgets window_ride_income_widgets[WIDX_SECONDARY_PRICE_LABEL].type = WindowWidgetType::Label; diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 7cf2b5f06a..70f7f97faa 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -684,10 +685,10 @@ static void window_ride_construction_mouseup(rct_window* w, rct_widgetindex widg static void window_ride_construction_resize(rct_window* w) { window_ride_construction_update_enabled_track_pieces(); - w->enabled_widgets &= ~(1 << WIDX_CONSTRUCT); + w->enabled_widgets &= ~(1ULL << WIDX_CONSTRUCT); if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_PLACE) { - w->enabled_widgets |= (1 << WIDX_CONSTRUCT); + w->enabled_widgets |= (1ULL << WIDX_CONSTRUCT); } auto ride = get_ride(_currentRideIndex); @@ -2441,7 +2442,7 @@ static void sub_6CBCE2( _tempTrackTileElement.AsTrack()->SetRideIndex(rideIndex); // Draw this map tile - sub_68B2B7(session, coords); + tile_element_paint_setup(session, coords, true); // Restore map elements map_set_tile_element(centreTileCoords, _backupTileElementArrays[0]); @@ -3106,7 +3107,7 @@ static void window_ride_construction_update_widgets(rct_window* w) window_ride_construction_widgets[WIDX_BANK_RIGHT].right = 83; window_ride_construction_widgets[WIDX_BANK_RIGHT].top = 139; window_ride_construction_widgets[WIDX_BANK_RIGHT].bottom = 148; - w->hold_down_widgets |= (1 << WIDX_BANK_STRAIGHT) | (1 << WIDX_BANK_RIGHT); + w->hold_down_widgets |= (1ULL << WIDX_BANK_STRAIGHT) | (1ULL << WIDX_BANK_RIGHT); } window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].right = 162; @@ -3134,10 +3135,10 @@ static void window_ride_construction_update_widgets(rct_window* w) } uint64_t pressedWidgets = w->pressed_widgets - & ((1 << WIDX_BACKGROUND) | (1 << WIDX_TITLE) | (1 << WIDX_CLOSE) | (1 << WIDX_DIRECTION_GROUPBOX) - | (1 << WIDX_SLOPE_GROUPBOX) | (1 << WIDX_BANKING_GROUPBOX) | (1 << WIDX_CONSTRUCT) | (1 << WIDX_DEMOLISH) - | (1 << WIDX_PREVIOUS_SECTION) | (1 << WIDX_NEXT_SECTION) | (1 << WIDX_ENTRANCE_EXIT_GROUPBOX) | (1 << WIDX_ENTRANCE) - | (1 << WIDX_EXIT)); + & ((1ULL << WIDX_BACKGROUND) | (1ULL << WIDX_TITLE) | (1ULL << WIDX_CLOSE) | (1ULL << WIDX_DIRECTION_GROUPBOX) + | (1ULL << WIDX_SLOPE_GROUPBOX) | (1ULL << WIDX_BANKING_GROUPBOX) | (1ULL << WIDX_CONSTRUCT) + | (1ULL << WIDX_DEMOLISH) | (1ULL << WIDX_PREVIOUS_SECTION) | (1ULL << WIDX_NEXT_SECTION) + | (1ULL << WIDX_ENTRANCE_EXIT_GROUPBOX) | (1ULL << WIDX_ENTRANCE) | (1ULL << WIDX_EXIT)); window_ride_construction_widgets[WIDX_CONSTRUCT].type = WindowWidgetType::Empty; window_ride_construction_widgets[WIDX_DEMOLISH].type = WindowWidgetType::FlatBtn; @@ -3268,7 +3269,7 @@ static void window_ride_construction_update_widgets(rct_window* w) } if (_currentTrackLiftHill & CONSTRUCTION_LIFT_HILL_SELECTED) - pressedWidgets |= (1 << WIDX_CHAIN_LIFT); + pressedWidgets |= (1ULL << WIDX_CHAIN_LIFT); w->pressed_widgets = pressedWidgets; w->Invalidate(); diff --git a/src/openrct2-ui/windows/RideList.cpp b/src/openrct2-ui/windows/RideList.cpp index 5ca445f2f6..d4a76f8db5 100644 --- a/src/openrct2-ui/windows/RideList.cpp +++ b/src/openrct2-ui/windows/RideList.cpp @@ -190,12 +190,12 @@ rct_window* window_ride_list_open() { window = WindowCreateAutoPos(340, 240, &window_ride_list_events, WC_RIDE_LIST, WF_10 | WF_RESIZABLE); window->widgets = window_ride_list_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_OPEN_CLOSE_ALL) | (1 << WIDX_CURRENT_INFORMATION_TYPE) - | (1 << WIDX_INFORMATION_TYPE_DROPDOWN) | (1 << WIDX_SORT) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) - | (1 << WIDX_TAB_3) | (1 << WIDX_CLOSE_LIGHT) | (1 << WIDX_OPEN_LIGHT); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_OPEN_CLOSE_ALL) | (1ULL << WIDX_CURRENT_INFORMATION_TYPE) + | (1ULL << WIDX_INFORMATION_TYPE_DROPDOWN) | (1ULL << WIDX_SORT) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) + | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_CLOSE_LIGHT) | (1ULL << WIDX_OPEN_LIGHT); if (network_get_mode() != NETWORK_MODE_CLIENT) { - window->enabled_widgets |= (1 << WIDX_QUICK_DEMOLISH); + window->enabled_widgets |= (1ULL << WIDX_QUICK_DEMOLISH); } WindowInitScrollWidgets(window); window->page = PAGE_RIDES; diff --git a/src/openrct2-ui/windows/SavePrompt.cpp b/src/openrct2-ui/windows/SavePrompt.cpp index 5a00e81760..96e8b886ea 100644 --- a/src/openrct2-ui/windows/SavePrompt.cpp +++ b/src/openrct2-ui/windows/SavePrompt.cpp @@ -136,7 +136,7 @@ rct_window* window_save_prompt_open() else { widgets = window_save_prompt_widgets; - enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_SAVE) | (1 << WIDX_DONT_SAVE) | (1 << WIDX_CANCEL); + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_SAVE) | (1ULL << WIDX_DONT_SAVE) | (1ULL << WIDX_CANCEL); width = WW_SAVE; height = WH_SAVE; } diff --git a/src/openrct2-ui/windows/ScenarioSelect.cpp b/src/openrct2-ui/windows/ScenarioSelect.cpp index 781504ec81..715fc3c707 100644 --- a/src/openrct2-ui/windows/ScenarioSelect.cpp +++ b/src/openrct2-ui/windows/ScenarioSelect.cpp @@ -27,8 +27,10 @@ static constexpr const rct_string_id WINDOW_TITLE = STR_SELECT_SCENARIO; static constexpr const int32_t WW = 734; -static constexpr const int32_t WH = 334; +static constexpr const int32_t WH = 384; +static constexpr const int32_t SidebarWidth = 180; #define INITIAL_NUM_UNLOCKED_SCENARIOS 5 +constexpr const uint8_t NumTabs = 8; // clang-format off enum class LIST_ITEM_TYPE : uint8_t @@ -74,7 +76,7 @@ enum { static rct_widget window_scenarioselect_widgets[] = { WINDOW_SHIM(WINDOW_TITLE, WW, WH), - MakeWidget ({ 0, 50}, {734, 284}, WindowWidgetType::ImgBtn, WindowColour::Secondary), // tab content panel + MakeWidget ({ 0, 50}, { WW, 284}, WindowWidgetType::ImgBtn, WindowColour::Secondary), // tab content panel MakeRemapWidget({ 3, 17}, { 91, 34}, WindowWidgetType::Tab, WindowColour::Secondary, SPR_TAB_LARGE), // tab 1 MakeRemapWidget({ 94, 17}, { 91, 34}, WindowWidgetType::Tab, WindowColour::Secondary, SPR_TAB_LARGE), // tab 2 MakeRemapWidget({185, 17}, { 91, 34}, WindowWidgetType::Tab, WindowColour::Secondary, SPR_TAB_LARGE), // tab 3 @@ -83,7 +85,7 @@ static rct_widget window_scenarioselect_widgets[] = { MakeRemapWidget({458, 17}, {136, 34}, WindowWidgetType::Tab, WindowColour::Secondary, SPR_TAB_LARGE), // tab 6 MakeRemapWidget({594, 17}, { 91, 34}, WindowWidgetType::Tab, WindowColour::Secondary, SPR_TAB_LARGE), // tab 7 MakeRemapWidget({685, 17}, { 91, 34}, WindowWidgetType::Tab, WindowColour::Secondary, SPR_TAB_LARGE), // tab 8 - MakeWidget ({ 3, 54}, {553, 276}, WindowWidgetType::Scroll, WindowColour::Secondary, SCROLL_VERTICAL), // level list + MakeWidget ({ 3, 54}, { WW - SidebarWidth, 276 }, WindowWidgetType::Scroll, WindowColour::Secondary, SCROLL_VERTICAL), // level list { WIDGETS_END }, }; @@ -140,6 +142,15 @@ static bool _showLockedInformation = false; static bool _titleEditor = false; static bool _disableLocking{}; +static int32_t ScenarioSelectGetWindowWidth() +{ + // Shrink the window if we're showing scenarios by difficulty level. + if (gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_DIFFICULTY && !_titleEditor) + return 610; + else + return WW; +} + rct_window* window_scenarioselect_open(scenarioselect_callback callback, bool titleEditor) { if (_titleEditor != titleEditor) @@ -164,7 +175,7 @@ rct_window* window_scenarioselect_open(std::function cal { rct_window* window; int32_t windowWidth; - int32_t windowHeight = 334; + int32_t windowHeight = WH; _callback = callback; _disableLocking = disableLocking; @@ -172,18 +183,14 @@ rct_window* window_scenarioselect_open(std::function cal // Load scenario list scenario_repository_scan(); - // Shrink the window if we're showing scenarios by difficulty level. - if (gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_DIFFICULTY && !_titleEditor) - windowWidth = 610; - else - windowWidth = 733; + windowWidth = ScenarioSelectGetWindowWidth(); window = WindowCreateCentred( windowWidth, windowHeight, &window_scenarioselect_events, WC_SCENARIO_SELECT, WF_10 | (titleEditor ? WF_STICK_TO_FRONT : 0)); window->widgets = window_scenarioselect_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_TAB3) | (1 << WIDX_TAB4) - | (1 << WIDX_TAB5) | (1 << WIDX_TAB6) | (1 << WIDX_TAB7) | (1 << WIDX_TAB8); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB1) | (1ULL << WIDX_TAB2) | (1ULL << WIDX_TAB3) + | (1ULL << WIDX_TAB4) | (1ULL << WIDX_TAB5) | (1ULL << WIDX_TAB6) | (1ULL << WIDX_TAB7) | (1ULL << WIDX_TAB8); window_scenarioselect_init_tabs(window); initialise_list_items(window); @@ -237,7 +244,7 @@ static void window_scenarioselect_init_tabs(rct_window* w) } int32_t x = 3; - for (int32_t i = 0; i < 8; i++) + for (int32_t i = 0; i < NumTabs; i++) { rct_widget* widget = &w->widgets[i + WIDX_TAB1]; if (!(showPages & (1 << i))) @@ -409,8 +416,8 @@ static void window_scenarioselect_scrollmouseover(rct_window* w, int32_t scrollI static void window_scenarioselect_invalidate(rct_window* w) { w->pressed_widgets &= ~( - (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_TAB3) | (1 << WIDX_TAB4) | (1 << WIDX_TAB5) - | (1 << WIDX_TAB6) | (1 << WIDX_TAB7) | (1 << WIDX_TAB8)); + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB1) | (1ULL << WIDX_TAB2) | (1ULL << WIDX_TAB3) | (1ULL << WIDX_TAB4) + | (1ULL << WIDX_TAB5) | (1ULL << WIDX_TAB6) | (1ULL << WIDX_TAB7) | (1ULL << WIDX_TAB8)); w->pressed_widgets |= 1LL << (w->selected_tab + WIDX_TAB1); @@ -557,8 +564,6 @@ static void window_scenarioselect_scrollpaint(rct_window* w, rct_drawpixelinfo* rct_string_id highlighted_format = ScenarioSelectUseSmallFont() ? STR_WHITE_STRING : STR_WINDOW_COLOUR_2_STRINGID; rct_string_id unhighlighted_format = ScenarioSelectUseSmallFont() ? STR_WHITE_STRING : STR_BLACK_STRING; - bool wide = gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN || _titleEditor; - rct_widget* listWidget = &w->widgets[WIDX_SCENARIOLIST]; int32_t listWidth = listWidget->width() - 12; @@ -608,13 +613,17 @@ static void window_scenarioselect_scrollpaint(rct_window* w, rct_drawpixelinfo* ft.Add(buffer); colour_t colour = isDisabled ? w->colours[1] | COLOUR_FLAG_INSET : COLOUR_BLACK; FontSpriteBase fontSpriteBase = isDisabled ? FontSpriteBase::MEDIUM_DARK : FontSpriteBase::MEDIUM; - DrawTextBasic(dpi, { wide ? 270 : 210, y + 1 }, format, ft, { colour, fontSpriteBase, TextAlignment::CENTRE }); + const auto scrollCentre = window_scenarioselect_widgets[WIDX_SCENARIOLIST].width() / 2; + + DrawTextBasic(dpi, { scrollCentre, y + 1 }, format, ft, { colour, fontSpriteBase, TextAlignment::CENTRE }); // Check if scenario is completed if (isCompleted) { // Draw completion tick - gfx_draw_sprite(dpi, ImageId(SPR_MENU_CHECKMARK), { wide ? 500 : 395, y + 1 }); + gfx_draw_sprite( + dpi, ImageId(SPR_MENU_CHECKMARK), + { window_scenarioselect_widgets[WIDX_SCENARIOLIST].width() - 45, y + 1 }); // Draw completion score const utf8* completedByName = "???"; @@ -628,7 +637,7 @@ static void window_scenarioselect_scrollpaint(rct_window* w, rct_drawpixelinfo* ft.Add(STR_STRING); ft.Add(buffer); DrawTextBasic( - dpi, { wide ? 270 : 210, y + scenarioTitleHeight + 1 }, format, ft, + dpi, { scrollCentre, y + scenarioTitleHeight + 1 }, format, ft, { FontSpriteBase::SMALL, TextAlignment::CENTRE }); } diff --git a/src/openrct2-ui/windows/Scenery.cpp b/src/openrct2-ui/windows/Scenery.cpp index 0c8c21e8c1..585e3f180c 100644 --- a/src/openrct2-ui/windows/Scenery.cpp +++ b/src/openrct2-ui/windows/Scenery.cpp @@ -954,9 +954,9 @@ void window_scenery_invalidate(rct_window* w) w->pressed_widgets = 0; w->pressed_widgets |= 1ULL << (tabIndex + WIDX_SCENERY_TAB_1); if (gWindowSceneryPaintEnabled == 1) - w->pressed_widgets |= (1 << WIDX_SCENERY_REPAINT_SCENERY_BUTTON); + w->pressed_widgets |= (1ULL << WIDX_SCENERY_REPAINT_SCENERY_BUTTON); if (gWindowSceneryEyedropperEnabled) - w->pressed_widgets |= (1 << WIDX_SCENERY_EYEDROPPER_BUTTON); + w->pressed_widgets |= (1ULL << WIDX_SCENERY_EYEDROPPER_BUTTON); if (gWindowSceneryScatterEnabled) w->pressed_widgets |= (1ULL << WIDX_SCENERY_BUILD_CLUSTER_BUTTON); diff --git a/src/openrct2-ui/windows/SceneryScatter.cpp b/src/openrct2-ui/windows/SceneryScatter.cpp index c7b0c2855d..fa1c438dc7 100644 --- a/src/openrct2-ui/windows/SceneryScatter.cpp +++ b/src/openrct2-ui/windows/SceneryScatter.cpp @@ -83,9 +83,9 @@ rct_window* window_scenery_scatter_open() window = WindowCreateAutoPos(86, 100, &window_clear_scenery_events, WC_SCENERY_SCATTER, 0); window->widgets = window_scenery_scatter_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT) | (1 << WIDX_PREVIEW) - | (1 << WIDX_DENSITY_LOW) | (1 << WIDX_DENSITY_MEDIUM) | (1 << WIDX_DENSITY_HIGH); - window->hold_down_widgets = (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_INCREMENT) | (1ULL << WIDX_DECREMENT) + | (1ULL << WIDX_PREVIEW) | (1ULL << WIDX_DENSITY_LOW) | (1ULL << WIDX_DENSITY_MEDIUM) | (1ULL << WIDX_DENSITY_HIGH); + window->hold_down_widgets = (1ULL << WIDX_INCREMENT) | (1ULL << WIDX_DECREMENT); WindowInitScrollWidgets(window); window_push_others_below(window); @@ -185,21 +185,21 @@ static void window_scenery_scatter_inputsize(rct_window* w, rct_widgetindex widg static void window_scenery_scatter_invalidate(rct_window* w) { // Set the preview image button to be pressed down - w->pressed_widgets = (1 << WIDX_PREVIEW); + w->pressed_widgets = (1ULL << WIDX_PREVIEW); // Set density buttons' pressed state. switch (gWindowSceneryScatterDensity) { case ScatterToolDensity::LowDensity: - w->pressed_widgets |= (1 << WIDX_DENSITY_LOW); + w->pressed_widgets |= (1ULL << WIDX_DENSITY_LOW); break; case ScatterToolDensity::MediumDensity: - w->pressed_widgets |= (1 << WIDX_DENSITY_MEDIUM); + w->pressed_widgets |= (1ULL << WIDX_DENSITY_MEDIUM); break; case ScatterToolDensity::HighDensity: - w->pressed_widgets |= (1 << WIDX_DENSITY_HIGH); + w->pressed_widgets |= (1ULL << WIDX_DENSITY_HIGH); break; } diff --git a/src/openrct2-ui/windows/ServerList.cpp b/src/openrct2-ui/windows/ServerList.cpp index 929475a0d6..bd23fdc524 100644 --- a/src/openrct2-ui/windows/ServerList.cpp +++ b/src/openrct2-ui/windows/ServerList.cpp @@ -129,8 +129,8 @@ rct_window* window_server_list_open() window_server_list_widgets[WIDX_PLAYER_NAME_INPUT].string = _playerName; window->widgets = window_server_list_widgets; window->enabled_widgets - = ((1 << WIDX_CLOSE) | (1 << WIDX_PLAYER_NAME_INPUT) | (1 << WIDX_FETCH_SERVERS) | (1 << WIDX_ADD_SERVER) - | (1 << WIDX_START_SERVER)); + = ((1ULL << WIDX_CLOSE) | (1ULL << WIDX_PLAYER_NAME_INPUT) | (1ULL << WIDX_FETCH_SERVERS) | (1ULL << WIDX_ADD_SERVER) + | (1ULL << WIDX_START_SERVER)); WindowInitScrollWidgets(window); window->no_list_items = 0; window->selected_list_item = -1; diff --git a/src/openrct2-ui/windows/ServerStart.cpp b/src/openrct2-ui/windows/ServerStart.cpp index 8090392db4..8bb70c9b73 100644 --- a/src/openrct2-ui/windows/ServerStart.cpp +++ b/src/openrct2-ui/windows/ServerStart.cpp @@ -101,10 +101,10 @@ rct_window* window_server_start_open() window_server_start_widgets[WIDX_PASSWORD_INPUT].string = _password; window->widgets = window_server_start_widgets; window->enabled_widgets - = ((1 << WIDX_CLOSE) | (1 << WIDX_PORT_INPUT) | (1 << WIDX_NAME_INPUT) | (1 << WIDX_DESCRIPTION_INPUT) - | (1 << WIDX_GREETING_INPUT) | (1 << WIDX_PASSWORD_INPUT) | (1 << WIDX_MAXPLAYERS) | (1 << WIDX_MAXPLAYERS_INCREASE) - | (1 << WIDX_MAXPLAYERS_DECREASE) | (1 << WIDX_ADVERTISE_CHECKBOX) | (1 << WIDX_START_SERVER) - | (1 << WIDX_LOAD_SERVER)); + = ((1ULL << WIDX_CLOSE) | (1ULL << WIDX_PORT_INPUT) | (1ULL << WIDX_NAME_INPUT) | (1ULL << WIDX_DESCRIPTION_INPUT) + | (1ULL << WIDX_GREETING_INPUT) | (1ULL << WIDX_PASSWORD_INPUT) | (1ULL << WIDX_MAXPLAYERS) + | (1ULL << WIDX_MAXPLAYERS_INCREASE) | (1ULL << WIDX_MAXPLAYERS_DECREASE) | (1ULL << WIDX_ADVERTISE_CHECKBOX) + | (1ULL << WIDX_START_SERVER) | (1ULL << WIDX_LOAD_SERVER)); WindowInitScrollWidgets(window); window->no_list_items = 0; window->selected_list_item = -1; diff --git a/src/openrct2-ui/windows/ShortcutKeys.cpp b/src/openrct2-ui/windows/ShortcutKeys.cpp index 24b5b5859c..0f01475ba5 100644 --- a/src/openrct2-ui/windows/ShortcutKeys.cpp +++ b/src/openrct2-ui/windows/ShortcutKeys.cpp @@ -422,7 +422,7 @@ private: void InitialiseWidgets() { - enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RESET); + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_RESET); _widgets.clear(); _widgets.insert(_widgets.begin(), std::begin(window_shortcut_widgets), std::end(window_shortcut_widgets) - 1); diff --git a/src/openrct2-ui/windows/Sign.cpp b/src/openrct2-ui/windows/Sign.cpp index 721c10c104..2962cb6b77 100644 --- a/src/openrct2-ui/windows/Sign.cpp +++ b/src/openrct2-ui/windows/Sign.cpp @@ -73,8 +73,8 @@ public: void OnOpen() override { widgets = window_sign_widgets; - enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_SIGN_TEXT) | (1 << WIDX_SIGN_DEMOLISH) | (1 << WIDX_MAIN_COLOUR) - | (1 << WIDX_TEXT_COLOUR); + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_SIGN_TEXT) | (1ULL << WIDX_SIGN_DEMOLISH) + | (1ULL << WIDX_MAIN_COLOUR) | (1ULL << WIDX_TEXT_COLOUR); WindowInitScrollWidgets(this); } diff --git a/src/openrct2-ui/windows/Staff.cpp b/src/openrct2-ui/windows/Staff.cpp index c8c9783d65..f4f98f2666 100644 --- a/src/openrct2-ui/windows/Staff.cpp +++ b/src/openrct2-ui/windows/Staff.cpp @@ -203,30 +203,30 @@ static rct_window_event_list *window_staff_page_events[] = { }; static constexpr const uint32_t window_staff_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_PICKUP) | - (1 << WIDX_PATROL) | - (1 << WIDX_RENAME) | - (1 << WIDX_LOCATE) | - (1 << WIDX_FIRE), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_PICKUP) | + (1ULL << WIDX_PATROL) | + (1ULL << WIDX_RENAME) | + (1ULL << WIDX_LOCATE) | + (1ULL << WIDX_FIRE), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_CHECKBOX_1) | - (1 << WIDX_CHECKBOX_2) | - (1 << WIDX_CHECKBOX_3) | - (1 << WIDX_CHECKBOX_4) | - (1 << WIDX_COSTUME_BTN), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_CHECKBOX_1) | + (1ULL << WIDX_CHECKBOX_2) | + (1ULL << WIDX_CHECKBOX_3) | + (1ULL << WIDX_CHECKBOX_4) | + (1ULL << WIDX_COSTUME_BTN), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) }; // clang-format on @@ -309,20 +309,20 @@ void window_staff_disable_widgets(rct_window* w) if (peep != nullptr && peep->AssignedStaffType == StaffType::Security) { - disabled_widgets |= (1 << WIDX_TAB_2); + disabled_widgets |= (1ULL << WIDX_TAB_2); } if (w->page == WINDOW_STAFF_OVERVIEW) { if (peep->CanBePickedUp()) { - if (w->disabled_widgets & (1 << WIDX_PICKUP)) + if (w->disabled_widgets & (1ULL << WIDX_PICKUP)) w->Invalidate(); } else { - disabled_widgets |= (1 << WIDX_PICKUP); - if (!(w->disabled_widgets & (1 << WIDX_PICKUP))) + disabled_widgets |= (1ULL << WIDX_PICKUP); + if (!(w->disabled_widgets & (1ULL << WIDX_PICKUP))) w->Invalidate(); } } @@ -808,7 +808,7 @@ void window_staff_options_invalidate(rct_window* w) window_staff_options_widgets[WIDX_COSTUME_BOX].type = WindowWidgetType::Empty; window_staff_options_widgets[WIDX_COSTUME_BTN].type = WindowWidgetType::Empty; w->pressed_widgets &= ~( - (1 << WIDX_CHECKBOX_1) | (1 << WIDX_CHECKBOX_2) | (1 << WIDX_CHECKBOX_3) | (1 << WIDX_CHECKBOX_4)); + (1ULL << WIDX_CHECKBOX_1) | (1ULL << WIDX_CHECKBOX_2) | (1ULL << WIDX_CHECKBOX_3) | (1ULL << WIDX_CHECKBOX_4)); w->pressed_widgets |= peep->StaffOrders << WIDX_CHECKBOX_1; break; case StaffType::Mechanic: @@ -820,7 +820,7 @@ void window_staff_options_invalidate(rct_window* w) window_staff_options_widgets[WIDX_CHECKBOX_4].type = WindowWidgetType::Empty; window_staff_options_widgets[WIDX_COSTUME_BOX].type = WindowWidgetType::Empty; window_staff_options_widgets[WIDX_COSTUME_BTN].type = WindowWidgetType::Empty; - w->pressed_widgets &= ~((1 << WIDX_CHECKBOX_1) | (1 << WIDX_CHECKBOX_2)); + w->pressed_widgets &= ~((1ULL << WIDX_CHECKBOX_1) | (1ULL << WIDX_CHECKBOX_2)); w->pressed_widgets |= peep->StaffOrders << WIDX_CHECKBOX_1; break; case StaffType::Security: @@ -945,7 +945,7 @@ void window_staff_overview_paint(rct_window* w, rct_drawpixelinfo* dpi) */ void window_staff_options_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_2)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_2)) return; rct_widget* widget = &w->widgets[WIDX_TAB_2]; @@ -967,7 +967,7 @@ void window_staff_options_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) */ void window_staff_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_3)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_3)) return; rct_widget* widget = &w->widgets[WIDX_TAB_3]; @@ -988,7 +988,7 @@ void window_staff_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) */ void window_staff_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) { - if (w->disabled_widgets & (1 << WIDX_TAB_1)) + if (w->disabled_widgets & (1ULL << WIDX_TAB_1)) return; rct_widget* widget = &w->widgets[WIDX_TAB_1]; diff --git a/src/openrct2-ui/windows/StaffFirePrompt.cpp b/src/openrct2-ui/windows/StaffFirePrompt.cpp index 42d9739bab..91f86d50e9 100644 --- a/src/openrct2-ui/windows/StaffFirePrompt.cpp +++ b/src/openrct2-ui/windows/StaffFirePrompt.cpp @@ -62,7 +62,7 @@ rct_window* window_staff_fire_prompt_open(Peep* peep) w = WindowCreateCentred(WW, WH, &window_staff_fire_events, WC_FIRE_PROMPT, WF_TRANSPARENT); w->widgets = window_staff_fire_widgets; - w->enabled_widgets |= (1 << WIDX_CLOSE) | (1 << WIDX_YES) | (1 << WIDX_CANCEL); + w->enabled_widgets |= (1ULL << WIDX_CLOSE) | (1ULL << WIDX_YES) | (1ULL << WIDX_CANCEL); WindowInitScrollWidgets(w); diff --git a/src/openrct2-ui/windows/StaffList.cpp b/src/openrct2-ui/windows/StaffList.cpp index 589df6caac..1899bdac1e 100644 --- a/src/openrct2-ui/windows/StaffList.cpp +++ b/src/openrct2-ui/windows/StaffList.cpp @@ -101,11 +101,11 @@ public: void OnOpen() override { widgets = window_staff_list_widgets; - enabled_widgets = (1 << WIDX_STAFF_LIST_CLOSE) | (1 << WIDX_STAFF_LIST_HANDYMEN_TAB) - | (1 << WIDX_STAFF_LIST_MECHANICS_TAB) | (1 << WIDX_STAFF_LIST_SECURITY_TAB) - | (1 << WIDX_STAFF_LIST_ENTERTAINERS_TAB) | (1 << WIDX_STAFF_LIST_HIRE_BUTTON) - | (1 << WIDX_STAFF_LIST_UNIFORM_COLOUR_PICKER) | (1 << WIDX_STAFF_LIST_SHOW_PATROL_AREA_BUTTON) - | (1 << WIDX_STAFF_LIST_MAP) | (1 << WIDX_STAFF_LIST_QUICK_FIRE); + enabled_widgets = (1ULL << WIDX_STAFF_LIST_CLOSE) | (1ULL << WIDX_STAFF_LIST_HANDYMEN_TAB) + | (1ULL << WIDX_STAFF_LIST_MECHANICS_TAB) | (1ULL << WIDX_STAFF_LIST_SECURITY_TAB) + | (1ULL << WIDX_STAFF_LIST_ENTERTAINERS_TAB) | (1ULL << WIDX_STAFF_LIST_HIRE_BUTTON) + | (1ULL << WIDX_STAFF_LIST_UNIFORM_COLOUR_PICKER) | (1ULL << WIDX_STAFF_LIST_SHOW_PATROL_AREA_BUTTON) + | (1ULL << WIDX_STAFF_LIST_MAP) | (1ULL << WIDX_STAFF_LIST_QUICK_FIRE); WindowInitScrollWidgets(this); widgets[WIDX_STAFF_LIST_UNIFORM_COLOUR_PICKER].type = WindowWidgetType::Empty; diff --git a/src/openrct2-ui/windows/Themes.cpp b/src/openrct2-ui/windows/Themes.cpp index 02ebd8eddf..6805425552 100644 --- a/src/openrct2-ui/windows/Themes.cpp +++ b/src/openrct2-ui/windows/Themes.cpp @@ -322,13 +322,14 @@ rct_window* window_themes_open() window = WindowCreateAutoPos(320, 107, &window_themes_events, WC_THEMES, WF_10 | WF_RESIZABLE); window->widgets = window_themes_widgets; - window->enabled_widgets = (1 << WIDX_THEMES_CLOSE) | (1 << WIDX_THEMES_SETTINGS_TAB) | (1 << WIDX_THEMES_MAIN_UI_TAB) - | (1 << WIDX_THEMES_PARK_TAB) | (1 << WIDX_THEMES_TOOLS_TAB) | (1 << WIDX_THEMES_RIDE_PEEPS_TAB) - | (1 << WIDX_THEMES_EDITORS_TAB) | (1 << WIDX_THEMES_MISC_TAB) | (1 << WIDX_THEMES_PROMPTS_TAB) - | (1 << WIDX_THEMES_FEATURES_TAB) | (1 << WIDX_THEMES_COLOURBTN_MASK) | (1 << WIDX_THEMES_PRESETS) - | (1 << WIDX_THEMES_PRESETS_DROPDOWN) | (1 << WIDX_THEMES_DUPLICATE_BUTTON) | (1 << WIDX_THEMES_DELETE_BUTTON) - | (1 << WIDX_THEMES_RENAME_BUTTON) | (1 << WIDX_THEMES_RCT1_RIDE_LIGHTS) | (1 << WIDX_THEMES_RCT1_PARK_LIGHTS) - | (1 << WIDX_THEMES_RCT1_SCENARIO_FONT) | (1 << WIDX_THEMES_RCT1_BOTTOM_TOOLBAR); + window->enabled_widgets = (1ULL << WIDX_THEMES_CLOSE) | (1ULL << WIDX_THEMES_SETTINGS_TAB) + | (1ULL << WIDX_THEMES_MAIN_UI_TAB) | (1ULL << WIDX_THEMES_PARK_TAB) | (1ULL << WIDX_THEMES_TOOLS_TAB) + | (1ULL << WIDX_THEMES_RIDE_PEEPS_TAB) | (1ULL << WIDX_THEMES_EDITORS_TAB) | (1ULL << WIDX_THEMES_MISC_TAB) + | (1ULL << WIDX_THEMES_PROMPTS_TAB) | (1ULL << WIDX_THEMES_FEATURES_TAB) | (1ULL << WIDX_THEMES_COLOURBTN_MASK) + | (1ULL << WIDX_THEMES_PRESETS) | (1ULL << WIDX_THEMES_PRESETS_DROPDOWN) | (1ULL << WIDX_THEMES_DUPLICATE_BUTTON) + | (1ULL << WIDX_THEMES_DELETE_BUTTON) | (1ULL << WIDX_THEMES_RENAME_BUTTON) | (1ULL << WIDX_THEMES_RCT1_RIDE_LIGHTS) + | (1ULL << WIDX_THEMES_RCT1_PARK_LIGHTS) | (1ULL << WIDX_THEMES_RCT1_SCENARIO_FONT) + | (1ULL << WIDX_THEMES_RCT1_BOTTOM_TOOLBAR); window_themes_init_vars(); diff --git a/src/openrct2-ui/windows/TitleCommandEditor.cpp b/src/openrct2-ui/windows/TitleCommandEditor.cpp index d04d36ae1f..718964cefd 100644 --- a/src/openrct2-ui/windows/TitleCommandEditor.cpp +++ b/src/openrct2-ui/windows/TitleCommandEditor.cpp @@ -220,9 +220,10 @@ void window_title_command_editor_open(TitleSequence* sequence, int32_t index, bo window_title_command_editor_widgets[WIDX_TEXTBOX_X].string = textbox1Buffer; window_title_command_editor_widgets[WIDX_TEXTBOX_Y].string = textbox2Buffer; window->widgets = window_title_command_editor_widgets; - window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_COMMAND) | (1 << WIDX_COMMAND_DROPDOWN) | (1 << WIDX_TEXTBOX_FULL) - | (1 << WIDX_TEXTBOX_X) | (1 << WIDX_TEXTBOX_Y) | (1 << WIDX_INPUT) | (1 << WIDX_INPUT_DROPDOWN) | (1 << WIDX_GET) - | (1 << WIDX_SELECT_SCENARIO) | (1 << WIDX_SELECT_SPRITE) | (1 << WIDX_OKAY) | (1 << WIDX_CANCEL); + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_COMMAND) | (1ULL << WIDX_COMMAND_DROPDOWN) + | (1ULL << WIDX_TEXTBOX_FULL) | (1ULL << WIDX_TEXTBOX_X) | (1ULL << WIDX_TEXTBOX_Y) | (1ULL << WIDX_INPUT) + | (1ULL << WIDX_INPUT_DROPDOWN) | (1ULL << WIDX_GET) | (1ULL << WIDX_SELECT_SCENARIO) | (1ULL << WIDX_SELECT_SPRITE) + | (1ULL << WIDX_OKAY) | (1ULL << WIDX_CANCEL); WindowInitScrollWidgets(window); rct_widget* const viewportWidget = &window_title_command_editor_widgets[WIDX_VIEWPORT]; @@ -741,21 +742,21 @@ static void window_title_command_editor_invalidate(rct_window* w) // Draw button pressed while the tool is active if (sprite_selector_tool_is_active()) - w->pressed_widgets |= (1 << WIDX_SELECT_SPRITE); + w->pressed_widgets |= (1ULL << WIDX_SELECT_SPRITE); else - w->pressed_widgets &= ~(1 << WIDX_SELECT_SPRITE); + w->pressed_widgets &= ~(1ULL << WIDX_SELECT_SPRITE); break; } if ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO) { - w->disabled_widgets |= (1 << WIDX_GET) | (1 << WIDX_SELECT_SPRITE); + w->disabled_widgets |= (1ULL << WIDX_GET) | (1ULL << WIDX_SELECT_SPRITE); window_title_command_editor_widgets[WIDX_SELECT_SPRITE].tooltip = STR_TITLE_COMMAND_EDITOR_SELECT_SPRITE_TOOLTIP; } else { - w->disabled_widgets &= ~((1 << WIDX_GET) | (1 << WIDX_SELECT_SPRITE)); + w->disabled_widgets &= ~((1ULL << WIDX_GET) | (1ULL << WIDX_SELECT_SPRITE)); window_title_command_editor_widgets[WIDX_SELECT_SPRITE].tooltip = STR_NONE; } } diff --git a/src/openrct2-ui/windows/TitleEditor.cpp b/src/openrct2-ui/windows/TitleEditor.cpp index 5c3aa219c0..a38b3a3957 100644 --- a/src/openrct2-ui/windows/TitleEditor.cpp +++ b/src/openrct2-ui/windows/TitleEditor.cpp @@ -214,22 +214,22 @@ void window_title_editor_open(int32_t tab) window = WindowCreateAutoPos(WW, WH2, &window_title_editor_events, WC_TITLE_EDITOR, WF_10 | WF_RESIZABLE); window->widgets = window_title_editor_widgets; - window->enabled_widgets = (1 << WIDX_TITLE_EDITOR_CLOSE) | (1 << WIDX_TITLE_EDITOR_PRESETS_TAB) - | (1 << WIDX_TITLE_EDITOR_SAVES_TAB) | (1 << WIDX_TITLE_EDITOR_SCRIPT_TAB) | + window->enabled_widgets = (1ULL << WIDX_TITLE_EDITOR_CLOSE) | (1ULL << WIDX_TITLE_EDITOR_PRESETS_TAB) + | (1ULL << WIDX_TITLE_EDITOR_SAVES_TAB) | (1ULL << WIDX_TITLE_EDITOR_SCRIPT_TAB) | - (1 << WIDX_TITLE_EDITOR_PRESETS) | (1 << WIDX_TITLE_EDITOR_PRESETS_DROPDOWN) | (1 << WIDX_TITLE_EDITOR_NEW_BUTTON) - | (1 << WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) | (1 << WIDX_TITLE_EDITOR_DELETE_BUTTON) - | (1 << WIDX_TITLE_EDITOR_RENAME_BUTTON) | + (1ULL << WIDX_TITLE_EDITOR_PRESETS) | (1ULL << WIDX_TITLE_EDITOR_PRESETS_DROPDOWN) + | (1ULL << WIDX_TITLE_EDITOR_NEW_BUTTON) | (1ULL << WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) + | (1ULL << WIDX_TITLE_EDITOR_DELETE_BUTTON) | (1ULL << WIDX_TITLE_EDITOR_RENAME_BUTTON) | - (1 << WIDX_TITLE_EDITOR_ADD_SAVE) | (1 << WIDX_TITLE_EDITOR_REMOVE_SAVE) | (1 << WIDX_TITLE_EDITOR_RENAME_SAVE) - | (1 << WIDX_TITLE_EDITOR_LOAD_SAVE) | + (1ULL << WIDX_TITLE_EDITOR_ADD_SAVE) | (1ULL << WIDX_TITLE_EDITOR_REMOVE_SAVE) | (1ULL << WIDX_TITLE_EDITOR_RENAME_SAVE) + | (1ULL << WIDX_TITLE_EDITOR_LOAD_SAVE) | - (1 << WIDX_TITLE_EDITOR_INSERT) | (1 << WIDX_TITLE_EDITOR_EDIT) | (1 << WIDX_TITLE_EDITOR_DELETE) | - //(1 << WIDX_TITLE_EDITOR_RELOAD) | - (1 << WIDX_TITLE_EDITOR_SKIP_TO) | (1 << WIDX_TITLE_EDITOR_MOVE_DOWN) | (1 << WIDX_TITLE_EDITOR_MOVE_UP) | + (1ULL << WIDX_TITLE_EDITOR_INSERT) | (1ULL << WIDX_TITLE_EDITOR_EDIT) | (1ULL << WIDX_TITLE_EDITOR_DELETE) | + //(1ULL << WIDX_TITLE_EDITOR_RELOAD) | + (1ULL << WIDX_TITLE_EDITOR_SKIP_TO) | (1ULL << WIDX_TITLE_EDITOR_MOVE_DOWN) | (1ULL << WIDX_TITLE_EDITOR_MOVE_UP) | - (1 << WIDX_TITLE_EDITOR_PLAY) | (1 << WIDX_TITLE_EDITOR_STOP) | (1 << WIDX_TITLE_EDITOR_REPLAY) - | (1 << WIDX_TITLE_EDITOR_SKIP); + (1ULL << WIDX_TITLE_EDITOR_PLAY) | (1ULL << WIDX_TITLE_EDITOR_STOP) | (1ULL << WIDX_TITLE_EDITOR_REPLAY) + | (1ULL << WIDX_TITLE_EDITOR_SKIP); WindowInitScrollWidgets(window); window->list_information_type = 0; @@ -784,16 +784,16 @@ static void window_title_editor_invalidate(rct_window* w) window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].bottom = w->height - 16; if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) && gScreenFlags != SCREEN_FLAGS_PLAYING) - w->disabled_widgets |= (1 << WIDX_TITLE_EDITOR_PLAY); + w->disabled_widgets |= (1ULL << WIDX_TITLE_EDITOR_PLAY); else - w->disabled_widgets &= ~(1 << WIDX_TITLE_EDITOR_PLAY); + w->disabled_widgets &= ~(1ULL << WIDX_TITLE_EDITOR_PLAY); if (!title_is_previewing_sequence()) - w->disabled_widgets |= (1 << WIDX_TITLE_EDITOR_REPLAY) | (1 << WIDX_TITLE_EDITOR_STOP) | (1 << WIDX_TITLE_EDITOR_SKIP) - | (1 << WIDX_TITLE_EDITOR_SKIP_TO); + w->disabled_widgets |= (1ULL << WIDX_TITLE_EDITOR_REPLAY) | (1ULL << WIDX_TITLE_EDITOR_STOP) + | (1ULL << WIDX_TITLE_EDITOR_SKIP) | (1ULL << WIDX_TITLE_EDITOR_SKIP_TO); else w->disabled_widgets &= ~( - (1 << WIDX_TITLE_EDITOR_REPLAY) | (1 << WIDX_TITLE_EDITOR_STOP) | (1 << WIDX_TITLE_EDITOR_SKIP) - | (1 << WIDX_TITLE_EDITOR_SKIP_TO)); + (1ULL << WIDX_TITLE_EDITOR_REPLAY) | (1ULL << WIDX_TITLE_EDITOR_STOP) | (1ULL << WIDX_TITLE_EDITOR_SKIP) + | (1ULL << WIDX_TITLE_EDITOR_SKIP_TO)); } static void window_title_editor_paint(rct_window* w, rct_drawpixelinfo* dpi) diff --git a/src/openrct2-ui/windows/TitleLogo.cpp b/src/openrct2-ui/windows/TitleLogo.cpp index f3602e75de..1986efed15 100644 --- a/src/openrct2-ui/windows/TitleLogo.cpp +++ b/src/openrct2-ui/windows/TitleLogo.cpp @@ -51,7 +51,7 @@ rct_window* window_title_logo_open() window->colours[0] = TRANSLUCENT(COLOUR_GREY); window->colours[1] = TRANSLUCENT(COLOUR_GREY); window->colours[2] = TRANSLUCENT(COLOUR_GREY); - window->enabled_widgets = (1 << WIDX_LOGO); + window->enabled_widgets = (1ULL << WIDX_LOGO); return window; } diff --git a/src/openrct2-ui/windows/TitleMenu.cpp b/src/openrct2-ui/windows/TitleMenu.cpp index c28fcaea1c..504bdcfcef 100644 --- a/src/openrct2-ui/windows/TitleMenu.cpp +++ b/src/openrct2-ui/windows/TitleMenu.cpp @@ -77,11 +77,11 @@ rct_window* window_title_menu_open() window->widgets = window_title_menu_widgets; window->enabled_widgets - = ((1 << WIDX_START_NEW_GAME) | (1 << WIDX_CONTINUE_SAVED_GAME) | + = ((1ULL << WIDX_START_NEW_GAME) | (1ULL << WIDX_CONTINUE_SAVED_GAME) | #ifndef DISABLE_NETWORK - (1 << WIDX_MULTIPLAYER) | + (1ULL << WIDX_MULTIPLAYER) | #endif - (1 << WIDX_GAME_TOOLS)); + (1ULL << WIDX_GAME_TOOLS)); rct_widgetindex i = 0; int32_t x = 0; diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index 7c90576c4d..1ce015b2e4 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -797,14 +797,14 @@ static void window_top_toolbar_invalidate(rct_window* w) // Footpath button pressed down if (window_find_by_class(WC_FOOTPATH) == nullptr) - w->pressed_widgets &= ~(1 << WIDX_PATH); + w->pressed_widgets &= ~(1ULL << WIDX_PATH); else - w->pressed_widgets |= (1 << WIDX_PATH); + w->pressed_widgets |= (1ULL << WIDX_PATH); if (gGamePaused & GAME_PAUSED_NORMAL) - w->pressed_widgets |= (1 << WIDX_PAUSE); + w->pressed_widgets |= (1ULL << WIDX_PAUSE); else - w->pressed_widgets &= ~(1 << WIDX_PAUSE); + w->pressed_widgets &= ~(1ULL << WIDX_PAUSE); if (!OpenRCT2::Audio::gGameSoundsOff) window_top_toolbar_widgets[WIDX_MUTE].image = IMAGE_TYPE_REMAP | SPR_G2_TOOLBAR_MUTE; @@ -835,15 +835,15 @@ static void window_top_toolbar_invalidate(rct_window* w) if (mainWindow->viewport->zoom == ZoomLevel::min()) { - w->disabled_widgets |= (1 << WIDX_ZOOM_IN); + w->disabled_widgets |= (1ULL << WIDX_ZOOM_IN); } else if (mainWindow->viewport->zoom >= ZoomLevel::max()) { - w->disabled_widgets |= (1 << WIDX_ZOOM_OUT); + w->disabled_widgets |= (1ULL << WIDX_ZOOM_OUT); } else { - w->disabled_widgets &= ~((1 << WIDX_ZOOM_IN) | (1 << WIDX_ZOOM_OUT)); + w->disabled_widgets &= ~((1ULL << WIDX_ZOOM_IN) | (1ULL << WIDX_ZOOM_OUT)); } } @@ -1167,7 +1167,7 @@ static void sub_6E1F34_update_screen_coords_and_buttons_pressed(bool canRaiseIte if (InputTestPlaceObjectModifier(PLACE_OBJECT_MODIFIER_COPY_Z)) { // CTRL pressed - auto flags = EnumsToFlags( + constexpr auto flags = EnumsToFlags( ViewportInteractionItem::Terrain, ViewportInteractionItem::Ride, ViewportInteractionItem::Scenery, ViewportInteractionItem::Footpath, ViewportInteractionItem::Wall, ViewportInteractionItem::LargeScenery); auto info = get_map_coordinates_from_pos(screenPos, flags); @@ -1337,7 +1337,7 @@ static void sub_6E1F34_small_scenery( // If CTRL not pressed if (!gSceneryCtrlPressed) { - auto flags = EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water); + constexpr auto flags = EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water); auto info = get_map_coordinates_from_pos(screenPos, flags); gridPos = info.Loc; @@ -1431,7 +1431,7 @@ static void sub_6E1F34_path_item( sub_6E1F34_update_screen_coords_and_buttons_pressed(false, screenPos); // Path bits - auto flags = EnumsToFlags(ViewportInteractionItem::Footpath, ViewportInteractionItem::FootpathItem); + constexpr auto flags = EnumsToFlags(ViewportInteractionItem::Footpath, ViewportInteractionItem::FootpathItem); auto info = get_map_coordinates_from_pos(screenPos, flags); gridPos = info.Loc; @@ -1653,7 +1653,7 @@ static void sub_6E1F34_banner( sub_6E1F34_update_screen_coords_and_buttons_pressed(false, screenPos); // Banner - auto flags = EnumsToFlags(ViewportInteractionItem::Footpath, ViewportInteractionItem::FootpathItem); + constexpr auto flags = EnumsToFlags(ViewportInteractionItem::Footpath, ViewportInteractionItem::FootpathItem); auto info = get_map_coordinates_from_pos(screenPos, flags); gridPos = info.Loc; diff --git a/src/openrct2-ui/windows/TrackDesignManage.cpp b/src/openrct2-ui/windows/TrackDesignManage.cpp index 66eb6d374d..10d541600d 100644 --- a/src/openrct2-ui/windows/TrackDesignManage.cpp +++ b/src/openrct2-ui/windows/TrackDesignManage.cpp @@ -95,7 +95,7 @@ rct_window* window_track_manage_open(track_design_file_ref* tdFileRef) rct_window* w = WindowCreateCentred( 250, 44, &window_track_manage_events, WC_MANAGE_TRACK_DESIGN, WF_STICK_TO_FRONT | WF_TRANSPARENT); w->widgets = window_track_manage_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RENAME) | (1 << WIDX_DELETE); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_RENAME) | (1ULL << WIDX_DELETE); WindowInitScrollWidgets(w); rct_window* trackDesignListWindow = window_find_by_class(WC_TRACK_DESIGN_LIST); @@ -203,7 +203,7 @@ static void window_track_delete_prompt_open() ScreenCoordsXY(std::max(TOP_TOOLBAR_HEIGHT + 1, (screenWidth - 250) / 2), (screenHeight - 44) / 2), 250, 74, &window_track_delete_prompt_events, WC_TRACK_DELETE_PROMPT, WF_STICK_TO_FRONT); w->widgets = window_track_delete_prompt_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RENAME) | (1 << WIDX_DELETE); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_RENAME) | (1ULL << WIDX_DELETE); WindowInitScrollWidgets(w); w->flags |= WF_TRANSPARENT; } diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index 6ce284dd92..226bac4c0a 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -144,7 +144,7 @@ rct_window* window_track_place_open(const track_design_file_ref* tdFileRef) rct_window* w = WindowCreate(ScreenCoordsXY(0, 29), 200, 124, &window_track_place_events, WC_TRACK_DESIGN_PLACE, 0); w->widgets = window_track_place_widgets; - w->enabled_widgets = 1 << WIDX_CLOSE | 1 << WIDX_ROTATE | 1 << WIDX_MIRROR | 1 << WIDX_SELECT_DIFFERENT_DESIGN; + w->enabled_widgets = 1ULL << WIDX_CLOSE | 1ULL << WIDX_ROTATE | 1ULL << WIDX_MIRROR | 1ULL << WIDX_SELECT_DIFFERENT_DESIGN; WindowInitScrollWidgets(w); tool_set(w, WIDX_PRICE, Tool::Crosshair); input_set_flag(INPUT_FLAG_6, true); diff --git a/src/openrct2-ui/windows/TrackList.cpp b/src/openrct2-ui/windows/TrackList.cpp index f98b0a02b8..88ab3fd192 100644 --- a/src/openrct2-ui/windows/TrackList.cpp +++ b/src/openrct2-ui/windows/TrackList.cpp @@ -241,7 +241,7 @@ static void window_track_list_select(rct_window* w, int32_t listIndex) // Displays a message if the ride can't load, fix #4080 if (_loadedTrackDesign == nullptr) { - context_show_error(STR_CANT_BUILD_PARK_ENTRANCE_HERE, STR_TRACK_LOAD_FAILED_ERROR, {}); + context_show_error(STR_CANT_BUILD_THIS_HERE, STR_TRACK_LOAD_FAILED_ERROR, {}); return; } @@ -454,23 +454,23 @@ static void window_track_list_invalidate(rct_window* w) if ((gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER) || w->selected_list_item != 0) { - w->pressed_widgets |= 1 << WIDX_TRACK_PREVIEW; - w->disabled_widgets &= ~(1 << WIDX_TRACK_PREVIEW); + w->pressed_widgets |= 1ULL << WIDX_TRACK_PREVIEW; + w->disabled_widgets &= ~(1ULL << WIDX_TRACK_PREVIEW); window_track_list_widgets[WIDX_ROTATE].type = WindowWidgetType::FlatBtn; window_track_list_widgets[WIDX_TOGGLE_SCENERY].type = WindowWidgetType::FlatBtn; if (gTrackDesignSceneryToggle) { - w->pressed_widgets &= ~(1 << WIDX_TOGGLE_SCENERY); + w->pressed_widgets &= ~(1ULL << WIDX_TOGGLE_SCENERY); } else { - w->pressed_widgets |= (1 << WIDX_TOGGLE_SCENERY); + w->pressed_widgets |= (1ULL << WIDX_TOGGLE_SCENERY); } } else { - w->pressed_widgets &= ~(1 << WIDX_TRACK_PREVIEW); - w->disabled_widgets |= (1 << WIDX_TRACK_PREVIEW); + w->pressed_widgets &= ~(1ULL << WIDX_TRACK_PREVIEW); + w->disabled_widgets |= (1ULL << WIDX_TRACK_PREVIEW); window_track_list_widgets[WIDX_ROTATE].type = WindowWidgetType::Empty; window_track_list_widgets[WIDX_TOGGLE_SCENERY].type = WindowWidgetType::Empty; } diff --git a/src/openrct2-ui/windows/Viewport.cpp b/src/openrct2-ui/windows/Viewport.cpp index 2e29976c70..ea481aedd9 100644 --- a/src/openrct2-ui/windows/Viewport.cpp +++ b/src/openrct2-ui/windows/Viewport.cpp @@ -66,7 +66,7 @@ rct_window* window_viewport_open() { rct_window* w = WindowCreateAutoPos(WW, WH, &window_viewport_events, WC_VIEWPORT, WF_RESIZABLE); w->widgets = window_viewport_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_ZOOM_IN) | (1 << WIDX_ZOOM_OUT) | (1 << WIDX_LOCATE); + w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_ZOOM_IN) | (1ULL << WIDX_ZOOM_OUT) | (1ULL << WIDX_LOCATE); w->number = _viewportNumber++; // Create viewport @@ -180,9 +180,9 @@ static void window_viewport_invalidate(rct_window* w) // Set disabled widgets w->disabled_widgets = 0; if (viewport->zoom == ZoomLevel::min()) - w->disabled_widgets |= 1 << WIDX_ZOOM_IN; + w->disabled_widgets |= 1ULL << WIDX_ZOOM_IN; if (viewport->zoom >= ZoomLevel::max()) - w->disabled_widgets |= 1 << WIDX_ZOOM_OUT; + w->disabled_widgets |= 1ULL << WIDX_ZOOM_OUT; viewport->pos = w->windowPos + ScreenCoordsXY{ viewportWidget->left, viewportWidget->top }; viewport->width = viewportWidget->width(); diff --git a/src/openrct2-ui/windows/Water.cpp b/src/openrct2-ui/windows/Water.cpp index 49b95a5aef..2812e2d831 100644 --- a/src/openrct2-ui/windows/Water.cpp +++ b/src/openrct2-ui/windows/Water.cpp @@ -45,8 +45,8 @@ public: void OnOpen() override { widgets = window_water_widgets; - enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_DECREMENT) | (1 << WIDX_INCREMENT) | (1 << WIDX_PREVIEW); - hold_down_widgets = (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT); + enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_DECREMENT) | (1ULL << WIDX_INCREMENT) | (1ULL << WIDX_PREVIEW); + hold_down_widgets = (1ULL << WIDX_INCREMENT) | (1ULL << WIDX_DECREMENT); WindowInitScrollWidgets(this); window_push_others_below(this); diff --git a/src/openrct2/GameState.cpp b/src/openrct2/GameState.cpp index 2819d74356..463405558a 100644 --- a/src/openrct2/GameState.cpp +++ b/src/openrct2/GameState.cpp @@ -155,14 +155,24 @@ void GameState::Update() } else { + // NOTE: Here are a few special cases that would be normally handled in UpdateLogic. + // If the game is paused it will not call UpdateLogic at all. numUpdates = 0; + + if (network_get_mode() == NETWORK_MODE_SERVER) + { + // Make sure the client always knows about what tick the host is on. + network_send_tick(); + } + // Update the animation list. Note this does not // increment the map animation. map_animation_invalidate_all(); - // Special case because we set numUpdates to 0, otherwise in game_logic_update. + // Post-tick network update network_process_pending(); + // Post-tick game actions. GameActions::ProcessQueue(); } } diff --git a/src/openrct2/ParkFile.cpp b/src/openrct2/ParkFile.cpp index d2746fa8ac..0b03c0a0e0 100644 --- a/src/openrct2/ParkFile.cpp +++ b/src/openrct2/ParkFile.cpp @@ -400,7 +400,7 @@ namespace OpenRCT2 cs.ReadWrite(gGrassSceneryTileLoopPosition); cs.ReadWrite(gWidePathTileLoopPosition); - ReadWriteRideRatingCalculationData(cs, gRideRatingsCalcData); + ReadWriteRideRatingCalculationData(cs, gRideRatingUpdateState); }); if (!found) { @@ -408,7 +408,7 @@ namespace OpenRCT2 } } - void ReadWriteRideRatingCalculationData(OrcaStream::ChunkStream& cs, RideRatingCalculationData& calcData) + void ReadWriteRideRatingCalculationData(OrcaStream::ChunkStream& cs, RideRatingUpdateState& calcData) { cs.ReadWrite(calcData.AmountOfBrakes); cs.ReadWrite(calcData.Proximity); diff --git a/src/openrct2/Version.h b/src/openrct2/Version.h index ece3af334c..0fbe74cf73 100644 --- a/src/openrct2/Version.h +++ b/src/openrct2/Version.h @@ -14,7 +14,7 @@ #include #define OPENRCT2_NAME "OpenRCT2" -#define OPENRCT2_VERSION "0.3.3" +#define OPENRCT2_VERSION "0.3.4" #if defined(__amd64__) || defined(_M_AMD64) # define OPENRCT2_ARCHITECTURE "x86-64" diff --git a/src/openrct2/actions/BannerPlaceAction.cpp b/src/openrct2/actions/BannerPlaceAction.cpp index 4b256b9be1..28a029cc40 100644 --- a/src/openrct2/actions/BannerPlaceAction.cpp +++ b/src/openrct2/actions/BannerPlaceAction.cpp @@ -73,17 +73,17 @@ GameActions::Result::Ptr BannerPlaceAction::Query() const res->Expenditure = ExpenditureType::Landscaping; res->ErrorTitle = STR_CANT_POSITION_THIS_HERE; + if (!LocationValid(_loc)) + { + return MakeResult(GameActions::Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE); + } + if (!MapCheckCapacityAndReorganise(_loc)) { log_error("No free map elements."); return MakeResult(GameActions::Status::NoFreeElements, STR_CANT_POSITION_THIS_HERE); } - if (!LocationValid(_loc)) - { - return MakeResult(GameActions::Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE); - } - auto pathElement = GetValidPathElement(); if (pathElement == nullptr) diff --git a/src/openrct2/actions/FootpathPlaceAction.cpp b/src/openrct2/actions/FootpathPlaceAction.cpp index be5b708c99..d345846653 100644 --- a/src/openrct2/actions/FootpathPlaceAction.cpp +++ b/src/openrct2/actions/FootpathPlaceAction.cpp @@ -286,20 +286,21 @@ GameActions::Result::Ptr FootpathPlaceAction::ElementInsertQuery(GameActions::Re res->Cost -= MONEY(6, 00); } - // Do not attempt to build a crossing with a queue or a sloped. + // Do not attempt to build a crossing with a queue or a sloped path. auto isQueue = _constructFlags & PathConstructFlag::IsQueue; uint8_t crossingMode = isQueue || (_slope != TILE_ELEMENT_SLOPE_FLAT) ? CREATE_CROSSING_MODE_NONE : CREATE_CROSSING_MODE_PATH_OVER_TRACK; - if (!entrancePath - && !map_can_construct_with_clear_at( - { _loc, zLow, zHigh }, &map_place_non_scenery_clear_func, quarterTile, GetFlags(), &res->Cost, crossingMode)) + auto canBuild = MapCanConstructWithClearAt( + { _loc, zLow, zHigh }, &map_place_non_scenery_clear_func, quarterTile, GetFlags(), crossingMode); + if (!entrancePath && canBuild->Error != GameActions::Status::Ok) { - return MakeResult( - GameActions::Status::NoClearance, STR_CANT_BUILD_FOOTPATH_HERE, gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = STR_CANT_BUILD_FOOTPATH_HERE; + return canBuild; } + res->Cost += canBuild->Cost; - gFootpathGroundFlags = gMapGroundFlags; - if (!gCheatsDisableClearanceChecks && (gMapGroundFlags & ELEMENT_IS_UNDERWATER)) + gFootpathGroundFlags = canBuild->GroundFlags; + if (!gCheatsDisableClearanceChecks && (canBuild->GroundFlags & ELEMENT_IS_UNDERWATER)) { return MakeResult(GameActions::Status::Disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_CANT_BUILD_THIS_UNDERWATER); } @@ -360,11 +361,12 @@ GameActions::Result::Ptr FootpathPlaceAction::ElementInsertExecute(GameActions:: crossingMode); if (!entrancePath && canBuild->Error != GameActions::Status::Ok) { + canBuild->ErrorTitle = STR_CANT_BUILD_FOOTPATH_HERE; return canBuild; } res->Cost += canBuild->Cost; - gFootpathGroundFlags = gMapGroundFlags; + gFootpathGroundFlags = canBuild->GroundFlags; auto surfaceElement = map_get_surface_element_at(_loc); if (surfaceElement == nullptr) diff --git a/src/openrct2/actions/FootpathPlaceFromTrackAction.cpp b/src/openrct2/actions/FootpathPlaceFromTrackAction.cpp index adb2134393..55762b8f57 100644 --- a/src/openrct2/actions/FootpathPlaceFromTrackAction.cpp +++ b/src/openrct2/actions/FootpathPlaceFromTrackAction.cpp @@ -132,21 +132,21 @@ GameActions::Result::Ptr FootpathPlaceFromTrackAction::ElementInsertQuery(GameAc res->Cost -= MONEY(6, 00); } - // Do not attempt to build a crossing with a queue or a sloped. + // Do not attempt to build a crossing with a queue or a sloped path. auto isQueue = _constructFlags & PathConstructFlag::IsQueue; uint8_t crossingMode = isQueue || (_slope != TILE_ELEMENT_SLOPE_FLAT) ? CREATE_CROSSING_MODE_NONE : CREATE_CROSSING_MODE_PATH_OVER_TRACK; - if (!entrancePath - && !map_can_construct_with_clear_at( - { _loc, zLow, zHigh }, &map_place_non_scenery_clear_func, quarterTile, GetFlags(), &res->Cost, crossingMode)) + auto canBuild = MapCanConstructWithClearAt( + { _loc, zLow, zHigh }, &map_place_non_scenery_clear_func, quarterTile, GetFlags(), crossingMode); + if (!entrancePath && canBuild->Error != GameActions::Status::Ok) { - return MakeResult( - GameActions::Status::NoClearance, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, gGameCommandErrorText, - gCommonFormatArgs); + canBuild->ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + return canBuild; } + res->Cost += canBuild->Cost; + gFootpathGroundFlags = canBuild->GroundFlags; - gFootpathGroundFlags = gMapGroundFlags; - if (!gCheatsDisableClearanceChecks && (gMapGroundFlags & ELEMENT_IS_UNDERWATER)) + if (!gCheatsDisableClearanceChecks && (canBuild->GroundFlags & ELEMENT_IS_UNDERWATER)) { return MakeResult( GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); @@ -199,21 +199,20 @@ GameActions::Result::Ptr FootpathPlaceFromTrackAction::ElementInsertExecute(Game res->Cost -= MONEY(6, 00); } - // Do not attempt to build a crossing with a queue or a sloped. + // Do not attempt to build a crossing with a queue or a sloped path. auto isQueue = _constructFlags & PathConstructFlag::IsQueue; uint8_t crossingMode = isQueue || (_slope != TILE_ELEMENT_SLOPE_FLAT) ? CREATE_CROSSING_MODE_NONE : CREATE_CROSSING_MODE_PATH_OVER_TRACK; - if (!entrancePath - && !map_can_construct_with_clear_at( - { _loc, zLow, zHigh }, &map_place_non_scenery_clear_func, quarterTile, GAME_COMMAND_FLAG_APPLY | GetFlags(), - &res->Cost, crossingMode)) + auto canBuild = MapCanConstructWithClearAt( + { _loc, zLow, zHigh }, &map_place_non_scenery_clear_func, quarterTile, GAME_COMMAND_FLAG_APPLY | GetFlags(), + crossingMode); + if (!entrancePath && canBuild->Error != GameActions::Status::Ok) { - return MakeResult( - GameActions::Status::NoClearance, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, gGameCommandErrorText, - gCommonFormatArgs); + canBuild->ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + return canBuild; } - - gFootpathGroundFlags = gMapGroundFlags; + res->Cost += canBuild->Cost; + gFootpathGroundFlags = canBuild->GroundFlags; auto surfaceElement = map_get_surface_element_at(_loc); if (surfaceElement == nullptr) diff --git a/src/openrct2/actions/LargeSceneryPlaceAction.cpp b/src/openrct2/actions/LargeSceneryPlaceAction.cpp index d3d3c5afc2..6070ce0c9b 100644 --- a/src/openrct2/actions/LargeSceneryPlaceAction.cpp +++ b/src/openrct2/actions/LargeSceneryPlaceAction.cpp @@ -119,12 +119,6 @@ GameActions::Result::Ptr LargeSceneryPlaceAction::Query() const } } - if (!CheckMapCapacity(sceneryEntry->tiles, totalNumTiles)) - { - log_error("No free map elements available"); - return std::make_unique(GameActions::Status::NoFreeElements); - } - uint8_t tileNum = 0; for (rct_large_scenery_tile* tile = sceneryEntry->tiles; tile->x_offset != -1; tile++, tileNum++) { @@ -137,18 +131,22 @@ GameActions::Result::Ptr LargeSceneryPlaceAction::Query() const int32_t zHigh = tile->z_clearance + zLow; QuarterTile quarterTile = QuarterTile{ static_cast(tile->flags >> 12), 0 }.Rotate(_loc.direction); - if (!map_can_construct_with_clear_at( - { curTile, zLow, zHigh }, &map_place_scenery_clear_func, quarterTile, GetFlags(), &supportsCost, - CREATE_CROSSING_MODE_NONE, (sceneryEntry->flags & LARGE_SCENERY_FLAG_IS_TREE) != 0)) + const auto isTree = (sceneryEntry->flags & LARGE_SCENERY_FLAG_IS_TREE) != 0; + auto canBuild = MapCanConstructWithClearAt( + { curTile, zLow, zHigh }, &map_place_scenery_clear_func, quarterTile, GetFlags(), CREATE_CROSSING_MODE_NONE, + isTree); + if (canBuild->Error != GameActions::Status::Ok) { - return std::make_unique( - GameActions::Status::NoClearance, gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = STR_CANT_POSITION_THIS_HERE; + return canBuild; } - int32_t tempSceneryGroundFlags = gMapGroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); + supportsCost += canBuild->Cost; + + int32_t tempSceneryGroundFlags = canBuild->GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); if (!gCheatsDisableClearanceChecks) { - if ((gMapGroundFlags & ELEMENT_IS_UNDERWATER) || (gMapGroundFlags & ELEMENT_IS_UNDERGROUND)) + if ((canBuild->GroundFlags & ELEMENT_IS_UNDERWATER) || (canBuild->GroundFlags & ELEMENT_IS_UNDERGROUND)) { return std::make_unique( GameActions::Status::Disallowed, STR_CANT_BUILD_THIS_UNDERWATER); @@ -162,7 +160,7 @@ GameActions::Result::Ptr LargeSceneryPlaceAction::Query() const res->GroundFlags = tempSceneryGroundFlags; - if (!LocationValid(curTile) || curTile.x >= GetMapSizeUnits() || curTile.y >= GetMapSizeUnits()) + if (!LocationValid(curTile) || map_is_edge(curTile)) { return std::make_unique(GameActions::Status::Disallowed, STR_OFF_EDGE_OF_MAP); } @@ -173,6 +171,12 @@ GameActions::Result::Ptr LargeSceneryPlaceAction::Query() const } } + if (!CheckMapCapacity(sceneryEntry->tiles, totalNumTiles)) + { + log_error("No free map elements available"); + return std::make_unique(GameActions::Status::NoFreeElements); + } + // Force ride construction to recheck area _currentTrackSelectionFlags |= TRACK_SELECTION_FLAG_RECHECK; @@ -263,15 +267,18 @@ GameActions::Result::Ptr LargeSceneryPlaceAction::Execute() const int32_t zHigh = tile->z_clearance + zLow; QuarterTile quarterTile = QuarterTile{ static_cast(tile->flags >> 12), 0 }.Rotate(_loc.direction); - if (!map_can_construct_with_clear_at( - { curTile, zLow, zHigh }, &map_place_scenery_clear_func, quarterTile, GetFlags(), &supportsCost, - CREATE_CROSSING_MODE_NONE, (sceneryEntry->flags & LARGE_SCENERY_FLAG_IS_TREE) != 0)) + const auto isTree = (sceneryEntry->flags & LARGE_SCENERY_FLAG_IS_TREE) != 0; + auto canBuild = MapCanConstructWithClearAt( + { curTile, zLow, zHigh }, &map_place_scenery_clear_func, quarterTile, GetFlags(), CREATE_CROSSING_MODE_NONE, + isTree); + if (canBuild->Error != GameActions::Status::Ok) { DeleteBanner(banner->id); return MakeResult(GameActions::Status::NoClearance, gGameCommandErrorText, gCommonFormatArgs); } - res->GroundFlags = gMapGroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); + supportsCost += canBuild->Cost; + res->GroundFlags = canBuild->GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) { diff --git a/src/openrct2/actions/MazePlaceTrackAction.cpp b/src/openrct2/actions/MazePlaceTrackAction.cpp index 0b5f7d356e..aa394ea0ea 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.cpp +++ b/src/openrct2/actions/MazePlaceTrackAction.cpp @@ -39,12 +39,6 @@ GameActions::Result::Ptr MazePlaceTrackAction::Query() const res->Position = _loc + CoordsXYZ{ 8, 8, 0 }; res->Expenditure = ExpenditureType::RideConstruction; res->ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; - if (!MapCheckCapacityAndReorganise(_loc)) - { - res->Error = GameActions::Status::NoFreeElements; - res->ErrorMessage = STR_TILE_ELEMENT_LIMIT_REACHED; - return res; - } if ((_loc.z & 0xF) != 0) { res->Error = GameActions::Status::Unknown; @@ -59,6 +53,12 @@ GameActions::Result::Ptr MazePlaceTrackAction::Query() const return res; } + if (!MapCheckCapacityAndReorganise(_loc)) + { + res->Error = GameActions::Status::NoFreeElements; + res->ErrorMessage = STR_TILE_ELEMENT_LIMIT_REACHED; + return res; + } auto surfaceElement = map_get_surface_element_at(_loc); if (surfaceElement == nullptr) { @@ -83,24 +83,22 @@ GameActions::Result::Ptr MazePlaceTrackAction::Query() const } } - money32 clearCost = 0; - - if (!map_can_construct_with_clear_at( - { _loc.ToTileStart(), baseHeight, clearanceHeight }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, GetFlags(), - &clearCost, CREATE_CROSSING_MODE_NONE)) + auto canBuild = MapCanConstructWithClearAt( + { _loc.ToTileStart(), baseHeight, clearanceHeight }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, GetFlags()); + if (canBuild->Error != GameActions::Status::Ok) { - return MakeResult( - GameActions::Status::NoClearance, res->ErrorTitle.GetStringId(), gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + return canBuild; } - if (gMapGroundFlags & ELEMENT_IS_UNDERWATER) + if (canBuild->GroundFlags & ELEMENT_IS_UNDERWATER) { res->Error = GameActions::Status::NoClearance; res->ErrorMessage = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; return res; } - if (gMapGroundFlags & ELEMENT_IS_UNDERGROUND) + if (canBuild->GroundFlags & ELEMENT_IS_UNDERGROUND) { res->Error = GameActions::Status::NoClearance; res->ErrorMessage = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; @@ -116,7 +114,7 @@ GameActions::Result::Ptr MazePlaceTrackAction::Query() const } money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * TrackPricing[TrackElemType::Maze]) >> 16)); - res->Cost = clearCost + price / 2 * 10; + res->Cost = canBuild->Cost + price / 2 * 10; return res; } @@ -137,13 +135,6 @@ GameActions::Result::Ptr MazePlaceTrackAction::Execute() const return res; } - if (!MapCheckCapacityAndReorganise(_loc)) - { - res->Error = GameActions::Status::NoFreeElements; - res->ErrorMessage = STR_NONE; - return res; - } - uint32_t flags = GetFlags(); if (!(flags & GAME_COMMAND_FLAG_GHOST)) { @@ -154,17 +145,17 @@ GameActions::Result::Ptr MazePlaceTrackAction::Execute() const auto baseHeight = _loc.z; auto clearanceHeight = _loc.z + MAZE_CLEARANCE_HEIGHT; - money32 clearCost = 0; - if (!map_can_construct_with_clear_at( - { _loc.ToTileStart(), baseHeight, clearanceHeight }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, - GetFlags() | GAME_COMMAND_FLAG_APPLY, &clearCost, CREATE_CROSSING_MODE_NONE)) + auto canBuild = MapCanConstructWithClearAt( + { _loc.ToTileStart(), baseHeight, clearanceHeight }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, + GetFlags() | GAME_COMMAND_FLAG_APPLY); + if (canBuild->Error != GameActions::Status::Ok) { - return MakeResult( - GameActions::Status::NoClearance, res->ErrorTitle.GetStringId(), gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + return canBuild; } money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * TrackPricing[TrackElemType::Maze]) >> 16)); - res->Cost = clearCost + price / 2 * 10; + res->Cost = canBuild->Cost + price / 2 * 10; auto startLoc = _loc.ToTileStart(); diff --git a/src/openrct2/actions/MazeSetTrackAction.cpp b/src/openrct2/actions/MazeSetTrackAction.cpp index 322811c418..d2755adb1c 100644 --- a/src/openrct2/actions/MazeSetTrackAction.cpp +++ b/src/openrct2/actions/MazeSetTrackAction.cpp @@ -51,12 +51,6 @@ GameActions::Result::Ptr MazeSetTrackAction::Query() const res->Position = _loc + CoordsXYZ{ 8, 8, 0 }; res->Expenditure = ExpenditureType::RideConstruction; res->ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; - if (!MapCheckCapacityAndReorganise(_loc)) - { - res->Error = GameActions::Status::NoFreeElements; - res->ErrorMessage = STR_TILE_ELEMENT_LIMIT_REACHED; - return res; - } if ((_loc.z & 0xF) != 0 && _mode == GC_SET_MAZE_TRACK_BUILD) { res->Error = GameActions::Status::Unknown; @@ -71,6 +65,12 @@ GameActions::Result::Ptr MazeSetTrackAction::Query() const return res; } + if (!MapCheckCapacityAndReorganise(_loc)) + { + res->Error = GameActions::Status::NoFreeElements; + res->ErrorMessage = STR_TILE_ELEMENT_LIMIT_REACHED; + return res; + } auto surfaceElement = map_get_surface_element_at(_loc); if (surfaceElement == nullptr) { @@ -159,13 +159,6 @@ GameActions::Result::Ptr MazeSetTrackAction::Execute() const return res; } - if (!MapCheckCapacityAndReorganise(_loc)) - { - res->Error = GameActions::Status::NoFreeElements; - res->ErrorMessage = STR_NONE; - return res; - } - uint32_t flags = GetFlags(); if (!(flags & GAME_COMMAND_FLAG_GHOST)) { diff --git a/src/openrct2/actions/PlaceParkEntranceAction.cpp b/src/openrct2/actions/PlaceParkEntranceAction.cpp index e29344c3c9..af9706f527 100644 --- a/src/openrct2/actions/PlaceParkEntranceAction.cpp +++ b/src/openrct2/actions/PlaceParkEntranceAction.cpp @@ -43,31 +43,29 @@ GameActions::Result::Ptr PlaceParkEntranceAction::Query() const { if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !gCheatsSandboxMode) { - return std::make_unique( - GameActions::Status::NotInEditorMode, STR_CANT_BUILD_PARK_ENTRANCE_HERE, STR_NONE); + return std::make_unique(GameActions::Status::NotInEditorMode, STR_CANT_BUILD_THIS_HERE, STR_NONE); } auto res = std::make_unique(); res->Expenditure = ExpenditureType::LandPurchase; res->Position = { _loc.x, _loc.y, _loc.z }; - if (!CheckMapCapacity(3)) - { - return std::make_unique( - GameActions::Status::NoFreeElements, STR_CANT_BUILD_PARK_ENTRANCE_HERE, STR_NONE); - } - if (!LocationValid(_loc) || _loc.x <= 32 || _loc.y <= 32 || _loc.x >= (GetMapSizeUnits() - 32) || _loc.y >= (GetMapSizeUnits() - 32)) { return std::make_unique( - GameActions::Status::InvalidParameters, STR_CANT_BUILD_PARK_ENTRANCE_HERE, STR_TOO_CLOSE_TO_EDGE_OF_MAP); + GameActions::Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_TOO_CLOSE_TO_EDGE_OF_MAP); + } + + if (!CheckMapCapacity(3)) + { + return std::make_unique(GameActions::Status::NoFreeElements, STR_CANT_BUILD_THIS_HERE, STR_NONE); } if (gParkEntrances.size() >= MAX_PARK_ENTRANCES) { return std::make_unique( - GameActions::Status::InvalidParameters, STR_CANT_BUILD_PARK_ENTRANCE_HERE, STR_ERR_TOO_MANY_PARK_ENTRANCES); + GameActions::Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_TOO_MANY_PARK_ENTRANCES); } auto zLow = _loc.z; @@ -88,7 +86,7 @@ GameActions::Result::Ptr PlaceParkEntranceAction::Query() const if (auto res2 = MapCanConstructAt({ entranceLoc, zLow, zHigh }, { 0b1111, 0 }); res2->Error != GameActions::Status::Ok) { return std::make_unique( - GameActions::Status::NoClearance, STR_CANT_BUILD_PARK_ENTRANCE_HERE, res2->ErrorMessage.GetStringId(), + GameActions::Status::NoClearance, STR_CANT_BUILD_THIS_HERE, res2->ErrorMessage.GetStringId(), res2->ErrorMessageArgs.data()); } @@ -97,7 +95,7 @@ GameActions::Result::Ptr PlaceParkEntranceAction::Query() const if (entranceElement != nullptr) { return std::make_unique( - GameActions::Status::ItemAlreadyPlaced, STR_CANT_BUILD_PARK_ENTRANCE_HERE, STR_NONE); + GameActions::Status::ItemAlreadyPlaced, STR_CANT_BUILD_THIS_HERE, STR_NONE); } } diff --git a/src/openrct2/actions/RideEntranceExitPlaceAction.cpp b/src/openrct2/actions/RideEntranceExitPlaceAction.cpp index 5627295f31..df2b87bf2c 100644 --- a/src/openrct2/actions/RideEntranceExitPlaceAction.cpp +++ b/src/openrct2/actions/RideEntranceExitPlaceAction.cpp @@ -50,10 +50,6 @@ GameActions::Result::Ptr RideEntranceExitPlaceAction::Query() const { auto errorTitle = _isExit ? STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION : STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION; - if (!MapCheckCapacityAndReorganise(_loc)) - { - return MakeResult(GameActions::Status::NoFreeElements, errorTitle); - } auto ride = get_ride(_rideIndex); if (ride == nullptr) @@ -98,16 +94,20 @@ GameActions::Result::Ptr RideEntranceExitPlaceAction::Query() const return MakeResult(GameActions::Status::NotOwned, errorTitle); } - auto clear_z = z + (_isExit ? RideExitHeight : RideEntranceHeight); - auto cost = MONEY32_UNDEFINED; - if (!map_can_construct_with_clear_at( - { _loc, z, clear_z }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, GetFlags(), &cost, - CREATE_CROSSING_MODE_NONE)) + if (!MapCheckCapacityAndReorganise(_loc)) { - return MakeResult(GameActions::Status::NoClearance, errorTitle, gGameCommandErrorText, gCommonFormatArgs); + return MakeResult(GameActions::Status::NoFreeElements, errorTitle); + } + auto clear_z = z + (_isExit ? RideExitHeight : RideEntranceHeight); + auto canBuild = MapCanConstructWithClearAt( + { _loc, z, clear_z }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, GetFlags()); + if (canBuild->Error != GameActions::Status::Ok) + { + canBuild->ErrorTitle = errorTitle; + return canBuild; } - if (gMapGroundFlags & ELEMENT_IS_UNDERWATER) + if (canBuild->GroundFlags & ELEMENT_IS_UNDERWATER) { return MakeResult(GameActions::Status::Disallowed, errorTitle, STR_RIDE_CANT_BUILD_THIS_UNDERWATER); } @@ -163,12 +163,12 @@ GameActions::Result::Ptr RideEntranceExitPlaceAction::Execute() const } auto clear_z = z + (_isExit ? RideExitHeight : RideEntranceHeight); - auto cost = MONEY32_UNDEFINED; - if (!map_can_construct_with_clear_at( - { _loc, z, clear_z }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, GetFlags() | GAME_COMMAND_FLAG_APPLY, &cost, - CREATE_CROSSING_MODE_NONE)) + auto canBuild = MapCanConstructWithClearAt( + { _loc, z, clear_z }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, GetFlags() | GAME_COMMAND_FLAG_APPLY); + if (canBuild->Error != GameActions::Status::Ok) { - return MakeResult(GameActions::Status::NoClearance, errorTitle, gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = errorTitle; + return canBuild; } auto res = MakeResult(); @@ -217,26 +217,26 @@ GameActions::Result::Ptr RideEntranceExitPlaceAction::TrackPlaceQuery(const Coor { auto errorTitle = isExit ? STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION : STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION; - if (!MapCheckCapacityAndReorganise(loc)) - { - return MakeResult(GameActions::Status::NoFreeElements, errorTitle); - } if (!gCheatsSandboxMode && !map_is_location_owned(loc)) { return MakeResult(GameActions::Status::NotOwned, errorTitle); } + if (!MapCheckCapacityAndReorganise(loc)) + { + return MakeResult(GameActions::Status::NoFreeElements, errorTitle); + } int16_t baseZ = loc.z; int16_t clearZ = baseZ + (isExit ? RideExitHeight : RideEntranceHeight); - auto cost = MONEY32_UNDEFINED; - if (!map_can_construct_with_clear_at( - { loc, baseZ, clearZ }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, 0, &cost, CREATE_CROSSING_MODE_NONE)) + auto canBuild = MapCanConstructWithClearAt({ loc, baseZ, clearZ }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, 0); + if (canBuild->Error != GameActions::Status::Ok) { - return MakeResult(GameActions::Status::NoClearance, errorTitle, gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = errorTitle; + return canBuild; } - if (gMapGroundFlags & ELEMENT_IS_UNDERWATER) + if (canBuild->GroundFlags & ELEMENT_IS_UNDERWATER) { return MakeResult(GameActions::Status::Disallowed, errorTitle, STR_RIDE_CANT_BUILD_THIS_UNDERWATER); } diff --git a/src/openrct2/actions/SmallSceneryPlaceAction.cpp b/src/openrct2/actions/SmallSceneryPlaceAction.cpp index b5ab7b60a1..9be6d2e005 100644 --- a/src/openrct2/actions/SmallSceneryPlaceAction.cpp +++ b/src/openrct2/actions/SmallSceneryPlaceAction.cpp @@ -111,16 +111,16 @@ GameActions::Result::Ptr SmallSceneryPlaceAction::Query() const res->Position.z = surfaceHeight; } - if (!MapCheckCapacityAndReorganise(_loc)) - { - return std::make_unique(GameActions::Status::NoFreeElements); - } - if (!LocationValid(_loc)) { return MakeResult(GameActions::Status::InvalidParameters); } + if (!MapCheckCapacityAndReorganise(_loc)) + { + return std::make_unique(GameActions::Status::NoFreeElements); + } + if (!byte_9D8150 && (_loc.x > GetMapSizeMaxXY() || _loc.y > GetMapSizeMaxXY())) { return std::make_unique(GameActions::Status::InvalidParameters); @@ -276,20 +276,19 @@ GameActions::Result::Ptr SmallSceneryPlaceAction::Query() const } QuarterTile quarterTile = QuarterTile{ collisionQuadrants, supports }.Rotate(quadRotation); - money32 clearCost = 0; - - if (!map_can_construct_with_clear_at( - { _loc, zLow, zHigh }, &map_place_scenery_clear_func, quarterTile, GetFlags(), &clearCost, - CREATE_CROSSING_MODE_NONE, scenery_small_entry_has_flag(sceneryEntry, SMALL_SCENERY_FLAG_IS_TREE))) + const auto isTree = scenery_small_entry_has_flag(sceneryEntry, SMALL_SCENERY_FLAG_IS_TREE); + auto canBuild = MapCanConstructWithClearAt( + { _loc, zLow, zHigh }, &map_place_scenery_clear_func, quarterTile, GetFlags(), CREATE_CROSSING_MODE_NONE, isTree); + if (canBuild->Error != GameActions::Status::Ok) { - return std::make_unique( - GameActions::Status::Disallowed, gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = STR_CANT_POSITION_THIS_HERE; + return canBuild; } - res->GroundFlags = gMapGroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); + res->GroundFlags = canBuild->GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); res->Expenditure = ExpenditureType::Landscaping; - res->Cost = (sceneryEntry->price * 10) + clearCost; + res->Cost = (sceneryEntry->price * 10) + canBuild->Cost; return res; } @@ -414,20 +413,20 @@ GameActions::Result::Ptr SmallSceneryPlaceAction::Execute() const } QuarterTile quarterTile = QuarterTile{ collisionQuadrants, supports }.Rotate(quadRotation); - money32 clearCost = 0; - - if (!map_can_construct_with_clear_at( - { _loc, zLow, zHigh }, &map_place_scenery_clear_func, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, &clearCost, - CREATE_CROSSING_MODE_NONE, scenery_small_entry_has_flag(sceneryEntry, SMALL_SCENERY_FLAG_IS_TREE))) + const auto isTree = scenery_small_entry_has_flag(sceneryEntry, SMALL_SCENERY_FLAG_IS_TREE); + auto canBuild = MapCanConstructWithClearAt( + { _loc, zLow, zHigh }, &map_place_scenery_clear_func, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, + CREATE_CROSSING_MODE_NONE, isTree); + if (canBuild->Error != GameActions::Status::Ok) { - return std::make_unique( - GameActions::Status::Disallowed, gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = STR_CANT_POSITION_THIS_HERE; + return canBuild; } - res->GroundFlags = gMapGroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); + res->GroundFlags = canBuild->GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); res->Expenditure = ExpenditureType::Landscaping; - res->Cost = (sceneryEntry->price * 10) + clearCost; + res->Cost = (sceneryEntry->price * 10) + canBuild->Cost; auto* sceneryElement = TileElementInsert( CoordsXYZ{ _loc, zLow }, quarterTile.GetBaseQuarterOccupied()); diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 7aa0bac0f6..4858dff29e 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -232,12 +232,14 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const && _trackType == TrackElemType::Flat) ? CREATE_CROSSING_MODE_TRACK_OVER_PATH : CREATE_CROSSING_MODE_NONE; - if (!map_can_construct_with_clear_at( - { mapLoc, baseZ, clearanceZ }, &map_place_non_scenery_clear_func, quarterTile, GetFlags(), &cost, crossingMode)) + auto canBuild = MapCanConstructWithClearAt( + { mapLoc, baseZ, clearanceZ }, &map_place_non_scenery_clear_func, quarterTile, GetFlags(), crossingMode); + if (canBuild->Error != GameActions::Status::Ok) { - return std::make_unique( - GameActions::Status::NoClearance, gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + return canBuild; } + cost += canBuild->Cost; // When building a level crossing, remove any pre-existing path furniture. if (crossingMode == CREATE_CROSSING_MODE_TRACK_OVER_PATH) @@ -249,7 +251,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } } - uint8_t mapGroundFlags = gMapGroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); + uint8_t mapGroundFlags = canBuild->GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); if (res->GroundFlags != 0 && (res->GroundFlags & mapGroundFlags) == 0) { return std::make_unique( @@ -269,14 +271,14 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const if (TrackFlags[_trackType] & TRACK_ELEM_FLAG_ONLY_UNDERWATER) { // No element has this flag - if (gMapGroundFlags & ELEMENT_IS_UNDERWATER) + if (canBuild->GroundFlags & ELEMENT_IS_UNDERWATER) { return std::make_unique( GameActions::Status::Disallowed, STR_CAN_ONLY_BUILD_THIS_UNDERWATER); } } - if (gMapGroundFlags & ELEMENT_IS_UNDERWATER && !gCheatsDisableClearanceChecks) + if (canBuild->GroundFlags & ELEMENT_IS_UNDERWATER && !gCheatsDisableClearanceChecks) { return std::make_unique( GameActions::Status::Disallowed, STR_RIDE_CANT_BUILD_THIS_UNDERWATER); @@ -428,13 +430,15 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const && _trackType == TrackElemType::Flat) ? CREATE_CROSSING_MODE_TRACK_OVER_PATH : CREATE_CROSSING_MODE_NONE; - if (!map_can_construct_with_clear_at( - mapLocWithClearance, &map_place_non_scenery_clear_func, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, - &cost, crossingMode)) + auto canBuild = MapCanConstructWithClearAt( + mapLocWithClearance, &map_place_non_scenery_clear_func, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, + crossingMode); + if (canBuild->Error != GameActions::Status::Ok) { - return std::make_unique( - GameActions::Status::NoClearance, gGameCommandErrorText, gCommonFormatArgs); + canBuild->ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + return canBuild; } + cost += canBuild->Cost; if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && !gCheatsDisableClearanceChecks) { @@ -459,7 +463,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const } } - uint8_t mapGroundFlags = gMapGroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); + uint8_t mapGroundFlags = canBuild->GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); if (res->GroundFlags != 0 && (res->GroundFlags & mapGroundFlags) == 0) { return std::make_unique( @@ -543,7 +547,11 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const } auto* trackElement = TileElementInsert(mapLoc, quarterTile.GetBaseQuarterOccupied()); - Guard::Assert(trackElement != nullptr); + if (trackElement == nullptr) + { + log_warning("Cannot create track element for ride = %d", static_cast(_rideIndex)); + return std::make_unique(GameActions::Status::NoFreeElements); + } trackElement->SetClearanceZ(clearanceZ); trackElement->SetDirection(_origin.direction); diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index 08af5ea4e7..362f7a55a7 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -21,22 +21,22 @@ #include "../world/Wall.h" WallPlaceActionResult::WallPlaceActionResult() - : GameActions::Result(GameActions::Status::Ok, STR_CANT_BUILD_PARK_ENTRANCE_HERE) + : GameActions::Result(GameActions::Status::Ok, STR_CANT_BUILD_THIS_HERE) { } WallPlaceActionResult::WallPlaceActionResult(GameActions::Status err) - : GameActions::Result(err, STR_CANT_BUILD_PARK_ENTRANCE_HERE) + : GameActions::Result(err, STR_CANT_BUILD_THIS_HERE) { } WallPlaceActionResult::WallPlaceActionResult(GameActions::Status err, rct_string_id msg) - : GameActions::Result(err, STR_CANT_BUILD_PARK_ENTRANCE_HERE, msg) + : GameActions::Result(err, STR_CANT_BUILD_THIS_HERE, msg) { } WallPlaceActionResult::WallPlaceActionResult(GameActions::Status error, rct_string_id msg, uint8_t* args) - : GameActions::Result(error, STR_CANT_BUILD_PARK_ENTRANCE_HERE, msg, args) + : GameActions::Result(error, STR_CANT_BUILD_THIS_HERE, msg, args) { } @@ -78,7 +78,7 @@ void WallPlaceAction::Serialise(DataSerialiser& stream) GameActions::Result::Ptr WallPlaceAction::Query() const { auto res = std::make_unique(); - res->ErrorTitle = STR_CANT_BUILD_PARK_ENTRANCE_HERE; + res->ErrorTitle = STR_CANT_BUILD_THIS_HERE; res->Position = _loc; res->Expenditure = ExpenditureType::Landscaping; @@ -278,7 +278,7 @@ GameActions::Result::Ptr WallPlaceAction::Query() const GameActions::Result::Ptr WallPlaceAction::Execute() const { auto res = std::make_unique(); - res->ErrorTitle = STR_CANT_BUILD_PARK_ENTRANCE_HERE; + res->ErrorTitle = STR_CANT_BUILD_THIS_HERE; res->Position = _loc; res->Expenditure = ExpenditureType::Landscaping; @@ -337,11 +337,6 @@ GameActions::Result::Ptr WallPlaceAction::Execute() const } } - if (!MapCheckCapacityAndReorganise(_loc)) - { - return MakeResult(GameActions::Status::NoFreeElements, STR_TILE_ELEMENT_LIMIT_REACHED); - } - Banner* banner = nullptr; if (wallEntry->scrolling_mode != SCROLLING_MODE_NONE) { @@ -506,7 +501,6 @@ GameActions::Result::Ptr WallPlaceAction::WallCheckObstruction( rct_large_scenery_tile* tile; *wallAcrossTrack = false; - gMapGroundFlags = ELEMENT_IS_ABOVE_GROUND; if (map_is_location_at_edge(_loc)) { return MakeResult(GameActions::Status::InvalidParameters, STR_OFF_EDGE_OF_MAP); diff --git a/src/openrct2/drawing/LightFX.cpp b/src/openrct2/drawing/LightFX.cpp index 6a941a556d..c90abd7fed 100644 --- a/src/openrct2/drawing/LightFX.cpp +++ b/src/openrct2/drawing/LightFX.cpp @@ -803,6 +803,53 @@ void lightfx_add_lights_magic_vehicle(const Vehicle* vehicle) }; } +void LightFxAddKioskLights(const CoordsXY& mapPosition, const int32_t height, const uint8_t zOffset) +{ + uint8_t relativeRotation = (4 - get_current_rotation()) % 4; + CoordsXY lanternOffset1 = CoordsXY(0, 16).Rotate(relativeRotation); + CoordsXY lanternOffset2 = CoordsXY(16, 0).Rotate(relativeRotation); + lightfx_add_3d_light_magic_from_drawing_tile( + mapPosition, lanternOffset1.x, lanternOffset1.y, height + zOffset, LightType::Lantern3); + lightfx_add_3d_light_magic_from_drawing_tile( + mapPosition, lanternOffset2.x, lanternOffset2.y, height + zOffset, LightType::Lantern3); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, 8, 32, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, 32, 8, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, -32, 8, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, 8, -32, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, -8, 32, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, 32, -8, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, -32, -8, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, -8, -32, height, LightType::Spot1); +} + +void LightFxAddShopLights(const CoordsXY& mapPosition, const uint8_t direction, const int32_t height, const uint8_t zOffset) +{ + if (direction == (4 - get_current_rotation()) % 4) // Back Right Facing Stall + { + CoordsXY spotOffset1 = CoordsXY(-32, 8).Rotate(direction); + CoordsXY spotOffset2 = CoordsXY(-32, 4).Rotate(direction); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, spotOffset1.x, spotOffset1.y, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, spotOffset2.x, spotOffset2.y, height, LightType::Spot2); + } + else if (direction == (7 - get_current_rotation()) % 4) // Back left Facing Stall + { + CoordsXY spotOffset1 = CoordsXY(-32, -8).Rotate(direction); + CoordsXY spotOffset2 = CoordsXY(-32, -4).Rotate(direction); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, spotOffset1.x, spotOffset1.y, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, spotOffset2.x, spotOffset2.y, height, LightType::Spot2); + } + else // Forward Facing Stall + { + CoordsXY spotOffset1 = CoordsXY(-32, 8).Rotate(direction); + CoordsXY spotOffset2 = CoordsXY(-32, -8).Rotate(direction); + CoordsXY lanternOffset = CoordsXY(-16, 0).Rotate(direction); + lightfx_add_3d_light_magic_from_drawing_tile( + mapPosition, lanternOffset.x, lanternOffset.y, height + zOffset, LightType::Lantern3); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, spotOffset1.x, spotOffset1.y, height, LightType::Spot1); + lightfx_add_3d_light_magic_from_drawing_tile(mapPosition, spotOffset2.x, spotOffset2.y, height, LightType::Spot1); + } +} + void lightfx_apply_palette_filter(uint8_t i, uint8_t* r, uint8_t* g, uint8_t* b) { float night = static_cast(pow(gDayNightCycle, 1.5)); diff --git a/src/openrct2/drawing/LightFX.h b/src/openrct2/drawing/LightFX.h index ba5b113df9..acbd5ed4be 100644 --- a/src/openrct2/drawing/LightFX.h +++ b/src/openrct2/drawing/LightFX.h @@ -68,6 +68,9 @@ void lightfx_add_3d_light_magic_from_drawing_tile( void lightfx_add_lights_magic_vehicle(const Vehicle* vehicle); +void LightFxAddKioskLights(const CoordsXY& mapPosition, const int32_t height, const uint8_t zOffset); +void LightFxAddShopLights(const CoordsXY& mapPosition, const uint8_t direction, const int32_t height, const uint8_t zOffset); + uint32_t lightfx_get_light_polution(); void lightfx_apply_palette_filter(uint8_t i, uint8_t* r, uint8_t* g, uint8_t* b); diff --git a/src/openrct2/interface/FontFamilies.cpp b/src/openrct2/interface/FontFamilies.cpp index c7b1da1186..35b9024bcb 100644 --- a/src/openrct2/interface/FontFamilies.cpp +++ b/src/openrct2/interface/FontFamilies.cpp @@ -34,6 +34,7 @@ TTFontFamily const TTFFamilyJapanese = { TTFontFamily const TTFFamilyKorean = { &TTFFontGulim, &TTFFontNanum, + &TTFFontMalgun, }; TTFontFamily const TTFFamilySansSerif = { diff --git a/src/openrct2/interface/Fonts.cpp b/src/openrct2/interface/Fonts.cpp index 939f023a72..40de2922cb 100644 --- a/src/openrct2/interface/Fonts.cpp +++ b/src/openrct2/interface/Fonts.cpp @@ -72,10 +72,16 @@ TTFFontSetDescriptor TTFFontGulim = { { { "gulim.ttc", "Gulim", 12, 1, 0, 15, HINTING_THRESHOLD_MEDIUM, nullptr }, } }; +TTFFontSetDescriptor TTFFontMalgun = { { + { "malgun.ttf", "Malgun Gothic", 10, 1, -3, 10, HINTING_THRESHOLD_LOW, nullptr }, + { "malgun.ttf", "Malgun Gothic", 12, 1, -3, 15, HINTING_THRESHOLD_LOW, nullptr }, + { "malgun.ttf", "Malgun Gothic", 12, 1, -3, 15, HINTING_THRESHOLD_LOW, nullptr }, +} }; + TTFFontSetDescriptor TTFFontNanum = { { - { "NanumGothic.ttc", "Nanum Gothic", 10, 1, 0, 10, HINTING_DISABLED, nullptr }, - { "NanumGothic.ttc", "Nanum Gothic", 12, 1, 0, 15, HINTING_THRESHOLD_LOW, nullptr }, - { "NanumGothic.ttc", "Nanum Gothic", 12, 1, 0, 15, HINTING_THRESHOLD_LOW, nullptr }, + { "NanumGothic.ttf", "Nanum Gothic", 10, 1, -2, 10, HINTING_DISABLED, nullptr }, + { "NanumGothic.ttf", "Nanum Gothic", 12, 1, -2, 15, HINTING_THRESHOLD_LOW, nullptr }, + { "NanumGothic.ttf", "Nanum Gothic", 12, 1, -2, 15, HINTING_THRESHOLD_LOW, nullptr }, } }; TTFFontSetDescriptor TTFFontArial = { { diff --git a/src/openrct2/interface/Fonts.h b/src/openrct2/interface/Fonts.h index 54f9d24c24..2eaea52884 100644 --- a/src/openrct2/interface/Fonts.h +++ b/src/openrct2/interface/Fonts.h @@ -26,6 +26,7 @@ extern TTFFontSetDescriptor TTFFontHeiti; extern TTFFontSetDescriptor TTFFontSimSun; extern TTFFontSetDescriptor TTFFontLiHeiPro; extern TTFFontSetDescriptor TTFFontGulim; +extern TTFFontSetDescriptor TTFFontMalgun; extern TTFFontSetDescriptor TTFFontNanum; extern TTFFontSetDescriptor TTFFontArial; extern TTFFontSetDescriptor TTFFontArialUnicode; diff --git a/src/openrct2/interface/Viewport.h b/src/openrct2/interface/Viewport.h index c0ce43ce04..e5ae588f0b 100644 --- a/src/openrct2/interface/Viewport.h +++ b/src/openrct2/interface/Viewport.h @@ -147,7 +147,6 @@ bool ViewportInteractionRightOver(const ScreenCoordsXY& screenCoords); bool ViewportInteractionRightClick(const ScreenCoordsXY& screenCoords); CoordsXY ViewportInteractionGetTileStartAtCursor(const ScreenCoordsXY& screenCoords); -void sub_68B2B7(paint_session* session, const CoordsXY& mapCoords); void viewport_invalidate(const rct_viewport* viewport, int32_t left, int32_t top, int32_t right, int32_t bottom); diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index c48d19dbb3..cfeca13494 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -242,34 +242,34 @@ struct viewport_focus struct rct_window_event_list { - void (*close)(struct rct_window*); - void (*mouse_up)(struct rct_window*, rct_widgetindex); - void (*resize)(struct rct_window*); - void (*mouse_down)(struct rct_window*, rct_widgetindex, rct_widget*); - void (*dropdown)(struct rct_window*, rct_widgetindex, int32_t); - void (*unknown_05)(struct rct_window*); - void (*update)(struct rct_window*); - void (*periodic_update)(struct rct_window*); - void (*unknown_08)(struct rct_window*); - void (*tool_update)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&); - void (*tool_down)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&); - void (*tool_drag)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&); - void (*tool_up)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&); - void (*tool_abort)(struct rct_window*, rct_widgetindex); - void (*unknown_0E)(struct rct_window*); - void (*get_scroll_size)(struct rct_window*, int32_t, int32_t*, int32_t*); - void (*scroll_mousedown)(struct rct_window*, int32_t, const ScreenCoordsXY&); - void (*scroll_mousedrag)(struct rct_window*, int32_t, const ScreenCoordsXY&); - void (*scroll_mouseover)(struct rct_window*, int32_t, const ScreenCoordsXY&); - void (*text_input)(struct rct_window*, rct_widgetindex, char*); - void (*viewport_rotate)(struct rct_window*); - void (*unknown_15)(struct rct_window*, int32_t, int32_t); - OpenRCT2String (*tooltip)(struct rct_window*, const rct_widgetindex, const rct_string_id); - void (*cursor)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&, CursorID*); - void (*moved)(struct rct_window*, const ScreenCoordsXY&); - void (*invalidate)(struct rct_window*); - void (*paint)(struct rct_window*, rct_drawpixelinfo*); - void (*scroll_paint)(struct rct_window*, rct_drawpixelinfo*, int32_t); + void (*close)(struct rct_window*){}; + void (*mouse_up)(struct rct_window*, rct_widgetindex){}; + void (*resize)(struct rct_window*){}; + void (*mouse_down)(struct rct_window*, rct_widgetindex, rct_widget*){}; + void (*dropdown)(struct rct_window*, rct_widgetindex, int32_t){}; + void (*unknown_05)(struct rct_window*){}; + void (*update)(struct rct_window*){}; + void (*periodic_update)(struct rct_window*){}; + void (*unknown_08)(struct rct_window*){}; + void (*tool_update)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&){}; + void (*tool_down)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&){}; + void (*tool_drag)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&){}; + void (*tool_up)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&){}; + void (*tool_abort)(struct rct_window*, rct_widgetindex){}; + void (*unknown_0E)(struct rct_window*){}; + void (*get_scroll_size)(struct rct_window*, int32_t, int32_t*, int32_t*){}; + void (*scroll_mousedown)(struct rct_window*, int32_t, const ScreenCoordsXY&){}; + void (*scroll_mousedrag)(struct rct_window*, int32_t, const ScreenCoordsXY&){}; + void (*scroll_mouseover)(struct rct_window*, int32_t, const ScreenCoordsXY&){}; + void (*text_input)(struct rct_window*, rct_widgetindex, char*){}; + void (*viewport_rotate)(struct rct_window*){}; + void (*unknown_15)(struct rct_window*, int32_t, int32_t){}; + OpenRCT2String (*tooltip)(struct rct_window*, const rct_widgetindex, const rct_string_id){}; + void (*cursor)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&, CursorID*){}; + void (*moved)(struct rct_window*, const ScreenCoordsXY&){}; + void (*invalidate)(struct rct_window*){}; + void (*paint)(struct rct_window*, rct_drawpixelinfo*){}; + void (*scroll_paint)(struct rct_window*, rct_drawpixelinfo*, int32_t){}; typedef void (*fnEventInitializer)(rct_window_event_list&); rct_window_event_list(fnEventInitializer fn) diff --git a/src/openrct2/localisation/Formatter.h b/src/openrct2/localisation/Formatter.h index e2acab27d2..7151fdbf94 100644 --- a/src/openrct2/localisation/Formatter.h +++ b/src/openrct2/localisation/Formatter.h @@ -77,17 +77,17 @@ public: // clang-format off static_assert( - std::is_same_v || - std::is_same_v || - std::is_same_v || - std::is_same_v || - std::is_same_v || - std::is_same_v || - std::is_same_v || - std::is_same_v || - std::is_same_v || - std::is_same_v || - std::is_same_v + std::is_same_v::type, char*> || + std::is_same_v::type, const char*> || + std::is_same_v::type, int16_t> || + std::is_same_v::type, int32_t> || + std::is_same_v::type, money32> || + std::is_same_v::type, money64> || + std::is_same_v::type, rct_string_id> || + std::is_same_v::type, uint16_t> || + std::is_same_v::type, uint32_t> || + std::is_same_v::type, utf8*> || + std::is_same_v::type, const utf8*> ); // clang-format on diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 343747841c..3a7cf38523 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -1228,7 +1228,7 @@ enum STR_LAST_BREAKDOWN = 1808, STR_CURRENT_BREAKDOWN = 1809, STR_CARRYING = 1810, - STR_CANT_BUILD_PARK_ENTRANCE_HERE = 1811, + STR_CANT_BUILD_THIS_HERE = 1811, STR_STRING_DEFINED_TOOLTIP = 1812, STR_MISCELLANEOUS = 1813, STR_ACTIONS = 1814, @@ -3910,6 +3910,8 @@ enum STR_RIDE_OBJECT_SHOP_SELLS = 6452, + STR_COPY_BUILD_HASH = 6453, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working /* MAX_STR_COUNT = 32768 */ // MAX_STR_COUNT - upper limit for number of strings, not the current count strings }; diff --git a/src/openrct2/paint/Paint.cpp b/src/openrct2/paint/Paint.cpp index 55391dcc06..2d98a5341f 100644 --- a/src/openrct2/paint/Paint.cpp +++ b/src/openrct2/paint/Paint.cpp @@ -208,14 +208,14 @@ template void PaintSessionGenerateRotate(paint_session* sessi for (; numVerticalTiles > 0; --numVerticalTiles) { - tile_element_paint_setup(session, mapTile.x, mapTile.y); + tile_element_paint_setup(session, mapTile); sprite_paint_setup(session, mapTile.x, mapTile.y); auto loc1 = mapTile + adjacentTiles[0]; sprite_paint_setup(session, loc1.x, loc1.y); auto loc2 = mapTile + adjacentTiles[1]; - tile_element_paint_setup(session, loc2.x, loc2.y); + tile_element_paint_setup(session, loc2); sprite_paint_setup(session, loc2.x, loc2.y); auto loc3 = mapTile + adjacentTiles[2]; @@ -648,6 +648,7 @@ static uint32_t PaintPSColourifyImage(uint32_t imageId, ViewportInteractionItem case ViewportInteractionItem::Banner: imageId &= 0x7FFFF; imageId |= seeThoughFlags; + break; default: break; } @@ -661,6 +662,7 @@ static uint32_t PaintPSColourifyImage(uint32_t imageId, ViewportInteractionItem case ViewportInteractionItem::Wall: imageId &= 0x7FFFF; imageId |= seeThoughFlags; + break; default: break; } diff --git a/src/openrct2/paint/Supports.cpp b/src/openrct2/paint/Supports.cpp index 9acad44050..4060f62505 100644 --- a/src/openrct2/paint/Supports.cpp +++ b/src/openrct2/paint/Supports.cpp @@ -473,7 +473,7 @@ bool wooden_a_supports_paint_setup( return false; } - if (!(session->Unk141E9DB & G141E9DB_FLAG_1)) + if (!(session->Unk141E9DB & PaintSessionFlags::IsPassedSurface)) { return false; } @@ -653,7 +653,7 @@ bool wooden_b_supports_paint_setup( return false; } - if (!(session->Unk141E9DB & G141E9DB_FLAG_1)) + if (!(session->Unk141E9DB & PaintSessionFlags::IsPassedSurface)) { if (underground != nullptr) *underground = false; // AND @@ -835,7 +835,7 @@ bool metal_a_supports_paint_setup( return false; } - if (!(session->Unk141E9DB & G141E9DB_FLAG_1)) + if (!(session->Unk141E9DB & PaintSessionFlags::IsPassedSurface)) { return false; } @@ -1034,7 +1034,7 @@ bool metal_b_supports_paint_setup( return false; // AND } - if (!(session->Unk141E9DB & G141E9DB_FLAG_1)) + if (!(session->Unk141E9DB & PaintSessionFlags::IsPassedSurface)) { return false; // AND } @@ -1217,7 +1217,7 @@ bool path_a_supports_paint_setup( return false; } - if (!(session->Unk141E9DB & G141E9DB_FLAG_1)) + if (!(session->Unk141E9DB & PaintSessionFlags::IsPassedSurface)) { return false; } @@ -1363,7 +1363,7 @@ bool path_b_supports_paint_setup( return false; // AND } - if (!(session->Unk141E9DB & G141E9DB_FLAG_1)) + if (!(session->Unk141E9DB & PaintSessionFlags::IsPassedSurface)) { return false; // AND } diff --git a/src/openrct2/paint/tile_element/Paint.Surface.cpp b/src/openrct2/paint/tile_element/Paint.Surface.cpp index 58957450de..d25d25f660 100644 --- a/src/openrct2/paint/tile_element/Paint.Surface.cpp +++ b/src/openrct2/paint/tile_element/Paint.Surface.cpp @@ -1393,7 +1393,7 @@ void surface_paint(paint_session* session, uint8_t direction, uint16_t height, c } session->InteractionType = ViewportInteractionItem::Terrain; - session->Unk141E9DB |= G141E9DB_FLAG_1; + session->Unk141E9DB |= PaintSessionFlags::IsPassedSurface; switch (surfaceShape) { diff --git a/src/openrct2/paint/tile_element/Paint.TileElement.cpp b/src/openrct2/paint/tile_element/Paint.TileElement.cpp index c38b5c7585..0845fb0965 100644 --- a/src/openrct2/paint/tile_element/Paint.TileElement.cpp +++ b/src/openrct2/paint/tile_element/Paint.TileElement.cpp @@ -45,36 +45,15 @@ const int32_t SEGMENTS_ALL = SEGMENT_B4 | SEGMENT_B8 | SEGMENT_BC | SEGMENT_C0 | * * rct2: 0x0068B35F */ -void tile_element_paint_setup(paint_session* session, int32_t x, int32_t y) +void tile_element_paint_setup(paint_session* session, const CoordsXY& mapCoords, bool isTrackPiecePreview) { - if (x < GetMapSizeUnits() && y < GetMapSizeUnits() && x >= 32 && y >= 32) + if (!map_is_edge(mapCoords)) { paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); paint_util_force_set_general_support_height(session, -1, 0); - session->Unk141E9DB = 0; + session->Unk141E9DB = isTrackPiecePreview ? PaintSessionFlags::IsTrackPiecePreview : 0; session->WaterHeight = 0xFFFF; - sub_68B3FB(session, x, y); - } - else if (!(session->ViewFlags & VIEWPORT_FLAG_TRANSPARENT_BACKGROUND)) - { - blank_tiles_paint(session, x, y); - } -} - -/** - * - * rct2: 0x0068B2B7 - */ -void sub_68B2B7(paint_session* session, const CoordsXY& mapCoords) -{ - if (mapCoords.x < GetMapSizeUnits() && mapCoords.y < GetMapSizeUnits() && mapCoords.x >= 32 && mapCoords.y >= 32) - { - paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); - paint_util_force_set_general_support_height(session, -1, 0); - session->WaterHeight = 0xFFFF; - session->Unk141E9DB = G141E9DB_FLAG_2; - sub_68B3FB(session, mapCoords.x, mapCoords.y); } else if (!(session->ViewFlags & VIEWPORT_FLAG_TRANSPARENT_BACKGROUND)) diff --git a/src/openrct2/paint/tile_element/Paint.TileElement.h b/src/openrct2/paint/tile_element/Paint.TileElement.h index c7cb5ecf06..3de26c34d4 100644 --- a/src/openrct2/paint/tile_element/Paint.TileElement.h +++ b/src/openrct2/paint/tile_element/Paint.TileElement.h @@ -72,11 +72,12 @@ enum TUNNEL_TYPE_COUNT }; -enum +namespace PaintSessionFlags { - G141E9DB_FLAG_1 = 1, - G141E9DB_FLAG_2 = 2, -}; + // Unsure as to why this exists and DidPassSurface + constexpr uint8_t IsPassedSurface = 1; + constexpr uint8_t IsTrackPiecePreview = 2; +} // namespace PaintSessionFlags #ifdef __TESTPAINT__ extern uint16_t testPaintVerticalTunnelHeight; @@ -100,7 +101,7 @@ void paint_util_force_set_general_support_height(paint_session* session, int16_t void paint_util_set_segment_support_height(paint_session* session, int32_t segments, uint16_t height, uint8_t slope); uint16_t paint_util_rotate_segments(uint16_t segments, uint8_t rotation); -void tile_element_paint_setup(paint_session* session, int32_t x, int32_t y); +void tile_element_paint_setup(paint_session* session, const CoordsXY& mapCoords, bool isTrackPiecePreview = false); void entrance_paint(paint_session* session, uint8_t direction, int32_t height, const TileElement* tile_element); void banner_paint(paint_session* session, uint8_t direction, int32_t height, const TileElement* tile_element); diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index 7f7f04c4c1..d97297b1ba 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -4970,15 +4970,15 @@ void Guest::UpdateRideShopInteract() if (ride == nullptr) return; - const int16_t tileCenterX = NextLoc.x + 16; - const int16_t tileCenterY = NextLoc.y + 16; + const int16_t tileCentreX = NextLoc.x + 16; + const int16_t tileCentreY = NextLoc.y + 16; if (ride->type == RIDE_TYPE_FIRST_AID) { if (Nausea <= 35) { RideSubState = PeepRideSubState::LeaveShop; - SetDestination({ tileCenterX, tileCenterY }, 3); + SetDestination({ tileCentreX, tileCentreY }, 3); HappinessTarget = std::min(HappinessTarget + 30, PEEP_MAX_HAPPINESS); Happiness = HappinessTarget; } @@ -5004,7 +5004,7 @@ void Guest::UpdateRideShopInteract() RideSubState = PeepRideSubState::LeaveShop; - SetDestination({ tileCenterX, tileCenterY }, 3); + SetDestination({ tileCentreX, tileCentreY }, 3); HappinessTarget = std::min(HappinessTarget + 30, PEEP_MAX_HAPPINESS); Happiness = HappinessTarget; diff --git a/src/openrct2/peep/GuestPathfinding.cpp b/src/openrct2/peep/GuestPathfinding.cpp index ecd4a6845f..9bf83c9a7f 100644 --- a/src/openrct2/peep/GuestPathfinding.cpp +++ b/src/openrct2/peep/GuestPathfinding.cpp @@ -135,18 +135,18 @@ static int32_t peep_move_one_tile(Direction direction, Peep* peep) if (peep->State != PeepState::Queuing) { // When peeps are walking along a path, we would like them to be spread out across the width of the path, - // instead of all walking along the exact center line of the path. + // instead of all walking along the exact centre line of the path. // // Setting a random DestinationTolerance does not work very well for this. It means that peeps will make // their new pathfinding decision at a random time, and so will distribute a bit when they are turning // corners (which is good); but, as they walk along a straight path, they will - eventually - have had a - // low tolerance value which forced them back to the center of the path, where they stay until they turn + // low tolerance value which forced them back to the centre of the path, where they stay until they turn // a corner. // // What we want instead is to apply that randomness in the direction they are walking ONLY, and keep their // other coordinate constant. // - // However, we have also seen some situations where guests end up too far from the center of paths. We've + // However, we have also seen some situations where guests end up too far from the centre of paths. We've // not identified exactly what causes this yet, but to limit the impact of it, we don't just keep the other // coordinate constant, but instead clamp it to an acceptable range. This brings in 'outlier' guests from // the edges of the path, while allowing guests who are already in an acceptable position to stay there. diff --git a/src/openrct2/platform/Crash.cpp b/src/openrct2/platform/Crash.cpp index 654768e7f7..1338433104 100644 --- a/src/openrct2/platform/Crash.cpp +++ b/src/openrct2/platform/Crash.cpp @@ -52,7 +52,7 @@ const wchar_t* _wszCommitSha1Short = WSZ(""); // OPENRCT2_ARCHITECTURE is required to be defined in version.h const wchar_t* _wszArchitecture = WSZ(OPENRCT2_ARCHITECTURE); -# define BACKTRACE_TOKEN L"e650b4d649dc93a37d98b8611fa47b8732c6c08386979c22b5c3a545fea65f76" +# define BACKTRACE_TOKEN L"3c7c2c6de378d59819d6755369f4d099bfe1a0d990b065f2ae427ab096cd6f40" // Note: uploading gzipped crash dumps manually requires specifying // 'Content-Encoding: gzip' header in HTTP request, but we cannot do that, diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 34385eadeb..9bf9f9bdc5 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -814,7 +814,7 @@ public: void ImportRideRatingsCalcData() { const auto& src = _s6.ride_ratings_calc_data; - auto& dst = gRideRatingsCalcData; + auto& dst = gRideRatingUpdateState; dst = {}; dst.Proximity = { src.proximity_x, src.proximity_y, src.proximity_z }; dst.ProximityStart = { src.proximity_start_x, src.proximity_start_y, src.proximity_start_z }; diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index 189c9441dd..dcec0ddec3 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -32,7 +32,8 @@ enum class ResearchCategory : uint8_t; -using ride_ratings_calculation = void (*)(Ride* ride); +using ride_ratings_calculation = void (*)(Ride* ride, RideRatingUpdateState& state); + struct RideComponentName { rct_string_id singular; diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index e8fe13ac6c..b099ab2a86 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -76,19 +76,19 @@ struct ShelteredEights uint8_t TotalShelteredEighths; }; -RideRatingCalculationData gRideRatingsCalcData; +RideRatingUpdateState gRideRatingUpdateState; -static void ride_ratings_update_state(); -static void ride_ratings_update_state_0(); -static void ride_ratings_update_state_1(); -static void ride_ratings_update_state_2(); -static void ride_ratings_update_state_3(); -static void ride_ratings_update_state_4(); -static void ride_ratings_update_state_5(); -static void ride_ratings_begin_proximity_loop(); -static void ride_ratings_calculate(Ride* ride); +static void ride_ratings_update_state(RideRatingUpdateState& state); +static void ride_ratings_update_state_0(RideRatingUpdateState& state); +static void ride_ratings_update_state_1(RideRatingUpdateState& state); +static void ride_ratings_update_state_2(RideRatingUpdateState& state); +static void ride_ratings_update_state_3(RideRatingUpdateState& state); +static void ride_ratings_update_state_4(RideRatingUpdateState& state); +static void ride_ratings_update_state_5(RideRatingUpdateState& state); +static void ride_ratings_begin_proximity_loop(RideRatingUpdateState& state); +static void ride_ratings_calculate(RideRatingUpdateState& state, Ride* ride); static void ride_ratings_calculate_value(Ride* ride); -static void ride_ratings_score_close_proximity(TileElement* inputTileElement); +static void ride_ratings_score_close_proximity(RideRatingUpdateState& state, TileElement* inputTileElement); static void ride_ratings_add(RatingTuple* rating, int32_t excitement, int32_t intensity, int32_t nausea); @@ -100,13 +100,14 @@ static void ride_ratings_add(RatingTuple* rating, int32_t excitement, int32_t in */ void ride_ratings_update_ride(const Ride& ride) { + RideRatingUpdateState state; if (ride.status != RideStatus::Closed) { - gRideRatingsCalcData.CurrentRide = ride.id; - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_INITIALISE; - while (gRideRatingsCalcData.State != RIDE_RATINGS_STATE_FIND_NEXT_RIDE) + state.CurrentRide = ride.id; + state.State = RIDE_RATINGS_STATE_INITIALISE; + while (state.State != RIDE_RATINGS_STATE_FIND_NEXT_RIDE) { - ride_ratings_update_state(); + ride_ratings_update_state(state); } } } @@ -120,30 +121,32 @@ void ride_ratings_update_all() if (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) return; - ride_ratings_update_state(); + // NOTE: Until the new save format only one ride can be updated at once. + // The SV6 format can store only a single state. + ride_ratings_update_state(gRideRatingUpdateState); } -static void ride_ratings_update_state() +static void ride_ratings_update_state(RideRatingUpdateState& state) { - switch (gRideRatingsCalcData.State) + switch (state.State) { case RIDE_RATINGS_STATE_FIND_NEXT_RIDE: - ride_ratings_update_state_0(); + ride_ratings_update_state_0(state); break; case RIDE_RATINGS_STATE_INITIALISE: - ride_ratings_update_state_1(); + ride_ratings_update_state_1(state); break; case RIDE_RATINGS_STATE_2: - ride_ratings_update_state_2(); + ride_ratings_update_state_2(state); break; case RIDE_RATINGS_STATE_CALCULATE: - ride_ratings_update_state_3(); + ride_ratings_update_state_3(state); break; case RIDE_RATINGS_STATE_4: - ride_ratings_update_state_4(); + ride_ratings_update_state_4(state); break; case RIDE_RATINGS_STATE_5: - ride_ratings_update_state_5(); + ride_ratings_update_state_5(state); break; } } @@ -152,9 +155,9 @@ static void ride_ratings_update_state() * * rct2: 0x006B5A5C */ -static void ride_ratings_update_state_0() +static void ride_ratings_update_state_0(RideRatingUpdateState& state) { - ride_id_t currentRide = gRideRatingsCalcData.CurrentRide; + ride_id_t currentRide = state.CurrentRide; currentRide++; if (currentRide >= MAX_RIDES) @@ -165,50 +168,50 @@ static void ride_ratings_update_state_0() auto ride = get_ride(currentRide); if (ride != nullptr && ride->status != RideStatus::Closed && !(ride->lifecycle_flags & RIDE_LIFECYCLE_FIXED_RATINGS)) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_INITIALISE; + state.State = RIDE_RATINGS_STATE_INITIALISE; } - gRideRatingsCalcData.CurrentRide = currentRide; + state.CurrentRide = currentRide; } /** * * rct2: 0x006B5A94 */ -static void ride_ratings_update_state_1() +static void ride_ratings_update_state_1(RideRatingUpdateState& state) { - gRideRatingsCalcData.ProximityTotal = 0; + state.ProximityTotal = 0; for (int32_t i = 0; i < PROXIMITY_COUNT; i++) { - gRideRatingsCalcData.ProximityScores[i] = 0; + state.ProximityScores[i] = 0; } - gRideRatingsCalcData.AmountOfBrakes = 0; - gRideRatingsCalcData.AmountOfReversers = 0; - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_2; - gRideRatingsCalcData.StationFlags = 0; - ride_ratings_begin_proximity_loop(); + state.AmountOfBrakes = 0; + state.AmountOfReversers = 0; + state.State = RIDE_RATINGS_STATE_2; + state.StationFlags = 0; + ride_ratings_begin_proximity_loop(state); } /** * * rct2: 0x006B5C66 */ -static void ride_ratings_update_state_2() +static void ride_ratings_update_state_2(RideRatingUpdateState& state) { - const ride_id_t rideIndex = gRideRatingsCalcData.CurrentRide; + const ride_id_t rideIndex = state.CurrentRide; auto ride = get_ride(rideIndex); if (ride == nullptr || ride->status == RideStatus::Closed || ride->type >= RIDE_TYPE_COUNT) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } - auto loc = gRideRatingsCalcData.Proximity; - track_type_t trackType = gRideRatingsCalcData.ProximityTrackType; + auto loc = state.Proximity; + track_type_t trackType = state.ProximityTrackType; TileElement* tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } do @@ -233,89 +236,89 @@ static void ride_ratings_update_state_2() if (trackType == TrackElemType::EndStation) { int32_t entranceIndex = tileElement->AsTrack()->GetStationIndex(); - gRideRatingsCalcData.StationFlags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; + state.StationFlags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; if (ride_get_entrance_location(ride, entranceIndex).isNull()) { - gRideRatingsCalcData.StationFlags |= RIDE_RATING_STATION_FLAG_NO_ENTRANCE; + state.StationFlags |= RIDE_RATING_STATION_FLAG_NO_ENTRANCE; } } - ride_ratings_score_close_proximity(tileElement); + ride_ratings_score_close_proximity(state, tileElement); - CoordsXYE trackElement = { gRideRatingsCalcData.Proximity, tileElement }; + CoordsXYE trackElement = { state.Proximity, tileElement }; CoordsXYE nextTrackElement; if (!track_block_get_next(&trackElement, &nextTrackElement, nullptr, nullptr)) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_4; + state.State = RIDE_RATINGS_STATE_4; return; } loc = { nextTrackElement, nextTrackElement.element->GetBaseZ() }; tileElement = nextTrackElement.element; - if (loc == gRideRatingsCalcData.ProximityStart) + if (loc == state.ProximityStart) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_CALCULATE; + state.State = RIDE_RATINGS_STATE_CALCULATE; return; } - gRideRatingsCalcData.Proximity = loc; - gRideRatingsCalcData.ProximityTrackType = tileElement->AsTrack()->GetTrackType(); + state.Proximity = loc; + state.ProximityTrackType = tileElement->AsTrack()->GetTrackType(); return; } } while (!(tileElement++)->IsLastForTile()); - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } /** * * rct2: 0x006B5E4D */ -static void ride_ratings_update_state_3() +static void ride_ratings_update_state_3(RideRatingUpdateState& state) { - auto ride = get_ride(gRideRatingsCalcData.CurrentRide); + auto ride = get_ride(state.CurrentRide); if (ride == nullptr || ride->status == RideStatus::Closed) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } - ride_ratings_calculate(ride); + ride_ratings_calculate(state, ride); ride_ratings_calculate_value(ride); - window_invalidate_by_number(WC_RIDE, gRideRatingsCalcData.CurrentRide); - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + window_invalidate_by_number(WC_RIDE, state.CurrentRide); + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } /** * * rct2: 0x006B5BAB */ -static void ride_ratings_update_state_4() +static void ride_ratings_update_state_4(RideRatingUpdateState& state) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_5; - ride_ratings_begin_proximity_loop(); + state.State = RIDE_RATINGS_STATE_5; + ride_ratings_begin_proximity_loop(state); } /** * * rct2: 0x006B5D72 */ -static void ride_ratings_update_state_5() +static void ride_ratings_update_state_5(RideRatingUpdateState& state) { - auto ride = get_ride(gRideRatingsCalcData.CurrentRide); + auto ride = get_ride(state.CurrentRide); if (ride == nullptr || ride->status == RideStatus::Closed) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } - auto loc = gRideRatingsCalcData.Proximity; - track_type_t trackType = gRideRatingsCalcData.ProximityTrackType; + auto loc = state.Proximity; + track_type_t trackType = state.ProximityTrackType; TileElement* tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } do @@ -336,48 +339,48 @@ static void ride_ratings_update_state_5() // TODO: Hack to be removed with new save format - trackType 0xFF should not be here. if (trackType == 0xFF || trackType == TrackElemType::None || trackType == tileElement->AsTrack()->GetTrackType()) { - ride_ratings_score_close_proximity(tileElement); + ride_ratings_score_close_proximity(state, tileElement); track_begin_end trackBeginEnd; - if (!track_block_get_previous({ gRideRatingsCalcData.Proximity, tileElement }, &trackBeginEnd)) + if (!track_block_get_previous({ state.Proximity, tileElement }, &trackBeginEnd)) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_CALCULATE; + state.State = RIDE_RATINGS_STATE_CALCULATE; return; } loc.x = trackBeginEnd.begin_x; loc.y = trackBeginEnd.begin_y; loc.z = trackBeginEnd.begin_z; - if (loc == gRideRatingsCalcData.ProximityStart) + if (loc == state.ProximityStart) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_CALCULATE; + state.State = RIDE_RATINGS_STATE_CALCULATE; return; } - gRideRatingsCalcData.Proximity = loc; - gRideRatingsCalcData.ProximityTrackType = trackBeginEnd.begin_element->AsTrack()->GetTrackType(); + state.Proximity = loc; + state.ProximityTrackType = trackBeginEnd.begin_element->AsTrack()->GetTrackType(); return; } } while (!(tileElement++)->IsLastForTile()); - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } /** * * rct2: 0x006B5BB2 */ -static void ride_ratings_begin_proximity_loop() +static void ride_ratings_begin_proximity_loop(RideRatingUpdateState& state) { - auto ride = get_ride(gRideRatingsCalcData.CurrentRide); + auto ride = get_ride(state.CurrentRide); if (ride == nullptr || ride->status == RideStatus::Closed) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } if (ride->type == RIDE_TYPE_MAZE) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_CALCULATE; + state.State = RIDE_RATINGS_STATE_CALCULATE; return; } @@ -385,35 +388,36 @@ static void ride_ratings_begin_proximity_loop() { if (!ride->stations[i].Start.isNull()) { - gRideRatingsCalcData.StationFlags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; + state.StationFlags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; if (ride_get_entrance_location(ride, i).isNull()) { - gRideRatingsCalcData.StationFlags |= RIDE_RATING_STATION_FLAG_NO_ENTRANCE; + state.StationFlags |= RIDE_RATING_STATION_FLAG_NO_ENTRANCE; } auto location = ride->stations[i].GetStart(); - gRideRatingsCalcData.Proximity = location; - gRideRatingsCalcData.ProximityTrackType = TrackElemType::None; - gRideRatingsCalcData.ProximityStart = location; + state.Proximity = location; + state.ProximityTrackType = TrackElemType::None; + state.ProximityStart = location; return; } } - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } -static void proximity_score_increment(int32_t type) +static void proximity_score_increment(RideRatingUpdateState& state, int32_t type) { - gRideRatingsCalcData.ProximityScores[type]++; + state.ProximityScores[type]++; } /** * * rct2: 0x006B6207 */ -static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTileElement, int32_t direction) +static void ride_ratings_score_close_proximity_in_direction( + RideRatingUpdateState& state, TileElement* inputTileElement, int32_t direction) { - auto scorePos = CoordsXY{ CoordsXY{ gRideRatingsCalcData.Proximity } + CoordsDirectionDelta[direction] }; + auto scorePos = CoordsXY{ CoordsXY{ state.Proximity } + CoordsDirectionDelta[direction] }; if (!map_is_location_valid(scorePos)) return; @@ -428,18 +432,18 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi switch (tileElement->GetType()) { case TILE_ELEMENT_TYPE_SURFACE: - if (gRideRatingsCalcData.ProximityBaseHeight <= inputTileElement->base_height) + if (state.ProximityBaseHeight <= inputTileElement->base_height) { if (inputTileElement->clearance_height <= tileElement->base_height) { - proximity_score_increment(PROXIMITY_SURFACE_SIDE_CLOSE); + proximity_score_increment(state, PROXIMITY_SURFACE_SIDE_CLOSE); } } break; case TILE_ELEMENT_TYPE_PATH: if (abs(inputTileElement->GetBaseZ() - tileElement->GetBaseZ()) <= 2 * COORDS_Z_STEP) { - proximity_score_increment(PROXIMITY_PATH_SIDE_CLOSE); + proximity_score_increment(state, PROXIMITY_PATH_SIDE_CLOSE); } break; case TILE_ELEMENT_TYPE_TRACK: @@ -447,7 +451,7 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi { if (abs(inputTileElement->GetBaseZ() - tileElement->GetBaseZ()) <= 2 * COORDS_Z_STEP) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE); } } break; @@ -457,11 +461,11 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi { if (inputTileElement->GetBaseZ() > tileElement->GetClearanceZ()) { - proximity_score_increment(PROXIMITY_SCENERY_SIDE_ABOVE); + proximity_score_increment(state, PROXIMITY_SCENERY_SIDE_ABOVE); } else { - proximity_score_increment(PROXIMITY_SCENERY_SIDE_BELOW); + proximity_score_increment(state, PROXIMITY_SCENERY_SIDE_BELOW); } } break; @@ -469,7 +473,7 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi } while (!(tileElement++)->IsLastForTile()); } -static void ride_ratings_score_close_proximity_loops_helper(const CoordsXYE& coordsElement) +static void ride_ratings_score_close_proximity_loops_helper(RideRatingUpdateState& state, const CoordsXYE& coordsElement) { TileElement* tileElement = map_get_first_element_at(coordsElement); if (tileElement == nullptr) @@ -487,7 +491,7 @@ static void ride_ratings_score_close_proximity_loops_helper(const CoordsXYE& coo - static_cast(coordsElement.element->base_height); if (zDiff >= 0 && zDiff <= 16) { - proximity_score_increment(PROXIMITY_PATH_TROUGH_VERTICAL_LOOP); + proximity_score_increment(state, PROXIMITY_PATH_TROUGH_VERTICAL_LOOP); } } break; @@ -501,11 +505,11 @@ static void ride_ratings_score_close_proximity_loops_helper(const CoordsXYE& coo - static_cast(coordsElement.element->base_height); if (zDiff >= 0 && zDiff <= 16) { - proximity_score_increment(PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP); + proximity_score_increment(state, PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP); if (tileElement->AsTrack()->GetTrackType() == TrackElemType::LeftVerticalLoop || tileElement->AsTrack()->GetTrackType() == TrackElemType::RightVerticalLoop) { - proximity_score_increment(PROXIMITY_INTERSECTING_VERTICAL_LOOP); + proximity_score_increment(state, PROXIMITY_INTERSECTING_VERTICAL_LOOP); } } } @@ -519,16 +523,16 @@ static void ride_ratings_score_close_proximity_loops_helper(const CoordsXYE& coo * * rct2: 0x006B62DA */ -static void ride_ratings_score_close_proximity_loops(TileElement* inputTileElement) +static void ride_ratings_score_close_proximity_loops(RideRatingUpdateState& state, TileElement* inputTileElement) { auto trackType = inputTileElement->AsTrack()->GetTrackType(); if (trackType == TrackElemType::LeftVerticalLoop || trackType == TrackElemType::RightVerticalLoop) { - ride_ratings_score_close_proximity_loops_helper({ gRideRatingsCalcData.Proximity, inputTileElement }); + ride_ratings_score_close_proximity_loops_helper(state, { state.Proximity, inputTileElement }); int32_t direction = inputTileElement->GetDirection(); ride_ratings_score_close_proximity_loops_helper( - { CoordsXY{ gRideRatingsCalcData.Proximity } + CoordsDirectionDelta[direction], inputTileElement }); + state, { CoordsXY{ state.Proximity } + CoordsDirectionDelta[direction], inputTileElement }); } } @@ -536,15 +540,15 @@ static void ride_ratings_score_close_proximity_loops(TileElement* inputTileEleme * * rct2: 0x006B5F9D */ -static void ride_ratings_score_close_proximity(TileElement* inputTileElement) +static void ride_ratings_score_close_proximity(RideRatingUpdateState& state, TileElement* inputTileElement) { - if (gRideRatingsCalcData.StationFlags & RIDE_RATING_STATION_FLAG_NO_ENTRANCE) + if (state.StationFlags & RIDE_RATING_STATION_FLAG_NO_ENTRANCE) { return; } - gRideRatingsCalcData.ProximityTotal++; - TileElement* tileElement = map_get_first_element_at(gRideRatingsCalcData.Proximity); + state.ProximityTotal++; + TileElement* tileElement = map_get_first_element_at(state.Proximity); if (tileElement == nullptr) return; do @@ -556,31 +560,31 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) switch (tileElement->GetType()) { case TILE_ELEMENT_TYPE_SURFACE: - gRideRatingsCalcData.ProximityBaseHeight = tileElement->base_height; - if (tileElement->GetBaseZ() == gRideRatingsCalcData.Proximity.z) + state.ProximityBaseHeight = tileElement->base_height; + if (tileElement->GetBaseZ() == state.Proximity.z) { - proximity_score_increment(PROXIMITY_SURFACE_TOUCH); + proximity_score_increment(state, PROXIMITY_SURFACE_TOUCH); } waterHeight = tileElement->AsSurface()->GetWaterHeight(); if (waterHeight != 0) { auto z = waterHeight; - if (z <= gRideRatingsCalcData.Proximity.z) + if (z <= state.Proximity.z) { - proximity_score_increment(PROXIMITY_WATER_OVER); - if (z == gRideRatingsCalcData.Proximity.z) + proximity_score_increment(state, PROXIMITY_WATER_OVER); + if (z == state.Proximity.z) { - proximity_score_increment(PROXIMITY_WATER_TOUCH); + proximity_score_increment(state, PROXIMITY_WATER_TOUCH); } z += 16; - if (z == gRideRatingsCalcData.Proximity.z) + if (z == state.Proximity.z) { - proximity_score_increment(PROXIMITY_WATER_LOW); + proximity_score_increment(state, PROXIMITY_WATER_LOW); } z += 112; - if (z <= gRideRatingsCalcData.Proximity.z) + if (z <= state.Proximity.z) { - proximity_score_increment(PROXIMITY_WATER_HIGH); + proximity_score_increment(state, PROXIMITY_WATER_HIGH); } } } @@ -591,11 +595,11 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) { if (tileElement->GetClearanceZ() == inputTileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_PATH_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_PATH_TOUCH_ABOVE); } if (tileElement->GetBaseZ() == inputTileElement->GetClearanceZ()) { - proximity_score_increment(PROXIMITY_PATH_TOUCH_UNDER); + proximity_score_increment(state, PROXIMITY_PATH_TOUCH_UNDER); } } else @@ -603,15 +607,15 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) // Bonus for path in first object entry if (tileElement->GetClearanceZ() <= inputTileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_PATH_ZERO_OVER); + proximity_score_increment(state, PROXIMITY_PATH_ZERO_OVER); } if (tileElement->GetClearanceZ() == inputTileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_PATH_ZERO_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_PATH_ZERO_TOUCH_ABOVE); } if (tileElement->GetBaseZ() == inputTileElement->GetClearanceZ()) { - proximity_score_increment(PROXIMITY_PATH_ZERO_TOUCH_UNDER); + proximity_score_increment(state, PROXIMITY_PATH_ZERO_TOUCH_UNDER); } } break; @@ -625,33 +629,33 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) { if (tileElement->base_height - inputTileElement->clearance_height <= 10) { - proximity_score_increment(PROXIMITY_THROUGH_VERTICAL_LOOP); + proximity_score_increment(state, PROXIMITY_THROUGH_VERTICAL_LOOP); } } } if (inputTileElement->AsTrack()->GetRideIndex() != tileElement->AsTrack()->GetRideIndex()) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_ABOVE_OR_BELOW); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_ABOVE_OR_BELOW); if (tileElement->GetClearanceZ() == inputTileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); } if (tileElement->clearance_height + 2 <= inputTileElement->base_height) { if (tileElement->clearance_height + 10 >= inputTileElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); } } if (inputTileElement->clearance_height == tileElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); } if (inputTileElement->clearance_height + 2 == tileElement->base_height) { if (static_cast(inputTileElement->clearance_height + 10) >= tileElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); } } } @@ -660,40 +664,40 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) bool isStation = tileElement->AsTrack()->IsStation(); if (tileElement->clearance_height == inputTileElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_TRACK_TOUCH_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_OWN_STATION_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_STATION_TOUCH_ABOVE); } } if (tileElement->clearance_height + 2 <= inputTileElement->base_height) { if (tileElement->clearance_height + 10 >= inputTileElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_TRACK_CLOSE_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_OWN_STATION_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_STATION_CLOSE_ABOVE); } } } if (inputTileElement->GetClearanceZ() == tileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_TRACK_TOUCH_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_OWN_STATION_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_STATION_TOUCH_ABOVE); } } if (inputTileElement->clearance_height + 2 <= tileElement->base_height) { if (inputTileElement->clearance_height + 10 >= tileElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_TRACK_CLOSE_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_OWN_STATION_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_STATION_CLOSE_ABOVE); } } } @@ -704,28 +708,28 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) } while (!(tileElement++)->IsLastForTile()); uint8_t direction = inputTileElement->GetDirection(); - ride_ratings_score_close_proximity_in_direction(inputTileElement, (direction + 1) & 3); - ride_ratings_score_close_proximity_in_direction(inputTileElement, (direction - 1) & 3); - ride_ratings_score_close_proximity_loops(inputTileElement); + ride_ratings_score_close_proximity_in_direction(state, inputTileElement, (direction + 1) & 3); + ride_ratings_score_close_proximity_in_direction(state, inputTileElement, (direction - 1) & 3); + ride_ratings_score_close_proximity_loops(state, inputTileElement); - switch (gRideRatingsCalcData.ProximityTrackType) + switch (state.ProximityTrackType) { case TrackElemType::Brakes: - gRideRatingsCalcData.AmountOfBrakes++; + state.AmountOfBrakes++; break; case TrackElemType::LeftReverser: case TrackElemType::RightReverser: - gRideRatingsCalcData.AmountOfReversers++; + state.AmountOfReversers++; break; } } -static void ride_ratings_calculate(Ride* ride) +static void ride_ratings_calculate(RideRatingUpdateState& state, Ride* ride) { auto calcFunc = ride_ratings_get_calculate_func(ride->type); if (calcFunc != nullptr) { - calcFunc(ride); + calcFunc(ride, state); } #ifdef ORIGINAL_RATINGS @@ -867,7 +871,7 @@ static void ride_ratings_calculate_value(Ride* ride) * inputs * - edi: ride ptr */ -static uint16_t ride_compute_upkeep(Ride* ride) +static uint16_t ride_compute_upkeep(RideRatingUpdateState& state, Ride* ride) { // data stored at 0x0057E3A8, incrementing 18 bytes at a time uint16_t upkeep = ride->GetRideTypeDescriptor().UpkeepCosts.BaseCost; @@ -903,10 +907,10 @@ static uint16_t ride_compute_upkeep(Ride* ride) { reverserMaintenanceCost = 10; } - upkeep += reverserMaintenanceCost * gRideRatingsCalcData.AmountOfReversers; + upkeep += reverserMaintenanceCost * state.AmountOfReversers; // Add maintenance cost for brake track pieces - upkeep += 20 * gRideRatingsCalcData.AmountOfBrakes; + upkeep += 20 * state.AmountOfBrakes; // these seem to be adhoc adjustments to a ride's upkeep/cost, times // various variables set on the ride itself. @@ -1058,9 +1062,9 @@ static uint32_t get_proximity_score_helper_3(uint16_t x, uint16_t resultIfNotZer * * rct2: 0x0065E277 */ -static uint32_t ride_ratings_get_proximity_score() +static uint32_t ride_ratings_get_proximity_score(RideRatingUpdateState& state) { - const uint16_t* scores = gRideRatingsCalcData.ProximityScores; + const uint16_t* scores = state.ProximityScores; uint32_t result = 0; result += get_proximity_score_helper_1(scores[PROXIMITY_WATER_OVER], 60, 0x00AAAA); @@ -1591,9 +1595,9 @@ static void ride_ratings_apply_rotations( ride->rotations * nauseaMultiplier); } -static void ride_ratings_apply_proximity(RatingTuple* ratings, int32_t excitementMultiplier) +static void ride_ratings_apply_proximity(RideRatingUpdateState& state, RatingTuple* ratings, int32_t excitementMultiplier) { - ride_ratings_add(ratings, (ride_ratings_get_proximity_score() * excitementMultiplier) >> 16, 0, 0); + ride_ratings_add(ratings, (ride_ratings_get_proximity_score(state) * excitementMultiplier) >> 16, 0, 0); } static void ride_ratings_apply_scenery(RatingTuple* ratings, Ride* ride, int32_t excitementMultiplier) @@ -1718,7 +1722,7 @@ static void ride_ratings_apply_first_length_penalty( #pragma region Ride rating calculation functions -void ride_ratings_calculate_spiral_roller_coaster(Ride* ride) +void ride_ratings_calculate_spiral_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1738,7 +1742,7 @@ void ride_ratings_calculate_spiral_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 28235, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 43690, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -1758,13 +1762,13 @@ void ride_ratings_calculate_spiral_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride) +void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1784,7 +1788,7 @@ void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 34952, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 12850, 28398, 30427); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -1796,13 +1800,13 @@ void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride) +void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1822,7 +1826,7 @@ void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 48036); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6971); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xC0000, 2, 2, 2); @@ -1836,13 +1840,13 @@ void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_inverted_roller_coaster(Ride* ride) +void ride_ratings_calculate_inverted_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1862,7 +1866,7 @@ void ride_ratings_calculate_inverted_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 29552, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 39009, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 15291, 35108); - ride_ratings_apply_proximity(&ratings, 15657); + ride_ratings_apply_proximity(state, &ratings, 15657); ride_ratings_apply_scenery(&ratings, ride, 8366); if (ride->inversions == 0) @@ -1879,13 +1883,13 @@ void ride_ratings_calculate_inverted_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_junior_roller_coaster(Ride* ride) +void ride_ratings_calculate_junior_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1905,7 +1909,7 @@ void ride_ratings_calculate_junior_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -1917,13 +1921,13 @@ void ride_ratings_calculate_junior_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_miniature_railway(Ride* ride) +void ride_ratings_calculate_miniature_railway(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1939,7 +1943,7 @@ void ride_ratings_calculate_miniature_railway(Ride* ride) ride_ratings_apply_average_speed(&ratings, ride, 291271, 436906); ride_ratings_apply_duration(&ratings, ride, 150, 26214); ride_ratings_apply_sheltered_ratings(&ratings, ride, -6425, 6553, 23405); - ride_ratings_apply_proximity(&ratings, 8946); + ride_ratings_apply_proximity(state, &ratings, 8946); ride_ratings_apply_scenery(&ratings, ride, 20915); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 2, 2, 2); @@ -1948,7 +1952,7 @@ void ride_ratings_calculate_miniature_railway(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -1958,7 +1962,7 @@ void ride_ratings_calculate_miniature_railway(Ride* ride) ride->sheltered_eighths = shelteredEighths.TotalShelteredEighths; } -void ride_ratings_calculate_monorail(Ride* ride) +void ride_ratings_calculate_monorail(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1974,7 +1978,7 @@ void ride_ratings_calculate_monorail(Ride* ride) ride_ratings_apply_average_speed(&ratings, ride, 291271, 218453); ride_ratings_apply_duration(&ratings, ride, 150, 21845); ride_ratings_apply_sheltered_ratings(&ratings, ride, 5140, 6553, 18724); - ride_ratings_apply_proximity(&ratings, 8946); + ride_ratings_apply_proximity(state, &ratings, 8946); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); @@ -1983,7 +1987,7 @@ void ride_ratings_calculate_monorail(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -1993,7 +1997,7 @@ void ride_ratings_calculate_monorail(Ride* ride) ride->sheltered_eighths = shelteredEighths.TotalShelteredEighths; } -void ride_ratings_calculate_mini_suspended_coaster(Ride* ride) +void ride_ratings_calculate_mini_suspended_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2013,7 +2017,7 @@ void ride_ratings_calculate_mini_suspended_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 34179, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 58254, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 19275, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 13943); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x80000, 2, 2, 2); @@ -2026,13 +2030,13 @@ void ride_ratings_calculate_mini_suspended_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_boat_hire(Ride* ride) +void ride_ratings_calculate_boat_hire(Ride* ride, RideRatingUpdateState& state) { ride->unreliability_factor = 7; set_unreliability_factor(ride); @@ -2050,7 +2054,7 @@ void ride_ratings_calculate_boat_hire(Ride* ride) ride_ratings_add(&ratings, RIDE_RATING(0, 20), 0, 0); } - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 22310); ride_ratings_apply_intensity_penalty(&ratings); @@ -2058,13 +2062,13 @@ void ride_ratings_calculate_boat_hire(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_wooden_wild_mouse(Ride* ride) +void ride_ratings_calculate_wooden_wild_mouse(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2084,7 +2088,7 @@ void ride_ratings_calculate_wooden_wild_mouse(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -2099,13 +2103,13 @@ void ride_ratings_calculate_wooden_wild_mouse(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_steeplechase(Ride* ride) +void ride_ratings_calculate_steeplechase(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2125,7 +2129,7 @@ void ride_ratings_calculate_steeplechase(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 4, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x80000, 2, 2, 2); @@ -2139,13 +2143,13 @@ void ride_ratings_calculate_steeplechase(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_car_ride(Ride* ride) +void ride_ratings_calculate_car_ride(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2164,7 +2168,7 @@ void ride_ratings_calculate_car_ride(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 14860, 0, 11437); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 12850, 6553, 4681); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 8366); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 8, 2, 2); @@ -2173,13 +2177,13 @@ void ride_ratings_calculate_car_ride(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_launched_freefall(Ride* ride) +void ride_ratings_calculate_launched_freefall(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2216,7 +2220,7 @@ void ride_ratings_calculate_launched_freefall(Ride* ride) } #endif - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_intensity_penalty(&ratings); @@ -2224,13 +2228,13 @@ void ride_ratings_calculate_launched_freefall(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_bobsleigh_coaster(Ride* ride) +void ride_ratings_calculate_bobsleigh_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2250,7 +2254,7 @@ void ride_ratings_calculate_bobsleigh_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xC0000, 2, 2, 2); ride_ratings_apply_max_lateral_g_penalty(&ratings, ride, FIXED_2DP(1, 20), 2, 2, 2); @@ -2262,13 +2266,13 @@ void ride_ratings_calculate_bobsleigh_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_observation_tower(Ride* ride) +void ride_ratings_calculate_observation_tower(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2280,7 +2284,7 @@ void ride_ratings_calculate_observation_tower(Ride* ride) ride_ratings_set(&ratings, RIDE_RATING(1, 50), RIDE_RATING(0, 00), RIDE_RATING(0, 10)); ride_ratings_add( &ratings, ((ride_get_total_length(ride) >> 16) * 45875) >> 16, 0, ((ride_get_total_length(ride) >> 16) * 26214) >> 16); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 83662); ride_ratings_apply_intensity_penalty(&ratings); @@ -2288,7 +2292,7 @@ void ride_ratings_calculate_observation_tower(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; @@ -2298,7 +2302,7 @@ void ride_ratings_calculate_observation_tower(Ride* ride) ride->excitement /= 4; } -void ride_ratings_calculate_looping_roller_coaster(Ride* ride) +void ride_ratings_calculate_looping_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2318,7 +2322,7 @@ void ride_ratings_calculate_looping_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -2338,13 +2342,13 @@ void ride_ratings_calculate_looping_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_dinghy_slide(Ride* ride) +void ride_ratings_calculate_dinghy_slide(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2364,7 +2368,7 @@ void ride_ratings_calculate_dinghy_slide(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -2376,13 +2380,13 @@ void ride_ratings_calculate_dinghy_slide(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mine_train_coaster(Ride* ride) +void ride_ratings_calculate_mine_train_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2402,7 +2406,7 @@ void ride_ratings_calculate_mine_train_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 19275, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 21472); + ride_ratings_apply_proximity(state, &ratings, 21472); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -2416,13 +2420,13 @@ void ride_ratings_calculate_mine_train_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_chairlift(Ride* ride) +void ride_ratings_calculate_chairlift(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2439,7 +2443,7 @@ void ride_ratings_calculate_chairlift(Ride* ride) ride_ratings_apply_duration(&ratings, ride, 150, 26214); ride_ratings_apply_turns(&ratings, ride, 7430, 3476, 4574); ride_ratings_apply_sheltered_ratings(&ratings, ride, -19275, 21845, 23405); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x960000, 2, 2, 2); @@ -2454,7 +2458,7 @@ void ride_ratings_calculate_chairlift(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -2464,7 +2468,7 @@ void ride_ratings_calculate_chairlift(Ride* ride) ride->sheltered_eighths = shelteredEighths.TotalShelteredEighths; } -void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride) +void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2484,7 +2488,7 @@ void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -2504,13 +2508,13 @@ void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_maze(Ride* ride) +void ride_ratings_calculate_maze(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2530,13 +2534,13 @@ void ride_ratings_calculate_maze(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_spiral_slide(Ride* ride) +void ride_ratings_calculate_spiral_slide(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2559,13 +2563,13 @@ void ride_ratings_calculate_spiral_slide(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 2; } -void ride_ratings_calculate_go_karts(Ride* ride) +void ride_ratings_calculate_go_karts(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2588,7 +2592,7 @@ void ride_ratings_calculate_go_karts(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 4458, 3476, 5718); ride_ratings_apply_drops(&ratings, ride, 8738, 5461, 6553); ride_ratings_apply_sheltered_ratings(&ratings, ride, 2570, 8738, 2340); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_intensity_penalty(&ratings); @@ -2596,7 +2600,7 @@ void ride_ratings_calculate_go_karts(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -2606,7 +2610,7 @@ void ride_ratings_calculate_go_karts(Ride* ride) ride->excitement /= 2; } -void ride_ratings_calculate_log_flume(Ride* ride) +void ride_ratings_calculate_log_flume(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2623,22 +2627,22 @@ void ride_ratings_calculate_log_flume(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 22291, 20860, 4574); ride_ratings_apply_drops(&ratings, ride, 69905, 62415, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); - ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 2, 2, 2, 2); + ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_intensity_penalty(&ratings); ride_ratings_apply_adjustments(ride, &ratings); ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_river_rapids(Ride* ride) +void ride_ratings_calculate_river_rapids(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2655,7 +2659,7 @@ void ride_ratings_calculate_river_rapids(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 22598, 5718); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 31314); + ride_ratings_apply_proximity(state, &ratings, 31314); ride_ratings_apply_scenery(&ratings, ride, 13943); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 2, 2, 2, 2); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 2, 2, 2); @@ -2665,13 +2669,13 @@ void ride_ratings_calculate_river_rapids(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_dodgems(Ride* ride) +void ride_ratings_calculate_dodgems(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2700,13 +2704,13 @@ void ride_ratings_calculate_dodgems(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_swinging_ship(Ride* ride) +void ride_ratings_calculate_swinging_ship(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2725,13 +2729,13 @@ void ride_ratings_calculate_swinging_ship(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_inverter_ship(Ride* ride) +void ride_ratings_calculate_inverter_ship(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2750,31 +2754,31 @@ void ride_ratings_calculate_inverter_ship(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_food_stall(Ride* ride) +void ride_ratings_calculate_food_stall(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_drink_stall(Ride* ride) +void ride_ratings_calculate_drink_stall(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_shop(Ride* ride) +void ride_ratings_calculate_shop(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_merry_go_round(Ride* ride) +void ride_ratings_calculate_merry_go_round(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2790,25 +2794,25 @@ void ride_ratings_calculate_merry_go_round(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_information_kiosk(Ride* ride) +void ride_ratings_calculate_information_kiosk(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_toilets(Ride* ride) +void ride_ratings_calculate_toilets(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_ferris_wheel(Ride* ride) +void ride_ratings_calculate_ferris_wheel(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2824,13 +2828,13 @@ void ride_ratings_calculate_ferris_wheel(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_motion_simulator(Ride* ride) +void ride_ratings_calculate_motion_simulator(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2857,13 +2861,13 @@ void ride_ratings_calculate_motion_simulator(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_3d_cinema(Ride* ride) +void ride_ratings_calculate_3d_cinema(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2897,13 +2901,13 @@ void ride_ratings_calculate_3d_cinema(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths |= 7; } -void ride_ratings_calculate_top_spin(Ride* ride) +void ride_ratings_calculate_top_spin(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2939,13 +2943,13 @@ void ride_ratings_calculate_top_spin(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_space_rings(Ride* ride) +void ride_ratings_calculate_space_rings(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2961,13 +2965,13 @@ void ride_ratings_calculate_space_rings(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride) +void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2982,7 +2986,7 @@ void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride) ride_ratings_apply_max_speed(&ratings, ride, 436906, 436906, 320398); ride_ratings_apply_gforces(&ratings, ride, 24576, 41704, 59578); ride_ratings_apply_sheltered_ratings(&ratings, ride, 12850, 28398, 11702); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 34, 2, 2, 2); @@ -2991,13 +2995,13 @@ void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_lift(Ride* ride) +void ride_ratings_calculate_lift(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3011,7 +3015,7 @@ void ride_ratings_calculate_lift(Ride* ride) int32_t totalLength = ride_get_total_length(ride) >> 16; ride_ratings_add(&ratings, (totalLength * 45875) >> 16, 0, (totalLength * 26214) >> 16); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 83662); ride_ratings_apply_intensity_penalty(&ratings); @@ -3019,7 +3023,7 @@ void ride_ratings_calculate_lift(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; @@ -3028,7 +3032,7 @@ void ride_ratings_calculate_lift(Ride* ride) ride->excitement /= 4; } -void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride) +void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3047,7 +3051,7 @@ void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 58254, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 20, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -3060,19 +3064,19 @@ void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_cash_machine(Ride* ride) +void ride_ratings_calculate_cash_machine(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_twist(Ride* ride) +void ride_ratings_calculate_twist(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3088,13 +3092,13 @@ void ride_ratings_calculate_twist(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_haunted_house(Ride* ride) +void ride_ratings_calculate_haunted_house(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3112,13 +3116,13 @@ void ride_ratings_calculate_haunted_house(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_flying_roller_coaster(Ride* ride) +void ride_ratings_calculate_flying_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3138,7 +3142,7 @@ void ride_ratings_calculate_flying_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3157,13 +3161,13 @@ void ride_ratings_calculate_flying_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_virginia_reel(Ride* ride) +void ride_ratings_calculate_virginia_reel(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3183,7 +3187,7 @@ void ride_ratings_calculate_virginia_reel(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 52012, 26075, 45749); ride_ratings_apply_drops(&ratings, ride, 43690, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xD20000, 2, 2, 2); ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); @@ -3194,13 +3198,13 @@ void ride_ratings_calculate_virginia_reel(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_splash_boats(Ride* ride) +void ride_ratings_calculate_splash_boats(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3217,7 +3221,7 @@ void ride_ratings_calculate_splash_boats(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 22291, 20860, 4574); ride_ratings_apply_drops(&ratings, ride, 87381, 93622, 62259); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); @@ -3226,13 +3230,13 @@ void ride_ratings_calculate_splash_boats(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mini_helicopters(Ride* ride) +void ride_ratings_calculate_mini_helicopters(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3251,7 +3255,7 @@ void ride_ratings_calculate_mini_helicopters(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 14860, 0, 4574); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 12850, 6553, 4681); - ride_ratings_apply_proximity(&ratings, 8946); + ride_ratings_apply_proximity(state, &ratings, 8946); ride_ratings_apply_scenery(&ratings, ride, 8366); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xA00000, 2, 2, 2); @@ -3260,13 +3264,13 @@ void ride_ratings_calculate_mini_helicopters(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 6; } -void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride) +void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3286,7 +3290,7 @@ void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3310,13 +3314,13 @@ void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_suspended_monorail(Ride* ride) +void ride_ratings_calculate_suspended_monorail(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3332,7 +3336,7 @@ void ride_ratings_calculate_suspended_monorail(Ride* ride) ride_ratings_apply_average_speed(&ratings, ride, 291271, 218453); ride_ratings_apply_duration(&ratings, ride, 150, 21845); ride_ratings_apply_sheltered_ratings(&ratings, ride, 5140, 6553, 18724); - ride_ratings_apply_proximity(&ratings, 12525); + ride_ratings_apply_proximity(state, &ratings, 12525); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); @@ -3341,7 +3345,7 @@ void ride_ratings_calculate_suspended_monorail(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -3351,7 +3355,7 @@ void ride_ratings_calculate_suspended_monorail(Ride* ride) ride->sheltered_eighths = shelteredEighths.TotalShelteredEighths; } -void ride_ratings_calculate_reverser_roller_coaster(Ride* ride) +void ride_ratings_calculate_reverser_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3367,7 +3371,7 @@ void ride_ratings_calculate_reverser_roller_coaster(Ride* ride) ride_ratings_apply_max_speed(&ratings, ride, 44281, 88562, 35424); ride_ratings_apply_average_speed(&ratings, ride, 364088, 655360); - int32_t numReversers = std::min(gRideRatingsCalcData.AmountOfReversers, 6); + int32_t numReversers = std::min(state.AmountOfReversers, 6); ride_rating reverserRating = numReversers * RIDE_RATING(0, 20); ride_ratings_add(&ratings, reverserRating, reverserRating, reverserRating); @@ -3376,10 +3380,10 @@ void ride_ratings_calculate_reverser_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); - if (gRideRatingsCalcData.AmountOfReversers < 1) + if (state.AmountOfReversers < 1) { ratings.Excitement /= 8; } @@ -3393,13 +3397,13 @@ void ride_ratings_calculate_reverser_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_heartline_twister_coaster(Ride* ride) +void ride_ratings_calculate_heartline_twister_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3419,7 +3423,7 @@ void ride_ratings_calculate_heartline_twister_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 52150, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 53052, 55705); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 34952, 35108); - ride_ratings_apply_proximity(&ratings, 9841); + ride_ratings_apply_proximity(state, &ratings, 9841); ride_ratings_apply_scenery(&ratings, ride, 3904); if (ride->inversions == 0) @@ -3433,13 +3437,13 @@ void ride_ratings_calculate_heartline_twister_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mini_golf(Ride* ride) +void ride_ratings_calculate_mini_golf(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3452,7 +3456,7 @@ void ride_ratings_calculate_mini_golf(Ride* ride) ride_ratings_apply_length(&ratings, ride, 6000, 873); ride_ratings_apply_turns(&ratings, ride, 14860, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 5140, 6553, 4681); - ride_ratings_apply_proximity(&ratings, 15657); + ride_ratings_apply_proximity(state, &ratings, 15657); ride_ratings_apply_scenery(&ratings, ride, 27887); // Apply golf holes factor @@ -3471,19 +3475,19 @@ void ride_ratings_calculate_mini_golf(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_first_aid(Ride* ride) +void ride_ratings_calculate_first_aid(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_circus(Ride* ride) +void ride_ratings_calculate_circus(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3501,13 +3505,13 @@ void ride_ratings_calculate_circus(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_ghost_train(Ride* ride) +void ride_ratings_calculate_ghost_train(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3525,7 +3529,7 @@ void ride_ratings_calculate_ghost_train(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 14860, 0, 11437); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 6553, 4681); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 8366); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xB40000, 2, 2, 2); @@ -3534,13 +3538,13 @@ void ride_ratings_calculate_ghost_train(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_twister_roller_coaster(Ride* ride) +void ride_ratings_calculate_twister_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3560,7 +3564,7 @@ void ride_ratings_calculate_twister_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3580,13 +3584,13 @@ void ride_ratings_calculate_twister_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_wooden_roller_coaster(Ride* ride) +void ride_ratings_calculate_wooden_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3606,7 +3610,7 @@ void ride_ratings_calculate_wooden_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -3620,13 +3624,13 @@ void ride_ratings_calculate_wooden_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride) +void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3646,7 +3650,7 @@ void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x50000, 2, 2, 2); @@ -3659,13 +3663,13 @@ void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_wild_mouse(Ride* ride) +void ride_ratings_calculate_wild_mouse(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3685,7 +3689,7 @@ void ride_ratings_calculate_wild_mouse(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -3699,13 +3703,13 @@ void ride_ratings_calculate_wild_mouse(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride) +void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3725,7 +3729,7 @@ void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3744,13 +3748,13 @@ void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_giga_coaster(Ride* ride) +void ride_ratings_calculate_giga_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3770,7 +3774,7 @@ void ride_ratings_calculate_giga_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 28235, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 43690, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3790,13 +3794,13 @@ void ride_ratings_calculate_giga_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_roto_drop(Ride* ride) +void ride_ratings_calculate_roto_drop(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3810,7 +3814,7 @@ void ride_ratings_calculate_roto_drop(Ride* ride) int32_t lengthFactor = ((ride_get_total_length(ride) >> 16) * 209715) >> 16; ride_ratings_add(&ratings, lengthFactor, lengthFactor * 2, lengthFactor * 2); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_intensity_penalty(&ratings); @@ -3818,13 +3822,13 @@ void ride_ratings_calculate_roto_drop(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_flying_saucers(Ride* ride) +void ride_ratings_calculate_flying_saucers(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3856,13 +3860,13 @@ void ride_ratings_calculate_flying_saucers(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_crooked_house(Ride* ride) +void ride_ratings_calculate_crooked_house(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3880,13 +3884,13 @@ void ride_ratings_calculate_crooked_house(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_monorail_cycles(Ride* ride) +void ride_ratings_calculate_monorail_cycles(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3905,7 +3909,7 @@ void ride_ratings_calculate_monorail_cycles(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 14860, 0, 4574); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 5140, 6553, 2340); - ride_ratings_apply_proximity(&ratings, 8946); + ride_ratings_apply_proximity(state, &ratings, 8946); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x8C0000, 2, 2, 2); @@ -3914,13 +3918,13 @@ void ride_ratings_calculate_monorail_cycles(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_compact_inverted_coaster(Ride* ride) +void ride_ratings_calculate_compact_inverted_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3940,7 +3944,7 @@ void ride_ratings_calculate_compact_inverted_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 29552, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 39009, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 15291, 35108); - ride_ratings_apply_proximity(&ratings, 15657); + ride_ratings_apply_proximity(state, &ratings, 15657); ride_ratings_apply_scenery(&ratings, ride, 8366); if (ride->inversions == 0) @@ -3957,13 +3961,13 @@ void ride_ratings_calculate_compact_inverted_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_water_coaster(Ride* ride) +void ride_ratings_calculate_water_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3983,7 +3987,7 @@ void ride_ratings_calculate_water_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -3998,13 +4002,13 @@ void ride_ratings_calculate_water_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride) +void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4019,7 +4023,7 @@ void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride) ride_ratings_apply_max_speed(&ratings, ride, 509724, 364088, 320398); ride_ratings_apply_gforces(&ratings, ride, 24576, 35746, 59578); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 21845, 11702); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 34, 2, 1, 1); @@ -4029,13 +4033,13 @@ void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride) +void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4055,7 +4059,7 @@ void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -4070,13 +4074,13 @@ void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_magic_carpet(Ride* ride) +void ride_ratings_calculate_magic_carpet(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -4095,13 +4099,13 @@ void ride_ratings_calculate_magic_carpet(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_submarine_ride(Ride* ride) +void ride_ratings_calculate_submarine_ride(Ride* ride, RideRatingUpdateState& state) { ride->unreliability_factor = 7; set_unreliability_factor(ride); @@ -4111,7 +4115,7 @@ void ride_ratings_calculate_submarine_ride(Ride* ride) RatingTuple ratings; ride_ratings_set(&ratings, RIDE_RATING(2, 20), RIDE_RATING(1, 80), RIDE_RATING(1, 40)); ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 22310); ride_ratings_apply_intensity_penalty(&ratings); @@ -4119,14 +4123,14 @@ void ride_ratings_calculate_submarine_ride(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; // Originally, this was always to zero, even though the default vehicle is completely enclosed. ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_river_rafts(Ride* ride) +void ride_ratings_calculate_river_rafts(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4142,7 +4146,7 @@ void ride_ratings_calculate_river_rafts(Ride* ride) ride_ratings_apply_duration(&ratings, ride, 500, 13107); ride_ratings_apply_turns(&ratings, ride, 22291, 20860, 4574); ride_ratings_apply_drops(&ratings, ride, 78643, 93622, 62259); - ride_ratings_apply_proximity(&ratings, 13420); + ride_ratings_apply_proximity(state, &ratings, 13420); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_intensity_penalty(&ratings); @@ -4150,13 +4154,13 @@ void ride_ratings_calculate_river_rafts(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_enterprise(Ride* ride) +void ride_ratings_calculate_enterprise(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -4179,13 +4183,13 @@ void ride_ratings_calculate_enterprise(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 3; } -void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride) +void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4205,7 +4209,7 @@ void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 29552, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 39009, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 15291, 35108); - ride_ratings_apply_proximity(&ratings, 15657); + ride_ratings_apply_proximity(state, &ratings, 15657); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 20, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -4216,13 +4220,13 @@ void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mini_roller_coaster(Ride* ride) +void ride_ratings_calculate_mini_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4242,7 +4246,7 @@ void ride_ratings_calculate_mini_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -4255,13 +4259,13 @@ void ride_ratings_calculate_mini_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mine_ride(Ride* ride) +void ride_ratings_calculate_mine_ride(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4281,7 +4285,7 @@ void ride_ratings_calculate_mine_ride(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 19275, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 21472); + ride_ratings_apply_proximity(state, &ratings, 21472); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x10E0000, 2, 2, 2); @@ -4291,13 +4295,13 @@ void ride_ratings_calculate_mine_ride(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride) +void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4317,7 +4321,7 @@ void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -4337,13 +4341,13 @@ void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_hybrid_coaster(Ride* ride) +void ride_ratings_calculate_hybrid_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4363,7 +4367,7 @@ void ride_ratings_calculate_hybrid_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 34179, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 34952, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -4383,12 +4387,12 @@ void ride_ratings_calculate_hybrid_coaster(Ride* ride) ride_ratings_apply_intensity_penalty(&ratings); ride_ratings_apply_adjustments(ride, &ratings); ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride) +void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4408,7 +4412,7 @@ void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -4428,7 +4432,7 @@ void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; diff --git a/src/openrct2/ride/RideRatings.h b/src/openrct2/ride/RideRatings.h index 5496137151..449c42daa8 100644 --- a/src/openrct2/ride/RideRatings.h +++ b/src/openrct2/ride/RideRatings.h @@ -39,7 +39,7 @@ enum RIDE_RATING_STATION_FLAG_NO_ENTRANCE = 1 << 0 }; -struct RideRatingCalculationData +struct RideRatingUpdateState { CoordsXYZ Proximity; CoordsXYZ ProximityStart; @@ -54,92 +54,92 @@ struct RideRatingCalculationData uint16_t StationFlags; }; -extern RideRatingCalculationData gRideRatingsCalcData; +extern RideRatingUpdateState gRideRatingUpdateState; void ride_ratings_update_ride(const Ride& ride); void ride_ratings_update_all(); -using ride_ratings_calculation = void (*)(Ride* ride); +using ride_ratings_calculation = void (*)(Ride* ride, RideRatingUpdateState& state); ride_ratings_calculation ride_ratings_get_calculate_func(uint8_t rideType); -void ride_ratings_calculate_spiral_roller_coaster(Ride* ride); -void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride); -void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride); -void ride_ratings_calculate_inverted_roller_coaster(Ride* ride); -void ride_ratings_calculate_junior_roller_coaster(Ride* ride); -void ride_ratings_calculate_miniature_railway(Ride* ride); -void ride_ratings_calculate_monorail(Ride* ride); -void ride_ratings_calculate_mini_suspended_coaster(Ride* ride); -void ride_ratings_calculate_boat_hire(Ride* ride); -void ride_ratings_calculate_wooden_wild_mouse(Ride* ride); -void ride_ratings_calculate_steeplechase(Ride* ride); -void ride_ratings_calculate_car_ride(Ride* ride); -void ride_ratings_calculate_launched_freefall(Ride* ride); -void ride_ratings_calculate_bobsleigh_coaster(Ride* ride); -void ride_ratings_calculate_observation_tower(Ride* ride); -void ride_ratings_calculate_looping_roller_coaster(Ride* ride); -void ride_ratings_calculate_dinghy_slide(Ride* ride); -void ride_ratings_calculate_mine_train_coaster(Ride* ride); -void ride_ratings_calculate_chairlift(Ride* ride); -void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride); -void ride_ratings_calculate_maze(Ride* ride); -void ride_ratings_calculate_spiral_slide(Ride* ride); -void ride_ratings_calculate_go_karts(Ride* ride); -void ride_ratings_calculate_log_flume(Ride* ride); -void ride_ratings_calculate_river_rapids(Ride* ride); -void ride_ratings_calculate_dodgems(Ride* ride); -void ride_ratings_calculate_swinging_ship(Ride* ride); -void ride_ratings_calculate_inverter_ship(Ride* ride); -void ride_ratings_calculate_food_stall(Ride* ride); -void ride_ratings_calculate_shop(Ride* ride); -void ride_ratings_calculate_merry_go_round(Ride* ride); -void ride_ratings_calculate_information_kiosk(Ride* ride); -void ride_ratings_calculate_toilets(Ride* ride); -void ride_ratings_calculate_ferris_wheel(Ride* ride); -void ride_ratings_calculate_motion_simulator(Ride* ride); -void ride_ratings_calculate_3d_cinema(Ride* ride); -void ride_ratings_calculate_top_spin(Ride* ride); -void ride_ratings_calculate_space_rings(Ride* ride); -void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride); -void ride_ratings_calculate_lift(Ride* ride); -void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride); -void ride_ratings_calculate_cash_machine(Ride* ride); -void ride_ratings_calculate_twist(Ride* ride); -void ride_ratings_calculate_haunted_house(Ride* ride); -void ride_ratings_calculate_first_aid(Ride* ride); -void ride_ratings_calculate_circus(Ride* ride); -void ride_ratings_calculate_ghost_train(Ride* ride); -void ride_ratings_calculate_twister_roller_coaster(Ride* ride); -void ride_ratings_calculate_wooden_roller_coaster(Ride* ride); -void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride); -void ride_ratings_calculate_wild_mouse(Ride* ride); -void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride); -void ride_ratings_calculate_flying_roller_coaster(Ride* ride); -void ride_ratings_calculate_virginia_reel(Ride* ride); -void ride_ratings_calculate_splash_boats(Ride* ride); -void ride_ratings_calculate_mini_helicopters(Ride* ride); -void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride); -void ride_ratings_calculate_suspended_monorail(Ride* ride); -void ride_ratings_calculate_reverser_roller_coaster(Ride* ride); -void ride_ratings_calculate_heartline_twister_coaster(Ride* ride); -void ride_ratings_calculate_mini_golf(Ride* ride); -void ride_ratings_calculate_giga_coaster(Ride* ride); -void ride_ratings_calculate_roto_drop(Ride* ride); -void ride_ratings_calculate_flying_saucers(Ride* ride); -void ride_ratings_calculate_crooked_house(Ride* ride); -void ride_ratings_calculate_monorail_cycles(Ride* ride); -void ride_ratings_calculate_compact_inverted_coaster(Ride* ride); -void ride_ratings_calculate_water_coaster(Ride* ride); -void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride); -void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride); -void ride_ratings_calculate_magic_carpet(Ride* ride); -void ride_ratings_calculate_submarine_ride(Ride* ride); -void ride_ratings_calculate_river_rafts(Ride* ride); -void ride_ratings_calculate_enterprise(Ride* ride); -void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride); -void ride_ratings_calculate_mini_roller_coaster(Ride* ride); -void ride_ratings_calculate_mine_ride(Ride* ride); -void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride); -void ride_ratings_calculate_hybrid_coaster(Ride* ride); -void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride); -void ride_ratings_calculate_drink_stall(Ride* ride); +void ride_ratings_calculate_spiral_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_inverted_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_junior_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_miniature_railway(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_monorail(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mini_suspended_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_boat_hire(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_wooden_wild_mouse(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_steeplechase(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_car_ride(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_launched_freefall(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_bobsleigh_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_observation_tower(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_looping_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_dinghy_slide(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mine_train_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_chairlift(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_maze(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_spiral_slide(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_go_karts(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_log_flume(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_river_rapids(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_dodgems(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_swinging_ship(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_inverter_ship(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_food_stall(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_shop(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_merry_go_round(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_information_kiosk(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_toilets(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_ferris_wheel(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_motion_simulator(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_3d_cinema(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_top_spin(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_space_rings(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_lift(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_cash_machine(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_twist(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_haunted_house(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_first_aid(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_circus(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_ghost_train(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_twister_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_wooden_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_wild_mouse(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_flying_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_virginia_reel(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_splash_boats(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mini_helicopters(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_suspended_monorail(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_reverser_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_heartline_twister_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mini_golf(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_giga_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_roto_drop(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_flying_saucers(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_crooked_house(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_monorail_cycles(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_compact_inverted_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_water_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_magic_carpet(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_submarine_ride(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_river_rafts(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_enterprise(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mini_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mine_ride(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_hybrid_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_drink_stall(Ride* ride, RideRatingUpdateState& state); diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index a9d4a882bf..fba68ed5a2 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -12,6 +12,7 @@ #include "../Game.h" #include "../config/Config.h" #include "../drawing/Drawing.h" +#include "../drawing/LightFX.h" #include "../interface/Viewport.h" #include "../interface/Window.h" #include "../localisation/Localisation.h" @@ -750,7 +751,7 @@ bool track_paint_util_draw_station_covers_2( return false; } - if (!(session->Unk141E9DB & (G141E9DB_FLAG_1 | G141E9DB_FLAG_2))) + if (!(session->Unk141E9DB & (PaintSessionFlags::IsPassedSurface | PaintSessionFlags::IsTrackPiecePreview))) { return false; } @@ -2196,6 +2197,20 @@ void track_paint(paint_session* session, Direction direction, int32_t height, co } } +#ifdef __ENABLE_LIGHTFX__ + if (lightfx_is_available()) + { + uint8_t zOffset = 16; + if (ride->type == RIDE_TYPE_TOILETS || ride->type == RIDE_TYPE_FIRST_AID || ride->type == RIDE_TYPE_CASH_MACHINE) + zOffset = 23; + + if (ride->type == RIDE_TYPE_INFORMATION_KIOSK) + LightFxAddKioskLights(session->MapPosition, height, zOffset); + else if (RideTypeDescriptors[ride->type].HasFlag(RIDE_TYPE_FLAG_IS_SHOP)) + LightFxAddShopLights(session->MapPosition, tileElement->GetDirection(), height, zOffset); + } +#endif + session->InteractionType = ViewportInteractionItem::Ride; session->TrackColours[SCHEME_TRACK] = SPRITE_ID_PALETTE_COLOUR_2( ride->track_colour[trackColourScheme].main, ride->track_colour[trackColourScheme].additional); diff --git a/src/openrct2/scenario/ScenarioRepository.cpp b/src/openrct2/scenario/ScenarioRepository.cpp index c301de9c55..0818daadec 100644 --- a/src/openrct2/scenario/ScenarioRepository.cpp +++ b/src/openrct2/scenario/ScenarioRepository.cpp @@ -444,6 +444,25 @@ public: Scan(language); scenario_index_entry* scenario = GetByFilename(scenarioFileName); + + // Check if this is an RCTC scenario that corresponds to a known RCT1/2 scenario or vice versa, see #12626 + if (scenario == nullptr) + { + const std::string scenarioBaseName = String::ToStd(Path::GetFileNameWithoutExtension(scenarioFileName)); + const std::string scenarioExtension = String::ToStd(Path::GetExtension(scenarioFileName)); + + if (String::Equals(scenarioExtension, ".sea", true)) + { + // Get scenario using RCT2 style name of RCTC scenario + scenario = GetByFilename((scenarioBaseName + ".sc6").c_str()); + } + else if (String::Equals(scenarioExtension, ".sc6", true)) + { + // Get scenario using RCTC style name of RCT2 scenario + scenario = GetByFilename((scenarioBaseName + ".sea").c_str()); + } + } + if (scenario != nullptr) { // Check if record company value has been broken or the highscore is the same but no name is registered @@ -726,10 +745,10 @@ private: { for (auto& highscore : _highscores) { - scenario_index_entry* scenerio = GetByFilename(highscore->fileName); - if (scenerio != nullptr) + scenario_index_entry* scenario = GetByFilename(highscore->fileName); + if (scenario != nullptr) { - scenerio->highscore = highscore; + scenario->highscore = highscore; } } } diff --git a/src/openrct2/scripting/ScPark.hpp b/src/openrct2/scripting/ScPark.hpp index b2cfbafd4f..202f06de4c 100644 --- a/src/openrct2/scripting/ScPark.hpp +++ b/src/openrct2/scripting/ScPark.hpp @@ -208,7 +208,7 @@ namespace OpenRCT2::Scripting { return msg->Text; } - return 0; + return {}; } void text_set(const std::string& value) diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 5375a9a6c6..9b10aff145 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -90,8 +90,6 @@ CoordsXY gMapSelectPositionB; CoordsXYZ gMapSelectArrowPosition; uint8_t gMapSelectArrowDirection; -uint8_t gMapGroundFlags; - TileCoordsXY gWidePathTileLoopPosition; uint16_t gGrassSceneryTileLoopPosition; @@ -1354,7 +1352,7 @@ std::unique_ptr MapCanConstructWithClearAt( res->GroundFlags = ELEMENT_IS_ABOVE_GROUND; bool canBuildCrossing = false; - if (pos.x >= GetMapSizeUnits() || pos.y >= GetMapSizeUnits() || pos.x < 32 || pos.y < 32) + if (map_is_edge(pos)) { res->Error = GameActions::Status::InvalidParameters; res->ErrorMessage = STR_OFF_EDGE_OF_MAP; @@ -1522,37 +1520,9 @@ std::unique_ptr MapCanConstructWithClearAt( return res; } -bool map_can_construct_with_clear_at( - const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, QuarterTile quarterTile, uint8_t flags, money32* price, - uint8_t crossingMode, bool isTree) -{ - auto res = MapCanConstructWithClearAt(pos, clearFunc, quarterTile, flags, crossingMode, isTree); - if (auto message = res->ErrorMessage.AsStringId()) - gGameCommandErrorText = *message; - else - gGameCommandErrorText = STR_NONE; - std::copy(res->ErrorMessageArgs.begin(), res->ErrorMessageArgs.end(), gCommonFormatArgs); - if (price != nullptr) - { - *price += res->Cost; - } - - gMapGroundFlags = res->GroundFlags; - return res->Error == GameActions::Status::Ok; -} - -/** - * - * rct2: 0x0068B93A - */ -int32_t map_can_construct_at(const CoordsXYRangedZ& pos, QuarterTile bl) -{ - return map_can_construct_with_clear_at(pos, nullptr, bl, 0, nullptr, CREATE_CROSSING_MODE_NONE); -} - std::unique_ptr MapCanConstructAt(const CoordsXYRangedZ& pos, QuarterTile bl) { - return MapCanConstructWithClearAt(pos, nullptr, bl, 0, CREATE_CROSSING_MODE_NONE); + return MapCanConstructWithClearAt(pos, nullptr, bl, 0); } /** * Updates grass length, scenery age and jumping fountains. diff --git a/src/openrct2/world/Map.h b/src/openrct2/world/Map.h index f0c8607444..dee505a655 100644 --- a/src/openrct2/world/Map.h +++ b/src/openrct2/world/Map.h @@ -85,7 +85,7 @@ enum MAP_SELECT_TYPE_EDGE_3, }; -// Used when calling map_can_construct_with_clear_at(); +// Used when calling MapCanConstructWithClearAt(); // This assumes that the caller has already done the check on the element it wants to place, // as this function can only check the element the player wants to build through. enum @@ -124,8 +124,6 @@ extern CoordsXY gMapSelectPositionB; extern CoordsXYZ gMapSelectArrowPosition; extern uint8_t gMapSelectArrowDirection; -extern uint8_t gMapGroundFlags; - extern std::vector gMapSelectionTiles; extern std::vector gPeepSpawns; @@ -246,14 +244,10 @@ using CLEAR_FUNC = int32_t (*)(TileElement** tile_element, const CoordsXY& coord int32_t map_place_non_scenery_clear_func(TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money32* price); int32_t map_place_scenery_clear_func(TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money32* price); -bool map_can_construct_with_clear_at( - const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, QuarterTile quarterTile, uint8_t flags, money32* price, - uint8_t crossingMode, bool isTree = false); std::unique_ptr MapCanConstructWithClearAt( - const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, QuarterTile quarterTile, uint8_t flags, uint8_t crossingMode, - bool isTree = false); + const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, QuarterTile quarterTile, uint8_t flags, + uint8_t crossingMode = CREATE_CROSSING_MODE_NONE, bool isTree = false); std::unique_ptr MapCanConstructAt(const CoordsXYRangedZ& pos, QuarterTile bl); -int32_t map_can_construct_at(const CoordsXYRangedZ& pos, QuarterTile bl); struct tile_element_iterator { diff --git a/test/tests/Pathfinding.cpp b/test/tests/Pathfinding.cpp index 4986ea0140..df55e74b3e 100644 --- a/test/tests/Pathfinding.cpp +++ b/test/tests/Pathfinding.cpp @@ -68,7 +68,7 @@ protected: { // Our start position is in tile coordinates, but we need to give the peep spawn // position in actual world coords (32 units per tile X/Y, 8 per Z level). - // Add 16 so the peep spawns in the center of the tile. + // Add 16 so the peep spawns in the centre of the tile. auto* peep = Guest::Generate(pos->ToCoordsXYZ().ToTileCentre()); // Peeps that are outside of the park use specialized pathfinding which we don't want to diff --git a/test/tests/testdata/ratings/bpb.sv6.txt b/test/tests/testdata/ratings/bpb.sv6.txt index fb5f52a78c..c14b9edb99 100644 --- a/test/tests/testdata/ratings/bpb.sv6.txt +++ b/test/tests/testdata/ratings/bpb.sv6.txt @@ -7,7 +7,7 @@ RIDE_TYPE_BOBSLEIGH_COASTER: (559, 548, 440) RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (504, 533, 204) RIDE_TYPE_CAR_RIDE: (418, 58, 3) RIDE_TYPE_WOODEN_WILD_MOUSE: (324, 381, 220) -RIDE_TYPE_LOG_FLUME: (416, 139, 105) +RIDE_TYPE_LOG_FLUME: (208, 69, 52) RIDE_TYPE_3D_CINEMA: (350, 240, 140) RIDE_TYPE_HAUNTED_HOUSE: (341, 153, 10) RIDE_TYPE_MONORAIL: (439, 25, 5)