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 |
|----------------|--------------------------|
-| [](https://openrct2.org/downloads/master/latest) | [](https://openrct2.org/downloads/develop/latest) |
+| [](https://openrct2.org/downloads/master/latest) | [](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)