diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 000000000000..bd3cb3ed7b06 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,55 @@ +# Rules for automatically applying labels to PRs +# See also: https://github.com/actions/labeler + +# General labels +'build': + - changed-files: + - any-glob-to-any-file: + - '.github/*' + - '.github/**/*' + - 'cmake/*' + - 'cmake/**/*' + - 'scripts/*' + - 'CMakeLists.txt' + - '**/CMakeLists.txt' + - '*.sln' + - '**/*.vcxproj' +'documentation': + - changed-files: + - any-glob-to-any-file: + - '*.md' + - '**/*.md' + +# Localisation +'localisation': + - changed-files: + - any-glob-to-any-file: + - 'data/language/en-GB.txt' + +# Game components +'actions': + - changed-files: + - any-glob-to-any-file: + - 'src/openrct2/actions/*' +'map generator': + - changed-files: + - any-glob-to-any-file: + - 'src/openrct2/world/map_generator/*' +'network': + - changed-files: + - any-glob-to-any-file: + - 'src/openrct2/network/*' +'paint': + - changed-files: + - any-glob-to-any-file: + - 'src/openrct2/paint/*' + +# Platform code +'platform': + - changed-files: + - any-glob-to-any-file: + - 'src/openrct2/platform/*' +'android': + - changed-files: + - any-glob-to-any-file: + - 'src/openrct2-android/*' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf166da50055..16dd610f8596 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ env: OPENRCT2_BUILD_SERVER: GitHub OPENRCT2_ORG_TOKEN: ${{ secrets.OPENRCT2_ORG_TOKEN }} BACKTRACE_IO_TOKEN: ${{ secrets.BACKTRACE_IO_TOKEN }} - OPENRCT2_VERSION: 0.4.28 + OPENRCT2_VERSION: 0.4.30 # https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value concurrency: diff --git a/.github/workflows/label-prs.yml b/.github/workflows/label-prs.yml new file mode 100644 index 000000000000..405ec0180846 --- /dev/null +++ b/.github/workflows/label-prs.yml @@ -0,0 +1,18 @@ +# This workflow automatically labels new pull requests +# See labeler.yml for the label rules involved + +name: Apply labels to pull request +on: pull_request_target + +jobs: + labeler: + permissions: + contents: read + issues: write # automatically creates labels + pull-requests: write # assigning labels to PRs + runs-on: ubuntu-latest + if: github.repository == 'OpenRCT2/OpenRCT2' + steps: + - uses: actions/labeler@v6 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 9b0741e8d591..7597a119602a 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,8 @@ data/tracks.dat data/sequence data/object data/assetpack +test/tests/testdata/replays +test/tests/testdata/sprites/result.dat ################# ## Eclipse diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c6e18ece266..0b8916cefb7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,9 +70,9 @@ set(TITLE_SEQUENCE_VERSION "0.4.26") set(TITLE_SEQUENCE_URL "https://github.com/OpenRCT2/title-sequences/releases/download/v${TITLE_SEQUENCE_VERSION}/title-sequences.zip") set(TITLE_SEQUENCE_SHA256 "dabb9787b1576342fca4dd9f64b3f8cfa04a7e6ce9c2bb9610f47b762905c858") -set(OBJECTS_VERSION "1.7.3") +set(OBJECTS_VERSION "1.7.5") set(OBJECTS_URL "https://github.com/OpenRCT2/objects/releases/download/v${OBJECTS_VERSION}/objects.zip") -set(OBJECTS_SHA256 "c81029264578706ed1db88665e12a70a583e71dc4d3eb4db262535d2f0589eab") +set(OBJECTS_SHA256 "c8b9d3039a920f67caf15b09e8312cc4f80d59ed7fe0288625b9ccedef606797") set(OPENSFX_VERSION "1.0.6") set(OPENSFX_URL "https://github.com/OpenRCT2/OpenSoundEffects/releases/download/v${OPENSFX_VERSION}/opensound.zip") @@ -82,9 +82,9 @@ set(OPENMSX_VERSION "1.6.1") set(OPENMSX_URL "https://github.com/OpenRCT2/OpenMusic/releases/download/v${OPENMSX_VERSION}/openmusic.zip") set(OPENMSX_SHA256 "994b350d3b180ee1cb9619fe27f7ebae3a1a5232840c4bd47a89f33fa89de1a1") -set(REPLAYS_VERSION "0.0.90") +set(REPLAYS_VERSION "0.0.91") set(REPLAYS_URL "https://github.com/OpenRCT2/replays/releases/download/v${REPLAYS_VERSION}/replays.zip") -set(REPLAYS_SHA256 "f8474a927e155056e5729b6fa9f05af2a85ae7e1435f5fa89ba496242f9f255e") +set(REPLAYS_SHA256 "5b99edc3d8445fcd2cb22c204708247f575d0bdd3128561322e3abf01e977c79") option(FORCE32 "Force 32-bit build. It will add `-m32` to compiler flags.") option(WITH_TESTS "Build tests") @@ -368,7 +368,7 @@ else () set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif () - if (APPLE AND NOT USE_MMAP) + if (HAIKU OR (APPLE AND NOT USE_MMAP)) set(CMAKE_POSITION_INDEPENDENT_CODE OFF) else () set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -560,23 +560,25 @@ if (NOT MACOS_BUNDLE OR (MACOS_BUNDLE AND WITH_TESTS)) endif() install(TARGETS "openrct2-cli" OPTIONAL RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES ${DOC_FILES} DESTINATION "${CMAKE_INSTALL_DOCDIR}") - install(FILES "distribution/linux/io.openrct2.openrct2.appdata.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo") - if (NOT DISABLE_GUI) - install(FILES "resources/logo/icon_x16.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/16x16/apps" RENAME "openrct2.png") - install(FILES "resources/logo/icon_x24.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/24x24/apps" RENAME "openrct2.png") - install(FILES "resources/logo/icon_x32.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/32x32/apps" RENAME "openrct2.png") - install(FILES "resources/logo/icon_x48.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/48x48/apps" RENAME "openrct2.png") - install(FILES "resources/logo/icon_x64.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/64x64/apps" RENAME "openrct2.png") - install(FILES "resources/logo/icon_x96.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/96x96/apps" RENAME "openrct2.png") - install(FILES "resources/logo/icon_x128.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" RENAME "openrct2.png") - install(FILES "resources/logo/icon_x256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "openrct2.png") - install(FILES "resources/logo/icon_flag.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps" RENAME "openrct2.svg") - install(FILES "distribution/linux/io.openrct2.openrct2.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") - install(FILES "distribution/linux/io.openrct2.savegame.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") - install(FILES "distribution/linux/io.openrct2.scenario.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") - install(FILES "distribution/linux/io.openrct2.uri.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") + if (NOT HAIKU) + install(FILES "distribution/linux/io.openrct2.openrct2.appdata.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo") + if (NOT DISABLE_GUI) + install(FILES "resources/logo/icon_x16.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/16x16/apps" RENAME "openrct2.png") + install(FILES "resources/logo/icon_x24.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/24x24/apps" RENAME "openrct2.png") + install(FILES "resources/logo/icon_x32.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/32x32/apps" RENAME "openrct2.png") + install(FILES "resources/logo/icon_x48.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/48x48/apps" RENAME "openrct2.png") + install(FILES "resources/logo/icon_x64.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/64x64/apps" RENAME "openrct2.png") + install(FILES "resources/logo/icon_x96.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/96x96/apps" RENAME "openrct2.png") + install(FILES "resources/logo/icon_x128.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" RENAME "openrct2.png") + install(FILES "resources/logo/icon_x256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "openrct2.png") + install(FILES "resources/logo/icon_flag.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps" RENAME "openrct2.svg") + install(FILES "distribution/linux/io.openrct2.openrct2.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") + install(FILES "distribution/linux/io.openrct2.savegame.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") + install(FILES "distribution/linux/io.openrct2.scenario.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") + install(FILES "distribution/linux/io.openrct2.uri.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") + endif() + install(FILES "distribution/linux/io.openrct2.mimeinfo.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/mime/packages/" RENAME "openrct2.xml") endif() - install(FILES "distribution/linux/io.openrct2.mimeinfo.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/mime/packages/" RENAME "openrct2.xml") install(DIRECTORY "distribution/man/" DESTINATION "${CMAKE_INSTALL_MANDIR}/man6" FILES_MATCHING PATTERN "*.6") if (MACOS_USE_DEPENDENCIES) diff --git a/contributors.md b/contributors.md index 8a6fb4a33e36..e4149d51e3d9 100644 --- a/contributors.md +++ b/contributors.md @@ -7,7 +7,6 @@ Includes all git commit authors. Aliases are GitHub usernames or community nickn * Michał Janiszewski (janisozaur) - Programming * Hielke Morsink (Broxzier) - Programming * Tulio Paschoalin Leao (tupaschoal) - Programming -* Matthias Moninger (ZehMatt) - Programming * Karst van Galen Last (AuraSpecs) - Lead OpenSoundEffects & OpenMusic * Michael Bernardi (mrmbernardi) - Programming * Michael Steenbeek (Gymnasiast) - Lead Localisation - Programming @@ -25,6 +24,7 @@ Includes all git commit authors. Aliases are GitHub usernames or community nickn * Richard Jenkins (rwjuk) * Rik Smeets (rik-smeets) * Olivier Wervers (Oli414) +* Matthias Moninger (ZehMatt) ## Long term contributors Appreciation for long term contributors to the project having provided substantial work. @@ -254,6 +254,8 @@ Appreciation for contributors who have provided substantial work, but are no lon * David Sungaila (sungaila) * Garrett Leach (GarrettLeach) * Ruohao (Jater) Xu (jaterx) +* Marcel Vos (MarcelVos96) +* Jonas Doggart ## Toolchain * (Balletie) - macOS diff --git a/data/language/ar-EG.txt b/data/language/ar-EG.txt index d42744b9901f..3949c3e45a68 100644 --- a/data/language/ar-EG.txt +++ b/data/language/ar-EG.txt @@ -32,12 +32,9 @@ STR_0027 :السيارات المتصادمة STR_0028 :سفينة القراصنة STR_0029 :سفينة متأرجحة عكسية STR_0030 :كشك الطعام -STR_0031 :كشك غير معروف (1D) STR_0032 :كشك الشرب -STR_0033 :كشك غير معروف (1F) STR_0034 :متجر STR_0035 :أفعوانية الخيل -STR_0036 :كشك غير معروف (22) STR_0037 :منصة المعلومات STR_0038 :غرفة الإستراحة STR_0039 :عجلة فيريس @@ -83,16 +80,10 @@ STR_0078 :إفعوانية منعطفه حاده معكوسة STR_0079 :السجادة السحرية STR_0080 :رحلة بالغواصة STR_0081 :طوافات النهر -STR_0082 :رحلة غير معروفة (50) STR_0083 :مغامرة -STR_0084 :رحلة غير معروفة (52) -STR_0085 :رحلة غير معروفة (53) -STR_0086 :رحلة غير معروفة (54) -STR_0087 :رحلة غير معروفة (55) STR_0088 :إفعوانية دافعة معكوسة STR_0089 :إفعوانية دائرية مصغرة STR_0090 :رحلة مصغرة -STR_0091 :رحلة غير معروفة (59) STR_0092 :LIM أفعوانية مُطلقة بواسطة STR_0093 :أفعوانية هجينة STR_0094 :أفعوانية سكة حديدية مفردة diff --git a/data/language/ca-ES.txt b/data/language/ca-ES.txt index 945bf385f3a6..ad23410ca79b 100644 --- a/data/language/ca-ES.txt +++ b/data/language/ca-ES.txt @@ -32,12 +32,9 @@ STR_0027 :Cotxes de xoc STR_0028 :Vaixell amb balanceig STR_0029 :Vaixell amb balanceig i inversió STR_0030 :Estand de menjar -STR_0031 :Estand desconegut (1D) STR_0032 :Estand de begudes -STR_0033 :Estand desconegut (1F) STR_0034 :Tenda STR_0035 :Cavallets -STR_0036 :Estand desconegut (22) STR_0037 :Quiosc d’informació STR_0038 :Lavabos STR_0039 :Roda de fira @@ -83,16 +80,10 @@ STR_0078 :Forquilla invertida STR_0079 :Catifa màgica STR_0080 :Viatge submarí STR_0081 :Barques soleres -STR_0082 :Atracció desconeguda (50) STR_0083 :Enterprise -STR_0084 :Atracció desconeguda (52) -STR_0085 :Atracció desconeguda (53) -STR_0086 :Atracció desconeguda (54) -STR_0087 :Atracció desconeguda (55) STR_0088 :Muntanya russa d’impuls invers STR_0089 :Minimuntanya russa STR_0090 :La mina -STR_0091 :Atracció desconeguda (59) STR_0092 :Muntanya russa d’impuls LIM STR_0093 :Muntanya russa híbrida STR_0094 :Muntanya russa d’un sol rail @@ -567,7 +558,7 @@ STR_1169 :(Cap) STR_1170 :{STRING} STR_1171 :{RED}Tancada STR_1172 :{YELLOW}{STRINGID} -STR_1173 :Construir camins i cues +STR_1173 :Construeix camins i cues STR_1174 :Hi ha un cartell pel mig. STR_1175 :Això no es pot construir a sobre d’un pendent. STR_1176 :Aquest camí aquí no es pot construir… @@ -3845,3 +3836,11 @@ STR_7001 :Nom de l’atracció STR_7002 :{STRINGID} {STRINGID} STR_7003 :El fitxer d’àudio «{STRING}» està truncat. Mostra esperada de {INT32}, però només n’hi ha {INT32}. Considereu reinstal·lar el RCT2. STR_7004 :Força que es torni a dibuixar +STR_7005 :Dibuixa una àrea de camí +STR_7006 :Dibuixa una vora al voltant de les imatges dels botons +STR_7007 :Tipus d’atracció +STR_7008 :Tipus d’atracció desconegut ({INT32}) +STR_7009 :Es reben scripts nous… +STR_7010 :No s’ha pogut iniciar la repetició. El fitxer «{STRING}» no existeix o no és vàlid. +STR_7011 :No s’ha pogut iniciar la repetició. +STR_7012 :Złoty polonès (PLN) diff --git a/data/language/cs-CZ.txt b/data/language/cs-CZ.txt index 20a55de9ba95..9459f71a5506 100644 --- a/data/language/cs-CZ.txt +++ b/data/language/cs-CZ.txt @@ -32,12 +32,9 @@ STR_0027 :Autodrom STR_0028 :Pirátská loď STR_0029 :Houpající se obrácená loď STR_0030 :Stánek s jídlem -STR_0031 :Neznámý obchod (1D) STR_0032 :Stánek s pitím -STR_0033 :Neznámý obchod (1F) STR_0034 :Obchod STR_0035 :Kolotoč -STR_0036 :Neznámý obchod (22) STR_0037 :Informační kiosek STR_0038 :Toalety STR_0039 :Ruské kolo @@ -83,16 +80,10 @@ STR_0078 :Ostrá zavěšená horská dráha STR_0079 :Kouzelný koberec STR_0080 :Podmořská jízda STR_0081 :Říční vory -STR_0082 :Neznámá atrakce (50) STR_0083 :Loď Enterprise -STR_0084 :Neznámá atrakce (52) -STR_0085 :Neznámá atrakce (53) -STR_0086 :Neznámá atrakce (54) -STR_0087 :Neznámá atrakce (55) STR_0088 :Otočená impulsní dráha STR_0089 :Malá horská dráha STR_0090 :Mini dráha -STR_0091 :Neznámá atrakce (59) STR_0092 :LIM horská dráha STR_0093 :Hybridní horská dráha STR_0094 :Jednokolejná horská dráha @@ -3846,4 +3837,5 @@ STR_7003 :Zvukový soubor ‘{STRING}’ je zkrácený. Očekáván sample {I STR_7004 :Vynutit překresl. (force redraw) STR_7005 :Stavět cesty v oblasti označené tažením STR_7006 :Vykreslit okraje tlačítek s obrázky -STR_7007 :Typ atrakce \ No newline at end of file +STR_7007 :Typ atrakce +STR_7008 :Neznámá atrakce ({INT32}) \ No newline at end of file diff --git a/data/language/da-DK.txt b/data/language/da-DK.txt index 5183b13c5dbb..920523f90b64 100644 --- a/data/language/da-DK.txt +++ b/data/language/da-DK.txt @@ -32,12 +32,9 @@ STR_0027 :Radiobiler STR_0028 :Svingende Skib STR_0029 :Svingende Inverteret Skib STR_0030 :Madbod -STR_0031 :Ukendt Bod (1D) STR_0032 :Drikkebod -STR_0033 :Ukendt Bod (1F) STR_0034 :Butik STR_0035 :Karrusel -STR_0036 :Ukendt Bod (22) STR_0037 :Informations Kiosk STR_0038 :Toiletter STR_0039 :Pariserhjul @@ -83,16 +80,10 @@ STR_0078 :Inverteret Hårnåls Rutschebane STR_0079 :Flyvende Tæppe STR_0080 :Ubåds Forlystelse STR_0081 :River Rafts -STR_0082 :Ukendt Forlystelse (50) STR_0083 :Enterprise -STR_0084 :Ukendt Forlystelse (52) -STR_0085 :Ukendt Forlystelse (53) -STR_0086 :Ukendt Forlystelse (54) -STR_0087 :Ukendt Forlystelse (55) STR_0088 :Inverteret Impuls Rutschebane STR_0089 :Mini Rutschebane STR_0090 :Mine Forlystelse -STR_0091 :Ukendt Forlystelse (59) STR_0092 :LIM Accelereret Rutschebane STR_0093 :Hybrid Rutschebane STR_0094 :Enkelt skinde rutchebane diff --git a/data/language/de-DE.txt b/data/language/de-DE.txt index 3ca5780fe4b5..aae868b05be0 100644 --- a/data/language/de-DE.txt +++ b/data/language/de-DE.txt @@ -32,12 +32,9 @@ STR_0027 :Autoscooter STR_0028 :Piratenschiff STR_0029 :Schwingendes Überkopfschiff STR_0030 :Imbissstand -STR_0031 :Unbekannter Stand (1D) STR_0032 :Getränkestand -STR_0033 :Unbekannter Stand (1F) STR_0034 :Stand STR_0035 :Karussell -STR_0036 :Stand STR_0037 :Kiosk STR_0038 :Toiletten STR_0039 :Riesenrad @@ -83,16 +80,10 @@ STR_0078 :Umgekehrte Haarnadelbahn STR_0079 :Fliegender Teppich STR_0080 :U-Boot-Fahrt STR_0081 :Floße -STR_0082 :Unbekannte Bahn (50) STR_0083 :Enterprise -STR_0084 :Unbekannte Bahn (52) -STR_0085 :Unbekannte Bahn (53) -STR_0086 :Unbekannte Bahn (54) -STR_0087 :Unbekannte Bahn (55) STR_0088 :Umgekehrte Impuls-Bahn STR_0089 :Miniachterbahn STR_0090 :Minenbahn -STR_0091 :Unbekannte Bahn (59) STR_0092 :LIM-Achterbahn STR_0093 :Hybridachterbahn STR_0094 :Einschienenachterbahn @@ -3836,3 +3827,8 @@ STR_7000 :oder STR_7001 :Fahrgeschäftsname STR_7002 :{STRINGID} {STRINGID} STR_7003 :Die Audiodatei „{STRING}“ ist abgeschnitten. Sample {INT32} erwartet, es sind aber nur {INT32} verfügbar. Ziehen Sie eine Neuinstallation von RCT2 in Betracht. +STR_7004 :Erzwinge Neuzeichnung +STR_7005 :Baue eine Fläche aus Fußwegen +STR_7006 :Zeichne Ränder um Bildknöpfe +STR_7007 :Achterbahntyp +STR_7008 :Unbekannter Fahrgeschäftstyp ({INT32}) diff --git a/data/language/eo-ZZ.txt b/data/language/eo-ZZ.txt index 97fa1d380a5d..662fde46aeeb 100644 --- a/data/language/eo-ZZ.txt +++ b/data/language/eo-ZZ.txt @@ -32,12 +32,9 @@ STR_0027 :Doĝemoj STR_0028 :Svingiĝanta Ŝipo STR_0029 :Svingiĝanta Inversiĝanta Ŝipo STR_0030 :Manĝaĵbudo -STR_0031 :Nekonata Budo (1D) STR_0032 :Trinkaĵbudo -STR_0033 :Nekonata Budo (1F) STR_0034 :Vendejo STR_0035 :Karuselo -STR_0036 :Nekonata Budo (22) STR_0037 :Informokiosko STR_0038 :Necesejo STR_0039 :Spektoradego @@ -83,16 +80,10 @@ STR_0078 :Inversigita Onda Fervojo kun Harpingloformaj Kurboj STR_0079 :Magia Tapiŝo STR_0080 :Submarŝiprajdo STR_0081 :Riverflosoj -STR_0082 :Nekonata Atrakcio (50) STR_0083 :Centrifugilo -STR_0084 :Nekonata Atrakcio (52) -STR_0085 :Nekonata Atrakcio (53) -STR_0086 :Nekonata Atrakcio (54) -STR_0087 :Nekonata Atrakcio (55) STR_0088 :Inversigita Lanĉita Onda Fervojo STR_0089 :Miniatura Onda Fervojo STR_0090 :Minrajdo -STR_0091 :Nekonata Atrakcio (59) STR_0092 :Onda Fervojo Lanĉita per Linearaj Induktaj Motoroj STR_0093 :Hibrida Onda Fervojo STR_0094 :Onda Fervojo kun Unuopa Relo @@ -3842,3 +3833,9 @@ STR_7003 :Sondosiero ‘{STRING}’ estas distranĉita. Atendis sonpecon {INT STR_7004 :Devigi redesegnon STR_7005 :Treni areon de trotuaro STR_7006 :Desegni borderon ĉirkaŭ bildo-butonoj +STR_7007 :Atrakciotipo +STR_7008 :Nekonata atrakciotipo ({INT32}) +STR_7009 :Ricevas skriptojn… +STR_7010 :Ne povas komenci reludigon, la dosiero ‘{STRING}’ ne ekzistas aŭ ne validas +STR_7011 :Ne povas komenci reludigon +STR_7012 :Pola zloto (PLN) diff --git a/data/language/es-ES.txt b/data/language/es-ES.txt index bb9733443852..4818e88f7bf7 100644 --- a/data/language/es-ES.txt +++ b/data/language/es-ES.txt @@ -32,12 +32,9 @@ STR_0027 :Coches de Choque STR_0028 :Barco Pirata STR_0029 :Barco Balancín Invertido STR_0030 :Puesto de comida -STR_0031 :Puesto Desconocido (1D) STR_0032 :Puesto de Bebidas -STR_0033 :Puesto Desconocido (1F) STR_0034 :Tienda STR_0035 :Tiovivo -STR_0036 :Puesto Desconocido (22) STR_0037 :Quiosco de Información STR_0038 :Baños STR_0039 :Rueda Gigante @@ -83,16 +80,10 @@ STR_0078 :Horquilla invertida STR_0079 :Alfombra Mágica STR_0080 :Viaje Submarino STR_0081 :Balsas de Río -STR_0082 :Atracc. Desconocida (50) STR_0083 :Enterprise -STR_0084 :Atracc. Desconocida (52) -STR_0085 :Atracc. Desconocida (53) -STR_0086 :Atracc. Desconocida (54) -STR_0087 :Atracc. Desconocida (55) STR_0088 :Montaña Rusa Impulso Inverso STR_0089 :Mini Montaña Rusa STR_0090 :Trenes Mineros -STR_0091 :Atracc. Desconocida (59) STR_0092 :Montaña Rusa acelerada por LIM STR_0093 :Montaña Rusa Híbrida STR_0094 :Montaña Rusa de un solo carril diff --git a/data/language/fi-FI.txt b/data/language/fi-FI.txt index daa597ce7698..b8e1c9491e36 100644 --- a/data/language/fi-FI.txt +++ b/data/language/fi-FI.txt @@ -32,12 +32,9 @@ STR_0027 :Törmäilyautot STR_0028 :Merirosvolaiva STR_0029 :Kieppuva merirosvolaiva STR_0030 :Ruokakoju -STR_0031 :Tuntematon koju (1D) STR_0032 :Juomakoju -STR_0033 :Tuntematon koju (1F) STR_0034 :Kauppa STR_0035 :Karuselli -STR_0036 :Tuntematon koju (22) STR_0037 :Infokioski STR_0038 :Vessa STR_0039 :Maailmanpyörä @@ -83,17 +80,11 @@ STR_0078 :Käänteinen hiusneularata STR_0079 :Taikamatto STR_0080 :Sukellusveneajelu STR_0081 :Jokilautat -STR_0082 :Tuntematon laite (50) # 0083 is a name, and can't be translated. The ride itself was named after USS Enterprise from star trek, see wikipedia. STR_0083 :Enterprise -STR_0084 :Tuntematon laite (52) -STR_0085 :Tuntematon laite (53) -STR_0086 :Tuntematon laite (54) -STR_0087 :Tuntematon laite (55) STR_0088 :Käänteinen impulssirata STR_0089 :Minivuoristorata STR_0090 :Kaivosajelu -STR_0091 :Tuntematon laite (59) STR_0092 :Laukaisuvuoristorata STR_0093 :Hybridivuoristorata STR_0094 :Yksikiskoinen vuoristorata diff --git a/data/language/fr-FR.txt b/data/language/fr-FR.txt index 7b0292da80ca..c889b511c9a7 100644 --- a/data/language/fr-FR.txt +++ b/data/language/fr-FR.txt @@ -34,12 +34,9 @@ STR_0027 :Autos tamponneuses STR_0028 :Bateau pirate STR_0029 :Bateau renverseur STR_0030 :Stand de nourriture -STR_0031 :Stand inconnu (1D) STR_0032 :Stand de boissons -STR_0033 :Stand inconnu (1F) STR_0034 :Boutique STR_0035 :Carrousel -STR_0036 :Stand inconnu (22) STR_0037 :Kiosque d’information STR_0038 :Toilettes STR_0039 :Grande roue @@ -85,16 +82,10 @@ STR_0078 :Epingle à cheveux inversée STR_0079 :Tapis volant STR_0080 :Balade sous-marine STR_0081 :Radeau -STR_0082 :Manège Inconnu (50) STR_0083 :Entreprise -STR_0084 :Manège Inconnu (52) -STR_0085 :Manège Inconnu (53) -STR_0086 :Manège Inconnu (54) -STR_0087 :Manège Inconnu (55) STR_0088 :Impulsion inversée STR_0089 :Mini-montagnes russes 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 @@ -3848,3 +3839,9 @@ STR_7003 :Le fichier audio « {STRING} » est tronqué. L’échantillon {I STR_7004 :Forcer le rendu STR_7005 :Remplir de chemin une zone STR_7006 :Dessiner une bordure autour des boutons-images +STR_7007 :Type d’attraction +STR_7008 :Type d’attraction inconnu ({INT32}) +STR_7012 :Złoty polonais (PLN) +STR_7009 :Réception des scripts… +STR_7010 :Impossible de jouer l’enregistrement, le fichier {SMALLFONT}{STRING}{MEDIUMFONT} n’existe pas ou est invalide +STR_7011 :Impossible de jouer l’enregistrement diff --git a/data/language/gl-ES.txt b/data/language/gl-ES.txt index 561bb8bf39c7..ff329b74d7e7 100644 --- a/data/language/gl-ES.txt +++ b/data/language/gl-ES.txt @@ -32,12 +32,9 @@ STR_0027 :Coches de choque STR_0028 :Barco pirata STR_0029 :Barco basculante invertido STR_0030 :posto de comida -STR_0031 :Posto descoñecido (1D) STR_0032 :Posto de bebidas -STR_0033 :Posto descoñecido (1F) STR_0034 :Tenda STR_0035 :Carrusel -STR_0036 :Posto descoñecido (22) STR_0037 :Quiosco de información STR_0038 :Aseos STR_0039 :Nora @@ -83,16 +80,10 @@ STR_0078 :Montaña Rusa de Prendedor invertido STR_0079 :Alfombra máxica STR_0080 :Viaxe submarina STR_0081 :Balsas fluviais -STR_0082 :Atracción Descoñecida (50) STR_0083 :Enterprise -STR_0084 :Atracción Descoñecida (52) -STR_0085 :Atracción Descoñecida (53) -STR_0086 :Atracción Descoñecida (54) -STR_0087 :Atracción Descoñecida (55) STR_0088 :Montaña rusa de impulso inverso STR_0089 :Mini montaña rusa STR_0090 :Atracción da mina -STR_0091 :Atracción Descoñecida (59) STR_0092 :Montaña Rusa Lanzada por MIL STR_0093 :Montaña Rusa Híbrida STR_0094 :Montaña rusa dun só raíl @@ -3842,3 +3833,5 @@ STR_7003 :O ficheiro de son ‘{STRING}’ está incompleto. Agardabase {INT3 STR_7004 :Forzar redeseño STR_7005 :Arrastra unha área de camiño STR_7006 :Debuxa un bordo arredor dos botóns de imaxe +STR_7007 :Tipo de atracción +STR_7008 :Tipo de atracción descoñecida ({INT32}) diff --git a/data/language/hu-HU.txt b/data/language/hu-HU.txt index 5608e22260bc..291399acfa5d 100644 --- a/data/language/hu-HU.txt +++ b/data/language/hu-HU.txt @@ -32,12 +32,9 @@ STR_0027 :Dodzsem STR_0028 :Hajóhinta STR_0029 :Fejreálló hajóhinta STR_0030 :Ételes bódé -STR_0031 :Ismeretlen bódé (1D) STR_0032 :Italos bódé -STR_0033 :Ismeretlen bódé (1F) STR_0034 :Bolt STR_0035 :Körhinta -STR_0036 :Ismeretlen bódé (22) STR_0037 :Információs bódé STR_0038 :WC STR_0039 :Óriáskerék @@ -83,16 +80,10 @@ STR_0078 :Fordított hajtű hullámvasút STR_0079 :Varázsszőnyeg STR_0080 :Tengeralattjáró-játék STR_0081 :Folyami tutajok -STR_0082 :Ismeretlen játék (50) STR_0083 :Enterprise -STR_0084 :Ismeretlen játék (52) -STR_0085 :Ismeretlen játék (53) -STR_0086 :Ismeretlen játék (54) -STR_0087 :Ismeretlen játék (55) STR_0088 :Fordított impulzus hullámvasút STR_0089 :Mini hullámvasút STR_0090 :Bányavasút -STR_0091 :Ismeretlen játék (59) STR_0092 :Aszinkronmotoros hullámvasút STR_0093 :Hibrid hullámvasút STR_0094 :Egysínű hullámvasút @@ -3843,3 +3834,8 @@ STR_7004 :Újrarajzolás kényszerítése STR_7005 :Útterület építése húzással STR_7006 :Keret rajzolása a képgombok köré STR_7007 :Játéktípus +STR_7008 :Ismeretlen játéktípus ({INT32}) +STR_7009 :Szkriptek fogadása… +STR_7010 :Nem sikerült elindítani a visszajátszást, „{STRING}” fájl nem létezik vagy érvénytelen +STR_7011 :Nem sikerült elindítani a visszajátszást +STR_7012 :Lengyel złoty (PLN) diff --git a/data/language/it-IT.txt b/data/language/it-IT.txt index 3f90ee919d68..d8a9985cea74 100644 --- a/data/language/it-IT.txt +++ b/data/language/it-IT.txt @@ -32,12 +32,9 @@ STR_0027 :Autoscontri STR_0028 :Nave dei pirati STR_0029 :Nave oscillante invertita STR_0030 :Chiosco del cibo -STR_0031 :Chiosco sconosciuto (1D) STR_0032 :Chiosco delle bibite -STR_0033 :Chiosco sconosciuto (1F) STR_0034 :Chiosco STR_0035 :Giostra -STR_0036 :Chiosco sconosciuto (22) STR_0037 :Chiosco STR_0038 :Servizi igienici STR_0039 :Ruota panoramica @@ -83,16 +80,10 @@ STR_0078 :Ottovolante sottile invertito STR_0079 :Tappeto magico STR_0080 :Corsa sottomarina STR_0081 :River Rafts -STR_0082 :Attrazione sconosciuta (50) STR_0083 :Enterprise -STR_0084 :Attrazione sconosciuta (52) -STR_0085 :Attrazione sconosciuta (53) -STR_0086 :Attrazione sconosciuta (54) -STR_0087 :Attrazione sconosciuta (55) STR_0088 :Ottovolante invertito a impulso STR_0089 :Mini-ottovolante STR_0090 :Corsa nella miniera -STR_0091 :Attrazione sconosciuta (59) STR_0092 :Ottovolante a lancio MIL STR_0093 :Ottovolante ibrido STR_0094 :Ottovolante a binario singolo diff --git a/data/language/ja-JP.txt b/data/language/ja-JP.txt index f3c7cfd3c45f..7b8282665e42 100644 --- a/data/language/ja-JP.txt +++ b/data/language/ja-JP.txt @@ -32,12 +32,9 @@ STR_0027 :バンパーカー STR_0028 :パイレーツシップ STR_0029 :スイング・インバータ・シップ STR_0030 :食べ物の店 -STR_0031 :Unknown Stall (1D) STR_0032 :飲料の店 -STR_0033 :Unknown Stall (1F) STR_0034 :ショップ STR_0035 :メリーゴーラウンド -STR_0036 :Unknown Stall (22) STR_0037 :インフォーメーションセンター STR_0038 :トイレ STR_0039 :観覧車 @@ -83,16 +80,10 @@ STR_0078 :インバーテッドヘアピンコースター STR_0079 :空飛ぶじゅうたん STR_0080 :潜水艦ライド STR_0081 :川いかだ -STR_0082 :Unknown Ride (50) STR_0083 :エンタープライズ -STR_0084 :Unknown Ride (52) -STR_0085 :Unknown Ride (53) -STR_0086 :Unknown Ride (54) -STR_0087 :Unknown Ride (55) STR_0088 :インバーテッドインパルスコースター STR_0089 :ミニジェットコースター STR_0090 :鉱山ライド -STR_0091 :Unknown Ride (59) STR_0092 :リニアモーターコースター STR_0093 :ハイブリッドコースター STR_0094 :シングルレール・ジェットコースター diff --git a/data/language/ko-KR.txt b/data/language/ko-KR.txt index f20d6df97401..69dfc1368f32 100644 --- a/data/language/ko-KR.txt +++ b/data/language/ko-KR.txt @@ -32,12 +32,9 @@ STR_0027 :범퍼카 STR_0028 :바이킹 STR_0029 :360도 바이킹 STR_0030 :음식 상점 -STR_0031 :알 수 없는 상점 (1D) STR_0032 :음료수 상점 -STR_0033 :알 수 없는 상점 (1F) STR_0034 :상점 STR_0035 :회전목마 -STR_0036 :알 수 없는 상점 (22) STR_0037 :안내소 STR_0038 :화장실 STR_0039 :관람차 @@ -83,16 +80,10 @@ STR_0078 :인버티드 헤어핀 코스터 STR_0079 :마법의 양탄자 STR_0080 :서브마린 라이드 STR_0081 :리버 래프트 -STR_0082 :알 수 없는 놀이기구 (50) STR_0083 :엔터프라이즈 -STR_0084 :알 수 없는 놀이기구 (52) -STR_0085 :알 수 없는 놀이기구 (53) -STR_0086 :알 수 없는 놀이기구 (54) -STR_0087 :알 수 없는 놀이기구 (55) STR_0088 :인버티드 임펄스 코스터 STR_0089 :미니 롤러코스터 STR_0090 :마인 라이드 -STR_0091 :알 수 없는 놀이기구 (59) STR_0092 :LIM 발진 롤러코스터 STR_0093 :하이브리드 코스터 STR_0094 :모노레일 롤러코스터 @@ -3846,3 +3837,8 @@ STR_7004 :강제 화면 갱신 STR_7005 :드래그로 보도 건설 STR_7006 :버튼 주위에 경계선 표시 STR_7007 :놀이기구 종류 +STR_7008 :알 수 없는 놀이기구 종류 ({INT32}) +STR_7009 :스크립트 받는 중… +STR_7010 :리플레이를 시작할 수 없습니다, ‘{STRING}’ 파일이 존재하지 않거나 유효하지 않습니다 +STR_7011 :리플레이를 시작할 수 없습니다 +STR_7012 :폴란드 즐로티 (PLN) diff --git a/data/language/nb-NO.txt b/data/language/nb-NO.txt index 670d5005677f..18af19196354 100644 --- a/data/language/nb-NO.txt +++ b/data/language/nb-NO.txt @@ -32,12 +32,9 @@ STR_0027 :Radiobiler STR_0028 :Piratskip STR_0029 :Roterende skip STR_0030 :Matbod -STR_0031 :Ukjent bod (1D) STR_0032 :Drikkebod -STR_0033 :Ukjent bod (1F) STR_0034 :Bod STR_0035 :Karusell -STR_0036 :Ukjent bod (22) STR_0037 :Informasjonskiosk STR_0038 :Toaletter STR_0039 :Pariserhjul @@ -83,16 +80,10 @@ STR_0078 :Invertert hårnålsbane STR_0079 :Flyvende teppe STR_0080 :Ubåtbane STR_0081 :Elveflåter -STR_0082 :Ukjent attraksjon (50) STR_0083 :Enterprise -STR_0084 :Ukjent attraksjon (52) -STR_0085 :Ukjent attraksjon (53) -STR_0086 :Ukjent attraksjon (54) -STR_0087 :Ukjent attraksjon (55) STR_0088 :Invertert impulsbane STR_0089 :Miniberg-og-dal-bane STR_0090 :Gruvebane -STR_0091 :Ukjent attraksjon (59) STR_0092 :LIM-berg-og-dal-bane STR_0093 :Hybrid berg-og-dal-bane STR_0094 :Enkeltspor berg-og-dal-bane diff --git a/data/language/nl-NL.txt b/data/language/nl-NL.txt index c68013fec49a..551b0ea45f59 100644 --- a/data/language/nl-NL.txt +++ b/data/language/nl-NL.txt @@ -29,12 +29,9 @@ STR_0027 :Botsauto’s STR_0028 :Schommelschip STR_0029 :Loopingschip STR_0030 :Eetkraam -STR_0031 :Onbekende kraam (1D) STR_0032 :Drankkraam -STR_0033 :Onbekende kraam (1F) STR_0034 :Winkel STR_0035 :Draaimolen -STR_0036 :Onbekende kraam (22) STR_0037 :Informatiekiosk STR_0038 :Toilet STR_0039 :Reuzenrad @@ -80,16 +77,10 @@ STR_0078 :Omgekeerde haarspeldachtbaan STR_0079 :Vliegend tapijt STR_0080 :Onderzeeër-attractie STR_0081 :Riviertocht -STR_0082 :Onbekende attractie (50) STR_0083 :Enterprise -STR_0084 :Onbekende attractie (52) -STR_0085 :Onbekende attractie (53) -STR_0086 :Onbekende attractie (54) -STR_0087 :Onbekende attractie (55) STR_0088 :Omgekeerde Impulse-achtbaan STR_0089 :Mini-achtbaan STR_0090 :Aangedreven mijntrein -STR_0091 :Onbekende attractie (59) STR_0092 :LIM-lanceringsachtbaan STR_0093 :Hybride achtbaan STR_0094 :Achtbaan met enkele rail @@ -3435,7 +3426,7 @@ STR_6396 :Schermbeveiliging en -energiebesparing uitschakelen STR_6397 :Als dit is ingeschakeld, zal (zolang OpenRCT2 loopt) de schermbeveiliging niet worden ingeschakeld en gaat het scherm ook niet na verloop van tijd op zwart. STR_6398 :Bestand bevat niet-ondersteunde attractietypes. Update naar een nieuwere versie van OpenRCT2 om dit bestand te openen. STR_6399 :OpenRCT2 heeft bestanden van een RollerCoaster Tycoon 2-installatie nodig. Voer het pad naar de map waar de bestanden van RollerCoaster Tycoon 2 zich bevinden in bij de variabele “game_path” in config.ini. Start daarna OpenRCT2 opnieuw op. -STR_6400 :Ik heb offline GOG-installer voor RollerCoaster Tycoon 2 gedownload, maar nog niet geïnstalleerd +STR_6400 :Ik heb de offline GOG-installer voor RollerCoaster Tycoon 2 gedownload, maar nog niet geïnstalleerd STR_6401 :Ik heb RollerCoaster Tycoon 2 al geïnstalleerd STR_6402 :OpenRCT2-data instellen STR_6403 :Selecteer de optie die op je situatie van toepassing is: @@ -3840,3 +3831,10 @@ STR_7002 :{STRINGID} {STRINGID} STR_7003 :Audiobestand ‘{STRING}’ is beschadigd. Sample nr. {INT32} kon niet worden geladen, aangezien er maar {INT32} beschikbaar zijn. Installeer RollerCoaster Tycoon 2 opnieuw. STR_7004 :Volledig beeld hertekenen STR_7005 :Voetpaden aanleggen door te slepen +STR_7006 :Rand tekenen om knoppen met alleen een plaatje +STR_7007 :Attractietype +STR_7008 :Onbekend attractietype ({INT32}) +STR_7009 :Scripts ophalen… +STR_7010 :Kon de replay niet starten, bestand ‘{STRING}’ bestaat niet of is ongeldig. +STR_7011 :Kon de replay niet starten. +STR_7012 :Poolse Złoty (PLN) diff --git a/data/language/pl-PL.txt b/data/language/pl-PL.txt index 03c72fa9533a..6477d7b413a1 100644 --- a/data/language/pl-PL.txt +++ b/data/language/pl-PL.txt @@ -32,12 +32,9 @@ STR_0027 :Unikajki STR_0028 :Okręt piracki STR_0029 :Morska huśtawka STR_0030 :Budka z jedzeniem -STR_0031 :Nieznane stoisko (1D) STR_0032 :Budka z napojami -STR_0033 :Nieznane stoisko (1F) STR_0034 :Stoisko STR_0035 :Karuzela obrotowa -STR_0036 :Nieznane stoisko (22) STR_0037 :Punkt informacyjny STR_0038 :Toalety STR_0039 :Diabelski młyn @@ -83,16 +80,10 @@ STR_0078 :Kolejka serpentynowa STR_0079 :Latający dywan STR_0080 :Podwodna podróż STR_0081 :Tratwy rzeczne -STR_0082 :Nieznana atrakcja (50) STR_0083 :Krynolina -STR_0084 :Nieznana atrakcja (52) -STR_0085 :Nieznana atrakcja (53) -STR_0086 :Nieznana atrakcja (54) -STR_0087 :Nieznana atrakcja (55) STR_0088 :Kolejka zwrotna STR_0089 :Minikolejka STR_0090 :Przejażdżka kopalniana -STR_0091 :Nieznana atrakcja (59) STR_0092 :Kolejka z napędem indukcyjnym liniowym STR_0093 :Kolejka hybrydowa STR_0094 :Kolejka jednoszynowa @@ -1071,7 +1062,7 @@ STR_1676 :Ustaw limit prędkości hamowania STR_1677 :{WINDOW_COLOUR_2}Popularność: {BLACK}Nieznana STR_1678 :{WINDOW_COLOUR_2}Popularność: {BLACK}{COMMA16}% STR_1679 :Spirala w górę (lewo) -STR_1680 :Spirala w dół (prawo) +STR_1680 :Spirala w górę (prawo) STR_1681 :Spirala w dół (lewo) STR_1682 :Spirala w dół (prawo) STR_1683 :Wymiary bazowe 2 × 2 @@ -3090,7 +3081,7 @@ STR_5998 :Dodaj pieniądze STR_5999 :Ustaw pieniądze STR_6000 :Wprowadź nową wartość: STR_6001 :Włącz efekty świetlne (eksperymentalne) -STR_6002 :Lampy i atrakcje będą świeciły w nocy.{NEWLINE}Wymaga włączenia silnika sprzętowego. +STR_6002 :Lampy i atrakcje będą świeciły w nocy.{NEWLINE}Wymaga włączenia renderowania sprzętowego. STR_6003 :Widok przekroju STR_6004 :Widok przekroju STR_6005 :Włącz widok przekroju @@ -3778,3 +3769,73 @@ STR_6739 :{WINDOW_COLOUR_2}Data: {BLACK}{STRINGID} STR_6740 :{WINDOW_COLOUR_2}Gotówka: {BLACK}{CURRENCY2DP} STR_6741 :{WINDOW_COLOUR_2}Liczba atrakcji: {BLACK}{UINT16} STR_6742 :{WINDOW_COLOUR_2}Liczba gości: {BLACK}{UINT16} +STR_6743 :Klimat +STR_6744 :{WINDOW_COLOUR_2}{UINT16}% +STR_6745 :{WINDOW_COLOUR_2}Preferencje intensywności gości: +STR_6746 :Brak preferencji +STR_6747 :Różne preferencje (domyślne) +STR_6748 :Tylko mniej intensywne przejażdżki +STR_6749 :Tylko bardziej intensywne przejażdżki +STR_6750 :Wybierz preferencje nowych gości dot. intensywności przejażdżek. +STR_6751 :Zakolejkowane ścieżki nie mogą być na przejeździe kolejowym! +STR_6752 :Opcje scenariusza - Cele +STR_6753 :Opcje scenariusza - Szczegóły scenariusza +STR_6754 :Opcje scenariusza - Ograniczenia terenu +STR_6755 :Pokaż opcje celów +STR_6756 :Pokaż opcje szczegółów scenariusza +STR_6757 :Pokaż opcje ograniczenia terenu +STR_6758 :Opcje pożyczki +STR_6759 :Model biznesowy +STR_6760 :Zarobki: +STR_6761 :Szczegóły scenariusza +STR_6762 :Interfejs +STR_6763 :RollerCoaster Tycoon 1 +STR_6764 :Zapisywanie i auto. zapisy +STR_6765 :Zaawansowane +STR_6766 :Wyczyść +STR_6767 :Okno +STR_6768 :Renderowanie +STR_6769 :Zachowanie +STR_6770 :Limit klatek/sek.: +STR_6771 :Prędkość wewnętrzna (domyślne) +STR_6772 :Synchronizacja pionowa +STR_6773 :Nielimitowane +STR_6774 :Czas od ostatniej inspekcji +STR_6775 :{COMMA16} minuta +STR_6776 :{COMMA16} minuty +STR_6777 :więcej niż 4 godziny +STR_6778 :Podgląd scenariuszy poprzez: +STR_6779 :Wybierz rodzaj obrazka podglądowego, który będzie używany na ekranie wyboru scenariusza. +STR_6780 :Miniatury map +STR_6781 :Zrzuty ekranu +STR_6782 :Powiadomienia parku +STR_6783 :Powiadomienia przejażdżki +STR_6784 :Powiadomienia gości +STR_6785 :Kontroler +STR_6786 :Martwa strefa: +STR_6787 :Martwa strefa gałki analogowej (minimalny wymagany ruch gałką) +STR_6788 :Czułość: +STR_6789 :Mnożnik czułości gałki analogowej +STR_6790 :Martwa strefa: {COMMA32}% +STR_6791 :Czułość: {COMMA32}% +STR_6792 :Budynki wejściowe +STR_6793 :Goście i pracownicy +STR_6794 :Scenerie i style +STR_6795 :{MOVE_X}{10}{STRINGID} +STR_6796 :•{MOVE_X}{10}{STRINGID} +STR_6797 :Brak podglądu +STR_6798 :Zrzut ekranu +STR_6799 :Miniatura mapy +STR_7000 :lub +STR_7001 :Nazwa przejażdżki +STR_7002 :{STRINGID} {STRINGID} +STR_7003 :Plik audio ‘{STRING}’ jest wybrakowany. Oczekiwano próbki {INT32}, ale jedynie {INT32} jest dostępna. Rozważ przeinstalowanie RCT2. +STR_7004 :Wymuś przerysowanie +STR_7005 :Przeciągnij obszar chodnika +STR_7006 :Rysuj ramkę wokół przycisków +STR_7007 :Rodzaj przejażdżki +STR_7008 :Nieznany rodzaj przejażdżki ({INT32}) +STR_7009 :Otrzymywanie skryptów… +STR_7010 :Nie udało się uruchomić powtórki, plik ‘{STRING}’ nie istnieje lub jest nieprawidłowy +STR_7011 :Nie udało się uruchomić powtórki +STR_7012 :Polski Złoty (zł) diff --git a/data/language/pt-BR.txt b/data/language/pt-BR.txt index 2ece325a8c99..9001150040cf 100644 --- a/data/language/pt-BR.txt +++ b/data/language/pt-BR.txt @@ -32,12 +32,9 @@ STR_0027 :Carrinho de Bate-Bate STR_0028 :Barco Viking STR_0029 :Navio de Balanço Reverso STR_0030 :Barraca de Comida -STR_0031 :Barraca Desconhecida (1D) STR_0032 :Barraca de Bebida -STR_0033 :Barraca Desconhecida (1F) STR_0034 :Loja STR_0035 :Carrossel -STR_0036 :Barraca Desconhecida (22) STR_0037 :Quiosque de Informações STR_0038 :Banheiros STR_0039 :Roda Gigante @@ -83,16 +80,10 @@ STR_0078 :Montanha Fechada Invertida STR_0079 :Tapete Mágico STR_0080 :Submarino STR_0081 :Balsas de rio -STR_0082 :Brinquedo Desconhecido (50) STR_0083 :Enterprise -STR_0084 :Brinquedo Desconhecido (52) -STR_0085 :Brinquedo Desconhecido (53) -STR_0086 :Brinquedo Desconhecido (54) -STR_0087 :Brinquedo Desconhecido (55) STR_0088 :Montanha de Impulso Invertida STR_0089 :Minimontanha-Russa STR_0090 :Brinquedo de Mina -STR_0091 :Brinquedo Desconhecido (59) STR_0092 :Montanha-Russa de Indução Linear STR_0093 :Montanha-Russa Híbrida STR_0094 :Montanha-Russa de Trilho Único @@ -3843,3 +3834,8 @@ STR_7004 :Forçar Redesenho STR_7005 :Arrastar uma área de calçada STR_7006 :Desenhar borda ao redor dos botões com imagens STR_7007 :Tipo de Atração +STR_7008 :Tipo de atração desconhecido ({INT32}) +STR_7009 :Recebendo scripts… +STR_7010 :Não foi possível iniciar o replay, o arquivo ‘{STRING}’ não existe ou é inválido +STR_7011 :Não foi possível iniciar o replay +STR_7012 :Złoty polonês (PLN) diff --git a/data/language/ru-RU.txt b/data/language/ru-RU.txt index 49d5ddcd5362..f0fc80cf5223 100644 --- a/data/language/ru-RU.txt +++ b/data/language/ru-RU.txt @@ -32,12 +32,9 @@ STR_0027 :Автодром STR_0028 :Пиратский корабль STR_0029 :Раскачивающийся инвертированный корабль STR_0030 :Киоск с едой -STR_0031 :Неизвестный киоск (1D) STR_0032 :Киоск с питьём -STR_0033 :Неизвестный киоск (1F) STR_0034 :Магазинчик STR_0035 :Карусель -STR_0036 :Неизвестный киоск (22) STR_0037 :Информационный стенд STR_0038 :Туалеты STR_0039 :Колесо обозрения @@ -83,16 +80,10 @@ STR_0078 :Горки «Обратная шпилька» STR_0079 :Ковёр-самолёт STR_0080 :Заплыв на подводной лодке STR_0081 :Речной рафтинг -STR_0082 :Неизвестный аттракцион (50) STR_0083 :Центрифуга -STR_0084 :Неизвестный аттракцион (52) -STR_0085 :Неизвестный аттракцион (53) -STR_0086 :Неизвестный аттракцион (54) -STR_0087 :Неизвестный аттракцион (55) STR_0088 :Инвертированные импульсные горки STR_0089 :Мини-горки STR_0090 :Шахтёрская поездка -STR_0091 :Неизвестный аттракцион (59) STR_0092 :Горки с запуском ЛИМ STR_0093 :Гибридные горки STR_0094 :Горки с одним рельсом @@ -3830,3 +3821,8 @@ STR_7003 :Аудио-файл «{STRING}» повреждён. Ожидало STR_7004 :Полная перерисовка STR_7006 :Бордюр на кнопках с изображениями STR_7007 :Тип аттр. +STR_7008 :Неизвестный аттракцион ({INT32}) +STR_7009 :Скачиваются скрипты… +STR_7010 :Не могу запустить демо - файл «{STRING}» не существует или повреждён +STR_7011 :Не могу запустить демо +STR_7012 :Польские злотые (PLN) diff --git a/data/language/sv-SE.txt b/data/language/sv-SE.txt index f7fbdb412b59..379f54c25f4c 100644 --- a/data/language/sv-SE.txt +++ b/data/language/sv-SE.txt @@ -33,12 +33,9 @@ STR_0027 :Radiobilar STR_0028 :Piratskepp STR_0029 :Svängande omvänt piratskepp STR_0030 :Matstånd -STR_0031 :Okänt stånd (1D) STR_0032 :Dryckesstånd -STR_0033 :Okänt stånd (1F) STR_0034 :Stånd STR_0035 :Karusell -STR_0036 :Okänt stånd (22) STR_0037 :Informationskiosk STR_0038 :Toaletter STR_0039 :Pariserhjul @@ -84,16 +81,10 @@ STR_0078 :Inverterad hårnålsbana STR_0079 :Flygande matta STR_0080 :Ubåtsbana STR_0081 :Flodflottar -STR_0082 :Okänd åktur (50) STR_0083 :Enterprise -STR_0084 :Okänd åktur (52) -STR_0085 :Okänd åktur (53) -STR_0086 :Okänd åktur (54) -STR_0087 :Okänd åktur (55) STR_0088 :Inverterad impulsbana STR_0089 :Miniberg- och dalbana STR_0090 :Gruvattraktion -STR_0091 :Okänd åktur (59) STR_0092 :Induktionsberg- och dalbana STR_0093 :Hybridberg- och dalbana STR_0094 :Enkelspårig berg- och dalbana diff --git a/data/language/tr-TR.txt b/data/language/tr-TR.txt index ef5290f0b160..416b8669883e 100644 --- a/data/language/tr-TR.txt +++ b/data/language/tr-TR.txt @@ -32,12 +32,9 @@ STR_0027 :Çarpışan Arabalar STR_0028 :Korsan Gemisi STR_0029 :Tepe Takla Gemisi STR_0030 :Yiyecek Standı -STR_0031 :Bilinmeyen Stant (1D) STR_0032 :İçecek Standı -STR_0033 :Bilinmeyen Stant (1F) STR_0034 :Dükkan STR_0035 :Atlıkarınca -STR_0036 :Bilinmeyen Stant (22) STR_0037 :Danışma STR_0038 :Tuvalet STR_0039 :Dönme Dolap @@ -83,16 +80,10 @@ STR_0078 :Teleferik Treni STR_0079 :Sihirli Halı STR_0080 :Denizaltı Kiralama STR_0081 :Sal Seyahati -STR_0082 :Bilinmeyen Alet (50) STR_0083 :Dönen Teker -STR_0084 :Bilinmeyen Alet (52) -STR_0085 :Bilinmeyen Alet (53) -STR_0086 :Bilinmeyen Alet (54) -STR_0087 :Bilinmeyen Alet (55) STR_0088 :Vida Treni STR_0089 :Mini Tren STR_0090 :Küçük Maden Treni -STR_0091 :Bilinmeyen Alet (59) STR_0092 :LIM Tren STR_0096 :Klasik Tahta Tren STR_0512 :Sarmal şeklinde tırmanma zinciri rayı ile yükseğe çıkabilen çelik yapılı bir tren diff --git a/data/language/uk-UA.txt b/data/language/uk-UA.txt index cd5986b4bad4..945a0b367494 100644 --- a/data/language/uk-UA.txt +++ b/data/language/uk-UA.txt @@ -32,12 +32,9 @@ STR_0027 :Виверти STR_0028 :Корабель-гойдалка STR_0029 :Гойдалка з інвертором STR_0030 :Магазинчик їжі -STR_0031 :Невідомий кіоск (1Д) STR_0032 :Магазинчик напоїв -STR_0033 :Невідомий кіоск (1Ф) STR_0034 :Магазин STR_0035 :Весела карусель -STR_0036 :Невідомий кіоск (22) STR_0037 :Довідковий кіоск STR_0038 :Туалети STR_0039 :Оглядове колесо @@ -83,16 +80,10 @@ STR_0078 :Перевернута підставка для шпильок STR_0079 :Чарівний килим STR_0080 :Підводний човен STR_0081 :Річкові плоти -STR_0082 :Невідомий атракціон (50) STR_0083 :Підприємство -STR_0084 :Невідомий атракціон (52) -STR_0085 :Невідомий атракціон (53) -STR_0086 :Невідомий атракціон (54) -STR_0087 :Невідомий атракціон (55) STR_0088 :Перевернуті імпульсні атракціони STR_0089 :Міні американські гірки STR_0090 :Атракціон "Шахта" -STR_0091 :Невідомий атракціон (59) STR_0092 :Американські гірки, що запускаються LIM STR_0093 :Гібридні американські гірки STR_0094 :Однорейкові американські гірки diff --git a/data/language/vi-VN.txt b/data/language/vi-VN.txt index 2a01d4b0caf4..8a81a347de99 100644 --- a/data/language/vi-VN.txt +++ b/data/language/vi-VN.txt @@ -32,12 +32,9 @@ STR_0027 :Xe điện đụng STR_0028 :Tàu cướp biển STR_0029 :Tàu lượn siêu tốc xoay tròn STR_0030 :Quầy đồ ăn -STR_0031 :Quầy không xác định (1D) STR_0032 :Quầy đồ uống -STR_0033 :Quầy không xác định (1F) STR_0034 :Cửa hàng STR_0035 :Đu quay ngựa gỗ -STR_0036 :Quầy không xác định (22) STR_0037 :Quầy thông tin STR_0038 :Nhà vệ sinh STR_0039 :Vòng quay Ferris @@ -83,16 +80,10 @@ STR_0078 :Tàu lượn ngược hình kẹp tóc STR_0079 :Thảm thần STR_0080 :Tàu ngầm STR_0081 :Thuyền bè -STR_0082 :Trò chơi không xác định (50) STR_0083 :Vòng quay Enterprise -STR_0084 :Trò chơi không xác định (52) -STR_0085 :Trò chơi không xác định (53) -STR_0086 :Trò chơi không xác định (54) -STR_0087 :Trò chơi không xác định (55) STR_0088 :Tàu lượn siêu tốc xung ngược STR_0089 :Tàu lượn siêu tốc mini STR_0090 :Chuyến tàu mỏ -STR_0091 :Trò chơi không xác định (59) STR_0092 :Tàu lượn siêu tốc khởi động LIM STR_0093 :Tàu lượn siêu tốc lai STR_0094 :Tàu lượn siêu tốc một ray diff --git a/data/language/zh-CN.txt b/data/language/zh-CN.txt index 70f3763a676c..702b1241bb01 100644 --- a/data/language/zh-CN.txt +++ b/data/language/zh-CN.txt @@ -32,12 +32,9 @@ STR_0027 :碰碰车 STR_0028 :海盗船 STR_0029 :摇摆海盗船 STR_0030 :食品小站 -STR_0031 :未知店铺(1D) STR_0032 :饮料铺 -STR_0033 :未知店铺(1F) STR_0034 :商店 STR_0035 :旋转木马 -STR_0036 :未知店铺(22) STR_0037 :信息亭 STR_0038 :厕所 STR_0039 :摩天轮 @@ -83,16 +80,10 @@ STR_0078 :回转发卡过山车 STR_0079 :魔毯 STR_0080 :迷你潜艇 STR_0081 :水上木筏 -STR_0082 :未知游乐设施(50) STR_0083 :企业号 -STR_0084 :未知游乐设施(52) -STR_0085 :未知游乐设施(53) -STR_0086 :未知游乐设施(54) -STR_0087 :未知游乐设施(55) STR_0088 :回转冲力过山车 STR_0089 :迷你过山车 STR_0090 :矿车式过山车 -STR_0091 :未知游乐设施(59) STR_0092 :LIM喷射过山车 STR_0093 :混合过山车 STR_0094 :单轨过山车 diff --git a/data/language/zh-TW.txt b/data/language/zh-TW.txt index eb279738bc13..176b3e52d15e 100644 --- a/data/language/zh-TW.txt +++ b/data/language/zh-TW.txt @@ -32,12 +32,9 @@ STR_0027 :碰碰車 STR_0028 :海盜船 STR_0029 :垂直迴轉海盜船 STR_0030 :食物店鋪 -STR_0031 :Unknown Stall (1D) STR_0032 :飲料店鋪 -STR_0033 :Unknown Stall (1F) STR_0034 :商店 STR_0035 :旋轉木馬 -STR_0036 :Unknown Stall (22) STR_0037 :訪客資訊中心 STR_0038 :廁所 STR_0039 :摩天輪 @@ -83,16 +80,10 @@ STR_0078 :反轉髮夾彎式雲霄飛車 STR_0079 :魔法地毯 STR_0080 :潛艇遊道 STR_0081 :木筏河道 -STR_0082 :Unknown Ride (50) STR_0083 :太空摩天輪 -STR_0084 :Unknown Ride (52) -STR_0085 :Unknown Ride (53) -STR_0086 :Unknown Ride (54) -STR_0087 :Unknown Ride (55) STR_0088 :反轉極速式雲霄飛車 STR_0089 :迷你雲霄飛車 STR_0090 :礦遊式雲霄飛車 -STR_0091 :Unknown Ride (59) STR_0092 :直線電動機發車雲霄飛車 STR_0093 :混合式雲霄飛車 STR_0094 :單軌式雲霄飛車 diff --git a/debian/changelog b/debian/changelog index abbdfef2cdb6..4696ef7a1c73 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,66 @@ +openrct2 (0.4.30-develop-1) unstable; urgency=medium + + * Improved: [#24912] Staff now use an appropriate standing animation while waiting at level crossings. + * Improved: [#25515] Path dragging can now be disabled via multiplayer group permissions. + * Improved: [#25529] The map selection grid no longer redraws every frame if it has not changed. + * Improved: [#25530] Wall dragging can now be cancelled without closing the Scenery window. + * Improved: [#25575] Updated the network protocol to a new format that supports larger packets, allowing clients to connect reliably to servers with many objects or large maps. + * Improved: [#25621] Added the Polish Złoty (PLN) to the list of available currencies. + * Improved: [#25625] Renewing and refurbishing rides now also resets the downtime. + * Improved: [#25662] The sprite build command is faster when building sprites from the same image file. + * Change: [#21912] Toilet income is now categorised as shop sales instead of ride tickets. + * Change: [#25403] Guests will not slide down the Spiral Slide if it's broken, even if they have already entered the ride structure. + * Change: [#25485] Make the enlarged pressed swatch sprite more pronounced. + * Change: [#25544] The default game window size is now 1280×720px instead of 640×480px. + * Fix: [#9895] Stand-up coaster gets wrong intensity boost from the synchronisation bonus. + * Fix: [#11617] Path corner connections are broken when hovering track design ghosts with paths over them in zero clearances. + * Fix: [#22484] Lingering ghost entrance after placing park entrance. + * Fix: [#24952] Duplicate track designs when running via Steam without having RCT1 linked. + * Fix: [#25187] On-ride photo platform does not render as ghost when placing track design. + * Fix: [#25229] Excessive logging of game actions, reduced to top-level game actions and filters ghost related ones. + * Fix: [#25469] Drawing in the ui.imageManager.draw callback causes an assertion. + * Fix: [#25524] The track construction arrow does not immediately change position when deleting track pieces. + * Fix: [#25552] Clear Scenery does not show an error message about insufficient money if cash is negative. + * Fix: [#25565] Chairlift station ends are missing tunnels at certain rotations. + * Fix: [#25569] Placing park entrances in multiplayer does not show for other players, causing desyncs. + * Fix: [#25571] Potential crash due to drawing a Crooked House ride. + * Fix: [#25588] When the master server becomes unreachable the server would not register again until a restart. + * Fix: [#25592] Log flume, river rapids, & splash boats can get control failure breakdown instead of brakes failure. + * Fix: [#25595] Invisible entrance is added to imported SV4 saves. + * Fix: [#25601] Inspection interval of a ride gets reset when opening the construction window. + * Fix: [#25628] Availability of AVX2 and SSE4.1 is not detected correctly. + * Fix: [#25639] Scenery window crashes when a no longer present object is still selected. + * Fix: [#25641] Desync because of mismatching inspection intervals. + * Fix: [#25642] The selection marker for purchasing land rights is not drawn with the correct colours. + * Fix: [#25646] It is possible to remove scenery and paths when setting staff patrol areas and purchasing land. + * Fix: [#25660] After saving a track design with scenery, that ride’s entrances and exits are visible in ‘Highlight path issues’ mode. + * Fix: [#25717] Umbrellas given to guests by means of cheats do not use the full (extended) range of colours. + +openrct2 (0.4.29-develop-1) unstable; urgency=medium + + * Feature: [#25459] Wall line dragging tool. + * Improved: [#25028] Stalls now support colour presets, just like regular rides. + * Improved: [#25426] Building the track designs index is now quicker. + * Improved: [#25490] The ‘New Ride’ window can now be resized. + * Fix: [#6228] The saved queue line path connections are not preserved when placing track designs (original bug). + * Fix: [#14365] Track designs with scenery below the lowest track piece do not preview correctly. + * Fix: [#25451] Dropdown item tooltips stay open if the mouse is moved over an empty space. + * Fix: [#25454] Opening the land tool while building a path bridge or tunnel closes the Footpaths window. + * Fix: [#25461] Path connections in raised track designs are sometimes broken when placed. + * Fix: [#25467] Paths are not connected together correctly in track design previews. + * Fix: [#25476] When both RCT2 and RCT1 are present, autodetection fails. + * Fix: [#25480] The mini track design preview and price are misaligned in Enlarged UI mode. + * Fix: [#25488] Crash in headless mode. + * Fix: [#25494] The Go-Karts steep to flat track does not draw correctly in the flat side tunnel. + * Fix: [#25518] The virtual floor does not draw correctly if expanded on the positive x and y axes. + * Fix: [#25519] Crackling audio when sampling frequencies do not match. + * Fix: [objects#401] Round tunnels on down slopes glitch. + * Fix: [objects#404] Wooden Wild Mine cars incorrectly allow setting a third remap colour. + * Fix: [objects#408] Australian fountain sets have confusing naming. + * Fix: [objects#409] LIM Launched Coaster trains incorrectly have a 10% intensity modifier set (original bug). + * Fix: [objects#410] Large scenery from the Wacky Worlds Africa theming have incorrect previews when using specific versions of the RCT2 base game. + * Fix: [objects#415] Penguin bobsleigh trains show incorrect sprites on the 12° down slope (original bug). + openrct2 (0.4.28-develop-1) unstable; urgency=medium * Feature: [#25286] Footpath area dragging tool. diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 5ce34cf97cc9..e8dda64b9e0a 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,9 +1,73 @@ -0.4.29 (in development) +0.4.31 (in development) ------------------------------------------------------------------------ +- Improved: [#25765] The ‘View options’ and ‘Special track elements’ dropdowns no longer need click-and-hold. +- Fix: [#25739] Game freezes when a tab in the New Ride window contains more than 384 items. +- Fix: [#25799] The animated options tab icon of the news window does not always redraw. + +0.4.30 (2026-01-04) +------------------------------------------------------------------------ +- Improved: [#24912] Staff now use an appropriate standing animation while waiting at level crossings. +- Improved: [#25515] Path dragging can now be disabled via multiplayer group permissions. +- Improved: [#25529] The map selection grid no longer redraws every frame if it has not changed. +- Improved: [#25530] Wall dragging can now be cancelled without closing the Scenery window. +- Improved: [#25575] Updated the network protocol to a new format that supports larger packets, allowing clients to connect reliably to servers with many objects or large maps. +- Improved: [#25621] Added the Polish Złoty (PLN) to the list of available currencies. +- Improved: [#25625] Renewing and refurbishing rides now also resets the downtime. +- Improved: [#25662] The sprite build command is faster when building sprites from the same image file. +- Change: [#21912] Toilet income is now categorised as shop sales instead of ride tickets. +- Change: [#25403] Guests will not slide down the Spiral Slide if it's broken, even if they have already entered the ride structure. +- Change: [#25485] Make the enlarged pressed swatch sprite more pronounced. +- Change: [#25544] The default game window size is now 1280×720px instead of 640×480px. +- Fix: [#9895] Stand-up coaster gets wrong intensity boost from the synchronisation bonus. +- Fix: [#11617] Path corner connections are broken when hovering track design ghosts with paths over them in zero clearances. +- Fix: [#22484] Lingering ghost entrance after placing park entrance. +- Fix: [#24952] Duplicate track designs when running via Steam without having RCT1 linked. +- Fix: [#25187] On-ride photo platform does not render as ghost when placing track design. +- Fix: [#25229] Excessive logging of game actions, reduced to top-level game actions and filters ghost related ones. +- Fix: [#25469] Drawing in the ui.imageManager.draw callback causes an assertion. +- Fix: [#25524] The track construction arrow does not immediately change position when deleting track pieces. +- Fix: [#25552] Clear Scenery does not show an error message about insufficient money if cash is negative. +- Fix: [#25565] Chairlift station ends are missing tunnels at certain rotations. +- Fix: [#25569] Placing park entrances in multiplayer does not show for other players, causing desyncs. +- Fix: [#25571] Potential crash due to drawing a Crooked House ride. +- Fix: [#25588] When the master server becomes unreachable the server would not register again until a restart. +- Fix: [#25592] Log flume, river rapids, & splash boats can get control failure breakdown instead of brakes failure. +- Fix: [#25595] Invisible entrance is added to imported SV4 saves. +- Fix: [#25601] Inspection interval of a ride gets reset when opening the construction window. +- Fix: [#25628] Availability of AVX2 and SSE4.1 is not detected correctly. +- Fix: [#25639] Scenery window crashes when a no longer present object is still selected. +- Fix: [#25641] Desync because of mismatching inspection intervals. +- Fix: [#25642] The selection marker for purchasing land rights is not drawn with the correct colours. +- Fix: [#25646] It is possible to remove scenery and paths when setting staff patrol areas and purchasing land. +- Fix: [#25660] After saving a track design with scenery, that ride’s entrances and exits are visible in ‘Highlight path issues’ mode. +- Fix: [#25717] Umbrellas given to guests by means of cheats do not use the full (extended) range of colours. + +0.4.29 (2025-11-22) +------------------------------------------------------------------------ +- Feature: [#25459] Wall line dragging tool. +- Improved: [#25028] Stalls now support colour presets, just like regular rides. - Improved: [#25426] Building the track designs index is now quicker. +- Improved: [#25490] The ‘New Ride’ window can now be resized. +- Improved: [#25502] Track height markers on flat rides now more sensible. +- Fix: [#6228] The saved queue line path connections are not preserved when placing track designs (original bug). - Fix: [#14365] Track designs with scenery below the lowest track piece do not preview correctly. - Fix: [#25451] Dropdown item tooltips stay open if the mouse is moved over an empty space. +- Fix: [#25454] Opening the land tool while building a path bridge or tunnel closes the Footpaths window. - Fix: [#25461] Path connections in raised track designs are sometimes broken when placed. +- Fix: [#25467] Paths are not connected together correctly in track design previews. +- Fix: [#25476] When both RCT2 and RCT1 are present, autodetection fails. +- Fix: [#25480] The mini track design preview and price are misaligned in Enlarged UI mode. +- Fix: [#25488] Crash in headless mode. +- Fix: [#25494] The Go-Karts steep to flat track does not draw correctly in the flat side tunnel. +- Fix: [#25503] Height markers missing from some maze tiles. +- Fix: [#25518] The virtual floor does not draw correctly if expanded on the positive x and y axes. +- Fix: [#25519] Crackling audio when sampling frequencies do not match. +- Fix: [objects#401] Round tunnels on down slopes glitch. +- Fix: [objects#404] Wooden Wild Mine cars incorrectly allow setting a third remap colour. +- Fix: [objects#408] Australian fountain sets have confusing naming. +- Fix: [objects#409] LIM Launched Coaster trains incorrectly have a 10% intensity modifier set (original bug). +- Fix: [objects#410] Large scenery from the Wacky Worlds Africa theming have incorrect previews when using specific versions of the RCT2 base game. +- Fix: [objects#415] Penguin bobsleigh trains show incorrect sprites on the 12° down slope (original bug). 0.4.28 (2025-11-01) ------------------------------------------------------------------------ diff --git a/distribution/linux/io.openrct2.openrct2.appdata.xml b/distribution/linux/io.openrct2.openrct2.appdata.xml index e4ab5d546d30..de95e3054c74 100644 --- a/distribution/linux/io.openrct2.openrct2.appdata.xml +++ b/distribution/linux/io.openrct2.openrct2.appdata.xml @@ -456,6 +456,12 @@ none + + https://github.com/OpenRCT2/OpenRCT2/releases/tag/v0.4.30 + + + https://github.com/OpenRCT2/OpenRCT2/releases/tag/v0.4.29 + https://github.com/OpenRCT2/OpenRCT2/releases/tag/v0.4.28 diff --git a/distribution/macos/Info.plist b/distribution/macos/Info.plist index e49514433796..bbc7d2d997a7 100644 --- a/distribution/macos/Info.plist +++ b/distribution/macos/Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.4.28 + 0.4.30 CFBundleSignature ORCT LSMinimumSystemVersion diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 17935e3b6ce7..188647c8203e 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -5354,11 +5354,11 @@ declare global { write(data: string): boolean; on(event: "close", callback: (hadError: boolean) => void): Socket; - on(event: "error", callback: (hadError: boolean) => void): Socket; + on(event: "error", callback: (errorString: string) => void): Socket; on(event: "data", callback: (data: string) => void): Socket; off(event: "close", callback: (hadError: boolean) => void): Socket; - off(event: "error", callback: (hadError: boolean) => void): Socket; + off(event: "error", callback: (errorString: string) => void): Socket; off(event: "data", callback: (data: string) => void): Socket; } diff --git a/openrct2.deps.targets b/openrct2.deps.targets index 2d43e50394c0..55f7507cf17c 100644 --- a/openrct2.deps.targets +++ b/openrct2.deps.targets @@ -218,14 +218,14 @@ 490263b873dd02c13a043a04d26bb9837d2d378dacd8b2c8d29660fef44db3db https://github.com/OpenRCT2/title-sequences/releases/download/v0.4.26/title-sequences.zip dabb9787b1576342fca4dd9f64b3f8cfa04a7e6ce9c2bb9610f47b762905c858 - https://github.com/OpenRCT2/objects/releases/download/v1.7.3/objects.zip - c81029264578706ed1db88665e12a70a583e71dc4d3eb4db262535d2f0589eab + https://github.com/OpenRCT2/objects/releases/download/v1.7.5/objects.zip + c8b9d3039a920f67caf15b09e8312cc4f80d59ed7fe0288625b9ccedef606797 https://github.com/OpenRCT2/OpenSoundEffects/releases/download/v1.0.6/opensound.zip 06b90f3e19c216752df441d551b26a9e3e1ba7755bdd2102504b73bf993608be https://github.com/OpenRCT2/OpenMusic/releases/download/v1.6.1/openmusic.zip 994b350d3b180ee1cb9619fe27f7ebae3a1a5232840c4bd47a89f33fa89de1a1 - https://github.com/OpenRCT2/replays/releases/download/v0.0.90/replays.zip - f8474a927e155056e5729b6fa9f05af2a85ae7e1435f5fa89ba496242f9f255e + https://github.com/OpenRCT2/replays/releases/download/v0.0.91/replays.zip + 5b99edc3d8445fcd2cb22c204708247f575d0bdd3128561322e3abf01e977c79 diff --git a/readme.md b/readme.md index 1320d8a4734a..677a7021e82f 100644 --- a/readme.md +++ b/readme.md @@ -17,9 +17,9 @@ --- ### Download -| Latest release | Latest development build | -|------------------------------------------------------------------------------------------------------------------------|--------------------------| -| [![OpenRCT2.io](https://img.shields.io/badge/master-v0.4.28-green.svg)](https://openrct2.io/download/release/latest) | [![OpenRCT2.io](https://img.shields.io/github/last-commit/OpenRCT2/OpenRCT2/develop)](https://openrct2.io/download/develop/latest) | +| Latest release | Latest development build | +|----------------------------------------------------------------------------------------------------------------------|--------------------------| +| [![OpenRCT2.io](https://img.shields.io/github/v/release/OpenRCT2/OpenRCT2.svg?color=green)](https://openrct2.io/download/release/latest) | [![OpenRCT2.io](https://img.shields.io/github/last-commit/OpenRCT2/OpenRCT2/develop?color=green)](https://openrct2.io/download/develop/latest) | --- @@ -87,7 +87,6 @@ Some Linux distributions offer native packages: Some \*BSD operating systems offer native packages: * FreeBSD: [games/openrct2](https://www.freshports.org/games/openrct2) -* OpenBSD: [games/openrct2](https://openports.se/games/openrct2) --- diff --git a/resources/g2/icons/colour_pressed_large.png b/resources/g2/icons/colour_pressed_large.png index c73c31cb2827..13227a67e122 100644 Binary files a/resources/g2/icons/colour_pressed_large.png and b/resources/g2/icons/colour_pressed_large.png differ diff --git a/src/openrct2-android/app/build.gradle b/src/openrct2-android/app/build.gradle index ca28484be8df..983de72df2db 100644 --- a/src/openrct2-android/app/build.gradle +++ b/src/openrct2-android/app/build.gradle @@ -21,8 +21,8 @@ android { minSdkVersion 24 targetSdkVersion 36 - versionCode 15 - versionName '0.4.28' + versionCode 17 + versionName '0.4.30' externalNativeBuild { cmake { arguments '-DANDROID_STL=c++_shared', '-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON' diff --git a/src/openrct2-android/app/src/main/CMakeLists.txt b/src/openrct2-android/app/src/main/CMakeLists.txt index ef632854168a..375481a0dd79 100644 --- a/src/openrct2-android/app/src/main/CMakeLists.txt +++ b/src/openrct2-android/app/src/main/CMakeLists.txt @@ -272,6 +272,7 @@ target_include_directories(openrct2-ui PRIVATE "${ORCT2_ROOT}/src/thirdparty/duk target_include_directories(openrct2-ui PRIVATE "${ORCT2_ROOT}/src") target_include_directories(openrct2-ui SYSTEM PRIVATE "${ORCT2_ROOT}/src/thirdparty") target_include_directories(openrct2-cli PRIVATE "${ORCT2_ROOT}/src") +target_include_directories(openrct2-cli SYSTEM PRIVATE "${ORCT2_ROOT}/src/thirdparty") target_include_directories(openrct2 PRIVATE "/opt/openrct2/include/nlohmann/../") target_include_directories(openrct2-ui PRIVATE "/opt/openrct2/include/nlohmann/../") diff --git a/src/openrct2-cli/Cli.cpp b/src/openrct2-cli/Cli.cpp index e034d80718ec..6f84cdd675c5 100644 --- a/src/openrct2-cli/Cli.cpp +++ b/src/openrct2-cli/Cli.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,7 +10,6 @@ #include #include #include -#include using namespace OpenRCT2; diff --git a/src/openrct2-ui/CMakeLists.txt b/src/openrct2-ui/CMakeLists.txt index 9cfdc265474b..8a5f66bf27ba 100644 --- a/src/openrct2-ui/CMakeLists.txt +++ b/src/openrct2-ui/CMakeLists.txt @@ -38,7 +38,7 @@ endif () if (NOT DISABLE_OPENGL AND NOT EMSCRIPTEN) # GL doesn't work nicely with macOS, while find_package doesn't work with multiarch on Ubuntu. - if (APPLE) + if (APPLE OR HAIKU) find_package(OpenGL REQUIRED) elseif (NOT WIN32) PKG_CHECK_MODULES(GL REQUIRED gl) @@ -104,7 +104,7 @@ endif () if (NOT DISABLE_OPENGL) if (WIN32) target_link_libraries(openrct2 opengl32) - elseif (APPLE) + elseif (APPLE OR HAIKU) target_link_libraries(openrct2 ${OPENGL_LIBRARY}) else () target_link_libraries(openrct2 ${GL_LIBRARIES}) diff --git a/src/openrct2-ui/CursorData.cpp b/src/openrct2-ui/CursorData.cpp index 1e583e7c76e8..d36a33b5f89a 100644 --- a/src/openrct2-ui/CursorData.cpp +++ b/src/openrct2-ui/CursorData.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/CursorData.h b/src/openrct2-ui/CursorData.h index 9d22ffba1eff..4f95c8bfda69 100644 --- a/src/openrct2-ui/CursorData.h +++ b/src/openrct2-ui/CursorData.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/CursorRepository.cpp b/src/openrct2-ui/CursorRepository.cpp index 9a98428c9bba..ef71e517b900 100644 --- a/src/openrct2-ui/CursorRepository.cpp +++ b/src/openrct2-ui/CursorRepository.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/CursorRepository.h b/src/openrct2-ui/CursorRepository.h index 4540c8c7ea98..e81820b048b5 100644 --- a/src/openrct2-ui/CursorRepository.h +++ b/src/openrct2-ui/CursorRepository.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/ProvisionalElements.cpp b/src/openrct2-ui/ProvisionalElements.cpp index e8a2508a624d..fdf5c32de7ce 100644 --- a/src/openrct2-ui/ProvisionalElements.cpp +++ b/src/openrct2-ui/ProvisionalElements.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/ProvisionalElements.h b/src/openrct2-ui/ProvisionalElements.h index 008b46795495..318a0cf1a08c 100644 --- a/src/openrct2-ui/ProvisionalElements.h +++ b/src/openrct2-ui/ProvisionalElements.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/SDLException.cpp b/src/openrct2-ui/SDLException.cpp index 934256a7757d..ce766ada7e2e 100644 --- a/src/openrct2-ui/SDLException.cpp +++ b/src/openrct2-ui/SDLException.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/SDLException.h b/src/openrct2-ui/SDLException.h index d3e6ce605381..a05e0022f4af 100644 --- a/src/openrct2-ui/SDLException.h +++ b/src/openrct2-ui/SDLException.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/TextComposition.cpp b/src/openrct2-ui/TextComposition.cpp index a960080de3b1..a257f0663bb6 100644 --- a/src/openrct2-ui/TextComposition.cpp +++ b/src/openrct2-ui/TextComposition.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/TextComposition.h b/src/openrct2-ui/TextComposition.h index 0160d8f1aaed..67f1a4b1f0e2 100644 --- a/src/openrct2-ui/TextComposition.h +++ b/src/openrct2-ui/TextComposition.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/Ui.cpp b/src/openrct2-ui/Ui.cpp index 230f87955046..d54b3bc7de6a 100644 --- a/src/openrct2-ui/Ui.cpp +++ b/src/openrct2-ui/Ui.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/Ui.h b/src/openrct2-ui/Ui.h index 8d962defe507..c1576f2d70e6 100644 --- a/src/openrct2-ui/Ui.h +++ b/src/openrct2-ui/Ui.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/UiContext.Android.cpp b/src/openrct2-ui/UiContext.Android.cpp index 2c50ac247aac..7a39021bbd86 100644 --- a/src/openrct2-ui/UiContext.Android.cpp +++ b/src/openrct2-ui/UiContext.Android.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/UiContext.Linux.cpp b/src/openrct2-ui/UiContext.Linux.cpp index 7b2978d93a31..6c3f7d352311 100644 --- a/src/openrct2-ui/UiContext.Linux.cpp +++ b/src/openrct2-ui/UiContext.Linux.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -7,7 +7,7 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ -#if (defined(__unix__) || defined(__EMSCRIPTEN__)) && !defined(__ANDROID__) && !defined(__APPLE__) +#if (defined(__unix__) || defined(__HAIKU__) || defined(__EMSCRIPTEN__)) && !defined(__ANDROID__) && !defined(__APPLE__) #include "UiContext.h" @@ -129,14 +129,22 @@ namespace OpenRCT2::Ui void OpenFolder(const std::string& path) override { + #ifdef __HAIKU__ + const char* args[] = { "open", path.c_str(), nullptr }; + #else const char* args[] = { "xdg-open", path.c_str(), nullptr }; + #endif Platform::Execute(args); } void OpenURL(const std::string& url) override { #ifndef __EMSCRIPTEN__ + #ifdef __HAIKU__ + const char* args[] = { "open", url.c_str(), nullptr }; + #else const char* args[] = { "xdg-open", url.c_str(), nullptr }; + #endif Platform::Execute(args); #else MAIN_THREAD_EM_ASM({ window.open(UTF8ToString($0)); }, url.c_str()); diff --git a/src/openrct2-ui/UiContext.Win32.cpp b/src/openrct2-ui/UiContext.Win32.cpp index 45d2cf881cb6..dede65893fde 100644 --- a/src/openrct2-ui/UiContext.Win32.cpp +++ b/src/openrct2-ui/UiContext.Win32.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/UiContext.cpp b/src/openrct2-ui/UiContext.cpp index 0a71fe9e0c13..b9e1d8f77f2b 100644 --- a/src/openrct2-ui/UiContext.cpp +++ b/src/openrct2-ui/UiContext.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -812,10 +812,12 @@ class UiContext final : public IUiContext int32_t width = Config::Get().general.windowWidth; int32_t height = Config::Get().general.windowHeight; #endif + + // Set defaults if size is invalid if (width <= 0) - width = 640; + width = 1280; if (height <= 0) - height = 480; + height = 720; // Create window in window first rather than fullscreen so we have the display the window is on first uint32_t flags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI; diff --git a/src/openrct2-ui/UiContext.h b/src/openrct2-ui/UiContext.h index a6a0cf058ec6..f4d0e50074aa 100644 --- a/src/openrct2-ui/UiContext.h +++ b/src/openrct2-ui/UiContext.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/UiContext.macOS.mm b/src/openrct2-ui/UiContext.macOS.mm index 8be31015f35e..8aa9f0539b44 100644 --- a/src/openrct2-ui/UiContext.macOS.mm +++ b/src/openrct2-ui/UiContext.macOS.mm @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 2a55b5844b0c..70cfe61bfe9c 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1574,15 +1574,7 @@ namespace OpenRCT2 STR_RIDE_MODE_NUMBER_OF_SWINGS_VALUE = 1771, STR_RIDE_MODE_SPEED_VALUE = 1331, STR_RIDE_MODE_TIME_LIMIT_VALUE = 1749, - STR_RIDE_NAME_1D = 31, - STR_RIDE_NAME_1F = 33, - STR_RIDE_NAME_22 = 36, - STR_RIDE_NAME_50 = 82, - STR_RIDE_NAME_52 = 84, - STR_RIDE_NAME_53 = 85, - STR_RIDE_NAME_54 = 86, - STR_RIDE_NAME_55 = 87, - STR_RIDE_NAME_59 = 91, + STR_RIDE_NAME_UNKNOWN_INT32 = 7008, STR_RIDE_SECONDARY_PRICE_VALUE = 1799, STR_RIDE_STATS_ALTITUDE = 1416, STR_RIDE_STATS_ALTITUDE_FORMAT = 1420, diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index 24e75c869858..7e7a38cc850e 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -870,7 +871,7 @@ class WindowManager final : public IWindowManager { if (w->flags.has(WindowFlag::dead)) continue; - if (!(w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront, WindowFlag::noAutoClose))) + if (!w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront, WindowFlag::noAutoClose)) { Close(*w.get()); break; @@ -892,7 +893,7 @@ class WindowManager final : public IWindowManager } } } - else if (!(flags.has(WindowFlag::stickToFront))) + else if (!flags.has(WindowFlag::stickToFront)) { for (auto it = gWindowList.rbegin(); it != gWindowList.rend(); it++) { @@ -911,7 +912,7 @@ class WindowManager final : public IWindowManager wp->flags = flags; // Play sounds and flash the window - if (!(flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront))) + if (!flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront)) { wp->flash(); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::windowOpen, 0, pos.x + (windowSize.width / 2)); @@ -972,7 +973,7 @@ class WindowManager final : public IWindowManager { if (w->flags.has(WindowFlag::dead)) continue; - if (!(w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront, WindowFlag::noAutoClose))) + if (!w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront, WindowFlag::noAutoClose)) { foundW = w.get(); break; @@ -1015,7 +1016,7 @@ class WindowManager final : public IWindowManager // Now close the collected windows for (auto* wnd : windowsToClose) { - if (!(wnd->flags.has(WindowFlag::dead))) + if (!wnd->flags.has(WindowFlag::dead)) { Close(*wnd); } @@ -1061,7 +1062,7 @@ class WindowManager final : public IWindowManager return; } - auto pred = [](WindowBase* w) -> bool { return !(w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront)); }; + auto pred = [](WindowBase* w) -> bool { return !w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront); }; CloseByCondition(pred, WindowCloseFlags::CloseSingle); } @@ -1074,14 +1075,14 @@ class WindowManager final : public IWindowManager { CloseByClass(WindowClass::dropdown); CloseByCondition( - [](WindowBase* w) -> bool { return !(w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront)); }); + [](WindowBase* w) -> bool { return !w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront); }); } void CloseAllExceptClass(WindowClass cls) override { CloseByClass(WindowClass::dropdown); CloseByCondition([cls](WindowBase* w) -> bool { - return w->classification != cls && !(w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront)); + return w->classification != cls && !w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront); }); } @@ -1090,7 +1091,7 @@ class WindowManager final : public IWindowManager */ void CloseAllExceptFlags(WindowFlags flags) override { - CloseByCondition([flags](WindowBase* w) -> bool { return !(w->flags.hasAny(flags)); }); + CloseByCondition([flags](WindowBase* w) -> bool { return !w->flags.hasAny(flags); }); } /** @@ -1102,7 +1103,7 @@ class WindowManager final : public IWindowManager CloseByCondition([cls, number](WindowBase* w) -> bool { return ( !(w->number == number && w->classification == cls) - && !(w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront))); + && !w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront)); }); } @@ -1335,7 +1336,7 @@ class WindowManager final : public IWindowManager */ WindowBase* BringToFront(WindowBase& w) override { - if (!(w.flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront))) + if (!w.flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront)) { auto itSourcePos = WindowGetIterator(&w); if (itSourcePos != gWindowList.end()) @@ -1349,7 +1350,7 @@ class WindowManager final : public IWindowManager { continue; } - if (!(w2->flags.has(WindowFlag::stickToFront))) + if (!w2->flags.has(WindowFlag::stickToFront)) { // base() returns the next element in the list, so we need to decrement it. itDestPos = std::prev(it.base()); diff --git a/src/openrct2-ui/WindowManager.h b/src/openrct2-ui/WindowManager.h index 7c10dc3deac1..592b36876353 100644 --- a/src/openrct2-ui/WindowManager.h +++ b/src/openrct2-ui/WindowManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/audio/AudioChannel.cpp b/src/openrct2-ui/audio/AudioChannel.cpp index c033a0e70006..3d139120d257 100644 --- a/src/openrct2-ui/audio/AudioChannel.cpp +++ b/src/openrct2-ui/audio/AudioChannel.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -254,7 +254,7 @@ namespace OpenRCT2::Audio size_t readLen = _source->Read(dst, _offset, bytesToRead); if (readLen > 0) { - dst = reinterpret_cast(reinterpret_cast(dst) + readLen); + dst = static_cast(static_cast(dst) + readLen); bytesToRead -= readLen; bytesRead += readLen; _offset += readLen; diff --git a/src/openrct2-ui/audio/AudioContext.cpp b/src/openrct2-ui/audio/AudioContext.cpp index 96e7b2455ba2..6340a6baefc2 100644 --- a/src/openrct2-ui/audio/AudioContext.cpp +++ b/src/openrct2-ui/audio/AudioContext.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/audio/AudioContext.h b/src/openrct2-ui/audio/AudioContext.h index 8cb6e092065c..8451b3bae8cc 100644 --- a/src/openrct2-ui/audio/AudioContext.h +++ b/src/openrct2-ui/audio/AudioContext.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/audio/AudioFormat.h b/src/openrct2-ui/audio/AudioFormat.h index f96faea5211f..d4ef7e17c81f 100644 --- a/src/openrct2-ui/audio/AudioFormat.h +++ b/src/openrct2-ui/audio/AudioFormat.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/audio/AudioMixer.cpp b/src/openrct2-ui/audio/AudioMixer.cpp index 01a7de4bdeaf..ad7ea788ba20 100644 --- a/src/openrct2-ui/audio/AudioMixer.cpp +++ b/src/openrct2-ui/audio/AudioMixer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -40,9 +40,9 @@ void AudioMixer::Init(const char* device) SDL_AudioSpec have; _deviceId = SDL_OpenAudioDevice(device, 0, &want, &have, 0); - _format.format = have.format; - _format.channels = have.channels; - _format.freq = have.freq; + _outputFormat.format = have.format; + _outputFormat.channels = have.channels; + _outputFormat.freq = have.freq; SDL_PauseAudioDevice(_deviceId, 0); } @@ -121,7 +121,7 @@ void AudioMixer::RemoveReleasedSources() const AudioFormat& AudioMixer::GetFormat() const { - return _format; + return _outputFormat; } void AudioMixer::GetNextAudioChunk(uint8_t* dst, size_t length) @@ -173,10 +173,10 @@ void AudioMixer::UpdateAdjustedSound() void AudioMixer::MixChannel(ISDLAudioChannel* channel, uint8_t* data, size_t length) { - int32_t byteRate = _format.GetByteRate(); - auto numSamples = static_cast(length / byteRate); + int32_t outputByteRate = _outputFormat.GetByteRate(); + auto numSamples = static_cast(length / outputByteRate); double rate = 1; - if (_format.format == AUDIO_S16SYS) + if (_outputFormat.format == AUDIO_S16SYS) { rate = channel->GetRate(); } @@ -185,11 +185,11 @@ void AudioMixer::MixChannel(ISDLAudioChannel* channel, uint8_t* data, size_t len SDL_AudioCVT cvt; cvt.len_ratio = 1; AudioFormat streamformat = channel->GetFormat(); - if (streamformat != _format) + if (streamformat != _outputFormat) { if (SDL_BuildAudioCVT( - &cvt, streamformat.format, streamformat.channels, streamformat.freq, _format.format, _format.channels, - _format.freq) + &cvt, streamformat.format, streamformat.channels, streamformat.freq, _outputFormat.format, + _outputFormat.channels, _outputFormat.freq) == -1) { // Unable to convert channel data @@ -200,7 +200,7 @@ void AudioMixer::MixChannel(ISDLAudioChannel* channel, uint8_t* data, size_t len // Read raw PCM from channel int32_t readSamples = numSamples * rate; - auto readLength = static_cast(readSamples / cvt.len_ratio) * byteRate; + auto readLength = static_cast(ceil(readSamples / cvt.len_ratio)) * outputByteRate; _channelBuffer.resize(readLength); size_t bytesRead = channel->Read(_channelBuffer.data(), readLength); @@ -228,43 +228,45 @@ void AudioMixer::MixChannel(ISDLAudioChannel* channel, uint8_t* data, size_t len // Apply effects if (rate != 1) { - auto inRate = static_cast(bufferLen / byteRate); + auto inRate = static_cast(bufferLen / outputByteRate); int32_t outRate = numSamples; if (bytesRead != readLength) { - inRate = _format.freq; - outRate = _format.freq * (1 / rate); + inRate = _outputFormat.freq; + outRate = _outputFormat.freq * (1 / rate); } _effectBuffer.resize(length); - bufferLen = ApplyResample(channel, buffer, static_cast(bufferLen / byteRate), numSamples, inRate, outRate); + bufferLen = ApplyResample( + channel, buffer, static_cast(bufferLen / outputByteRate), numSamples, inRate, outRate); buffer = _effectBuffer.data(); } // Apply panning and volume - ApplyPan(channel, buffer, bufferLen, byteRate); + ApplyPan(channel, buffer, bufferLen, outputByteRate); int32_t mixVolume = ApplyVolume(channel, buffer, bufferLen); // Finally mix on to destination buffer size_t dstLength = std::min(length, bufferLen); - SDL_MixAudioFormat(data, static_cast(buffer), _format.format, static_cast(dstLength), mixVolume); + SDL_MixAudioFormat( + data, static_cast(buffer), _outputFormat.format, static_cast(dstLength), mixVolume); channel->UpdateOldVolume(); } /** * Resample the given buffer into _effectBuffer. - * Assumes that srcBuffer is the same format as _format. + * Assumes that srcBuffer is the same format as _outputFormat. */ size_t AudioMixer::ApplyResample( ISDLAudioChannel* channel, const void* srcBuffer, int32_t srcSamples, int32_t dstSamples, int32_t inRate, int32_t outRate) { - int32_t byteRate = _format.GetByteRate(); + int32_t outputByteRate = _outputFormat.GetByteRate(); // Create resampler SpeexResamplerState* resampler = channel->GetResampler(); if (resampler == nullptr) { - resampler = speex_resampler_init(_format.channels, _format.freq, _format.freq, 0, nullptr); + resampler = speex_resampler_init(_outputFormat.channels, _outputFormat.freq, _outputFormat.freq, 0, nullptr); channel->SetResampler(resampler); } speex_resampler_set_rate(resampler, inRate, outRate); @@ -275,14 +277,14 @@ size_t AudioMixer::ApplyResample( resampler, static_cast(srcBuffer), &inLen, reinterpret_cast(_effectBuffer.data()), &outLen); - return outLen * byteRate; + return outLen * outputByteRate; } void AudioMixer::ApplyPan(const IAudioChannel* channel, void* buffer, size_t len, size_t sampleSize) { - if (channel->GetPan() != 0.5f && _format.channels == 2) + if (channel->GetPan() != 0.5f && _outputFormat.channels == 2) { - switch (_format.format) + switch (_outputFormat.format) { case AUDIO_S16SYS: EffectPanS16(channel, static_cast(buffer), static_cast(len / sampleSize)); @@ -331,8 +333,8 @@ int32_t AudioMixer::ApplyVolume(const IAudioChannel* channel, void* buffer, size mixVolume = kMixerVolumeMax; // Fade between volume levels to smooth out sound and minimize clicks from sudden volume changes - int32_t fadeLength = static_cast(len) / _format.BytesPerSample(); - switch (_format.format) + int32_t fadeLength = static_cast(len) / _outputFormat.BytesPerSample(); + switch (_outputFormat.format) { case AUDIO_S16SYS: EffectFadeS16(static_cast(buffer), fadeLength, startVolume, endVolume); diff --git a/src/openrct2-ui/audio/AudioMixer.h b/src/openrct2-ui/audio/AudioMixer.h index 549cb89b9198..b43d655e216a 100644 --- a/src/openrct2-ui/audio/AudioMixer.h +++ b/src/openrct2-ui/audio/AudioMixer.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -33,7 +33,7 @@ namespace OpenRCT2::Audio std::vector> _sources; SDL_AudioDeviceID _deviceId = 0; - AudioFormat _format = {}; + AudioFormat _outputFormat = {}; std::list> _channels; float _volume = 1.0f; float _adjustSoundVolume = 0.0f; @@ -67,7 +67,7 @@ namespace OpenRCT2::Audio /** * Resample the given buffer into _effectBuffer. - * Assumes that srcBuffer is the same format as _format. + * Assumes that srcBuffer is the same format as _outputFormat. */ size_t ApplyResample( ISDLAudioChannel* channel, const void* srcBuffer, int32_t srcSamples, int32_t dstSamples, int32_t inRate, diff --git a/src/openrct2-ui/audio/FlacAudioSource.cpp b/src/openrct2-ui/audio/FlacAudioSource.cpp index 17a5665659ff..1ece316b77ff 100644 --- a/src/openrct2-ui/audio/FlacAudioSource.cpp +++ b/src/openrct2-ui/audio/FlacAudioSource.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -96,7 +96,7 @@ namespace OpenRCT2::Audio _currentOffset = offset; } - auto dst8 = reinterpret_cast(dst); + auto dst8 = static_cast(dst); auto bytesRead = ReadFromDecodeBuffer(dst8, len); dst8 += bytesRead; if (bytesRead < len) @@ -171,7 +171,7 @@ namespace OpenRCT2::Audio static FLAC__StreamDecoderReadStatus FlacCallbackRead( const FLAC__StreamDecoder* decoder, FLAC__byte buffer[], size_t* bytes, void* clientData) { - auto* self = reinterpret_cast(clientData); + auto* self = static_cast(clientData); if (*bytes > 0) { *bytes = SDL_RWread(self->_rw, buffer, sizeof(FLAC__byte), *bytes); @@ -193,7 +193,7 @@ namespace OpenRCT2::Audio static FLAC__StreamDecoderSeekStatus FlacCallbackSeek( const FLAC__StreamDecoder* decoder, FLAC__uint64 absoluteByteOffset, void* clientData) { - auto* self = reinterpret_cast(clientData); + auto* self = static_cast(clientData); if (SDL_RWseek(self->_rw, absoluteByteOffset, RW_SEEK_SET) < 0) { return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; @@ -207,7 +207,7 @@ namespace OpenRCT2::Audio static FLAC__StreamDecoderTellStatus FlacCallbackTell( const FLAC__StreamDecoder* decoder, FLAC__uint64* absoluteByteOffset, void* clientData) { - auto* self = reinterpret_cast(clientData); + auto* self = static_cast(clientData); auto pos = SDL_RWtell(self->_rw); if (pos < 0) { @@ -223,7 +223,7 @@ namespace OpenRCT2::Audio static FLAC__StreamDecoderLengthStatus FlacCallbackLength( const FLAC__StreamDecoder* decoder, FLAC__uint64* streamLength, void* clientData) { - auto* self = reinterpret_cast(clientData); + auto* self = static_cast(clientData); auto pos = SDL_RWtell(self->_rw); auto length = SDL_RWseek(self->_rw, 0, RW_SEEK_END); if (SDL_RWseek(self->_rw, pos, RW_SEEK_SET) != pos || length < 0) @@ -239,7 +239,7 @@ namespace OpenRCT2::Audio static FLAC__bool FlacCallbackEof(const FLAC__StreamDecoder* decoder, void* clientData) { - auto* self = reinterpret_cast(clientData); + auto* self = static_cast(clientData); auto pos = SDL_RWtell(self->_rw); auto end = SDL_RWseek(self->_rw, 0, RW_SEEK_END); if (pos == end) @@ -256,7 +256,7 @@ namespace OpenRCT2::Audio static FLAC__StreamDecoderWriteStatus FlacCallbackWrite( const FLAC__StreamDecoder* decoder, const FLAC__Frame* frame, const FLAC__int32* const buffer[], void* clientData) { - auto* self = reinterpret_cast(clientData); + auto* self = static_cast(clientData); // Determine sizes auto channels = self->_format.channels; @@ -301,7 +301,7 @@ namespace OpenRCT2::Audio static void FlacCallbackMetadata( const FLAC__StreamDecoder* decoder, const FLAC__StreamMetadata* metadata, void* clientData) { - auto* self = reinterpret_cast(clientData); + auto* self = static_cast(clientData); if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { self->_bitsPerSample = metadata->data.stream_info.bits_per_sample; diff --git a/src/openrct2-ui/audio/MemoryAudioSource.cpp b/src/openrct2-ui/audio/MemoryAudioSource.cpp index 696bd4293fae..f30be731e561 100644 --- a/src/openrct2-ui/audio/MemoryAudioSource.cpp +++ b/src/openrct2-ui/audio/MemoryAudioSource.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -55,7 +55,7 @@ namespace OpenRCT2::Audio auto src = _data.data(); if (src != nullptr) { - std::copy_n(src + offset, bytesToRead, reinterpret_cast(dst)); + std::copy_n(src + offset, bytesToRead, static_cast(dst)); } } return bytesToRead; diff --git a/src/openrct2-ui/audio/OggAudioSource.cpp b/src/openrct2-ui/audio/OggAudioSource.cpp index 99f07f046fd8..b7f92a33566c 100644 --- a/src/openrct2-ui/audio/OggAudioSource.cpp +++ b/src/openrct2-ui/audio/OggAudioSource.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -101,7 +101,7 @@ namespace OpenRCT2::Audio } auto readLen = static_cast(len); - auto dst8 = reinterpret_cast(dst); + auto dst8 = static_cast(dst); int64_t totalBytesRead{}; int64_t bytesRead; do @@ -139,17 +139,17 @@ namespace OpenRCT2::Audio private: static size_t VorbisCallbackRead(void* ptr, size_t size, size_t nmemb, void* datasource) { - return SDL_RWread(reinterpret_cast(datasource), ptr, size, nmemb); + return SDL_RWread(static_cast(datasource), ptr, size, nmemb); } static int VorbisCallbackSeek(void* datasource, ogg_int64_t offset, int whence) { - return (SDL_RWseek(reinterpret_cast(datasource), offset, whence) < 0) ? -1 : 0; + return (SDL_RWseek(static_cast(datasource), offset, whence) < 0) ? -1 : 0; } static long VorbisCallbackTell(void* datasource) { - return static_cast(SDL_RWtell(reinterpret_cast(datasource))); + return static_cast(SDL_RWtell(static_cast(datasource))); } }; #endif diff --git a/src/openrct2-ui/audio/SDLAudioSource.cpp b/src/openrct2-ui/audio/SDLAudioSource.cpp index d7d26f5ff85c..abf3d0070aab 100644 --- a/src/openrct2-ui/audio/SDLAudioSource.cpp +++ b/src/openrct2-ui/audio/SDLAudioSource.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/audio/SDLAudioSource.h b/src/openrct2-ui/audio/SDLAudioSource.h index a5d966827a11..c454e1ad3a5f 100644 --- a/src/openrct2-ui/audio/SDLAudioSource.h +++ b/src/openrct2-ui/audio/SDLAudioSource.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/audio/WavAudioSource.cpp b/src/openrct2-ui/audio/WavAudioSource.cpp index 5b6e12ff8b6d..e5e549825109 100644 --- a/src/openrct2-ui/audio/WavAudioSource.cpp +++ b/src/openrct2-ui/audio/WavAudioSource.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/BitmapReader.cpp b/src/openrct2-ui/drawing/BitmapReader.cpp index 17b168b4d42d..8abdfa16d8d1 100644 --- a/src/openrct2-ui/drawing/BitmapReader.cpp +++ b/src/openrct2-ui/drawing/BitmapReader.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/BitmapReader.h b/src/openrct2-ui/drawing/BitmapReader.h index a161f9303ddb..20172f14ef6f 100644 --- a/src/openrct2-ui/drawing/BitmapReader.h +++ b/src/openrct2-ui/drawing/BitmapReader.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp b/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp index e582fa59900c..ba171cde389e 100644 --- a/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp +++ b/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp index f58f25f74b51..4437f785b966 100644 --- a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.cpp b/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.cpp index 191edfd6bf9e..2e7ecbe87aaf 100644 --- a/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.h b/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.h index a664fc19f0bc..bb35c6f9214b 100644 --- a/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.h +++ b/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.cpp b/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.cpp index 15bc824d4c9b..a04639213590 100644 --- a/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.h b/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.h index be08972f9d35..7f7f544b5553 100644 --- a/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.h +++ b/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/CopyRectShader.cpp b/src/openrct2-ui/drawing/engines/opengl/CopyRectShader.cpp index 9c70d892b30d..5db2f78464e5 100644 --- a/src/openrct2-ui/drawing/engines/opengl/CopyRectShader.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/CopyRectShader.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/CopyRectShader.h b/src/openrct2-ui/drawing/engines/opengl/CopyRectShader.h index 90c89a3e7676..2faa9ede10d6 100644 --- a/src/openrct2-ui/drawing/engines/opengl/CopyRectShader.h +++ b/src/openrct2-ui/drawing/engines/opengl/CopyRectShader.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/DrawCommands.h b/src/openrct2-ui/drawing/engines/opengl/DrawCommands.h index cdd4071a8c2b..c814a7b85b27 100644 --- a/src/openrct2-ui/drawing/engines/opengl/DrawCommands.h +++ b/src/openrct2-ui/drawing/engines/opengl/DrawCommands.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.cpp b/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.cpp index 5e896f8a9f68..6068134feaa1 100644 --- a/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.h b/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.h index 58145ee9e570..6f09b825621a 100644 --- a/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.h +++ b/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.cpp b/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.cpp index 32d46bdbf79e..d12a64e1a0ba 100644 --- a/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.h b/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.h index 38e67c8c69f0..13684402b46a 100644 --- a/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.h +++ b/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/GLSLTypes.h b/src/openrct2-ui/drawing/engines/opengl/GLSLTypes.h index 8fa8911a5f58..949897ab8027 100644 --- a/src/openrct2-ui/drawing/engines/opengl/GLSLTypes.h +++ b/src/openrct2-ui/drawing/engines/opengl/GLSLTypes.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp index 34256753302d..8a6eaa6b57f4 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h index 93f4f3192706..24599e640140 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h index ac03cdefa0f9..9feaef12e08e 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp index d26f5b456c3b..ba7e1172cb5d 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -115,15 +115,17 @@ class OpenGLDrawingContext final : public IDrawingContext void StartNewDraw(); void FinishDraw(); - void Clear(RenderTarget& rt, uint8_t paletteIndex) override; - void FillRect(RenderTarget& rt, uint32_t colour, int32_t x, int32_t y, int32_t w, int32_t h) override; + void Clear(RenderTarget& rt, PaletteIndex paletteIndex) override; + void FillRect( + RenderTarget& rt, PaletteIndex paletteIndex, int32_t x, int32_t y, int32_t w, int32_t h, + bool crossHatch = false) override; void FilterRect( RenderTarget& rt, FilterPaletteID palette, int32_t left, int32_t top, int32_t right, int32_t bottom) override; - void DrawLine(RenderTarget& rt, uint32_t colour, const ScreenLine& line) override; + void DrawLine(RenderTarget& rt, PaletteIndex colour, const ScreenLine& line) override; void DrawSprite(RenderTarget& rt, const ImageId imageId, int32_t x, int32_t y) override; void DrawSpriteRawMasked( RenderTarget& rt, int32_t x, int32_t y, const ImageId maskImage, const ImageId colourImage) override; - void DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, uint8_t colour) override; + void DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, PaletteIndex colour) override; void DrawGlyph(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, const PaletteMap& palette) override; void DrawTTFBitmap( RenderTarget& rt, TextDrawInfo* info, TTFSurface* surface, int32_t x, int32_t y, uint8_t hintingThreshold) override; @@ -175,7 +177,7 @@ class OpenGLWeatherDrawer final : public IWeatherDrawer uint32_t xPixelOffset = pixelOffset; xPixelOffset += (static_cast(patternX - patternStartXOffset)) % patternXSpace; - auto patternPixel = pattern[patternYPos * 2 + 1]; + auto patternPixel = static_cast(pattern[patternYPos * 2 + 1]); for (; xPixelOffset < finalPixelOffset; xPixelOffset += patternXSpace) { int32_t pixelX = xPixelOffset % rt.width; @@ -518,7 +520,7 @@ class OpenGLDrawingEngine final : public IDrawingEngine return _drawingContext.get(); } - RenderTarget* GetDrawingPixelInfo() override + RenderTarget* getRT() override { return &_mainRT; } @@ -533,11 +535,6 @@ class OpenGLDrawingEngine final : public IDrawingEngine _drawingContext->GetTextureCache()->InvalidateImage(image); } - RenderTarget* GetDPI() - { - return &_mainRT; - } - private: static OpenGLVersion GetOpenGLVersion() { @@ -682,14 +679,15 @@ void OpenGLDrawingContext::FinishDraw() _inDraw = false; } -void OpenGLDrawingContext::Clear(RenderTarget& rt, uint8_t paletteIndex) +void OpenGLDrawingContext::Clear(RenderTarget& rt, PaletteIndex paletteIndex) { Guard::Assert(_inDraw == true); FillRect(rt, paletteIndex, rt.x, rt.y, rt.x + rt.width, rt.y + rt.height); } -void OpenGLDrawingContext::FillRect(RenderTarget& rt, uint32_t colour, int32_t left, int32_t top, int32_t right, int32_t bottom) +void OpenGLDrawingContext::FillRect( + RenderTarget& rt, PaletteIndex paletteIndex, int32_t left, int32_t top, int32_t right, int32_t bottom, bool crossHatch) { Guard::Assert(_inDraw == true); @@ -708,22 +706,17 @@ void OpenGLDrawingContext::FillRect(RenderTarget& rt, uint32_t colour, int32_t l command.texMaskAtlas = 0; command.texMaskBounds = { 0.0f, 0.0f, 0.0f, 0.0f }; command.palettes = { 0, 0, 0 }; - command.colour = colour & 0xFF; + command.colour = EnumValue(paletteIndex); command.bounds = { left, top, right + 1, bottom + 1 }; command.flags = DrawRectCommand::FLAG_NO_TEXTURE; command.depth = _drawCount++; command.zoom = 1.0f; - if (colour & 0x1000000) + if (crossHatch) { // cross-pattern command.flags |= DrawRectCommand::FLAG_CROSS_HATCH; } - else if (colour & 0x2000000) - { - assert(false); - // Should be FilterRect - } } void OpenGLDrawingContext::FilterRect( @@ -837,7 +830,7 @@ bool OpenGLDrawingContext::CohenSutherlandLineClip(ScreenLine& line, const Rende } } -void OpenGLDrawingContext::DrawLine(RenderTarget& rt, uint32_t colour, const ScreenLine& line) +void OpenGLDrawingContext::DrawLine(RenderTarget& rt, PaletteIndex colour, const ScreenLine& line) { Guard::Assert(_inDraw == true); @@ -856,7 +849,7 @@ void OpenGLDrawingContext::DrawLine(RenderTarget& rt, uint32_t colour, const Scr const int32_t y2 = trimmedLine.GetY2() - rt.y + clip.GetTop(); command.bounds = { x1, y1, x2, y2 }; - command.colour = colour & 0xFF; + command.colour = static_cast(colour); command.depth = _drawCount++; } @@ -878,7 +871,7 @@ void OpenGLDrawingContext::DrawSprite(RenderTarget& rt, const ImageId imageId, c if (rt.zoom_level > ZoomLevel{ 0 }) { - if (g1Element->flags & G1_FLAG_HAS_ZOOM_SPRITE) + if (g1Element->flags.has(G1Flag::hasZoomSprite)) { RenderTarget zoomedRT; zoomedRT.bits = rt.bits; @@ -888,10 +881,10 @@ void OpenGLDrawingContext::DrawSprite(RenderTarget& rt, const ImageId imageId, c zoomedRT.width = rt.width; zoomedRT.pitch = rt.pitch; zoomedRT.zoom_level = rt.zoom_level - 1; - DrawSprite(zoomedRT, imageId.WithIndex(imageId.GetIndex() - g1Element->zoomed_offset), x >> 1, y >> 1); + DrawSprite(zoomedRT, imageId.WithIndex(imageId.GetIndex() - g1Element->zoomedOffset), x >> 1, y >> 1); return; } - if (g1Element->flags & G1_FLAG_NO_ZOOM_DRAW) + if (g1Element->flags.has(G1Flag::noZoomDraw)) { return; } @@ -899,8 +892,8 @@ void OpenGLDrawingContext::DrawSprite(RenderTarget& rt, const ImageId imageId, c auto texture = _textureCache->GetOrLoadImageTexture(imageId); - int32_t left = x + g1Element->x_offset; - int32_t top = y + g1Element->y_offset; + int32_t left = x + g1Element->xOffset; + int32_t top = y + g1Element->yOffset; int32_t xModifier = 0; int32_t yModifier = 0; @@ -1015,8 +1008,8 @@ void OpenGLDrawingContext::DrawSpriteRawMasked( const auto textureMask = _textureCache->GetOrLoadImageTexture(maskImage); const auto textureColour = _textureCache->GetOrLoadImageTexture(colourImage); - int32_t drawOffsetX = g1ElementMask->x_offset; - int32_t drawOffsetY = g1ElementMask->y_offset; + int32_t drawOffsetX = g1ElementMask->xOffset; + int32_t drawOffsetY = g1ElementMask->yOffset; int32_t drawWidth = std::min(g1ElementMask->width, g1ElementColour->width); int32_t drawHeight = std::min(g1ElementMask->height, g1ElementColour->height); @@ -1063,7 +1056,7 @@ void OpenGLDrawingContext::DrawSpriteRawMasked( command.zoom = zoom; } -void OpenGLDrawingContext::DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, uint8_t colour) +void OpenGLDrawingContext::DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, PaletteIndex colour) { Guard::Assert(_inDraw == true); @@ -1075,8 +1068,8 @@ void OpenGLDrawingContext::DrawSpriteSolid(RenderTarget& rt, const ImageId image const auto texture = _textureCache->GetOrLoadImageTexture(image); - int32_t drawOffsetX = g1Element->x_offset; - int32_t drawOffsetY = g1Element->y_offset; + int32_t drawOffsetX = g1Element->xOffset; + int32_t drawOffsetY = g1Element->yOffset; int32_t drawWidth = static_cast(g1Element->width); int32_t drawHeight = static_cast(g1Element->height); @@ -1109,7 +1102,7 @@ void OpenGLDrawingContext::DrawSpriteSolid(RenderTarget& rt, const ImageId image command.texMaskBounds = texture.coords; command.palettes = { 0, 0, 0 }; command.flags = DrawRectCommand::FLAG_NO_TEXTURE | DrawRectCommand::FLAG_MASK; - command.colour = colour & 0xFF; + command.colour = static_cast(colour); command.bounds = { left, top, right, bottom }; command.depth = _drawCount++; command.zoom = 1.0f; @@ -1127,8 +1120,8 @@ void OpenGLDrawingContext::DrawGlyph(RenderTarget& rt, const ImageId image, int3 const auto texture = _textureCache->GetOrLoadGlyphTexture(image, palette); - int32_t left = x + g1Element->x_offset; - int32_t top = y + g1Element->y_offset; + int32_t left = x + g1Element->xOffset; + int32_t top = y + g1Element->yOffset; int32_t right = left + static_cast(g1Element->width); int32_t bottom = top + static_cast(g1Element->height); @@ -1229,7 +1222,7 @@ void OpenGLDrawingContext::DrawTTFBitmap( command.texMaskBounds = { 0.0f, 0.0f, 0.0f, 0.0f }; command.palettes = { 0, 0, 0 }; command.flags = DrawRectCommand::FLAG_TTF_TEXT; - command.colour = info->palette[3]; + command.colour = static_cast(info->palette.shadowOutline); command.bounds = b; command.depth = _drawCount++; command.zoom = 1.0f; @@ -1245,7 +1238,7 @@ void OpenGLDrawingContext::DrawTTFBitmap( command.texMaskBounds = { 0.0f, 0.0f, 0.0f, 0.0f }; command.palettes = { 0, 0, 0 }; command.flags = DrawRectCommand::FLAG_TTF_TEXT; - command.colour = info->palette[3]; + command.colour = static_cast(info->palette.shadowOutline); command.bounds = { left + 1, top + 1, right + 1, bottom + 1 }; command.depth = _drawCount++; command.zoom = 1.0f; @@ -1259,7 +1252,7 @@ void OpenGLDrawingContext::DrawTTFBitmap( command.texMaskBounds = { 0.0f, 0.0f, 0.0f, 0.0f }; command.palettes = { 0, 0, 0 }; command.flags = DrawRectCommand::FLAG_TTF_TEXT | (hintingThreshold << 8); - command.colour = info->palette[1]; + command.colour = static_cast(info->palette.fill); command.bounds = { left, top, right, bottom }; command.depth = _drawCount++; command.zoom = 1.0f; @@ -1349,7 +1342,7 @@ ScreenRect OpenGLDrawingContext::CalculateClipping(const RenderTarget& rt) const { // mber: Calculating the screen coordinates by dividing the difference between pointers like this is a dirty hack. // It's also quite slow. In future the drawing code needs to be refactored to avoid this somehow. - const RenderTarget* mainRT = _engine.GetDPI(); + const RenderTarget* mainRT = _engine.getRT(); const int32_t bytesPerRow = mainRT->LineStride(); const int32_t bitsOffset = static_cast(rt.bits - mainRT->bits); #ifndef NDEBUG diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.cpp index 0c60599bbb02..0dfc5bbb4b0d 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -180,7 +180,7 @@ GLuint OpenGLFramebuffer::CreateDepthTexture(int32_t width, int32_t height) return depth; } -void OpenGLFramebuffer::GetPixels(RenderTarget& rt) const +void OpenGLFramebuffer::GetPixels(Drawing::RenderTarget& rt) const { assert(rt.width == _width && rt.height == _height); @@ -200,7 +200,7 @@ void OpenGLFramebuffer::GetPixels(RenderTarget& rt) const } } -void OpenGLFramebuffer::SetPixels(const RenderTarget& rt) +void OpenGLFramebuffer::SetPixels(const Drawing::RenderTarget& rt) { assert(rt.width == _width && rt.height == _height); diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.h b/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.h index 0507a049fe01..2e1c86490053 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.h +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,7 +11,7 @@ #include "OpenGLAPI.h" -#include +#include #include struct SDL_Window; @@ -58,12 +58,12 @@ namespace OpenRCT2::Ui void Bind() const; void BindDraw() const; void BindRead() const; - void GetPixels(RenderTarget& rt) const; + void GetPixels(Drawing::RenderTarget& rt) const; void SwapColourBuffer(OpenGLFramebuffer& other); GLuint SwapDepthTexture(GLuint depth); void Copy(OpenGLFramebuffer& src, GLenum filter); - void SetPixels(const RenderTarget& rt); + void SetPixels(const Drawing::RenderTarget& rt); static GLuint CreateDepthTexture(int32_t width, int32_t height); }; diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.cpp index 7634c16ffa59..de9d3b275a19 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.h b/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.h index 556a509fe34f..4bbe712c9741 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.h +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.cpp b/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.cpp index daf44030257f..07f6dd2bd1eb 100644 --- a/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.h b/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.h index b3e982c33cd1..8b7e54619bbc 100644 --- a/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.h +++ b/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp b/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp index 1f290cde6f15..d572b45d51d7 100644 --- a/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -102,12 +102,12 @@ BasicTextureInfo TextureCache::GetOrLoadGlyphTexture(const ImageId imageId, cons // Try to read cached texture first. { - uint8_t glyphMap[8]; + PaletteIndex glyphMap[8]; for (uint8_t i = 0; i < 8; i++) { glyphMap[i] = paletteMap[i]; } - std::copy_n(glyphMap, sizeof(glyphId.Palette), reinterpret_cast(&glyphId.Palette)); + std::copy_n(glyphMap, sizeof(glyphId.Palette), reinterpret_cast(&glyphId.Palette)); auto kvp = _glyphTextureMap.find(glyphId); if (kvp != _glyphTextureMap.end()) @@ -208,7 +208,7 @@ void TextureCache::GeneratePaletteTexture() static_assert(kPaletteTotalOffsets + 5 < 256, "Height of palette too large!"); constexpr int32_t height = 256; constexpr int32_t width = height; - RenderTarget rt = CreateDPI(width, height); + RenderTarget rt = CreateRT(width, height); // Init no-op palette for (int i = 0; i < width; ++i) @@ -218,22 +218,23 @@ void TextureCache::GeneratePaletteTexture() for (int i = 0; i < kPaletteTotalOffsets; ++i) { - GLint y = PaletteToY(static_cast(i)); + auto filterPaletteId = static_cast(i); + GLint y = PaletteToY(filterPaletteId); - auto g1Index = GetPaletteG1Index(i); + auto g1Index = GetPaletteG1Index(filterPaletteId); if (g1Index.has_value()) { const auto* element = GfxGetG1Element(g1Index.value()); if (element != nullptr) { - GfxDrawSpriteSoftware(rt, ImageId(g1Index.value()), { -element->x_offset, y - element->y_offset }); + GfxDrawSpriteSoftware(rt, ImageId(g1Index.value()), { -element->xOffset, y - element->yOffset }); } } } glCall(glBindTexture, GL_TEXTURE_2D, _paletteTexture); glCall(glTexImage2D, GL_TEXTURE_2D, 0, GL_R8UI, width, height, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, rt.bits); - DeleteDPI(rt); + DeleteRT(rt); } void TextureCache::EnlargeAtlasesTexture(GLuint newEntries) @@ -275,7 +276,7 @@ void TextureCache::EnlargeAtlasesTexture(GLuint newEntries) AtlasTextureInfo TextureCache::LoadImageTexture(const ImageId imageId) { - RenderTarget rt = GetImageAsDPI(ImageId(imageId.GetIndex())); + RenderTarget rt = GetImageAsRT(ImageId(imageId.GetIndex())); auto cacheInfo = AllocateImage(rt.width, rt.height); cacheInfo.image = imageId.GetIndex(); @@ -285,14 +286,14 @@ AtlasTextureInfo TextureCache::LoadImageTexture(const ImageId imageId) glTexSubImage3D, GL_TEXTURE_2D_ARRAY, 0, cacheInfo.bounds.x, cacheInfo.bounds.y, cacheInfo.index, rt.width, rt.height, 1, GL_RED_INTEGER, GL_UNSIGNED_BYTE, rt.bits); - DeleteDPI(rt); + DeleteRT(rt); return cacheInfo; } AtlasTextureInfo TextureCache::LoadGlyphTexture(const ImageId imageId, const PaletteMap& paletteMap) { - RenderTarget rt = GetGlyphAsDPI(imageId, paletteMap); + RenderTarget rt = GetGlyphAsRT(imageId, paletteMap); auto cacheInfo = AllocateImage(rt.width, rt.height); cacheInfo.image = imageId.GetIndex(); @@ -302,7 +303,7 @@ AtlasTextureInfo TextureCache::LoadGlyphTexture(const ImageId imageId, const Pal glTexSubImage3D, GL_TEXTURE_2D_ARRAY, 0, cacheInfo.bounds.x, cacheInfo.bounds.y, cacheInfo.index, rt.width, rt.height, 1, GL_RED_INTEGER, GL_UNSIGNED_BYTE, rt.bits); - DeleteDPI(rt); + DeleteRT(rt); return cacheInfo; } @@ -354,26 +355,26 @@ AtlasTextureInfo TextureCache::AllocateImage(int32_t imageWidth, int32_t imageHe return _atlases.back().Allocate(imageWidth, imageHeight); } -RenderTarget TextureCache::GetImageAsDPI(const ImageId imageId) +RenderTarget TextureCache::GetImageAsRT(const ImageId imageId) { auto g1Element = GfxGetG1Element(imageId); int32_t width = g1Element->width; int32_t height = g1Element->height; - RenderTarget rt = CreateDPI(width, height); - GfxDrawSpriteSoftware(rt, imageId, { -g1Element->x_offset, -g1Element->y_offset }); + RenderTarget rt = CreateRT(width, height); + GfxDrawSpriteSoftware(rt, imageId, { -g1Element->xOffset, -g1Element->yOffset }); return rt; } -RenderTarget TextureCache::GetGlyphAsDPI(const ImageId imageId, const PaletteMap& palette) +RenderTarget TextureCache::GetGlyphAsRT(const ImageId imageId, const PaletteMap& palette) { auto g1Element = GfxGetG1Element(imageId); int32_t width = g1Element->width; int32_t height = g1Element->height; - RenderTarget rt = CreateDPI(width, height); + RenderTarget rt = CreateRT(width, height); - const auto glyphCoords = ScreenCoordsXY{ -g1Element->x_offset, -g1Element->y_offset }; + const auto glyphCoords = ScreenCoordsXY{ -g1Element->xOffset, -g1Element->yOffset }; GfxDrawSpritePaletteSetSoftware(rt, imageId, glyphCoords, palette); return rt; } @@ -386,7 +387,7 @@ void TextureCache::FreeTextures() std::fill(_indexMap.begin(), _indexMap.end(), kUnusedIndex); } -RenderTarget TextureCache::CreateDPI(int32_t width, int32_t height) +RenderTarget TextureCache::CreateRT(int32_t width, int32_t height) { size_t numPixels = width * height; auto pixels8 = new uint8_t[numPixels]; @@ -403,7 +404,7 @@ RenderTarget TextureCache::CreateDPI(int32_t width, int32_t height) return rt; } -void TextureCache::DeleteDPI(RenderTarget rt) +void TextureCache::DeleteRT(RenderTarget rt) { delete[] rt.bits; } diff --git a/src/openrct2-ui/drawing/engines/opengl/TextureCache.h b/src/openrct2-ui/drawing/engines/opengl/TextureCache.h index 513995b50f4b..8329853632b8 100644 --- a/src/openrct2-ui/drawing/engines/opengl/TextureCache.h +++ b/src/openrct2-ui/drawing/engines/opengl/TextureCache.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,14 +15,17 @@ #include #include #include -#include #include #include #include -struct RenderTarget; struct PaletteMap; -enum class FilterPaletteID : int32_t; + +namespace OpenRCT2::Drawing +{ + enum class FilterPaletteID : int32_t; + struct RenderTarget; +} // namespace OpenRCT2::Drawing namespace OpenRCT2::Ui { @@ -211,7 +214,7 @@ namespace OpenRCT2::Ui GLuint GetAtlasesTexture(); GLuint GetPaletteTexture(); GLuint GetBlendPaletteTexture(); - static GLint PaletteToY(FilterPaletteID palette); + static GLint PaletteToY(Drawing::FilterPaletteID palette); private: void CreateTextures(); @@ -221,11 +224,11 @@ namespace OpenRCT2::Ui AtlasTextureInfo LoadGlyphTexture(const ImageId image, const PaletteMap& paletteMap); AtlasTextureInfo AllocateImage(int32_t imageWidth, int32_t imageHeight); AtlasTextureInfo LoadBitmapTexture(ImageIndex image, const void* pixels, size_t width, size_t height); - static RenderTarget GetImageAsDPI(const ImageId imageId); - static RenderTarget GetGlyphAsDPI(const ImageId imageId, const PaletteMap& paletteMap); + static Drawing::RenderTarget GetImageAsRT(const ImageId imageId); + static Drawing::RenderTarget GetGlyphAsRT(const ImageId imageId, const PaletteMap& paletteMap); void FreeTextures(); - static RenderTarget CreateDPI(int32_t width, int32_t height); - static void DeleteDPI(RenderTarget rt); + static Drawing::RenderTarget CreateRT(int32_t width, int32_t height); + static void DeleteRT(Drawing::RenderTarget rt); }; } // namespace OpenRCT2::Ui diff --git a/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.cpp b/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.cpp index 09a070bfd33d..dd2d555703ea 100644 --- a/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.h b/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.h index fdcac5547618..b4358c4d2f33 100644 --- a/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.h +++ b/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/input/InputManager.cpp b/src/openrct2-ui/input/InputManager.cpp index 3ccf5f8b393e..a32f21ec2d87 100644 --- a/src/openrct2-ui/input/InputManager.cpp +++ b/src/openrct2-ui/input/InputManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/input/InputManager.h b/src/openrct2-ui/input/InputManager.h index dd0a20d91255..c9cf6ce8dd8a 100644 --- a/src/openrct2-ui/input/InputManager.h +++ b/src/openrct2-ui/input/InputManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/input/MouseInput.cpp b/src/openrct2-ui/input/MouseInput.cpp index b388897cd1de..bf8c830b7e0f 100644 --- a/src/openrct2-ui/input/MouseInput.cpp +++ b/src/openrct2-ui/input/MouseInput.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -211,7 +211,7 @@ namespace OpenRCT2 if (scroll.flags & HSCROLLBAR_VISIBLE) { - int16_t size = widget.width() - 1; + int16_t size = widget.width() - 2; if (scroll.flags & VSCROLLBAR_VISIBLE) size -= 11; size = std::max(0, scroll.contentWidth - size); @@ -220,7 +220,7 @@ namespace OpenRCT2 if (scroll.flags & VSCROLLBAR_VISIBLE) { - int16_t size = widget.height() - 1; + int16_t size = widget.height() - 2; if (scroll.flags & HSCROLLBAR_VISIBLE) size -= 11; size = std::max(0, scroll.contentHeight - size); @@ -397,7 +397,7 @@ namespace OpenRCT2 break; if (w->classification != _dragWidget.windowClassification || w->number != _dragWidget.windowNumber - || !(gInputFlags.has(InputFlag::toolActive))) + || !gInputFlags.has(InputFlag::toolActive)) { break; } @@ -490,9 +490,7 @@ namespace OpenRCT2 static void InputWindowPositionContinue( WindowBase& w, const ScreenCoordsXY& lastScreenCoords, const ScreenCoordsXY& newScreenCoords) { - int32_t snapProximity; - - snapProximity = (w.flags.has(WindowFlag::noSnapping)) ? 0 : Config::Get().general.windowSnapProximity; + int32_t snapProximity = w.flags.has(WindowFlag::noSnapping) ? 0 : Config::Get().general.windowSnapProximity; WindowMoveAndSnap(w, newScreenCoords - lastScreenCoords, snapProximity); } @@ -517,7 +515,7 @@ namespace OpenRCT2 static void InputWindowResizeContinue(WindowBase& w, const ScreenCoordsXY& screenCoords) { - if (screenCoords.y < static_cast(ContextGetHeight()) - 2) + if (screenCoords.y < (ContextGetHeight() - 2)) { auto differentialCoords = screenCoords - gInputDragLast; int32_t targetWidth = _originalWindowWidth + differentialCoords.x - w.width; @@ -591,7 +589,7 @@ namespace OpenRCT2 } else if (differentialCoords.x != 0 || differentialCoords.y != 0) { - if (!(w->flags.has(WindowFlag::noScrolling))) + if (!w->flags.has(WindowFlag::noScrolling)) { // User dragged a scrollable viewport @@ -671,7 +669,7 @@ namespace OpenRCT2 const auto& widg = w.widgets[widgetIndex]; auto& scroll = w.scrolls[scroll_id]; - int32_t widget_width = widg.width() - 1; + int32_t widget_width = widg.width() - 2; if (scroll.flags & VSCROLLBAR_VISIBLE) widget_width -= kScrollBarWidth + 1; int32_t widget_content_width = std::max(scroll.contentWidth - widget_width, 0); @@ -794,7 +792,7 @@ namespace OpenRCT2 int32_t newLeft; newLeft = scroll.contentWidth; newLeft *= x; - x = widget.width() - 21; + x = widget.width() - 22; if (scroll.flags & VSCROLLBAR_VISIBLE) x -= kScrollBarWidth + 1; newLeft /= x; @@ -804,7 +802,7 @@ namespace OpenRCT2 newLeft += x; if (newLeft < 0) newLeft = 0; - x = widget.width() - 1; + x = widget.width() - 2; if (scroll.flags & VSCROLLBAR_VISIBLE) x -= kScrollBarWidth + 1; x *= -1; @@ -834,7 +832,7 @@ namespace OpenRCT2 int32_t newTop; newTop = scroll.contentHeight; newTop *= y; - y = widget.height() - 21; + y = widget.height() - 22; if (scroll.flags & HSCROLLBAR_VISIBLE) y -= kScrollBarWidth + 1; newTop /= y; @@ -844,7 +842,7 @@ namespace OpenRCT2 newTop += y; if (newTop < 0) newTop = 0; - y = widget.height() - 1; + y = widget.height() - 2; if (scroll.flags & HSCROLLBAR_VISIBLE) y -= kScrollBarWidth + 1; y *= -1; @@ -891,7 +889,7 @@ namespace OpenRCT2 auto& scroll = w.scrolls[scroll_id]; scroll.flags |= HSCROLLBAR_RIGHT_PRESSED; scroll.contentOffsetX += 3; - int32_t newLeft = widget.width() - 1; + int32_t newLeft = widget.width() - 2; if (scroll.flags & VSCROLLBAR_VISIBLE) newLeft -= kScrollBarWidth + 1; newLeft *= -1; @@ -937,7 +935,7 @@ namespace OpenRCT2 auto& scroll = w.scrolls[scroll_id]; scroll.flags |= VSCROLLBAR_DOWN_PRESSED; scroll.contentOffsetY += 3; - int32_t newTop = widget.height() - 1; + int32_t newTop = widget.height() - 2; if (scroll.flags & HSCROLLBAR_VISIBLE) newTop -= kScrollBarWidth + 1; newTop *= -1; @@ -1603,7 +1601,7 @@ namespace OpenRCT2 mainWindow = WindowGetMain(); if (mainWindow == nullptr) return; - if ((mainWindow->flags.has(WindowFlag::noScrolling)) + if (mainWindow->flags.has(WindowFlag::noScrolling) || (gLegacyScene == LegacyScene::trackDesignsManager || gLegacyScene == LegacyScene::titleSequence)) return; if (mainWindow->viewport == nullptr) diff --git a/src/openrct2-ui/input/MouseInput.h b/src/openrct2-ui/input/MouseInput.h index f87172e812ba..b86dd3d61f19 100644 --- a/src/openrct2-ui/input/MouseInput.h +++ b/src/openrct2-ui/input/MouseInput.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/input/ShortcutIds.h b/src/openrct2-ui/input/ShortcutIds.h index f81169e644ff..18ca1b7b43fb 100644 --- a/src/openrct2-ui/input/ShortcutIds.h +++ b/src/openrct2-ui/input/ShortcutIds.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/input/ShortcutInput.cpp b/src/openrct2-ui/input/ShortcutInput.cpp index 193722340625..106636cbadce 100644 --- a/src/openrct2-ui/input/ShortcutInput.cpp +++ b/src/openrct2-ui/input/ShortcutInput.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/input/ShortcutManager.cpp b/src/openrct2-ui/input/ShortcutManager.cpp index 5a2f321a51f0..5b913be2128a 100644 --- a/src/openrct2-ui/input/ShortcutManager.cpp +++ b/src/openrct2-ui/input/ShortcutManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/input/ShortcutManager.h b/src/openrct2-ui/input/ShortcutManager.h index 50fcd7ae288c..87d6f0e4f15a 100644 --- a/src/openrct2-ui/input/ShortcutManager.h +++ b/src/openrct2-ui/input/ShortcutManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/input/Shortcuts.cpp b/src/openrct2-ui/input/Shortcuts.cpp index df517933d3b6..f15757c67321 100644 --- a/src/openrct2-ui/input/Shortcuts.cpp +++ b/src/openrct2-ui/input/Shortcuts.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include diff --git a/src/openrct2-ui/interface/Dropdown.h b/src/openrct2-ui/interface/Dropdown.h index ccb41849a72a..dd9dbfeedcf5 100644 --- a/src/openrct2-ui/interface/Dropdown.h +++ b/src/openrct2-ui/interface/Dropdown.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/FileBrowser.cpp b/src/openrct2-ui/interface/FileBrowser.cpp index ab7a0539c318..bff761d54e4d 100644 --- a/src/openrct2-ui/interface/FileBrowser.cpp +++ b/src/openrct2-ui/interface/FileBrowser.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,9 @@ #include #include #include +#include #include +#include #include #include #include diff --git a/src/openrct2-ui/interface/FileBrowser.h b/src/openrct2-ui/interface/FileBrowser.h index e2d850106849..806c757352f0 100644 --- a/src/openrct2-ui/interface/FileBrowser.h +++ b/src/openrct2-ui/interface/FileBrowser.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/Graph.cpp b/src/openrct2-ui/interface/Graph.cpp index 6c737fb90939..0421fd2e8f0e 100644 --- a/src/openrct2-ui/interface/Graph.cpp +++ b/src/openrct2-ui/interface/Graph.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,7 @@ #include #include +#include #include #include #include diff --git a/src/openrct2-ui/interface/Graph.h b/src/openrct2-ui/interface/Graph.h index 9d0d63715055..01fa31972e2a 100644 --- a/src/openrct2-ui/interface/Graph.h +++ b/src/openrct2-ui/interface/Graph.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include @@ -68,7 +68,7 @@ namespace OpenRCT2::Graph } }; - void DrawFinanceGraph(RenderTarget& rt, const GraphProperties& p); - void DrawRatingGraph(RenderTarget& rt, const GraphProperties& p); - void DrawGuestGraph(RenderTarget& rt, const GraphProperties& p); + void DrawFinanceGraph(Drawing::RenderTarget& rt, const GraphProperties& p); + void DrawRatingGraph(Drawing::RenderTarget& rt, const GraphProperties& p); + void DrawGuestGraph(Drawing::RenderTarget& rt, const GraphProperties& p); } // namespace OpenRCT2::Graph diff --git a/src/openrct2-ui/interface/InGameConsole.cpp b/src/openrct2-ui/interface/InGameConsole.cpp index 1c2c85685b2c..f63931a85b8b 100644 --- a/src/openrct2-ui/interface/InGameConsole.cpp +++ b/src/openrct2-ui/interface/InGameConsole.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -377,13 +377,13 @@ void InGameConsole::Draw(RenderTarget& rt) const if (_consoleCaretTicks < kConsoleCaretFlashThreshold) { auto caret = screenCoords + ScreenCoordsXY{ _caretScreenPosX, lineHeight }; - uint8_t caretColour = ColourMapA[textColour.colour].lightest; + auto caretColour = ColourMapA[textColour.colour].lightest; Rectangle::fill(rt, { caret, caret + ScreenCoordsXY{ kConsoleCaretWidth, 1 } }, caretColour); } // What about border colours? - uint8_t borderColour1 = ColourMapA[backgroundColour.colour].light; - uint8_t borderColour2 = ColourMapA[backgroundColour.colour].mid_dark; + auto borderColour1 = ColourMapA[backgroundColour.colour].light; + auto borderColour2 = ColourMapA[backgroundColour.colour].mid_dark; // Input area top border Rectangle::fill( diff --git a/src/openrct2-ui/interface/InGameConsole.h b/src/openrct2-ui/interface/InGameConsole.h index fb83b6cd63ff..4608dffb0b84 100644 --- a/src/openrct2-ui/interface/InGameConsole.h +++ b/src/openrct2-ui/interface/InGameConsole.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -69,7 +69,7 @@ namespace OpenRCT2::Ui void Scroll(int32_t linesToScroll); void Update(); - void Draw(RenderTarget& rt) const; + void Draw(Drawing::RenderTarget& rt) const; private: void ClearInput(); diff --git a/src/openrct2-ui/interface/LandTool.cpp b/src/openrct2-ui/interface/LandTool.cpp index 4727a58015c1..f9dc63e6cbc1 100644 --- a/src/openrct2-ui/interface/LandTool.cpp +++ b/src/openrct2-ui/interface/LandTool.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -78,8 +78,8 @@ void LandTool::ShowSurfaceStyleDropdown(WindowBase* w, Widget* widget, ObjectEnt uint32_t surfaceCount = itemIndex; WindowDropdownShowImage( - w->windowPos.x + widget->left, w->windowPos.y + widget->top, widget->height(), w->colours[2], 0, surfaceCount, 47, 36, - DropdownGetAppropriateImageDropdownItemsPerRow(surfaceCount)); + w->windowPos.x + widget->left, w->windowPos.y + widget->top, widget->height() - 1, w->colours[2], 0, surfaceCount, 47, + 36, DropdownGetAppropriateImageDropdownItemsPerRow(surfaceCount)); gDropdown.hasTooltips = true; gDropdown.defaultIndex = defaultIndex; @@ -129,7 +129,7 @@ void LandTool::ShowEdgeStyleDropdown(WindowBase* w, Widget* widget, ObjectEntryI auto itemsPerRow = DropdownGetAppropriateImageDropdownItemsPerRow(edgeCount); WindowDropdownShowImage( - w->windowPos.x + widget->left, w->windowPos.y + widget->top, widget->height(), w->colours[2], 0, edgeCount, 47, 36, + w->windowPos.x + widget->left, w->windowPos.y + widget->top, widget->height() - 1, w->colours[2], 0, edgeCount, 47, 36, itemsPerRow); gDropdown.hasTooltips = true; diff --git a/src/openrct2-ui/interface/LandTool.h b/src/openrct2-ui/interface/LandTool.h index ba700f016158..96387b06b6ce 100644 --- a/src/openrct2-ui/interface/LandTool.h +++ b/src/openrct2-ui/interface/LandTool.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/Objective.cpp b/src/openrct2-ui/interface/Objective.cpp index 760230a0d132..a920005bf9d5 100644 --- a/src/openrct2-ui/interface/Objective.cpp +++ b/src/openrct2-ui/interface/Objective.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/Objective.h b/src/openrct2-ui/interface/Objective.h index 4e8f387b402d..1e08082fde56 100644 --- a/src/openrct2-ui/interface/Objective.h +++ b/src/openrct2-ui/interface/Objective.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/Theme.cpp b/src/openrct2-ui/interface/Theme.cpp index 19e126415b70..fd7f85ab8203 100644 --- a/src/openrct2-ui/interface/Theme.cpp +++ b/src/openrct2-ui/interface/Theme.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/Theme.h b/src/openrct2-ui/interface/Theme.h index 67840fd5a0cd..3eb6352a0ef2 100644 --- a/src/openrct2-ui/interface/Theme.h +++ b/src/openrct2-ui/interface/Theme.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/Viewport.h b/src/openrct2-ui/interface/Viewport.h index fe5029b0fe1f..9ada9ee4c381 100644 --- a/src/openrct2-ui/interface/Viewport.h +++ b/src/openrct2-ui/interface/Viewport.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index 8a7d92cb94fb..f56100e78e57 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -467,7 +467,7 @@ namespace OpenRCT2::Ui break; } - if (!gInputFlags.has(InputFlag::unk6) || !gInputFlags.has(InputFlag::toolActive)) + if (!gInputFlags.has(InputFlag::allowRightMouseRemoval) || !gInputFlags.has(InputFlag::toolActive)) { auto* windowMgr = GetWindowManager(); if (windowMgr->FindByClass(WindowClass::rideConstruction) == nullptr diff --git a/src/openrct2-ui/interface/ViewportInteraction.h b/src/openrct2-ui/interface/ViewportInteraction.h index c060011a61d9..864477762471 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.h +++ b/src/openrct2-ui/interface/ViewportInteraction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/ViewportQuery.cpp b/src/openrct2-ui/interface/ViewportQuery.cpp index e11091b659e4..39909103c4bb 100644 --- a/src/openrct2-ui/interface/ViewportQuery.cpp +++ b/src/openrct2-ui/interface/ViewportQuery.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/ViewportQuery.h b/src/openrct2-ui/interface/ViewportQuery.h index 922cc3bb2ed4..740f577bc07d 100644 --- a/src/openrct2-ui/interface/ViewportQuery.h +++ b/src/openrct2-ui/interface/ViewportQuery.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/interface/Widget.cpp b/src/openrct2-ui/interface/Widget.cpp index 71269ad154e6..3e40efc1913d 100644 --- a/src/openrct2-ui/interface/Widget.cpp +++ b/src/openrct2-ui/interface/Widget.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -382,11 +383,11 @@ namespace OpenRCT2::Ui ScreenCoordsXY coords = { (topLeft.x + r + 1) / 2 - 1, topLeft.y }; if (widget.type == WidgetType::labelCentred) { - DrawTextWrapped(rt, coords, widget.width() - 2, stringId, ft, { colour, TextAlignment::centre }); + DrawTextWrapped(rt, coords, widget.width() - 3, stringId, ft, { colour, TextAlignment::centre }); } else { - DrawTextEllipsised(rt, coords, widget.width() - 2, stringId, ft, { colour, TextAlignment::centre }); + DrawTextEllipsised(rt, coords, widget.width() - 3, stringId, ft, { colour, TextAlignment::centre }); } } @@ -572,7 +573,7 @@ namespace OpenRCT2::Ui return; topLeft = w.windowPos + ScreenCoordsXY{ widget->left + 2, widget->top + 1 }; - int32_t width = widget->width() - 4; + int32_t width = widget->width() - 5; if (static_cast(widgetIndex + 1) < w.widgets.size() && (w.widgets[widgetIndex + 1]).type == WidgetType::closeBox) @@ -622,12 +623,13 @@ namespace OpenRCT2::Ui if (widget.string == nullptr) return; - topLeft = w.windowPos + ScreenCoordsXY{ widget.midX() - 1, std::max(widget.top, widget.midY() - 5) }; + const auto closeButtonTextOffset = Config::Get().interface.enlargedUi ? 5 : 6; + auto crossMidPoint = w.windowPos + ScreenCoordsXY{ widget.midX() - 1, widget.midY() - closeButtonTextOffset }; if (widgetIsDisabled(w, widgetIndex)) colour.flags.set(ColourFlag::inset, true); - DrawText(rt, topLeft, { colour, TextAlignment::centre }, widget.string); + DrawText(rt, crossMidPoint, { colour, TextAlignment::centre }, widget.string); } /** @@ -677,7 +679,7 @@ namespace OpenRCT2::Ui } DrawTextEllipsised( - rt, w.windowPos + ScreenCoordsXY{ widget.left + 14, widget.textTop() }, widget.width() - 14, stringId, ft, colour); + rt, w.windowPos + ScreenCoordsXY{ widget.left + 14, widget.textTop() }, widget.width() - 15, stringId, ft, colour); } /** @@ -708,8 +710,8 @@ namespace OpenRCT2::Ui bottomRight.x--; bottomRight.y--; - bool hScrollNeeded = scroll.contentWidth > widget.width() && (scroll.flags & HSCROLLBAR_VISIBLE); - bool vScrollNeeded = scroll.contentHeight > widget.height() && (scroll.flags & VSCROLLBAR_VISIBLE); + bool hScrollNeeded = scroll.contentWidth > (widget.width() - 1) && (scroll.flags & HSCROLLBAR_VISIBLE); + bool vScrollNeeded = scroll.contentHeight > widget.height() - 1 && (scroll.flags & VSCROLLBAR_VISIBLE); // Horizontal scrollbar if (hScrollNeeded) @@ -740,7 +742,7 @@ namespace OpenRCT2::Ui // Create a new inner scroll render target RenderTarget scrollRT = rt; - // Clip the scroll dpi against the outer dpi + // Clip the scroll RT against the outer RT int32_t cl = std::max(rt.x, topLeft.x); int32_t ct = std::max(rt.y, topLeft.y); int32_t cr = std::min(rt.x + rt.width, bottomRight.x); @@ -768,7 +770,7 @@ namespace OpenRCT2::Ui // Trough Rectangle::fill(rt, { { l + kScrollBarWidth, t }, { r - kScrollBarWidth, b } }, ColourMapA[colour.colour].lighter); Rectangle::fill( - rt, { { l + kScrollBarWidth, t }, { r - kScrollBarWidth, b } }, 0x1000000 | ColourMapA[colour.colour].mid_dark); + rt, { { l + kScrollBarWidth, t }, { r - kScrollBarWidth, b } }, ColourMapA[colour.colour].mid_dark, true); Rectangle::fill( rt, { { l + kScrollBarWidth, t + 2 }, { r - kScrollBarWidth, t + 2 } }, ColourMapA[colour.colour].mid_dark); Rectangle::fill( @@ -815,7 +817,7 @@ namespace OpenRCT2::Ui // Trough Rectangle::fill(rt, { { l, t + kScrollBarWidth }, { r, b - kScrollBarWidth } }, ColourMapA[colour.colour].lighter); Rectangle::fill( - rt, { { l, t + kScrollBarWidth }, { r, b - kScrollBarWidth } }, 0x1000000 | ColourMapA[colour.colour].mid_dark); + rt, { { l, t + kScrollBarWidth }, { r, b - kScrollBarWidth } }, ColourMapA[colour.colour].mid_dark, true); Rectangle::fill( rt, { { l + 2, t + kScrollBarWidth }, { l + 2, b - kScrollBarWidth } }, ColourMapA[colour.colour].mid_dark); Rectangle::fill( @@ -856,7 +858,7 @@ namespace OpenRCT2::Ui const auto& widget = w.widgets[widgetIndex]; // Get the image - if (widget.image.GetIndex() == kSpriteIdNull) + if (widget.image.GetIndex() == kImageIndexUndefined) return; auto image = widget.image; @@ -982,7 +984,7 @@ namespace OpenRCT2::Ui } const auto& scroll = w.scrolls[*scroll_id]; - if ((scroll.flags & HSCROLLBAR_VISIBLE) && scroll.contentWidth > widget->width() + if ((scroll.flags & HSCROLLBAR_VISIBLE) && scroll.contentWidth > (widget->width() - 1) && screenCoords.y >= (w.windowPos.y + widget->bottom - (kScrollBarWidth + 1))) { // horizontal scrollbar @@ -1020,7 +1022,7 @@ namespace OpenRCT2::Ui } } else if ( - (scroll.flags & VSCROLLBAR_VISIBLE) && scroll.contentHeight > widget->height() + (scroll.flags & VSCROLLBAR_VISIBLE) && scroll.contentHeight > widget->height() - 1 && (screenCoords.x >= w.windowPos.x + widget->right - (kScrollBarWidth + 1))) { // vertical scrollbar @@ -1208,8 +1210,8 @@ namespace OpenRCT2::Ui if (OpenRCT2::Ui::Windows::TextBoxCaretIsFlashed()) { auto colour = ColourMapA[w.colours[1].colour].mid_light; - auto y = topLeft.y + 1 + widget.height() - 4; - Rectangle::fill(rt, { { curX, y }, { curX + width, y } }, colour + 5); + auto y = topLeft.y + 1 + widget.height() - 5; + Rectangle::fill(rt, { { curX, y }, { curX + width, y } }, static_cast(EnumValue(colour) + 5)); } } @@ -1236,12 +1238,12 @@ namespace OpenRCT2::Ui return; } - const auto barWidth = widget.width() - 2; + const auto barWidth = widget.width() - 3; const int32_t fillSize = (barWidth * percentage) / 100; if (fillSize > 0) { Rectangle::fillInset( - rt, { topLeft + ScreenCoordsXY{ 1, 1 }, topLeft + ScreenCoordsXY{ fillSize + 1, widget.height() - 1 } }, + rt, { topLeft + ScreenCoordsXY{ 1, 1 }, topLeft + ScreenCoordsXY{ fillSize + 1, widget.height() - 2 } }, { widget.colour }); } } @@ -1283,7 +1285,7 @@ namespace OpenRCT2::Ui if (scroll.flags & HSCROLLBAR_VISIBLE) { - int32_t view_size = widget.width() - 21; + int32_t view_size = widget.width() - 22; if (scroll.flags & VSCROLLBAR_VISIBLE) view_size -= 11; int32_t x = scroll.contentOffsetX * view_size; @@ -1291,7 +1293,7 @@ namespace OpenRCT2::Ui x /= scroll.contentWidth; scroll.hThumbLeft = x + 11; - x = widget.width() - 2; + x = widget.width() - 3; if (scroll.flags & VSCROLLBAR_VISIBLE) x -= 11; x += scroll.contentOffsetX; @@ -1312,7 +1314,7 @@ namespace OpenRCT2::Ui if (scroll.flags & VSCROLLBAR_VISIBLE) { - int32_t view_size = widget.height() - 21; + int32_t view_size = widget.height() - 22; if (scroll.flags & HSCROLLBAR_VISIBLE) view_size -= 11; int32_t y = scroll.contentOffsetY * view_size; @@ -1320,7 +1322,7 @@ namespace OpenRCT2::Ui y /= scroll.contentHeight; scroll.vThumbTop = y + 11; - y = widget.height() - 2; + y = widget.height() - 3; if (scroll.flags & HSCROLLBAR_VISIBLE) y -= 11; y += scroll.contentOffsetY; diff --git a/src/openrct2-ui/interface/Widget.h b/src/openrct2-ui/interface/Widget.h index 8de17d6b22fa..46143a4061c0 100644 --- a/src/openrct2-ui/interface/Widget.h +++ b/src/openrct2-ui/interface/Widget.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,7 +12,7 @@ #include "Window.h" #include -#include +#include #include namespace OpenRCT2::Ui @@ -78,7 +78,7 @@ namespace OpenRCT2::Ui const ScreenCoordsXY& origin, const ScreenSize& size, WidgetType type, WindowColour colour, ImageIndex content, StringId tooltip = kStringIdNone) { - return makeWidget(origin, size, type, colour, ImageId(content, FilterPaletteID::paletteNull), tooltip); + return makeWidget(origin, size, type, colour, ImageId(content, Drawing::FilterPaletteID::paletteNull), tooltip); } constexpr Widget makeTab(const ScreenCoordsXY& origin, StringId tooltip = kStringIdNone) @@ -248,7 +248,7 @@ namespace OpenRCT2::Ui makeDropdownButtonWidget(origin, size, type, colour, content, tooltip)); }; - void widgetDraw(RenderTarget& rt, WindowBase& w, WidgetIndex widgetIndex); + void widgetDraw(Drawing::RenderTarget& rt, WindowBase& w, WidgetIndex widgetIndex); bool widgetIsDisabled(const WindowBase& w, WidgetIndex widgetIndex); bool widgetIsHoldable(const WindowBase& w, WidgetIndex widgetIndex); diff --git a/src/openrct2-ui/interface/Window.cpp b/src/openrct2-ui/interface/Window.cpp index 0d941b0437f8..97467ce19cc5 100644 --- a/src/openrct2-ui/interface/Window.cpp +++ b/src/openrct2-ui/interface/Window.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -94,7 +94,7 @@ namespace OpenRCT2::Ui if (scroll.flags & VSCROLLBAR_VISIBLE) { - int32_t size = widget->height() - 1; + int32_t size = widget->height() - 2; if (scroll.flags & HSCROLLBAR_VISIBLE) size -= 11; size = std::max(0, scroll.contentHeight - size); @@ -102,7 +102,7 @@ namespace OpenRCT2::Ui } else { - int32_t size = widget->width() - 1; + int32_t size = widget->width() - 2; if (scroll.flags & VSCROLLBAR_VISIBLE) size -= 11; size = std::max(0, scroll.contentWidth - size); @@ -497,7 +497,7 @@ namespace OpenRCT2::Ui assert(end_tab_id < w->widgets.size()); int32_t i, x = w->widgets[start_tab_id].left; - int32_t tab_width = w->widgets[start_tab_id].width(); + int32_t tab_width = w->widgets[start_tab_id].width() - 1; for (i = start_tab_id; i <= end_tab_id; i++) { @@ -1015,7 +1015,7 @@ namespace OpenRCT2::Ui::Windows * * rct2: 0x00685BE1 * - * @param dpi (edi) + * @param rt (edi) * @param w (esi) */ void WindowDrawViewport(RenderTarget& rt, WindowBase& w) @@ -1029,7 +1029,7 @@ namespace OpenRCT2::Ui::Windows */ void WindowDrawWidgets(WindowBase& w, RenderTarget& rt) { - if ((w.flags.has(WindowFlag::transparent)) && !(w.flags.has(WindowFlag::noBackground))) + if (w.flags.has(WindowFlag::transparent) && !w.flags.has(WindowFlag::noBackground)) Rectangle::filter( rt, { w.windowPos, w.windowPos + ScreenCoordsXY{ w.width - 1, w.height - 1 } }, FilterPaletteID::palette51); diff --git a/src/openrct2-ui/interface/Window.h b/src/openrct2-ui/interface/Window.h index fbdb0b1c50de..2eff99d49a05 100644 --- a/src/openrct2-ui/interface/Window.h +++ b/src/openrct2-ui/interface/Window.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -23,8 +23,8 @@ namespace OpenRCT2::Ui struct Window : WindowBase { - void onDraw(RenderTarget& rt) override; - void onDrawWidget(WidgetIndex widgetIndex, RenderTarget& rt) override; + void onDraw(Drawing::RenderTarget& rt) override; + void onDrawWidget(WidgetIndex widgetIndex, Drawing::RenderTarget& rt) override; void scrollToViewport(); void initScrollWidgets(); @@ -36,7 +36,7 @@ namespace OpenRCT2::Ui void setWidgetDisabledAndInvalidate(WidgetIndex widgetIndex, bool value); void setWidgetPressed(WidgetIndex widgetIndex, bool value); void setCheckboxValue(WidgetIndex widgetIndex, bool value); - void drawWidgets(RenderTarget& rt); + void drawWidgets(Drawing::RenderTarget& rt); void close(); void closeOthers(); void closeOthersOfThisClass(); @@ -86,8 +86,8 @@ namespace OpenRCT2::Ui::Windows void InvalidateAllWindowsAfterInput(); - void WindowDrawWidgets(WindowBase& w, RenderTarget& rt); - void WindowDrawViewport(RenderTarget& rt, WindowBase& w); + void WindowDrawWidgets(WindowBase& w, Drawing::RenderTarget& rt); + void WindowDrawViewport(Drawing::RenderTarget& rt, WindowBase& w); void WindowZoomIn(WindowBase& w, bool atCursor); void WindowZoomOut(WindowBase& w, bool atCursor); diff --git a/src/openrct2-ui/ride/Construction.cpp b/src/openrct2-ui/ride/Construction.cpp index 3a7c89a464fb..e9d3575ce25d 100644 --- a/src/openrct2-ui/ride/Construction.cpp +++ b/src/openrct2-ui/ride/Construction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -25,200 +26,200 @@ using namespace OpenRCT2::TrackMetaData; namespace OpenRCT2 { - constexpr auto kSeparator = TrackElemType::None; + constexpr auto kSeparator = TrackElemType::none; /** * Order of special track elements dropdown. Elements with the same name string must be sequential or they show up twice. */ constexpr std::array kSpecialElementsDropdownOrder = { - TrackElemType::EndStation, + TrackElemType::endStation, // Brakes - TrackElemType::Brakes, - TrackElemType::DiagBrakes, - TrackElemType::Down25Brakes, - TrackElemType::DiagDown25Brakes, - TrackElemType::BlockBrakes, - TrackElemType::DiagBlockBrakes, + TrackElemType::brakes, + TrackElemType::diagBrakes, + TrackElemType::down25Brakes, + TrackElemType::diagDown25Brakes, + TrackElemType::blockBrakes, + TrackElemType::diagBlockBrakes, // Boosters - TrackElemType::Booster, - TrackElemType::DiagBooster, + TrackElemType::booster, + TrackElemType::diagBooster, // Photo sections - TrackElemType::OnRidePhoto, + TrackElemType::onRidePhoto, // Rotation control - TrackElemType::RotationControlToggle, + TrackElemType::rotationControlToggle, // (Curved) lift (hills) pieces - TrackElemType::LeftCurvedLiftHill, - TrackElemType::RightCurvedLiftHill, - TrackElemType::CableLiftHill, - TrackElemType::PoweredLift, + TrackElemType::leftCurvedLiftHill, + TrackElemType::rightCurvedLiftHill, + TrackElemType::cableLiftHill, + TrackElemType::poweredLift, kSeparator, // Heart Line pieces - TrackElemType::HeartLineTransferUp, - TrackElemType::HeartLineTransferDown, - TrackElemType::LeftHeartLineRoll, - TrackElemType::RightHeartLineRoll, + TrackElemType::heartLineTransferUp, + TrackElemType::heartLineTransferDown, + TrackElemType::leftHeartLineRoll, + TrackElemType::rightHeartLineRoll, kSeparator, // Brake for drop - TrackElemType::BrakeForDrop, + TrackElemType::brakeForDrop, kSeparator, // Tower - TrackElemType::TowerBase, - TrackElemType::TowerSection, + TrackElemType::towerBase, + TrackElemType::towerSection, kSeparator, // Mini Golf pieces - TrackElemType::MinigolfHoleA, - TrackElemType::MinigolfHoleB, - TrackElemType::MinigolfHoleC, - TrackElemType::MinigolfHoleD, - TrackElemType::MinigolfHoleE, + TrackElemType::minigolfHoleA, + TrackElemType::minigolfHoleB, + TrackElemType::minigolfHoleC, + TrackElemType::minigolfHoleD, + TrackElemType::minigolfHoleE, kSeparator, // S-Bends - TrackElemType::SBendLeft, - TrackElemType::SBendRight, + TrackElemType::sBendLeft, + TrackElemType::sBendRight, kSeparator, // Helixes - TrackElemType::LeftHalfBankedHelixUpSmall, - TrackElemType::RightHalfBankedHelixUpSmall, - TrackElemType::LeftHalfBankedHelixDownSmall, - TrackElemType::RightHalfBankedHelixDownSmall, - TrackElemType::LeftHalfBankedHelixUpLarge, - TrackElemType::RightHalfBankedHelixUpLarge, - TrackElemType::LeftHalfBankedHelixDownLarge, - TrackElemType::RightHalfBankedHelixDownLarge, - TrackElemType::LeftQuarterBankedHelixLargeUp, - TrackElemType::RightQuarterBankedHelixLargeUp, - TrackElemType::LeftQuarterBankedHelixLargeDown, - TrackElemType::RightQuarterBankedHelixLargeDown, - TrackElemType::LeftQuarterHelixLargeUp, - TrackElemType::RightQuarterHelixLargeUp, - TrackElemType::LeftQuarterHelixLargeDown, - TrackElemType::RightQuarterHelixLargeDown, + TrackElemType::leftHalfBankedHelixUpSmall, + TrackElemType::rightHalfBankedHelixUpSmall, + TrackElemType::leftHalfBankedHelixDownSmall, + TrackElemType::rightHalfBankedHelixDownSmall, + TrackElemType::leftHalfBankedHelixUpLarge, + TrackElemType::rightHalfBankedHelixUpLarge, + TrackElemType::leftHalfBankedHelixDownLarge, + TrackElemType::rightHalfBankedHelixDownLarge, + TrackElemType::leftQuarterBankedHelixLargeUp, + TrackElemType::rightQuarterBankedHelixLargeUp, + TrackElemType::leftQuarterBankedHelixLargeDown, + TrackElemType::rightQuarterBankedHelixLargeDown, + TrackElemType::leftQuarterHelixLargeUp, + TrackElemType::rightQuarterHelixLargeUp, + TrackElemType::leftQuarterHelixLargeDown, + TrackElemType::rightQuarterHelixLargeDown, kSeparator, // (Wooden) water splash - TrackElemType::Watersplash, + TrackElemType::watersplash, kSeparator, // River Rapids - TrackElemType::Waterfall, - TrackElemType::Rapids, // Also used for Monster Trucks - TrackElemType::Whirlpool, + TrackElemType::waterfall, + TrackElemType::rapids, // Also used for Monster Trucks + TrackElemType::whirlpool, kSeparator, // Spinning tunnel - TrackElemType::SpinningTunnel, + TrackElemType::spinningTunnel, kSeparator, // Reverser pieces - TrackElemType::LeftReverser, - TrackElemType::RightReverser, - TrackElemType::LogFlumeReverser, + TrackElemType::leftReverser, + TrackElemType::rightReverser, + TrackElemType::logFlumeReverser, kSeparator, // Reverse freefall pieces - TrackElemType::ReverseFreefallSlope, - TrackElemType::ReverseFreefallVertical, + TrackElemType::reverseFreefallSlope, + TrackElemType::reverseFreefallVertical, // Air thrust pieces - TrackElemType::AirThrustTopCap, - TrackElemType::AirThrustVerticalDown, - TrackElemType::AirThrustVerticalDownToLevel, + TrackElemType::airThrustTopCap, + TrackElemType::airThrustVerticalDown, + TrackElemType::airThrustVerticalDownToLevel, kSeparator, // Corkscrews - TrackElemType::LeftCorkscrewUp, - TrackElemType::LeftCorkscrewDown, - TrackElemType::RightCorkscrewUp, - TrackElemType::RightCorkscrewDown, - TrackElemType::LeftFlyerCorkscrewUp, - TrackElemType::LeftFlyerCorkscrewDown, - TrackElemType::RightFlyerCorkscrewUp, - TrackElemType::RightFlyerCorkscrewDown, - TrackElemType::LeftLargeCorkscrewUp, - TrackElemType::LeftLargeCorkscrewDown, - TrackElemType::RightLargeCorkscrewUp, - TrackElemType::RightLargeCorkscrewDown, + TrackElemType::leftCorkscrewUp, + TrackElemType::leftCorkscrewDown, + TrackElemType::rightCorkscrewUp, + TrackElemType::rightCorkscrewDown, + TrackElemType::leftFlyerCorkscrewUp, + TrackElemType::leftFlyerCorkscrewDown, + TrackElemType::rightFlyerCorkscrewUp, + TrackElemType::rightFlyerCorkscrewDown, + TrackElemType::leftLargeCorkscrewUp, + TrackElemType::leftLargeCorkscrewDown, + TrackElemType::rightLargeCorkscrewUp, + TrackElemType::rightLargeCorkscrewDown, kSeparator, // Loops - TrackElemType::LeftVerticalLoop, - TrackElemType::RightVerticalLoop, - TrackElemType::HalfLoopUp, - TrackElemType::HalfLoopDown, - TrackElemType::FlyerHalfLoopUninvertedUp, - TrackElemType::FlyerHalfLoopInvertedDown, - TrackElemType::FlyerHalfLoopInvertedUp, - TrackElemType::FlyerHalfLoopUninvertedDown, - TrackElemType::LeftMediumHalfLoopUp, - TrackElemType::LeftMediumHalfLoopDown, - TrackElemType::RightMediumHalfLoopUp, - TrackElemType::RightMediumHalfLoopDown, - TrackElemType::LeftLargeHalfLoopUp, - TrackElemType::LeftLargeHalfLoopDown, - TrackElemType::RightLargeHalfLoopUp, - TrackElemType::RightLargeHalfLoopDown, - TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp, - TrackElemType::LeftFlyerLargeHalfLoopInvertedDown, - TrackElemType::LeftFlyerLargeHalfLoopInvertedUp, - TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown, - TrackElemType::RightFlyerLargeHalfLoopUninvertedUp, - TrackElemType::RightFlyerLargeHalfLoopInvertedDown, - TrackElemType::RightFlyerLargeHalfLoopInvertedUp, - TrackElemType::RightFlyerLargeHalfLoopUninvertedDown, - TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop, - TrackElemType::Up90ToInvertedFlatQuarterLoop, - TrackElemType::InvertedFlatToDown90QuarterLoop, - TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop, - TrackElemType::MultiDimFlatToDown90QuarterLoop, - TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop, + TrackElemType::leftVerticalLoop, + TrackElemType::rightVerticalLoop, + TrackElemType::halfLoopUp, + TrackElemType::halfLoopDown, + TrackElemType::flyerHalfLoopUninvertedUp, + TrackElemType::flyerHalfLoopInvertedDown, + TrackElemType::flyerHalfLoopInvertedUp, + TrackElemType::flyerHalfLoopUninvertedDown, + TrackElemType::leftMediumHalfLoopUp, + TrackElemType::leftMediumHalfLoopDown, + TrackElemType::rightMediumHalfLoopUp, + TrackElemType::rightMediumHalfLoopDown, + TrackElemType::leftLargeHalfLoopUp, + TrackElemType::leftLargeHalfLoopDown, + TrackElemType::rightLargeHalfLoopUp, + TrackElemType::rightLargeHalfLoopDown, + TrackElemType::leftFlyerLargeHalfLoopUninvertedUp, + TrackElemType::leftFlyerLargeHalfLoopInvertedDown, + TrackElemType::leftFlyerLargeHalfLoopInvertedUp, + TrackElemType::leftFlyerLargeHalfLoopUninvertedDown, + TrackElemType::rightFlyerLargeHalfLoopUninvertedUp, + TrackElemType::rightFlyerLargeHalfLoopInvertedDown, + TrackElemType::rightFlyerLargeHalfLoopInvertedUp, + TrackElemType::rightFlyerLargeHalfLoopUninvertedDown, + TrackElemType::multiDimInvertedFlatToDown90QuarterLoop, + TrackElemType::up90ToInvertedFlatQuarterLoop, + TrackElemType::invertedFlatToDown90QuarterLoop, + TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop, + TrackElemType::multiDimFlatToDown90QuarterLoop, + TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop, kSeparator, // Zero-G Rolls, Dive Loops - TrackElemType::LeftZeroGRollUp, - TrackElemType::LeftZeroGRollDown, - TrackElemType::RightZeroGRollUp, - TrackElemType::RightZeroGRollDown, - TrackElemType::LeftLargeZeroGRollUp, - TrackElemType::LeftLargeZeroGRollDown, - TrackElemType::RightLargeZeroGRollUp, - TrackElemType::RightLargeZeroGRollDown, - TrackElemType::LeftEighthDiveLoopUpToOrthogonal, - TrackElemType::LeftEighthDiveLoopDownToDiag, - TrackElemType::RightEighthDiveLoopUpToOrthogonal, - TrackElemType::RightEighthDiveLoopDownToDiag, + TrackElemType::leftZeroGRollUp, + TrackElemType::leftZeroGRollDown, + TrackElemType::rightZeroGRollUp, + TrackElemType::rightZeroGRollDown, + TrackElemType::leftLargeZeroGRollUp, + TrackElemType::leftLargeZeroGRollDown, + TrackElemType::rightLargeZeroGRollUp, + TrackElemType::rightLargeZeroGRollDown, + TrackElemType::leftEighthDiveLoopUpToOrthogonal, + TrackElemType::leftEighthDiveLoopDownToDiag, + TrackElemType::rightEighthDiveLoopUpToOrthogonal, + TrackElemType::rightEighthDiveLoopDownToDiag, kSeparator, // Barrel Rolls - TrackElemType::LeftBarrelRollUpToDown, - TrackElemType::LeftBarrelRollDownToUp, - TrackElemType::RightBarrelRollUpToDown, - TrackElemType::RightBarrelRollDownToUp, + TrackElemType::leftBarrelRollUpToDown, + TrackElemType::leftBarrelRollDownToUp, + TrackElemType::rightBarrelRollUpToDown, + TrackElemType::rightBarrelRollDownToUp, kSeparator, // Twists - TrackElemType::LeftTwistDownToUp, - TrackElemType::LeftTwistUpToDown, - TrackElemType::RightTwistDownToUp, - TrackElemType::RightTwistUpToDown, - TrackElemType::LeftFlyerTwistUp, - TrackElemType::LeftFlyerTwistDown, - TrackElemType::RightFlyerTwistUp, - TrackElemType::RightFlyerTwistDown, + TrackElemType::leftTwistDownToUp, + TrackElemType::leftTwistUpToDown, + TrackElemType::rightTwistDownToUp, + TrackElemType::rightTwistUpToDown, + TrackElemType::leftFlyerTwistUp, + TrackElemType::leftFlyerTwistDown, + TrackElemType::rightFlyerTwistUp, + TrackElemType::rightFlyerTwistDown, }; // Update the magic number with the current number of track elements to silence - static_assert(EnumValue(TrackElemType::Count) == 350, "Reminder to add new track element to special dropdown list"); + static_assert(EnumValue(TrackElemType::count) == 350, "Reminder to add new track element to special dropdown list"); /** * @@ -231,12 +232,13 @@ namespace OpenRCT2 int32_t colour2 = RideGetUnusedPresetVehicleColour(rideEntryIndex); auto gameAction = GameActions::RideCreateAction( - listItem.Type, listItem.EntryIndex, colour1, colour2, getGameState().lastEntranceStyle); + listItem.Type, listItem.EntryIndex, colour1, colour2, getGameState().lastEntranceStyle, + Config::Get().general.defaultInspectionInterval); gameAction.SetCallback([](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) return; - const auto rideIndex = result->GetData(); + const auto rideIndex = result->getData(); auto ride = GetRide(rideIndex); RideConstructionStart(*ride); }); @@ -278,7 +280,7 @@ namespace OpenRCT2 } // Additional tower bases can only be built if the ride allows for it (elevator) - if (trackType == TrackElemType::TowerBase + if (trackType == TrackElemType::towerBase && !currentRide.getRideTypeDescriptor().HasFlag(RtdFlag::allowExtraTowerBases)) entryIsDisabled = true; @@ -341,7 +343,7 @@ namespace OpenRCT2 break; auto trackPiece = elements[list.PreferredNumRows + i].TrackType; - if (trackPiece == TrackElemType::None) + if (trackPiece == TrackElemType::none) { list.PreferredNumRows += i + 1; break; @@ -377,9 +379,9 @@ namespace OpenRCT2 if (trackElement->GetRideIndex() == gRideEntranceExitPlaceRideIndex) { const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); - if (ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN) + if (ted.sequences[0].flags.has(SequenceFlag::trackOrigin)) { - if (trackElement->GetTrackType() == TrackElemType::Maze) + if (trackElement->GetTrackType() == TrackElemType::maze) { gRideEntranceExitPlaceStationIndex = StationIndex::FromUnderlying(0); } @@ -457,7 +459,7 @@ namespace OpenRCT2 auto* trackElement = tileElement->AsTrack(); if (trackElement->GetRideIndex() != gRideEntranceExitPlaceRideIndex) continue; - if (trackElement->GetTrackType() == TrackElemType::Maze) + if (trackElement->GetTrackType() == TrackElemType::maze) { // if it's a maze, it can place the entrance and exit immediately entranceExitCoords.direction = DirectionReverse(entranceExitCoords.direction); @@ -472,7 +474,8 @@ namespace OpenRCT2 // get the ride entrance's side relative to the TrackElement Direction direction = (DirectionReverse(entranceExitCoords.direction) - tileElement->GetDirection()) & 3; const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); - if (ted.sequences[trackElement->GetSequenceIndex()].flags & (1 << direction)) + auto connectionSides = ted.sequences[trackElement->GetSequenceIndex()].getEntranceConnectionSides(); + if (connectionSides & (1 << direction)) { // if that side of the TrackElement supports stations, the ride entrance is valid and faces away from // the station diff --git a/src/openrct2-ui/ride/Construction.h b/src/openrct2-ui/ride/Construction.h index a275b87717b6..7bcb7503e091 100644 --- a/src/openrct2-ui/ride/Construction.h +++ b/src/openrct2-ui/ride/Construction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include #include #include +#include namespace OpenRCT2 { diff --git a/src/openrct2-ui/scripting/CustomImages.cpp b/src/openrct2-ui/scripting/CustomImages.cpp index 71f039dcdb1b..6e5662d29d55 100644 --- a/src/openrct2-ui/scripting/CustomImages.cpp +++ b/src/openrct2-ui/scripting/CustomImages.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -151,18 +151,18 @@ namespace OpenRCT2::Scripting DukObject obj(ctx); obj.Set("id", id); - obj.Set("offset", ToDuk(ctx, { g1->x_offset, g1->y_offset })); + obj.Set("offset", ToDuk(ctx, { g1->xOffset, g1->yOffset })); obj.Set("width", g1->width); obj.Set("height", g1->height); - obj.Set("hasTransparent", (g1->flags & G1_FLAG_HAS_TRANSPARENCY) != 0); - obj.Set("isRLE", (g1->flags & G1_FLAG_RLE_COMPRESSION) != 0); - obj.Set("isPalette", (g1->flags & G1_FLAG_PALETTE) != 0); - obj.Set("noZoom", (g1->flags & G1_FLAG_NO_ZOOM_DRAW) != 0); + obj.Set("hasTransparent", g1->flags.has(G1Flag::hasTransparency)); + obj.Set("isRLE", g1->flags.has(G1Flag::hasRLECompression)); + obj.Set("isPalette", g1->flags.has(G1Flag::isPalette)); + obj.Set("noZoom", g1->flags.has(G1Flag::noZoomDraw)); - if (g1->flags & G1_FLAG_HAS_ZOOM_SPRITE) + if (g1->flags.has(G1Flag::hasZoomSprite)) { - obj.Set("nextZoomId", id - g1->zoomed_offset); + obj.Set("nextZoomId", id - g1->zoomedOffset); } else { @@ -173,9 +173,9 @@ namespace OpenRCT2::Scripting static const char* GetPixelDataTypeForG1(const G1Element& g1) { - if (g1.flags & G1_FLAG_RLE_COMPRESSION) + if (g1.flags.has(G1Flag::hasRLECompression)) return "rle"; - else if (g1.flags & G1_FLAG_PALETTE) + else if (g1.flags.has(G1Flag::isPalette)) return "palette"; return "raw"; } @@ -405,10 +405,10 @@ namespace OpenRCT2::Scripting el.offset = newData; el.width = pixelData.Width; el.height = pixelData.Height; - el.flags = 0; + el.flags = {}; if (pixelData.Type == PixelDataKind::Rle) { - el.flags |= G1_FLAG_RLE_COMPRESSION; + el.flags.set(G1Flag::hasRLECompression); } GfxSetG1Element(id, &el); DrawingEngineInvalidateImage(id); @@ -441,7 +441,7 @@ namespace OpenRCT2::Scripting auto createNewImage = false; auto g1 = GfxGetG1Element(id); - if (g1 == nullptr || g1->width != size.width || g1->height != size.height || (g1->flags & G1_FLAG_RLE_COMPRESSION)) + if (g1 == nullptr || g1->width != size.width || g1->height != size.height || g1->flags.has(G1Flag::hasRLECompression)) { createNewImage = true; } @@ -465,7 +465,9 @@ namespace OpenRCT2::Scripting } auto dukG = GetObjectAsDukValue(ctx, std::make_shared(ctx, rt)); + drawingEngine->BeginDraw(); scriptEngine.ExecutePluginCall(plugin, callback, { dukG }, false); + drawingEngine->EndDraw(); if (createNewImage) { @@ -478,7 +480,7 @@ namespace OpenRCT2::Scripting newg1.offset = rt.bits; newg1.width = size.width; newg1.height = size.height; - newg1.flags = 0; + newg1.flags = {}; GfxSetG1Element(id, &newg1); } diff --git a/src/openrct2-ui/scripting/CustomImages.h b/src/openrct2-ui/scripting/CustomImages.h index a2cb2a5ca35e..29833dcb56da 100644 --- a/src/openrct2-ui/scripting/CustomImages.h +++ b/src/openrct2-ui/scripting/CustomImages.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/scripting/CustomListView.cpp b/src/openrct2-ui/scripting/CustomListView.cpp index add4be58e9cd..00926d92105d 100644 --- a/src/openrct2-ui/scripting/CustomListView.cpp +++ b/src/openrct2-ui/scripting/CustomListView.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,6 +18,7 @@ #include #include #include + #include #include #include #include @@ -609,7 +610,7 @@ void CustomListView::Paint(WindowBase* w, RenderTarget& rt, const ScrollArea* sc { Rectangle::fill( rt, { { rt.x, y }, { rt.x + rt.width, y + (kListRowHeight - 1) } }, - ColourMapA[w->colours[1].colour].lighter | 0x1000000); + ColourMapA[w->colours[1].colour].lighter, true); } // Columns diff --git a/src/openrct2-ui/scripting/CustomListView.h b/src/openrct2-ui/scripting/CustomListView.h index ab00a4a21f1e..3aa4ea00edaa 100644 --- a/src/openrct2-ui/scripting/CustomListView.h +++ b/src/openrct2-ui/scripting/CustomListView.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -138,15 +138,17 @@ namespace OpenRCT2::Ui::Windows void MouseOver(const ScreenCoordsXY& pos, bool isMouseDown); void MouseDown(const ScreenCoordsXY& pos); void MouseUp(const ScreenCoordsXY& pos); - void Paint(WindowBase* w, RenderTarget& rt, const ScrollArea* scroll) const; + void Paint(WindowBase* w, Drawing::RenderTarget& rt, const ScrollArea* scroll) const; private: void PaintHeading( - WindowBase* w, RenderTarget& rt, const ScreenCoordsXY& pos, const ScreenSize& size, const std::string& text, - ColumnSortOrder sortOrder, bool isPressed) const; - void PaintSeparator(RenderTarget& rt, const ScreenCoordsXY& pos, const ScreenSize& size, const char* text) const; + WindowBase* w, Drawing::RenderTarget& rt, const ScreenCoordsXY& pos, const ScreenSize& size, + const std::string& text, ColumnSortOrder sortOrder, bool isPressed) const; + void PaintSeparator( + Drawing::RenderTarget& rt, const ScreenCoordsXY& pos, const ScreenSize& size, const char* text) const; void PaintCell( - RenderTarget& rt, const ScreenCoordsXY& pos, const ScreenSize& size, const char* text, bool isHighlighted) const; + Drawing::RenderTarget& rt, const ScreenCoordsXY& pos, const ScreenSize& size, const char* text, + bool isHighlighted) const; std::optional GetItemIndexAt(const ScreenCoordsXY& pos); Widget* GetWidget() const; void Invalidate(); diff --git a/src/openrct2-ui/scripting/CustomMenu.cpp b/src/openrct2-ui/scripting/CustomMenu.cpp index 9dc2682995da..7cc4835f7f11 100644 --- a/src/openrct2-ui/scripting/CustomMenu.cpp +++ b/src/openrct2-ui/scripting/CustomMenu.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/scripting/CustomMenu.h b/src/openrct2-ui/scripting/CustomMenu.h index 4263fc2e379f..0a62209aa958 100644 --- a/src/openrct2-ui/scripting/CustomMenu.h +++ b/src/openrct2-ui/scripting/CustomMenu.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/scripting/CustomWindow.cpp b/src/openrct2-ui/scripting/CustomWindow.cpp index 982e913e5b2a..d611b4bb0515 100644 --- a/src/openrct2-ui/scripting/CustomWindow.cpp +++ b/src/openrct2-ui/scripting/CustomWindow.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -519,8 +519,8 @@ namespace OpenRCT2::Ui::Windows if (widget.type == WidgetType::scroll) { auto& listView = _info.ListViews[scrollIndex]; - auto wwidth = widget.width() + 1 - 2; - auto wheight = widget.height() + 1 - 2; + auto wwidth = widget.width() - 2; + auto wheight = widget.height() - 2; if (listView.GetScrollbars() == ScrollbarType::Horizontal || listView.GetScrollbars() == ScrollbarType::Both) { @@ -536,7 +536,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); DrawTabImages(rt); @@ -559,14 +559,14 @@ namespace OpenRCT2::Ui::Windows auto& onDraw = widgetDesc->OnDraw; if (onDraw.is_function()) { - RenderTarget widgetDpi; - if (ClipDrawPixelInfo( - widgetDpi, rt, { windowPos.x + widget.left, windowPos.y + widget.top }, widget.width(), - widget.height())) + RenderTarget widgetRT; + if (ClipRenderTarget( + widgetRT, rt, { windowPos.x + widget.left, windowPos.y + widget.top }, widget.width() - 1, + widget.height() - 1)) { auto ctx = onDraw.context(); auto dukWidget = ScWidget::ToDukValue(ctx, this, widgetIndex); - auto dukG = GetObjectAsDukValue(ctx, std::make_shared(ctx, widgetDpi)); + auto dukG = GetObjectAsDukValue(ctx, std::make_shared(ctx, widgetRT)); auto& scriptEngine = GetContext()->GetScriptEngine(); scriptEngine.ExecutePluginCall(_info.Owner, widgetDesc->OnDraw, dukWidget, { dukG }, false); } @@ -653,8 +653,8 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[i] = Dropdown::MenuLabel(items[i].c_str()); } WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, - colours[widget->colour], 0, Dropdown::Flag::StayOpen, numItems, widget->width() - 3); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[widget->colour], 0, + Dropdown::Flag::StayOpen, numItems, widget->width() - 4); if (selectedIndex >= 0 && selectedIndex < static_cast(numItems)) gDropdown.items[selectedIndex].setChecked(true); @@ -809,8 +809,8 @@ namespace OpenRCT2::Ui::Windows { auto left = windowPos.x + viewportWidget->left + 1; auto top = windowPos.y + viewportWidget->top + 1; - auto wwidth = viewportWidget->width() - 1; - auto wheight = viewportWidget->height() - 1; + auto wwidth = viewportWidget->width() - 2; + auto wheight = viewportWidget->height() - 2; if (viewport == nullptr) { ViewportCreate(*this, { left, top }, wwidth, wheight, Focus(CoordsXYZ(0, 0, 0))); diff --git a/src/openrct2-ui/scripting/CustomWindow.h b/src/openrct2-ui/scripting/CustomWindow.h index ce755e71914c..eafdf12f3340 100644 --- a/src/openrct2-ui/scripting/CustomWindow.h +++ b/src/openrct2-ui/scripting/CustomWindow.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/scripting/ScGraphicsContext.hpp b/src/openrct2-ui/scripting/ScGraphicsContext.hpp index b40278c2aef4..97dcc1248a16 100644 --- a/src/openrct2-ui/scripting/ScGraphicsContext.hpp +++ b/src/openrct2-ui/scripting/ScGraphicsContext.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,8 +13,9 @@ #include "CustomImages.h" + #include #include - #include + #include #include using namespace OpenRCT2::Drawing; @@ -31,8 +32,8 @@ namespace OpenRCT2::Scripting std::optional _secondaryColour{}; std::optional _tertiaryColour{}; std::optional _paletteId{}; - uint8_t _stroke{}; - uint8_t _fill{}; + PaletteIndex _stroke{}; + PaletteIndex _fill{}; public: ScGraphicsContext(duk_context* ctx, const RenderTarget& rt) @@ -124,22 +125,22 @@ namespace OpenRCT2::Scripting uint8_t fill_get() const { - return _fill; + return EnumValue(_fill); } void fill_set(uint8_t value) { - _fill = value; + _fill = static_cast(value); } uint8_t stroke_get() const { - return _stroke; + return EnumValue(_stroke); } void stroke_set(uint8_t value) { - _stroke = value; + _stroke = static_cast(value); } int32_t width_get() const @@ -183,9 +184,9 @@ namespace OpenRCT2::Scripting void clip(int32_t x, int32_t y, int32_t width, int32_t height) { - RenderTarget newDpi; - ClipDrawPixelInfo(newDpi, _rt, { x, y }, width, height); - _rt = newDpi; + RenderTarget newRT; + ClipRenderTarget(newRT, _rt, { x, y }, width, height); + _rt = newRT; } void image(uint32_t id, int32_t x, int32_t y) @@ -218,7 +219,7 @@ namespace OpenRCT2::Scripting void rect(int32_t x, int32_t y, int32_t width, int32_t height) { - if (_stroke != 0) + if (_stroke != PaletteIndex::pi0) { line(x, y, x + width, y); line(x + width - 1, y + 1, x + width - 1, y + height - 1); @@ -230,7 +231,7 @@ namespace OpenRCT2::Scripting width -= 2; height -= 2; } - if (_fill != 0) + if (_fill != PaletteIndex::pi0) { Rectangle::fill(_rt, { x, y, x + width - 1, y + height - 1 }, _fill); } diff --git a/src/openrct2-ui/scripting/ScImageManager.hpp b/src/openrct2-ui/scripting/ScImageManager.hpp index 525365aa4c56..b746daa8171b 100644 --- a/src/openrct2-ui/scripting/ScImageManager.hpp +++ b/src/openrct2-ui/scripting/ScImageManager.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/scripting/ScTileSelection.hpp b/src/openrct2-ui/scripting/ScTileSelection.hpp index bc9b05899346..d484c15cc538 100644 --- a/src/openrct2-ui/scripting/ScTileSelection.hpp +++ b/src/openrct2-ui/scripting/ScTileSelection.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -51,7 +51,6 @@ namespace OpenRCT2::Scripting void range_set(DukValue value) { - MapInvalidateSelectionRect(); if (value.type() == DukValue::Type::OBJECT) { auto range = GetMapRange(value); @@ -69,7 +68,6 @@ namespace OpenRCT2::Scripting { gMapSelectFlags.unset(MapSelectFlag::enable); } - MapInvalidateSelectionRect(); } DukValue tiles_get() const @@ -78,7 +76,7 @@ namespace OpenRCT2::Scripting if (gMapSelectFlags.has(MapSelectFlag::enableConstruct)) { duk_uarridx_t index = 0; - for (const auto& tile : gMapSelectionTiles) + for (const auto& tile : MapSelection::getSelectedTiles()) { duk_push_object(_ctx); duk_push_int(_ctx, tile.x); @@ -94,8 +92,7 @@ namespace OpenRCT2::Scripting void tiles_set(DukValue value) { - MapInvalidateMapSelectionTiles(); - gMapSelectionTiles.clear(); + MapSelection::clearSelectedTiles(); if (value.is_array()) { value.push(); @@ -108,14 +105,14 @@ namespace OpenRCT2::Scripting auto coords = GetCoordsXY(dukElement); if (coords) { - gMapSelectionTiles.push_back(*coords); + MapSelection::addSelectedTile(*coords); } } } duk_pop(_ctx); } - if (gMapSelectionTiles.empty()) + if (MapSelection::getSelectedTiles().empty()) { gMapSelectFlags.unset(MapSelectFlag::enableConstruct); gMapSelectFlags.unset(MapSelectFlag::green); @@ -124,7 +121,6 @@ namespace OpenRCT2::Scripting { gMapSelectFlags.set(MapSelectFlag::enableConstruct); } - MapInvalidateMapSelectionTiles(); } static void Register(duk_context* ctx) diff --git a/src/openrct2-ui/scripting/ScTitleSequence.hpp b/src/openrct2-ui/scripting/ScTitleSequence.hpp index 9bc5982238d7..6a84b322cbd5 100644 --- a/src/openrct2-ui/scripting/ScTitleSequence.hpp +++ b/src/openrct2-ui/scripting/ScTitleSequence.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/scripting/ScUi.hpp b/src/openrct2-ui/scripting/ScUi.hpp index 1d9cb20cb93b..f11b23295c07 100644 --- a/src/openrct2-ui/scripting/ScUi.hpp +++ b/src/openrct2-ui/scripting/ScUi.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/scripting/ScViewport.hpp b/src/openrct2-ui/scripting/ScViewport.hpp index 2d387931276e..41b7d6d47d2c 100644 --- a/src/openrct2-ui/scripting/ScViewport.hpp +++ b/src/openrct2-ui/scripting/ScViewport.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/scripting/ScWidget.hpp b/src/openrct2-ui/scripting/ScWidget.hpp index d12f02f96d73..20980ff54d57 100644 --- a/src/openrct2-ui/scripting/ScWidget.hpp +++ b/src/openrct2-ui/scripting/ScWidget.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -211,7 +211,7 @@ namespace OpenRCT2::Scripting auto widget = GetWidget(); if (widget != nullptr) { - return widget->width() + 1; + return widget->width(); } return 0; } @@ -250,7 +250,7 @@ namespace OpenRCT2::Scripting auto widget = GetWidget(); if (widget != nullptr) { - return widget->height() + 1; + return widget->height(); } return 0; } @@ -371,7 +371,7 @@ namespace OpenRCT2::Scripting if (IsCustomWindow()) { auto widget = GetWidget(); - if (widget != nullptr && (widget->flags.has(WidgetFlag::textIsString)) && widget->string != nullptr) + if (widget != nullptr && widget->flags.has(WidgetFlag::textIsString) && widget->string != nullptr) { return widget->string; } diff --git a/src/openrct2-ui/scripting/ScWindow.hpp b/src/openrct2-ui/scripting/ScWindow.hpp index 32d7e67dc049..4eb41191a559 100644 --- a/src/openrct2-ui/scripting/ScWindow.hpp +++ b/src/openrct2-ui/scripting/ScWindow.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -208,7 +208,7 @@ namespace OpenRCT2::Scripting auto w = GetWindow(); if (w != nullptr) { - return (w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront)); + return w->flags.hasAny(WindowFlag::stickToBack, WindowFlag::stickToFront); } return false; } diff --git a/src/openrct2-ui/scripting/UiExtensions.cpp b/src/openrct2-ui/scripting/UiExtensions.cpp index ff2210ce8ea9..3f05f7b0212f 100644 --- a/src/openrct2-ui/scripting/UiExtensions.cpp +++ b/src/openrct2-ui/scripting/UiExtensions.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/scripting/UiExtensions.h b/src/openrct2-ui/scripting/UiExtensions.h index fca8c95b9347..7b0ea4b664cf 100644 --- a/src/openrct2-ui/scripting/UiExtensions.h +++ b/src/openrct2-ui/scripting/UiExtensions.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/title/TitleSequencePlayer.cpp b/src/openrct2-ui/title/TitleSequencePlayer.cpp index 47867a9a0932..ceff734d9314 100644 --- a/src/openrct2-ui/title/TitleSequencePlayer.cpp +++ b/src/openrct2-ui/title/TitleSequencePlayer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include diff --git a/src/openrct2-ui/title/TitleSequencePlayer.h b/src/openrct2-ui/title/TitleSequencePlayer.h index d751a899ab7d..034988388424 100644 --- a/src/openrct2-ui/title/TitleSequencePlayer.h +++ b/src/openrct2-ui/title/TitleSequencePlayer.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2-ui/windows/AIAgentTerminal.cpp b/src/openrct2-ui/windows/AIAgentTerminal.cpp index b57adba8b8cf..7d0089e61acd 100644 --- a/src/openrct2-ui/windows/AIAgentTerminal.cpp +++ b/src/openrct2-ui/windows/AIAgentTerminal.cpp @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include #include #include @@ -76,6 +78,8 @@ using OpenRCT2::Terminal::TerminalSnapshot; using OpenRCT2::Terminal::BuildAIAgentLaunchPlan; using OpenRCT2::Terminal::SessionLogGenerator; using OpenRCT2::Ui::InputEvent; +using OpenRCT2::Drawing::PaletteIndex; +using OpenRCT2::Drawing::RenderTarget; namespace Rect = OpenRCT2::Drawing::Rectangle; #ifndef TTF_GlyphIsProvided32 @@ -221,7 +225,7 @@ namespace // ColourMapA[COLOUR_BLACK].mid_dark, so cells with black backgrounds should too. if (colour.r == 0 && colour.g == 0 && colour.b == 0) { - return ColourMapA[COLOUR_BLACK].mid_dark; + return static_cast(ColourMapA[COLOUR_BLACK].mid_dark); } const uint32_t key = (static_cast(colour.r) << 16) | (static_cast(colour.g) << 8) @@ -233,7 +237,7 @@ namespace const auto& palette = gPalette; uint32_t bestScore = std::numeric_limits::max(); - uint8_t bestIndex = ColourMapA[COLOUR_BLACK].mid_dark; + uint8_t bestIndex = static_cast(ColourMapA[COLOUR_BLACK].mid_dark); for (uint32_t i = 0; i < OpenRCT2::Drawing::kGamePaletteSize; i++) { if (!IsStableIndex(i)) @@ -1260,7 +1264,7 @@ namespace OpenRCT2::Ui::Windows int32_t canvasB = windowPos.y + canvasWidget.bottom; // Get fill color from colour map - uint8_t fillColour = ColourMapA[colour.colour].mid_light; + PaletteIndex fillColour = ColourMapA[colour.colour].mid_light; // Draw the 3D frame border (outset style) Rect::fillInset( @@ -2046,8 +2050,9 @@ namespace OpenRCT2::Ui::Windows const uint8_t foreground = TerminalPaletteMapper::Instance().Map(cell.foregroundRgb); TextDrawInfo drawInfo{}; - drawInfo.palette[1] = foreground; - drawInfo.palette[3] = foreground; + drawInfo.palette.fill = static_cast(foreground); + drawInfo.palette.sunnyOutline = static_cast(foreground); + drawInfo.palette.shadowOutline = static_cast(foreground); const int32_t glyphWidth = surface->w; const int32_t glyphHeight = surface->h; @@ -2067,7 +2072,7 @@ namespace OpenRCT2::Ui::Windows { const ScreenCoordsXY underlineStart = cellPos + ScreenCoordsXY{ 0, _cellHeight - 2 }; const ScreenCoordsXY underlineEnd = underlineStart + ScreenCoordsXY{ cellWidthPx - 1, 1 }; - Rect::fill(rt, { underlineStart, underlineEnd }, static_cast(foreground)); + Rect::fill(rt, { underlineStart, underlineEnd }, static_cast(foreground)); } #else (void)rt; @@ -2141,7 +2146,7 @@ namespace OpenRCT2::Ui::Windows _offscreenHeight = height; // Clear to background color - std::fill_n(_offscreenBuffer.get(), bufferSize, ColourMapA[COLOUR_BLACK].mid_dark); + std::fill_n(_offscreenBuffer.get(), bufferSize, static_cast(ColourMapA[COLOUR_BLACK].mid_dark)); } void AIAgentTerminalWindow::BlitOffscreenToScreen( @@ -2352,7 +2357,7 @@ namespace OpenRCT2::Ui::Windows ScreenCoordsXY cellPos = rowOrigin + ScreenCoordsXY{ col * _cellWidth, 0 }; ScreenCoordsXY cellEnd = cellPos + ScreenCoordsXY{ cellWidthPx - 1, _cellHeight - 1 }; const auto background = TerminalPaletteMapper::Instance().Map(cell.backgroundRgb); - Rect::fill(rt, { cellPos, cellEnd }, static_cast(background)); + Rect::fill(rt, { cellPos, cellEnd }, static_cast(background)); if (cell.codepoint <= U' ') return; diff --git a/src/openrct2-ui/windows/About.cpp b/src/openrct2-ui/windows/About.cpp index dffaab089add..9dd5aaddea71 100644 --- a/src/openrct2-ui/windows/About.cpp +++ b/src/openrct2-ui/windows/About.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -147,7 +147,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -219,7 +219,7 @@ namespace OpenRCT2::Ui::Windows } } - int32_t DrawOpenRCT2Info(RenderTarget& rt) + int32_t DrawOpenRCT2Info(Drawing::RenderTarget& rt) { // Draw logo on placeholder widget const auto& logoWidget = widgets[WIDX_OPENRCT2_LOGO]; @@ -234,7 +234,7 @@ namespace OpenRCT2::Ui::Windows auto centreX = versionWidget.midX(); auto centreY = versionWidget.midY() - FontGetLineHeight(FontStyle::medium) / 2; auto centrePos = windowPos + ScreenCoordsXY(centreX, centreY); - DrawTextWrapped(rt, centrePos, versionWidget.width(), STR_STRING, ft, { colours[1], TextAlignment::centre }); + DrawTextWrapped(rt, centrePos, versionWidget.width() - 1, STR_STRING, ft, { colours[1], TextAlignment::centre }); // Shows the update available button if (OpenRCT2::GetContext()->HasNewVersionInfo()) @@ -252,7 +252,7 @@ namespace OpenRCT2::Ui::Windows return textCoords.y - windowPos.y; } - int32_t DrawRCT2Info(RenderTarget& rt) + int32_t DrawRCT2Info(Drawing::RenderTarget& rt) { auto& backgroundWidget = widgets[WIDX_PAGE_BACKGROUND]; auto textCoords = windowPos + ScreenCoordsXY{ backgroundWidget.midX(), backgroundWidget.top + kPadding }; diff --git a/src/openrct2-ui/windows/AssetPacks.cpp b/src/openrct2-ui/windows/AssetPacks.cpp index a56f342c5a28..9c9f295e5468 100644 --- a/src/openrct2-ui/windows/AssetPacks.cpp +++ b/src/openrct2-ui/windows/AssetPacks.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -155,7 +155,7 @@ namespace OpenRCT2::Ui::Windows { auto& list = widgets[WIDX_LIST]; list.left = 6; - list.top = widgets[WIDX_TITLE].height() + 8 + 11 + 3; + list.top = widgets[WIDX_TITLE].height() - 1 + 8 + 11 + 3; list.right = width - 2 - 24 - 1; list.bottom = height - 6 - 11 - 3; @@ -168,7 +168,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_LOW_LABEL].left = list.left; widgets[WIDX_LOW_LABEL].right = list.right; - auto toolstripY = widgets[WIDX_TITLE].height() + 8; + auto toolstripY = widgets[WIDX_TITLE].height() - 1 + 8; auto toolstripRight = width - 2; auto toolstripLeft = toolstripRight - 24; for (WidgetIndex i = WIDX_MOVE_UP; i <= WIDX_APPLY; i++) @@ -187,12 +187,12 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_APPLY].top = widgets[WIDX_APPLY].bottom - 24; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { auto rtCoords = ScreenCoordsXY{ rt.x, rt.y }; Rectangle::fill( @@ -237,7 +237,7 @@ namespace OpenRCT2::Ui::Windows } private: - void PaintItem(RenderTarget& rt, int32_t y, Formatter& ft, bool isChecked, bool isSelected, bool isHighlighted) + void PaintItem(Drawing::RenderTarget& rt, int32_t y, Formatter& ft, bool isChecked, bool isSelected, bool isHighlighted) { auto listWidth = widgets[WIDX_LIST].right - widgets[WIDX_LIST].left; auto stringId = STR_BLACK_STRING; @@ -258,7 +258,7 @@ namespace OpenRCT2::Ui::Windows PaintCheckbox(rt, { { 2, y + 1 }, { 2 + checkboxSize + 1, y + 1 + checkboxSize } }, isChecked); } - void PaintCheckbox(RenderTarget& rt, const ScreenRect& rect, bool checked) + void PaintCheckbox(Drawing::RenderTarget& rt, const ScreenRect& rect, bool checked) { Rectangle::fillInset( rt, rect, colours[1], Rectangle::BorderStyle::inset, Rectangle::FillBrightness::dark, diff --git a/src/openrct2-ui/windows/Banner.cpp b/src/openrct2-ui/windows/Banner.cpp index c3af9270811e..02a1ec52fb3b 100644 --- a/src/openrct2-ui/windows/Banner.cpp +++ b/src/openrct2-ui/windows/Banner.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -88,7 +88,7 @@ namespace OpenRCT2::Ui::Windows const auto& viewportWidget = widgets[WIDX_VIEWPORT]; ViewportCreate( *this, windowPos + ScreenCoordsXY{ viewportWidget.left + 1, viewportWidget.top + 1 }, - (viewportWidget.width()) - 1, (viewportWidget.height()) - 1, Focus(_bannerViewPos)); + viewportWidget.width() - 2, viewportWidget.height() - 2, Focus(_bannerViewPos)); if (viewport != nullptr) viewport->flags = Config::Get().general.alwaysShowGridlines ? VIEWPORT_FLAG_GRIDLINES : VIEWPORT_FLAG_NONE; @@ -176,8 +176,8 @@ namespace OpenRCT2::Ui::Windows widget--; WindowDropdownShowTextCustomWidth( - { widget->left + windowPos.x, widget->top + windowPos.y }, widget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, numItems, widget->width() + 3); + { widget->left + windowPos.x, widget->top + windowPos.y }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, numItems, widget->width() - 1 + 3); gDropdown.items[EnumValue(banner->textColour) - 1].setChecked(true); break; @@ -269,7 +269,7 @@ namespace OpenRCT2::Ui::Windows createViewport(); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); diff --git a/src/openrct2-ui/windows/Changelog.cpp b/src/openrct2-ui/windows/Changelog.cpp index b573cb6f636f..5fe275e59ce9 100644 --- a/src/openrct2-ui/windows/Changelog.cpp +++ b/src/openrct2-ui/windows/Changelog.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -142,7 +143,7 @@ namespace OpenRCT2::Ui::Windows { SetResizeDimensions(); - auto downloadButtonWidth = widgets[WIDX_OPEN_URL].width(); + auto downloadButtonWidth = widgets[WIDX_OPEN_URL].width() - 1; widgets[WIDX_OPEN_URL].left = (width - downloadButtonWidth) / 2; widgets[WIDX_OPEN_URL].right = widgets[WIDX_OPEN_URL].left + downloadButtonWidth; } @@ -175,7 +176,7 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { const int32_t lineHeight = FontGetLineHeight(FontStyle::medium); diff --git a/src/openrct2-ui/windows/Cheats.cpp b/src/openrct2-ui/windows/Cheats.cpp index 73d18712f3b3..3240732f1296 100644 --- a/src/openrct2-ui/windows/Cheats.cpp +++ b/src/openrct2-ui/windows/Cheats.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -593,7 +594,7 @@ static StringId window_cheats_page_titles[] = { } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -775,7 +776,7 @@ static StringId window_cheats_page_titles[] = { } } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { // Money tab if (!isWidgetDisabled(WIDX_TAB_1)) @@ -848,12 +849,12 @@ static StringId window_cheats_page_titles[] = { switch (widgetIndex) { case WIDX_MONEY_SPINNER_INCREMENT: - _moneySpinnerValue = AddClamp( + _moneySpinnerValue = AddClamp( kCheatsMoneyIncrement * (_moneySpinnerValue / kCheatsMoneyIncrement), kCheatsMoneyIncrement); invalidateWidget(WIDX_MONEY_SPINNER); break; case WIDX_MONEY_SPINNER_DECREMENT: - _moneySpinnerValue = AddClamp( + _moneySpinnerValue = AddClamp( kCheatsMoneyIncrement * (_moneySpinnerValue / kCheatsMoneyIncrement), -kCheatsMoneyIncrement); invalidateWidget(WIDX_MONEY_SPINNER); break; @@ -883,29 +884,25 @@ static StringId window_cheats_page_titles[] = { case WIDX_MONTH_UP: _monthSpinnerValue++; _monthSpinnerValue = std::clamp(_monthSpinnerValue, 1, static_cast(MONTH_COUNT)); - _daySpinnerValue = std::clamp( - _daySpinnerValue, 1, static_cast(Date::GetDaysInMonth(_monthSpinnerValue - 1))); + _daySpinnerValue = std::clamp(_daySpinnerValue, 1, Date::GetDaysInMonth(_monthSpinnerValue - 1)); invalidateWidget(WIDX_MONTH_BOX); invalidateWidget(WIDX_DAY_BOX); break; case WIDX_MONTH_DOWN: _monthSpinnerValue--; _monthSpinnerValue = std::clamp(_monthSpinnerValue, 1, static_cast(MONTH_COUNT)); - _daySpinnerValue = std::clamp( - _daySpinnerValue, 1, static_cast(Date::GetDaysInMonth(_monthSpinnerValue - 1))); + _daySpinnerValue = std::clamp(_daySpinnerValue, 1, Date::GetDaysInMonth(_monthSpinnerValue - 1)); invalidateWidget(WIDX_MONTH_BOX); invalidateWidget(WIDX_DAY_BOX); break; case WIDX_DAY_UP: _daySpinnerValue++; - _daySpinnerValue = std::clamp( - _daySpinnerValue, 1, static_cast(Date::GetDaysInMonth(_monthSpinnerValue - 1))); + _daySpinnerValue = std::clamp(_daySpinnerValue, 1, Date::GetDaysInMonth(_monthSpinnerValue - 1)); invalidateWidget(WIDX_DAY_BOX); break; case WIDX_DAY_DOWN: _daySpinnerValue--; - _daySpinnerValue = std::clamp( - _daySpinnerValue, 1, static_cast(Date::GetDaysInMonth(_monthSpinnerValue - 1))); + _daySpinnerValue = std::clamp(_daySpinnerValue, 1, Date::GetDaysInMonth(_monthSpinnerValue - 1)); invalidateWidget(WIDX_DAY_BOX); break; case WIDX_DATE_SET: @@ -994,8 +991,8 @@ static StringId window_cheats_page_titles[] = { } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, 3, dropdownWidget->width() - 3); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), + colours[1], 0, Dropdown::Flag::StayOpen, 3, dropdownWidget->width() - 4); gDropdown.items[EnumValue(gameState.cheats.selectedStaffSpeed)].setChecked(true); } } @@ -1016,8 +1013,8 @@ static StringId window_cheats_page_titles[] = { gDropdown.items[i] = Dropdown::MenuLabel(WeatherTypes[i]); } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, std::size(WeatherTypes), dropdownWidget->width() - 3); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), + colours[1], 0, Dropdown::Flag::StayOpen, std::size(WeatherTypes), dropdownWidget->width() - 4); auto currentWeather = gameState.weatherCurrent.weatherType; gDropdown.items[EnumValue(currentWeather)].setChecked(true); diff --git a/src/openrct2-ui/windows/ClearScenery.cpp b/src/openrct2-ui/windows/ClearScenery.cpp index 6cddde3b3f9e..7a86c3ea78be 100644 --- a/src/openrct2-ui/windows/ClearScenery.cpp +++ b/src/openrct2-ui/windows/ClearScenery.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -171,7 +172,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_PREVIEW].image = ImageId(LandTool::SizeToSpriteIndex(gLandToolSize)); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -218,7 +219,6 @@ namespace OpenRCT2::Ui::Windows { uint8_t state_changed = 0; - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enable); auto mapTile = ScreenGetMapXY(screenPos, nullptr); @@ -228,7 +228,7 @@ namespace OpenRCT2::Ui::Windows return state_changed; } - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) { gMapSelectFlags.set(MapSelectFlag::enable); state_changed++; @@ -275,7 +275,6 @@ namespace OpenRCT2::Ui::Windows state_changed++; } - MapInvalidateSelectionRect(); return state_changed; } @@ -290,7 +289,7 @@ namespace OpenRCT2::Ui::Windows auto action = GetClearAction(); auto result = GameActions::Query(&action, getGameState()); - auto cost = (result.Error == GameActions::Status::Ok ? result.Cost : kMoney64Undefined); + auto cost = (result.error == GameActions::Status::ok ? result.cost : kMoney64Undefined); if (_clearSceneryCost != cost) { _clearSceneryCost = cost; @@ -331,7 +330,7 @@ namespace OpenRCT2::Ui::Windows case WIDX_BACKGROUND: { auto* windowMgr = GetWindowManager(); - if (windowMgr->FindByClass(WindowClass::error) == nullptr && (gMapSelectFlags.has(MapSelectFlag::enable))) + if (windowMgr->FindByClass(WindowClass::error) == nullptr && gMapSelectFlags.has(MapSelectFlag::enable)) { auto action = GetClearAction(); GameActions::Execute(&action, getGameState()); @@ -347,7 +346,6 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_BACKGROUND: - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enable); gCurrentToolId = Tool::bulldozer; break; @@ -387,7 +385,7 @@ namespace OpenRCT2::Ui::Windows ShowGridlines(); auto* toolWindow = ContextOpenWindow(WindowClass::clearScenery); ToolSet(*toolWindow, WIDX_BACKGROUND, Tool::bulldozer); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); } } } // namespace OpenRCT2::Ui::Windows diff --git a/src/openrct2-ui/windows/CustomCurrency.cpp b/src/openrct2-ui/windows/CustomCurrency.cpp index ab8f25dfe5ec..28d727df5a42 100644 --- a/src/openrct2-ui/windows/CustomCurrency.cpp +++ b/src/openrct2-ui/windows/CustomCurrency.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -91,8 +91,8 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[1] = Dropdown::MenuLabel(STR_SUFFIX); WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, 2, widget->width() - 3); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, 2, widget->width() - 4); if (CurrencyDescriptors[EnumValue(CurrencyType::custom)].affix_unicode == CurrencyAffix::prefix) { @@ -187,14 +187,14 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { auto ft = Formatter::Common(); ft.Add(10.00_GBP); drawWidgets(rt); - auto screenCoords = windowPos + ScreenCoordsXY{ 10, 18 + widgets[WIDX_TITLE].height() }; + auto screenCoords = windowPos + ScreenCoordsXY{ 10, 18 + widgets[WIDX_TITLE].height() - 1 }; DrawTextBasic(rt, screenCoords, STR_RATE, {}, { colours[1] }); diff --git a/src/openrct2-ui/windows/DebugPaint.cpp b/src/openrct2-ui/windows/DebugPaint.cpp index c15f9caae365..5fe25b22c73d 100644 --- a/src/openrct2-ui/windows/DebugPaint.cpp +++ b/src/openrct2-ui/windows/DebugPaint.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -154,7 +155,7 @@ namespace OpenRCT2::Ui::Windows setCheckboxValue(WIDX_TOGGLE_FORCE_REDRAW, gPaintForceRedraw); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); } diff --git a/src/openrct2-ui/windows/DemolishRidePrompt.cpp b/src/openrct2-ui/windows/DemolishRidePrompt.cpp index 8d8bfafcef53..4309c925829b 100644 --- a/src/openrct2-ui/windows/DemolishRidePrompt.cpp +++ b/src/openrct2-ui/windows/DemolishRidePrompt.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -73,7 +73,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); diff --git a/src/openrct2-ui/windows/Dropdown.cpp b/src/openrct2-ui/windows/Dropdown.cpp index 2227a1d8182a..1cc85c6056ab 100644 --- a/src/openrct2-ui/windows/Dropdown.cpp +++ b/src/openrct2-ui/windows/Dropdown.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -104,7 +104,7 @@ namespace OpenRCT2::Ui::Windows DrawTextEllipsised(rt, { screenCoords.x + 2, screenCoords.y + yOffset }, width - 7, format, ft, { colour }); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -640,7 +640,7 @@ namespace OpenRCT2::Ui::Windows // Show dropdown auto squareSize = DropdownWindow::GetDefaultRowHeight(); WindowDropdownShowImage( - w->windowPos.x + widget->left, w->windowPos.y + widget->top, widget->height() + 1, dropdownColour, + w->windowPos.x + widget->left, w->windowPos.y + widget->top, widget->height(), dropdownColour, Dropdown::Flag::StayOpen, numColours, squareSize, squareSize, DropdownGetAppropriateImageDropdownItemsPerRow(static_cast(numColours))); diff --git a/src/openrct2-ui/windows/EditorBottomToolbar.cpp b/src/openrct2-ui/windows/EditorBottomToolbar.cpp index 5f281d28e271..6d4d1e151c90 100644 --- a/src/openrct2-ui/windows/EditorBottomToolbar.cpp +++ b/src/openrct2-ui/windows/EditorBottomToolbar.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,9 +19,10 @@ #include #include #include +#include #include +#include #include -#include #include #include #include @@ -125,7 +126,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { auto drawPreviousButton = widgets[WIDX_PREVIOUS_STEP_BUTTON].type != WidgetType::empty; auto drawNextButton = widgets[WIDX_NEXT_STEP_BUTTON].type != WidgetType::empty; @@ -334,7 +335,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_NEXT_IMAGE].type = WidgetType::empty; } - void DrawLeftButtonBack(RenderTarget& rt) + void DrawLeftButtonBack(Drawing::RenderTarget& rt) { const auto& previousWidget = widgets[WIDX_PREVIOUS_IMAGE]; auto leftTop = windowPos + ScreenCoordsXY{ previousWidget.left, previousWidget.top }; @@ -342,7 +343,7 @@ namespace OpenRCT2::Ui::Windows Rectangle::filter(rt, { leftTop, rightBottom }, FilterPaletteID::palette51); } - void DrawLeftButton(RenderTarget& rt) + void DrawLeftButton(Drawing::RenderTarget& rt) { const auto topLeft = windowPos + ScreenCoordsXY{ widgets[WIDX_PREVIOUS_IMAGE].left + 1, widgets[WIDX_PREVIOUS_IMAGE].top + 1 }; @@ -374,7 +375,7 @@ namespace OpenRCT2::Ui::Windows DrawTextBasic(rt, { textX, textY + 10 }, stringId, {}, { textColour, TextAlignment::centre }); } - void DrawRightButtonBack(RenderTarget& rt) + void DrawRightButtonBack(Drawing::RenderTarget& rt) { auto nextWidget = widgets[WIDX_NEXT_IMAGE]; auto leftTop = windowPos + ScreenCoordsXY{ nextWidget.left, nextWidget.top }; @@ -382,7 +383,7 @@ namespace OpenRCT2::Ui::Windows Rectangle::filter(rt, { leftTop, rightBottom }, FilterPaletteID::palette51); } - void DrawRightButton(RenderTarget& rt) + void DrawRightButton(Drawing::RenderTarget& rt) { const auto topLeft = windowPos + ScreenCoordsXY{ widgets[WIDX_NEXT_IMAGE].left + 1, widgets[WIDX_NEXT_IMAGE].top + 1 }; @@ -415,7 +416,7 @@ namespace OpenRCT2::Ui::Windows DrawTextBasic(rt, { textX, textY + 10 }, stringId, {}, { textColour, TextAlignment::centre }); } - void DrawStepText(RenderTarget& rt) + void DrawStepText(Drawing::RenderTarget& rt) { int16_t stateX = (widgets[WIDX_PREVIOUS_IMAGE].right + widgets[WIDX_NEXT_IMAGE].left) / 2 + windowPos.x; int16_t stateY = height - 0x0C + windowPos.y; diff --git a/src/openrct2-ui/windows/EditorInventionsList.cpp b/src/openrct2-ui/windows/EditorInventionsList.cpp index a9cacc26a211..2e913f209919 100644 --- a/src/openrct2-ui/windows/EditorInventionsList.cpp +++ b/src/openrct2-ui/windows/EditorInventionsList.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -269,15 +270,15 @@ namespace OpenRCT2::Ui::Windows WindowEditorInventionsListDragOpen(researchItem, windowPos, widgets[WIDX_PRE_RESEARCHED_SCROLL].right); } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { const auto& gameState = getGameState(); // Draw background - uint8_t paletteIndex = ColourMapA[colours[1].colour].mid_light; + auto paletteIndex = ColourMapA[colours[1].colour].mid_light; GfxClear(rt, paletteIndex); - int16_t boxWidth = widgets[WIDX_RESEARCH_ORDER_SCROLL].width(); + int16_t boxWidth = widgets[WIDX_RESEARCH_ORDER_SCROLL].width() - 1; int32_t itemY = -kScrollableRowHeight; auto* dragItem = WindowEditorInventionsListDragGetItem(); @@ -354,7 +355,7 @@ namespace OpenRCT2::Ui::Windows return fallback; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -400,13 +401,13 @@ namespace OpenRCT2::Ui::Windows const auto* object = ObjectEntryGetObject(objectEntryType, researchItem->entryIndex); if (object != nullptr) { - RenderTarget clipDPI; + RenderTarget clipRT; screenPos = windowPos + ScreenCoordsXY{ bkWidget.left + 1, bkWidget.top + 1 }; - const auto clipWidth = bkWidget.width() - 1; - const auto clipHeight = bkWidget.height() - 1; - if (ClipDrawPixelInfo(clipDPI, rt, screenPos, clipWidth, clipHeight)) + const auto clipWidth = bkWidget.width() - 2; + const auto clipHeight = bkWidget.height() - 2; + if (ClipRenderTarget(clipRT, rt, screenPos, clipWidth, clipHeight)) { - object->DrawPreview(clipDPI, clipWidth, clipHeight); + object->DrawPreview(clipRT, clipWidth, clipHeight); } } @@ -655,7 +656,7 @@ namespace OpenRCT2::Ui::Windows close(); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { auto screenCoords = windowPos + ScreenCoordsXY{ 0, 2 }; diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index c35b391bb7f8..5307524b8889 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -22,13 +22,14 @@ #include #include #include +#include #include #include #include #include #include +#include #include -#include #include #include #include @@ -533,7 +534,7 @@ namespace OpenRCT2::Ui::Windows auto& ddWidget = widgets[WIDX_FILTER_DROPDOWN]; WindowDropdownShowText( - { windowPos.x + ddWidget.left, windowPos.y + ddWidget.top }, ddWidget.height() + 1, + { windowPos.x + ddWidget.left, windowPos.y + ddWidget.top }, ddWidget.height(), colours[ddWidget.colour], Dropdown::Flag::StayOpen, _numSourceGameItems + numSelectionItems); for (int32_t i = 0; i < _numSourceGameItems; i++) @@ -655,8 +656,8 @@ namespace OpenRCT2::Ui::Windows const auto objectSelectResult = WindowEditorObjectSelectionSelectObject(0, inputFlags, listItem->repositoryItem); if (!objectSelectResult.Successful) { - StringId error_title = (inputFlags.has(EditorInputFlag::select)) ? STR_UNABLE_TO_SELECT_THIS_OBJECT - : STR_UNABLE_TO_DE_SELECT_THIS_OBJECT; + StringId error_title = inputFlags.has(EditorInputFlag::select) ? STR_UNABLE_TO_SELECT_THIS_OBJECT + : STR_UNABLE_TO_DE_SELECT_THIS_OBJECT; ContextShowError(error_title, objectSelectResult.Message, {}); return; @@ -725,13 +726,13 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { // ScrollPaint ScreenCoordsXY screenCoords; bool ridePage = (GetSelectedObjectType() == ObjectType::ride); - uint8_t paletteIndex = ColourMapA[colours[1].colour].mid_light; + auto paletteIndex = ColourMapA[colours[1].colour].mid_light; GfxClear(rt, paletteIndex); screenCoords.y = 0; @@ -783,7 +784,7 @@ namespace OpenRCT2::Ui::Windows darkness = TextDarkness::dark; } - int32_t width_limit = widgets[WIDX_LIST].width() - screenCoords.x; + int32_t width_limit = widgets[WIDX_LIST].width() - 1 - screenCoords.x; if (ridePage) { @@ -859,7 +860,7 @@ namespace OpenRCT2::Ui::Windows auto& dropdownWidget = widgets[WIDX_FILTER_DROPDOWN]; resizeDropdown(WIDX_FILTER_DROPDOWN, { width - kFilterWidth - 10, dropdownWidget.top }, { kFilterWidth, 14 }); auto& installTrackWidget = widgets[WIDX_INSTALL_TRACK]; - installTrackWidget.moveToX(dropdownWidget.left - installTrackWidget.width() - 10); + installTrackWidget.moveToX(dropdownWidget.left - installTrackWidget.width() - 11); // Set pressed widgets pressedWidgets |= 1uLL << WIDX_PREVIEW; @@ -917,7 +918,7 @@ namespace OpenRCT2::Ui::Windows for (size_t i = 0; i < std::size(ObjectSelectionPages); i++) { auto& widget = widgets[WIDX_TAB_1 + i]; - if (ObjectSelectionPages[i].Image != kSpriteIdNull) + if (ObjectSelectionPages[i].Image != kImageIndexUndefined) { widget.type = WidgetType::tab; widget.left = x; @@ -978,7 +979,7 @@ namespace OpenRCT2::Ui::Windows bool isRideTab = GetSelectedObjectType() == ObjectType::ride; if (isRideTab) { - int32_t width_limit = (widgets[WIDX_LIST].width() - 15) / 2; + int32_t width_limit = (widgets[WIDX_LIST].width() - 16) / 2; widgets[WIDX_LIST_SORT_TYPE].type = WidgetType::tableHeader; widgets[WIDX_LIST_SORT_TYPE].top = widgets[WIDX_FILTER_TEXT_BOX].bottom + 3; @@ -1008,7 +1009,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_PREVIEW].right = widgets[WIDX_PREVIEW].left + kPreviewSize; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -1091,7 +1092,7 @@ namespace OpenRCT2::Ui::Windows : kStringIdNone; ft.Add(stringId); auto screenPos = windowPos + ScreenCoordsXY{ listSortTypeWidget.left + 1, listSortTypeWidget.top + 1 }; - DrawTextEllipsised(rt, screenPos, listSortTypeWidget.width(), STR_OBJECTS_SORT_TYPE, ft, { colours[1] }); + DrawTextEllipsised(rt, screenPos, listSortTypeWidget.width() - 1, STR_OBJECTS_SORT_TYPE, ft, { colours[1] }); } const auto& listSortRideWidget = widgets[WIDX_LIST_SORT_RIDE]; if (listSortRideWidget.type != WidgetType::empty) @@ -1101,7 +1102,7 @@ namespace OpenRCT2::Ui::Windows : kStringIdNone; ft.Add(stringId); auto screenPos = windowPos + ScreenCoordsXY{ listSortRideWidget.left + 1, listSortRideWidget.top + 1 }; - DrawTextEllipsised(rt, screenPos, listSortRideWidget.width(), STR_OBJECTS_SORT_RIDE, ft, { colours[1] }); + DrawTextEllipsised(rt, screenPos, listSortRideWidget.width() - 1, STR_OBJECTS_SORT_RIDE, ft, { colours[1] }); } if (selectedListItem == -1 || _loadedObject == nullptr) @@ -1109,13 +1110,13 @@ namespace OpenRCT2::Ui::Windows // Draw preview { - RenderTarget clipDPI; + RenderTarget clipRT; auto screenPos = windowPos + ScreenCoordsXY{ previewWidget.left + 1, previewWidget.top + 1 }; - int32_t previewWidth = previewWidget.width() - 1; - int32_t previewHeight = previewWidget.height() - 1; - if (ClipDrawPixelInfo(clipDPI, rt, screenPos, previewWidth, previewHeight)) + int32_t previewWidth = previewWidget.width() - 2; + int32_t previewHeight = previewWidget.height() - 2; + if (ClipRenderTarget(clipRT, rt, screenPos, previewWidth, previewHeight)) { - _loadedObject->DrawPreview(clipDPI, previewWidth, previewHeight); + _loadedObject->DrawPreview(clipRT, previewWidth, previewHeight); } } @@ -1248,7 +1249,7 @@ namespace OpenRCT2::Ui::Windows _listItems.shrink_to_fit(); } - void DrawDescriptions(RenderTarget& rt) + void DrawDescriptions(Drawing::RenderTarget& rt) { auto screenPos = windowPos + ScreenCoordsXY{ widgets[WIDX_PREVIEW].midX(), widgets[WIDX_PREVIEW].bottom + 3 }; auto descriptionWidth = width - widgets[WIDX_LIST].right - 12; @@ -1356,7 +1357,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawDebugData(RenderTarget& rt) + void DrawDebugData(Drawing::RenderTarget& rt) { ObjectListItem* listItem = &_listItems[selectedListItem]; auto screenPos = windowPos + ScreenCoordsXY{ width - 5, height - (kListRowHeight * 6) }; diff --git a/src/openrct2-ui/windows/EditorParkEntrance.cpp b/src/openrct2-ui/windows/EditorParkEntrance.cpp index 18d9c0102062..b88328ca1fcd 100644 --- a/src/openrct2-ui/windows/EditorParkEntrance.cpp +++ b/src/openrct2-ui/windows/EditorParkEntrance.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -30,6 +31,7 @@ #include using namespace OpenRCT2::Drawing; +using OpenRCT2::GameActions::CommandFlag; namespace OpenRCT2::Ui::Windows { @@ -41,12 +43,13 @@ namespace OpenRCT2::Ui::Windows static constexpr int32_t kScrollWidth = (kImageSize * kNumColumns) + kScrollBarWidth + 4; static constexpr int32_t kScrollHeight = (kImageSize * kNumRows); static constexpr ScreenSize kWindowSize = { kScrollWidth + 28, kScrollHeight + 51 }; + static bool _placingEntrance = false; struct EntranceSelection { ObjectEntryIndex entryIndex = kObjectEntryIndexNull; StringId stringId = kStringIdNone; - ImageIndex imageId = kSpriteIdNull; + ImageIndex imageId = kImageIndexUndefined; }; enum WindowEditorParkEntranceListWidgetIdx @@ -103,7 +106,7 @@ namespace OpenRCT2::Ui::Windows return numRows; } - void PaintPreview(RenderTarget& rt, ImageIndex imageStart, ScreenCoordsXY screenCoords, Direction direction) + void PaintPreview(Drawing::RenderTarget& rt, ImageIndex imageStart, ScreenCoordsXY screenCoords, Direction direction) { imageStart += (direction * 3); @@ -166,8 +169,11 @@ namespace OpenRCT2::Ui::Windows void PlaceParkEntranceToolUpdate(const ScreenCoordsXY& screenCoords) { - MapInvalidateSelectionRect(); - MapInvalidateMapSelectionTiles(); + if (_placingEntrance) + { + return; + } + gMapSelectFlags.unset(MapSelectFlag::enable, MapSelectFlag::enableArrow, MapSelectFlag::enableConstruct); CoordsXYZD parkEntrancePosition = PlaceParkEntranceGetMapPosition(screenCoords); if (parkEntrancePosition.IsNull()) @@ -177,12 +183,12 @@ namespace OpenRCT2::Ui::Windows } int32_t sideDirection = (parkEntrancePosition.direction + 1) & 3; - gMapSelectionTiles.clear(); - gMapSelectionTiles.push_back({ parkEntrancePosition.x, parkEntrancePosition.y }); - gMapSelectionTiles.push_back( + MapSelection::clearSelectedTiles(); + MapSelection::addSelectedTile({ parkEntrancePosition.x, parkEntrancePosition.y }); + MapSelection::addSelectedTile( { parkEntrancePosition.x + CoordsDirectionDelta[sideDirection].x, parkEntrancePosition.y + CoordsDirectionDelta[sideDirection].y }); - gMapSelectionTiles.push_back( + MapSelection::addSelectedTile( { parkEntrancePosition.x - CoordsDirectionDelta[sideDirection].x, parkEntrancePosition.y - CoordsDirectionDelta[sideDirection].y }); @@ -190,7 +196,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectArrowDirection = parkEntrancePosition.direction; gMapSelectFlags.set(MapSelectFlag::enableConstruct, MapSelectFlag::enableArrow); - MapInvalidateMapSelectionTiles(); if (gParkEntranceGhostExists && parkEntrancePosition == gParkEntranceGhostPosition) { return; @@ -198,14 +203,14 @@ namespace OpenRCT2::Ui::Windows ParkEntranceRemoveGhost(); - bool isLegacyPath = (gFootpathSelection.LegacyPath != kObjectEntryIndexNull); - auto pathIndex = isLegacyPath ? gFootpathSelection.LegacyPath : gFootpathSelection.NormalSurface; + bool isLegacyPath = (gFootpathSelection.legacyPath != kObjectEntryIndexNull); + auto pathIndex = isLegacyPath ? gFootpathSelection.legacyPath : gFootpathSelection.normalSurface; auto gameAction = GameActions::ParkEntrancePlaceAction( parkEntrancePosition, pathIndex, _selectedEntranceType, isLegacyPath); - gameAction.SetFlags(GAME_COMMAND_FLAG_GHOST); + gameAction.SetFlags({ CommandFlag::ghost }); auto result = GameActions::Execute(&gameAction, getGameState()); - if (result.Error == GameActions::Status::Ok) + if (result.error == GameActions::Status::ok) { gParkEntranceGhostPosition = parkEntrancePosition; gParkEntranceGhostExists = true; @@ -214,19 +219,23 @@ namespace OpenRCT2::Ui::Windows void PlaceParkEntranceToolDown(const ScreenCoordsXY& screenCoords) { + _placingEntrance = true; + gMapSelectFlags.unset(MapSelectFlag::enable, MapSelectFlag::enableArrow, MapSelectFlag::enableConstruct); ParkEntranceRemoveGhost(); CoordsXYZD parkEntrancePosition = PlaceParkEntranceGetMapPosition(screenCoords); if (!parkEntrancePosition.IsNull()) { - bool isLegacyPath = (gFootpathSelection.LegacyPath != kObjectEntryIndexNull); - auto pathIndex = isLegacyPath ? gFootpathSelection.LegacyPath : gFootpathSelection.NormalSurface; + bool isLegacyPath = (gFootpathSelection.legacyPath != kObjectEntryIndexNull); + auto pathIndex = isLegacyPath ? gFootpathSelection.legacyPath : gFootpathSelection.normalSurface; auto gameAction = GameActions::ParkEntrancePlaceAction( parkEntrancePosition, pathIndex, _selectedEntranceType, isLegacyPath); + gameAction.SetCallback( + [&](const GameActions::GameAction*, const GameActions::Result* result) { _placingEntrance = false; }); auto result = GameActions::Execute(&gameAction, getGameState()); - if (result.Error == GameActions::Status::Ok) + if (result.error == GameActions::Status::ok) { - Audio::Play3D(Audio::SoundId::placeItem, result.Position); + Audio::Play3D(Audio::SoundId::placeItem, result.position); } } } @@ -264,7 +273,7 @@ namespace OpenRCT2::Ui::Windows pressedWidgets |= 1LL << WIDX_TAB; ToolSet(*this, WIDX_LIST, Tool::entranceDown); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); } void onMouseUp(WidgetIndex widgetIndex) override @@ -299,7 +308,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_LIST].bottom = height - 5; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); GfxDrawSprite( @@ -307,7 +316,7 @@ namespace OpenRCT2::Ui::Windows windowPos + ScreenCoordsXY{ widgets[WIDX_TAB].left, widgets[WIDX_TAB].top }); } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { GfxClear(rt, ColourMapA[colours[1].colour].mid_light); @@ -333,14 +342,13 @@ namespace OpenRCT2::Ui::Windows rt, { coords, coords + ScreenCoordsXY{ kImageSize - 1, kImageSize - 1 } }, colours[1], borderStyle, fillBrightness); - RenderTarget clipDPI; + RenderTarget clipRT; auto screenPos = coords + ScreenCoordsXY{ kScrollPadding, kScrollPadding }; - if (ClipDrawPixelInfo( - clipDPI, rt, screenPos, kImageSize - (2 * kScrollPadding), kImageSize - (2 * kScrollPadding))) + if (ClipRenderTarget( + clipRT, rt, screenPos, kImageSize - (2 * kScrollPadding), kImageSize - (2 * kScrollPadding))) { PaintPreview( - clipDPI, entranceType.imageId, ScreenCoordsXY{ kImageSize / 2, kImageSize / 2 }, - gWindowSceneryRotation); + clipRT, entranceType.imageId, ScreenCoordsXY{ kImageSize / 2, kImageSize / 2 }, gWindowSceneryRotation); } // Next position @@ -415,6 +423,7 @@ namespace OpenRCT2::Ui::Windows window = windowMgr->Create( WindowClass::editorParkEntrance, kWindowSize, { WindowFlag::higherContrastOnPress, WindowFlag::resizable }); + _placingEntrance = false; return window; } } // namespace OpenRCT2::Ui::Windows diff --git a/src/openrct2-ui/windows/EditorScenarioOptions.cpp b/src/openrct2-ui/windows/EditorScenarioOptions.cpp index 44756ff062f1..668a33d6303d 100644 --- a/src/openrct2-ui/windows/EditorScenarioOptions.cpp +++ b/src/openrct2-ui/windows/EditorScenarioOptions.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -457,7 +457,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { switch (page) { @@ -515,7 +515,7 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { if (page == WINDOW_EDITOR_SCENARIO_OPTIONS_PAGE_RIDES) { @@ -590,7 +590,7 @@ namespace OpenRCT2::Ui::Windows setWidgetPressed(WIDX_TAB_1 + page, true); } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { Widget* widget; int32_t spriteIndex; @@ -766,8 +766,8 @@ namespace OpenRCT2::Ui::Windows Widget* dropdownWidget = &widgets[WIDX_OBJECTIVE]; WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, numItems, dropdownWidget->width() - 3); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, Dropdown::Flag::StayOpen, numItems, dropdownWidget->width() - 4); } void ShowCategoryDropdown() @@ -779,8 +779,8 @@ namespace OpenRCT2::Ui::Windows Widget* dropdownWidget = &widgets[WIDX_CATEGORY]; WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, 5, dropdownWidget->width() - 3); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, Dropdown::Flag::StayOpen, 5, dropdownWidget->width() - 4); gDropdown.items[EnumValue(getGameState().scenarioOptions.category)].setChecked(true); } @@ -1141,7 +1141,7 @@ namespace OpenRCT2::Ui::Windows * * rct2: 0x0067161C */ - void ObjectiveOnDraw(RenderTarget& rt) + void ObjectiveOnDraw(Drawing::RenderTarget& rt) { const auto& gameState = getGameState(); const auto& scenarioOptions = gameState.scenarioOptions; @@ -1272,7 +1272,7 @@ namespace OpenRCT2::Ui::Windows SetPressedTab(); } - void ScenarioDetailsOnDraw(RenderTarget& rt) + void ScenarioDetailsOnDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -1561,8 +1561,8 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[2] = Dropdown::MenuLabel(STR_PAID_ENTRY_PAID_RIDES); WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() - 1, - colours[1], 0, Dropdown::Flag::StayOpen, 3, dropdownWidget->width() - 3); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() - 2, + colours[1], 0, Dropdown::Flag::StayOpen, 3, dropdownWidget->width() - 4); if (gameState.park.flags & PARK_FLAGS_UNLOCK_ALL_PRICES) gDropdown.items[2].setChecked(true); @@ -1684,7 +1684,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_CLOSE].type = gLegacyScene == LegacyScene::scenarioEditor ? WidgetType::empty : WidgetType::closeBox; } - void FinancialDraw(RenderTarget& rt) + void FinancialDraw(Drawing::RenderTarget& rt) { ScreenCoordsXY screenCoords{}; @@ -1899,8 +1899,8 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[3] = Dropdown::MenuLabel(STR_GUESTS_PREFER_INTENSITY_MORE_INTENSE_RIDES); WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget.left, windowPos.y + dropdownWidget.top }, dropdownWidget.height() - 1, - colours[1], 0, Dropdown::Flag::StayOpen, 4, dropdownWidget.width() - 3); + { windowPos.x + dropdownWidget.left, windowPos.y + dropdownWidget.top }, dropdownWidget.height() - 2, + colours[1], 0, Dropdown::Flag::StayOpen, 4, dropdownWidget.width() - 4); const auto preferLess = gameState.park.flags & PARK_FLAGS_PREF_LESS_INTENSE_RIDES; const auto preferMore = gameState.park.flags & PARK_FLAGS_PREF_MORE_INTENSE_RIDES; @@ -1970,7 +1970,7 @@ namespace OpenRCT2::Ui::Windows setWidgetPressed(WIDX_HARD_GUEST_GENERATION, gameState.park.flags & PARK_FLAGS_DIFFICULT_GUEST_GENERATION); } - void GuestsDraw(RenderTarget& rt) + void GuestsDraw(Drawing::RenderTarget& rt) { ScreenCoordsXY screenCoords{}; @@ -2173,7 +2173,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_CLOSE].type = gLegacyScene == LegacyScene::scenarioEditor ? WidgetType::empty : WidgetType::closeBox; } - void LandDraw(RenderTarget& rt) + void LandDraw(Drawing::RenderTarget& rt) { ScreenCoordsXY screenCoords{}; @@ -2327,7 +2327,7 @@ namespace OpenRCT2::Ui::Windows * * rct2: 0x00672340 */ - void RidesOnDraw(RenderTarget& rt) + void RidesOnDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -2337,9 +2337,9 @@ namespace OpenRCT2::Ui::Windows * * rct2: 0x0067236F */ - void RidesOnScrollDraw(RenderTarget& rt, int32_t scrollIndex) + void RidesOnScrollDraw(Drawing::RenderTarget& rt, int32_t scrollIndex) { - int32_t colour = ColourMapA[colours[1].colour].mid_light; + auto colour = ColourMapA[colours[1].colour].mid_light; Rectangle::fill(rt, { { rt.x, rt.y }, { rt.x + rt.width - 1, rt.y + rt.height - 1 } }, colour); for (int32_t i = 0; i < static_cast(_rideableRides.size()); i++) diff --git a/src/openrct2-ui/windows/Error.cpp b/src/openrct2-ui/windows/Error.cpp index dc9762175f80..d91dae1098c7 100644 --- a/src/openrct2-ui/windows/Error.cpp +++ b/src/openrct2-ui/windows/Error.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -67,7 +67,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); diff --git a/src/openrct2-ui/windows/Finances.cpp b/src/openrct2-ui/windows/Finances.cpp index f70458016751..e0ed2ca1ac49 100644 --- a/src/openrct2-ui/windows/Finances.cpp +++ b/src/openrct2-ui/windows/Finances.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -346,7 +347,7 @@ namespace OpenRCT2::Ui::Windows onPrepareDrawGraph(graphPageWidget, centredGraph); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -395,7 +396,7 @@ namespace OpenRCT2::Ui::Windows return {}; } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { if (page != WINDOW_FINANCES_PAGE_SUMMARY) return; @@ -403,7 +404,7 @@ namespace OpenRCT2::Ui::Windows auto screenCoords = ScreenCoordsXY{ 0, kTableCellHeight + 2 }; auto& self = widgets[WIDX_SUMMARY_SCROLL]; - int32_t row_width = std::max(scrolls[0].contentWidth, self.width()); + int32_t row_width = std::max(scrolls[0].contentWidth, self.width() - 1); // Expenditure / Income row labels for (int32_t i = 0; i < static_cast(ExpenditureType::count); i++) @@ -414,7 +415,7 @@ namespace OpenRCT2::Ui::Windows rt, { screenCoords - ScreenCoordsXY{ 0, 1 }, screenCoords + ScreenCoordsXY{ row_width, (kTableCellHeight - 2) } }, - ColourMapA[colours[1].colour].lighter | 0x1000000); + ColourMapA[colours[1].colour].lighter, true); screenCoords.y += kTableCellHeight; } @@ -564,7 +565,7 @@ namespace OpenRCT2::Ui::Windows auto newLoan = gameState.park.bankLoan - 1000.00_GBP; if (gameState.park.bankLoan > 0) { - newLoan = std::max(static_cast(0LL), newLoan); + newLoan = std::max(0.00_GBP, newLoan); } auto gameAction = GameActions::ParkSetLoanAction(newLoan); GameActions::Execute(&gameAction, gameState); @@ -588,7 +589,7 @@ namespace OpenRCT2::Ui::Windows initialiseScrollPosition(WIDX_SUMMARY_SCROLL, 0); } - void onDrawSummary(RenderTarget& rt) + void onDrawSummary(Drawing::RenderTarget& rt) { auto titleBarBottom = widgets[WIDX_TITLE].bottom; auto screenCoords = windowPos + ScreenCoordsXY{ 8, titleBarBottom + 37 }; @@ -608,7 +609,7 @@ namespace OpenRCT2::Ui::Windows Rectangle::fill( rt, { screenCoords - ScreenCoordsXY{ 0, 1 }, screenCoords + ScreenCoordsXY{ 121, (kTableCellHeight - 2) } }, - ColourMapA[colours[1].colour].lighter | 0x1000000); + ColourMapA[colours[1].colour].lighter, true); DrawTextBasic(rt, screenCoords - ScreenCoordsXY{ 0, 1 }, _windowFinancesSummaryRowLabels[i]); screenCoords.y += kTableCellHeight; @@ -706,7 +707,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDrawMarketing(RenderTarget& rt) + void onDrawMarketing(Drawing::RenderTarget& rt) { auto screenCoords = windowPos + ScreenCoordsXY{ 8, widgets[WIDX_TAB_1].top + 45 }; int32_t noCampaignsActive = 1; @@ -785,7 +786,7 @@ namespace OpenRCT2::Ui::Windows #pragma region Graph Events - void onDrawGraph(RenderTarget& rt, const money64 currentValue, const StringId fmt) const + void onDrawGraph(Drawing::RenderTarget& rt, const money64 currentValue, const StringId fmt) const { Formatter ft; ft.Add(currentValue); @@ -847,12 +848,12 @@ namespace OpenRCT2::Ui::Windows void initialiseScrollPosition(WidgetIndex widgetIndex, int32_t scrollId) { const auto& widget = this->widgets[widgetIndex]; - scrolls[scrollId].contentOffsetX = std::max(0, scrolls[scrollId].contentWidth - (widget.width() - 2)); + scrolls[scrollId].contentOffsetX = std::max(0, scrolls[scrollId].contentWidth - (widget.width() - 3)); widgetScrollUpdateThumbs(*this, widgetIndex); } - void DrawTabImage(RenderTarget& rt, int32_t tabPage, int32_t spriteIndex) + void DrawTabImage(Drawing::RenderTarget& rt, int32_t tabPage, int32_t spriteIndex) { WidgetIndex widgetIndex = WIDX_TAB_1 + tabPage; @@ -870,7 +871,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { DrawTabImage(rt, WINDOW_FINANCES_PAGE_SUMMARY, SPR_TAB_FINANCES_SUMMARY_0); DrawTabImage(rt, WINDOW_FINANCES_PAGE_FINANCIAL_GRAPH, SPR_TAB_FINANCES_FINANCIAL_GRAPH_0); diff --git a/src/openrct2-ui/windows/Footpath.cpp b/src/openrct2-ui/windows/Footpath.cpp index 4e67f824c1fb..54bc10aaf740 100644 --- a/src/openrct2-ui/windows/Footpath.cpp +++ b/src/openrct2-ui/windows/Footpath.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -28,7 +28,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -47,6 +49,7 @@ #include using namespace OpenRCT2::Numerics; +using OpenRCT2::GameActions::CommandFlag; namespace OpenRCT2::Ui::Windows { @@ -240,7 +243,7 @@ namespace OpenRCT2::Ui::Windows ToolCancel(); _footpathConstructionMode = PathConstructionMode::onLand; ToolSet(*this, WIDX_CONSTRUCT_ON_LAND, Tool::pathDown); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); _footpathErrorOccured = false; WindowFootpathSetEnabledAndPressedWidgets(); @@ -254,7 +257,6 @@ namespace OpenRCT2::Ui::Windows { FootpathUpdateProvisional(); ViewportSetVisibility(ViewportVisibility::standard); - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); auto* windowMgr = Ui::GetWindowManager(); @@ -282,6 +284,11 @@ namespace OpenRCT2::Ui::Windows close(); break; case PathConstructionMode::dragArea: + // If another window has enabled a tool, close ours. + // If the user merely pressed Escape, we cancel the tool but don’t close the window. + if (gInputFlags.has(InputFlag::toolActive) + && gCurrentToolWidget.windowClassification != WindowClass::footpath) + close(); break; case PathConstructionMode::bridgeOrTunnelPick: if (!isToolActive(WindowClass::footpath, WIDX_CONSTRUCT_BRIDGE_OR_TUNNEL)) @@ -290,10 +297,6 @@ namespace OpenRCT2::Ui::Windows case PathConstructionMode::bridgeOrTunnel: break; } - - // If another window has enabled a tool, close ours. - if (gInputFlags.has(InputFlag::toolActive) && gCurrentToolWidget.windowClassification != WindowClass::footpath) - close(); } void onMouseDown(WidgetIndex widgetIndex) override @@ -344,11 +347,10 @@ namespace OpenRCT2::Ui::Windows _windowFootpathCost = kMoney64Undefined; ToolCancel(); FootpathUpdateProvisional(); - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); _footpathConstructionMode = PathConstructionMode::dragArea; ToolSet(*this, WIDX_CONSTRUCT_DRAG_AREA, Tool::pathDown); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); _footpathErrorOccured = false; WindowFootpathSetEnabledAndPressedWidgets(); } @@ -369,11 +371,10 @@ namespace OpenRCT2::Ui::Windows _windowFootpathCost = kMoney64Undefined; ToolCancel(); FootpathUpdateProvisional(); - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); _footpathConstructionMode = PathConstructionMode::onLand; ToolSet(*this, WIDX_CONSTRUCT_ON_LAND, Tool::pathDown); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); _footpathErrorOccured = false; WindowFootpathSetEnabledAndPressedWidgets(); break; @@ -394,11 +395,10 @@ namespace OpenRCT2::Ui::Windows _windowFootpathCost = kMoney64Undefined; ToolCancel(); FootpathUpdateProvisional(); - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); _footpathConstructionMode = PathConstructionMode::bridgeOrTunnelPick; ToolSet(*this, WIDX_CONSTRUCT_BRIDGE_OR_TUNNEL, Tool::crosshair); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); _footpathErrorOccured = false; WindowFootpathSetEnabledAndPressedWidgets(); break; @@ -413,33 +413,33 @@ namespace OpenRCT2::Ui::Windows auto entryIndex = _dropdownEntries[selectedIndex]; if (widgetIndex == WIDX_FOOTPATH_TYPE) { - gFootpathSelection.IsQueueSelected = false; + gFootpathSelection.isQueueSelected = false; if (entryIndex.first == ObjectType::paths) { - gFootpathSelection.LegacyPath = entryIndex.second; + gFootpathSelection.legacyPath = entryIndex.second; } else { - gFootpathSelection.LegacyPath = kObjectEntryIndexNull; - gFootpathSelection.NormalSurface = entryIndex.second; + gFootpathSelection.legacyPath = kObjectEntryIndexNull; + gFootpathSelection.normalSurface = entryIndex.second; } } else if (widgetIndex == WIDX_QUEUELINE_TYPE) { - gFootpathSelection.IsQueueSelected = true; + gFootpathSelection.isQueueSelected = true; if (entryIndex.first == ObjectType::paths) { - gFootpathSelection.LegacyPath = entryIndex.second; + gFootpathSelection.legacyPath = entryIndex.second; } else { - gFootpathSelection.LegacyPath = kObjectEntryIndexNull; - gFootpathSelection.QueueSurface = entryIndex.second; + gFootpathSelection.legacyPath = kObjectEntryIndexNull; + gFootpathSelection.queueSurface = entryIndex.second; } } else if (widgetIndex == WIDX_RAILINGS_TYPE) { - gFootpathSelection.Railings = entryIndex.second; + gFootpathSelection.railings = entryIndex.second; } else { @@ -527,14 +527,26 @@ namespace OpenRCT2::Ui::Windows // Press / unpress footpath and queue type buttons pressedWidgets &= ~(1uLL << WIDX_FOOTPATH_TYPE); pressedWidgets &= ~(1uLL << WIDX_QUEUELINE_TYPE); - pressedWidgets |= gFootpathSelection.IsQueueSelected ? (1uLL << WIDX_QUEUELINE_TYPE) : (1uLL << WIDX_FOOTPATH_TYPE); + pressedWidgets |= gFootpathSelection.isQueueSelected ? (1uLL << WIDX_QUEUELINE_TYPE) : (1uLL << WIDX_FOOTPATH_TYPE); // Enable / disable construct button widgets[WIDX_CONSTRUCT].type = _footpathConstructionMode == PathConstructionMode::bridgeOrTunnel ? WidgetType::imgBtn : WidgetType::empty; - if (gFootpathSelection.LegacyPath == kObjectEntryIndexNull) +#ifndef DISABLE_NETWORK + bool canDrag = true; + if (Network::GetMode() == Network::Mode::client) + { + canDrag = Network::CanPerformAction(Network::GetCurrentPlayerGroupIndex(), Network::Permission::dragPathArea); + } + if (canDrag) + disabledWidgets &= ~(1uLL << WIDX_CONSTRUCT_DRAG_AREA); + else + disabledWidgets |= (1uLL << WIDX_CONSTRUCT_DRAG_AREA); +#endif + + if (gFootpathSelection.legacyPath == kObjectEntryIndexNull) { widgets[WIDX_RAILINGS_TYPE].type = WidgetType::flatBtn; } @@ -544,7 +556,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { ScreenCoordsXY screenCoords; WindowDrawWidgets(*this, rt); @@ -557,9 +569,9 @@ namespace OpenRCT2::Ui::Windows auto slopeOffset = EnumValue(_footpathConstructSlope); std::optional baseImage; - if (gFootpathSelection.LegacyPath == kObjectEntryIndexNull) + if (gFootpathSelection.legacyPath == kObjectEntryIndexNull) { - auto selectedPath = gFootpathSelection.GetSelectedSurface(); + auto selectedPath = gFootpathSelection.getSelectedSurface(); const auto* pathType = GetPathSurfaceEntry(selectedPath); if (pathType != nullptr) { @@ -569,11 +581,11 @@ namespace OpenRCT2::Ui::Windows else { auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); - const auto* pathObj = objManager.GetLoadedObject(gFootpathSelection.LegacyPath); + const auto* pathObj = objManager.GetLoadedObject(gFootpathSelection.legacyPath); if (pathObj != nullptr) { auto pathEntry = reinterpret_cast(pathObj->GetLegacyData()); - if (gFootpathSelection.IsQueueSelected) + if (gFootpathSelection.isQueueSelected) baseImage = pathEntry->GetQueueImage(); else baseImage = pathEntry->image; @@ -632,10 +644,10 @@ namespace OpenRCT2::Ui::Windows } // Update provisional bridge mode path - if (!(_provisionalFootpath.flags.has(ProvisionalPathFlag::placed))) + if (!_provisionalFootpath.flags.has(ProvisionalPathFlag::placed)) { ObjectEntryIndex type; - ObjectEntryIndex railings = gFootpathSelection.Railings; + ObjectEntryIndex railings = gFootpathSelection.railings; CoordsXYZ footpathLoc; FootpathSlope slope; @@ -669,24 +681,23 @@ namespace OpenRCT2::Ui::Windows { gMapSelectFlags.unset(MapSelectFlag::enableArrow); } - MapInvalidateTileFull(footpathLoc); } } - void WindowFootpathDrawDropdownButtons(RenderTarget& rt) + void WindowFootpathDrawDropdownButtons(Drawing::RenderTarget& rt) { - if (gFootpathSelection.LegacyPath == kObjectEntryIndexNull) + if (gFootpathSelection.legacyPath == kObjectEntryIndexNull) { // Set footpath and queue type button images - auto pathImage = kSpriteIdNull; - auto queueImage = kSpriteIdNull; - auto pathEntry = GetPathSurfaceEntry(gFootpathSelection.NormalSurface); + auto pathImage = kImageIndexUndefined; + auto queueImage = kImageIndexUndefined; + auto pathEntry = GetPathSurfaceEntry(gFootpathSelection.normalSurface); if (pathEntry != nullptr) { pathImage = pathEntry->PreviewImageId; } - pathEntry = GetPathSurfaceEntry(gFootpathSelection.QueueSurface); + pathEntry = GetPathSurfaceEntry(gFootpathSelection.queueSurface); if (pathEntry != nullptr) { queueImage = pathEntry->PreviewImageId; @@ -696,8 +707,8 @@ namespace OpenRCT2::Ui::Windows WindowFootpathDrawDropdownButton(rt, WIDX_QUEUELINE_TYPE, queueImage); // Set railing - auto railingsImage = kSpriteIdNull; - auto railingsEntry = GetPathRailingsEntry(gFootpathSelection.Railings); + auto railingsImage = kImageIndexUndefined; + auto railingsEntry = GetPathRailingsEntry(gFootpathSelection.railings); if (railingsEntry != nullptr) { railingsImage = railingsEntry->PreviewImageId; @@ -709,9 +720,9 @@ namespace OpenRCT2::Ui::Windows auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); // Set footpath and queue type button images - auto pathImage = kSpriteIdNull; - auto queueImage = kSpriteIdNull; - const auto* pathObj = objManager.GetLoadedObject(gFootpathSelection.LegacyPath); + auto pathImage = kImageIndexUndefined; + auto queueImage = kImageIndexUndefined; + const auto* pathObj = objManager.GetLoadedObject(gFootpathSelection.legacyPath); if (pathObj != nullptr) { auto pathEntry = reinterpret_cast(pathObj->GetLegacyData()); @@ -724,7 +735,7 @@ namespace OpenRCT2::Ui::Windows } } - void WindowFootpathDrawDropdownButton(RenderTarget& rt, WidgetIndex widgetIndex, ImageIndex image) + void WindowFootpathDrawDropdownButton(Drawing::RenderTarget& rt, WidgetIndex widgetIndex, ImageIndex image) { const auto& widget = widgets[widgetIndex]; GfxDrawSprite(rt, ImageId(image), { windowPos.x + widget.left, windowPos.y + widget.top }); @@ -770,8 +781,8 @@ namespace OpenRCT2::Ui::Windows continue; } - if (gFootpathSelection.LegacyPath == kObjectEntryIndexNull - && i == (showQueues ? gFootpathSelection.QueueSurface : gFootpathSelection.NormalSurface)) + if (gFootpathSelection.legacyPath == kObjectEntryIndexNull + && i == (showQueues ? gFootpathSelection.queueSurface : gFootpathSelection.normalSurface)) { defaultIndex = numPathTypes; } @@ -795,7 +806,7 @@ namespace OpenRCT2::Ui::Windows continue; } - if (gFootpathSelection.LegacyPath != kObjectEntryIndexNull && gFootpathSelection.LegacyPath == i) + if (gFootpathSelection.legacyPath != kObjectEntryIndexNull && gFootpathSelection.legacyPath == i) { defaultIndex = numPathTypes; } @@ -808,8 +819,8 @@ namespace OpenRCT2::Ui::Windows auto itemsPerRow = DropdownGetAppropriateImageDropdownItemsPerRow(numPathTypes); WindowDropdownShowImage( - windowPos.x + widget->left, windowPos.y + widget->top, widget->height() + 1, colours[1], 0, numPathTypes, 47, - 36, itemsPerRow); + windowPos.x + widget->left, windowPos.y + widget->top, widget->height(), colours[1], 0, numPathTypes, 47, 36, + itemsPerRow); gDropdown.hasTooltips = true; @@ -831,7 +842,7 @@ namespace OpenRCT2::Ui::Windows { continue; } - if (i == gFootpathSelection.Railings) + if (i == gFootpathSelection.railings) { defaultIndex = numRailingsTypes; } @@ -844,8 +855,8 @@ namespace OpenRCT2::Ui::Windows auto itemsPerRow = DropdownGetAppropriateImageDropdownItemsPerRow(numRailingsTypes); WindowDropdownShowImage( - windowPos.x + widget->left, windowPos.y + widget->top, widget->height() + 1, colours[1], 0, numRailingsTypes, - 47, 36, itemsPerRow); + windowPos.x + widget->left, windowPos.y + widget->top, widget->height(), colours[1], 0, numRailingsTypes, 47, + 36, itemsPerRow); gDropdown.hasTooltips = true; @@ -1039,7 +1050,6 @@ namespace OpenRCT2::Ui::Windows */ void WindowFootpathSetProvisionalPathAtPoint(const ScreenCoordsXY& screenCoords) { - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enableArrow); // Get current map pos and handle key modifier state @@ -1048,7 +1058,7 @@ namespace OpenRCT2::Ui::Windows return; // Check for change - if ((_provisionalFootpath.flags.has(ProvisionalPathFlag::placed)) && _provisionalFootpath.positionA == mapPos + if (_provisionalFootpath.flags.has(ProvisionalPathFlag::placed) && _provisionalFootpath.positionA == mapPos && _provisionalFootpath.startZ == _footpathPlaceZ) { return; @@ -1071,12 +1081,12 @@ namespace OpenRCT2::Ui::Windows } // Set provisional path - auto pathType = gFootpathSelection.GetSelectedSurface(); + auto pathType = gFootpathSelection.getSelectedSurface(); auto constructFlags = FootpathCreateConstructFlags(pathType); auto footpathLoc = CoordsXYZ(*mapPos, placement.baseZ); auto tiles = std::array({ footpathLoc, placement.slope }); const auto footpathCost = FootpathProvisionalSet( - pathType, gFootpathSelection.Railings, *mapPos, *mapPos, placement.baseZ, tiles, constructFlags); + pathType, gFootpathSelection.railings, *mapPos, *mapPos, placement.baseZ, tiles, constructFlags); if (_windowFootpathCost != footpathCost) { @@ -1106,11 +1116,10 @@ namespace OpenRCT2::Ui::Windows void WindowFootpathSetProvisionalPathDragArea(MapRange range, int32_t baseZ) { - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enableArrow); // Check for change - if ((_provisionalFootpath.flags.has(ProvisionalPathFlag::placed)) && range.Point1 == _provisionalFootpath.positionA + if (_provisionalFootpath.flags.has(ProvisionalPathFlag::placed) && range.Point1 == _provisionalFootpath.positionA && range.Point2 == _provisionalFootpath.positionB && baseZ == _provisionalFootpath.startZ) { return; @@ -1124,10 +1133,10 @@ namespace OpenRCT2::Ui::Windows // Set provisional path auto tiles = buildTileVector(range, baseZ); - auto pathType = gFootpathSelection.GetSelectedSurface(); + auto pathType = gFootpathSelection.getSelectedSurface(); auto constructFlags = FootpathCreateConstructFlags(pathType); const auto footpathCost = FootpathProvisionalSet( - pathType, gFootpathSelection.Railings, range.Point1, range.Point2, baseZ, tiles, constructFlags); + pathType, gFootpathSelection.railings, range.Point1, range.Point2, baseZ, tiles, constructFlags); if (_windowFootpathCost != footpathCost) { @@ -1145,7 +1154,6 @@ namespace OpenRCT2::Ui::Windows int32_t direction; TileElement* tileElement; - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enable, MapSelectFlag::enableArrow); auto mapCoords = FootpathBridgeGetInfoFromPos(screenCoords, &direction, &tileElement); @@ -1173,8 +1181,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectArrowPosition = CoordsXYZ{ mapCoords, z }; gMapSelectArrowDirection = direction; - - MapInvalidateSelectionRect(); } FootpathPlacementResult WindowFootpathGetPlacementFromScreenCoords(const ScreenCoordsXY& screenCoords) @@ -1233,7 +1239,7 @@ namespace OpenRCT2::Ui::Windows auto correctedPos = mapPos->ToTileStart(); // For queues, only allow selecting a single line. - if (gFootpathSelection.IsQueueSelected) + if (gFootpathSelection.isQueueSelected) { auto xDiff = correctedPos.x - _dragStartPos.x; auto yDiff = correctedPos.y - _dragStartPos.y; @@ -1272,7 +1278,7 @@ namespace OpenRCT2::Ui::Windows return; // Try and place path - auto selectedType = gFootpathSelection.GetSelectedSurface(); + auto selectedType = gFootpathSelection.getSelectedSurface(); PathConstructFlags constructFlags = FootpathCreateConstructFlags(selectedType); bool anySuccess = false; @@ -1282,12 +1288,12 @@ namespace OpenRCT2::Ui::Windows for (const auto& tile : _provisionalFootpath.tiles) { auto footpathPlaceAction = GameActions::FootpathPlaceAction( - tile.position, tile.slope, selectedType, gFootpathSelection.Railings, kInvalidDirection, constructFlags); + tile.position, tile.slope, selectedType, gFootpathSelection.railings, kInvalidDirection, constructFlags); auto result = GameActions::Execute(&footpathPlaceAction, getGameState()); - if (result.Error == GameActions::Status::Ok) + if (result.error == GameActions::Status::ok) { anySuccess = true; - cost += result.Cost; + cost += result.cost; } lastLocation = tile.position; } @@ -1327,19 +1333,19 @@ namespace OpenRCT2::Ui::Windows auto placement = WindowFootpathGetPlacementFromScreenCoords(screenCoords); // Try and place path - auto selectedType = gFootpathSelection.GetSelectedSurface(); + auto selectedType = gFootpathSelection.getSelectedSurface(); PathConstructFlags constructFlags = FootpathCreateConstructFlags(selectedType); auto footpathPlaceAction = GameActions::FootpathPlaceAction( - { *mapPos, placement.baseZ }, placement.slope, selectedType, gFootpathSelection.Railings, kInvalidDirection, + { *mapPos, placement.baseZ }, placement.slope, selectedType, gFootpathSelection.railings, kInvalidDirection, constructFlags); footpathPlaceAction.SetCallback([this](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { // Don't play sound if it is no cost to prevent multiple sounds. TODO: make this work in no money scenarios - if (result->Cost != 0) + if (result->cost != 0) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, result->Position); + OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, result->position); } } else @@ -1424,13 +1430,13 @@ namespace OpenRCT2::Ui::Windows PathConstructFlags constructFlags = FootpathCreateConstructFlags(type); auto footpathPlaceAction = GameActions::FootpathPlaceAction( - footpathLoc, slope, type, gFootpathSelection.Railings, _footpathConstructDirection, constructFlags); + footpathLoc, slope, type, gFootpathSelection.railings, _footpathConstructDirection, constructFlags); footpathPlaceAction.SetCallback( [footpathLoc](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { - Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, result->Position); + Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, result->position); } auto* windowMgr = GetWindowManager(); @@ -1440,7 +1446,7 @@ namespace OpenRCT2::Ui::Windows return; } - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { if (_footpathConstructSlope == SlopePitch::flat) { @@ -1601,15 +1607,13 @@ namespace OpenRCT2::Ui::Windows { if (_footpathConstructionMode == PathConstructionMode::bridgeOrTunnel) { - MapInvalidateMapSelectionTiles(); gMapSelectFlags.set(MapSelectFlag::enableConstruct, MapSelectFlag::green); int32_t direction = _footpathConstructDirection; - gMapSelectionTiles.clear(); - gMapSelectionTiles.push_back( + MapSelection::clearSelectedTiles(); + MapSelection::addSelectedTile( { _footpathConstructFromPosition.x + CoordsDirectionDelta[direction].x, _footpathConstructFromPosition.y + CoordsDirectionDelta[direction].y }); - MapInvalidateMapSelectionTiles(); } uint64_t newPressedWidgets = pressedWidgets @@ -1674,7 +1678,7 @@ namespace OpenRCT2::Ui::Windows footpathLoc.z = _footpathConstructFromPosition.z; if (type != nullptr) { - *type = gFootpathSelection.GetSelectedSurface(); + *type = gFootpathSelection.getSelectedSurface(); } *slope = {}; if (_footpathConstructSlope != SlopePitch::flat) @@ -1691,12 +1695,12 @@ namespace OpenRCT2::Ui::Windows PathConstructFlags FootpathCreateConstructFlags(ObjectEntryIndex& type) { PathConstructFlags pathConstructFlags = 0; - if (gFootpathSelection.IsQueueSelected) + if (gFootpathSelection.isQueueSelected) pathConstructFlags |= PathConstructFlag::IsQueue; - if (gFootpathSelection.LegacyPath != kObjectEntryIndexNull) + if (gFootpathSelection.legacyPath != kObjectEntryIndexNull) { pathConstructFlags |= PathConstructFlag::IsLegacyPathObject; - type = gFootpathSelection.LegacyPath; + type = gFootpathSelection.legacyPath; } return pathConstructFlags; } @@ -1948,14 +1952,14 @@ namespace OpenRCT2::Ui::Windows { auto footpathPlaceAction = GameActions::FootpathPlaceAction( tile.position, tile.slope, type, railingsType, kInvalidDirection, constructFlags); - footpathPlaceAction.SetFlags(GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + footpathPlaceAction.SetFlags({ CommandFlag::ghost, CommandFlag::allowDuringPaused }); res = GameActions::Execute(&footpathPlaceAction, getGameState()); // The latter status will be returned if there is already path at the tile in question, to prevent a ghost // from glitching through the existing path. - if (res.Error == GameActions::Status::Ok || res.Error == GameActions::Status::ItemAlreadyPlaced) + if (res.error == GameActions::Status::ok || res.error == GameActions::Status::itemAlreadyPlaced) { succesfulTiles.emplace_back(tile); - cost += res.Cost; + cost += res.cost; } } @@ -2019,7 +2023,7 @@ namespace OpenRCT2::Ui::Windows for (const auto& tile : _provisionalFootpath.tiles) { auto action = GameActions::FootpathRemoveAction(tile.position); - action.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + action.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); GameActions::Execute(&action, getGameState()); } } @@ -2035,7 +2039,6 @@ namespace OpenRCT2::Ui::Windows _provisionalFootpath.flags.unset(ProvisionalPathFlag::showArrow); gMapSelectFlags.unset(MapSelectFlag::enableArrow); - MapInvalidateTileFull(_footpathConstructFromPosition); } FootpathRemoveProvisional(); } @@ -2147,39 +2150,39 @@ namespace OpenRCT2::Ui::Windows { // Select default footpath auto surfaceIndex = FootpathGetDefaultSurface(false); - if (FootpathIsSurfaceEntryOkay(gFootpathSelection.NormalSurface, false)) + if (FootpathIsSurfaceEntryOkay(gFootpathSelection.normalSurface, false)) { - surfaceIndex = gFootpathSelection.NormalSurface; + surfaceIndex = gFootpathSelection.normalSurface; } // Select default queue auto queueIndex = FootpathGetDefaultSurface(true); - if (FootpathIsSurfaceEntryOkay(gFootpathSelection.QueueSurface, true)) + if (FootpathIsSurfaceEntryOkay(gFootpathSelection.queueSurface, true)) { - queueIndex = gFootpathSelection.QueueSurface; + queueIndex = gFootpathSelection.queueSurface; } // Select default railing auto railingIndex = FootpathGetDefaultRailings(); - const auto* railingEntry = GetPathRailingsEntry(gFootpathSelection.Railings); + const auto* railingEntry = GetPathRailingsEntry(gFootpathSelection.railings); if (railingEntry != nullptr) { - railingIndex = gFootpathSelection.Railings; + railingIndex = gFootpathSelection.railings; } // Select default legacy path auto legacyPathIndex = FootpathGetDefaultLegacyPath(); - if (gFootpathSelection.LegacyPath != kObjectEntryIndexNull) + if (gFootpathSelection.legacyPath != kObjectEntryIndexNull) { - if (FootpathIsLegacyPathEntryOkay(gFootpathSelection.LegacyPath)) + if (FootpathIsLegacyPathEntryOkay(gFootpathSelection.legacyPath)) { // Keep legacy path selected - legacyPathIndex = gFootpathSelection.LegacyPath; + legacyPathIndex = gFootpathSelection.legacyPath; } else { // Reset legacy path, we default to a surface (if there are any) - gFootpathSelection.LegacyPath = kObjectEntryIndexNull; + gFootpathSelection.legacyPath = kObjectEntryIndexNull; } } @@ -2192,12 +2195,12 @@ namespace OpenRCT2::Ui::Windows } // No surfaces available, so default to legacy path - gFootpathSelection.LegacyPath = legacyPathIndex; + gFootpathSelection.legacyPath = legacyPathIndex; } - gFootpathSelection.NormalSurface = surfaceIndex; - gFootpathSelection.QueueSurface = queueIndex; - gFootpathSelection.Railings = railingIndex; + gFootpathSelection.normalSurface = surfaceIndex; + gFootpathSelection.queueSurface = queueIndex; + gFootpathSelection.railings = railingIndex; return true; } } // namespace OpenRCT2::Ui::Windows diff --git a/src/openrct2-ui/windows/GameBottomToolbar.cpp b/src/openrct2-ui/windows/GameBottomToolbar.cpp index e102ce55d107..c47da0432f29 100644 --- a/src/openrct2-ui/windows/GameBottomToolbar.cpp +++ b/src/openrct2-ui/windows/GameBottomToolbar.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -89,7 +90,7 @@ namespace OpenRCT2::Ui::Windows : colours[0].colour); } - void DrawLeftPanel(RenderTarget& rt) + void DrawLeftPanel(Drawing::RenderTarget& rt) { const auto& leftPanelWidget = widgets[WIDX_LEFT_OUTSET]; @@ -154,7 +155,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawParkRating(RenderTarget& rt, int32_t colour, const ScreenCoordsXY& coords, uint8_t factor) + void DrawParkRating(Drawing::RenderTarget& rt, int32_t colour, const ScreenCoordsXY& coords, uint8_t factor) { int16_t bar_width = (factor * 114) / 255; Rectangle::fillInset( @@ -175,7 +176,7 @@ namespace OpenRCT2::Ui::Windows GfxDrawSprite(rt, ImageId(SPR_RATING_HIGH), coords + ScreenCoordsXY{ 114, 0 }); } - void DrawRightPanel(RenderTarget& rt) + void DrawRightPanel(Drawing::RenderTarget& rt) { const auto& rightPanelWidget = widgets[WIDX_RIGHT_OUTSET]; @@ -237,7 +238,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawNewsItem(RenderTarget& rt) + void DrawNewsItem(Drawing::RenderTarget& rt) { const auto& middleOutsetWidget = widgets[WIDX_MIDDLE_OUTSET]; auto* newsItem = News::GetItem(0); @@ -252,7 +253,7 @@ namespace OpenRCT2::Ui::Windows // Text auto screenCoords = windowPos + ScreenCoordsXY{ middleOutsetWidget.midX(), middleOutsetWidget.top + 11 }; - int32_t itemWidth = middleOutsetWidget.width() - 62; + int32_t itemWidth = middleOutsetWidget.width() - 63; DrawNewsTicker( rt, screenCoords, itemWidth, COLOUR_BRIGHT_GREEN, STR_BOTTOM_TOOLBAR_NEWS_TEXT, newsItem->text, newsItem->ticks); @@ -271,7 +272,7 @@ namespace OpenRCT2::Ui::Windows break; RenderTarget clippedRT; - if (!ClipDrawPixelInfo(clippedRT, rt, screenCoords + ScreenCoordsXY{ 1, 1 }, 22, 22)) + if (!ClipRenderTarget(clippedRT, rt, screenCoords + ScreenCoordsXY{ 1, 1 }, 22, 22)) { break; } @@ -353,7 +354,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawMiddlePanel(RenderTarget& rt) + void DrawMiddlePanel(Drawing::RenderTarget& rt) { Widget* middleOutsetWidget = &widgets[WIDX_MIDDLE_OUTSET]; @@ -368,7 +369,7 @@ namespace OpenRCT2::Ui::Windows ScreenCoordsXY middleWidgetCoords( windowPos.x + middleOutsetWidget->midX(), windowPos.y + middleOutsetWidget->top + line_height + 1); - int32_t panelWidth = middleOutsetWidget->width() - 62; + int32_t panelWidth = middleOutsetWidget->width() - 63; // Check if there is a map tooltip to draw StringId stringId; @@ -620,7 +621,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { const auto& leftWidget = widgets[WIDX_LEFT_OUTSET]; const auto& rightWidget = widgets[WIDX_RIGHT_OUTSET]; diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index 5d2bafee42c2..c88f77f0056e 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -356,7 +357,7 @@ namespace OpenRCT2::Ui::Windows onViewportRotateOverview(); } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { switch (page) { @@ -419,7 +420,7 @@ namespace OpenRCT2::Ui::Windows onScrollMouseDownRides(scrollIndex, screenCoords); } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { if (page == WINDOW_GUEST_RIDES) { @@ -543,20 +544,20 @@ namespace OpenRCT2::Ui::Windows #pragma region Overview - void OverviewTabDraw(RenderTarget& rt) + void OverviewTabDraw(Drawing::RenderTarget& rt) { if (widgetIsDisabled(*this, WIDX_TAB_1)) return; const auto& widget = widgets[WIDX_TAB_1]; - int32_t widgWidth = widget.width() - 1; - int32_t widgHeight = widget.height() - 1; + int32_t widgWidth = widget.width() - 2; + int32_t widgHeight = widget.height() - 2; auto screenCoords = windowPos + ScreenCoordsXY{ widget.left + 1, widget.top + 1 }; if (page == WINDOW_GUEST_OVERVIEW) widgHeight++; - RenderTarget clipDpi; - if (!ClipDrawPixelInfo(clipDpi, rt, screenCoords, widgWidth, widgHeight)) + RenderTarget clipRT; + if (!ClipRenderTarget(clipRT, rt, screenCoords, widgWidth, widgHeight)) { return; } @@ -583,7 +584,7 @@ namespace OpenRCT2::Ui::Windows animationFrame += animationFrameOffset; auto spriteId = ImageId(animationFrame, peep->TshirtColour, peep->TrousersColour); - GfxDrawSprite(clipDpi, spriteId, screenCoords); + GfxDrawSprite(clipRT, spriteId, screenCoords); auto* guest = peep->As(); if (guest == nullptr) @@ -596,21 +597,21 @@ namespace OpenRCT2::Ui::Windows { auto itemOffset = kPeepSpriteHatItemStart + 1; auto imageId = ImageId(itemOffset + itemFrame * 4, guest->HatColour); - GfxDrawSprite(clipDpi, imageId, screenCoords); + GfxDrawSprite(clipRT, imageId, screenCoords); } if (guest->AnimationGroup == PeepAnimationGroup::balloon) { auto itemOffset = kPeepSpriteBalloonItemStart + 1; auto imageId = ImageId(itemOffset + itemFrame * 4, guest->BalloonColour); - GfxDrawSprite(clipDpi, imageId, screenCoords); + GfxDrawSprite(clipRT, imageId, screenCoords); } if (guest->AnimationGroup == PeepAnimationGroup::umbrella) { auto itemOffset = kPeepSpriteUmbrellaItemStart + 1; auto imageId = ImageId(itemOffset + itemFrame * 4, guest->UmbrellaColour); - GfxDrawSprite(clipDpi, imageId, screenCoords); + GfxDrawSprite(clipRT, imageId, screenCoords); } } @@ -624,8 +625,8 @@ namespace OpenRCT2::Ui::Windows if (viewport != nullptr) { const auto& widget = widgets[WIDX_VIEWPORT]; - const auto reqViewportWidth = widget.width() - 1; - const auto reqViewportHeight = widget.height() - 1; + const auto reqViewportWidth = widget.width() - 2; + const auto reqViewportHeight = widget.height() - 2; viewport->pos = windowPos + ScreenCoordsXY{ widget.left + 1, widget.top + 1 }; if (viewport->width != reqViewportWidth || viewport->height != reqViewportHeight) { @@ -661,7 +662,7 @@ namespace OpenRCT2::Ui::Windows Network::GetCurrentPlayerId() }; pickupAction.SetCallback( [peepnum = number](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) return; auto* windowMgr = GetWindowManager(); WindowBase* wind = windowMgr->FindByNumber(WindowClass::peep, peepnum); @@ -728,7 +729,7 @@ namespace OpenRCT2::Ui::Windows }; WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() + 1, colours[1], 0, dropdownItems); + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), colours[1], 0, dropdownItems); gDropdown.defaultIndex = 0; } @@ -766,8 +767,8 @@ namespace OpenRCT2::Ui::Windows { const auto& viewWidget = widgets[WIDX_VIEWPORT]; auto screenPos = ScreenCoordsXY{ viewWidget.left + 1 + windowPos.x, viewWidget.top + 1 + windowPos.y }; - int32_t widgWidth = viewWidget.width() - 1; - int32_t widgHeight = viewWidget.height() - 1; + int32_t widgWidth = viewWidget.width() - 2; + int32_t widgHeight = viewWidget.height() - 2; ViewportCreate(*this, screenPos, widgWidth, widgHeight, focus.value()); if (viewport != nullptr && reCreateViewport) @@ -780,7 +781,7 @@ namespace OpenRCT2::Ui::Windows invalidate(); } - void onDrawOverview(RenderTarget& rt) + void onDrawOverview(Drawing::RenderTarget& rt) { drawWidgets(rt); OverviewTabDraw(rt); @@ -814,18 +815,18 @@ namespace OpenRCT2::Ui::Windows { auto ft = Formatter(); peep->FormatActionTo(ft); - int32_t textWidth = actionLabelWidget.width(); + int32_t textWidth = actionLabelWidget.width() - 1; DrawTextEllipsised(rt, screenPos, textWidth, STR_BLACK_STRING, ft, { TextAlignment::centre }); } // Draw the marquee thought const auto& marqueeWidget = widgets[WIDX_MARQUEE]; - auto marqWidth = marqueeWidget.width() - 3; + auto marqWidth = marqueeWidget.width() - 4; int32_t left = marqueeWidget.left + 2 + windowPos.x; int32_t top = marqueeWidget.top + windowPos.y; - int32_t marqHeight = marqueeWidget.height(); + int32_t marqHeight = marqueeWidget.height() - 1; RenderTarget rtMarquee; - if (!ClipDrawPixelInfo(rtMarquee, rt, { left, top }, marqWidth, marqHeight)) + if (!ClipRenderTarget(rtMarquee, rt, { left, top }, marqWidth, marqHeight)) { return; } @@ -849,7 +850,7 @@ namespace OpenRCT2::Ui::Windows return; } - screenPos.x = marqueeWidget.width() - _marqueePosition; + screenPos.x = marqueeWidget.width() - 1 - _marqueePosition; { auto ft = Formatter(); PeepThoughtSetFormatArgs(&peep->Thoughts[i], ft); @@ -977,8 +978,6 @@ namespace OpenRCT2::Ui::Windows if (widgetIndex != WIDX_PICKUP) return; - MapInvalidateSelectionRect(); - gMapSelectFlags.unset(MapSelectFlag::enable); auto mapCoords = FootpathGetCoordinatesFromPos({ screenCoords.x, screenCoords.y + 16 }, nullptr, nullptr); @@ -988,7 +987,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectType = MapSelectType::full; gMapSelectPositionA = mapCoords; gMapSelectPositionB = mapCoords; - MapInvalidateSelectionRect(); } gPickupPeepImage = ImageId(); @@ -1030,7 +1028,7 @@ namespace OpenRCT2::Ui::Windows { destCoords, tileElement->GetBaseZ() }, Network::GetCurrentPlayerId() }; pickupAction.SetCallback([](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) return; ToolCancel(); gPickupPeepImage = ImageId(); @@ -1053,7 +1051,7 @@ namespace OpenRCT2::Ui::Windows #pragma endregion #pragma region Stats - void StatsTabDraw(RenderTarget& rt) + void StatsTabDraw(Drawing::RenderTarget& rt) { if (widgetIsDisabled(*this, WIDX_TAB_2)) return; @@ -1110,7 +1108,7 @@ namespace OpenRCT2::Ui::Windows return std::clamp(newValue, newMin, 100); } - void onDrawStats(RenderTarget& rt) + void onDrawStats(Drawing::RenderTarget& rt) { // ebx const auto peep = GetGuest(); @@ -1209,7 +1207,7 @@ namespace OpenRCT2::Ui::Windows #pragma endregion #pragma region Rides - void RidesTabDraw(RenderTarget& rt) + void RidesTabDraw(Drawing::RenderTarget& rt) { if (widgetIsDisabled(*this, WIDX_TAB_3)) return; @@ -1318,7 +1316,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_RIDE_SCROLL].bottom = height - 15; } - void onDrawRides(RenderTarget& rt) + void onDrawRides(Drawing::RenderTarget& rt) { drawWidgets(rt); OverviewTabDraw(rt); @@ -1355,7 +1353,7 @@ namespace OpenRCT2::Ui::Windows DrawTextEllipsised(rt, screenCoords, width - 14, STR_FAVOURITE_RIDE, ft); } - void onScrollDrawRides(int32_t scrollIndex, RenderTarget& rt) + void onScrollDrawRides(int32_t scrollIndex, Drawing::RenderTarget& rt) { auto colour = ColourMapA[colours[1].colour].mid_light; Rectangle::fill(rt, { { rt.x, rt.y }, { rt.x + rt.width - 1, rt.y + rt.height - 1 } }, colour); @@ -1382,7 +1380,7 @@ namespace OpenRCT2::Ui::Windows #pragma endregion #pragma region Finance - void FinanceTabDraw(RenderTarget& rt) + void FinanceTabDraw(Drawing::RenderTarget& rt) { if (widgetIsDisabled(*this, WIDX_TAB_4)) return; @@ -1408,7 +1406,7 @@ namespace OpenRCT2::Ui::Windows invalidateWidget(WIDX_TAB_4); } - void onDrawFinance(RenderTarget& rt) + void onDrawFinance(Drawing::RenderTarget& rt) { drawWidgets(rt); OverviewTabDraw(rt); @@ -1520,7 +1518,7 @@ namespace OpenRCT2::Ui::Windows #pragma endregion #pragma region Thoughts - void ThoughtsTabDraw(RenderTarget& rt) + void ThoughtsTabDraw(Drawing::RenderTarget& rt) { if (widgetIsDisabled(*this, WIDX_TAB_5)) return; @@ -1557,7 +1555,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDrawThoughts(RenderTarget& rt) + void onDrawThoughts(Drawing::RenderTarget& rt) { drawWidgets(rt); OverviewTabDraw(rt); @@ -1598,7 +1596,7 @@ namespace OpenRCT2::Ui::Windows #pragma endregion #pragma region Inventory - void InventoryTabDraw(RenderTarget& rt) + void InventoryTabDraw(Drawing::RenderTarget& rt) { if (widgetIsDisabled(*this, WIDX_TAB_6)) return; @@ -1738,7 +1736,7 @@ namespace OpenRCT2::Ui::Windows return std::make_pair(itemImage, ft); } - void onDrawInventory(RenderTarget& rt) + void onDrawInventory(Drawing::RenderTarget& rt) { drawWidgets(rt); OverviewTabDraw(rt); @@ -1757,7 +1755,7 @@ namespace OpenRCT2::Ui::Windows auto& widget = widgets[WIDX_PAGE_BACKGROUND]; auto screenCoords = windowPos + ScreenCoordsXY{ widget.left + 4, widget.top + 12 }; - int32_t itemNameWidth = widget.width() - 24; + int32_t itemNameWidth = widget.width() - 25; int32_t maxY = windowPos.y + height - 22; int32_t numItems = 0; @@ -1788,7 +1786,7 @@ namespace OpenRCT2::Ui::Windows #pragma endregion #pragma region Debug - void DebugTabDraw(RenderTarget& rt) + void DebugTabDraw(Drawing::RenderTarget& rt) { if (widgetIsDisabled(*this, WIDX_TAB_7)) return; @@ -1811,7 +1809,7 @@ namespace OpenRCT2::Ui::Windows invalidate(); } - void onDrawDebug(RenderTarget& rt) + void onDrawDebug(Drawing::RenderTarget& rt) { char buffer[512]{}; char buffer2[512]{}; diff --git a/src/openrct2-ui/windows/GuestList.cpp b/src/openrct2-ui/windows/GuestList.cpp index 2ffd91b8945f..74e57eddebd3 100644 --- a/src/openrct2-ui/windows/GuestList.cpp +++ b/src/openrct2-ui/windows/GuestList.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -335,8 +335,8 @@ namespace OpenRCT2::Ui::Windows auto* widget = &widgets[widgetIndex - 1]; WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, _numPages, widget->width() - 3); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, _numPages, widget->width() - 4); for (size_t i = 0; i < _numPages; i++) { @@ -354,8 +354,8 @@ namespace OpenRCT2::Ui::Windows auto* widget = &widgets[widgetIndex - 1]; WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, 2, widget->width() - 3); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, 2, widget->width() - 4); gDropdown.items[static_cast(_selectedView)].setChecked(true); break; @@ -427,7 +427,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -573,7 +573,7 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { Rectangle::fill( rt, { { rt.x, rt.y }, { rt.x + rt.width - 1, rt.y + rt.height - 1 } }, ColourMapA[colours[1].colour].mid_light); @@ -626,7 +626,7 @@ namespace OpenRCT2::Ui::Windows } private: - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { // Tab 1 image auto i = (_selectedTab == TabId::Individual ? _tabAnimationIndex & ~3 : 0); @@ -643,7 +643,7 @@ namespace OpenRCT2::Ui::Windows windowPos + ScreenCoordsXY{ widgets[WIDX_TAB_2].left, widgets[WIDX_TAB_2].top }); } - void DrawScrollIndividual(RenderTarget& rt) + void DrawScrollIndividual(Drawing::RenderTarget& rt) { size_t index = 0; auto y = static_cast(_selectedPage) * -kGuestPageHeight; @@ -710,7 +710,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawScrollSummarised(RenderTarget& rt) + void DrawScrollSummarised(Drawing::RenderTarget& rt) { size_t index = 0; auto y = 0; diff --git a/src/openrct2-ui/windows/InstallTrack.cpp b/src/openrct2-ui/windows/InstallTrack.cpp index 8ee75bf41a3c..206c69e7d94f 100644 --- a/src/openrct2-ui/windows/InstallTrack.cpp +++ b/src/openrct2-ui/windows/InstallTrack.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -149,21 +150,21 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); // Track preview Widget* widget = &widgets[WIDX_TRACK_PREVIEW]; auto screenPos = windowPos + ScreenCoordsXY{ widget->left + 1, widget->top + 1 }; - int32_t colour = ColourMapA[colours[0].colour].darkest; + auto colour = ColourMapA[colours[0].colour].darkest; Rectangle::fill(rt, { screenPos, screenPos + ScreenCoordsXY{ 369, 216 } }, colour); G1Element g1temp = {}; g1temp.offset = _trackDesignPreviewPixels.data() + (_currentTrackPieceDirection * kTrackPreviewImageSize); g1temp.width = 370; g1temp.height = 217; - g1temp.flags = G1_FLAG_HAS_TRANSPARENCY; + g1temp.flags = { G1Flag::hasTransparency }; GfxSetG1Element(SPR_TEMP, &g1temp); DrawingEngineInvalidateImage(SPR_TEMP); GfxDrawSprite(rt, ImageId(SPR_TEMP), screenPos); diff --git a/src/openrct2-ui/windows/Land.cpp b/src/openrct2-ui/windows/Land.cpp index 0e2de599f588..ec0a8b320a7d 100644 --- a/src/openrct2-ui/windows/Land.cpp +++ b/src/openrct2-ui/windows/Land.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -32,6 +32,8 @@ #include #include +using OpenRCT2::GameActions::CommandFlag; + namespace OpenRCT2::Ui::Windows { static constexpr StringId kWindowTitle = STR_LAND; @@ -51,6 +53,12 @@ namespace OpenRCT2::Ui::Windows WIDX_WALL, }; + enum class SelectionMode + { + query, + apply, + }; + // clang-format off static constexpr auto window_land_widgets = makeWidgets( makeWindowShim(kWindowTitle, kWindowSize), @@ -251,7 +259,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_PREVIEW].image = ImageId(LandTool::SizeToSpriteIndex(gLandToolSize)); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { ScreenCoordsXY screenCoords; int32_t numTiles; @@ -331,7 +339,7 @@ namespace OpenRCT2::Ui::Windows * * rct2: 0x006644DD */ - money64 SelectionRaiseLand(uint8_t flag) + money64 SelectionRaiseLand(const SelectionMode mode) { int32_t centreX = (gMapSelectPositionA.x + gMapSelectPositionB.x) / 2; int32_t centreY = (gMapSelectPositionA.y + gMapSelectPositionB.y) / 2; @@ -346,25 +354,25 @@ namespace OpenRCT2::Ui::Windows { centreX, centreY }, { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }, gMapSelectType, false); - auto res = (flag & GAME_COMMAND_FLAG_APPLY) ? GameActions::Execute(&landSmoothAction, gameState) - : GameActions::Query(&landSmoothAction, gameState); - return res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + auto res = (mode == SelectionMode::apply) ? GameActions::Execute(&landSmoothAction, gameState) + : GameActions::Query(&landSmoothAction, gameState); + return res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; } auto landRaiseAction = GameActions::LandRaiseAction( { centreX, centreY }, { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }, gMapSelectType); - auto res = (flag & GAME_COMMAND_FLAG_APPLY) ? GameActions::Execute(&landRaiseAction, gameState) - : GameActions::Query(&landRaiseAction, gameState); + auto res = (mode == SelectionMode::apply) ? GameActions::Execute(&landRaiseAction, gameState) + : GameActions::Query(&landRaiseAction, gameState); - return res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + return res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; } /** * * rct2: 0x006645B3 */ - money64 SelectionLowerLand(uint8_t flag) + money64 SelectionLowerLand(const SelectionMode mode) { int32_t centreX = (gMapSelectPositionA.x + gMapSelectPositionB.x) / 2; int32_t centreY = (gMapSelectPositionA.y + gMapSelectPositionB.y) / 2; @@ -379,18 +387,18 @@ namespace OpenRCT2::Ui::Windows { centreX, centreY }, { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }, gMapSelectType, true); - auto res = (flag & GAME_COMMAND_FLAG_APPLY) ? GameActions::Execute(&landSmoothAction, gameState) - : GameActions::Query(&landSmoothAction, gameState); - return res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + auto res = (mode == SelectionMode::apply) ? GameActions::Execute(&landSmoothAction, gameState) + : GameActions::Query(&landSmoothAction, gameState); + return res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; } auto landLowerAction = GameActions::LandLowerAction( { centreX, centreY }, { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }, gMapSelectType); - auto res = (flag & GAME_COMMAND_FLAG_APPLY) ? GameActions::Execute(&landLowerAction, gameState) - : GameActions::Query(&landLowerAction, gameState); + auto res = (mode == SelectionMode::apply) ? GameActions::Execute(&landLowerAction, gameState) + : GameActions::Query(&landLowerAction, gameState); - return res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + return res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; } /** @@ -424,7 +432,7 @@ namespace OpenRCT2::Ui::Windows { gInputDragLast.y += tile_height; - SelectionRaiseLand(GAME_COMMAND_FLAG_APPLY); + SelectionRaiseLand(SelectionMode::apply); _landToolRaiseCost = kMoney64Undefined; _landToolLowerCost = kMoney64Undefined; @@ -433,7 +441,7 @@ namespace OpenRCT2::Ui::Windows { gInputDragLast.y -= tile_height; - SelectionLowerLand(GAME_COMMAND_FLAG_APPLY); + SelectionLowerLand(SelectionMode::apply); _landToolRaiseCost = kMoney64Undefined; _landToolLowerCost = kMoney64Undefined; @@ -444,7 +452,6 @@ namespace OpenRCT2::Ui::Windows { uint8_t state_changed = 0; - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enable); auto mapTile = ScreenGetMapXY(screenPos, nullptr); @@ -454,7 +461,7 @@ namespace OpenRCT2::Ui::Windows return state_changed; } - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) { gMapSelectFlags.set(MapSelectFlag::enable); state_changed++; @@ -501,7 +508,6 @@ namespace OpenRCT2::Ui::Windows state_changed++; } - MapInvalidateSelectionRect(); return state_changed; } @@ -582,7 +588,6 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_BACKGROUND: - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enable); gCurrentToolId = Tool::digDown; break; @@ -609,15 +614,13 @@ namespace OpenRCT2::Ui::Windows const bool mapCtrlPressed = GetInputManager().isModifierKeyPressed(ModifierKey::ctrl); auto* windowMgr = Ui::GetWindowManager(); - MapInvalidateSelectionRect(); - if (gCurrentToolId == Tool::upDownArrow) { - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) return; - money64 lower_cost = SelectionLowerLand(0); - money64 raise_cost = SelectionRaiseLand(0); + money64 lower_cost = SelectionLowerLand(SelectionMode::query); + money64 raise_cost = SelectionRaiseLand(SelectionMode::query); if (_landToolRaiseCost != raise_cost || _landToolLowerCost != lower_cost) { @@ -657,7 +660,7 @@ namespace OpenRCT2::Ui::Windows uint8_t state_changed = 0; - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) { gMapSelectFlags.set(MapSelectFlag::enable); state_changed++; @@ -700,12 +703,11 @@ namespace OpenRCT2::Ui::Windows state_changed++; } - MapInvalidateSelectionRect(); if (!state_changed) return; - money64 lower_cost = SelectionLowerLand(0); - money64 raise_cost = SelectionRaiseLand(0); + money64 lower_cost = SelectionLowerLand(SelectionMode::query); + money64 raise_cost = SelectionRaiseLand(SelectionMode::query); if (_landToolRaiseCost != raise_cost || _landToolLowerCost != lower_cost) { @@ -735,7 +737,7 @@ namespace OpenRCT2::Ui::Windows uint8_t state_changed = 0; - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) { gMapSelectFlags.set(MapSelectFlag::enable); state_changed++; @@ -827,12 +829,11 @@ namespace OpenRCT2::Ui::Windows state_changed++; } - MapInvalidateSelectionRect(); if (!state_changed) return; - money64 lower_cost = SelectionLowerLand(0); - money64 raise_cost = SelectionRaiseLand(0); + money64 lower_cost = SelectionLowerLand(SelectionMode::query); + money64 raise_cost = SelectionRaiseLand(SelectionMode::query); if (_landToolRaiseCost != raise_cost || _landToolLowerCost != lower_cost) { @@ -842,7 +843,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawDropdownButtons(RenderTarget& rt) + void DrawDropdownButtons(Drawing::RenderTarget& rt) { auto& objManager = GetContext()->GetObjectManager(); const auto* surfaceObj = objManager.GetLoadedObject(_selectedFloorTexture); @@ -865,7 +866,7 @@ namespace OpenRCT2::Ui::Windows DrawDropdownButton(rt, WIDX_WALL, edgeImage); } - void DrawDropdownButton(RenderTarget& rt, WidgetIndex widgetIndex, ImageId image) + void DrawDropdownButton(Drawing::RenderTarget& rt, WidgetIndex widgetIndex, ImageId image) { const auto& widget = widgets[widgetIndex]; GfxDrawSprite(rt, image, { windowPos.x + widget.left, windowPos.y + widget.top }); @@ -894,7 +895,7 @@ namespace OpenRCT2::Ui::Windows ShowGridlines(); auto* toolWindow = ContextOpenWindow(WindowClass::land); ToolSet(*toolWindow, WIDX_BACKGROUND, Tool::digDown); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); } } } // namespace OpenRCT2::Ui::Windows diff --git a/src/openrct2-ui/windows/LandRights.cpp b/src/openrct2-ui/windows/LandRights.cpp index cfbf37b184d5..70883e248b82 100644 --- a/src/openrct2-ui/windows/LandRights.cpp +++ b/src/openrct2-ui/windows/LandRights.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -109,7 +109,6 @@ namespace OpenRCT2::Ui::Windows _landRightsMode = mode; ToolSet(*this, widgetIndex, Tool::upArrow); - gInputFlags.set(InputFlag::unk6); if (kLandRightsVisibleByMode[EnumValue(mode)]) ShowLandRights(); @@ -393,7 +392,7 @@ namespace OpenRCT2::Ui::Windows invalidate(); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { auto screenCoords = ScreenCoordsXY{ windowPos.x + widgets[WIDX_PREVIEW].midX(), windowPos.y + widgets[WIDX_PREVIEW].midY() }; @@ -459,7 +458,6 @@ namespace OpenRCT2::Ui::Windows void onToolUpdate(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) override { - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enable); auto info = GetMapCoordinatesFromPos( @@ -479,7 +477,7 @@ namespace OpenRCT2::Ui::Windows uint8_t state_changed = 0; - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) { gMapSelectFlags.set(MapSelectFlag::enable); state_changed++; @@ -529,7 +527,6 @@ namespace OpenRCT2::Ui::Windows state_changed++; } - MapInvalidateSelectionRect(); if (!state_changed) return; @@ -538,13 +535,13 @@ namespace OpenRCT2::Ui::Windows { auto landSetRightsAction = GetLandSetAction(); auto res = GameActions::Query(&landSetRightsAction, gameState); - _landRightsCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + _landRightsCost = res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; } else { auto landBuyRightsAction = GetLandBuyAction(); auto res = GameActions::Query(&landBuyRightsAction, gameState); - _landRightsCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + _landRightsCost = res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; } } diff --git a/src/openrct2-ui/windows/LoadSave.cpp b/src/openrct2-ui/windows/LoadSave.cpp index e4f0b489f705..4dbad2392e2e 100644 --- a/src/openrct2-ui/windows/LoadSave.cpp +++ b/src/openrct2-ui/windows/LoadSave.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -404,7 +404,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawPreview(RenderTarget& rt) + void DrawPreview(Drawing::RenderTarget& rt) { // Find preview image to draw PreviewImage* image = nullptr; @@ -731,7 +731,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -770,9 +770,9 @@ namespace OpenRCT2::Ui::Windows auto ft = Formatter(); ft.Add(indicatorId); - auto cdpi = const_cast(rt); + auto cRT = const_cast(rt); DrawTextEllipsised( - cdpi, windowPos + ScreenCoordsXY{ widget.left + 5, widget.top + 1 }, widget.width(), strId, ft, + cRT, windowPos + ScreenCoordsXY{ widget.left + 5, widget.top + 1 }, widget.width() - 1, strId, ft, { COLOUR_GREY }); }; @@ -919,7 +919,7 @@ namespace OpenRCT2::Ui::Windows Widget* widget = &widgets[WIDX_SORT_CUSTOMISE]; WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left - 70, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, + { windowPos.x + widget->left - 70, windowPos.y + widget->top }, widget->height(), colours[1], 0, Dropdown::Flag::StayOpen, 7, 90); auto& config = Config::Get().general; @@ -1077,12 +1077,12 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { Rectangle::fill( rt, { { rt.x, rt.y }, { rt.x + rt.width - 1, rt.y + rt.height - 1 } }, ColourMapA[colours[1].colour].mid_light); - const int32_t listWidth = widgets[WIDX_SCROLL].width(); + const int32_t listWidth = widgets[WIDX_SCROLL].width() - 1; const auto sizeColumnLeft = widgets[WIDX_SORT_SIZE].left; const auto dateColumnLeft = widgets[WIDX_SORT_DATE].left; const int32_t dateAnchor = dateColumnLeft + maxDateWidth + kDateTimeGap; @@ -1124,7 +1124,7 @@ namespace OpenRCT2::Ui::Windows auto ft = Formatter(); ft.Add(STR_STRING); ft.Add(_listItems[i].name.c_str()); - int32_t max_file_width = widgets[WIDX_SORT_NAME].width() - 15; + int32_t max_file_width = widgets[WIDX_SORT_NAME].width() - 16; DrawTextEllipsised(rt, { 15, y }, max_file_width, stringId, ft); // Print formatted modified date, if this is a file diff --git a/src/openrct2-ui/windows/Main.cpp b/src/openrct2-ui/windows/Main.cpp index a336ac81c084..53e07a532c8b 100644 --- a/src/openrct2-ui/windows/Main.cpp +++ b/src/openrct2-ui/windows/Main.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -46,7 +46,7 @@ namespace OpenRCT2::Ui::Windows WindowFootpathResetSelectedPath(); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { ViewportRender(rt, viewport); } diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index a596b810521b..1af51ece00c6 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -47,17 +48,34 @@ using namespace OpenRCT2::Drawing; namespace OpenRCT2::Ui::Windows { - static constexpr uint16_t MapColour2(uint8_t colourA, uint8_t colourB) + struct ColourPair { - return (colourA << 8) | colourB; - } - static constexpr uint16_t MapColour(uint8_t colour) - { - return MapColour2(colour, colour); - } - static constexpr uint16_t MapColourUnowned(uint16_t colour) + PaletteIndex a = PaletteIndex::pi0; + PaletteIndex b = PaletteIndex::pi0; + + constexpr ColourPair() = default; + + constexpr ColourPair(PaletteIndex _a) + : a(_a) + , b(_a) + { + } + + constexpr ColourPair(PaletteIndex _a, PaletteIndex _b) + : a(_a) + , b(_b) + { + } + + constexpr bool operator==(const ColourPair& rhs) const + { + return a == rhs.a && b == rhs.b; + } + }; + + static constexpr ColourPair MapColourUnowned(ColourPair colour) { - return MapColour2((colour & 0xFF00) >> 8, PaletteIndex::pi10); + return ColourPair(colour.a, PaletteIndex::pi10); } static int32_t getPracticalMapSize() { @@ -166,45 +184,34 @@ namespace OpenRCT2::Ui::Windows STR_MAP_INFO_KIOSK, STR_MAP_FIRST_AID, STR_MAP_CASH_MACHINE, STR_MAP_TOILET, }; - static constexpr uint16_t RideKeyColours[] = { - MapColour(PaletteIndex::pi61), // COLOUR_KEY_RIDE - MapColour(PaletteIndex::pi42), // COLOUR_KEY_FOOD - MapColour(PaletteIndex::pi20), // COLOUR_KEY_DRINK - MapColour(PaletteIndex::pi209), // COLOUR_KEY_SOUVENIR - MapColour(PaletteIndex::pi136), // COLOUR_KEY_KIOSK - MapColour(PaletteIndex::pi102), // COLOUR_KEY_FIRST_AID - MapColour(PaletteIndex::pi55), // COLOUR_KEY_CASH_MACHINE - MapColour(PaletteIndex::pi161), // COLOUR_KEY_TOILETS - }; - - static constexpr uint8_t DefaultPeepMapColour = PaletteIndex::pi20; - static constexpr uint8_t GuestMapColour = PaletteIndex::pi172; - static constexpr uint8_t GuestMapColourAlternate = PaletteIndex::pi21; - static constexpr uint8_t StaffMapColour = PaletteIndex::pi138; - static constexpr uint8_t StaffMapColourAlternate = PaletteIndex::pi10; - - static constexpr uint16_t WaterColour = MapColour(PaletteIndex::pi195); - - static constexpr uint16_t ElementTypeMaskColour[] = { - 0xFFFF, // TILE_ELEMENT_TYPE_SURFACE - 0x0000, // TILE_ELEMENT_TYPE_PATH - 0x00FF, // TILE_ELEMENT_TYPE_TRACK - 0xFF00, // TILE_ELEMENT_TYPE_SMALL_SCENERY - 0x0000, // TILE_ELEMENT_TYPE_ENTRANCE - 0xFFFF, // TILE_ELEMENT_TYPE_WALL - 0x0000, // TILE_ELEMENT_TYPE_LARGE_SCENERY - 0xFFFF, // TILE_ELEMENT_TYPE_BANNER + static constexpr ColourPair kRideKeyColours[] = { + ColourPair(PaletteIndex::pi61), // COLOUR_KEY_RIDE + ColourPair(PaletteIndex::pi42), // COLOUR_KEY_FOOD + ColourPair(PaletteIndex::pi20), // COLOUR_KEY_DRINK + ColourPair(PaletteIndex::pi209), // COLOUR_KEY_SOUVENIR + ColourPair(PaletteIndex::pi136), // COLOUR_KEY_KIOSK + ColourPair(PaletteIndex::pi102), // COLOUR_KEY_FIRST_AID + ColourPair(PaletteIndex::pi55), // COLOUR_KEY_CASH_MACHINE + ColourPair(PaletteIndex::pi161), // COLOUR_KEY_TOILETS }; - static constexpr uint16_t ElementTypeAddColour[] = { - MapColour(PaletteIndex::pi0), // TILE_ELEMENT_TYPE_SURFACE - MapColour(PaletteIndex::pi17), // TILE_ELEMENT_TYPE_PATH - MapColour2(PaletteIndex::pi183, PaletteIndex::pi0), // TILE_ELEMENT_TYPE_TRACK - MapColour2(PaletteIndex::pi0, PaletteIndex::pi99), // TILE_ELEMENT_TYPE_SMALL_SCENERY - MapColour(PaletteIndex::pi186), // TILE_ELEMENT_TYPE_ENTRANCE - MapColour(PaletteIndex::pi0), // TILE_ELEMENT_TYPE_WALL - MapColour(PaletteIndex::pi99), // TILE_ELEMENT_TYPE_LARGE_SCENERY - MapColour(PaletteIndex::pi0), // TILE_ELEMENT_TYPE_BANNER + static constexpr PaletteIndex DefaultPeepMapColour = PaletteIndex::pi20; + static constexpr PaletteIndex GuestMapColour = PaletteIndex::pi172; + static constexpr PaletteIndex GuestMapColourAlternate = PaletteIndex::pi21; + static constexpr PaletteIndex StaffMapColour = PaletteIndex::pi138; + static constexpr PaletteIndex StaffMapColourAlternate = PaletteIndex::pi10; + + static constexpr auto kWaterColour = ColourPair(PaletteIndex::pi195); + + static constexpr ColourPair kElementTypeOverwriteColour[] = { + ColourPair(PaletteIndex::pi0), // TILE_ELEMENT_TYPE_SURFACE + ColourPair(PaletteIndex::pi17), // TILE_ELEMENT_TYPE_PATH + ColourPair(PaletteIndex::pi183, PaletteIndex::pi0), // TILE_ELEMENT_TYPE_TRACK + ColourPair(PaletteIndex::pi0, PaletteIndex::pi99), // TILE_ELEMENT_TYPE_SMALL_SCENERY + ColourPair(PaletteIndex::pi186), // TILE_ELEMENT_TYPE_ENTRANCE + ColourPair(PaletteIndex::pi0), // TILE_ELEMENT_TYPE_WALL + ColourPair(PaletteIndex::pi99), // TILE_ELEMENT_TYPE_LARGE_SCENERY + ColourPair(PaletteIndex::pi0), // TILE_ELEMENT_TYPE_BANNER }; namespace MapFlashingFlags @@ -220,7 +227,7 @@ namespace OpenRCT2::Ui::Windows uint32_t _currentLine; uint16_t _landRightsToolSize; int32_t _firstColumnWidth; - std::vector _mapImageData; + std::vector _mapImageData; bool _mapWidthAndHeightLinked = true; bool _recalculateScrollbars = false; @@ -449,7 +456,6 @@ namespace OpenRCT2::Ui::Windows { int32_t direction; TileElement* tileElement; - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enable, MapSelectFlag::enableArrow); auto mapCoords = FootpathBridgeGetInfoFromPos(screenCoords, &direction, &tileElement); if (mapCoords.IsNull()) @@ -470,7 +476,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectPositionB = mapCoords; gMapSelectArrowPosition = CoordsXYZ{ mapCoords, mapZ }; gMapSelectArrowDirection = DirectionReverse(direction); - MapInvalidateSelectionRect(); } void SetPeepSpawnToolDown(const ScreenCoordsXY& screenCoords) @@ -486,9 +491,9 @@ namespace OpenRCT2::Ui::Windows auto gameAction = GameActions::PeepSpawnPlaceAction({ mapCoords, mapZ, static_cast(direction) }); auto result = GameActions::Execute(&gameAction, getGameState()); - if (result.Error == GameActions::Status::Ok) + if (result.error == GameActions::Status::ok) { - Audio::Play3D(Audio::SoundId::placeItem, result.Position); + Audio::Play3D(Audio::SoundId::placeItem, result.position); } } @@ -533,9 +538,9 @@ namespace OpenRCT2::Ui::Windows // Adjust for hidden scrollbars if needed auto& mapArea = widgets[WIDX_MAP]; - if (size.width >= mapArea.width()) + if (size.width >= mapArea.width() - 1) size.width -= kScrollBarWidth; - if (size.height >= mapArea.height()) + if (size.height >= mapArea.height() - 1) size.height -= kScrollBarWidth; return size; @@ -568,7 +573,7 @@ namespace OpenRCT2::Ui::Windows onScrollMouseDown(scrollIndex, screenCoords); } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { GfxClear(rt, PaletteIndex::pi10); @@ -579,7 +584,7 @@ namespace OpenRCT2::Ui::Windows screenOffset += ScreenCoordsXY(mapOffset, mapOffset - kScrollBarWidth); G1Element g1temp = {}; - g1temp.offset = _mapImageData.data(); + g1temp.offset = reinterpret_cast(_mapImageData.data()); g1temp.width = getMiniMapWidth(); g1temp.height = getMiniMapWidth(); GfxSetG1Element(SPR_TEMP, &g1temp); @@ -663,7 +668,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -675,13 +680,13 @@ namespace OpenRCT2::Ui::Windows { auto screenCoords = windowPos + ScreenCoordsXY{ 4, widgets[WIDX_MAP].bottom + 2 }; - static_assert(std::size(RideKeyColours) == std::size(MapLabels)); + static_assert(std::size(kRideKeyColours) == std::size(MapLabels)); - for (uint32_t i = 0; i < std::size(RideKeyColours); i++) + for (uint32_t i = 0; i < std::size(kRideKeyColours); i++) { Rectangle::fill( rt, { screenCoords + ScreenCoordsXY{ 0, 2 }, screenCoords + ScreenCoordsXY{ 6, 8 } }, - RideKeyColours[i]); + kRideKeyColours[i].b); DrawTextBasic(rt, screenCoords + ScreenCoordsXY{ kListRowHeight, 0 }, MapLabels[i], {}); screenCoords.y += kListRowHeight; if (i == 3) @@ -738,8 +743,8 @@ namespace OpenRCT2::Ui::Windows // calculate width and height of minimap auto& widget = widgets[WIDX_MAP]; - auto mapWidth = widget.width() - kScrollBarWidth - 1; - auto mapHeight = widget.height() - kScrollBarWidth - 1; + auto mapWidth = widget.width() - 1 - kScrollBarWidth - 1; + auto mapHeight = widget.height() - 1 - kScrollBarWidth - 1; centreX = std::max(centreX - (mapWidth >> 1), 0); centreY = std::max(centreY - (mapHeight >> 1), 0); @@ -821,7 +826,7 @@ namespace OpenRCT2::Ui::Windows { if (!MapIsEdge({ x, y })) { - uint16_t colour = 0; + ColourPair colour{}; switch (selectedTab) { case PAGE_PEEPS: @@ -831,8 +836,8 @@ namespace OpenRCT2::Ui::Windows colour = GetPixelColourRide({ x, y }); break; } - destination[0] = (colour >> 8) & 0xFF; - destination[1] = colour; + destination[0] = colour.a; + destination[1] = colour.b; } x += dx; y += dy; @@ -846,30 +851,30 @@ namespace OpenRCT2::Ui::Windows _currentLine = 0; } - uint16_t GetPixelColourPeep(const CoordsXY& c) + ColourPair GetPixelColourPeep(const CoordsXY& c) { auto* surfaceElement = MapGetSurfaceElementAt(c); if (surfaceElement == nullptr) - return 0; + return { PaletteIndex::pi0, PaletteIndex::pi0 }; - uint16_t colour = MapColour(PaletteIndex::pi0); + auto colour = ColourPair(PaletteIndex::pi0); const auto* surfaceObject = surfaceElement->GetSurfaceObject(); if (surfaceObject != nullptr) - colour = MapColour2(surfaceObject->MapColours[0], surfaceObject->MapColours[1]); + colour = ColourPair(surfaceObject->MapColours[0], surfaceObject->MapColours[1]); if (surfaceElement->GetWaterHeight() > 0) - colour = WaterColour; + colour = kWaterColour; if (!(surfaceElement->GetOwnership() & OWNERSHIP_OWNED)) colour = MapColourUnowned(colour); - const int32_t maxSupportedTileElementType = static_cast(std::size(ElementTypeAddColour)); + const int32_t maxSupportedTileElementType = static_cast(std::size(kElementTypeOverwriteColour)); auto tileElement = reinterpret_cast(surfaceElement); while (!(tileElement++)->IsLastForTile()) { if (tileElement->IsGhost()) { - colour = MapColour(PaletteIndex::pi21); + colour = ColourPair(PaletteIndex::pi21); break; } @@ -878,17 +883,24 @@ namespace OpenRCT2::Ui::Windows { tileElementType = TileElementType::Surface; } - colour &= ElementTypeMaskColour[EnumValue(tileElementType)]; - colour |= ElementTypeAddColour[EnumValue(tileElementType)]; + const auto overwriteColours = kElementTypeOverwriteColour[EnumValue(tileElementType)]; + if (overwriteColours.a != PaletteIndex::pi0) + { + colour.a = overwriteColours.a; + } + if (overwriteColours.b != PaletteIndex::pi0) + { + colour.b = overwriteColours.b; + } } return colour; } - uint16_t GetPixelColourRide(const CoordsXY& c) + ColourPair GetPixelColourRide(const CoordsXY& c) { - uint16_t colourA = 0; // highlight colour - uint16_t colourB = MapColour(PaletteIndex::pi13); // surface colour (dark grey) + ColourPair colourA{}; // highlight colour + ColourPair colourB = ColourPair(PaletteIndex::pi13); // surface colour (dark grey) // as an improvement we could use first_element to show underground stuff? TileElement* tileElement = reinterpret_cast(MapGetSurfaceElementAt(c)); @@ -899,7 +911,7 @@ namespace OpenRCT2::Ui::Windows if (tileElement->IsGhost()) { - colourA = MapColour(PaletteIndex::pi21); + colourA = ColourPair(PaletteIndex::pi21); break; } @@ -908,12 +920,12 @@ namespace OpenRCT2::Ui::Windows case TileElementType::Surface: if (tileElement->AsSurface()->GetWaterHeight() > 0) // Why is this a different water colour as above (195)? - colourB = MapColour(PaletteIndex::pi194); + colourB = ColourPair(PaletteIndex::pi194); if (!(tileElement->AsSurface()->GetOwnership() & OWNERSHIP_OWNED)) colourB = MapColourUnowned(colourB); break; case TileElementType::Path: - colourA = MapColour(PaletteIndex::pi14); // lighter grey + colourA = ColourPair(PaletteIndex::pi14); // lighter grey break; case TileElementType::Entrance: { @@ -923,7 +935,7 @@ namespace OpenRCT2::Ui::Windows if (targetRide != nullptr) { const auto& colourKey = targetRide->getRideTypeDescriptor().ColourKey; - colourA = RideKeyColours[EnumValue(colourKey)]; + colourA = kRideKeyColours[EnumValue(colourKey)]; } break; } @@ -933,7 +945,7 @@ namespace OpenRCT2::Ui::Windows if (targetRide != nullptr) { const auto& colourKey = targetRide->getRideTypeDescriptor().ColourKey; - colourA = RideKeyColours[EnumValue(colourKey)]; + colourA = kRideKeyColours[EnumValue(colourKey)]; } break; @@ -943,13 +955,13 @@ namespace OpenRCT2::Ui::Windows } } while (!(tileElement++)->IsLastForTile()); - if (colourA != 0) + if (colourA != ColourPair(PaletteIndex::pi0, PaletteIndex::pi0)) return colourA; return colourB; } - void PaintPeepOverlay(RenderTarget& rt, const ScreenCoordsXY& offset) + void PaintPeepOverlay(Drawing::RenderTarget& rt, const ScreenCoordsXY& offset) { auto flashColour = GetGuestFlashColour(); for (auto guest : EntityList()) @@ -963,7 +975,8 @@ namespace OpenRCT2::Ui::Windows } } - void DrawMapPeepPixel(Peep* peep, const uint8_t flashColour, RenderTarget& rt, const ScreenCoordsXY& offset) + void DrawMapPeepPixel( + Peep* peep, const PaletteIndex flashColour, Drawing::RenderTarget& rt, const ScreenCoordsXY& offset) { if (peep->x == kLocationNull) return; @@ -971,7 +984,7 @@ namespace OpenRCT2::Ui::Windows MapCoordsXY c = TransformToMapCoords({ peep->x, peep->y }); auto leftTop = ScreenCoordsXY{ c.x, c.y } + offset; auto rightBottom = leftTop; - uint8_t colour = DefaultPeepMapColour; + auto colour = DefaultPeepMapColour; if (getGameState().entities.EntityGetFlashing(peep)) { colour = flashColour; @@ -985,9 +998,9 @@ namespace OpenRCT2::Ui::Windows Rectangle::fill(rt, { leftTop, rightBottom }, colour); } - uint8_t GetGuestFlashColour() const + PaletteIndex GetGuestFlashColour() const { - uint8_t colour = DefaultPeepMapColour; + auto colour = DefaultPeepMapColour; if ((_flashingFlags & MapFlashingFlags::FlashGuests) != 0) { colour = GuestMapColour; @@ -997,9 +1010,9 @@ namespace OpenRCT2::Ui::Windows return colour; } - uint8_t GetStaffFlashColour() const + PaletteIndex GetStaffFlashColour() const { - uint8_t colour = DefaultPeepMapColour; + auto colour = DefaultPeepMapColour; if ((_flashingFlags & MapFlashingFlags::FlashStaff) != 0) { colour = StaffMapColour; @@ -1009,7 +1022,7 @@ namespace OpenRCT2::Ui::Windows return colour; } - void PaintTrainOverlay(RenderTarget& rt, const ScreenCoordsXY& offset) + void PaintTrainOverlay(Drawing::RenderTarget& rt, const ScreenCoordsXY& offset) { for (auto train : TrainManager::View()) { @@ -1031,7 +1044,7 @@ namespace OpenRCT2::Ui::Windows * The call to Rectangle::fill was originally wrapped in Sub68DABD which made sure that arguments were ordered * correctly, but it doesn't look like it's ever necessary here so the call was removed. */ - void PaintHudRectangle(RenderTarget& rt, const ScreenCoordsXY& widgetOffset) + void PaintHudRectangle(Drawing::RenderTarget& rt, const ScreenCoordsXY& widgetOffset) { WindowBase* mainWindow = WindowGetMain(); if (mainWindow == nullptr) @@ -1069,7 +1082,7 @@ namespace OpenRCT2::Ui::Windows Rectangle::fill(rt, { rightBottom - ScreenCoordsXY{ 0, 3 }, rightBottom }, PaletteIndex::pi56); } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { // Guest tab image (animated) uint32_t guestTabImage = SPR_TAB_GUESTS_0; diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 19f2443e197f..1a062044bc86 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -299,7 +299,7 @@ namespace OpenRCT2::Ui::Windows pressedWidgets |= 1LL << (WIDX_TAB_1 + page); } - void DrawTabImage(RenderTarget& rt, int32_t newPage, int32_t spriteIndex) + void DrawTabImage(Drawing::RenderTarget& rt, int32_t newPage, int32_t spriteIndex) { WidgetIndex widgetIndex = WIDX_TAB_1 + newPage; @@ -317,7 +317,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { DrawTabImage(rt, WINDOW_MAPGEN_PAGE_BASE, SPR_TAB_GEARS_0); DrawTabImage(rt, WINDOW_MAPGEN_PAGE_TERRAIN, SPR_G2_MAP_GEN_TERRAIN_TAB); @@ -461,8 +461,8 @@ namespace OpenRCT2::Ui::Windows Widget* ddWidget = &widgets[widgetIndex - 1]; WindowDropdownShowTextCustomWidth( - { windowPos.x + ddWidget->left, windowPos.y + ddWidget->top }, ddWidget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, std::size(items), ddWidget->width() - 2); + { windowPos.x + ddWidget->left, windowPos.y + ddWidget->top }, ddWidget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, std::size(items), ddWidget->width() - 3); gDropdown.items[EnumValue(_settings.algorithm)].setChecked(true); break; @@ -597,7 +597,7 @@ namespace OpenRCT2::Ui::Windows // clang-format on } - void BaseDraw(RenderTarget& rt) + void BaseDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -759,7 +759,7 @@ namespace OpenRCT2::Ui::Windows setWidgetDisabled(WIDX_TREE_ALTITUDE_MAX_DOWN, !_settings.trees || isFlatland); } - void ForestsDraw(RenderTarget& rt) + void ForestsDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -863,7 +863,7 @@ namespace OpenRCT2::Ui::Windows } } - void SimplexDraw(RenderTarget& rt) + void SimplexDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -973,7 +973,7 @@ namespace OpenRCT2::Ui::Windows setCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _settings.normalize_height); } - void HeightmapDraw(RenderTarget& rt) + void HeightmapDraw(Drawing::RenderTarget& rt) { const auto enabledColour = colours[1]; const auto disabledColour = enabledColour.withFlag(ColourFlag::inset, true); @@ -1159,7 +1159,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawDropdownButton(RenderTarget& rt, WidgetIndex widgetIndex, ImageId image) + void DrawDropdownButton(Drawing::RenderTarget& rt, WidgetIndex widgetIndex, ImageId image) { const auto& widget = widgets[widgetIndex]; ScreenCoordsXY pos = { windowPos.x + widget.left, windowPos.y + widget.top }; @@ -1167,13 +1167,13 @@ namespace OpenRCT2::Ui::Windows { // Draw greyed out (light border bottom right shadow) auto colour = colours[widget.colour].colour; - colour = ColourMapA[colour].lighter; - GfxDrawSpriteSolid(rt, image, pos + ScreenCoordsXY{ 1, 1 }, colour); + auto paletteIndex = ColourMapA[colour].lighter; + GfxDrawSpriteSolid(rt, image, pos + ScreenCoordsXY{ 1, 1 }, paletteIndex); // Draw greyed out (dark) colour = colours[widget.colour].colour; - colour = ColourMapA[colour].mid_light; - GfxDrawSpriteSolid(rt, image, pos, colour); + paletteIndex = ColourMapA[colour].mid_light; + GfxDrawSpriteSolid(rt, image, pos, paletteIndex); } else { @@ -1181,7 +1181,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawDropdownButtons(RenderTarget& rt, WidgetIndex floorWidgetIndex, WidgetIndex edgeWidgetIndex) + void DrawDropdownButtons(Drawing::RenderTarget& rt, WidgetIndex floorWidgetIndex, WidgetIndex edgeWidgetIndex) { auto& objManager = GetContext()->GetObjectManager(); const auto* surfaceObj = objManager.GetLoadedObject(_settings.landTexture); @@ -1223,7 +1223,7 @@ namespace OpenRCT2::Ui::Windows SetPressedTab(); } - void TerrainDraw(RenderTarget& rt) + void TerrainDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -1334,7 +1334,7 @@ namespace OpenRCT2::Ui::Windows SetPressedTab(); } - void WaterDraw(RenderTarget& rt) + void WaterDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -1446,7 +1446,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { switch (page) { diff --git a/src/openrct2-ui/windows/MapTooltip.cpp b/src/openrct2-ui/windows/MapTooltip.cpp index 2d43802b0cb6..429f5841e199 100644 --- a/src/openrct2-ui/windows/MapTooltip.cpp +++ b/src/openrct2-ui/windows/MapTooltip.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -46,7 +46,7 @@ namespace OpenRCT2::Ui::Windows invalidate(); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { StringId stringId; std::memcpy(&stringId, _mapTooltipArgs.Data(), sizeof(StringId)); @@ -86,7 +86,7 @@ namespace OpenRCT2::Ui::Windows // Check for cursor movement _cursorHoldDuration++; - if (abs(cursorChange.x) > 5 || abs(cursorChange.y) > 5 || (gInputFlags.has(InputFlag::rightMousePressed)) + if (abs(cursorChange.x) > 5 || abs(cursorChange.y) > 5 || gInputFlags.has(InputFlag::rightMousePressed) || InputGetState() == InputState::ViewportRight) _cursorHoldDuration = 0; diff --git a/src/openrct2-ui/windows/MazeConstruction.cpp b/src/openrct2-ui/windows/MazeConstruction.cpp index 41134953356c..61e300428730 100644 --- a/src/openrct2-ui/windows/MazeConstruction.cpp +++ b/src/openrct2-ui/windows/MazeConstruction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,10 @@ #include #include +using OpenRCT2::GameActions::CommandFlag; +using OpenRCT2::GameActions::CommandFlags; +using OpenRCT2::GameActions::MazeBuildMode; + namespace OpenRCT2::Ui::Windows { #pragma region Widgets @@ -118,7 +123,6 @@ namespace OpenRCT2::Ui::Windows RideConstructionInvalidateCurrentTrack(); ViewportSetVisibility(ViewportVisibility::standard); - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); gMapSelectFlags.unset(MapSelectFlag::enableArrow); @@ -134,7 +138,7 @@ namespace OpenRCT2::Ui::Windows if (currentRide->overallView.IsNull()) { auto gameAction = GameActions::RideDemolishAction(currentRide->id, GameActions::RideModifyType::demolish); - gameAction.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + gameAction.SetFlags({ CommandFlag::allowDuringPaused }); GameActions::Execute(&gameAction, getGameState()); } else @@ -302,7 +306,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); } @@ -317,7 +321,7 @@ namespace OpenRCT2::Ui::Windows : ENTRANCE_TYPE_RIDE_EXIT; gRideEntranceExitPlaceRideIndex = rideId; gRideEntranceExitPlaceStationIndex = StationIndex::FromUnderlying(0); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); RideConstructionInvalidateCurrentTrack(); @@ -344,8 +348,6 @@ namespace OpenRCT2::Ui::Windows { RideConstructionInvalidateCurrentTrack(); - MapInvalidateSelectionRect(); - gMapSelectFlags.unset(MapSelectFlag::enable); gMapSelectFlags.unset(MapSelectFlag::enableArrow); @@ -364,10 +366,10 @@ namespace OpenRCT2::Ui::Windows rideEntranceExitPlaceAction.SetCallback([=, this]( const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) return; - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, result->Position); + OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, result->position); auto* windowMgr = Ui::GetWindowManager(); @@ -399,7 +401,9 @@ namespace OpenRCT2::Ui::Windows void WindowMazeConstructionConstruct(int32_t direction) { - int32_t x, y, z, actionFlags = 0, mode; + int32_t x, y, z; + MazeBuildMode mode; + CommandFlags actionFlags = {}; _currentTrackSelectionFlags.clearAll(); _rideConstructionNextArrowPulse = 0; @@ -412,15 +416,15 @@ namespace OpenRCT2::Ui::Windows switch (_rideConstructionState) { case RideConstructionState::MazeBuild: - mode = GC_SET_MAZE_TRACK_BUILD; + mode = MazeBuildMode::build; break; case RideConstructionState::MazeMove: - mode = GC_SET_MAZE_TRACK_MOVE; - actionFlags = GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED; + mode = MazeBuildMode::move; + actionFlags = { CommandFlag::allowDuringPaused }; break; default: case RideConstructionState::MazeFill: - mode = GC_SET_MAZE_TRACK_FILL; + mode = MazeBuildMode::fill; break; } @@ -428,7 +432,7 @@ namespace OpenRCT2::Ui::Windows auto action = GameActions::MazeSetTrackAction(loc, false, _currentRideIndex, mode); action.SetFlags(actionFlags); const auto res = GameActions::Execute(&action, getGameState()); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) { return; } diff --git a/src/openrct2-ui/windows/Multiplayer.cpp b/src/openrct2-ui/windows/Multiplayer.cpp index 9f59788ace11..ba1e51becf2b 100644 --- a/src/openrct2-ui/windows/Multiplayer.cpp +++ b/src/openrct2-ui/windows/Multiplayer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,8 +17,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -166,8 +166,8 @@ namespace OpenRCT2::Ui::Windows auto numItems = Network::GetNumGroups(); WindowDropdownShowTextCustomWidth( - windowPos + ScreenCoordsXY{ dropdownWidget->left, dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, 0, numItems, widget->right - dropdownWidget->left); + windowPos + ScreenCoordsXY{ dropdownWidget->left, dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, 0, numItems, widget->right - dropdownWidget->left); for (auto i = 0; i < Network::GetNumGroups(); i++) { @@ -183,10 +183,10 @@ namespace OpenRCT2::Ui::Windows } } - void informationPaint(RenderTarget& rt) + void informationPaint(Drawing::RenderTarget& rt) { - RenderTarget clippedDPI; - if (ClipDrawPixelInfo(clippedDPI, rt, windowPos, width, height)) + RenderTarget clippedRT; + if (ClipRenderTarget(clippedRT, rt, windowPos, width, height)) { auto screenCoords = ScreenCoordsXY{ 3, widgets[WIDX_CONTENT_PANEL].top + 7 }; int32_t newWidth = width - 6; @@ -195,7 +195,7 @@ namespace OpenRCT2::Ui::Windows { auto ft = Formatter(); ft.Add(name.c_str()); - screenCoords.y += DrawTextWrapped(clippedDPI, screenCoords, newWidth, STR_STRING, ft, { colours[1] }); + screenCoords.y += DrawTextWrapped(clippedRT, screenCoords, newWidth, STR_STRING, ft, { colours[1] }); screenCoords.y += kListRowHeight / 2; } @@ -204,7 +204,7 @@ namespace OpenRCT2::Ui::Windows { auto ft = Formatter(); ft.Add(description.c_str()); - screenCoords.y += DrawTextWrapped(clippedDPI, screenCoords, newWidth, STR_STRING, ft, { colours[1] }); + screenCoords.y += DrawTextWrapped(clippedRT, screenCoords, newWidth, STR_STRING, ft, { colours[1] }); screenCoords.y += kListRowHeight / 2; } @@ -213,7 +213,7 @@ namespace OpenRCT2::Ui::Windows { auto ft = Formatter(); ft.Add(providerName.c_str()); - DrawTextBasic(clippedDPI, screenCoords, STR_PROVIDER_NAME, ft); + DrawTextBasic(clippedRT, screenCoords, STR_PROVIDER_NAME, ft); screenCoords.y += kListRowHeight; } @@ -222,7 +222,7 @@ namespace OpenRCT2::Ui::Windows { auto ft = Formatter(); ft.Add(providerEmail.c_str()); - DrawTextBasic(clippedDPI, screenCoords, STR_PROVIDER_EMAIL, ft); + DrawTextBasic(clippedRT, screenCoords, STR_PROVIDER_EMAIL, ft); screenCoords.y += kListRowHeight; } @@ -231,12 +231,12 @@ namespace OpenRCT2::Ui::Windows { auto ft = Formatter(); ft.Add(providerWebsite.c_str()); - DrawTextBasic(clippedDPI, screenCoords, STR_PROVIDER_WEBSITE, ft); + DrawTextBasic(clippedRT, screenCoords, STR_PROVIDER_WEBSITE, ft); } } } - void playersPaint(RenderTarget& rt) + void playersPaint(Drawing::RenderTarget& rt) { // Number of players StringId stringId = numListItems == 1 ? STR_MULTIPLAYER_PLAYER_COUNT : STR_MULTIPLAYER_PLAYER_COUNT_PLURAL; @@ -246,7 +246,7 @@ namespace OpenRCT2::Ui::Windows DrawTextBasic(rt, screenCoords, stringId, ft, { colours[2] }); } - void playersScrollPaint(int32_t scrollIndex, RenderTarget& rt) const + void playersScrollPaint(int32_t scrollIndex, Drawing::RenderTarget& rt) const { ScreenCoordsXY screenCoords; screenCoords.y = 0; @@ -346,7 +346,7 @@ namespace OpenRCT2::Ui::Windows } } - void groupsPaint(RenderTarget& rt) + void groupsPaint(Drawing::RenderTarget& rt) { thread_local std::string _buffer; @@ -360,7 +360,7 @@ namespace OpenRCT2::Ui::Windows auto ft = Formatter(); ft.Add(_buffer.c_str()); DrawTextEllipsised( - rt, windowPos + ScreenCoordsXY{ widget->midX() - 5, widget->top }, widget->width() - 8, STR_STRING, ft, + rt, windowPos + ScreenCoordsXY{ widget->midX() - 5, widget->top }, widget->width() - 9, STR_STRING, ft, { TextAlignment::centre }); } @@ -384,12 +384,12 @@ namespace OpenRCT2::Ui::Windows auto ft = Formatter(); ft.Add(_buffer.c_str()); DrawTextEllipsised( - rt, windowPos + ScreenCoordsXY{ widget->midX() - 5, widget->top }, widget->width() - 8, STR_STRING, ft, + rt, windowPos + ScreenCoordsXY{ widget->midX() - 5, widget->top }, widget->width() - 9, STR_STRING, ft, { TextAlignment::centre }); } } - void groupsScrollPaint(int32_t scrollIndex, RenderTarget& rt) const + void groupsScrollPaint(int32_t scrollIndex, Drawing::RenderTarget& rt) const { auto screenCoords = ScreenCoordsXY{ 0, 0 }; @@ -432,7 +432,7 @@ namespace OpenRCT2::Ui::Windows } } - void drawTabImage(RenderTarget& rt, int32_t page_number, int32_t spriteIndex) + void drawTabImage(Drawing::RenderTarget& rt, int32_t page_number, int32_t spriteIndex) { WidgetIndex widgetIndex = WIDX_TAB1 + page_number; @@ -454,7 +454,7 @@ namespace OpenRCT2::Ui::Windows } } - void drawTabImages(RenderTarget& rt) + void drawTabImages(Drawing::RenderTarget& rt) { drawTabImage(rt, WINDOW_MULTIPLAYER_PAGE_INFORMATION, SPR_TAB_KIOSKS_AND_FACILITIES_0); drawTabImage(rt, WINDOW_MULTIPLAYER_PAGE_PLAYERS, SPR_TAB_GUESTS_0); @@ -704,7 +704,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); drawTabImages(rt); @@ -900,7 +900,7 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { switch (page) { diff --git a/src/openrct2-ui/windows/NetworkStatus.cpp b/src/openrct2-ui/windows/NetworkStatus.cpp index 82019020860c..09563d8b5dea 100644 --- a/src/openrct2-ui/windows/NetworkStatus.cpp +++ b/src/openrct2-ui/windows/NetworkStatus.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include @@ -86,7 +86,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); thread_local std::string _buffer; diff --git a/src/openrct2-ui/windows/NewCampaign.cpp b/src/openrct2-ui/windows/NewCampaign.cpp index 8e8168df888f..94ec49fdb60b 100644 --- a/src/openrct2-ui/windows/NewCampaign.cpp +++ b/src/openrct2-ui/windows/NewCampaign.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -220,8 +220,8 @@ namespace OpenRCT2::Ui::Windows WindowDropdownShowTextCustomWidth( { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, - dropdownWidget->height() + 1, colours[1], 0, Dropdown::Flag::StayOpen, numItems, - dropdownWidget->width() - 3); + dropdownWidget->height(), colours[1], 0, Dropdown::Flag::StayOpen, numItems, + dropdownWidget->width() - 4); } } else @@ -240,9 +240,8 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, - dropdownWidget->height() + 1, colours[1], 0, Dropdown::Flag::StayOpen, numItems, - dropdownWidget->width() - 3); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), + colours[1], 0, Dropdown::Flag::StayOpen, numItems, dropdownWidget->width() - 4); } break; // In RCT2, the maximum was 6 weeks @@ -269,7 +268,7 @@ namespace OpenRCT2::Ui::Windows auto gameAction = GameActions::ParkMarketingAction( Campaign.campaign_type, Campaign.RideId.ToUnderlying(), Campaign.no_weeks); gameAction.SetCallback([](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { auto* windowMgr = Ui::GetWindowManager(); windowMgr->CloseByClass(WindowClass::newCampaign); @@ -354,7 +353,7 @@ namespace OpenRCT2::Ui::Windows widgetSetDisabled(*this, WIDX_START_BUTTON, true); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { ScreenCoordsXY screenCoords{}; diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index c32c126d1802..ced27db6e60c 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -45,11 +46,21 @@ using namespace OpenRCT2::TrackMetaData; namespace OpenRCT2::Ui::Windows { static constexpr StringId WindowTitle = kStringIdNone; - static constexpr ScreenSize kWindowSize = { 601, 382 }; static constexpr int32_t kWindowHeightResearch = 194; - static constexpr int32_t RideListItemsMax = 384; + static constexpr int32_t RideListItemsMax = kMaxRideObjects; static constexpr int32_t RideTabCount = 6; static constexpr int32_t GroupByTrackTypeWidth = 172; + static constexpr int32_t kScrollItemSize = 116; + static constexpr int32_t kMinColCount = 5; + static constexpr int32_t kMaxColCount = 15; + static constexpr int32_t kMinRowCount = 2; + static constexpr int32_t kMaxRowCount = 7; + static constexpr int32_t kHorizontalPadding = 21; + static constexpr int32_t kVerticalPadding = 150; + static constexpr ScreenSize kWindowSize = { (kMinColCount * kScrollItemSize) + kHorizontalPadding, + (kMinRowCount * kScrollItemSize) + kVerticalPadding }; + static constexpr ScreenSize kWindowMaxSize = { (kMaxColCount * kScrollItemSize) + kHorizontalPadding, + (kMaxRowCount * kScrollItemSize) + kVerticalPadding }; #pragma region Ride type view order @@ -420,7 +431,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_GROUP_BY_TRACK_TYPE].left = width - 8 - localizedGroupByTrackTypeWidth; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -447,7 +458,8 @@ namespace OpenRCT2::Ui::Windows count++; listItem++; } - return { widgets[WIDX_RIDE_LIST].width(), ((count + 4) / 5) * 116 }; + auto itemsPerRow = getNumImagesPerRow(); + return { widgets[WIDX_RIDE_LIST].width() - 1, ((count + (itemsPerRow - 1)) / itemsPerRow) * kScrollItemSize }; } void onScrollMouseOver(int32_t scrollIndex, const ScreenCoordsXY& screenCoords) override @@ -477,7 +489,7 @@ namespace OpenRCT2::Ui::Windows invalidate(); } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { if (_currentTab == RESEARCH_TAB) { @@ -496,8 +508,8 @@ namespace OpenRCT2::Ui::Windows { const auto borderStyle = isSelected ? Rectangle::BorderStyle::inset : Rectangle::BorderStyle::outset; Rectangle::fillInset( - rt, { coords, coords + ScreenCoordsXY{ 115, 115 } }, colours[1], borderStyle, - Rectangle::FillBrightness::dark); + rt, { coords, coords + ScreenCoordsXY{ kScrollItemSize - 1, kScrollItemSize - 1 } }, colours[1], + borderStyle, Rectangle::FillBrightness::dark); } // Draw ride image with feathered border @@ -506,11 +518,11 @@ namespace OpenRCT2::Ui::Windows GfxDrawSpriteRawMasked(rt, coords + ScreenCoordsXY{ 2, 2 }, mask, rideImage); // Next position - coords.x += 116; - if (coords.x >= 116 * 5 + 1) + coords.x += kScrollItemSize; + if (coords.x >= kScrollItemSize * getNumImagesPerRow() + 1) { coords.x = 1; - coords.y += 116; + coords.y += kScrollItemSize; } // Next item @@ -809,8 +821,6 @@ namespace OpenRCT2::Ui::Windows void RefreshWidgetSizing() { - int32_t newWidth{}, newHeight{}; - if (_currentTab < SHOP_TAB) { disabledWidgets &= ~(1 << WIDX_GROUP_BY_TRACK_TYPE); @@ -831,6 +841,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_GROUP_BY_TRACK_TYPE].type = WidgetType::empty; } + ScreenSize newMinSize{}, newMaxSize{}; if (_currentTab != RESEARCH_TAB) { widgets[WIDX_RIDE_LIST].type = WidgetType::scroll; @@ -841,8 +852,8 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_LAST_DEVELOPMENT_BUTTON].type = WidgetType::empty; widgets[WIDX_RESEARCH_FUNDING_BUTTON].type = WidgetType::empty; - newWidth = kWindowSize.width; - newHeight = kWindowSize.height; + newMinSize = kWindowSize; + newMaxSize = kWindowMaxSize; } else { @@ -855,24 +866,35 @@ namespace OpenRCT2::Ui::Windows if (!(getGameState().park.flags & PARK_FLAGS_NO_MONEY)) widgets[WIDX_RESEARCH_FUNDING_BUTTON].type = WidgetType::flatBtn; - newWidth = 300; - newHeight = kWindowHeightResearch; + newMinSize = { 300, kWindowHeightResearch }; + newMaxSize = newMinSize; } // Handle new window size - if (width != newWidth || height != newHeight) + if (width != newMinSize.width || height != newMinSize.height) { - ScreenSize newSize = { newWidth, newHeight }; - WindowSetResize(*this, newSize, newSize); + WindowSetResize(*this, newMinSize, newMaxSize); onResize(); - - widgets[WIDX_GROUP_BY_TRACK_TYPE].left = newWidth - 8 - GroupByTrackTypeWidth; - widgets[WIDX_GROUP_BY_TRACK_TYPE].right = newWidth - 8; } initScrollWidgets(); } + void onResize() override + { + widgets[WIDX_GROUP_BY_TRACK_TYPE].left = width - 8 - GroupByTrackTypeWidth; + widgets[WIDX_GROUP_BY_TRACK_TYPE].right = width - 8; + widgets[WIDX_RIDE_LIST].right = width - 3 - 1; + widgets[WIDX_RIDE_LIST].bottom = height - 65; + } + + uint8_t getNumImagesPerRow() + { + const Widget& listWidget = widgets[WIDX_RIDE_LIST]; + auto scrollWidth = listWidget.width(); + return scrollWidth / kScrollItemSize; + } + RideSelection ScrollGetRideListItemAt(const ScreenCoordsXY& screenCoords) { RideSelection result; @@ -882,12 +904,13 @@ namespace OpenRCT2::Ui::Windows if (screenCoords.x <= 0 || screenCoords.y <= 0) return result; - int32_t column = screenCoords.x / 116; - int32_t row = screenCoords.y / 116; - if (column >= 5) + auto itemsPerRow = getNumImagesPerRow(); + int32_t column = screenCoords.x / kScrollItemSize; + int32_t row = screenCoords.y / kScrollItemSize; + if (column >= itemsPerRow) return result; - int32_t index = column + (row * 5); + int32_t index = column + (row * itemsPerRow); RideSelection* listItem = _windowNewRideListItems; while (listItem->Type != kRideTypeNull || listItem->EntryIndex != kObjectEntryIndexNull) @@ -919,7 +942,8 @@ namespace OpenRCT2::Ui::Windows widgetScrollUpdateThumbs(*this, WIDX_RIDE_LIST); } - void DrawRideInformation(RenderTarget& rt, RideSelection item, const ScreenCoordsXY& screenPos, int32_t textWidth) + void DrawRideInformation( + Drawing::RenderTarget& rt, RideSelection item, const ScreenCoordsXY& screenPos, int32_t textWidth) { auto& objMgr = OpenRCT2::GetContext()->GetObjectManager(); const auto* rideObj = objMgr.GetLoadedObject(item.EntryIndex); @@ -978,7 +1002,7 @@ namespace OpenRCT2::Ui::Windows ft = Formatter(); ft.Add(price); - DrawTextBasic(rt, screenPos + ScreenCoordsXY{ textWidth, 51 }, stringId, ft, { TextAlignment::right }); + DrawTextBasic(rt, screenPos + ScreenCoordsXY{ textWidth - 14, 51 }, stringId, ft, { TextAlignment::right }); } // Draw object author(s) if debugging tools are active @@ -1005,7 +1029,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabImage(RenderTarget& rt, NewRideTabId tab, int32_t spriteIndex) + void DrawTabImage(Drawing::RenderTarget& rt, NewRideTabId tab, int32_t spriteIndex) { WidgetIndex widgetIndex = WIDX_TAB_1 + static_cast(tab); @@ -1023,7 +1047,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { DrawTabImage(rt, TRANSPORT_TAB, SPR_TAB_RIDES_TRANSPORT_0); DrawTabImage(rt, GENTLE_TAB, SPR_TAB_RIDES_GENTLE_0); @@ -1086,7 +1110,8 @@ namespace OpenRCT2::Ui::Windows windowMgr->CloseByClass(WindowClass::trackDesignPlace); window = windowMgr->Create( - WindowClass::constructRide, kWindowSize, { WindowFlag::higherContrastOnPress, WindowFlag::autoPosition }); + WindowClass::constructRide, kWindowSize, + { WindowFlag::higherContrastOnPress, WindowFlag::autoPosition, WindowFlag::resizable }); return window; } diff --git a/src/openrct2-ui/windows/News.cpp b/src/openrct2-ui/windows/News.cpp index 5bf08ec29c51..a9ca64afecf8 100644 --- a/src/openrct2-ui/windows/News.cpp +++ b/src/openrct2-ui/windows/News.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -128,7 +128,7 @@ namespace OpenRCT2::Ui::Windows auto& widget = widgets[WIDX_SCROLL]; ScreenSize scrollSize = onScrollGetSize(0); - scrolls[0].contentOffsetY = std::max(0, scrollSize.height - (widget.height() - 1)); + scrolls[0].contentOffsetY = std::max(0, scrollSize.height - (widget.height() - 2)); widgetScrollUpdateThumbs(*this, WIDX_SCROLL); } @@ -178,7 +178,7 @@ namespace OpenRCT2::Ui::Windows groupWidgetsToInsert.emplace_back(groupWidget); lastGroup = def.group; - y += groupWidget.height(); + y += groupWidget.height() - 1; } // Create checkbox widgets @@ -260,7 +260,7 @@ namespace OpenRCT2::Ui::Windows setWidgetPressed(WIDX_TAB_OPTIONS, page == optionsTab); } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { if (!isWidgetDisabled(WIDX_TAB_NEWS)) { @@ -308,7 +308,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -347,13 +347,8 @@ namespace OpenRCT2::Ui::Windows } } - void onUpdate() override + void onUpdateNews() { - currentFrame++; - - if (page != newsTab) - return; - if (_pressedNewsItemIndex == -1 || --_suspendUpdateTicks != 0) { return; @@ -392,6 +387,25 @@ namespace OpenRCT2::Ui::Windows } } + void onUpdateOptions() + { + currentFrame++; + invalidateWidget(WIDX_TAB_OPTIONS); + } + + void onUpdate() override + { + switch (page) + { + case newsTab: + onUpdateNews(); + break; + case optionsTab: + onUpdateOptions(); + break; + } + } + ScreenSize onScrollGetSize(int32_t scrollIndex) override { int32_t scrollHeight = static_cast(getGameState().newsItems.GetArchived().size()) @@ -441,7 +455,7 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { int32_t lineHeight = FontGetLineHeight(FontStyle::small); int32_t itemHeight = CalculateNewsItemHeight(); @@ -450,7 +464,7 @@ namespace OpenRCT2::Ui::Windows const auto backgroundPaletteIndex = ColourMapA[colours[3].colour].light; // Fill the scrollbar gap if no scrollbar is visible - const bool scrollbarVisible = scrolls[0].contentHeight > widgets[WIDX_SCROLL].height(); + const bool scrollbarVisible = scrolls[0].contentHeight > widgets[WIDX_SCROLL].height() - 1; const auto scrollbarFill = scrollbarVisible ? 0 : kScrollBarWidth; for (const auto& newsItem : getGameState().newsItems.GetArchived()) @@ -512,7 +526,7 @@ namespace OpenRCT2::Ui::Windows case News::ItemType::peepOnRide: { RenderTarget clippedRT; - if (!ClipDrawPixelInfo(clippedRT, rt, screenCoords + ScreenCoordsXY{ 1, 1 }, 22, 22)) + if (!ClipRenderTarget(clippedRT, rt, screenCoords + ScreenCoordsXY{ 1, 1 }, 22, 22)) { break; } diff --git a/src/openrct2-ui/windows/ObjectLoadError.cpp b/src/openrct2-ui/windows/ObjectLoadError.cpp index aa9d04ec0fcd..234f0072660f 100644 --- a/src/openrct2-ui/windows/ObjectLoadError.cpp +++ b/src/openrct2-ui/windows/ObjectLoadError.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,8 +15,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -492,7 +492,7 @@ namespace OpenRCT2::Ui::Windows invalidateWidget(WIDX_SCROLL); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); @@ -510,13 +510,13 @@ namespace OpenRCT2::Ui::Windows DrawTextEllipsised(rt, screenPos + ScreenCoordsXY{ 0, 29 }, kWindowSize.width - 5, STR_BLACK_STRING, ft); } - void onScrollDraw(const int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(const int32_t scrollIndex, Drawing::RenderTarget& rt) override { auto rtCoords = ScreenCoordsXY{ rt.x, rt.y }; Rectangle::fill( rt, { rtCoords, rtCoords + ScreenCoordsXY{ rt.width - 1, rt.height - 1 } }, ColourMapA[colours[1].colour].mid_light); - const int32_t listWidth = widgets[WIDX_SCROLL].width(); + const int32_t listWidth = widgets[WIDX_SCROLL].width() - 1; for (int32_t i = 0; i < numListItems; i++) { diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index 6cd999da2dc3..8ff2845c75da 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,7 +30,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -627,7 +629,7 @@ namespace OpenRCT2::Ui::Windows CommonPrepareDrawAfter(); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -1018,7 +1020,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_FRAME_RATE_LIMIT].text = kFrameRateLimitStringIds[activeItem]; } - void DisplayDraw(RenderTarget& rt) + void DisplayDraw(Drawing::RenderTarget& rt) { auto ft = Formatter(); ft.Add(static_cast(Config::Get().general.windowScale * 100)); @@ -1072,7 +1074,7 @@ namespace OpenRCT2::Ui::Windows Config::Get().general.upperCaseBanners ^= 1; Config::Save(); invalidate(); - ScrollingTextInvalidate(); + Drawing::ScrollingText::invalidate(); break; case WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX: Config::Get().general.disableLightningEffect ^= 1; @@ -1802,8 +1804,8 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, numItems, widget->width() - 3); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, numItems, widget->width() - 4); gDropdown.items[static_cast(ThemeManagerGetAvailableThemeIndex())].setChecked(true); invalidateWidget(WIDX_THEMES_DROPDOWN); @@ -1916,7 +1918,7 @@ namespace OpenRCT2::Ui::Windows numItems++; WindowDropdownShowText( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], Dropdown::Flag::StayOpen, numItems); auto selectedIndex = Config::Get().interface.randomTitleSequence @@ -1933,8 +1935,8 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[1] = Dropdown::MenuLabel(STR_SCENARIO_PREVIEWS_SCREENSHOTS); WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, numItems, widget->width() - 3); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, numItems, widget->width() - 4); gDropdown.items[Config::Get().interface.scenarioPreviewScreenshots].setChecked(true); break; @@ -1946,7 +1948,8 @@ namespace OpenRCT2::Ui::Windows } ShowDropdown(widget, 7); - gDropdown.items[Config::Get().general.defaultInspectionInterval].setChecked(true); + auto selectedIndex = EnumValue(Config::Get().general.defaultInspectionInterval); + gDropdown.items[selectedIndex].setChecked(true); break; } } @@ -1974,9 +1977,9 @@ namespace OpenRCT2::Ui::Windows break; } case WIDX_DEFAULT_INSPECTION_INTERVAL_DROPDOWN: - if (dropdownIndex != Config::Get().general.defaultInspectionInterval) + if (dropdownIndex != EnumValue(Config::Get().general.defaultInspectionInterval)) { - Config::Get().general.defaultInspectionInterval = static_cast(dropdownIndex); + Config::Get().general.defaultInspectionInterval = static_cast(dropdownIndex); Config::Save(); invalidate(); } @@ -2039,8 +2042,8 @@ namespace OpenRCT2::Ui::Windows setCheckboxValue(WIDX_SCENARIO_UNLOCKING, Config::Get().general.scenarioUnlockingEnabled); - widgets[WIDX_DEFAULT_INSPECTION_INTERVAL].text = kRideInspectionIntervalNames - [Config::Get().general.defaultInspectionInterval]; + auto selectedIndex = EnumValue(Config::Get().general.defaultInspectionInterval); + widgets[WIDX_DEFAULT_INSPECTION_INTERVAL].text = kRideInspectionIntervalNames[selectedIndex]; } #pragma endregion @@ -2223,10 +2226,10 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_ASSET_PACKS].bottom = widgets[WIDX_GROUP_ADVANCED].bottom - 6; } - void AdvancedDraw(RenderTarget& rt) + void AdvancedDraw(Drawing::RenderTarget& rt) { auto ft = Formatter(); - ft.Add(static_cast(Config::Get().general.autosaveAmount)); + ft.Add(Config::Get().general.autosaveAmount); DrawTextBasic( rt, windowPos + ScreenCoordsXY{ widgets[WIDX_AUTOSAVE_AMOUNT].left + 1, widgets[WIDX_AUTOSAVE_AMOUNT].top + 1 }, STR_WINDOW_COLOUR_2_COMMA32, ft, { colours[1] }); @@ -2245,7 +2248,7 @@ namespace OpenRCT2::Ui::Windows int32_t padding = widgetHeight > lineHeight ? (widgetHeight - lineHeight) / 2 : 0; auto screenCoords = windowPos + ScreenCoordsXY{ pathWidget.left + 1, pathWidget.top + padding }; - DrawTextEllipsised(rt, screenCoords, pathWidget.width(), STR_BLACK_STRING, ft); + DrawTextEllipsised(rt, screenCoords, pathWidget.width() - 1, STR_BLACK_STRING, ft); } OpenRCT2String AdvancedTooltip(WidgetIndex widgetIndex, StringId fallback) @@ -2296,11 +2299,11 @@ namespace OpenRCT2::Ui::Windows { // helper function, all dropdown boxes have similar properties WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, num_items, widget->width() - 3); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, num_items, widget->width() - 4); } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { DrawTabImage(rt, WINDOW_OPTIONS_PAGE_DISPLAY, SPR_G2_MONITOR_TAB_START); DrawTabImage(rt, WINDOW_OPTIONS_PAGE_RENDERING, SPR_G2_TAB_TREE); @@ -2312,7 +2315,7 @@ namespace OpenRCT2::Ui::Windows DrawTabImage(rt, WINDOW_OPTIONS_PAGE_ADVANCED, SPR_TAB_WRENCH_0); } - void DrawTabImage(RenderTarget& rt, int32_t p, int32_t spriteIndex) + void DrawTabImage(Drawing::RenderTarget& rt, int32_t p, int32_t spriteIndex) { WidgetIndex widgetIndex = WIDX_FIRST_TAB + p; Widget* widget = &widgets[widgetIndex]; @@ -2352,7 +2355,7 @@ namespace OpenRCT2::Ui::Windows uint8_t GetScrollPercentage(const Widget& widget, const ScrollArea& scroll) { - uint8_t w = widget.width() - 1; + uint8_t w = widget.width() - 2; return static_cast(scroll.contentOffsetX) / (scroll.contentWidth - w) * 100; } @@ -2361,7 +2364,7 @@ namespace OpenRCT2::Ui::Windows const auto& widget = widgets[widgetIndex]; auto& scroll = scrolls[scrollId]; - int32_t widgetSize = scroll.contentWidth - (widget.width() - 1); + int32_t widgetSize = scroll.contentWidth - (widget.width() - 2); scroll.contentOffsetX = ceil(volume / 100.0f * widgetSize); widgetScrollUpdateThumbs(*this, widgetIndex); diff --git a/src/openrct2-ui/windows/OverwritePrompt.cpp b/src/openrct2-ui/windows/OverwritePrompt.cpp index 30f41c9cecf3..450f8c081db3 100644 --- a/src/openrct2-ui/windows/OverwritePrompt.cpp +++ b/src/openrct2-ui/windows/OverwritePrompt.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -85,7 +86,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); diff --git a/src/openrct2-ui/windows/Park.cpp b/src/openrct2-ui/windows/Park.cpp index d4a105ebfcf0..b108b6e29fed 100644 --- a/src/openrct2-ui/windows/Park.cpp +++ b/src/openrct2-ui/windows/Park.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -357,7 +358,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { switch (page) { @@ -451,7 +452,7 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[0] = Dropdown::MenuLabel(STR_CLOSE_PARK); gDropdown.items[1] = Dropdown::MenuLabel(STR_OPEN_PARK); WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() + 1, colours[1], 0, 2); + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), colours[1], 0, 2); if (Park::IsOpen(getGameState().park)) { @@ -585,7 +586,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDrawEntrance(RenderTarget& rt) + void onDrawEntrance(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -604,8 +605,8 @@ namespace OpenRCT2::Ui::Windows auto* labelWidget = &widgets[WIDX_STATUS]; DrawTextEllipsised( - rt, windowPos + ScreenCoordsXY{ labelWidget->midX(), labelWidget->top }, labelWidget->width(), STR_BLACK_STRING, - ft, { TextAlignment::centre }); + rt, windowPos + ScreenCoordsXY{ labelWidget->midX(), labelWidget->top }, labelWidget->width() - 1, + STR_BLACK_STRING, ft, { TextAlignment::centre }); } void initViewport() @@ -646,7 +647,7 @@ namespace OpenRCT2::Ui::Windows Widget* viewportWidget = &widgets[WIDX_VIEWPORT]; ViewportCreate( *this, windowPos + ScreenCoordsXY{ viewportWidget->left + 1, viewportWidget->top + 1 }, - viewportWidget->width() - 1, viewportWidget->height() - 1, focus.value()); + viewportWidget->width() - 2, viewportWidget->height() - 2, focus.value()); flags |= WindowFlag::noScrolling; invalidate(); } @@ -700,7 +701,7 @@ namespace OpenRCT2::Ui::Windows kGraphNumYLabels, kParkRatingHistorySize); } - void onDrawRating(RenderTarget& rt) + void onDrawRating(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -781,7 +782,7 @@ namespace OpenRCT2::Ui::Windows kGraphNumYLabels, kGuestsInParkHistorySize); } - void onDrawGuests(RenderTarget& rt) + void onDrawGuests(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -882,7 +883,7 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_7); } - void onDrawPrice(RenderTarget& rt) + void onDrawPrice(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -942,7 +943,7 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_7); } - void onDrawStats(RenderTarget& rt) + void onDrawStats(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -1068,7 +1069,7 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_7); } - void onDrawObjective(RenderTarget& rt) + void onDrawObjective(Drawing::RenderTarget& rt) { auto& gameState = getGameState(); drawWidgets(rt); @@ -1134,7 +1135,7 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_7); } - void onDrawAwards(RenderTarget& rt) + void onDrawAwards(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -1208,7 +1209,7 @@ namespace OpenRCT2::Ui::Windows pressedWidgets |= 1LL << (WIDX_TAB_1 + page); } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { // Entrance tab if (!widgetIsDisabled(*this, WIDX_TAB_1)) diff --git a/src/openrct2-ui/windows/PatrolArea.cpp b/src/openrct2-ui/windows/PatrolArea.cpp index dab5a095d41f..812715e84e15 100644 --- a/src/openrct2-ui/windows/PatrolArea.cpp +++ b/src/openrct2-ui/windows/PatrolArea.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -136,7 +136,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_PREVIEW].image = ImageId(LandTool::SizeToSpriteIndex(gLandToolSize)); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -159,7 +159,7 @@ namespace OpenRCT2::Ui::Windows return; auto stateChanged = false; - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) stateChanged = true; if (gMapSelectType != MapSelectType::full) @@ -181,15 +181,10 @@ namespace OpenRCT2::Ui::Windows if (stateChanged) { - // Invalidate previous area - MapInvalidateSelectionRect(); - - // Update and invalidate new area gMapSelectFlags.set(MapSelectFlag::enable); gMapSelectType = MapSelectType::full; gMapSelectPositionA = posA; gMapSelectPositionB = posB; - MapInvalidateSelectionRect(); } } @@ -254,7 +249,6 @@ namespace OpenRCT2::Ui::Windows if (!ToolSet(*this, 0, Tool::walkDown)) { ShowGridlines(); - gInputFlags.set(InputFlag::unk6); SetPatrolAreaToRender(_staffId); GfxInvalidateScreen(); } diff --git a/src/openrct2-ui/windows/Player.cpp b/src/openrct2-ui/windows/Player.cpp index 62c0c2f12c8d..79b5bc6e94c7 100644 --- a/src/openrct2-ui/windows/Player.cpp +++ b/src/openrct2-ui/windows/Player.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -151,7 +151,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { switch (page) { @@ -251,7 +251,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { Widget* widget; @@ -390,7 +390,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_VIEWPORT].right = width - 26; widgets[WIDX_VIEWPORT].bottom = height - 14; - int32_t groupDropdownWidth = widgets[WIDX_GROUP].width(); + int32_t groupDropdownWidth = widgets[WIDX_GROUP].width() - 1; widgets[WIDX_GROUP].left = (width - groupDropdownWidth) / 2; widgets[WIDX_GROUP].right = widgets[WIDX_GROUP].left + groupDropdownWidth; widgets[WIDX_GROUP_DROPDOWN].left = widgets[WIDX_GROUP].right - 10; @@ -403,8 +403,8 @@ namespace OpenRCT2::Ui::Windows Widget* viewportWidget = &widgets[WIDX_VIEWPORT]; viewport->pos = windowPos + ScreenCoordsXY{ viewportWidget->left, viewportWidget->top }; - viewport->width = viewportWidget->width(); - viewport->height = viewportWidget->height(); + viewport->width = viewportWidget->width() - 1; + viewport->height = viewportWidget->height() - 1; } // only enable kick button for other players @@ -415,7 +415,7 @@ namespace OpenRCT2::Ui::Windows widgetSetEnabled(*this, WIDX_KICK, canKick && !isOwnWindow && !isServer); } - void onDrawOverview(RenderTarget& rt) + void onDrawOverview(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); @@ -439,7 +439,7 @@ namespace OpenRCT2::Ui::Windows ft.Add(_buffer.c_str()); DrawTextEllipsised( - rt, windowPos + ScreenCoordsXY{ widget->midX() - 5, widget->top }, widget->width() - 8, STR_STRING, ft, + rt, windowPos + ScreenCoordsXY{ widget->midX() - 5, widget->top }, widget->width() - 9, STR_STRING, ft, { TextAlignment::centre }); } @@ -533,7 +533,7 @@ namespace OpenRCT2::Ui::Windows auto playerSetGroupAction = GameActions::PlayerSetGroupAction(playerId, groupId); playerSetGroupAction.SetCallback( [windowHandle](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByNumber(windowHandle.first, windowHandle.second); @@ -557,8 +557,8 @@ namespace OpenRCT2::Ui::Windows numItems = Network::GetNumGroups(); WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, 0, numItems, widget->right - dropdownWidget->left); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, 0, numItems, widget->right - dropdownWidget->left); for (i = 0; i < Network::GetNumGroups(); i++) { @@ -599,7 +599,7 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_2); } - void onDrawStatistics(RenderTarget& rt) + void onDrawStatistics(Drawing::RenderTarget& rt) { drawWidgets(rt); DrawTabImages(rt); diff --git a/src/openrct2-ui/windows/ProgressWindow.cpp b/src/openrct2-ui/windows/ProgressWindow.cpp index 2dfbca8cd987..87711ccd3cca 100644 --- a/src/openrct2-ui/windows/ProgressWindow.cpp +++ b/src/openrct2-ui/windows/ProgressWindow.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -171,46 +171,48 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); auto& widget = widgets[WIDX_TITLE]; auto screenCoords = windowPos + ScreenCoordsXY{ widget.left, widget.bottom + 1 }; - RenderTarget clipDPI; - if (!ClipDrawPixelInfo(clipDPI, rt, screenCoords, width - 3, height - widget.bottom - 3)) + Drawing::RenderTarget clipRT; + if (!ClipRenderTarget(clipRT, rt, screenCoords, width - 3, height - widget.bottom - 3)) return; auto& variant = kVehicleStyles[style]; // Draw supports sprite -- twice, to fill the window auto trackCoords = ScreenCoordsXY{ widget.left, widget.bottom + 1 }; - GfxDrawSprite(clipDPI, variant.supports, trackCoords); - GfxDrawSprite(clipDPI, variant.supports, trackCoords + ScreenCoordsXY(256, 0)); + GfxDrawSprite(clipRT, variant.supports, trackCoords); + GfxDrawSprite(clipRT, variant.supports, trackCoords + ScreenCoordsXY(256, 0)); // Draw track sprite -- twice, to fill the window - GfxDrawSprite(clipDPI, variant.track, trackCoords); - GfxDrawSprite(clipDPI, variant.track, trackCoords + ScreenCoordsXY(256, 0)); + GfxDrawSprite(clipRT, variant.track, trackCoords); + GfxDrawSprite(clipRT, variant.track, trackCoords + ScreenCoordsXY(256, 0)); // Figure out where to position the vehicle to indicate progress auto* vehicle = GfxGetG1Element(variant.vehicle); int16_t vehicleWidth = (vehicle != nullptr) ? vehicle->width : 0; int32_t position; if (_totalCount > 0) - position = (-vehicleWidth + 2) + width * _currentProgress / _totalCount; + { + const auto progress = static_cast(_currentProgress) / _totalCount; + position = static_cast((-vehicleWidth + 2) + width * progress); + } else + { position = (vehicleWidth + width) / 2; + } - GfxDrawSprite(clipDPI, variant.vehicle, ScreenCoordsXY(position, widget.bottom + 1)); + GfxDrawSprite(clipRT, variant.vehicle, ScreenCoordsXY(position, widget.bottom + 1)); } void setCaption(const std::string& text) { _progressTitle = text; - _currentProgress = 0; - _totalCount = 0; - invalidate(); } diff --git a/src/openrct2-ui/windows/RefurbishRidePrompt.cpp b/src/openrct2-ui/windows/RefurbishRidePrompt.cpp index 56f9eb7540fa..382e9e4cfc71 100644 --- a/src/openrct2-ui/windows/RefurbishRidePrompt.cpp +++ b/src/openrct2-ui/windows/RefurbishRidePrompt.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -72,7 +72,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); diff --git a/src/openrct2-ui/windows/Research.cpp b/src/openrct2-ui/windows/Research.cpp index 886666ff9396..9b966b2e1a57 100644 --- a/src/openrct2-ui/windows/Research.cpp +++ b/src/openrct2-ui/windows/Research.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -246,7 +247,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -266,7 +267,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabImage(RenderTarget& rt, int32_t tabPage, int32_t spriteIndex) + void DrawTabImage(Drawing::RenderTarget& rt, int32_t tabPage, int32_t spriteIndex) { WidgetIndex widgetIndex = WIDX_TAB_1 + tabPage; @@ -286,7 +287,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { DrawTabImage(rt, WINDOW_RESEARCH_PAGE_DEVELOPMENT, SPR_TAB_FINANCES_RESEARCH_0); DrawTabImage(rt, WINDOW_RESEARCH_PAGE_FUNDING, SPR_TAB_FINANCES_SUMMARY_0); @@ -349,7 +350,7 @@ namespace OpenRCT2::Ui::Windows } } - void WindowResearchDevelopmentDraw(WindowBase* w, RenderTarget& rt, WidgetIndex baseWidgetIndex) + void WindowResearchDevelopmentDraw(WindowBase* w, Drawing::RenderTarget& rt, WidgetIndex baseWidgetIndex) { const auto& gameState = getGameState(); @@ -491,8 +492,8 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[i] = Dropdown::MenuLabel(kResearchFundingLevelNames[i]); } WindowDropdownShowTextCustomWidth( - { w->windowPos.x + dropdownWidget->left, w->windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - w->colours[1], 0, Dropdown::Flag::StayOpen, 4, dropdownWidget->width() - 3); + { w->windowPos.x + dropdownWidget->left, w->windowPos.y + dropdownWidget->top }, dropdownWidget->height(), + w->colours[1], 0, Dropdown::Flag::StayOpen, 4, dropdownWidget->width() - 4); int32_t currentResearchLevel = gameState.researchFundingLevel; gDropdown.items[currentResearchLevel].setChecked(true); @@ -582,7 +583,7 @@ namespace OpenRCT2::Ui::Windows } } - void WindowResearchFundingDraw(WindowBase* w, RenderTarget& rt) + void WindowResearchFundingDraw(WindowBase* w, Drawing::RenderTarget& rt) { const auto& gameState = getGameState(); if (gameState.park.flags & PARK_FLAGS_NO_MONEY) diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 097fd2617dd3..1ceffaed0b46 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -42,26 +43,25 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include #include #include #include -#include #include #include #include -#include #include #include #include -#include #include #include #include @@ -543,48 +543,48 @@ namespace OpenRCT2::Ui::Windows static_assert(std::size(VehicleColourSchemeNames) == kNumVehicleColourSettings); static constexpr std::array VehicleStatusNames = { - STR_MOVING_TO_END_OF, // Vehicle::Status::MovingToEndOfStation - STR_WAITING_FOR_PASSENGERS_AT, // Vehicle::Status::WaitingForPassengers - STR_WAITING_TO_DEPART, // Vehicle::Status::WaitingToDepart - STR_DEPARTING, // Vehicle::Status::Departing - STR_TRAVELLING_AT_0, // Vehicle::Status::Travelling - STR_ARRIVING_AT, // Vehicle::Status::Arriving - STR_UNLOADING_PASSENGERS_AT, // Vehicle::Status::UnloadingPassengers - STR_TRAVELLING_AT_1, // Vehicle::Status::TravellingBoat - STR_CRASHING, // Vehicle::Status::Crashing - STR_CRASHED_0, // Vehicle::Status::Crashed - STR_TRAVELLING_AT_2, // Vehicle::Status::TravellingDodgems - STR_SWINGING, // Vehicle::Status::Swinging - STR_ROTATING_0, // Vehicle::Status::Rotating - STR_ROTATING_1, // Vehicle::Status::FerrisWheelRotating - STR_OPERATING_0, // Vehicle::Status::SimulatorOperating - STR_SHOWING_FILM, // Vehicle::Status::ShowingFilm - STR_ROTATING_2, // Vehicle::Status::SpaceRingsOperating - STR_OPERATING_1, // Vehicle::Status::TopSpinOperating - STR_OPERATING_2, // Vehicle::Status::HauntedHouseOperating - STR_DOING_CIRCUS_SHOW, // Vehicle::Status::DoingCircusShow - STR_OPERATING_3, // Vehicle::Status::CrookedHouseOperating - STR_WAITING_FOR_CABLE_LIFT, // Vehicle::Status::WaitingForCableLift - STR_TRAVELLING_AT_3, // Vehicle::Status::TravellingCableLift - STR_STOPPING_0, // Vehicle::Status::Stopping - STR_WAITING_FOR_PASSENGERS, // Vehicle::Status::WaitingForPassengers17 - STR_WAITING_TO_START, // Vehicle::Status::WaitingToStart - STR_STARTING, // Vehicle::Status::Starting - STR_OPERATING, // Vehicle::Status::Operating1A - STR_STOPPING_1, // Vehicle::Status::Stopping1B - STR_UNLOADING_PASSENGERS, // Vehicle::Status::UnloadingPassengers1C - STR_STOPPED_BY_BLOCK_BRAKES, // Vehicle::Status::StoppedByBlockBrakes + STR_MOVING_TO_END_OF, // Vehicle::Status::movingToEndOfStation + STR_WAITING_FOR_PASSENGERS_AT, // Vehicle::Status::waitingForPassengers + STR_WAITING_TO_DEPART, // Vehicle::Status::waitingToDepart + STR_DEPARTING, // Vehicle::Status::departing + STR_TRAVELLING_AT_0, // Vehicle::Status::travelling + STR_ARRIVING_AT, // Vehicle::Status::arriving + STR_UNLOADING_PASSENGERS_AT, // Vehicle::Status::unloadingPassengers + STR_TRAVELLING_AT_1, // Vehicle::Status::travellingBoat + STR_CRASHING, // Vehicle::Status::crashing + STR_CRASHED_0, // Vehicle::Status::crashed + STR_TRAVELLING_AT_2, // Vehicle::Status::travellingDodgems + STR_SWINGING, // Vehicle::Status::swinging + STR_ROTATING_0, // Vehicle::Status::rotating + STR_ROTATING_1, // Vehicle::Status::ferrisWheelRotating + STR_OPERATING_0, // Vehicle::Status::simulatorOperating + STR_SHOWING_FILM, // Vehicle::Status::showingFilm + STR_ROTATING_2, // Vehicle::Status::spaceRingsOperating + STR_OPERATING_1, // Vehicle::Status::topSpinOperating + STR_OPERATING_2, // Vehicle::Status::hauntedHouseOperating + STR_DOING_CIRCUS_SHOW, // Vehicle::Status::doingCircusShow + STR_OPERATING_3, // Vehicle::Status::crookedHouseOperating + STR_WAITING_FOR_CABLE_LIFT, // Vehicle::Status::waitingForCableLift + STR_TRAVELLING_AT_3, // Vehicle::Status::travellingCableLift + STR_STOPPING_0, // Vehicle::Status::stopping + STR_WAITING_FOR_PASSENGERS, // Vehicle::Status::waitingForPassengers17 + STR_WAITING_TO_START, // Vehicle::Status::waitingToStart + STR_STARTING, // Vehicle::Status::starting + STR_OPERATING, // Vehicle::Status::operating1A + STR_STOPPING_1, // Vehicle::Status::stopping1B + STR_UNLOADING_PASSENGERS, // Vehicle::Status::unloadingPassengers1C + STR_STOPPED_BY_BLOCK_BRAKES, // Vehicle::Status::stoppedByBlockBrakes }; static_assert(std::size(VehicleStatusNames) == 31); static constexpr std::array SingleSessionVehicleStatusNames = { - STR_STOPPING_0, // Vehicle::Status::MovingToEndOfStation - STR_WAITING_FOR_PASSENGERS, // Vehicle::Status::WaitingForPassengers - STR_WAITING_TO_START, // Vehicle::Status::WaitingToDepart - STR_STARTING, // Vehicle::Status::Departing - STR_OPERATING, // Vehicle::Status::Travelling - STR_STOPPING_1, // Vehicle::Status::Arriving - STR_UNLOADING_PASSENGERS, // Vehicle::Status::UnloadingPassengers + STR_STOPPING_0, // Vehicle::Status::movingToEndOfStation + STR_WAITING_FOR_PASSENGERS, // Vehicle::Status::waitingForPassengers + STR_WAITING_TO_START, // Vehicle::Status::waitingToDepart + STR_STARTING, // Vehicle::Status::departing + STR_OPERATING, // Vehicle::Status::travelling + STR_STOPPING_1, // Vehicle::Status::arriving + STR_UNLOADING_PASSENGERS, // Vehicle::Status::unloadingPassengers }; static_assert(std::size(SingleSessionVehicleStatusNames) == 7); @@ -626,7 +626,7 @@ namespace OpenRCT2::Ui::Windows { ride_type_t RideTypeId; StringId LabelId; - u8string_view LabelString; + u8string LabelString; }; // Used for sorting the vehicle type dropdown. @@ -894,7 +894,7 @@ namespace OpenRCT2::Ui::Windows break; } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { switch (page) { @@ -1073,7 +1073,7 @@ namespace OpenRCT2::Ui::Windows break; } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { switch (page) { @@ -1205,7 +1205,7 @@ namespace OpenRCT2::Ui::Windows } private: - void drawTabImage(RenderTarget& rt, int32_t tab, int32_t spriteIndex) + void drawTabImage(Drawing::RenderTarget& rt, int32_t tab, int32_t spriteIndex) { WidgetIndex widgetIndex = WIDX_TAB_1 + tab; @@ -1222,7 +1222,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabMain(RenderTarget& rt) + void DrawTabMain(Drawing::RenderTarget& rt) { WidgetIndex widgetIndex = WIDX_TAB_1 + static_cast(WINDOW_RIDE_PAGE_MAIN); if (!widgetIsDisabled(*this, widgetIndex)) @@ -1256,7 +1256,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabVehicle(RenderTarget& rt) + void DrawTabVehicle(Drawing::RenderTarget& rt) { WidgetIndex widgetIndex = WIDX_TAB_1 + static_cast(WINDOW_RIDE_PAGE_VEHICLE); const auto& widget = widgets[widgetIndex]; @@ -1283,8 +1283,8 @@ namespace OpenRCT2::Ui::Windows screenCoords += windowPos; - RenderTarget clipDPI; - if (!ClipDrawPixelInfo(clipDPI, rt, screenCoords, clipWidth, clipHeight)) + RenderTarget clipRT; + if (!ClipRenderTarget(clipRT, rt, screenCoords, clipWidth, clipHeight)) { return; } @@ -1293,7 +1293,7 @@ namespace OpenRCT2::Ui::Windows if (isHalfScale) { - clipDPI.zoom_level = ZoomLevel{ 1 }; + clipRT.zoom_level = ZoomLevel{ 1 }; spriteCoords.x *= 2; spriteCoords.y *= 2; } @@ -1315,11 +1315,11 @@ namespace OpenRCT2::Ui::Windows imageIndex *= carEntry.base_num_frames; imageIndex += carEntry.base_image_id; auto imageId = ImageId(imageIndex, vehicleColour.Body, vehicleColour.Trim, vehicleColour.Tertiary); - GfxDrawSprite(clipDPI, imageId, spriteCoords); + GfxDrawSprite(clipRT, imageId, spriteCoords); } } - void DrawTabCustomer(RenderTarget& rt) + void DrawTabCustomer(Drawing::RenderTarget& rt) { WidgetIndex widgetIndex = WIDX_TAB_1 + static_cast(WINDOW_RIDE_PAGE_CUSTOMER); @@ -1339,7 +1339,7 @@ namespace OpenRCT2::Ui::Windows } } - void drawTabImages(RenderTarget& rt) + void drawTabImages(Drawing::RenderTarget& rt) { DrawTabVehicle(rt); drawTabImage(rt, WINDOW_RIDE_PAGE_OPERATING, SPR_TAB_GEARS_0); @@ -1584,8 +1584,8 @@ namespace OpenRCT2::Ui::Windows const auto& viewWidget = widgets[WIDX_VIEWPORT]; auto screenPos = windowPos + ScreenCoordsXY{ viewWidget.left + 1, viewWidget.top + 1 }; - int32_t viewWidth = viewWidget.width() - 1; - int32_t viewHeight = viewWidget.height() - 1; + int32_t viewWidth = viewWidget.width() - 2; + int32_t viewHeight = viewWidget.height() - 2; ViewportCreate(*this, screenPos, viewWidth, viewHeight, focus.value()); @@ -1762,8 +1762,8 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, 0, numItems, widget->right - dropdownWidget->left); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, 0, numItems, widget->right - dropdownWidget->left); // First item gDropdown.items[0] = Dropdown::MenuLabel(STR_OVERALL_VIEW); @@ -1869,7 +1869,7 @@ namespace OpenRCT2::Ui::Windows SetDropdown(info, RideStatus::testing, STR_TEST_RIDE); SetDropdown(info, RideStatus::open, STR_OPEN_RIDE); WindowDropdownShowText( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, info.NumItems); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, info.NumItems); if (info.CheckedIndex != -1) { gDropdown.items[info.CheckedIndex].setChecked(true); @@ -1879,29 +1879,12 @@ namespace OpenRCT2::Ui::Windows static constexpr StringId GetRideTypeNameForDropdown(ride_type_t rideType) { - switch (rideType) - { - case RIDE_TYPE_1D: - return STR_RIDE_NAME_1D; - case RIDE_TYPE_1F: - return STR_RIDE_NAME_1F; - case RIDE_TYPE_22: - return STR_RIDE_NAME_22; - case RIDE_TYPE_50: - return STR_RIDE_NAME_50; - case RIDE_TYPE_52: - return STR_RIDE_NAME_52; - case RIDE_TYPE_53: - return STR_RIDE_NAME_53; - case RIDE_TYPE_54: - return STR_RIDE_NAME_54; - case RIDE_TYPE_55: - return STR_RIDE_NAME_55; - case RIDE_TYPE_59: - return STR_RIDE_NAME_59; - default: - return GetRideTypeDescriptor(rideType).Naming.Name; + auto stringId = GetRideTypeDescriptor(rideType).Naming.Name; + if (stringId == STR_UNKNOWN_RIDE) + { + stringId = STR_RIDE_NAME_UNKNOWN_INT32; } + return stringId; } void PopulateRideTypeDropdown() @@ -1914,8 +1897,13 @@ namespace OpenRCT2::Ui::Windows for (uint8_t i = 0; i < RIDE_TYPE_COUNT; i++) { + // Will return the actual name for most rides, but a special string "Unknown Ride ({INT32})" for unknown ones. + // The placeholder will then be filled with the ID. auto name = GetRideTypeNameForDropdown(i); - _rideDropdownData.push_back({ i, name, u8string_view{ ls.GetString(name) } }); + auto ft = Formatter(); + ft.Add(i); + auto label = FormatStringIDLegacy(name, ft.Data()); + _rideDropdownData.push_back({ i, name, label }); } std::sort(_rideDropdownData.begin(), _rideDropdownData.end(), [](auto& a, auto& b) { @@ -1935,13 +1923,13 @@ namespace OpenRCT2::Ui::Windows for (size_t i = 0; i < _rideDropdownData.size(); i++) { - gDropdown.items[i] = Dropdown::MenuLabel(_rideDropdownData[i].LabelId); + gDropdown.items[i] = Dropdown::MenuLabel(_rideDropdownData[i].LabelString); } Widget* dropdownWidget = widget - 1; WindowDropdownShowText( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], Dropdown::Flag::StayOpen, RIDE_TYPE_COUNT); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + Dropdown::Flag::StayOpen, RIDE_TYPE_COUNT); // Find the current ride type in the ordered list. int32_t pos = 0; @@ -1969,7 +1957,7 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[1] = Dropdown::PlainMenuLabel(STR_FOLLOW_SUBJECT_TIP); WindowDropdownShowText( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, 2); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, 2); gDropdown.defaultIndex = 0; if (!ride->getRideTypeDescriptor().HasFlag(RtdFlag::hasTrack) || _viewIndex == 0 || _viewIndex > ride->numTrains) { @@ -1983,7 +1971,7 @@ namespace OpenRCT2::Ui::Windows auto* ride = GetRide(rideId); if (ride != nullptr) { - if (!(ride->windowInvalidateFlags & RIDE_INVALIDATE_RIDE_MAIN)) + if (!ride->windowInvalidateFlags.has(RideInvalidateFlag::main)) { if (_viewIndex > 0) { @@ -2087,8 +2075,8 @@ namespace OpenRCT2::Ui::Windows Widget* dropdownWidget = widget - 1; WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, numItems, dropdownWidget->width()); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, Dropdown::Flag::StayOpen, numItems, dropdownWidget->width() - 1); // Find the current vehicle type in the ordered list. int32_t pos = 0; @@ -2148,8 +2136,8 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, _entranceDropdownData.size(), + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, Dropdown::Flag::StayOpen, _entranceDropdownData.size(), widgets[WIDX_ENTRANCE_STYLE_DROPDOWN].right - dropdownWidget->left); } @@ -2266,7 +2254,7 @@ namespace OpenRCT2::Ui::Windows auto ride = GetRide(rideId); if (ride != nullptr) { - if (!(ride->windowInvalidateFlags & RIDE_INVALIDATE_RIDE_MAIN)) + if (!ride->windowInvalidateFlags.has(RideInvalidateFlag::main)) { if (_viewIndex == 0) return; @@ -2275,16 +2263,16 @@ namespace OpenRCT2::Ui::Windows { Vehicle* vehicle = getGameState().entities.GetEntity(ride->vehicles[_viewIndex - 1]); if (vehicle == nullptr - || (vehicle->status != Vehicle::Status::Travelling - && vehicle->status != Vehicle::Status::TravellingCableLift - && vehicle->status != Vehicle::Status::TravellingDodgems - && vehicle->status != Vehicle::Status::TravellingBoat)) + || (vehicle->status != Vehicle::Status::travelling + && vehicle->status != Vehicle::Status::travellingCableLift + && vehicle->status != Vehicle::Status::travellingDodgems + && vehicle->status != Vehicle::Status::travellingBoat)) { return; } } } - ride->windowInvalidateFlags &= ~RIDE_INVALIDATE_RIDE_MAIN; + ride->windowInvalidateFlags.unset(RideInvalidateFlag::main); } invalidateWidget(WIDX_STATUS); } @@ -2472,13 +2460,13 @@ namespace OpenRCT2::Ui::Windows return kStringIdEmpty; auto& rtd = ride->getRideTypeDescriptor(); - if (vehicle->status != Vehicle::Status::Crashing && vehicle->status != Vehicle::Status::Crashed) + if (vehicle->status != Vehicle::Status::crashing && vehicle->status != Vehicle::Status::crashed) { auto trackType = vehicle->GetTrackType(); - if (trackType == TrackElemType::BlockBrakes || trackType == TrackElemType::CableLiftHill - || trackType == TrackElemType::Up25ToFlat || trackType == TrackElemType::Up60ToFlat - || trackType == TrackElemType::DiagUp25ToFlat || trackType == TrackElemType::DiagUp60ToFlat - || trackType == TrackElemType::DiagBlockBrakes) + if (trackType == TrackElemType::blockBrakes || trackType == TrackElemType::cableLiftHill + || trackType == TrackElemType::up25ToFlat || trackType == TrackElemType::up60ToFlat + || trackType == TrackElemType::diagUp25ToFlat || trackType == TrackElemType::diagUp60ToFlat + || trackType == TrackElemType::diagBlockBrakes) { if (rtd.SupportsTrackGroup(TrackGroup::blockBrakes) && vehicle->velocity == 0) { @@ -2493,7 +2481,7 @@ namespace OpenRCT2::Ui::Windows auto stringId = VehicleStatusNames[EnumValue(vehicle->status)]; if (ride->getRideTypeDescriptor().HasFlag(RtdFlag::singleSession) - && vehicle->status <= Vehicle::Status::UnloadingPassengers) + && vehicle->status <= Vehicle::Status::unloadingPassengers) { stringId = SingleSessionVehicleStatusNames[EnumValue(vehicle->status)]; } @@ -2571,7 +2559,7 @@ namespace OpenRCT2::Ui::Windows return GetStatusStation(ft); } - void MainOnDraw(RenderTarget& rt) + void MainOnDraw(Drawing::RenderTarget& rt) { WindowDrawWidgets(*this, rt); drawTabImages(rt); @@ -2618,8 +2606,8 @@ namespace OpenRCT2::Ui::Windows widget = &widgets[WIDX_STATUS]; StringId rideStatus = GetStatus(ft); DrawTextEllipsised( - rt, windowPos + ScreenCoordsXY{ (widget->left + widget->right) / 2, widget->top }, widget->width(), rideStatus, - ft, { TextAlignment::centre }); + rt, windowPos + ScreenCoordsXY{ (widget->left + widget->right) / 2, widget->top }, widget->width() - 1, + rideStatus, ft, { TextAlignment::centre }); } #pragma endregion @@ -2860,7 +2848,7 @@ namespace OpenRCT2::Ui::Windows } } - void VehicleOnDraw(RenderTarget& rt) + void VehicleOnDraw(Drawing::RenderTarget& rt) { WindowDrawWidgets(*this, rt); drawTabImages(rt); @@ -2947,7 +2935,7 @@ namespace OpenRCT2::Ui::Windows ImageId imageId; }; - void VehicleOnScrollDraw(RenderTarget& rt, int32_t scrollIndex) + void VehicleOnScrollDraw(Drawing::RenderTarget& rt, int32_t scrollIndex) { auto ride = GetRide(rideId); if (ride == nullptr) @@ -2959,8 +2947,8 @@ namespace OpenRCT2::Ui::Windows Rectangle::fill(rt, { { rt.x, rt.y }, { rt.x + rt.width, rt.y + rt.height } }, PaletteIndex::pi12); Widget* widget = &widgets[WIDX_VEHICLE_TRAINS_PREVIEW]; - int32_t startX = std::max(2, (widget->width() - ((ride->numTrains - 1) * 36)) / 2 - 25); - int32_t startY = widget->height() - 4; + int32_t startX = std::max(2, (widget->width() - 1 - ((ride->numTrains - 1) * 36)) / 2 - 25); + int32_t startY = widget->height() - 5; bool isReversed = ride->hasLifecycleFlag(RIDE_LIFECYCLE_REVERSED_TRAINS); int32_t carIndex = (isReversed) ? ride->numCarsPerTrain - 1 : 0; @@ -3120,8 +3108,8 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, numAvailableModes, widget->right - dropdownWidget->left); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, Dropdown::Flag::StayOpen, numAvailableModes, widget->right - dropdownWidget->left); if (checkedIndex != -1) { @@ -3141,8 +3129,8 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[i] = Dropdown::MenuLabel(VehicleLoadNames[i]); } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, 5, widget->right - dropdownWidget->left); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, Dropdown::Flag::StayOpen, 5, widget->right - dropdownWidget->left); gDropdown.items[ride->departFlags & RIDE_DEPART_WAIT_FOR_LOAD_MASK].setChecked(true); } @@ -3400,9 +3388,9 @@ namespace OpenRCT2::Ui::Windows invalidateWidget(WIDX_TAB_3); auto ride = GetRide(rideId); - if (ride != nullptr && ride->windowInvalidateFlags & RIDE_INVALIDATE_RIDE_OPERATING) + if (ride != nullptr && ride->windowInvalidateFlags.has(RideInvalidateFlag::operatingSettings)) { - ride->windowInvalidateFlags &= ~RIDE_INVALIDATE_RIDE_OPERATING; + ride->windowInvalidateFlags.unset(RideInvalidateFlag::operatingSettings); invalidate(); } } @@ -3683,7 +3671,7 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_10); } - void OperatingOnDraw(RenderTarget& rt) + void OperatingOnDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); drawTabImages(rt); @@ -3795,10 +3783,10 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[i] = Dropdown::MenuLabel(kRideInspectionIntervalNames[i]); } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], 0, Dropdown::Flag::StayOpen, 7, widgets[widgetIndex].right - dropdownWidget->left); - gDropdown.items[ride->inspectionInterval].setChecked(true); + gDropdown.items[EnumValue(ride->inspectionInterval)].setChecked(true); break; case WIDX_FORCE_BREAKDOWN: @@ -3830,8 +3818,8 @@ namespace OpenRCT2::Ui::Windows else { WindowDropdownShowText( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, - dropdownWidget->height() + 1, colours[1], Dropdown::Flag::StayOpen, numItems); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), + colours[1], Dropdown::Flag::StayOpen, numItems); numItems = 1; int32_t breakdownReason = ride->breakdownReasonPending; @@ -3902,7 +3890,7 @@ namespace OpenRCT2::Ui::Windows vehicle = getGameState().entities.GetEntity(vehicle->next_vehicle_on_train)) { vehicle->ClearFlag( - VehicleFlags::CarIsBroken | VehicleFlags::StoppedOnLift + VehicleFlags::CarIsBroken | VehicleFlags::StoppedBySafetyCutOut | VehicleFlags::TrainIsBroken); } } @@ -3979,9 +3967,9 @@ namespace OpenRCT2::Ui::Windows invalidateWidget(WIDX_TAB_4); auto ride = GetRide(rideId); - if (ride != nullptr && ride->windowInvalidateFlags & RIDE_INVALIDATE_RIDE_MAINTENANCE) + if (ride != nullptr && ride->windowInvalidateFlags.has(RideInvalidateFlag::maintenance)) { - ride->windowInvalidateFlags &= ~RIDE_INVALIDATE_RIDE_MAINTENANCE; + ride->windowInvalidateFlags.unset(RideInvalidateFlag::maintenance); invalidate(); } } @@ -3997,7 +3985,7 @@ namespace OpenRCT2::Ui::Windows auto ft = Formatter::Common(); ride->formatNameTo(ft); - widgets[WIDX_INSPECTION_INTERVAL].text = kRideInspectionIntervalNames[ride->inspectionInterval]; + widgets[WIDX_INSPECTION_INTERVAL].text = kRideInspectionIntervalNames[EnumValue(ride->inspectionInterval)]; WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_10); @@ -4023,7 +4011,7 @@ namespace OpenRCT2::Ui::Windows } } - void MaintenanceOnDraw(RenderTarget& rt) + void MaintenanceOnDraw(Drawing::RenderTarget& rt) { auto ride = GetRide(rideId); if (ride == nullptr) @@ -4092,7 +4080,7 @@ namespace OpenRCT2::Ui::Windows { switch (ride->mechanicStatus) { - case RIDE_MECHANIC_STATUS_CALLING: + case MechanicStatus::calling: { stringId = STR_NO_MECHANICS_ARE_HIRED_MESSAGE; @@ -4106,11 +4094,11 @@ namespace OpenRCT2::Ui::Windows } break; } - case RIDE_MECHANIC_STATUS_HEADING: + case MechanicStatus::heading: stringId = STR_MECHANIC_IS_HEADING_FOR_THE_RIDE; break; - case RIDE_MECHANIC_STATUS_FIXING: - case RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES: + case MechanicStatus::fixing: + case MechanicStatus::hasFixedStationBrakes: stringId = STR_MECHANIC_IS_FIXING_THE_RIDE; break; default: @@ -4187,8 +4175,7 @@ namespace OpenRCT2::Ui::Windows auto z = info.Element->GetBaseZ(); auto direction = info.Element->GetDirection(); auto gameAction = GameActions::RideSetColourSchemeAction( - CoordsXYZD{ info.Loc, z, static_cast(direction) }, info.Element->AsTrack()->GetTrackType(), - newColourScheme); + CoordsXYZD{ info.Loc, z, direction }, info.Element->AsTrack()->GetTrackType(), newColourScheme); GameActions::Execute(&gameAction, getGameState()); } @@ -4328,7 +4315,7 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], 0, Dropdown::Flag::StayOpen, 4, widgets[widgetIndex].right - dropdownWidget->left); gDropdown.items[colourSchemeIndex].setChecked(true); @@ -4354,7 +4341,7 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], 0, Dropdown::Flag::StayOpen, 4, widgets[widgetIndex].right - dropdownWidget->left); gDropdown.items[ride->trackColours[colourSchemeIndex].supports].setChecked(true); @@ -4381,7 +4368,7 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], 0, Dropdown::Flag::StayOpen, numDropdownItems, widgets[widgetIndex].right - dropdownWidget->left); @@ -4420,7 +4407,7 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], 0, Dropdown::Flag::StayOpen, dropdownIndex, widgets[widgetIndex].right - dropdownWidget->left); @@ -4496,7 +4483,7 @@ namespace OpenRCT2::Ui::Windows rideId, GameActions::RideSetAppearanceType::EntranceStyle, objIndex, 0); rideSetAppearanceAction.SetCallback( [objIndex](const GameActions::GameAction*, const GameActions::Result* res) { - if (res->Error != GameActions::Status::Ok) + if (res->error != GameActions::Status::ok) return; getGameState().lastEntranceStyle = objIndex; }); @@ -4509,7 +4496,7 @@ namespace OpenRCT2::Ui::Windows rideId, GameActions::RideSetAppearanceType::VehicleColourScheme, dropdownIndex, 0); rideSetAppearanceAction.SetCallback( [this](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { resetVehicleIndex(); } @@ -4812,10 +4799,10 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_10); } - void ColourOnDraw(RenderTarget& rt) + void ColourOnDraw(Drawing::RenderTarget& rt) { // TODO: This should use lists and identified sprites - RenderTarget clippedDpi; + RenderTarget clippedRT; auto ride = GetRide(rideId); if (ride == nullptr) @@ -4889,12 +4876,12 @@ namespace OpenRCT2::Ui::Windows const auto& entrancePreviewWidget = widgets[WIDX_ENTRANCE_PREVIEW]; if (entrancePreviewWidget.type != WidgetType::empty) { - if (ClipDrawPixelInfo( - clippedDpi, rt, + if (ClipRenderTarget( + clippedRT, rt, windowPos + ScreenCoordsXY{ entrancePreviewWidget.left + 1, entrancePreviewWidget.top + 1 }, - entrancePreviewWidget.width(), entrancePreviewWidget.height())) + entrancePreviewWidget.width() - 1, entrancePreviewWidget.height() - 1)) { - GfxClear(clippedDpi, PaletteIndex::pi12); + GfxClear(clippedRT, PaletteIndex::pi12); auto stationObj = ride->getStationObject(); if (stationObj != nullptr && stationObj->BaseImageId != kImageIndexUndefined) @@ -4902,16 +4889,16 @@ namespace OpenRCT2::Ui::Windows auto imageId = ImageId(stationObj->BaseImageId, trackColour.main, trackColour.additional); // Back - GfxDrawSprite(clippedDpi, imageId, { 34, 20 }); + GfxDrawSprite(clippedRT, imageId, { 34, 20 }); // Front - GfxDrawSprite(clippedDpi, imageId.WithIndexOffset(4), { 34, 20 }); + GfxDrawSprite(clippedRT, imageId.WithIndexOffset(4), { 34, 20 }); // Glass if (stationObj->Flags & StationObjectFlags::isTransparent) { auto glassImageId = ImageId(stationObj->BaseImageId + 20).WithTransparency(trackColour.main); - GfxDrawSprite(clippedDpi, glassImageId, { 34, 20 }); + GfxDrawSprite(clippedRT, glassImageId, { 34, 20 }); } } } @@ -4921,7 +4908,7 @@ namespace OpenRCT2::Ui::Windows } } - void ColourOnScrollDraw(RenderTarget& rt, int32_t scrollIndex) const + void ColourOnScrollDraw(Drawing::RenderTarget& rt, int32_t scrollIndex) const { auto ride = GetRide(rideId); if (ride == nullptr) @@ -4938,7 +4925,7 @@ namespace OpenRCT2::Ui::Windows Rectangle::fill(rt, { { rt.x, rt.y }, { rt.x + rt.width - 1, rt.y + rt.height - 1 } }, PaletteIndex::pi12); // ? - auto screenCoords = ScreenCoordsXY{ vehiclePreviewWidget->width() / 2, vehiclePreviewWidget->height() - 15 }; + auto screenCoords = ScreenCoordsXY{ vehiclePreviewWidget->width() / 2, vehiclePreviewWidget->height() - 16 }; // ? auto trainCarIndex = ride->vehicleColourSettings == VehicleColourSettings::perCar ? _vehicleIndex @@ -4971,7 +4958,7 @@ namespace OpenRCT2::Ui::Windows { int32_t activateMusic = (ride->lifecycleFlags & RIDE_LIFECYCLE_MUSIC) ? 0 : 1; SetOperatingSetting(rideId, GameActions::RideSetSetting::Music, activateMusic); - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MUSIC; + ride->windowInvalidateFlags.set(RideInvalidateFlag::music); } } @@ -5090,8 +5077,8 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, numItems, widgets[widgetIndex].right - dropdownWidget->left); + { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height(), colours[1], + 0, Dropdown::Flag::StayOpen, numItems, widgets[widgetIndex].right - dropdownWidget->left); // Set currently checked item for (size_t i = 0; i < numItems; i++) @@ -5119,9 +5106,9 @@ namespace OpenRCT2::Ui::Windows onPrepareDraw(); invalidateWidget(WIDX_TAB_6); - if (auto ride = GetRide(rideId); ride != nullptr && ride->windowInvalidateFlags & RIDE_INVALIDATE_RIDE_MUSIC) + if (auto ride = GetRide(rideId); ride != nullptr && ride->windowInvalidateFlags.has(RideInvalidateFlag::music)) { - ride->windowInvalidateFlags &= ~RIDE_INVALIDATE_RIDE_MUSIC; + ride->windowInvalidateFlags.unset(RideInvalidateFlag::music); invalidate(); onResize(); onPrepareDraw(); @@ -5138,8 +5125,8 @@ namespace OpenRCT2::Ui::Windows // Figure out minimum size ScreenSize size{}; - size.height = widgets[WIDX_MUSIC_DATA].height() - 2; - size.width = widgets[WIDX_MUSIC_DATA].width() - 2; + size.height = widgets[WIDX_MUSIC_DATA].height() - 3; + size.width = widgets[WIDX_MUSIC_DATA].width() - 3; auto ride = GetRide(rideId); if (ride == nullptr) @@ -5228,7 +5215,7 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_10); } - void MusicOnDraw(RenderTarget& rt) + void MusicOnDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); drawTabImages(rt); @@ -5253,19 +5240,19 @@ namespace OpenRCT2::Ui::Windows // Figure out where the image should go const auto& previewWidget = widgets[WIDX_MUSIC_IMAGE]; - int32_t clipWidth = previewWidget.width() - 1; - int32_t clipHeight = previewWidget.height() - 1; + int32_t clipWidth = previewWidget.width() - 2; + int32_t clipHeight = previewWidget.height() - 2; // Draw the preview image - RenderTarget clipDPI; + RenderTarget clipRT; auto screenPos = windowPos + ScreenCoordsXY{ previewWidget.left + 1, previewWidget.top + 1 }; - if (ClipDrawPixelInfo(clipDPI, rt, screenPos, clipWidth, clipHeight)) + if (ClipRenderTarget(clipRT, rt, screenPos, clipWidth, clipHeight)) { - musicObj->DrawPreview(clipDPI, clipWidth, clipHeight); + musicObj->DrawPreview(clipRT, clipWidth, clipHeight); } } - void MusicOnScrollDraw(RenderTarget& rt, int32_t scrollIndex) + void MusicOnScrollDraw(Drawing::RenderTarget& rt, int32_t scrollIndex) { auto ride = GetRide(rideId); if (ride == nullptr) @@ -5276,7 +5263,7 @@ namespace OpenRCT2::Ui::Windows if (!isMusicActivated) return; - uint8_t paletteIndex = ColourMapA[colours[1].colour].mid_light; + auto paletteIndex = ColourMapA[colours[1].colour].mid_light; GfxClear(rt, paletteIndex); auto* musicObj = ride->getMusicObject(); @@ -5472,7 +5459,7 @@ namespace OpenRCT2::Ui::Windows WindowDropdownShowText( { windowPos.x + widgets[widgetIndex].left, windowPos.y + widgets[widgetIndex].top }, - widgets[widgetIndex].height() + 1, colours[1], Dropdown::Flag::StayOpen, 2); + widgets[widgetIndex].height(), colours[1], Dropdown::Flag::StayOpen, 2); gDropdown.defaultIndex = 0; if (!ride->getRideTypeDescriptor().HasFlag(RtdFlag::hasTrack)) { @@ -5505,10 +5492,10 @@ namespace OpenRCT2::Ui::Windows invalidateWidget(WIDX_TAB_7); Ride* const ride = GetRide(rideId); - if (ride && ride->windowInvalidateFlags & RIDE_INVALIDATE_RIDE_RATINGS) + if (ride && ride->windowInvalidateFlags.has(RideInvalidateFlag::ratings)) { invalidate(); - ride->windowInvalidateFlags &= ~RIDE_INVALIDATE_RIDE_RATINGS; + ride->windowInvalidateFlags.unset(RideInvalidateFlag::ratings); } } @@ -5607,7 +5594,7 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_10); } - void MeasurementsOnDraw(RenderTarget& rt) + void MeasurementsOnDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); drawTabImages(rt); @@ -5616,7 +5603,7 @@ namespace OpenRCT2::Ui::Windows { Widget* widget = &widgets[WIDX_PAGE_BACKGROUND]; - ScreenCoordsXY widgetCoords(windowPos.x + widget->width() / 2, windowPos.y + widget->top + 40); + ScreenCoordsXY widgetCoords(windowPos.x + widget->midX(), windowPos.y + widget->top + 40); DrawTextWrapped( rt, widgetCoords, width - 8, STR_CLICK_ITEMS_OF_SCENERY_TO_SELECT, {}, { TextAlignment::centre }); @@ -5939,11 +5926,11 @@ namespace OpenRCT2::Ui::Windows { RideMeasurement* measurement{}; std::tie(measurement, std::ignore) = ride->getMeasurement(); - x = measurement == nullptr ? 0 : measurement->current_item - ((widget->width() / 4) * 3); + x = measurement == nullptr ? 0 : measurement->current_item - (((widget->width() - 1) / 4) * 3); } } - scrolls[0].contentOffsetX = std::clamp(x, 0, scrolls[0].contentWidth - (widget->width() - 2)); + scrolls[0].contentOffsetX = std::clamp(x, 0, scrolls[0].contentWidth - (widget->width() - 3)); widgetScrollUpdateThumbs(*this, WIDX_GRAPH); } @@ -5953,7 +5940,7 @@ namespace OpenRCT2::Ui::Windows ScreenSize size{}; // Set minimum size - size.width = widgets[WIDX_GRAPH].width() - 2; + size.width = widgets[WIDX_GRAPH].width() - 3; // Get measurement size auto ride = GetRide(rideId); @@ -5982,7 +5969,7 @@ namespace OpenRCT2::Ui::Windows if (ride != nullptr) { auto [measurement, message] = ride->getMeasurement(); - if (measurement != nullptr && (measurement->flags & RIDE_MEASUREMENT_FLAG_RUNNING)) + if (measurement != nullptr && measurement->flags.has(RideMeasurementFlag::running)) { auto ft = Formatter(); ft.Increment(2); @@ -6051,13 +6038,13 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_10); } - void GraphsOnDraw(RenderTarget& rt) + void GraphsOnDraw(Drawing::RenderTarget& rt) { drawWidgets(rt); drawTabImages(rt); } - void GraphsOnScrollDraw(RenderTarget& rt, int32_t scrollIndex) + void GraphsOnScrollDraw(Drawing::RenderTarget& rt, int32_t scrollIndex) { GfxClear(rt, ColourMapA[COLOUR_SATURATED_GREEN].darker); @@ -6073,15 +6060,15 @@ namespace OpenRCT2::Ui::Windows if (measurement == nullptr) { // No measurement message - ScreenCoordsXY stringCoords(widget->width() / 2, widget->height() / 2 - 5); - int32_t txtWidth = widget->width() - 2; + ScreenCoordsXY stringCoords(widget->width() / 2, widget->height() - 1 / 2 - 5); + int32_t txtWidth = widget->width() - 3; DrawTextWrapped(rt, stringCoords, txtWidth, message.str, message.args, { TextAlignment::centre }); return; } // Vertical grid lines - const uint8_t lightColour = ColourMapA[COLOUR_SATURATED_GREEN].mid_light; - const uint8_t darkColour = ColourMapA[COLOUR_SATURATED_GREEN].mid_dark; + const auto lightColour = ColourMapA[COLOUR_SATURATED_GREEN].mid_light; + const auto darkColour = ColourMapA[COLOUR_SATURATED_GREEN].mid_dark; int32_t time = 0; for (int32_t x = 0; x < rt.x + rt.width; x += 80) @@ -6112,10 +6099,10 @@ namespace OpenRCT2::Ui::Windows yUnit -= kMapBaseZ * 3; } - for (int32_t y = widget->height() - 13; y >= 8; y -= yInterval, yUnit += yUnitInterval) + for (int32_t y = widget->height() - 14; y >= 8; y -= yInterval, yUnit += yUnitInterval) { // Minor / major line - int32_t colour = yUnit == 0 ? lightColour : darkColour; + auto colour = yUnit == 0 ? lightColour : darkColour; Rectangle::fill(rt, { { rt.x, y }, { rt.x + rt.width - 1, y } }, colour); int16_t scaled_yUnit = yUnit; @@ -6183,8 +6170,8 @@ namespace OpenRCT2::Ui::Windows } // Adjust line to match graph widget position. - firstPoint = widget->height() - firstPoint - 13; - secondPoint = widget->height() - secondPoint - 13; + firstPoint = widget->height() - firstPoint - 14; + secondPoint = widget->height() - secondPoint - 14; if (firstPoint > secondPoint) { std::swap(firstPoint, secondPoint); @@ -6193,8 +6180,8 @@ namespace OpenRCT2::Ui::Windows // Adjust threshold line position as well if (listType == GRAPH_VERTICAL || listType == GRAPH_LATERAL) { - intensityThresholdPositive = widget->height() - intensityThresholdPositive - 13; - intensityThresholdNegative = widget->height() - intensityThresholdNegative - 13; + intensityThresholdPositive = widget->height() - intensityThresholdPositive - 14; + intensityThresholdNegative = widget->height() - intensityThresholdNegative - 14; } const bool previousMeasurement = x > measurement->current_item; @@ -6479,9 +6466,9 @@ namespace OpenRCT2::Ui::Windows invalidateWidget(WIDX_TAB_9); auto ride = GetRide(rideId); - if (ride != nullptr && ride->windowInvalidateFlags & RIDE_INVALIDATE_RIDE_INCOME) + if (ride != nullptr && ride->windowInvalidateFlags.has(RideInvalidateFlag::income)) { - ride->windowInvalidateFlags &= ~RIDE_INVALIDATE_RIDE_INCOME; + ride->windowInvalidateFlags.unset(RideInvalidateFlag::income); invalidate(); } } @@ -6612,7 +6599,7 @@ namespace OpenRCT2::Ui::Windows WindowAlignTabs(this, WIDX_TAB_1, WIDX_TAB_10); } - void IncomeOnDraw(RenderTarget& rt) + void IncomeOnDraw(Drawing::RenderTarget& rt) { StringId stringId; money64 profit; @@ -6778,9 +6765,9 @@ namespace OpenRCT2::Ui::Windows invalidateWidget(WIDX_TAB_10); auto ride = GetRide(rideId); - if (ride != nullptr && ride->windowInvalidateFlags & RIDE_INVALIDATE_RIDE_CUSTOMER) + if (ride != nullptr && ride->windowInvalidateFlags.has(RideInvalidateFlag::customers)) { - ride->windowInvalidateFlags &= ~RIDE_INVALIDATE_RIDE_CUSTOMER; + ride->windowInvalidateFlags.unset(RideInvalidateFlag::customers); invalidate(); } } @@ -6811,7 +6798,7 @@ namespace OpenRCT2::Ui::Windows } } - void CustomerOnDraw(RenderTarget& rt) + void CustomerOnDraw(Drawing::RenderTarget& rt) { ShopItem shopItem; int16_t popularity, satisfaction, queueTime; @@ -7094,7 +7081,7 @@ WindowBase* RideMainOpen(const Ride& ride) auto trackElement = tileElement->AsTrack(); auto trackType = trackElement->GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN) + if (ted.sequences[0].flags.has(SequenceFlag::trackOrigin)) { auto stationIndex = trackElement->GetStationIndex(); return WindowRideOpenStation(*ride, stationIndex); diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 7fde5bdf83f1..5361fd558c48 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -65,6 +67,9 @@ constexpr uint8_t kVerticalDropButtonStart = 6; using namespace OpenRCT2::Numerics; using namespace OpenRCT2::TrackMetaData; +using OpenRCT2::GameActions::CommandFlag; +using OpenRCT2::GameActions::CommandFlags; +using OpenRCT2::GameActions::MazeBuildMode; namespace OpenRCT2::Ui::Windows { @@ -259,16 +264,16 @@ namespace OpenRCT2::Ui::Windows _currentSeatRotationAngle = 4; _currentlySelectedTrack = currentRide->getRideTypeDescriptor().StartTrackPiece; - _currentTrackPitchEnd = TrackPitch::None; - _currentTrackRollEnd = TrackRoll::None; + _currentTrackPitchEnd = TrackPitch::none; + _currentTrackRollEnd = TrackRoll::none; _currentTrackHasLiftHill = false; _currentTrackAlternative.clearAll(); if (currentRide->getRideTypeDescriptor().HasFlag(RtdFlag::startConstructionInverted)) _currentTrackAlternative.set(AlternativeTrackFlag::inverted); - _previousTrackRollEnd = TrackRoll::None; - _previousTrackPitchEnd = TrackPitch::None; + _previousTrackRollEnd = TrackRoll::none; + _previousTrackPitchEnd = TrackPitch::none; _currentTrackPieceDirection = 0; _rideConstructionState = RideConstructionState::Place; @@ -286,7 +291,6 @@ namespace OpenRCT2::Ui::Windows RideConstructionInvalidateCurrentTrack(); ViewportSetVisibility(ViewportVisibility::standard); - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); gMapSelectFlags.unset(MapSelectFlag::enableArrow); @@ -324,7 +328,6 @@ namespace OpenRCT2::Ui::Windows } } - currentRide->setToDefaultInspectionInterval(); auto intent = Intent(WindowClass::ride); intent.PutExtra(INTENT_EXTRA_RIDE_ID, currentRide->id.ToUnderlying()); ContextOpenIntent(&intent); @@ -332,7 +335,7 @@ namespace OpenRCT2::Ui::Windows else { auto gameAction = GameActions::RideDemolishAction(currentRide->id, GameActions::RideModifyType::demolish); - gameAction.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + gameAction.SetFlags({ CommandFlag::allowDuringPaused }); GameActions::Execute(&gameAction, gameState); } } @@ -365,11 +368,11 @@ namespace OpenRCT2::Ui::Windows } // Disable large curves if the start or end of the track is sloped and large sloped curves are not available - if ((_previousTrackPitchEnd != TrackPitch::None || _currentTrackPitchEnd != TrackPitch::None)) + if ((_previousTrackPitchEnd != TrackPitch::none || _currentTrackPitchEnd != TrackPitch::none)) { if (!IsTrackEnabled(TrackGroup::slopeCurveLarge) - || !(_previousTrackPitchEnd == TrackPitch::Up25 || _previousTrackPitchEnd == TrackPitch::Down25) - || !(_currentTrackPitchEnd == TrackPitch::Up25 || _currentTrackPitchEnd == TrackPitch::Down25)) + || !(_previousTrackPitchEnd == TrackPitch::up25 || _previousTrackPitchEnd == TrackPitch::down25) + || !(_currentTrackPitchEnd == TrackPitch::up25 || _currentTrackPitchEnd == TrackPitch::down25)) { newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_LARGE) | (1uLL << WIDX_RIGHT_CURVE_LARGE); } @@ -377,7 +380,7 @@ namespace OpenRCT2::Ui::Windows if (IsTrackEnabled(TrackGroup::slopeCurve) && IsTrackEnabled(TrackGroup::curveVerySmall)) { // Disable small curves if the start or end of the track is sloped. - if (_previousTrackPitchEnd != TrackPitch::None || _currentTrackPitchEnd != TrackPitch::None) + if (_previousTrackPitchEnd != TrackPitch::none || _currentTrackPitchEnd != TrackPitch::none) { newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_VERY_SMALL) | (1uLL << WIDX_RIGHT_CURVE_VERY_SMALL); } @@ -387,9 +390,9 @@ namespace OpenRCT2::Ui::Windows if (IsTrackEnabled(TrackGroup::curveVertical)) { // Disable all curves only on vertical track - if (_previousTrackPitchEnd != TrackPitch::Up90 || _currentTrackPitchEnd != TrackPitch::Up90) + if (_previousTrackPitchEnd != TrackPitch::up90 || _currentTrackPitchEnd != TrackPitch::up90) { - if (_previousTrackPitchEnd != TrackPitch::Down90 || _currentTrackPitchEnd != TrackPitch::Down90) + if (_previousTrackPitchEnd != TrackPitch::down90 || _currentTrackPitchEnd != TrackPitch::down90) { newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_VERY_SMALL) | (1uLL << WIDX_LEFT_CURVE_SMALL) | (1uLL << WIDX_LEFT_CURVE) | (1uLL << WIDX_RIGHT_CURVE) | (1uLL << WIDX_RIGHT_CURVE_SMALL) @@ -400,7 +403,7 @@ namespace OpenRCT2::Ui::Windows else { // Disable all curves on sloped track - if (_previousTrackPitchEnd != TrackPitch::None || _currentTrackPitchEnd != TrackPitch::None) + if (_previousTrackPitchEnd != TrackPitch::none || _currentTrackPitchEnd != TrackPitch::none) { newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_VERY_SMALL) | (1uLL << WIDX_LEFT_CURVE_SMALL) | (1uLL << WIDX_LEFT_CURVE) | (1uLL << WIDX_RIGHT_CURVE) | (1uLL << WIDX_RIGHT_CURVE_SMALL) @@ -415,8 +418,8 @@ namespace OpenRCT2::Ui::Windows | (1uLL << WIDX_BANK_RIGHT); } // Disable banking if the start track is steep and the end of the track becomes flat. - if ((_previousTrackPitchEnd == TrackPitch::Down60 || _previousTrackPitchEnd == TrackPitch::Up60) - && _currentTrackPitchEnd == TrackPitch::None) + if ((_previousTrackPitchEnd == TrackPitch::down60 || _previousTrackPitchEnd == TrackPitch::up60) + && _currentTrackPitchEnd == TrackPitch::none) { newDisabledWidgets |= (1uLL << WIDX_BANK_LEFT) | (1uLL << WIDX_BANK_RIGHT); } @@ -435,11 +438,11 @@ namespace OpenRCT2::Ui::Windows // diagonals if (!IsTrackEnabled(TrackGroup::slopeCurveLarge) && TrackPieceDirectionIsDiagonal(_currentTrackPieceDirection)) { - if (_currentTrackPitchEnd != TrackPitch::None) + if (_currentTrackPitchEnd != TrackPitch::none) { newDisabledWidgets |= (1uLL << WIDX_BANK_LEFT) | (1uLL << WIDX_BANK_RIGHT); } - else if (_currentTrackRollEnd != TrackRoll::None) + else if (_currentTrackRollEnd != TrackRoll::none) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN) | (1uLL << WIDX_SLOPE_UP); } @@ -448,11 +451,11 @@ namespace OpenRCT2::Ui::Windows && !getGameState().cheats.enableAllDrawableTrackPieces) { // Disable lift hill toggle and banking if current track piece is uphill - if (_previousTrackPitchEnd == TrackPitch::Up25 || _previousTrackPitchEnd == TrackPitch::Up60 - || _currentTrackPitchEnd == TrackPitch::Up25 || _currentTrackPitchEnd == TrackPitch::Up60) + if (_previousTrackPitchEnd == TrackPitch::up25 || _previousTrackPitchEnd == TrackPitch::up60 + || _currentTrackPitchEnd == TrackPitch::up25 || _currentTrackPitchEnd == TrackPitch::up60) newDisabledWidgets |= 1uLL << WIDX_CHAIN_LIFT | (1uLL << WIDX_BANK_LEFT) | (1uLL << WIDX_BANK_RIGHT); // Disable upward slope if current track piece is not flat - if ((_previousTrackPitchEnd != TrackPitch::None || _previousTrackRollEnd != TrackRoll::None) + if ((_previousTrackPitchEnd != TrackPitch::none || _previousTrackRollEnd != TrackRoll::none) && !(_currentTrackHasLiftHill)) newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP); } @@ -465,12 +468,12 @@ namespace OpenRCT2::Ui::Windows { switch (_currentlySelectedTrack.curve) { - case TrackCurve::LeftVerySmall: - case TrackCurve::LeftSmall: - case TrackCurve::Left: - case TrackCurve::LeftLarge: + case TrackCurve::leftVerySmall: + case TrackCurve::leftSmall: + case TrackCurve::left: + case TrackCurve::leftLarge: newDisabledWidgets |= (1uLL << WIDX_BANK_RIGHT); - if (_previousTrackRollEnd == TrackRoll::None) + if (_previousTrackRollEnd == TrackRoll::none) { newDisabledWidgets |= (1uLL << WIDX_BANK_LEFT); } @@ -479,12 +482,12 @@ namespace OpenRCT2::Ui::Windows newDisabledWidgets |= (1uLL << WIDX_BANK_STRAIGHT); } break; - case TrackCurve::RightLarge: - case TrackCurve::Right: - case TrackCurve::RightSmall: - case TrackCurve::RightVerySmall: + case TrackCurve::rightLarge: + case TrackCurve::right: + case TrackCurve::rightSmall: + case TrackCurve::rightVerySmall: newDisabledWidgets |= (1uLL << WIDX_BANK_LEFT); - if (_previousTrackRollEnd == TrackRoll::None) + if (_previousTrackRollEnd == TrackRoll::none) { newDisabledWidgets |= (1uLL << WIDX_BANK_RIGHT); } @@ -499,7 +502,7 @@ namespace OpenRCT2::Ui::Windows } if (!IsTrackEnabled(TrackGroup::slopeRollBanking)) { - if (_currentTrackRollEnd != TrackRoll::None) + if (_currentTrackRollEnd != TrackRoll::none) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN) | (1uLL << WIDX_SLOPE_UP); } @@ -508,8 +511,8 @@ namespace OpenRCT2::Ui::Windows { switch (_currentTrackPitchEnd) { - case TrackPitch::Up60: - case TrackPitch::Down60: + case TrackPitch::up60: + case TrackPitch::down60: newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_VERY_SMALL) | (1uLL << WIDX_LEFT_CURVE) | (1uLL << WIDX_RIGHT_CURVE) | (1uLL << WIDX_RIGHT_CURVE_VERY_SMALL); if (!IsTrackEnabled(TrackGroup::slopeCurveSteep)) @@ -517,8 +520,8 @@ namespace OpenRCT2::Ui::Windows newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_SMALL) | (1uLL << WIDX_RIGHT_CURVE_SMALL); } break; - case TrackPitch::Up90: - case TrackPitch::Down90: + case TrackPitch::up90: + case TrackPitch::down90: newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_VERY_SMALL) | (1uLL << WIDX_LEFT_CURVE) | (1uLL << WIDX_RIGHT_CURVE) | (1uLL << WIDX_RIGHT_CURVE_VERY_SMALL); if (!IsTrackEnabled(TrackGroup::curveVertical)) @@ -542,48 +545,48 @@ namespace OpenRCT2::Ui::Windows { switch (_previousTrackPitchEnd) { - case TrackPitch::None: + case TrackPitch::none: if (!IsTrackEnabled(TrackGroup::diagSlope)) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP) | (1uLL << WIDX_SLOPE_DOWN); } - if (_currentlySelectedTrack != TrackCurve::None + if (_currentlySelectedTrack != TrackCurve::none || (!IsTrackEnabled(TrackGroup::flatToSteepSlope) && !IsTrackEnabled(TrackGroup::diagSlopeSteepLong))) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_SLOPE_UP_STEEP); } break; - case TrackPitch::Down25: + case TrackPitch::down25: newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP) | (1uLL << WIDX_SLOPE_UP_STEEP); if (!IsTrackEnabled(TrackGroup::diagSlopeSteepDown)) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP); } break; - case TrackPitch::Down60: + case TrackPitch::down60: newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP) | (1uLL << WIDX_SLOPE_UP_STEEP); if (!IsTrackEnabled(TrackGroup::flatToSteepSlope) && !IsTrackEnabled(TrackGroup::diagSlopeSteepLong)) { newDisabledWidgets |= (1uLL << WIDX_LEVEL); } break; - case TrackPitch::Up25: + case TrackPitch::up25: newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_SLOPE_DOWN); if (!IsTrackEnabled(TrackGroup::diagSlopeSteepUp)) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP_STEEP); } break; - case TrackPitch::Up60: + case TrackPitch::up60: newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_SLOPE_DOWN); if (!IsTrackEnabled(TrackGroup::flatToSteepSlope) && !IsTrackEnabled(TrackGroup::diagSlopeSteepLong)) { newDisabledWidgets |= (1uLL << WIDX_LEVEL); } break; - case TrackPitch::Down90: - case TrackPitch::Up90: + case TrackPitch::down90: + case TrackPitch::up90: newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN) | (1uLL << WIDX_LEVEL) | (1uLL << WIDX_SLOPE_UP); break; } @@ -592,61 +595,61 @@ namespace OpenRCT2::Ui::Windows { switch (_previousTrackPitchEnd) { - case TrackPitch::None: - if (_currentlySelectedTrack != TrackCurve::None + case TrackPitch::none: + if (_currentlySelectedTrack != TrackCurve::none || (!IsTrackEnabled(TrackGroup::flatToSteepSlope) && !IsTrackEnabled(TrackGroup::slopeSteepLong))) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_SLOPE_UP_STEEP); } break; - case TrackPitch::Down25: + case TrackPitch::down25: newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP) | (1uLL << WIDX_SLOPE_UP_STEEP); if (!IsTrackEnabled(TrackGroup::slopeSteepDown)) { newDisabledWidgets |= 1uLL << WIDX_SLOPE_DOWN_STEEP; } break; - case TrackPitch::Down60: + case TrackPitch::down60: newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP) | (1uLL << WIDX_SLOPE_UP_STEEP); if (!IsTrackEnabled(TrackGroup::flatToSteepSlope) && !IsTrackEnabled(TrackGroup::slopeSteepLong)) { newDisabledWidgets |= (1uLL << WIDX_LEVEL); } break; - case TrackPitch::Up25: + case TrackPitch::up25: newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_SLOPE_DOWN); if (!IsTrackEnabled(TrackGroup::slopeSteepUp)) { newDisabledWidgets |= 1uLL << WIDX_SLOPE_UP_STEEP; } break; - case TrackPitch::Up60: + case TrackPitch::up60: newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_SLOPE_DOWN); if (!IsTrackEnabled(TrackGroup::flatToSteepSlope) && !IsTrackEnabled(TrackGroup::slopeSteepLong)) { newDisabledWidgets |= (1uLL << WIDX_LEVEL); } break; - case TrackPitch::Down90: + case TrackPitch::down90: newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN) | (1uLL << WIDX_LEVEL) | (1uLL << WIDX_SLOPE_UP) | (1uLL << WIDX_SLOPE_UP_STEEP); break; - case TrackPitch::Up90: + case TrackPitch::up90: newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_SLOPE_DOWN) | (1uLL << WIDX_LEVEL) | (1uLL << WIDX_SLOPE_UP); break; } if (IsTrackEnabled(TrackGroup::slopeVertical)) { - if (_previousTrackPitchEnd == TrackPitch::Up60 && _currentTrackPieceDirection < 4) + if (_previousTrackPitchEnd == TrackPitch::up60 && _currentTrackPieceDirection < 4) { newDisabledWidgets &= ~(1uLL << WIDX_SLOPE_UP_VERTICAL); } - if (_previousTrackPitchEnd == TrackPitch::Up90) + if (_previousTrackPitchEnd == TrackPitch::up90) { newDisabledWidgets &= ~(1uLL << WIDX_SLOPE_UP_VERTICAL); } - if (_previousTrackPitchEnd == TrackPitch::Down60 && _currentTrackPieceDirection < 4) + if (_previousTrackPitchEnd == TrackPitch::down60 && _currentTrackPieceDirection < 4) { newDisabledWidgets &= ~(1uLL << WIDX_SLOPE_DOWN_VERTICAL); } @@ -654,19 +657,19 @@ namespace OpenRCT2::Ui::Windows } if (TrackPieceDirectionIsDiagonal(_currentTrackPieceDirection) - && (_currentlySelectedTrack == TrackCurve::LeftLarge || _currentlySelectedTrack == TrackCurve::RightLarge) - && (_previousTrackPitchEnd == TrackPitch::Up25 || _previousTrackPitchEnd == TrackPitch::Down25) + && (_currentlySelectedTrack == TrackCurve::leftLarge || _currentlySelectedTrack == TrackCurve::rightLarge) + && (_previousTrackPitchEnd == TrackPitch::up25 || _previousTrackPitchEnd == TrackPitch::down25) && !IsTrackEnabled(TrackGroup::diagSlope)) { newDisabledWidgets |= 1uLL << WIDX_STRAIGHT; } - if (_previousTrackRollEnd == TrackRoll::Left) + if (_previousTrackRollEnd == TrackRoll::left) { newDisabledWidgets |= (1uLL << WIDX_RIGHT_CURVE_SMALL) | (1uLL << WIDX_RIGHT_CURVE) | (1uLL << WIDX_RIGHT_CURVE_LARGE) | (1uLL << WIDX_BANK_RIGHT); } - if (_previousTrackRollEnd == TrackRoll::Right) + if (_previousTrackRollEnd == TrackRoll::right) { newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_SMALL) | (1uLL << WIDX_LEFT_CURVE) | (1uLL << WIDX_LEFT_CURVE_LARGE) | (1uLL << WIDX_BANK_LEFT); @@ -677,13 +680,13 @@ namespace OpenRCT2::Ui::Windows | (1uLL << WIDX_RIGHT_CURVE_LARGE) | (1uLL << WIDX_LEFT_CURVE_SMALL) | (1uLL << WIDX_LEFT_CURVE) | (1uLL << WIDX_LEFT_CURVE_LARGE); } - if (_currentTrackPitchEnd != TrackPitch::None) + if (_currentTrackPitchEnd != TrackPitch::none) { if (IsTrackEnabled(TrackGroup::slopeRollBanking)) { - if (_previousTrackPitchEnd == TrackPitch::None) + if (_previousTrackPitchEnd == TrackPitch::none) { - if (_currentTrackPitchEnd != TrackPitch::Up25 && _currentTrackPitchEnd != TrackPitch::Down25) + if (_currentTrackPitchEnd != TrackPitch::up25 && _currentTrackPitchEnd != TrackPitch::down25) { newDisabledWidgets |= (1uLL << WIDX_BANK_LEFT) | (1uLL << WIDX_BANK_RIGHT); } @@ -696,7 +699,7 @@ namespace OpenRCT2::Ui::Windows } else { - if (_currentTrackPitchEnd != TrackPitch::Up25 && _currentTrackPitchEnd != TrackPitch::Down25) + if (_currentTrackPitchEnd != TrackPitch::up25 && _currentTrackPitchEnd != TrackPitch::down25) { newDisabledWidgets |= (1uLL << WIDX_BANK_LEFT) | (1uLL << WIDX_BANK_RIGHT); } @@ -708,75 +711,75 @@ namespace OpenRCT2::Ui::Windows newDisabledWidgets |= (1uLL << WIDX_BANK_LEFT) | (1uLL << WIDX_BANK_RIGHT); } } - if (_currentTrackRollEnd != TrackRoll::None || _previousTrackRollEnd != TrackRoll::None) + if (_currentTrackRollEnd != TrackRoll::none || _previousTrackRollEnd != TrackRoll::none) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_SLOPE_UP_STEEP) | (1uLL << WIDX_CHAIN_LIFT); } - if (_currentlySelectedTrack != TrackCurve::None) + if (_currentlySelectedTrack != TrackCurve::none) { if (!IsTrackEnabled(TrackGroup::liftHillCurve)) { newDisabledWidgets |= (1uLL << WIDX_CHAIN_LIFT); } - if (_currentTrackPitchEnd == TrackPitch::None) + if (_currentTrackPitchEnd == TrackPitch::none) { newDisabledWidgets |= (1uLL << WIDX_CHAIN_LIFT); } - if (_currentTrackPitchEnd == TrackPitch::Up60) + if (_currentTrackPitchEnd == TrackPitch::up60) { newDisabledWidgets |= (1uLL << WIDX_CHAIN_LIFT); } - if (_currentTrackPitchEnd == TrackPitch::Down60) + if (_currentTrackPitchEnd == TrackPitch::down60) { newDisabledWidgets |= (1uLL << WIDX_CHAIN_LIFT); } // Ensures that you can build an "unbanking turn", but not select a turn that start banked and // turns to level (as that does not exist). - if (_currentTrackRollEnd != TrackRoll::None && _currentTrackPitchEnd != TrackPitch::None) + if (_currentTrackRollEnd != TrackRoll::none && _currentTrackPitchEnd != TrackPitch::none) { newDisabledWidgets |= (1uLL << WIDX_LEVEL); } } - if (_currentTrackPitchEnd == TrackPitch::Up90 || _previousTrackPitchEnd == TrackPitch::Up90) + if (_currentTrackPitchEnd == TrackPitch::up90 || _previousTrackPitchEnd == TrackPitch::up90) { newDisabledWidgets |= (1uLL << WIDX_CHAIN_LIFT); } if (!IsTrackEnabled(TrackGroup::liftHillSteep)) { - if (_previousTrackPitchEnd == TrackPitch::Up60 || _currentTrackPitchEnd == TrackPitch::Up60) + if (_previousTrackPitchEnd == TrackPitch::up60 || _currentTrackPitchEnd == TrackPitch::up60) { newDisabledWidgets |= (1uLL << WIDX_CHAIN_LIFT); } } - if (_previousTrackRollEnd == TrackRoll::UpsideDown) + if (_previousTrackRollEnd == TrackRoll::upsideDown) { newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_SMALL) | (1uLL << WIDX_LEFT_CURVE) | (1uLL << WIDX_LEFT_CURVE_LARGE) | (1uLL << WIDX_STRAIGHT) | (1uLL << WIDX_RIGHT_CURVE_SMALL) | (1uLL << WIDX_RIGHT_CURVE) | (1uLL << WIDX_RIGHT_CURVE_LARGE); } - if (_currentlySelectedTrack != TrackCurve::None) + if (_currentlySelectedTrack != TrackCurve::none) { - if (_currentTrackPitchEnd == TrackPitch::None) + if (_currentTrackPitchEnd == TrackPitch::none) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN) | (1uLL << WIDX_SLOPE_UP); } if (_currentTrackPitchEnd == _previousTrackPitchEnd) { - if (_currentTrackPitchEnd == TrackPitch::Up25) + if (_currentTrackPitchEnd == TrackPitch::up25) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP_STEEP); - if (_currentlySelectedTrack == TrackCurve::Left || _currentlySelectedTrack == TrackCurve::Right + if (_currentlySelectedTrack == TrackCurve::left || _currentlySelectedTrack == TrackCurve::right || _rideConstructionState != RideConstructionState::Back || !IsTrackEnabled(TrackGroup::slopeCurveBanked)) { newDisabledWidgets |= (1uLL << WIDX_LEVEL); } } - if (_currentTrackPitchEnd == TrackPitch::Down25) + if (_currentTrackPitchEnd == TrackPitch::down25) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP); - if (_currentlySelectedTrack == TrackCurve::Left || _currentlySelectedTrack == TrackCurve::Right + if (_currentlySelectedTrack == TrackCurve::left || _currentlySelectedTrack == TrackCurve::right || _rideConstructionState != RideConstructionState::Front || !IsTrackEnabled(TrackGroup::slopeCurveBanked)) { @@ -787,57 +790,57 @@ namespace OpenRCT2::Ui::Windows else if (IsTrackEnabled(TrackGroup::slopeCurveBanked)) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_SLOPE_UP_STEEP); - if (_currentTrackRollEnd == TrackRoll::Left) + if (_currentTrackRollEnd == TrackRoll::left) { newDisabledWidgets |= (1uLL << WIDX_BANK_STRAIGHT) | (1uLL << WIDX_BANK_RIGHT); newDisabledWidgets &= ~(1uLL << WIDX_BANK_LEFT); } - if (_currentTrackRollEnd == TrackRoll::Right) + if (_currentTrackRollEnd == TrackRoll::right) { newDisabledWidgets |= (1uLL << WIDX_BANK_LEFT) | (1uLL << WIDX_BANK_STRAIGHT); newDisabledWidgets &= ~(1uLL << WIDX_BANK_RIGHT); } - if (_currentTrackRollEnd == TrackRoll::None) + if (_currentTrackRollEnd == TrackRoll::none) { newDisabledWidgets |= (1uLL << WIDX_BANK_LEFT) | (1uLL << WIDX_BANK_RIGHT); newDisabledWidgets &= ~(1uLL << WIDX_BANK_STRAIGHT); } - if (_currentTrackPitchEnd == TrackPitch::None) + if (_currentTrackPitchEnd == TrackPitch::none) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN) | (1uLL << WIDX_SLOPE_UP); newDisabledWidgets &= ~(1uLL << WIDX_LEVEL); } - if (_currentTrackPitchEnd == TrackPitch::Up25) + if (_currentTrackPitchEnd == TrackPitch::up25) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN) | (1uLL << WIDX_LEVEL); newDisabledWidgets &= ~(1uLL << WIDX_SLOPE_UP); } - if (_currentTrackPitchEnd == TrackPitch::Down25) + if (_currentTrackPitchEnd == TrackPitch::down25) { newDisabledWidgets |= (1uLL << WIDX_LEVEL) | (1uLL << WIDX_SLOPE_UP); newDisabledWidgets &= ~(1uLL << WIDX_SLOPE_DOWN); } - if (_currentlySelectedTrack == TrackCurve::LeftSmall) + if (_currentlySelectedTrack == TrackCurve::leftSmall) { newDisabledWidgets &= ~(1uLL << WIDX_LEFT_CURVE_SMALL); } - if (_currentlySelectedTrack == TrackCurve::RightSmall) + if (_currentlySelectedTrack == TrackCurve::rightSmall) { newDisabledWidgets &= ~(1uLL << WIDX_RIGHT_CURVE_SMALL); } } } - if (_currentlySelectedTrack != TrackCurve::None && _currentTrackPitchEnd == TrackPitch::Up60) + if (_currentlySelectedTrack != TrackCurve::none && _currentTrackPitchEnd == TrackPitch::up60) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP); } - if (_currentlySelectedTrack != TrackCurve::None && _currentTrackPitchEnd == TrackPitch::Down60) + if (_currentlySelectedTrack != TrackCurve::none && _currentTrackPitchEnd == TrackPitch::down60) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN); } if ((_currentTrackHasLiftHill) && !getGameState().cheats.enableChainLiftOnAllTrack) { - if (_currentTrackPitchEnd != TrackPitch::None && !IsTrackEnabled(TrackGroup::liftHillCurve)) + if (_currentTrackPitchEnd != TrackPitch::none && !IsTrackEnabled(TrackGroup::liftHillCurve)) { newDisabledWidgets |= (1uLL << WIDX_LEFT_CURVE_SMALL) | (1uLL << WIDX_LEFT_CURVE) | (1uLL << WIDX_LEFT_CURVE_LARGE) | (1uLL << WIDX_RIGHT_CURVE_SMALL) | (1uLL << WIDX_RIGHT_CURVE) @@ -851,17 +854,17 @@ namespace OpenRCT2::Ui::Windows } } } - if (_previousTrackPitchEnd == TrackPitch::Up60 && _currentlySelectedTrack != TrackCurve::None) + if (_previousTrackPitchEnd == TrackPitch::up60 && _currentlySelectedTrack != TrackCurve::none) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP) | (1uLL << WIDX_LEVEL); } - if (_previousTrackPitchEnd == TrackPitch::Down60 && _currentlySelectedTrack != TrackCurve::None) + if (_previousTrackPitchEnd == TrackPitch::down60 && _currentlySelectedTrack != TrackCurve::none) { newDisabledWidgets |= (1uLL << WIDX_LEVEL) | (1uLL << WIDX_SLOPE_UP_STEEP); } - if (_currentTrackPitchEnd == TrackPitch::Up90 || _previousTrackPitchEnd == TrackPitch::Up90) + if (_currentTrackPitchEnd == TrackPitch::up90 || _previousTrackPitchEnd == TrackPitch::up90) { - if (_currentlySelectedTrack != TrackCurve::None) + if (_currentlySelectedTrack != TrackCurve::none) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_UP_STEEP); } @@ -873,9 +876,9 @@ namespace OpenRCT2::Ui::Windows | (1uLL << WIDX_RIGHT_CURVE_SMALL) | (1uLL << WIDX_LEFT_CURVE_SMALL) | (1uLL << WIDX_LEFT_CURVE); } } - else if (_currentTrackPitchEnd == TrackPitch::Down90 || _previousTrackPitchEnd == TrackPitch::Down90) + else if (_currentTrackPitchEnd == TrackPitch::down90 || _previousTrackPitchEnd == TrackPitch::down90) { - if (_currentlySelectedTrack != TrackCurve::None) + if (_currentlySelectedTrack != TrackCurve::none) { newDisabledWidgets |= (1uLL << WIDX_SLOPE_DOWN_STEEP); } @@ -888,11 +891,11 @@ namespace OpenRCT2::Ui::Windows } } // If the previous track is flat and the next track is flat, attempt to show buttons for helixes - if (_currentTrackPitchEnd == TrackPitch::None && _currentTrackPitchEnd == _previousTrackPitchEnd) + if (_currentTrackPitchEnd == TrackPitch::none && _currentTrackPitchEnd == _previousTrackPitchEnd) { // If the bank is none, attempt to show unbanked quarter helixes - if (_currentTrackRollEnd == TrackRoll::None - && (_currentlySelectedTrack == TrackCurve::Left || _currentlySelectedTrack == TrackCurve::Right)) + if (_currentTrackRollEnd == TrackRoll::none + && (_currentlySelectedTrack == TrackCurve::left || _currentlySelectedTrack == TrackCurve::right)) { if (IsTrackEnabled(TrackGroup::helixDownUnbankedQuarter)) newDisabledWidgets &= ~(1uLL << WIDX_SLOPE_DOWN_STEEP); @@ -902,8 +905,8 @@ namespace OpenRCT2::Ui::Windows // If the track is banked left or right and curvature is standard size (2.5 tile radius), attempt to show // buttons for half or quarter helixes else if ( - (_currentTrackRollEnd == TrackRoll::Left || _currentTrackRollEnd == TrackRoll::Right) - && (_currentlySelectedTrack == TrackCurve::Left || _currentlySelectedTrack == TrackCurve::Right)) + (_currentTrackRollEnd == TrackRoll::left || _currentTrackRollEnd == TrackRoll::right) + && (_currentlySelectedTrack == TrackCurve::left || _currentlySelectedTrack == TrackCurve::right)) { if (IsTrackEnabled(TrackGroup::helixDownBankedHalf) || IsTrackEnabled(TrackGroup::helixDownBankedQuarter)) newDisabledWidgets &= ~(1uLL << WIDX_SLOPE_DOWN_STEEP); @@ -913,8 +916,8 @@ namespace OpenRCT2::Ui::Windows // If the track is banked left or right and curvature is small size (1.5 tile radius), attempt to show buttons // for half helixes else if ( - (_currentTrackRollEnd == TrackRoll::Left || _currentTrackRollEnd == TrackRoll::Right) - && (_currentlySelectedTrack == TrackCurve::LeftSmall || _currentlySelectedTrack == TrackCurve::RightSmall)) + (_currentTrackRollEnd == TrackRoll::left || _currentTrackRollEnd == TrackRoll::right) + && (_currentlySelectedTrack == TrackCurve::leftSmall || _currentlySelectedTrack == TrackCurve::rightSmall)) { if (IsTrackEnabled(TrackGroup::helixDownBankedHalf)) newDisabledWidgets &= ~(1uLL << WIDX_SLOPE_DOWN_STEEP); @@ -926,9 +929,9 @@ namespace OpenRCT2::Ui::Windows { if (_rideConstructionState == RideConstructionState::Front) { - if (_currentlySelectedTrack == TrackCurve::LeftSmall || _currentlySelectedTrack == TrackCurve::RightSmall) + if (_currentlySelectedTrack == TrackCurve::leftSmall || _currentlySelectedTrack == TrackCurve::rightSmall) { - if (_currentTrackPitchEnd == TrackPitch::None && _previousTrackRollEnd != TrackRoll::None + if (_currentTrackPitchEnd == TrackPitch::none && _previousTrackRollEnd != TrackRoll::none && (!currentRide->getRideTypeDescriptor().HasFlag(RtdFlag::upInclineRequiresLift) || getGameState().cheats.enableAllDrawableTrackPieces)) { @@ -938,9 +941,9 @@ namespace OpenRCT2::Ui::Windows } else if (_rideConstructionState == RideConstructionState::Back) { - if (_currentlySelectedTrack == TrackCurve::LeftSmall || _currentlySelectedTrack == TrackCurve::RightSmall) + if (_currentlySelectedTrack == TrackCurve::leftSmall || _currentlySelectedTrack == TrackCurve::rightSmall) { - if (_currentTrackPitchEnd == TrackPitch::None && _previousTrackRollEnd != TrackRoll::None) + if (_currentTrackPitchEnd == TrackPitch::none && _previousTrackRollEnd != TrackRoll::none) { newDisabledWidgets &= ~(1uLL << WIDX_SLOPE_DOWN); } @@ -1034,10 +1037,10 @@ namespace OpenRCT2::Ui::Windows { switch (_currentlySelectedTrack.trackType) { - case TrackElemType::SpinningTunnel: - case TrackElemType::Whirlpool: - case TrackElemType::Rapids: - case TrackElemType::Waterfall: + case TrackElemType::spinningTunnel: + case TrackElemType::whirlpool: + case TrackElemType::rapids: + case TrackElemType::waterfall: invalidateWidget(WIDX_CONSTRUCT); break; default: @@ -1137,102 +1140,102 @@ namespace OpenRCT2::Ui::Windows break; case WIDX_NEXT_SECTION: RideSelectNextSection(); - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) VirtualFloorSetHeight(_currentTrackBegin.z); break; case WIDX_PREVIOUS_SECTION: RideSelectPreviousSection(); - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) VirtualFloorSetHeight(_currentTrackBegin.z); break; case WIDX_LEFT_CURVE: RideConstructionInvalidateCurrentTrack(); - _currentlySelectedTrack = TrackCurve::Left; + _currentlySelectedTrack = TrackCurve::left; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_RIGHT_CURVE: RideConstructionInvalidateCurrentTrack(); - _currentlySelectedTrack = TrackCurve::Right; + _currentlySelectedTrack = TrackCurve::right; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_LEFT_CURVE_SMALL: RideConstructionInvalidateCurrentTrack(); - _currentlySelectedTrack = TrackCurve::LeftSmall; + _currentlySelectedTrack = TrackCurve::leftSmall; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_RIGHT_CURVE_SMALL: RideConstructionInvalidateCurrentTrack(); - _currentlySelectedTrack = TrackCurve::RightSmall; + _currentlySelectedTrack = TrackCurve::rightSmall; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_LEFT_CURVE_VERY_SMALL: RideConstructionInvalidateCurrentTrack(); - _currentlySelectedTrack = TrackCurve::LeftVerySmall; + _currentlySelectedTrack = TrackCurve::leftVerySmall; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_RIGHT_CURVE_VERY_SMALL: RideConstructionInvalidateCurrentTrack(); - _currentlySelectedTrack = TrackCurve::RightVerySmall; + _currentlySelectedTrack = TrackCurve::rightVerySmall; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_LEFT_CURVE_LARGE: RideConstructionInvalidateCurrentTrack(); - _currentlySelectedTrack = TrackCurve::LeftLarge; + _currentlySelectedTrack = TrackCurve::leftLarge; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_RIGHT_CURVE_LARGE: RideConstructionInvalidateCurrentTrack(); - _currentlySelectedTrack = TrackCurve::RightLarge; + _currentlySelectedTrack = TrackCurve::rightLarge; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_STRAIGHT: RideConstructionInvalidateCurrentTrack(); - if (_currentlySelectedTrack != TrackCurve::None) - _currentTrackRollEnd = TrackRoll::None; - _currentlySelectedTrack = TrackCurve::None; + if (_currentlySelectedTrack != TrackCurve::none) + _currentTrackRollEnd = TrackRoll::none; + _currentlySelectedTrack = TrackCurve::none; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_SLOPE_DOWN_VERTICAL: RideConstructionInvalidateCurrentTrack(); - UpdateLiftHillSelected(TrackPitch::Down90); + UpdateLiftHillSelected(TrackPitch::down90); break; case WIDX_SLOPE_DOWN_STEEP: RideConstructionInvalidateCurrentTrack(); if (IsTrackEnabled(TrackGroup::helixDownBankedHalf) || IsTrackEnabled(TrackGroup::helixUpBankedHalf)) { - if (_currentlySelectedTrack == TrackCurve::Left && _currentTrackRollEnd == TrackRoll::Left) + if (_currentlySelectedTrack == TrackCurve::left && _currentTrackRollEnd == TrackRoll::left) { - _currentlySelectedTrack = TrackElemType::LeftHalfBankedHelixDownLarge; + _currentlySelectedTrack = TrackElemType::leftHalfBankedHelixDownLarge; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::Right && _currentTrackRollEnd == TrackRoll::Right) + if (_currentlySelectedTrack == TrackCurve::right && _currentTrackRollEnd == TrackRoll::right) { - _currentlySelectedTrack = TrackElemType::RightHalfBankedHelixDownLarge; + _currentlySelectedTrack = TrackElemType::rightHalfBankedHelixDownLarge; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::LeftSmall && _currentTrackRollEnd == TrackRoll::Left) + if (_currentlySelectedTrack == TrackCurve::leftSmall && _currentTrackRollEnd == TrackRoll::left) { - _currentlySelectedTrack = TrackElemType::LeftHalfBankedHelixDownSmall; + _currentlySelectedTrack = TrackElemType::leftHalfBankedHelixDownSmall; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::RightSmall && _currentTrackRollEnd == TrackRoll::Right) + if (_currentlySelectedTrack == TrackCurve::rightSmall && _currentTrackRollEnd == TrackRoll::right) { - _currentlySelectedTrack = TrackElemType::RightHalfBankedHelixDownSmall; + _currentlySelectedTrack = TrackElemType::rightHalfBankedHelixDownSmall; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; @@ -1240,16 +1243,16 @@ namespace OpenRCT2::Ui::Windows } if (IsTrackEnabled(TrackGroup::helixDownBankedQuarter) || IsTrackEnabled(TrackGroup::helixUpBankedQuarter)) { - if (_currentlySelectedTrack == TrackCurve::Left && _currentTrackRollEnd == TrackRoll::Left) + if (_currentlySelectedTrack == TrackCurve::left && _currentTrackRollEnd == TrackRoll::left) { - _currentlySelectedTrack = TrackElemType::LeftQuarterBankedHelixLargeDown; + _currentlySelectedTrack = TrackElemType::leftQuarterBankedHelixLargeDown; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::Right && _currentTrackRollEnd == TrackRoll::Right) + if (_currentlySelectedTrack == TrackCurve::right && _currentTrackRollEnd == TrackRoll::right) { - _currentlySelectedTrack = TrackElemType::RightQuarterBankedHelixLargeDown; + _currentlySelectedTrack = TrackElemType::rightQuarterBankedHelixLargeDown; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; @@ -1258,18 +1261,18 @@ namespace OpenRCT2::Ui::Windows if (IsTrackEnabled(TrackGroup::helixDownUnbankedQuarter) || IsTrackEnabled(TrackGroup::helixUpUnbankedQuarter)) { - if (_currentTrackRollEnd == TrackRoll::None) + if (_currentTrackRollEnd == TrackRoll::none) { - if (_currentlySelectedTrack == TrackCurve::Left) + if (_currentlySelectedTrack == TrackCurve::left) { - _currentlySelectedTrack = TrackElemType::LeftQuarterHelixLargeDown; + _currentlySelectedTrack = TrackElemType::leftQuarterHelixLargeDown; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::Right) + if (_currentlySelectedTrack == TrackCurve::right) { - _currentlySelectedTrack = TrackElemType::RightQuarterHelixLargeDown; + _currentlySelectedTrack = TrackElemType::rightQuarterHelixLargeDown; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; @@ -1277,91 +1280,91 @@ namespace OpenRCT2::Ui::Windows } } - UpdateLiftHillSelected(TrackPitch::Down60); + UpdateLiftHillSelected(TrackPitch::down60); break; case WIDX_SLOPE_DOWN: RideConstructionInvalidateCurrentTrack(); - if (_rideConstructionState == RideConstructionState::Back && _currentTrackRollEnd != TrackRoll::None) + if (_rideConstructionState == RideConstructionState::Back && _currentTrackRollEnd != TrackRoll::none) { - _currentTrackRollEnd = TrackRoll::None; + _currentTrackRollEnd = TrackRoll::none; } - UpdateLiftHillSelected(TrackPitch::Down25); + UpdateLiftHillSelected(TrackPitch::down25); break; case WIDX_LEVEL: RideConstructionInvalidateCurrentTrack(); - if (_rideConstructionState == RideConstructionState::Front && _previousTrackPitchEnd == TrackPitch::Down25) + if (_rideConstructionState == RideConstructionState::Front && _previousTrackPitchEnd == TrackPitch::down25) { - if (_currentlySelectedTrack == TrackCurve::LeftSmall) + if (_currentlySelectedTrack == TrackCurve::leftSmall) { - _currentTrackRollEnd = TrackRoll::Left; + _currentTrackRollEnd = TrackRoll::left; } - else if (_currentlySelectedTrack == TrackCurve::RightSmall) + else if (_currentlySelectedTrack == TrackCurve::rightSmall) { - _currentTrackRollEnd = TrackRoll::Right; + _currentTrackRollEnd = TrackRoll::right; } } else if ( - _rideConstructionState == RideConstructionState::Back && _previousTrackPitchEnd == TrackPitch::Up25) + _rideConstructionState == RideConstructionState::Back && _previousTrackPitchEnd == TrackPitch::up25) { - if (_currentlySelectedTrack == TrackCurve::LeftSmall) + if (_currentlySelectedTrack == TrackCurve::leftSmall) { - _currentTrackRollEnd = TrackRoll::Left; + _currentTrackRollEnd = TrackRoll::left; } - else if (_currentlySelectedTrack == TrackCurve::RightSmall) + else if (_currentlySelectedTrack == TrackCurve::rightSmall) { - _currentTrackRollEnd = TrackRoll::Right; + _currentTrackRollEnd = TrackRoll::right; } } - UpdateLiftHillSelected(TrackPitch::None); + UpdateLiftHillSelected(TrackPitch::none); break; case WIDX_SLOPE_UP: RideConstructionInvalidateCurrentTrack(); - if (_rideConstructionState == RideConstructionState::Front && _currentTrackRollEnd != TrackRoll::None) + if (_rideConstructionState == RideConstructionState::Front && _currentTrackRollEnd != TrackRoll::none) { - _currentTrackRollEnd = TrackRoll::None; + _currentTrackRollEnd = TrackRoll::none; } if (currentRide->getRideTypeDescriptor().SupportsTrackGroup(TrackGroup::reverseFreefall)) { if (_rideConstructionState == RideConstructionState::Front - && _currentlySelectedTrack == TrackCurve::None) + && _currentlySelectedTrack == TrackCurve::none) { - _currentlySelectedTrack = TrackElemType::ReverseFreefallSlope; + _currentlySelectedTrack = TrackElemType::reverseFreefallSlope; WindowRideConstructionUpdateActiveElements(); } } else { - UpdateLiftHillSelected(TrackPitch::Up25); + UpdateLiftHillSelected(TrackPitch::up25); } break; case WIDX_SLOPE_UP_STEEP: RideConstructionInvalidateCurrentTrack(); if (IsTrackEnabled(TrackGroup::helixDownBankedHalf) || IsTrackEnabled(TrackGroup::helixUpBankedHalf)) { - if (_currentlySelectedTrack == TrackCurve::Left && _currentTrackRollEnd == TrackRoll::Left) + if (_currentlySelectedTrack == TrackCurve::left && _currentTrackRollEnd == TrackRoll::left) { - _currentlySelectedTrack = TrackElemType::LeftHalfBankedHelixUpLarge; + _currentlySelectedTrack = TrackElemType::leftHalfBankedHelixUpLarge; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::Right && _currentTrackRollEnd == TrackRoll::Right) + if (_currentlySelectedTrack == TrackCurve::right && _currentTrackRollEnd == TrackRoll::right) { - _currentlySelectedTrack = TrackElemType::RightHalfBankedHelixUpLarge; + _currentlySelectedTrack = TrackElemType::rightHalfBankedHelixUpLarge; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::LeftSmall && _currentTrackRollEnd == TrackRoll::Left) + if (_currentlySelectedTrack == TrackCurve::leftSmall && _currentTrackRollEnd == TrackRoll::left) { - _currentlySelectedTrack = TrackElemType::LeftHalfBankedHelixUpSmall; + _currentlySelectedTrack = TrackElemType::leftHalfBankedHelixUpSmall; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::RightSmall && _currentTrackRollEnd == TrackRoll::Right) + if (_currentlySelectedTrack == TrackCurve::rightSmall && _currentTrackRollEnd == TrackRoll::right) { - _currentlySelectedTrack = TrackElemType::RightHalfBankedHelixUpSmall; + _currentlySelectedTrack = TrackElemType::rightHalfBankedHelixUpSmall; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; @@ -1369,16 +1372,16 @@ namespace OpenRCT2::Ui::Windows } if (IsTrackEnabled(TrackGroup::helixDownBankedQuarter) || IsTrackEnabled(TrackGroup::helixUpBankedQuarter)) { - if (_currentlySelectedTrack == TrackCurve::Left && _currentTrackRollEnd == TrackRoll::Left) + if (_currentlySelectedTrack == TrackCurve::left && _currentTrackRollEnd == TrackRoll::left) { - _currentlySelectedTrack = TrackElemType::LeftQuarterBankedHelixLargeUp; + _currentlySelectedTrack = TrackElemType::leftQuarterBankedHelixLargeUp; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::Right && _currentTrackRollEnd == TrackRoll::Right) + if (_currentlySelectedTrack == TrackCurve::right && _currentTrackRollEnd == TrackRoll::right) { - _currentlySelectedTrack = TrackElemType::RightQuarterBankedHelixLargeUp; + _currentlySelectedTrack = TrackElemType::rightQuarterBankedHelixLargeUp; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; @@ -1387,18 +1390,18 @@ namespace OpenRCT2::Ui::Windows if (IsTrackEnabled(TrackGroup::helixDownUnbankedQuarter) || IsTrackEnabled(TrackGroup::helixUpUnbankedQuarter)) { - if (_currentTrackRollEnd == TrackRoll::None) + if (_currentTrackRollEnd == TrackRoll::none) { - if (_currentlySelectedTrack == TrackCurve::Left) + if (_currentlySelectedTrack == TrackCurve::left) { - _currentlySelectedTrack = TrackElemType::LeftQuarterHelixLargeUp; + _currentlySelectedTrack = TrackElemType::leftQuarterHelixLargeUp; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; } - if (_currentlySelectedTrack == TrackCurve::Right) + if (_currentlySelectedTrack == TrackCurve::right) { - _currentlySelectedTrack = TrackElemType::RightQuarterHelixLargeUp; + _currentlySelectedTrack = TrackElemType::rightQuarterHelixLargeUp; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; @@ -1406,11 +1409,11 @@ namespace OpenRCT2::Ui::Windows } } - UpdateLiftHillSelected(TrackPitch::Up60); + UpdateLiftHillSelected(TrackPitch::up60); break; case WIDX_SLOPE_UP_VERTICAL: RideConstructionInvalidateCurrentTrack(); - UpdateLiftHillSelected(TrackPitch::Up90); + UpdateLiftHillSelected(TrackPitch::up90); break; case WIDX_CHAIN_LIFT: RideConstructionInvalidateCurrentTrack(); @@ -1424,7 +1427,7 @@ namespace OpenRCT2::Ui::Windows RideConstructionInvalidateCurrentTrack(); if (!_currentlyShowingBrakeOrBoosterSpeed) { - _currentTrackRollEnd = TrackRoll::Left; + _currentTrackRollEnd = TrackRoll::left; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); } @@ -1433,7 +1436,7 @@ namespace OpenRCT2::Ui::Windows RideConstructionInvalidateCurrentTrack(); if (!_currentlyShowingBrakeOrBoosterSpeed) { - _currentTrackRollEnd = TrackRoll::None; + _currentTrackRollEnd = TrackRoll::none; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); } @@ -1460,7 +1463,7 @@ namespace OpenRCT2::Ui::Windows RideConstructionInvalidateCurrentTrack(); if (!_currentlyShowingBrakeOrBoosterSpeed) { - _currentTrackRollEnd = TrackRoll::Right; + _currentTrackRollEnd = TrackRoll::right; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); } @@ -1547,18 +1550,18 @@ namespace OpenRCT2::Ui::Windows OpenRCT2::TrackElemType trackPiece = _specialElementDropdownState.Elements[selectedIndex].TrackType; switch (trackPiece) { - case TrackElemType::EndStation: - case TrackElemType::SBendLeft: - case TrackElemType::SBendRight: - _currentTrackPitchEnd = TrackPitch::None; + case TrackElemType::endStation: + case TrackElemType::sBendLeft: + case TrackElemType::sBendRight: + _currentTrackPitchEnd = TrackPitch::none; break; - case TrackElemType::LeftVerticalLoop: - case TrackElemType::RightVerticalLoop: - _currentTrackRollEnd = TrackRoll::None; + case TrackElemType::leftVerticalLoop: + case TrackElemType::rightVerticalLoop: + _currentTrackRollEnd = TrackRoll::none; _currentTrackHasLiftHill = false; break; - case TrackElemType::BlockBrakes: - case TrackElemType::DiagBlockBrakes: + case TrackElemType::blockBrakes: + case TrackElemType::diagBlockBrakes: _currentBrakeSpeed = kRCT2DefaultBlockBrakeSpeed; break; default: @@ -1683,9 +1686,9 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_O_TRACK].tooltip = trackDrawerDescriptor.Covered.tooltip; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { - RenderTarget clippedRT; + Drawing::RenderTarget clippedRT; Widget* widget; int32_t widgetWidth, widgetHeight; @@ -1705,9 +1708,9 @@ namespace OpenRCT2::Ui::Windows // Draw track piece auto screenCoords = ScreenCoordsXY{ windowPos.x + widget->left + 1, windowPos.y + widget->top + 1 }; - widgetWidth = widget->width() - 1; - widgetHeight = widget->height() - 1; - if (ClipDrawPixelInfo(clippedRT, rt, screenCoords, widgetWidth, widgetHeight)) + widgetWidth = widget->width() - 2; + widgetHeight = widget->height() - 2; + if (ClipRenderTarget(clippedRT, rt, screenCoords, widgetWidth, widgetHeight)) { DrawTrackPiece( clippedRT, rideIndex, trackType, trackDirection, liftHillAndInvertedState, widgetWidth, widgetHeight); @@ -1834,11 +1837,11 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_SLOPE_UP].type = WidgetType::flatBtn; } if ((IsTrackEnabled(TrackGroup::helixDownBankedHalf) || IsTrackEnabled(TrackGroup::helixUpBankedHalf)) - && _currentTrackRollEnd != TrackRoll::None && _currentTrackPitchEnd == TrackPitch::None) + && _currentTrackRollEnd != TrackRoll::none && _currentTrackPitchEnd == TrackPitch::none) { - const bool hasHelixEquivalent = _currentlySelectedTrack == TrackCurve::Left - || _currentlySelectedTrack == TrackCurve::Right || _currentlySelectedTrack == TrackCurve::LeftSmall - || _currentlySelectedTrack == TrackCurve::RightSmall; + const bool hasHelixEquivalent = _currentlySelectedTrack == TrackCurve::left + || _currentlySelectedTrack == TrackCurve::right || _currentlySelectedTrack == TrackCurve::leftSmall + || _currentlySelectedTrack == TrackCurve::rightSmall; if (hasHelixEquivalent) { // Enable helix @@ -1859,7 +1862,7 @@ namespace OpenRCT2::Ui::Windows const auto& gameState = getGameState(); if (currentRide->getRideTypeDescriptor().HasFlag(RtdFlag::upInclineRequiresLift) - && (_currentTrackPitchEnd == TrackPitch::Up25 || _currentTrackPitchEnd == TrackPitch::Up60) + && (_currentTrackPitchEnd == TrackPitch::up25 || _currentTrackPitchEnd == TrackPitch::up60) && !gameState.cheats.enableAllDrawableTrackPieces) { _currentTrackHasLiftHill = true; @@ -1888,19 +1891,19 @@ namespace OpenRCT2::Ui::Windows if (IsTrackEnabled(TrackGroup::slopeVertical) && !TrackPieceDirectionIsDiagonal(_currentTrackPieceDirection)) { - if (_previousTrackPitchEnd == TrackPitch::Up60 || _previousTrackPitchEnd == TrackPitch::Up90) + if (_previousTrackPitchEnd == TrackPitch::up60 || _previousTrackPitchEnd == TrackPitch::up90) { widgets[WIDX_SLOPE_UP_VERTICAL].type = WidgetType::flatBtn; } - else if (_previousTrackPitchEnd == TrackPitch::Down60 || _previousTrackPitchEnd == TrackPitch::Down90) + else if (_previousTrackPitchEnd == TrackPitch::down60 || _previousTrackPitchEnd == TrackPitch::down90) { widgets[WIDX_SLOPE_DOWN_VERTICAL].type = WidgetType::flatBtn; } } if ((IsTrackEnabled(TrackGroup::helixDownUnbankedQuarter) || IsTrackEnabled(TrackGroup::helixUpUnbankedQuarter)) - && _currentTrackPitchEnd == TrackPitch::None && _currentTrackRollEnd == TrackRoll::None - && (_currentlySelectedTrack == TrackCurve::Left || _currentlySelectedTrack == TrackCurve::Right)) + && _currentTrackPitchEnd == TrackPitch::none && _currentTrackRollEnd == TrackRoll::none + && (_currentlySelectedTrack == TrackCurve::left || _currentlySelectedTrack == TrackCurve::right)) { widgets[WIDX_SLOPE_DOWN_STEEP].image = ImageId(SPR_RIDE_CONSTRUCTION_HELIX_DOWN); widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP; @@ -1927,11 +1930,11 @@ namespace OpenRCT2::Ui::Windows if (IsTrackEnabled(TrackGroup::helixDownBankedQuarter) || IsTrackEnabled(TrackGroup::helixUpBankedQuarter) || IsTrackEnabled(TrackGroup::helixDownBankedHalf) || IsTrackEnabled(TrackGroup::helixUpBankedHalf)) { - const bool hasHelixEquivalent = _currentlySelectedTrack == TrackCurve::Left - || _currentlySelectedTrack == TrackCurve::Right || _currentlySelectedTrack == TrackCurve::LeftSmall - || _currentlySelectedTrack == TrackCurve::RightSmall; + const bool hasHelixEquivalent = _currentlySelectedTrack == TrackCurve::left + || _currentlySelectedTrack == TrackCurve::right || _currentlySelectedTrack == TrackCurve::leftSmall + || _currentlySelectedTrack == TrackCurve::rightSmall; - if (hasHelixEquivalent && _currentTrackPitchEnd == TrackPitch::None && _currentTrackRollEnd != TrackRoll::None) + if (hasHelixEquivalent && _currentTrackPitchEnd == TrackPitch::none && _currentTrackRollEnd != TrackRoll::none) { widgets[WIDX_SLOPE_DOWN_STEEP].image = ImageId(SPR_RIDE_CONSTRUCTION_HELIX_DOWN); widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP; @@ -1989,9 +1992,9 @@ namespace OpenRCT2::Ui::Windows || TrackTypeIsBooster(_currentlySelectedTrack.trackType); // only necessary because TD6 writes speed and seat rotation to the same bits. Remove for new track design format. - bool trackHasSpeedAndSeatRotation = _selectedTrackType == TrackElemType::BlockBrakes - || _currentlySelectedTrack == TrackElemType::BlockBrakes || _selectedTrackType > TrackElemType::HighestAlias - || _currentlySelectedTrack.trackType > TrackElemType::HighestAlias; + bool trackHasSpeedAndSeatRotation = _selectedTrackType == TrackElemType::blockBrakes + || _currentlySelectedTrack == TrackElemType::blockBrakes || _selectedTrackType > TrackElemType::highestAlias + || _currentlySelectedTrack.trackType > TrackElemType::highestAlias; bool rideHasSeatRotation = rtd.HasFlag(RtdFlag::hasSeatRotation); @@ -2130,31 +2133,31 @@ namespace OpenRCT2::Ui::Windows { switch (_currentlySelectedTrack.curve) { - case TrackCurve::None: + case TrackCurve::none: widgetIndex = WIDX_STRAIGHT; break; - case TrackCurve::Left: + case TrackCurve::left: widgetIndex = WIDX_LEFT_CURVE; break; - case TrackCurve::Right: + case TrackCurve::right: widgetIndex = WIDX_RIGHT_CURVE; break; - case TrackCurve::LeftSmall: + case TrackCurve::leftSmall: widgetIndex = WIDX_LEFT_CURVE_SMALL; break; - case TrackCurve::RightSmall: + case TrackCurve::rightSmall: widgetIndex = WIDX_RIGHT_CURVE_SMALL; break; - case TrackCurve::LeftVerySmall: + case TrackCurve::leftVerySmall: widgetIndex = WIDX_LEFT_CURVE_VERY_SMALL; break; - case TrackCurve::RightVerySmall: + case TrackCurve::rightVerySmall: widgetIndex = WIDX_RIGHT_CURVE_VERY_SMALL; break; - case TrackCurve::LeftLarge: + case TrackCurve::leftLarge: widgetIndex = WIDX_LEFT_CURVE_LARGE; break; - case TrackCurve::RightLarge: + case TrackCurve::rightLarge: widgetIndex = WIDX_RIGHT_CURVE_LARGE; break; } @@ -2164,22 +2167,22 @@ namespace OpenRCT2::Ui::Windows switch (_currentTrackPitchEnd) { - case TrackPitch::Down90: + case TrackPitch::down90: widgetIndex = WIDX_SLOPE_DOWN_VERTICAL; break; - case TrackPitch::Down60: + case TrackPitch::down60: widgetIndex = WIDX_SLOPE_DOWN_STEEP; break; - case TrackPitch::Down25: + case TrackPitch::down25: widgetIndex = WIDX_SLOPE_DOWN; break; - case TrackPitch::Up25: + case TrackPitch::up25: widgetIndex = WIDX_SLOPE_UP; break; - case TrackPitch::Up60: + case TrackPitch::up60: widgetIndex = WIDX_SLOPE_UP_STEEP; break; - case TrackPitch::Up90: + case TrackPitch::up90: widgetIndex = WIDX_SLOPE_UP_VERTICAL; break; default: @@ -2203,10 +2206,10 @@ namespace OpenRCT2::Ui::Windows } switch (_currentTrackRollEnd) { - case TrackRoll::Left: + case TrackRoll::left: widgetIndex = WIDX_BANK_LEFT; break; - case TrackRoll::None: + case TrackRoll::none: widgetIndex = WIDX_BANK_STRAIGHT; break; default: @@ -2242,7 +2245,6 @@ namespace OpenRCT2::Ui::Windows int32_t trackDirection; CoordsXYZ trackPos{}; - MapInvalidateMapSelectionTiles(); gMapSelectFlags.set(MapSelectFlag::enableConstruct); gMapSelectFlags.set(MapSelectFlag::green); @@ -2250,7 +2252,7 @@ namespace OpenRCT2::Ui::Windows { case RideConstructionState::State0: trackDirection = _currentTrackPieceDirection; - trackType = TrackElemType::Flat; + trackType = TrackElemType::flat; trackPos = _currentTrackBegin; break; case RideConstructionState::Selected: @@ -2259,13 +2261,13 @@ namespace OpenRCT2::Ui::Windows trackPos = _currentTrackBegin; break; case RideConstructionState::EntranceExit: - gMapSelectionTiles.clear(); + MapSelection::clearSelectedTiles(); return; default: if (WindowRideConstructionUpdateState(&trackType, &trackDirection, nullptr, nullptr, &trackPos, nullptr)) { trackDirection = _currentTrackPieceDirection; - trackType = OpenRCT2::TrackElemType::Flat; + trackType = OpenRCT2::TrackElemType::flat; trackPos = _currentTrackBegin; } break; @@ -2274,7 +2276,6 @@ namespace OpenRCT2::Ui::Windows if (GetRide(_currentRideIndex)) { selectMapTiles(trackType, trackDirection, trackPos); - MapInvalidateMapSelectionTiles(); } } @@ -2289,13 +2290,13 @@ namespace OpenRCT2::Ui::Windows const auto& ted = GetTrackElementDescriptor(trackType); trackDirection &= 3; - gMapSelectionTiles.clear(); + MapSelection::clearSelectedTiles(); for (uint8_t i = 0; i < ted.numSequences; i++) { CoordsXY offsets = { ted.sequences[i].clearance.x, ted.sequences[i].clearance.y }; CoordsXY currentTileCoords = tileCoords + offsets.Rotate(trackDirection); - gMapSelectionTiles.push_back(currentTileCoords); + MapSelection::addSelectedTile(currentTileCoords); } } @@ -2338,18 +2339,18 @@ namespace OpenRCT2::Ui::Windows } auto res = GameActions::Execute(&trackPlaceAction, getGameState()); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) { _trackPlaceCost = kMoney64Undefined; - _trackPlaceErrorMessage = std::get(res.ErrorMessage); + _trackPlaceErrorMessage = std::get(res.errorMessage); } else { - _trackPlaceCost = res.Cost; + _trackPlaceCost = res.cost; _trackPlaceErrorMessage = kStringIdNone; } - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) { return; } @@ -2361,7 +2362,7 @@ namespace OpenRCT2::Ui::Windows _currentTrackSelectionFlags.set(TrackSelectionFlag::trackPlaceActionQueued); } - const auto resultData = res.GetData(); + const auto resultData = res.getData(); if (resultData.GroundFlags & ELEMENT_IS_UNDERGROUND) { ViewportSetVisibility(ViewportVisibility::undergroundViewOn); @@ -2369,7 +2370,7 @@ namespace OpenRCT2::Ui::Windows const bool helixSelected = (_currentlySelectedTrack.isTrackType) && TrackTypeIsHelix(_currentlySelectedTrack.trackType); - if (helixSelected || (_currentTrackPitchEnd != TrackPitch::None)) + if (helixSelected || (_currentTrackPitchEnd != TrackPitch::none)) { ViewportSetVisibility(ViewportVisibility::trackHeights); } @@ -2461,7 +2462,7 @@ namespace OpenRCT2::Ui::Windows { _currentTrackBegin.x, _currentTrackBegin.y, _currentTrackBegin.z, currentDirection }); trackRemoveAction.SetCallback([=](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) { WindowRideConstructionUpdateActiveElements(); } @@ -2509,7 +2510,7 @@ namespace OpenRCT2::Ui::Windows gRideEntranceExitPlaceType = ENTRANCE_TYPE_RIDE_ENTRANCE; gRideEntranceExitPlaceRideIndex = _currentRideIndex; gRideEntranceExitPlaceStationIndex = StationIndex::FromUnderlying(0); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); RideConstructionInvalidateCurrentTrack(); if (_rideConstructionState != RideConstructionState::EntranceExit) { @@ -2535,7 +2536,7 @@ namespace OpenRCT2::Ui::Windows gRideEntranceExitPlaceType = ENTRANCE_TYPE_RIDE_EXIT; gRideEntranceExitPlaceRideIndex = _currentRideIndex; gRideEntranceExitPlaceStationIndex = StationIndex::FromUnderlying(0); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); RideConstructionInvalidateCurrentTrack(); if (_rideConstructionState != RideConstructionState::EntranceExit) { @@ -2554,9 +2555,9 @@ namespace OpenRCT2::Ui::Windows { switch (slope) { - case TrackPitch::None: - case TrackPitch::Up25: - case TrackPitch::Up60: + case TrackPitch::none: + case TrackPitch::up25: + case TrackPitch::up60: break; default: _currentTrackHasLiftHill = false; @@ -2597,7 +2598,7 @@ namespace OpenRCT2::Ui::Windows TrackElemType trackPiece = element.TrackType; // Separate elements logically - if (trackPiece == TrackElemType::None) + if (trackPiece == TrackElemType::none) { gDropdown.items[i++] = Dropdown::Separator(); continue; @@ -2626,14 +2627,14 @@ namespace OpenRCT2::Ui::Windows } // Tune dropdown to the elements it contains - auto ddWidth = widget->width(); + auto ddWidth = widget->width() - 1; auto targetColumnSize = _specialElementDropdownState.PreferredNumRows; if (targetColumnSize < _specialElementDropdownState.Elements.size()) ddWidth -= 30; WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, 0, - elements.size(), ddWidth, targetColumnSize); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, elements.size(), ddWidth, targetColumnSize); for (size_t j = 0; j < elements.size(); j++) { @@ -2653,7 +2654,6 @@ namespace OpenRCT2::Ui::Windows void ToolDownEntranceExit(const ScreenCoordsXY& screenCoords) { RideConstructionInvalidateCurrentTrack(); - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enable); gMapSelectFlags.unset(MapSelectFlag::enableArrow); @@ -2667,10 +2667,10 @@ namespace OpenRCT2::Ui::Windows rideEntranceExitPlaceAction.SetCallback( [=, this](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) return; - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, result->Position); + OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, result->position); auto* windowMgr = GetWindowManager(); @@ -2700,7 +2700,7 @@ namespace OpenRCT2::Ui::Windows } void DrawTrackPiece( - RenderTarget& rt, RideId rideIndex, OpenRCT2::TrackElemType trackType, int32_t trackDirection, + Drawing::RenderTarget& rt, RideId rideIndex, OpenRCT2::TrackElemType trackType, int32_t trackDirection, SelectedLiftAndInverted liftHillAndInvertedState, int32_t widgetWidth, int32_t widgetHeight) { auto currentRide = GetRide(rideIndex); @@ -2741,7 +2741,7 @@ namespace OpenRCT2::Ui::Windows } void DrawTrackPieceHelper( - RenderTarget& rt, RideId rideIndex, OpenRCT2::TrackElemType trackType, int32_t trackDirection, + Drawing::RenderTarget& rt, RideId rideIndex, OpenRCT2::TrackElemType trackType, int32_t trackDirection, SelectedLiftAndInverted liftHillAndInvertedState, const CoordsXY& originCoords, int32_t originZ) { TileElement tempSideTrackTileElement{ 0x80, 0x8F, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; @@ -2953,7 +2953,7 @@ namespace OpenRCT2::Ui::Windows static void RideConstructPlacedForwardGameActionCallback( const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) { WindowRideConstructionUpdateActiveElements(); return; @@ -3000,7 +3000,7 @@ namespace OpenRCT2::Ui::Windows static void RideConstructPlacedBackwardGameActionCallback( const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) { WindowRideConstructionUpdateActiveElements(); return; @@ -3178,7 +3178,7 @@ namespace OpenRCT2::Ui::Windows window->updateMapSelection(); - _selectedTrackType = TrackElemType::None; + _selectedTrackType = TrackElemType::none; if (_rideConstructionState == RideConstructionState::Selected) { TileElement* tileElement; @@ -3261,7 +3261,16 @@ namespace OpenRCT2::Ui::Windows rideIndex, type, direction, liftHillAndAlternativeState, trackPos); WindowRideConstructionUpdateActiveElements(); - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + gMapSelectArrowPosition = _currentTrackBegin; + Direction arrowDirection = _currentTrackPieceDirection; + // diagonal pieces trigger this + if (arrowDirection >= 4) + arrowDirection += 4; + if (_rideConstructionState == RideConstructionState::Back) + arrowDirection = DirectionReverse(arrowDirection); + gMapSelectArrowDirection = arrowDirection; + + if (!gMapSelectFlags.has(MapSelectFlag::enable)) { // Set height to where the next track piece would begin VirtualFloorSetHeight(_currentTrackBegin.z); @@ -3275,20 +3284,10 @@ namespace OpenRCT2::Ui::Windows _rideConstructionNextArrowPulse = curTime + kArrowPulseDuration; _currentTrackSelectionFlags.flip(TrackSelectionFlag::arrow); - trackPos = _currentTrackBegin; - direction = _currentTrackPieceDirection; - type = _currentTrackPieceType; - // diagonal pieces trigger this - if (direction >= 4) - direction += 4; - if (_rideConstructionState == RideConstructionState::Back) - direction = DirectionReverse(direction); - gMapSelectArrowPosition = trackPos; - gMapSelectArrowDirection = direction; + gMapSelectFlags.unset(MapSelectFlag::enableArrow); if (_currentTrackSelectionFlags.has(TrackSelectionFlag::arrow)) gMapSelectFlags.set(MapSelectFlag::enableArrow); - MapInvalidateTileFull(trackPos); break; } case RideConstructionState::Selected: @@ -3338,7 +3337,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectFlags.unset(MapSelectFlag::enableArrow); if (_currentTrackSelectionFlags.has(TrackSelectionFlag::arrow)) gMapSelectFlags.set(MapSelectFlag::enableArrow); - MapInvalidateTileFull(trackPos); break; } default: @@ -3354,7 +3352,6 @@ namespace OpenRCT2::Ui::Windows { int32_t z; - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enable); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); gMapSelectFlags.unset(MapSelectFlag::enableArrow); @@ -3362,7 +3359,6 @@ namespace OpenRCT2::Ui::Windows if (!mapCoords) { RideConstructionInvalidateCurrentTrack(); - MapInvalidateMapSelectionTiles(); return; } @@ -3375,8 +3371,8 @@ namespace OpenRCT2::Ui::Windows gMapSelectFlags.unset(MapSelectFlag::green); gMapSelectArrowPosition = CoordsXYZ{ *mapCoords, z }; gMapSelectArrowDirection = _currentTrackPieceDirection; - gMapSelectionTiles.clear(); - gMapSelectionTiles.push_back(*mapCoords); + MapSelection::clearSelectedTiles(); + MapSelection::addSelectedTile(*mapCoords); RideId rideIndex; OpenRCT2::TrackElemType trackType; @@ -3386,7 +3382,6 @@ namespace OpenRCT2::Ui::Windows &trackType, &trackDirection, &rideIndex, &liftHillAndAlternativeState, nullptr, nullptr)) { RideConstructionInvalidateCurrentTrack(); - MapInvalidateMapSelectionTiles(); return; } _currentTrackPieceType = trackType; @@ -3418,7 +3413,7 @@ namespace OpenRCT2::Ui::Windows if (gMapSelectFlags.has(MapSelectFlag::enableConstruct)) { int32_t highestZ = 0; - for (const auto& selectedTile : gMapSelectionTiles) + for (const auto& selectedTile : MapSelection::getSelectedTiles()) { if (MapIsLocationValid(selectedTile)) { @@ -3446,13 +3441,12 @@ namespace OpenRCT2::Ui::Windows _currentTrackBegin.z = z; if (_currentTrackSelectionFlags.has(TrackSelectionFlag::track) && _currentTrackBegin == _previousTrackPiece) { - MapInvalidateMapSelectionTiles(); return; } _previousTrackPiece = _currentTrackBegin; // search for appropriate z value for ghost, up to max ride height - int numAttempts = (z <= MAX_TRACK_HEIGHT ? ((MAX_TRACK_HEIGHT - z) / kCoordsZStep + 1) : 2); + int numAttempts = (z <= kMaximumTrackHeight ? ((kMaximumTrackHeight - z) / kCoordsZStep + 1) : 2); if (rtd.specialType == RtdSpecialType::maze) { @@ -3475,7 +3469,6 @@ namespace OpenRCT2::Ui::Windows auto intent = Intent(INTENT_ACTION_UPDATE_MAZE_CONSTRUCTION); ContextBroadcastIntent(&intent); - MapInvalidateMapSelectionTiles(); return; } @@ -3564,7 +3557,6 @@ namespace OpenRCT2::Ui::Windows } WindowRideConstructionUpdateActiveElements(); - MapInvalidateMapSelectionTiles(); } /** @@ -3573,8 +3565,6 @@ namespace OpenRCT2::Ui::Windows */ void RideConstructionToolupdateEntranceExit(const ScreenCoordsXY& screenCoords) { - MapInvalidateSelectionRect(); - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enable); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); gMapSelectFlags.unset(MapSelectFlag::enableArrow); @@ -3591,7 +3581,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectPositionB = entranceOrExitCoords; gMapSelectArrowPosition = entranceOrExitCoords; gMapSelectArrowDirection = DirectionReverse(entranceOrExitCoords.direction); - MapInvalidateSelectionRect(); entranceOrExitCoords.direction = DirectionReverse(gRideEntranceExitPlaceDirection); StationIndex stationNum = gRideEntranceExitPlaceStationIndex; @@ -3619,7 +3608,6 @@ namespace OpenRCT2::Ui::Windows WindowBase* w; - MapInvalidateMapSelectionTiles(); RideConstructionInvalidateCurrentTrack(); CoordsXYZ mapCoords{}; @@ -3636,7 +3624,7 @@ namespace OpenRCT2::Ui::Windows highestZ = 0; if (gMapSelectFlags.has(MapSelectFlag::enableConstruct)) { - for (const auto& selectedTile : gMapSelectionTiles) + for (const auto& selectedTile : MapSelection::getSelectedTiles()) { if (!MapIsLocationValid(selectedTile)) continue; @@ -3689,7 +3677,7 @@ namespace OpenRCT2::Ui::Windows } // search for z value to build at, up to max ride height - int numAttempts = (z <= MAX_TRACK_HEIGHT ? ((MAX_TRACK_HEIGHT - z) / kCoordsZStep + 1) : 2); + int numAttempts = (z <= kMaximumTrackHeight ? ((kMaximumTrackHeight - z) / kCoordsZStep + 1) : 2); const auto& rtd = ride->getRideTypeDescriptor(); if (rtd.specialType == RtdSpecialType::maze) @@ -3712,25 +3700,25 @@ namespace OpenRCT2::Ui::Windows gDisableErrorWindowSound = true; auto gameAction = GameActions::MazeSetTrackAction( - CoordsXYZD{ _currentTrackBegin, 0 }, true, _currentRideIndex, GC_SET_MAZE_TRACK_BUILD); + CoordsXYZD{ _currentTrackBegin, 0 }, true, _currentRideIndex, MazeBuildMode::build); auto mazeSetTrackResult = GameActions::Execute(&gameAction, getGameState()); - if (mazeSetTrackResult.Error == GameActions::Status::Ok) + if (mazeSetTrackResult.error == GameActions::Status::ok) { - _trackPlaceCost = mazeSetTrackResult.Cost; + _trackPlaceCost = mazeSetTrackResult.cost; _trackPlaceErrorMessage = kStringIdNone; } else { _trackPlaceCost = kMoney64Undefined; - _trackPlaceErrorMessage = std::get(mazeSetTrackResult.ErrorMessage); + _trackPlaceErrorMessage = std::get(mazeSetTrackResult.errorMessage); } gDisableErrorWindowSound = false; - if (mazeSetTrackResult.Error != GameActions::Status::Ok) + if (mazeSetTrackResult.error != GameActions::Status::ok) { _rideConstructionState = RideConstructionState::Place; - StringId errorText = std::get(mazeSetTrackResult.ErrorMessage); + StringId errorText = std::get(mazeSetTrackResult.errorMessage); z -= 8; if (errorText == STR_NOT_ENOUGH_CASH_REQUIRES || errorText == STR_CAN_ONLY_BUILD_THIS_UNDERWATER || errorText == STR_CAN_ONLY_BUILD_THIS_ON_WATER || errorText == STR_RIDE_CANT_BUILD_THIS_UNDERWATER @@ -3742,7 +3730,7 @@ namespace OpenRCT2::Ui::Windows if (w != nullptr) { ToolSet(*w, WIDX_CONSTRUCT, Tool::crosshair); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); _trackPlaceCtrlState = false; _trackPlaceShiftState = false; } @@ -3837,14 +3825,14 @@ namespace OpenRCT2::Ui::Windows switch (_currentlySelectedTrack.curve) { - case TrackCurve::LeftSmall: + case TrackCurve::leftSmall: if (!widgetIsDisabled(*w, WIDX_LEFT_CURVE_VERY_SMALL) && w->widgets[WIDX_LEFT_CURVE_VERY_SMALL].type != WidgetType::empty) { w->onMouseDown(WIDX_LEFT_CURVE_VERY_SMALL); } break; - case TrackCurve::Left: + case TrackCurve::left: if (!widgetIsDisabled(*w, WIDX_LEFT_CURVE_SMALL) && w->widgets[WIDX_LEFT_CURVE_SMALL].type != WidgetType::empty) { w->onMouseDown(WIDX_LEFT_CURVE_SMALL); @@ -3860,7 +3848,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::LeftLarge: + case TrackCurve::leftLarge: if (!widgetIsDisabled(*w, WIDX_LEFT_CURVE) && w->widgets[WIDX_LEFT_CURVE].type != WidgetType::empty) { w->onMouseDown(WIDX_LEFT_CURVE); @@ -3881,7 +3869,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::None: + case TrackCurve::none: if (!widgetIsDisabled(*w, WIDX_LEFT_CURVE_LARGE) && w->widgets[WIDX_LEFT_CURVE_LARGE].type != WidgetType::empty) { w->onMouseDown(WIDX_LEFT_CURVE_LARGE); @@ -3906,7 +3894,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::RightLarge: + case TrackCurve::rightLarge: if (!widgetIsDisabled(*w, WIDX_STRAIGHT) && w->widgets[WIDX_STRAIGHT].type != WidgetType::empty) { w->onMouseDown(WIDX_STRAIGHT); @@ -3936,7 +3924,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::Right: + case TrackCurve::right: if (!widgetIsDisabled(*w, WIDX_RIGHT_CURVE_LARGE) && w->widgets[WIDX_RIGHT_CURVE_LARGE].type != WidgetType::empty) { @@ -3971,7 +3959,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::RightSmall: + case TrackCurve::rightSmall: if (!widgetIsDisabled(*w, WIDX_RIGHT_CURVE) && w->widgets[WIDX_RIGHT_CURVE].type != WidgetType::empty) { w->onMouseDown(WIDX_RIGHT_CURVE); @@ -4011,7 +3999,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::RightVerySmall: + case TrackCurve::rightVerySmall: if (!widgetIsDisabled(*w, WIDX_RIGHT_CURVE_SMALL) && w->widgets[WIDX_RIGHT_CURVE_SMALL].type != WidgetType::empty) { @@ -4056,7 +4044,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::LeftVerySmall: + case TrackCurve::leftVerySmall: break; } } @@ -4075,14 +4063,14 @@ namespace OpenRCT2::Ui::Windows switch (_currentlySelectedTrack.curve) { - case TrackCurve::RightSmall: + case TrackCurve::rightSmall: if (!widgetIsDisabled(*w, WIDX_RIGHT_CURVE_VERY_SMALL) && w->widgets[WIDX_RIGHT_CURVE_VERY_SMALL].type != WidgetType::empty) { w->onMouseDown(WIDX_RIGHT_CURVE_VERY_SMALL); } break; - case TrackCurve::Right: + case TrackCurve::right: if (!widgetIsDisabled(*w, WIDX_RIGHT_CURVE_SMALL) && w->widgets[WIDX_RIGHT_CURVE_SMALL].type != WidgetType::empty) { @@ -4099,7 +4087,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::RightLarge: + case TrackCurve::rightLarge: if (!widgetIsDisabled(*w, WIDX_RIGHT_CURVE) && w->widgets[WIDX_RIGHT_CURVE].type != WidgetType::empty) { w->onMouseDown(WIDX_RIGHT_CURVE); @@ -4121,7 +4109,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::None: + case TrackCurve::none: if (!widgetIsDisabled(*w, WIDX_RIGHT_CURVE_LARGE) && w->widgets[WIDX_RIGHT_CURVE_LARGE].type != WidgetType::empty) { @@ -4148,7 +4136,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::LeftLarge: + case TrackCurve::leftLarge: if (!widgetIsDisabled(*w, WIDX_STRAIGHT) && w->widgets[WIDX_STRAIGHT].type != WidgetType::empty) { w->onMouseDown(WIDX_STRAIGHT); @@ -4180,7 +4168,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::Left: + case TrackCurve::left: if (!widgetIsDisabled(*w, WIDX_LEFT_CURVE_LARGE) && w->widgets[WIDX_LEFT_CURVE_LARGE].type != WidgetType::empty) { w->onMouseDown(WIDX_LEFT_CURVE_LARGE); @@ -4216,7 +4204,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::LeftSmall: + case TrackCurve::leftSmall: if (!widgetIsDisabled(*w, WIDX_LEFT_CURVE) && w->widgets[WIDX_LEFT_CURVE].type != WidgetType::empty) { w->onMouseDown(WIDX_LEFT_CURVE); @@ -4257,7 +4245,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::LeftVerySmall: + case TrackCurve::leftVerySmall: if (!widgetIsDisabled(*w, WIDX_LEFT_CURVE_SMALL) && w->widgets[WIDX_LEFT_CURVE_SMALL].type != WidgetType::empty) { w->onMouseDown(WIDX_LEFT_CURVE_SMALL); @@ -4302,7 +4290,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackCurve::RightVerySmall: + case TrackCurve::rightVerySmall: break; } } @@ -4349,20 +4337,20 @@ namespace OpenRCT2::Ui::Windows switch (_currentTrackPitchEnd) { - case TrackPitch::Down60: + case TrackPitch::down60: if (IsTrackEnabled(TrackGroup::slopeVertical) && !widgetIsDisabled(*w, WIDX_SLOPE_DOWN_VERTICAL) && w->widgets[WIDX_SLOPE_DOWN_VERTICAL].type != WidgetType::empty) { w->onMouseDown(WIDX_SLOPE_DOWN_VERTICAL); } break; - case TrackPitch::Down25: + case TrackPitch::down25: if (!widgetIsDisabled(*w, WIDX_SLOPE_DOWN_STEEP) && w->widgets[WIDX_SLOPE_DOWN_STEEP].type != WidgetType::empty) { w->onMouseDown(WIDX_SLOPE_DOWN_STEEP); } break; - case TrackPitch::None: + case TrackPitch::none: if (!widgetIsDisabled(*w, WIDX_SLOPE_DOWN) && w->widgets[WIDX_SLOPE_DOWN].type != WidgetType::empty) { w->onMouseDown(WIDX_SLOPE_DOWN); @@ -4381,7 +4369,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackPitch::Up25: + case TrackPitch::up25: if (!widgetIsDisabled(*w, WIDX_LEVEL) && w->widgets[WIDX_LEVEL].type != WidgetType::empty) { w->onMouseDown(WIDX_LEVEL); @@ -4400,7 +4388,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackPitch::Up60: + case TrackPitch::up60: if (!widgetIsDisabled(*w, WIDX_SLOPE_UP) && w->widgets[WIDX_SLOPE_UP].type != WidgetType::empty) { w->onMouseDown(WIDX_SLOPE_UP); @@ -4427,7 +4415,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackPitch::Up90: + case TrackPitch::up90: if (IsTrackEnabled(TrackGroup::slopeVertical) && !widgetIsDisabled(*w, WIDX_SLOPE_UP_STEEP) && w->widgets[WIDX_SLOPE_UP_VERTICAL].type != WidgetType::empty) { @@ -4450,20 +4438,20 @@ namespace OpenRCT2::Ui::Windows switch (_currentTrackPitchEnd) { - case TrackPitch::Up60: + case TrackPitch::up60: if (IsTrackEnabled(TrackGroup::slopeVertical) && !widgetIsDisabled(*w, WIDX_SLOPE_UP_VERTICAL) && w->widgets[WIDX_SLOPE_UP_VERTICAL].type != WidgetType::empty) { w->onMouseDown(WIDX_SLOPE_UP_VERTICAL); } break; - case TrackPitch::Up25: + case TrackPitch::up25: if (!widgetIsDisabled(*w, WIDX_SLOPE_UP_STEEP) && w->widgets[WIDX_SLOPE_UP_STEEP].type != WidgetType::empty) { w->onMouseDown(WIDX_SLOPE_UP_STEEP); } break; - case TrackPitch::None: + case TrackPitch::none: if (!widgetIsDisabled(*w, WIDX_SLOPE_UP) && w->widgets[WIDX_SLOPE_UP].type != WidgetType::empty) { w->onMouseDown(WIDX_SLOPE_UP); @@ -4482,7 +4470,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackPitch::Down25: + case TrackPitch::down25: if (!widgetIsDisabled(*w, WIDX_LEVEL) && w->widgets[WIDX_LEVEL].type != WidgetType::empty) { w->onMouseDown(WIDX_LEVEL); @@ -4501,7 +4489,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackPitch::Down60: + case TrackPitch::down60: if (!widgetIsDisabled(*w, WIDX_SLOPE_DOWN) && w->widgets[WIDX_SLOPE_DOWN].type != WidgetType::empty) { w->onMouseDown(WIDX_SLOPE_DOWN); @@ -4528,7 +4516,7 @@ namespace OpenRCT2::Ui::Windows return; } break; - case TrackPitch::Down90: + case TrackPitch::down90: if (IsTrackEnabled(TrackGroup::slopeVertical) && !widgetIsDisabled(*w, WIDX_SLOPE_DOWN_STEEP) && w->widgets[WIDX_SLOPE_DOWN_STEEP].type != WidgetType::empty) { @@ -4564,13 +4552,13 @@ namespace OpenRCT2::Ui::Windows switch (_currentTrackRollEnd) { - case TrackRoll::None: + case TrackRoll::none: if (!widgetIsDisabled(*w, WIDX_BANK_LEFT) && w->widgets[WIDX_BANK_LEFT].type != WidgetType::empty) { w->onMouseDown(WIDX_BANK_LEFT); } break; - case TrackRoll::Right: + case TrackRoll::right: if (!widgetIsDisabled(*w, WIDX_BANK_STRAIGHT) && w->widgets[WIDX_BANK_STRAIGHT].type != WidgetType::empty) { w->onMouseDown(WIDX_BANK_STRAIGHT); @@ -4601,13 +4589,13 @@ namespace OpenRCT2::Ui::Windows switch (_currentTrackRollEnd) { - case TrackRoll::None: + case TrackRoll::none: if (!widgetIsDisabled(*w, WIDX_BANK_RIGHT) && w->widgets[WIDX_BANK_RIGHT].type != WidgetType::empty) { w->onMouseDown(WIDX_BANK_RIGHT); } break; - case TrackRoll::Left: + case TrackRoll::left: if (!widgetIsDisabled(*w, WIDX_BANK_STRAIGHT) && w->widgets[WIDX_BANK_STRAIGHT].type != WidgetType::empty) { w->onMouseDown(WIDX_BANK_STRAIGHT); @@ -4715,16 +4703,16 @@ namespace OpenRCT2::Ui::Windows if (_rideConstructionState2 == RideConstructionState::Selected || _rideConstructionState2 == RideConstructionState::Front) { - if (type == TrackElemType::MiddleStation || type == TrackElemType::BeginStation) + if (type == TrackElemType::middleStation || type == TrackElemType::beginStation) { - type = TrackElemType::EndStation; + type = TrackElemType::endStation; } } if (_rideConstructionState2 == RideConstructionState::Back) { - if (type == TrackElemType::MiddleStation) + if (type == TrackElemType::middleStation) { - type = TrackElemType::BeginStation; + type = TrackElemType::beginStation; } } if (Network::GetMode() == Network::Mode::client) @@ -4770,31 +4758,30 @@ namespace OpenRCT2::Ui::Windows const auto& rtd = ride->getRideTypeDescriptor(); if (rtd.specialType == RtdSpecialType::maze) { - int32_t flags = GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST; - auto gameAction = GameActions::MazeSetTrackAction( - CoordsXYZD{ trackPos, 0 }, true, rideIndex, GC_SET_MAZE_TRACK_BUILD); + CommandFlags flags = { CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }; + auto gameAction = GameActions::MazeSetTrackAction(CoordsXYZD{ trackPos, 0 }, true, rideIndex, MazeBuildMode::build); gameAction.SetFlags(flags); auto result = GameActions::Execute(&gameAction, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) return kMoney64Undefined; _unkF440C5 = { trackPos, static_cast(trackDirection) }; _currentTrackSelectionFlags.set(TrackSelectionFlag::track); ViewportSetVisibility(ViewportVisibility::undergroundViewOff); - if (_currentTrackPitchEnd != TrackPitch::None) + if (_currentTrackPitchEnd != TrackPitch::none) ViewportSetVisibility(ViewportVisibility::trackHeights); - return result.Cost; + return result.cost; } auto trackPlaceAction = GameActions::TrackPlaceAction( rideIndex, trackType, ride->type, { trackPos, static_cast(trackDirection) }, 0, 0, 0, liftHillAndAlternativeState, false); - trackPlaceAction.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + trackPlaceAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); // This command must not be sent over the network auto res = GameActions::Execute(&trackPlaceAction, getGameState()); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) return kMoney64Undefined; int16_t zBegin{}, zEnd{}; @@ -4813,20 +4800,20 @@ namespace OpenRCT2::Ui::Windows _unkF440C5 = { trackPos.x, trackPos.y, trackPos.z + zBegin, static_cast(trackDirection) }; _currentTrackSelectionFlags.set(TrackSelectionFlag::track); - const auto resultData = res.GetData(); + const auto resultData = res.getData(); const auto visiblity = (resultData.GroundFlags & ELEMENT_IS_UNDERGROUND) ? ViewportVisibility::undergroundViewOn : ViewportVisibility::undergroundViewOff; ViewportSetVisibility(visiblity); - if (_currentTrackPitchEnd != TrackPitch::None) + if (_currentTrackPitchEnd != TrackPitch::none) ViewportSetVisibility(ViewportVisibility::trackHeights); - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) { // Set height to where the next track piece would begin VirtualFloorSetHeight(trackPos.z - zBegin + zEnd); } - return res.Cost; + return res.cost; } static std::pair WindowRideConstructionUpdateStateGetTrackElement() @@ -4845,13 +4832,13 @@ namespace OpenRCT2::Ui::Windows } auto selectedTrack = _currentlySelectedTrack; - if (selectedTrack == TrackElemType::None) + if (selectedTrack == TrackElemType::none) { - return std::make_pair(false, OpenRCT2::TrackElemType::Flat); + return std::make_pair(false, OpenRCT2::TrackElemType::flat); } bool startsDiagonal = (_currentTrackPieceDirection & (1 << 2)) != 0; - if (selectedTrack == TrackCurve::LeftLarge || selectedTrack == TrackCurve::RightLarge) + if (selectedTrack == TrackCurve::leftLarge || selectedTrack == TrackCurve::rightLarge) { if (_rideConstructionState == RideConstructionState::Back) { @@ -4863,49 +4850,49 @@ namespace OpenRCT2::Ui::Windows { auto trackPiece = GetTrackTypeFromCurve( selectedTrack.curve, startsDiagonal, startSlope, endSlope, startBank, endBank); - if (trackPiece != TrackElemType::None) + if (trackPiece != TrackElemType::none) return std::make_pair(true, trackPiece); else - return std::make_pair(false, OpenRCT2::TrackElemType::Flat); + return std::make_pair(false, OpenRCT2::TrackElemType::flat); } auto asTrackType = selectedTrack.trackType; switch (asTrackType) { - case TrackElemType::EndStation: - case TrackElemType::SBendLeft: - case TrackElemType::SBendRight: - if (startSlope != TrackPitch::None || endSlope != TrackPitch::None) + case TrackElemType::endStation: + case TrackElemType::sBendLeft: + case TrackElemType::sBendRight: + if (startSlope != TrackPitch::none || endSlope != TrackPitch::none) { - return std::make_pair(false, OpenRCT2::TrackElemType::Flat); + return std::make_pair(false, OpenRCT2::TrackElemType::flat); } - if (startBank != TrackRoll::None || endBank != TrackRoll::None) + if (startBank != TrackRoll::none || endBank != TrackRoll::none) { - return std::make_pair(false, OpenRCT2::TrackElemType::Flat); + return std::make_pair(false, OpenRCT2::TrackElemType::flat); } return std::make_pair(true, asTrackType); - case TrackElemType::LeftVerticalLoop: - case TrackElemType::RightVerticalLoop: - if (startBank != TrackRoll::None || endBank != TrackRoll::None) + case TrackElemType::leftVerticalLoop: + case TrackElemType::rightVerticalLoop: + if (startBank != TrackRoll::none || endBank != TrackRoll::none) { - return std::make_pair(false, OpenRCT2::TrackElemType::Flat); + return std::make_pair(false, OpenRCT2::TrackElemType::flat); } if (_rideConstructionState == RideConstructionState::Back) { - if (endSlope != TrackPitch::Down25) + if (endSlope != TrackPitch::down25) { - return std::make_pair(false, OpenRCT2::TrackElemType::Flat); + return std::make_pair(false, OpenRCT2::TrackElemType::flat); } } else { - if (startSlope != TrackPitch::Up25) + if (startSlope != TrackPitch::up25) { - return std::make_pair(false, OpenRCT2::TrackElemType::Flat); + return std::make_pair(false, OpenRCT2::TrackElemType::flat); } } @@ -4966,20 +4953,20 @@ namespace OpenRCT2::Ui::Windows { switch (trackType) { - case TrackElemType::FlatToUp60: - trackType = TrackElemType::FlatToUp60LongBase; + case TrackElemType::flatToUp60: + trackType = TrackElemType::flatToUp60LongBase; break; - case TrackElemType::Up60ToFlat: - trackType = TrackElemType::Up60ToFlatLongBase; + case TrackElemType::up60ToFlat: + trackType = TrackElemType::up60ToFlatLongBase; break; - case TrackElemType::FlatToDown60: - trackType = TrackElemType::FlatToDown60LongBase; + case TrackElemType::flatToDown60: + trackType = TrackElemType::flatToDown60LongBase; break; - case TrackElemType::Down60ToFlat: - trackType = TrackElemType::Down60ToFlatLongBase; + case TrackElemType::down60ToFlat: + trackType = TrackElemType::down60ToFlatLongBase; break; default: @@ -4991,20 +4978,20 @@ namespace OpenRCT2::Ui::Windows { switch (trackType) { - case TrackElemType::DiagFlatToUp60: - trackType = TrackElemType::DiagFlatToUp60LongBase; + case TrackElemType::diagFlatToUp60: + trackType = TrackElemType::diagFlatToUp60LongBase; break; - case TrackElemType::DiagUp60ToFlat: - trackType = TrackElemType::DiagUp60ToFlatLongBase; + case TrackElemType::diagUp60ToFlat: + trackType = TrackElemType::diagUp60ToFlatLongBase; break; - case TrackElemType::DiagFlatToDown60: - trackType = TrackElemType::DiagFlatToDown60LongBase; + case TrackElemType::diagFlatToDown60: + trackType = TrackElemType::diagFlatToDown60LongBase; break; - case TrackElemType::DiagDown60ToFlat: - trackType = TrackElemType::DiagDown60ToFlatLongBase; + case TrackElemType::diagDown60ToFlat: + trackType = TrackElemType::diagDown60ToFlatLongBase; break; default: @@ -5021,7 +5008,7 @@ namespace OpenRCT2::Ui::Windows auto coveredVariant = ted.alternativeType; // this method limits the track element types that can be used - if (coveredVariant != TrackElemType::None && (availableGroups.get(EnumValue(ted.definition.group)))) + if (coveredVariant != TrackElemType::none && (availableGroups.get(EnumValue(ted.definition.group)))) { trackType = coveredVariant; if (!getGameState().cheats.enableChainLiftOnAllTrack) @@ -5063,13 +5050,13 @@ namespace OpenRCT2::Ui::Windows bool turnOffLiftHill = false; if (!IsTrackEnabled(TrackGroup::liftHillCurve)) { - if (ted.flags & TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT) + if (ted.flags.has(TrackElementFlag::curveAllowsLift)) { turnOffLiftHill = true; } } - if (!(ted.flags & TRACK_ELEM_FLAG_ALLOW_LIFT_HILL)) + if (!ted.flags.has(TrackElementFlag::allowLiftHill)) { turnOffLiftHill = true; } @@ -5079,7 +5066,7 @@ namespace OpenRCT2::Ui::Windows liftHillAndInvertedState.unset(LiftHillAndInverted::liftHill); _currentTrackHasLiftHill = false; - if (trackType == TrackElemType::LeftCurvedLiftHill || trackType == TrackElemType::RightCurvedLiftHill) + if (trackType == TrackElemType::leftCurvedLiftHill || trackType == TrackElemType::rightCurvedLiftHill) { liftHillAndInvertedState.set(LiftHillAndInverted::liftHill); } @@ -5151,7 +5138,7 @@ namespace OpenRCT2::Ui::Windows const auto& rtd = ride->getRideTypeDescriptor(); if (rtd.specialType == RtdSpecialType::maze) { - const int32_t flags = GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST; + const CommandFlags flags = { CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }; const CoordsXYZD quadrants[kNumOrthogonalDirections] = { { x, y, z, 0 }, { x, y + 16, z, 1 }, @@ -5160,7 +5147,7 @@ namespace OpenRCT2::Ui::Windows }; for (const auto& quadrant : quadrants) { - auto gameAction = GameActions::MazeSetTrackAction(quadrant, false, rideIndex, GC_SET_MAZE_TRACK_FILL); + auto gameAction = GameActions::MazeSetTrackAction(quadrant, false, rideIndex, MazeBuildMode::fill); gameAction.SetFlags(flags); auto res = GameActions::Execute(&gameAction, getGameState()); } @@ -5181,8 +5168,7 @@ namespace OpenRCT2::Ui::Windows auto trackRemoveAction = GameActions::TrackRemoveAction{ trackType, trackSequence, { next_track.x, next_track.y, z, static_cast(direction) } }; - trackRemoveAction.SetFlags( - GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + trackRemoveAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); GameActions::Execute(&trackRemoveAction, getGameState()); } } diff --git a/src/openrct2-ui/windows/RideList.cpp b/src/openrct2-ui/windows/RideList.cpp index 8675d5872945..ac8126697b02 100644 --- a/src/openrct2-ui/windows/RideList.cpp +++ b/src/openrct2-ui/windows/RideList.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -311,7 +311,7 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[0] = Dropdown::PlainMenuLabel(STR_CLOSE_ALL); gDropdown.items[1] = Dropdown::PlainMenuLabel(STR_OPEN_ALL); WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), colours[1], 0, 2); + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() - 1, colours[1], 0, 2); } else if (widgetIndex == WIDX_HEADER_CUSTOMISE) { @@ -343,11 +343,11 @@ namespace OpenRCT2::Ui::Windows const auto& headerWidget = widgets[WIDX_HEADER_OTHER]; const auto& customWidget = widgets[WIDX_HEADER_CUSTOMISE]; - auto totalWidth = headerWidget.width() + customWidget.width(); + auto totalWidth = headerWidget.width() - 1 + customWidget.width() - 1; WindowDropdownShowTextCustomWidth( - { windowPos.x + headerWidget.left, windowPos.y + headerWidget.top }, headerWidget.height(), colours[1], 0, - Dropdown::Flag::StayOpen, numItems, totalWidth); + { windowPos.x + headerWidget.left, windowPos.y + headerWidget.top }, headerWidget.height() - 1, colours[1], + 0, Dropdown::Flag::StayOpen, numItems, totalWidth); } } @@ -567,7 +567,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_HEADER_CUSTOMISE].right = widgets[WIDX_LIST].right - 1; widgets[WIDX_HEADER_CUSTOMISE].left = widgets[WIDX_HEADER_CUSTOMISE].right - 14; - auto columnWidth = (widgets[WIDX_LIST].width() - widgets[WIDX_HEADER_CUSTOMISE].width()) / 2; + auto columnWidth = (widgets[WIDX_LIST].width() - 1 - widgets[WIDX_HEADER_CUSTOMISE].width() - 1) / 2; widgets[WIDX_HEADER_OTHER].right = widgets[WIDX_HEADER_CUSTOMISE].left - 1; widgets[WIDX_HEADER_OTHER].left = widgets[WIDX_HEADER_OTHER].right - columnWidth + 1; @@ -628,7 +628,7 @@ namespace OpenRCT2::Ui::Windows * * rct2: 0x006B3235 */ - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); DrawTabImages(rt); @@ -642,9 +642,9 @@ namespace OpenRCT2::Ui::Windows ft.Add(strId); ft.Add(indicatorId); - auto cdpi = const_cast(rt); + auto cRT = const_cast(rt); DrawTextEllipsised( - cdpi, windowPos + ScreenCoordsXY{ widget.left + 1, widget.top + 1 }, widget.width(), + cRT, windowPos + ScreenCoordsXY{ widget.left + 1, widget.top + 1 }, widget.width() - 1, STR_RIDE_LIST_HEADER_FORMAT, ft, { colours[1] }); }; @@ -665,7 +665,7 @@ namespace OpenRCT2::Ui::Windows * * rct2: 0x006B3240 */ - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { auto rtCoords = ScreenCoordsXY{ rt.x, rt.y }; Rectangle::fill( @@ -700,7 +700,7 @@ namespace OpenRCT2::Ui::Windows ridePtr->formatNameTo(ft); auto& nameHeader = widgets[WIDX_HEADER_NAME]; - DrawTextEllipsised(rt, { 0, y - 1 }, nameHeader.width() - 2, format, ft); + DrawTextEllipsised(rt, { 0, y - 1 }, nameHeader.width() - 3, format, ft); // Ride information ft = Formatter(); @@ -907,7 +907,7 @@ namespace OpenRCT2::Ui::Windows } auto infoHeader = widgets[WIDX_HEADER_OTHER]; - DrawTextEllipsised(rt, { infoHeader.left - 4, y - 1 }, infoHeader.width() - 2, format, ft); + DrawTextEllipsised(rt, { infoHeader.left - 4, y - 1 }, infoHeader.width() - 3, format, ft); y += kScrollableRowHeight; } } @@ -922,7 +922,7 @@ namespace OpenRCT2::Ui::Windows * * rct2: 0x006B38EA */ - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { int32_t sprite_idx; @@ -1018,9 +1018,9 @@ namespace OpenRCT2::Ui::Windows // Get the ride name once and use it for both filtering and storage auto rideName = rideRef.getName(); - if (rideRef.windowInvalidateFlags & RIDE_INVALIDATE_RIDE_LIST) + if (rideRef.windowInvalidateFlags.has(RideInvalidateFlag::list)) { - rideRef.windowInvalidateFlags &= ~RIDE_INVALIDATE_RIDE_LIST; + rideRef.windowInvalidateFlags.unset(RideInvalidateFlag::list); } const auto filterApplies = IsFiltered(rideName); diff --git a/src/openrct2-ui/windows/SavePrompt.cpp b/src/openrct2-ui/windows/SavePrompt.cpp index b92126bc5a12..a9885235d105 100644 --- a/src/openrct2-ui/windows/SavePrompt.cpp +++ b/src/openrct2-ui/windows/SavePrompt.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -190,7 +190,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); } diff --git a/src/openrct2-ui/windows/ScenarioSelect.cpp b/src/openrct2-ui/windows/ScenarioSelect.cpp index 23e636285565..f4ef1ed356df 100644 --- a/src/openrct2-ui/windows/ScenarioSelect.cpp +++ b/src/openrct2-ui/windows/ScenarioSelect.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -267,7 +267,7 @@ namespace OpenRCT2::Ui::Windows invalidate(); } - ScreenCoordsXY DrawPreview(RenderTarget& rt, ScreenCoordsXY screenPos) + ScreenCoordsXY DrawPreview(Drawing::RenderTarget& rt, ScreenCoordsXY screenPos) { auto targetImageType = PreviewImageType::miniMap; if (Config::Get().interface.scenarioPreviewScreenshots) @@ -302,7 +302,7 @@ namespace OpenRCT2::Ui::Windows return frameEndPos; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -540,9 +540,9 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { - uint8_t paletteIndex = ColourMapA[colours[1].colour].mid_light; + auto paletteIndex = ColourMapA[colours[1].colour].mid_light; GfxClear(rt, paletteIndex); StringId highlighted_format = STR_WINDOW_COLOUR_2_STRINGID; @@ -554,7 +554,7 @@ namespace OpenRCT2::Ui::Windows } const auto& listWidget = widgets[WIDX_SCENARIOLIST]; - int32_t listWidth = listWidget.width() - 12; + int32_t listWidth = listWidget.width() - 13; const int32_t scenarioItemHeight = GetScenarioListItemSize(); @@ -611,7 +611,7 @@ namespace OpenRCT2::Ui::Windows if (isCompleted) { // Draw completion tick - GfxDrawSprite(rt, ImageId(SPR_MENU_CHECKMARK), { widgets[WIDX_SCENARIOLIST].width() - 45, y + 1 }); + GfxDrawSprite(rt, ImageId(SPR_MENU_CHECKMARK), { widgets[WIDX_SCENARIOLIST].width() - 46, y + 1 }); // Draw completion score u8string completedByName = "???"; @@ -636,11 +636,11 @@ namespace OpenRCT2::Ui::Windows } private: - void DrawCategoryHeading(RenderTarget& rt, int32_t left, int32_t right, int32_t y, StringId stringId) const + void DrawCategoryHeading(Drawing::RenderTarget& rt, int32_t left, int32_t right, int32_t y, StringId stringId) const { auto baseColour = colours[1]; - colour_t lightColour = ColourMapA[baseColour.colour].lighter; - colour_t darkColour = ColourMapA[baseColour.colour].mid_dark; + auto lightColour = ColourMapA[baseColour.colour].lighter; + auto darkColour = ColourMapA[baseColour.colour].mid_dark; // Draw string int32_t centreX = (left + right) / 2; diff --git a/src/openrct2-ui/windows/Scenery.cpp b/src/openrct2-ui/windows/Scenery.cpp index 378c591eaf8a..ed5c7485f3ed 100644 --- a/src/openrct2-ui/windows/Scenery.cpp +++ b/src/openrct2-ui/windows/Scenery.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -29,11 +29,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -66,6 +68,7 @@ #include using namespace OpenRCT2::Drawing; +using OpenRCT2::GameActions::CommandFlag; namespace OpenRCT2::Ui::Windows { @@ -206,6 +209,12 @@ namespace OpenRCT2::Ui::Windows } }; + struct ProvisionalWallTile + { + CoordsXYZD location; + int32_t calculatedZ; + }; + std::vector _tabEntries; int32_t _requiredWidth; int32_t _actualMinHeight; @@ -216,6 +225,18 @@ namespace OpenRCT2::Ui::Windows uint8_t _unkF64F0E{ 0 }; int16_t _unkF64F0A{ 0 }; + CoordsXY _dragStartPos{}; + /** + * When placing fences in the air using Shift, the user may shift their mouse to the left or right. + * We save this position to avoid detecting a wall drag where there isn’t one. + */ + CoordsXY _dragStartHoverPos{}; + CoordsXY _dragEndPos{}; + uint8_t _startEdge{}; + GameActions::Result _lastProvisionalError{}; + bool _inDragMode = false; + std::vector _provisionalTiles{}; + public: void onOpen() override { @@ -255,6 +276,7 @@ namespace OpenRCT2::Ui::Windows void onClose() override { SceneryRemoveGhostToolPlacement(); + removeProvisionalTilesFromMap(); HideGridlines(); ViewportSetVisibility(ViewportVisibility::standard); @@ -486,7 +508,7 @@ namespace OpenRCT2::Ui::Windows else { const auto& listWidget = widgets[WIDX_SCENERY_LIST]; - const auto nonListHeight = height - listWidget.height() + 2; + const auto nonListHeight = height - listWidget.height() - 1 + 2; const auto numRows = static_cast(CountRows()); const auto maxContentHeight = numRows * kSceneryButtonHeight; @@ -533,8 +555,20 @@ namespace OpenRCT2::Ui::Windows if (!isToolActive(WindowClass::scenery)) { - close(); - return; + if (_inDragMode) + { + removeProvisionalTilesFromMap(); + _provisionalTiles.clear(); + _inDragMode = false; + + ToolSet(*this, WIDX_SCENERY_BACKGROUND, Tool::arrow); + gInputFlags.set(InputFlag::allowRightMouseRemoval); + } + else + { + close(); + return; + } } if (gWindowSceneryEyedropperEnabled) @@ -557,23 +591,39 @@ namespace OpenRCT2::Ui::Windows } else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_LARGE) { - gCurrentToolId = static_cast( - ObjectManager::GetObjectEntry(tabSelectedScenery.EntryIndex)->tool_id); + const auto* sceneryEntry = ObjectManager::GetObjectEntry( + tabSelectedScenery.EntryIndex); + if (sceneryEntry != nullptr) + { + gCurrentToolId = static_cast(sceneryEntry->tool_id); + } } else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_WALL) { - gCurrentToolId = static_cast( - ObjectManager::GetObjectEntry(tabSelectedScenery.EntryIndex)->tool_id); + const auto* sceneryEntry = ObjectManager::GetObjectEntry( + tabSelectedScenery.EntryIndex); + if (sceneryEntry != nullptr) + { + gCurrentToolId = static_cast(sceneryEntry->tool_id); + } } else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_PATH_ITEM) { - gCurrentToolId = static_cast( - ObjectManager::GetObjectEntry(tabSelectedScenery.EntryIndex)->tool_id); + const auto* sceneryEntry = ObjectManager::GetObjectEntry( + tabSelectedScenery.EntryIndex); + if (sceneryEntry != nullptr) + { + gCurrentToolId = static_cast(sceneryEntry->tool_id); + } } - else - { // small scenery - gCurrentToolId = static_cast( - ObjectManager::GetObjectEntry(tabSelectedScenery.EntryIndex)->tool_id); + else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_SMALL) + { + const auto* sceneryEntry = ObjectManager::GetObjectEntry( + tabSelectedScenery.EntryIndex); + if (sceneryEntry != nullptr) + { + gCurrentToolId = static_cast(sceneryEntry->tool_id); + } } } else @@ -679,7 +729,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].type = WidgetType::flatBtn; auto* sceneryEntry = ObjectManager::GetObjectEntry(tabSelectedScenery.EntryIndex); - if (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_ROTATABLE)) + if (sceneryEntry != nullptr && sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_ROTATABLE)) { widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type = WidgetType::flatBtn; } @@ -718,7 +768,7 @@ namespace OpenRCT2::Ui::Windows if (tabSelectedScenery.SceneryType == SCENERY_TYPE_BANNER) { auto* bannerEntry = ObjectManager::GetObjectEntry(tabSelectedScenery.EntryIndex); - if (bannerEntry->flags & BANNER_ENTRY_FLAG_HAS_PRIMARY_COLOUR) + if (bannerEntry != nullptr && bannerEntry->flags & BANNER_ENTRY_FLAG_HAS_PRIMARY_COLOUR) { widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn; } @@ -726,20 +776,22 @@ namespace OpenRCT2::Ui::Windows else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_LARGE) { auto* sceneryEntry = ObjectManager::GetObjectEntry(tabSelectedScenery.EntryIndex); - - if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_PRIMARY_COLOUR - && !(sceneryEntry->flags & LARGE_SCENERY_FLAG_HIDE_PRIMARY_REMAP_BUTTON)) - widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn; - if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_SECONDARY_COLOUR - && !(sceneryEntry->flags & LARGE_SCENERY_FLAG_HIDE_SECONDARY_REMAP_BUTTON)) - widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WidgetType::colourBtn; - if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_TERTIARY_COLOUR) - widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].type = WidgetType::colourBtn; + if (sceneryEntry != nullptr) + { + if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_PRIMARY_COLOUR + && !(sceneryEntry->flags & LARGE_SCENERY_FLAG_HIDE_PRIMARY_REMAP_BUTTON)) + widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn; + if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_SECONDARY_COLOUR + && !(sceneryEntry->flags & LARGE_SCENERY_FLAG_HIDE_SECONDARY_REMAP_BUTTON)) + widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WidgetType::colourBtn; + if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_TERTIARY_COLOUR) + widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].type = WidgetType::colourBtn; + } } else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_WALL) { auto* wallEntry = ObjectManager::GetObjectEntry(tabSelectedScenery.EntryIndex); - if (wallEntry->flags & (WALL_SCENERY_HAS_PRIMARY_COLOUR | WALL_SCENERY_HAS_GLASS)) + if (wallEntry != nullptr && wallEntry->flags & (WALL_SCENERY_HAS_PRIMARY_COLOUR | WALL_SCENERY_HAS_GLASS)) { widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn; @@ -758,7 +810,8 @@ namespace OpenRCT2::Ui::Windows { auto* sceneryEntry = ObjectManager::GetObjectEntry(tabSelectedScenery.EntryIndex); - if (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR | SMALL_SCENERY_FLAG_HAS_GLASS)) + if (sceneryEntry != nullptr + && sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR | SMALL_SCENERY_FLAG_HAS_GLASS)) { widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn; @@ -823,7 +876,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].type = canFit ? WidgetType::flatBtn : WidgetType::empty; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabs(rt, windowPos); @@ -1044,7 +1097,7 @@ namespace OpenRCT2::Ui::Windows int32_t newMinHeight = getTitleBarTargetHeight() + kDescriptionHeight + 2 * kTabMargin; // Room for the search/filter widget - newMinHeight += widgets[WIDX_FILTER_TEXT_BOX].height() + 2 * kInputMargin; + newMinHeight += widgets[WIDX_FILTER_TEXT_BOX].height() - 1 + 2 * kInputMargin; // Fit *all* rows of tabs newMinHeight += static_cast(1 + (_tabEntries.size() / GetMaxTabCountInARow())) * kTabHeight; @@ -1058,7 +1111,7 @@ namespace OpenRCT2::Ui::Windows int32_t GetNumColumns() const { const auto& listWidget = widgets[WIDX_SCENERY_LIST]; - const auto contentWidth = listWidget.width() - kScrollBarWidth; + const auto contentWidth = listWidget.width() - 1 - kScrollBarWidth; return contentWidth / kSceneryButtonWidth; } @@ -1520,7 +1573,7 @@ namespace OpenRCT2::Ui::Windows return { name, price }; } - void DrawTabs(RenderTarget& rt, const ScreenCoordsXY& offset) + void DrawTabs(Drawing::RenderTarget& rt, const ScreenCoordsXY& offset) { for (size_t tabIndex = 0; tabIndex < _tabEntries.size(); tabIndex++) { @@ -1535,11 +1588,14 @@ namespace OpenRCT2::Ui::Windows } } - void DrawSceneryItem(RenderTarget& rt, ScenerySelection scenerySelection) + void DrawSceneryItem(Drawing::RenderTarget& rt, ScenerySelection scenerySelection) { if (scenerySelection.SceneryType == SCENERY_TYPE_BANNER) { auto bannerEntry = ObjectManager::GetObjectEntry(scenerySelection.EntryIndex); + if (bannerEntry == nullptr) + return; + auto imageId = ImageId(bannerEntry->image + gWindowSceneryRotation * 2, _sceneryPrimaryColour); GfxDrawSprite(rt, imageId, { 33, 40 }); GfxDrawSprite(rt, imageId.WithIndexOffset(1), { 33, 40 }); @@ -1547,6 +1603,9 @@ namespace OpenRCT2::Ui::Windows else if (scenerySelection.SceneryType == SCENERY_TYPE_LARGE) { auto sceneryEntry = ObjectManager::GetObjectEntry(scenerySelection.EntryIndex); + if (sceneryEntry == nullptr) + return; + auto imageId = ImageId(sceneryEntry->image + gWindowSceneryRotation); if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_PRIMARY_COLOUR) imageId = imageId.WithPrimary(_sceneryPrimaryColour); @@ -1559,6 +1618,9 @@ namespace OpenRCT2::Ui::Windows else if (scenerySelection.SceneryType == SCENERY_TYPE_WALL) { auto wallEntry = ObjectManager::GetObjectEntry(scenerySelection.EntryIndex); + if (wallEntry == nullptr) + return; + auto imageId = ImageId(wallEntry->image); auto spriteTop = (wallEntry->height * 2) + 0x32; if (wallEntry->flags & WALL_SCENERY_HAS_GLASS) @@ -1595,12 +1657,18 @@ namespace OpenRCT2::Ui::Windows else if (scenerySelection.SceneryType == SCENERY_TYPE_PATH_ITEM) { auto* pathAdditionEntry = ObjectManager::GetObjectEntry(scenerySelection.EntryIndex); + if (pathAdditionEntry == nullptr) + return; + auto imageId = ImageId(pathAdditionEntry->image); GfxDrawSprite(rt, imageId, { 11, 16 }); } else { auto sceneryEntry = ObjectManager::GetObjectEntry(scenerySelection.EntryIndex); + if (sceneryEntry == nullptr) + return; + auto imageId = ImageId(sceneryEntry->image + gWindowSceneryRotation); if (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR)) { @@ -1638,7 +1706,7 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { GfxClear(rt, ColourMapA[colours[1].colour].mid_light); @@ -1682,7 +1750,7 @@ namespace OpenRCT2::Ui::Windows } RenderTarget clippedRT; - if (ClipDrawPixelInfo( + if (ClipRenderTarget( clippedRT, rt, topLeft + ScreenCoordsXY{ 1, 1 }, kSceneryButtonWidth - 2, kSceneryButtonHeight - 2)) { DrawSceneryItem(clippedRT, currentSceneryGlobal); @@ -1703,7 +1771,7 @@ namespace OpenRCT2::Ui::Windows uint8_t quadrant; Direction rotation; - Sub6E1F34SmallScenery(screenPos, selection.EntryIndex, mapTile, &quadrant, &rotation); + updatePlacementSmallScenery(screenPos, selection.EntryIndex, mapTile, &quadrant, &rotation); if (mapTile.IsNull()) { @@ -1741,8 +1809,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectType = getMapSelectQuarter((quadrant ^ 2)); } - MapInvalidateSelectionRect(); - // If no change in ghost placement if ((gSceneryGhostType & SCENERY_GHOST_FLAG_0) && mapTile == gSceneryGhostPosition && quadrant == _unkF64F0E && gSceneryPlaceZ == _unkF64F0A && gSceneryPlaceObject.SceneryType == SCENERY_TYPE_SMALL @@ -1782,7 +1848,7 @@ namespace OpenRCT2::Ui::Windows CoordsXY mapTile = {}; int32_t z; - Sub6E1F34PathItem(screenPos, selection.EntryIndex, mapTile, &z); + updatePlacementPathItem(screenPos, selection.EntryIndex, mapTile, &z); if (mapTile.IsNull()) { @@ -1797,8 +1863,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectPositionB.y = mapTile.y; gMapSelectType = MapSelectType::full; - MapInvalidateSelectionRect(); - // If no change in ghost placement if ((gSceneryGhostType & SCENERY_GHOST_FLAG_1) && mapTile == gSceneryGhostPosition && z == gSceneryGhostPosition.z) { @@ -1814,10 +1878,17 @@ namespace OpenRCT2::Ui::Windows void onToolUpdateWall(WidgetIndex widgetIndex, const ScreenCoordsXY& screenPos, ScenerySelection selection) { + bool isLeftMousePressed = gInputFlags.has(InputFlag::leftMousePressed); + if (isLeftMousePressed) + { + gMapSelectFlags.set(MapSelectFlag::enable); + return; + } + CoordsXY mapTile = {}; uint8_t edge; - Sub6E1F34Wall(screenPos, selection.EntryIndex, mapTile, &edge); + updatePlacementWall(screenPos, selection.EntryIndex, mapTile, &edge); if (mapTile.IsNull()) { @@ -1826,14 +1897,9 @@ namespace OpenRCT2::Ui::Windows } gMapSelectFlags.set(MapSelectFlag::enable); - gMapSelectPositionA.x = mapTile.x; - gMapSelectPositionA.y = mapTile.y; - gMapSelectPositionB.x = mapTile.x; - gMapSelectPositionB.y = mapTile.y; + setMapSelectRange(mapTile); gMapSelectType = getMapSelectEdge(edge); - MapInvalidateSelectionRect(); - // If no change in ghost placement if ((gSceneryGhostType & SCENERY_GHOST_FLAG_2) && mapTile == gSceneryGhostPosition && edge == gSceneryGhostWallRotation && gSceneryPlaceZ == _unkF64F0A) @@ -1872,7 +1938,7 @@ namespace OpenRCT2::Ui::Windows CoordsXY mapTile = {}; Direction direction; - Sub6E1F34LargeScenery(screenPos, selection.EntryIndex, mapTile, &direction); + updatePlacementLargeScenery(screenPos, selection.EntryIndex, mapTile, &direction); if (mapTile.IsNull()) { @@ -1881,21 +1947,8 @@ namespace OpenRCT2::Ui::Windows } auto* sceneryEntry = ObjectManager::GetObjectEntry(selection.EntryIndex); - gMapSelectionTiles.clear(); - - for (auto& tile : sceneryEntry->tiles) - { - CoordsXY tileLocation = { tile.offset }; - auto rotatedTileCoords = tileLocation.Rotate(direction); - - rotatedTileCoords.x += mapTile.x; - rotatedTileCoords.y += mapTile.y; - - gMapSelectionTiles.push_back(rotatedTileCoords); - } gMapSelectFlags.set(MapSelectFlag::enableConstruct); - MapInvalidateMapSelectionTiles(); // If no change in ghost placement if ((gSceneryGhostType & SCENERY_GHOST_FLAG_3) && mapTile == gSceneryGhostPosition && gSceneryPlaceZ == _unkF64F0A @@ -1905,6 +1958,12 @@ namespace OpenRCT2::Ui::Windows return; } + MapSelection::clearSelectedTiles(); + for (auto& tile : sceneryEntry->tiles) + { + MapSelection::addSelectedTile(mapTile + tile.offset.Rotate(direction)); + } + SceneryRemoveGhostToolPlacement(); gSceneryPlaceObject.SceneryType = SCENERY_TYPE_LARGE; @@ -1938,7 +1997,7 @@ namespace OpenRCT2::Ui::Windows Direction direction; int32_t z; - Sub6E1F34Banner(screenPos, selection.EntryIndex, mapTile, &z, &direction); + updatePlacementBanner(screenPos, selection.EntryIndex, mapTile, &z, &direction); if (mapTile.IsNull()) { @@ -1953,8 +2012,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectPositionB.y = mapTile.y; gMapSelectType = MapSelectType::full; - MapInvalidateSelectionRect(); - // If no change in ghost placement if ((gSceneryGhostType & SCENERY_GHOST_FLAG_4) && mapTile == gSceneryGhostPosition && z == gSceneryGhostPosition.z && direction == gSceneryPlaceRotation) @@ -1975,9 +2032,6 @@ namespace OpenRCT2::Ui::Windows */ void onToolUpdate(WidgetIndex widgetIndex, const ScreenCoordsXY& screenPos) override { - MapInvalidateSelectionRect(); - MapInvalidateMapSelectionTiles(); - gMapSelectFlags.unset(MapSelectFlag::enable); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); @@ -2033,12 +2087,12 @@ namespace OpenRCT2::Ui::Windows // 6e252b auto smallSceneryPlaceAction = GameActions::SmallSceneryPlaceAction( loc, quadrant, entryIndex, primaryColour, secondaryColour, tertiaryColour); - smallSceneryPlaceAction.SetFlags(GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + smallSceneryPlaceAction.SetFlags({ CommandFlag::ghost, CommandFlag::allowDuringPaused }); auto res = GameActions::Execute(&smallSceneryPlaceAction, getGameState()); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) return kMoney64Undefined; - const auto placementData = res.GetData(); + const auto placementData = res.getData(); gSceneryPlaceRotation = loc.direction; gSceneryPlaceObject.SceneryType = SCENERY_TYPE_SMALL; @@ -2058,7 +2112,7 @@ namespace OpenRCT2::Ui::Windows } gSceneryGhostType |= SCENERY_GHOST_FLAG_0; - return res.Cost; + return res.cost; } money64 TryPlaceGhostPathAddition(CoordsXYZ loc, ObjectEntryIndex entryIndex) @@ -2067,9 +2121,9 @@ namespace OpenRCT2::Ui::Windows // 6e265b auto footpathAdditionPlaceAction = GameActions::FootpathAdditionPlaceAction(loc, entryIndex); - footpathAdditionPlaceAction.SetFlags(GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + footpathAdditionPlaceAction.SetFlags({ CommandFlag::ghost, CommandFlag::allowDuringPaused }); footpathAdditionPlaceAction.SetCallback([=](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) { return; } @@ -2077,10 +2131,10 @@ namespace OpenRCT2::Ui::Windows gSceneryGhostType |= SCENERY_GHOST_FLAG_1; }); auto res = GameActions::Execute(&footpathAdditionPlaceAction, getGameState()); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) return kMoney64Undefined; - return res.Cost; + return res.cost; } money64 TryPlaceGhostWall( @@ -2092,13 +2146,12 @@ namespace OpenRCT2::Ui::Windows // 6e26b0 auto wallPlaceAction = GameActions::WallPlaceAction( entryIndex, loc, edge, primaryColour, secondaryColour, tertiaryColour); - wallPlaceAction.SetFlags( - GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND); + wallPlaceAction.SetFlags({ CommandFlag::ghost, CommandFlag::allowDuringPaused, CommandFlag::noSpend }); wallPlaceAction.SetCallback([=](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) return; - const auto placementData = result->GetData(); + const auto placementData = result->getData(); gSceneryGhostPosition = { loc, placementData.BaseHeight }; gSceneryGhostWallRotation = edge; @@ -2106,10 +2159,10 @@ namespace OpenRCT2::Ui::Windows }); auto res = GameActions::Execute(&wallPlaceAction, getGameState()); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) return kMoney64Undefined; - return res.Cost; + return res.cost; } money64 TryPlaceGhostLargeScenery( @@ -2121,13 +2174,12 @@ namespace OpenRCT2::Ui::Windows // 6e25a7 auto sceneryPlaceAction = GameActions::LargeSceneryPlaceAction( loc, entryIndex, primaryColour, secondaryColour, tertiaryColour); - sceneryPlaceAction.SetFlags( - GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND); + sceneryPlaceAction.SetFlags({ CommandFlag::ghost, CommandFlag::allowDuringPaused, CommandFlag::noSpend }); auto res = GameActions::Execute(&sceneryPlaceAction, getGameState()); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) return kMoney64Undefined; - const auto placementData = res.GetData(); + const auto placementData = res.getData(); gSceneryPlaceRotation = loc.direction; @@ -2144,7 +2196,7 @@ namespace OpenRCT2::Ui::Windows } gSceneryGhostType |= SCENERY_GHOST_FLAG_3; - return res.Cost; + return res.cost; } money64 TryPlaceGhostBanner(CoordsXYZD loc, ObjectEntryIndex entryIndex) @@ -2154,17 +2206,16 @@ namespace OpenRCT2::Ui::Windows // 6e2612 auto primaryColour = _sceneryPrimaryColour; auto bannerPlaceAction = GameActions::BannerPlaceAction(loc, entryIndex, primaryColour); - bannerPlaceAction.SetFlags( - GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND); + bannerPlaceAction.SetFlags({ CommandFlag::ghost, CommandFlag::allowDuringPaused, CommandFlag::noSpend }); auto res = GameActions::Execute(&bannerPlaceAction, getGameState()); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) return kMoney64Undefined; gSceneryGhostPosition = loc; gSceneryGhostPosition.z += kPathHeightStep; gSceneryPlaceRotation = loc.direction; gSceneryGhostType |= SCENERY_GHOST_FLAG_4; - return res.Cost; + return res.cost; } /** @@ -2327,7 +2378,7 @@ namespace OpenRCT2::Ui::Windows } } - void Sub6E1F34UpdateScreenCoordsAndButtonsPressed(bool canRaiseItem, ScreenCoordsXY& screenPos) + void updatePlacementUpdateScreenCoordsAndButtonsPressed(bool canRaiseItem, ScreenCoordsXY& screenPos) { if (!canRaiseItem && !getGameState().cheats.disableSupportLimits) { @@ -2401,19 +2452,10 @@ namespace OpenRCT2::Ui::Windows } } - void Sub6E1F34SmallScenery( + void updatePlacementSmallScenery( const ScreenCoordsXY& sourceScreenPos, ObjectEntryIndex sceneryIndex, CoordsXY& gridPos, uint8_t* outQuadrant, Direction* outRotation) { - auto* windowMgr = GetWindowManager(); - auto* w = windowMgr->FindByClass(WindowClass::scenery); - - if (w == nullptr) - { - gridPos.SetNull(); - return; - } - auto screenPos = sourceScreenPos; uint16_t maxPossibleHeight = ZoomLevel::max().ApplyTo( std::numeric_limits::max() - 32); @@ -2432,7 +2474,7 @@ namespace OpenRCT2::Ui::Windows can_raise_item = true; } - Sub6E1F34UpdateScreenCoordsAndButtonsPressed(can_raise_item, screenPos); + updatePlacementUpdateScreenCoordsAndButtonsPressed(can_raise_item, screenPos); // Small scenery if (!sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_FULL_TILE)) @@ -2600,22 +2642,13 @@ namespace OpenRCT2::Ui::Windows *outRotation = rotation; } - void Sub6E1F34PathItem( + void updatePlacementPathItem( const ScreenCoordsXY& sourceScreenPos, ObjectEntryIndex sceneryIndex, CoordsXY& gridPos, int32_t* outZ) { - auto* windowMgr = GetWindowManager(); - auto* w = windowMgr->FindByClass(WindowClass::scenery); - - if (w == nullptr) - { - gridPos.SetNull(); - return; - } - auto screenPos = sourceScreenPos; - Sub6E1F34UpdateScreenCoordsAndButtonsPressed(false, screenPos); + updatePlacementUpdateScreenCoordsAndButtonsPressed(false, screenPos); - // Path bits + // Path additions constexpr auto flag = EnumsToFlags(ViewportInteractionItem::footpath, ViewportInteractionItem::pathAddition); auto info = GetMapCoordinatesFromPos(screenPos, flag); gridPos = info.Loc; @@ -2634,18 +2667,9 @@ namespace OpenRCT2::Ui::Windows *outZ = info.Element->GetBaseZ(); } - void Sub6E1F34Wall( + void updatePlacementWall( const ScreenCoordsXY& sourceScreenPos, ObjectEntryIndex sceneryIndex, CoordsXY& gridPos, uint8_t* outEdges) { - auto* windowMgr = GetWindowManager(); - auto* w = windowMgr->FindByClass(WindowClass::scenery); - - if (w == nullptr) - { - gridPos.SetNull(); - return; - } - auto screenPos = sourceScreenPos; uint16_t maxPossibleHeight = ZoomLevel::max().ApplyTo( std::numeric_limits::max() - 32); @@ -2656,7 +2680,7 @@ namespace OpenRCT2::Ui::Windows maxPossibleHeight -= wallEntry->height; } - Sub6E1F34UpdateScreenCoordsAndButtonsPressed(true, screenPos); + updatePlacementUpdateScreenCoordsAndButtonsPressed(true, screenPos); // Walls uint8_t edge; @@ -2717,6 +2741,8 @@ namespace OpenRCT2::Ui::Windows if (gridPos.IsNull()) return; + gridPos = gridPos.ToTileStart(); + if (Config::Get().general.virtualFloorStyle != VirtualFloorStyles::Off) { VirtualFloorSetHeight(gSceneryPlaceZ); @@ -2725,18 +2751,9 @@ namespace OpenRCT2::Ui::Windows *outEdges = edge; } - void Sub6E1F34LargeScenery( + void updatePlacementLargeScenery( const ScreenCoordsXY& sourceScreenPos, ObjectEntryIndex sceneryIndex, CoordsXY& gridPos, Direction* outDirection) { - auto* windowMgr = GetWindowManager(); - auto* w = windowMgr->FindByClass(WindowClass::scenery); - - if (w == nullptr) - { - gridPos.SetNull(); - return; - } - auto screenPos = sourceScreenPos; uint16_t maxPossibleHeight = ZoomLevel::max().ApplyTo( std::numeric_limits::max() - 32); @@ -2752,7 +2769,7 @@ namespace OpenRCT2::Ui::Windows maxPossibleHeight = std::max(0, maxPossibleHeight - maxClearZ); } - Sub6E1F34UpdateScreenCoordsAndButtonsPressed(true, screenPos); + updatePlacementUpdateScreenCoordsAndButtonsPressed(true, screenPos); // Large scenery // If CTRL not pressed @@ -2826,21 +2843,12 @@ namespace OpenRCT2::Ui::Windows *outDirection = rotation; } - void Sub6E1F34Banner( + void updatePlacementBanner( const ScreenCoordsXY& sourceScreenPos, ObjectEntryIndex sceneryIndex, CoordsXY& gridPos, int32_t* outZ, Direction* outDirection) { - auto* windowMgr = GetWindowManager(); - auto* w = windowMgr->FindByClass(WindowClass::scenery); - - if (w == nullptr) - { - gridPos.SetNull(); - return; - } - auto screenPos = sourceScreenPos; - Sub6E1F34UpdateScreenCoordsAndButtonsPressed(false, screenPos); + updatePlacementUpdateScreenCoordsAndButtonsPressed(false, screenPos); // Banner constexpr auto flag = EnumsToFlags(ViewportInteractionItem::footpath, ViewportInteractionItem::pathAddition); @@ -2882,7 +2890,7 @@ namespace OpenRCT2::Ui::Windows uint8_t quadrant; Direction rotation; - Sub6E1F34SmallScenery(screenCoords, selectedScenery, gridPos, &quadrant, &rotation); + updatePlacementSmallScenery(screenCoords, selectedScenery, gridPos, &quadrant, &rotation); if (gridPos.IsNull()) return; @@ -2947,7 +2955,7 @@ namespace OpenRCT2::Ui::Windows zAttemptRange = 20; } - auto success = GameActions::Status::Unknown; + auto success = GameActions::Status::unknown; // Try find a valid z coordinate for (; zAttemptRange != 0; zAttemptRange--) { @@ -2957,13 +2965,13 @@ namespace OpenRCT2::Ui::Windows auto& gameState = getGameState(); auto res = GameActions::Query(&smallSceneryPlaceAction, gameState); - success = res.Error; - if (res.Error == GameActions::Status::Ok) + success = res.error; + if (res.error == GameActions::Status::ok) { break; } - if (res.Error == GameActions::Status::InsufficientFunds) + if (res.error == GameActions::Status::insufficientFunds) { break; } @@ -2974,7 +2982,7 @@ namespace OpenRCT2::Ui::Windows } // Actually place - if (success == GameActions::Status::Ok || ((q + 1 == quantity) && forceError)) + if (success == GameActions::Status::ok || ((q + 1 == quantity) && forceError)) { auto smallSceneryPlaceAction = GameActions::SmallSceneryPlaceAction( { cur_grid_x, cur_grid_y, gSceneryPlaceZ, gSceneryPlaceRotation }, quadrant, selectedScenery, @@ -2982,20 +2990,20 @@ namespace OpenRCT2::Ui::Windows smallSceneryPlaceAction.SetCallback( [=](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { - Audio::Play3D(Audio::SoundId::placeItem, result->Position); + Audio::Play3D(Audio::SoundId::placeItem, result->position); } }); auto& gameState = getGameState(); auto res = GameActions::Execute(&smallSceneryPlaceAction, gameState); - if (res.Error == GameActions::Status::Ok) + if (res.error == GameActions::Status::ok) { forceError = false; } - if (res.Error == GameActions::Status::InsufficientFunds) + if (res.error == GameActions::Status::insufficientFunds) { break; } @@ -3009,29 +3017,54 @@ namespace OpenRCT2::Ui::Windows CoordsXY gridPos; int32_t z; - Sub6E1F34PathItem(screenCoords, selectedScenery, gridPos, &z); + updatePlacementPathItem(screenCoords, selectedScenery, gridPos, &z); if (gridPos.IsNull()) return; auto footpathAdditionPlaceAction = GameActions::FootpathAdditionPlaceAction({ gridPos, z }, selectedScenery); footpathAdditionPlaceAction.SetCallback([](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) { return; } - Audio::Play3D(Audio::SoundId::placeItem, result->Position); + Audio::Play3D(Audio::SoundId::placeItem, result->position); }); auto& gameState = getGameState(); auto res = GameActions::Execute(&footpathAdditionPlaceAction, gameState); } + std::optional getMapPosFromScreenPos(const ScreenCoordsXY& screenCoords) + { + CoordsXY coords; + if (gSceneryPlaceZ > 0) + { + auto candidate = ScreenGetMapXYWithZ(screenCoords, gSceneryPlaceZ); + if (!candidate.has_value()) + return std::nullopt; + + coords = *candidate; + } + else + { + auto info = GetMapCoordinatesFromPos(screenCoords, EnumsToFlags(ViewportInteractionItem::terrain)); + + if (info.interactionType == ViewportInteractionItem::none) + return std::nullopt; + + coords = info.Loc; + } + + coords = coords.ToTileStart(); + return coords; + } + void onToolDownWall(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords, uint16_t selectedScenery) { CoordsXY gridPos; uint8_t edges; - Sub6E1F34Wall(screenCoords, selectedScenery, gridPos, &edges); + updatePlacementWall(screenCoords, selectedScenery, gridPos, &edges); if (gridPos.IsNull()) return; @@ -3049,12 +3082,12 @@ namespace OpenRCT2::Ui::Windows auto& gameState = getGameState(); auto res = GameActions::Query(&wallPlaceAction, gameState); - if (res.Error == GameActions::Status::Ok) + if (res.error == GameActions::Status::ok) { break; } - if (const auto* message = std::get_if(&res.ErrorMessage)) + if (const auto* message = std::get_if(&res.errorMessage)) { if (*message == STR_NOT_ENOUGH_CASH_REQUIRES || *message == STR_CAN_ONLY_BUILD_THIS_ON_WATER) { @@ -3068,26 +3101,171 @@ namespace OpenRCT2::Ui::Windows } } - auto wallPlaceAction = GameActions::WallPlaceAction( - selectedScenery, { gridPos, gSceneryPlaceZ }, edges, _sceneryPrimaryColour, _scenerySecondaryColour, - _sceneryTertiaryColour); + _inDragMode = true; + _dragStartPos = gridPos; + auto hoverPos = getMapPosFromScreenPos(screenCoords); + _dragStartHoverPos = hoverPos.has_value() ? *hoverPos : gridPos; + _dragEndPos = {}; + _startEdge = edges; + gMapSelectFlags.set(MapSelectFlag::enable); + gMapSelectType = getMapSelectEdge(_startEdge); + setMapSelectRange(gridPos); + } + + void dragWallSetEndPos(const ScreenCoordsXY& screenCoords) + { + auto endCoords = getMapPosFromScreenPos(screenCoords); + if (!endCoords.has_value()) + return; + + if (endCoords == _dragStartHoverPos) + { + endCoords = _dragStartPos; + } + + const bool onXAxis = (_startEdge == 1 || _startEdge == 3); + if (onXAxis) + { + endCoords->y = _dragStartPos.y; + } + else + { + endCoords->x = _dragStartPos.x; + } + + if (*endCoords != _dragEndPos) + { + setMapSelectRange({ _dragStartPos, *endCoords }); + updateProvisionalTiles(); + } + _dragEndPos = *endCoords; + } + + void removeProvisionalTilesFromMap() + { + auto& gameState = getGameState(); + for (const auto& tile : _provisionalTiles) + { + auto location = tile.location; + location.z = tile.calculatedZ; + auto wallRemoveAction = GameActions::WallRemoveAction(location); + wallRemoveAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); + wallRemoveAction.Execute(gameState); + } + } + + void updateProvisionalTiles() + { + auto& gameState = getGameState(); + auto tabSelection = WindowSceneryGetTabSelection(); + removeProvisionalTilesFromMap(); + + _provisionalTiles.clear(); + _lastProvisionalError = {}; + + auto mapRange = getMapSelectRange(); + for (auto y = mapRange.GetY1(); y <= mapRange.GetY2(); y += kCoordsXYStep) + { + for (auto x = mapRange.GetX1(); x <= mapRange.GetX2(); x += kCoordsXYStep) + { + auto wallPlaceAction = GameActions::WallPlaceAction( + tabSelection.EntryIndex, { x, y, gSceneryPlaceZ }, _startEdge, _sceneryPrimaryColour, + _scenerySecondaryColour, _sceneryTertiaryColour); + wallPlaceAction.SetFlags({ CommandFlag::ghost, CommandFlag::allowDuringPaused }); + + auto result = GameActions::Execute(&wallPlaceAction, gameState); + if (result.error == GameActions::Status::ok) + { + const auto placementData = result.getData(); + _provisionalTiles.push_back({ CoordsXYZD(x, y, gSceneryPlaceZ, _startEdge), placementData.BaseHeight }); + } + else + { + _lastProvisionalError = result; + } + } + } + } + + void onToolDragWall(const ScreenCoordsXY& screenCoords) + { + if (!_inDragMode) + return; + + dragWallSetEndPos(screenCoords); + } - wallPlaceAction.SetCallback([](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + void onToolUp(WidgetIndex, const ScreenCoordsXY&) override + { + if (_sceneryPaintEnabled || gWindowSceneryEyedropperEnabled) + return; + + auto tabSelection = WindowSceneryGetTabSelection(); + auto sceneryType = tabSelection.SceneryType; + if (sceneryType == SCENERY_TYPE_WALL) + { + onToolUpWall(tabSelection.EntryIndex); + } + } + + void onToolUpWall(uint16_t selectedScenery) + { + removeProvisionalTilesFromMap(); + + if (!_inDragMode) + { + _provisionalTiles.clear(); + return; + } + + if (_provisionalTiles.empty()) + { + auto z = gSceneryPlaceZ > 0 ? gSceneryPlaceZ : TileElementHeight(_dragStartPos); + Audio::Play3D(Audio::SoundId::error, { _dragStartPos, z }); + + if (_lastProvisionalError.error != GameActions::Status::ok) { - Audio::Play3D(Audio::SoundId::placeItem, result->Position); + auto windowManager = Ui::GetWindowManager(); + windowManager->ShowError( + _lastProvisionalError.getErrorTitle(), _lastProvisionalError.getErrorMessage(), true); } - }); - auto& gameState = getGameState(); - auto res = GameActions::Execute(&wallPlaceAction, gameState); + _inDragMode = false; + return; + } + + auto mapRange = getMapSelectRange(); + bool anySuccessful = false; + CoordsXYZ lastLocation = { mapRange.Point2, gSceneryPlaceZ }; + for (const auto& tile : _provisionalTiles) + { + auto wallPlaceAction = GameActions::WallPlaceAction( + selectedScenery, tile.location, tile.location.direction, _sceneryPrimaryColour, _scenerySecondaryColour, + _sceneryTertiaryColour); + + auto& gameState = getGameState(); + auto result = GameActions::Execute(&wallPlaceAction, gameState); + if (result.error == GameActions::Status::ok) + { + anySuccessful = true; + lastLocation = result.position; + } + } + + _provisionalTiles.clear(); + _inDragMode = false; + + if (anySuccessful) + { + Audio::Play3D(Audio::SoundId::placeItem, lastLocation); + } } void onToolDownLargeScenery(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords, uint16_t selectedScenery) { CoordsXY gridPos; Direction direction; - Sub6E1F34LargeScenery(screenCoords, selectedScenery, gridPos, &direction); + updatePlacementLargeScenery(screenCoords, selectedScenery, gridPos, &direction); if (gridPos.IsNull()) return; @@ -3106,12 +3284,12 @@ namespace OpenRCT2::Ui::Windows auto& gameState = getGameState(); auto res = GameActions::Query(&sceneryPlaceAction, gameState); - if (res.Error == GameActions::Status::Ok) + if (res.error == GameActions::Status::ok) { break; } - if (const auto* message = std::get_if(&res.ErrorMessage)) + if (const auto* message = std::get_if(&res.errorMessage)) { if (*message == STR_NOT_ENOUGH_CASH_REQUIRES || *message == STR_CAN_ONLY_BUILD_THIS_ON_WATER) { @@ -3130,9 +3308,9 @@ namespace OpenRCT2::Ui::Windows auto sceneryPlaceAction = GameActions::LargeSceneryPlaceAction( loc, selectedScenery, _sceneryPrimaryColour, _scenerySecondaryColour, _sceneryTertiaryColour); sceneryPlaceAction.SetCallback([=](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { - Audio::Play3D(Audio::SoundId::placeItem, result->Position); + Audio::Play3D(Audio::SoundId::placeItem, result->position); } else { @@ -3149,7 +3327,7 @@ namespace OpenRCT2::Ui::Windows CoordsXY gridPos; int32_t z; Direction direction; - Sub6E1F34Banner(screenCoords, selectedScenery, gridPos, &z, &direction); + updatePlacementBanner(screenCoords, selectedScenery, gridPos, &z, &direction); if (gridPos.IsNull()) return; @@ -3157,10 +3335,10 @@ namespace OpenRCT2::Ui::Windows auto primaryColour = _sceneryPrimaryColour; auto bannerPlaceAction = GameActions::BannerPlaceAction(loc, selectedScenery, primaryColour); bannerPlaceAction.SetCallback([=](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { - auto data = result->GetData(); - Audio::Play3D(Audio::SoundId::placeItem, result->Position); + auto data = result->getData(); + Audio::Play3D(Audio::SoundId::placeItem, result->position); ContextOpenDetailWindow(WindowDetail::banner, data.bannerId.ToUnderlying()); } }); @@ -3223,6 +3401,13 @@ namespace OpenRCT2::Ui::Windows { if (_sceneryPaintEnabled || gWindowSceneryEyedropperEnabled) onToolDown(widgetIndex, screenCoords); + + auto tabSelection = WindowSceneryGetTabSelection(); + auto sceneryType = tabSelection.SceneryType; + if (sceneryType == SCENERY_TYPE_WALL) + { + onToolDragWall(screenCoords); + } } }; @@ -3311,7 +3496,7 @@ namespace OpenRCT2::Ui::Windows { auto* toolWindow = ContextOpenWindow(WindowClass::scenery); ToolSet(*toolWindow, WIDX_SCENERY_BACKGROUND, Tool::arrow); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); } } } // namespace OpenRCT2::Ui::Windows diff --git a/src/openrct2-ui/windows/SceneryScatter.cpp b/src/openrct2-ui/windows/SceneryScatter.cpp index 6c9c1e99ddf0..99eaf8135aea 100644 --- a/src/openrct2-ui/windows/SceneryScatter.cpp +++ b/src/openrct2-ui/windows/SceneryScatter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -181,7 +182,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_PREVIEW].image = ImageId(LandTool::SizeToSpriteIndex(gWindowSceneryScatterSize)); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); diff --git a/src/openrct2-ui/windows/ServerList.cpp b/src/openrct2-ui/windows/ServerList.cpp index 1960cd1b1f48..48e79e2d0979 100644 --- a/src/openrct2-ui/windows/ServerList.cpp +++ b/src/openrct2-ui/windows/ServerList.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,8 +19,8 @@ #include #include #include + #include #include - #include #include #include #include @@ -248,7 +248,7 @@ namespace OpenRCT2::Ui::Windows } else { - const int32_t iconX = listWidget.width() - kScrollBarWidth - 7 - 10; + const int32_t iconX = listWidget.width() - 1 - kScrollBarWidth - 7 - 10; showNetworkVersionTooltip = screenCoords.x > iconX; } @@ -305,7 +305,7 @@ namespace OpenRCT2::Ui::Windows return { fallback, ft }; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -326,13 +326,13 @@ namespace OpenRCT2::Ui::Windows DrawTextBasic(rt, windowPos + ScreenCoordsXY{ 8, height - 15 }, _statusText, ft, { COLOUR_WHITE }); } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { - uint8_t paletteIndex = ColourMapA[colours[1].colour].mid_light; + auto paletteIndex = ColourMapA[colours[1].colour].mid_light; GfxClear(rt, paletteIndex); auto& listWidget = widgets[WIDX_LIST]; - int32_t listWidgetWidth = listWidget.width(); + int32_t listWidgetWidth = listWidget.width() - 1; ScreenCoordsXY screenCoords; screenCoords.y = 0; diff --git a/src/openrct2-ui/windows/ServerStart.cpp b/src/openrct2-ui/windows/ServerStart.cpp index e2e68061567f..c9da344f35c4 100644 --- a/src/openrct2-ui/windows/ServerStart.cpp +++ b/src/openrct2-ui/windows/ServerStart.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,6 +17,7 @@ #include #include #include + #include #include #include #include @@ -229,7 +230,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTextBasic(rt, windowPos + ScreenCoordsXY{ 6, widgets[WIDX_PORT_INPUT].top }, STR_PORT, {}, { colours[1] }); diff --git a/src/openrct2-ui/windows/ShortcutKeys.cpp b/src/openrct2-ui/windows/ShortcutKeys.cpp index a04b199b40a8..426bf946a194 100644 --- a/src/openrct2-ui/windows/ShortcutKeys.cpp +++ b/src/openrct2-ui/windows/ShortcutKeys.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -121,7 +121,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -251,7 +251,7 @@ namespace OpenRCT2::Ui::Windows setWidgetPressed(static_cast(WIDX_TAB_0 + _currentTabIndex), true); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -297,14 +297,14 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { auto rtCoords = ScreenCoordsXY{ rt.x, rt.y }; Rectangle::fill( rt, { rtCoords, rtCoords + ScreenCoordsXY{ rt.width - 1, rt.height - 1 } }, ColourMapA[colours[1].colour].mid_light); - // TODO: the line below is a workaround for what is presumably a bug with dpi->width + // TODO: the line below is a workaround for what is presumably a bug with rt->width // see https://github.com/OpenRCT2/OpenRCT2/issues/11238 for details const auto scrollWidth = width - kScrollBarWidth - 10; @@ -472,7 +472,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabImages(RenderTarget& rt) const + void DrawTabImages(Drawing::RenderTarget& rt) const { for (size_t i = 0; i < _tabs.size(); i++) { @@ -480,7 +480,7 @@ namespace OpenRCT2::Ui::Windows } } - void DrawTabImage(RenderTarget& rt, size_t tabIndex) const + void DrawTabImage(Drawing::RenderTarget& rt, size_t tabIndex) const { const auto& tabDesc = _tabs[tabIndex]; auto widgetIndex = static_cast(WIDX_TAB_0 + tabIndex); @@ -501,14 +501,15 @@ namespace OpenRCT2::Ui::Windows } } - void DrawSeparator(RenderTarget& rt, int32_t y, int32_t scrollWidth) + void DrawSeparator(Drawing::RenderTarget& rt, int32_t y, int32_t scrollWidth) { const int32_t top = y + (kScrollableRowHeight / 2) - 1; Rectangle::fill(rt, { { 0, top }, { scrollWidth, top } }, ColourMapA[colours[1].colour].mid_dark); Rectangle::fill(rt, { { 0, top + 1 }, { scrollWidth, top + 1 } }, ColourMapA[colours[1].colour].lightest); } - void DrawItem(RenderTarget& rt, int32_t y, int32_t scrollWidth, const ShortcutStringPair& shortcut, bool isHighlighted) + void DrawItem( + Drawing::RenderTarget& rt, int32_t y, int32_t scrollWidth, const ShortcutStringPair& shortcut, bool isHighlighted) { auto format = STR_BLACK_STRING; if (isHighlighted) diff --git a/src/openrct2-ui/windows/Sign.cpp b/src/openrct2-ui/windows/Sign.cpp index b028aca96110..dc0b63111fd2 100644 --- a/src/openrct2-ui/windows/Sign.cpp +++ b/src/openrct2-ui/windows/Sign.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -135,7 +135,7 @@ namespace OpenRCT2::Ui::Windows Widget& viewportWidget = widgets[WIDX_VIEWPORT]; ViewportCreate( *this, windowPos + ScreenCoordsXY{ viewportWidget.left + 1, viewportWidget.top + 1 }, - viewportWidget.width() - 1, viewportWidget.height() - 1, Focus(CoordsXYZ{ signViewPosition, viewZ })); + viewportWidget.width() - 2, viewportWidget.height() - 2, Focus(CoordsXYZ{ signViewPosition, viewZ })); viewport->flags = Config::Get().general.alwaysShowGridlines ? VIEWPORT_FLAG_GRIDLINES : VIEWPORT_FLAG_NONE; invalidate(); @@ -292,7 +292,7 @@ namespace OpenRCT2::Ui::Windows text_colour_btn->image = getColourButtonImage(_textColour); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -318,7 +318,7 @@ namespace OpenRCT2::Ui::Windows Widget* viewportWidget = &widgets[WIDX_VIEWPORT]; ViewportCreate( *this, windowPos + ScreenCoordsXY{ viewportWidget->left + 1, viewportWidget->top + 1 }, - viewportWidget->width() - 1, viewportWidget->height() - 1, Focus(CoordsXYZ{ signViewPos })); + viewportWidget->width() - 2, viewportWidget->height() - 2, Focus(CoordsXYZ{ signViewPos })); if (viewport != nullptr) viewport->flags = Config::Get().general.alwaysShowGridlines ? VIEWPORT_FLAG_GRIDLINES : VIEWPORT_FLAG_NONE; invalidate(); diff --git a/src/openrct2-ui/windows/Staff.cpp b/src/openrct2-ui/windows/Staff.cpp index acaf6470fda3..e5c0c517a13c 100644 --- a/src/openrct2-ui/windows/Staff.cpp +++ b/src/openrct2-ui/windows/Staff.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -228,7 +229,7 @@ namespace OpenRCT2::Ui::Windows CommonPrepareDrawAfter(); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -388,7 +389,7 @@ namespace OpenRCT2::Ui::Windows Network::GetCurrentPlayerId() }; pickupAction.SetCallback( [peepnum = number](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) return; auto* windowMgr = GetWindowManager(); @@ -435,7 +436,7 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[1] = Dropdown::PlainMenuLabel(STR_CLEAR_PATROL_AREA); auto ddPos = ScreenCoordsXY{ widget->left + windowPos.x, widget->top + windowPos.y }; - int32_t extraHeight = widget->height() + 1; + int32_t extraHeight = widget->height(); WindowDropdownShowText(ddPos, extraHeight, colours[1], 0, 2); gDropdown.defaultIndex = 0; @@ -540,7 +541,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_FIRE].right = width - 2; } - void OverviewDraw(RenderTarget& rt) + void OverviewDraw(Drawing::RenderTarget& rt) { // Draw the viewport no sound sprite if (viewport != nullptr) @@ -563,24 +564,24 @@ namespace OpenRCT2::Ui::Windows staff->FormatActionTo(ft); const auto& widget = widgets[WIDX_BTM_LABEL]; auto screenPos = windowPos + ScreenCoordsXY{ widget.midX(), widget.top }; - int32_t widgetWidth = widget.width(); + int32_t widgetWidth = widget.width() - 1; DrawTextEllipsised(rt, screenPos, widgetWidth, STR_BLACK_STRING, ft, { TextAlignment::centre }); } - void DrawOverviewTabImage(RenderTarget& rt) + void DrawOverviewTabImage(Drawing::RenderTarget& rt) { if (isWidgetDisabled(WIDX_TAB_1)) return; const auto& widget = widgets[WIDX_TAB_1]; - int32_t widgetWidth = widget.width() - 1; - int32_t widgetHeight = widget.height() - 1; + int32_t widgetWidth = widget.width() - 2; + int32_t widgetHeight = widget.height() - 2; auto screenCoords = windowPos + ScreenCoordsXY{ widget.left + 1, widget.top + 1 }; if (page == WINDOW_STAFF_OVERVIEW) widgetHeight++; - RenderTarget clippedRT; - if (!ClipDrawPixelInfo(clippedRT, rt, screenCoords, widgetWidth, widgetHeight)) + Drawing::RenderTarget clippedRT; + if (!ClipRenderTarget(clippedRT, rt, screenCoords, widgetWidth, widgetHeight)) { return; } @@ -615,8 +616,8 @@ namespace OpenRCT2::Ui::Windows if (viewport != nullptr) { const Widget& viewportWidget = widgets[WIDX_VIEWPORT]; - const auto reqViewportWidth = viewportWidget.width() - 1; - const auto reqViewportHeight = viewportWidget.height() - 1; + const auto reqViewportWidth = viewportWidget.width() - 2; + const auto reqViewportHeight = viewportWidget.height() - 2; viewport->pos = windowPos + ScreenCoordsXY{ viewportWidget.left + 1, viewportWidget.top + 1 }; if (viewport->width != reqViewportWidth || viewport->height != reqViewportHeight) @@ -668,8 +669,6 @@ namespace OpenRCT2::Ui::Windows if (widgetIndex != WIDX_PICKUP) return; - MapInvalidateSelectionRect(); - gMapSelectFlags.unset(MapSelectFlag::enable); auto mapCoords = FootpathGetCoordinatesFromPos({ screenCoords.x, screenCoords.y + 16 }, nullptr, nullptr); @@ -679,7 +678,6 @@ namespace OpenRCT2::Ui::Windows gMapSelectType = MapSelectType::full; gMapSelectPositionA = mapCoords; gMapSelectPositionB = mapCoords; - MapInvalidateSelectionRect(); } gPickupPeepImage = ImageId(); @@ -722,7 +720,7 @@ namespace OpenRCT2::Ui::Windows { destCoords, tileElement->GetBaseZ() }, Network::GetCurrentPlayerId() }; pickupAction.SetCallback([](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) return; ToolCancel(); gPickupPeepImage = ImageId(); @@ -802,8 +800,8 @@ namespace OpenRCT2::Ui::Windows } auto ddPos = ScreenCoordsXY{ ddWidget->left + windowPos.x, ddWidget->top + windowPos.y }; - int32_t ddHeight = ddWidget->height() + 1; - int32_t ddWidth = ddWidget->width() - 3; + int32_t ddHeight = ddWidget->height(); + int32_t ddWidth = ddWidget->width() - 4; WindowDropdownShowTextCustomWidth(ddPos, ddHeight, colours[1], 0, Dropdown::Flag::StayOpen, numCostumes, ddWidth); // Set selection @@ -931,7 +929,7 @@ namespace OpenRCT2::Ui::Windows #pragma endregion #pragma region Statistics tab events - void StatsDraw(RenderTarget& rt) + void StatsDraw(Drawing::RenderTarget& rt) { auto staff = GetStaff(); if (staff == nullptr) @@ -1158,8 +1156,8 @@ namespace OpenRCT2::Ui::Windows const auto& viewWidget = widgets[WIDX_VIEWPORT]; auto screenPos = ScreenCoordsXY{ viewWidget.left + 1 + windowPos.x, viewWidget.top + 1 + windowPos.y }; - int32_t viewportWidth = viewWidget.width() - 1; - int32_t viewportHeight = viewWidget.height() - 1; + int32_t viewportWidth = viewWidget.width() - 2; + int32_t viewportHeight = viewWidget.height() - 2; ViewportCreate(*this, screenPos, viewportWidth, viewportHeight, focus.value()); flags |= WindowFlag::noScrolling; @@ -1178,7 +1176,7 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[1] = Dropdown::PlainMenuLabel(STR_FOLLOW_SUBJECT_TIP); WindowDropdownShowText( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, 2); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, 2); gDropdown.defaultIndex = 0; } @@ -1188,14 +1186,14 @@ namespace OpenRCT2::Ui::Windows WindowFollowSprite(*main, EntityId::FromUnderlying(number)); } - void DrawTabImages(RenderTarget& rt) + void DrawTabImages(Drawing::RenderTarget& rt) { DrawOverviewTabImage(rt); DrawTabImage(rt, WINDOW_STAFF_OPTIONS, SPR_TAB_STAFF_OPTIONS_0); DrawTabImage(rt, WINDOW_STAFF_STATISTICS, SPR_TAB_STATS_0); } - void DrawTabImage(RenderTarget& rt, int32_t p, int32_t baseImageId) + void DrawTabImage(Drawing::RenderTarget& rt, int32_t p, int32_t baseImageId) { WidgetIndex widgetIndex = WIDX_TAB_1 + p; Widget* widget = &widgets[widgetIndex]; diff --git a/src/openrct2-ui/windows/StaffFirePrompt.cpp b/src/openrct2-ui/windows/StaffFirePrompt.cpp index cf94694324fd..0b4786aac7d7 100644 --- a/src/openrct2-ui/windows/StaffFirePrompt.cpp +++ b/src/openrct2-ui/windows/StaffFirePrompt.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -73,7 +73,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); diff --git a/src/openrct2-ui/windows/StaffList.cpp b/src/openrct2-ui/windows/StaffList.cpp index f51063bdfeef..55aea6ab5dcd 100644 --- a/src/openrct2-ui/windows/StaffList.cpp +++ b/src/openrct2-ui/windows/StaffList.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -273,7 +273,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_STAFF_LIST_HIRE_BUTTON].right = width - 11; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); DrawTabImages(rt); @@ -322,7 +322,7 @@ namespace OpenRCT2::Ui::Windows invalidate(); } - auto scrollWidth = widgets[WIDX_STAFF_LIST_LIST].width() - 15; + auto scrollWidth = widgets[WIDX_STAFF_LIST_LIST].width() - 16; return { scrollWidth, scrollHeight }; } @@ -331,7 +331,7 @@ namespace OpenRCT2::Ui::Windows auto i = static_cast(screenCoords.y / kScrollableRowHeight); if (i != _highlightedIndex) { - _highlightedIndex = static_cast(i); + _highlightedIndex = i; invalidate(); } } @@ -367,7 +367,7 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { auto rtCoords = ScreenCoordsXY{ rt.x, rt.y }; Rectangle::fill( @@ -375,7 +375,7 @@ namespace OpenRCT2::Ui::Windows ColourMapA[colours[1].colour].mid_light); // How much space do we have for the name and action columns? (Discount scroll area and icons.) - const int32_t nonIconSpace = widgets[WIDX_STAFF_LIST_LIST].width() - 15 - 68; + const int32_t nonIconSpace = widgets[WIDX_STAFF_LIST_LIST].width() - 1 - 15 - 68; const int32_t nameColumnSize = nonIconSpace * 0.42; const int32_t actionColumnSize = nonIconSpace * 0.58; const int32_t actionOffset = widgets[WIDX_STAFF_LIST_LIST].right - actionColumnSize - 15; @@ -558,10 +558,10 @@ namespace OpenRCT2::Ui::Windows auto hireStaffAction = GameActions::StaffHireNewAction(autoPosition, staffType, costume, staffOrders); hireStaffAction.SetCallback([=](const GameActions::GameAction*, const GameActions::Result* res) -> void { - if (res->Error != GameActions::Status::Ok) + if (res->error != GameActions::Status::ok) return; - auto actionResult = res->GetData(); + auto actionResult = res->getData(); auto* staff = getGameState().entities.GetEntity(actionResult.StaffEntityId); if (staff == nullptr) return; @@ -576,7 +576,7 @@ namespace OpenRCT2::Ui::Windows Network::GetCurrentPlayerId() }; pickupAction.SetCallback( [staffId = staff->Id](const GameActions::GameAction* ga, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + if (result->error != GameActions::Status::ok) return; auto* staff2 = getGameState().entities.GetEntity(staffId); @@ -607,7 +607,7 @@ namespace OpenRCT2::Ui::Windows return static_cast(_selectedTab); } - void DrawTabImages(RenderTarget& rt) const + void DrawTabImages(Drawing::RenderTarget& rt) const { const auto& gameState = getGameState(); DrawTabImage(rt, WINDOW_STAFF_LIST_TAB_HANDYMEN, AnimationPeepType::handyman, gameState.park.staffHandymanColour); @@ -616,7 +616,7 @@ namespace OpenRCT2::Ui::Windows DrawTabImage(rt, WINDOW_STAFF_LIST_TAB_ENTERTAINERS, AnimationPeepType::entertainer); } - void DrawTabImage(RenderTarget& rt, int32_t tabIndex, AnimationPeepType type, colour_t colour) const + void DrawTabImage(Drawing::RenderTarget& rt, int32_t tabIndex, AnimationPeepType type, colour_t colour) const { PeepAnimationsObject* animObj = findPeepAnimationsObjectForType(type); if (animObj == nullptr) @@ -634,7 +634,7 @@ namespace OpenRCT2::Ui::Windows windowPos + ScreenCoordsXY{ (widget.left + widget.right) / 2, widget.bottom - 6 }); } - void DrawTabImage(RenderTarget& rt, int32_t tabIndex, AnimationPeepType type) const + void DrawTabImage(Drawing::RenderTarget& rt, int32_t tabIndex, AnimationPeepType type) const { PeepAnimationsObject* animObj = findPeepAnimationsObjectForType(type); if (animObj == nullptr) @@ -643,16 +643,16 @@ namespace OpenRCT2::Ui::Windows auto widgetIndex = WIDX_STAFF_LIST_HANDYMEN_TAB + tabIndex; const auto& widget = widgets[widgetIndex]; - RenderTarget clippedDpi; - if (ClipDrawPixelInfo( - clippedDpi, rt, windowPos + ScreenCoordsXY{ widget.left + 1, widget.top + 1 }, + RenderTarget clippedRT; + if (ClipRenderTarget( + clippedRT, rt, windowPos + ScreenCoordsXY{ widget.left + 1, widget.top + 1 }, widget.right - widget.left - 1, widget.bottom - widget.top - 1)) { auto frame = _selectedTab == tabIndex ? _tabAnimationIndex / 4 : 0; auto& anim = animObj->GetPeepAnimation(PeepAnimationGroup::normal); auto imageId = anim.baseImage + 1 + anim.frameOffsets[frame] * 4; - GfxDrawSprite(clippedDpi, ImageId(imageId), { 15, 23 }); + GfxDrawSprite(clippedRT, ImageId(imageId), { 15, 23 }); } } diff --git a/src/openrct2-ui/windows/TextInput.cpp b/src/openrct2-ui/windows/TextInput.cpp index 7746bf677389..aceb69b82a48 100644 --- a/src/openrct2-ui/windows/TextInput.cpp +++ b/src/openrct2-ui/windows/TextInput.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -196,7 +196,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -269,10 +269,11 @@ namespace OpenRCT2::Ui::Windows if (_cursorBlink > 15) { - uint8_t colour = ColourMapA[colours[1].colour].mid_light; + auto colour = ColourMapA[colours[1].colour].mid_light; // TODO: palette index addition Rectangle::fill( - rt, { { cursorX, screenCoords.y + 9 }, { cursorX + textWidth, screenCoords.y + 9 } }, colour + 5); + rt, { { cursorX, screenCoords.y + 9 }, { cursorX + textWidth, screenCoords.y + 9 } }, + static_cast(EnumValue(colour) + 5)); } cur_drawn++; diff --git a/src/openrct2-ui/windows/Themes.cpp b/src/openrct2-ui/windows/Themes.cpp index d706193b6e1c..b8379e640735 100644 --- a/src/openrct2-ui/windows/Themes.cpp +++ b/src/openrct2-ui/windows/Themes.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,8 +16,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -388,7 +388,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { // Widgets WindowDrawWidgets(*this, rt); @@ -453,8 +453,8 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, num_items, widget->width() - 3); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, num_items, widget->width() - 4); gDropdown.items[static_cast(ThemeManagerGetAvailableThemeIndex())].setChecked(true); break; @@ -715,7 +715,7 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { ScreenCoordsXY screenCoords; @@ -723,7 +723,7 @@ namespace OpenRCT2::Ui::Windows return; if (!colours[1].flags.has(ColourFlag::translucent)) - // Rectangle::fill(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, + // Rectangle::fill(rt, rt->x, rt->y, rt->x + rt->width - 1, rt->y + rt->height - 1, // ColourMapA[colours[1].colour].mid_light); GfxClear(rt, ColourMapA[colours[1].colour].mid_light); screenCoords.y = 0; @@ -769,11 +769,11 @@ namespace OpenRCT2::Ui::Windows } else { - colour = ColourMapA[colours[1].colour].mid_dark; - Rectangle::fill(rt, { leftTop, rightBottom }, colour.colour); + auto fillColour = ColourMapA[colours[1].colour].mid_dark; + Rectangle::fill(rt, { leftTop, rightBottom }, fillColour); - colour = ColourMapA[colours[1].colour].lightest; - Rectangle::fill(rt, { leftTop + yPixelOffset, rightBottom + yPixelOffset }, colour.colour); + fillColour = ColourMapA[colours[1].colour].lightest; + Rectangle::fill(rt, { leftTop + yPixelOffset, rightBottom + yPixelOffset }, fillColour); } } @@ -906,7 +906,7 @@ namespace OpenRCT2::Ui::Windows return 0; } - void WindowThemesDrawTabImages(RenderTarget& rt) + void WindowThemesDrawTabImages(Drawing::RenderTarget& rt) { for (int32_t i = 0; i < WINDOW_THEMES_TAB_COUNT; i++) { diff --git a/src/openrct2-ui/windows/TileInspector.cpp b/src/openrct2-ui/windows/TileInspector.cpp index 0e46a2e415cd..ea00f53a04d3 100644 --- a/src/openrct2-ui/windows/TileInspector.cpp +++ b/src/openrct2-ui/windows/TileInspector.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -904,8 +905,8 @@ static uint64_t PageDisabledWidgets[] = { gDropdown.items[1] = Dropdown::MenuLabel(STR_TILE_INSPECTOR_WALL_SLOPED_LEFT); gDropdown.items[2] = Dropdown::MenuLabel(STR_TILE_INSPECTOR_WALL_SLOPED_RIGHT); WindowDropdownShowTextCustomWidth( - { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0, - Dropdown::Flag::StayOpen, 3, widget->width() - 3); + { windowPos.x + widget->left, windowPos.y + widget->top }, widget->height(), colours[1], 0, + Dropdown::Flag::StayOpen, 3, widget->width() - 4); // Set current value as checked gDropdown.items[tileElement->AsWall()->GetSlope()].setChecked(true); @@ -969,7 +970,6 @@ static uint64_t PageDisabledWidgets[] = { void onToolUpdate(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) override { - MapInvalidateSelectionRect(); gMapSelectFlags.set(MapSelectFlag::enable); CoordsXY mapCoords; @@ -999,7 +999,6 @@ static uint64_t PageDisabledWidgets[] = { gMapSelectFlags.unset(MapSelectFlag::enable); gMapSelectType = MapSelectType::full; - MapInvalidateSelectionRect(); } void onToolDown(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) override @@ -1046,7 +1045,7 @@ static uint64_t PageDisabledWidgets[] = { invalidateWidget(WIDX_LIST); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); ScreenCoordsXY screenCoords(windowPos.x, windowPos.y); @@ -1584,9 +1583,9 @@ static uint64_t PageDisabledWidgets[] = { } } - void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) override { - const int32_t listWidth = widgets[WIDX_LIST].width(); + const int32_t listWidth = widgets[WIDX_LIST].width() - 1; Rectangle::fill( rt, { { rt.x, rt.y }, { rt.x + rt.width - 1, rt.y + rt.height - 1 } }, ColourMapA[colours[1].colour].mid_light); @@ -1595,7 +1594,7 @@ static uint64_t PageDisabledWidgets[] = { { auto& listWidget = widgets[WIDX_LIST]; auto centrePos = ScreenCoordsXY{ listWidget.width() / 2, - (listWidget.height() - FontGetLineHeight(FontStyle::medium)) / 2 }; + (listWidget.height() - 1 - FontGetLineHeight(FontStyle::medium)) / 2 }; auto ft = Formatter{}; auto textPaint = TextPaint{ colours[1], TextAlignment::centre }; DrawTextWrapped(rt, centrePos, listWidth, STR_TILE_INSPECTOR_SELECT_TILE_HINT, ft, textPaint); @@ -1624,10 +1623,10 @@ static uint64_t PageDisabledWidgets[] = { if (selectedRow) Rectangle::fill(rt, fillRectangle, ColourMapA[colours[1].colour].mid_dark); else if (hoveredRow) - Rectangle::fill(rt, fillRectangle, ColourMapA[colours[1].colour].mid_dark | 0x1000000); + Rectangle::fill(rt, fillRectangle, ColourMapA[colours[1].colour].mid_dark, true); // Zebra stripes else if (((windowTileInspectorElementCount - i) & 1) == 0) - Rectangle::fill(rt, fillRectangle, ColourMapA[colours[1].colour].light | 0x1000000); + Rectangle::fill(rt, fillRectangle, ColourMapA[colours[1].colour].light, true); StringId stringFormat = STR_WINDOW_COLOUR_2_STRINGID; if (selectedRow || hoveredRow) diff --git a/src/openrct2-ui/windows/TitleExit.cpp b/src/openrct2-ui/windows/TitleExit.cpp index 548e39a504da..1bf0203e5525 100644 --- a/src/openrct2-ui/windows/TitleExit.cpp +++ b/src/openrct2-ui/windows/TitleExit.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -44,7 +44,7 @@ namespace OpenRCT2::Ui::Windows }; } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); } diff --git a/src/openrct2-ui/windows/TitleLogo.cpp b/src/openrct2-ui/windows/TitleLogo.cpp index 55b40416933a..1b44e381868c 100644 --- a/src/openrct2-ui/windows/TitleLogo.cpp +++ b/src/openrct2-ui/windows/TitleLogo.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -57,7 +57,7 @@ namespace OpenRCT2::Ui::Windows * * rct2: 0x0066B872 */ - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { auto screenCoords = windowPos + ScreenCoordsXY{ 2, 2 }; GfxDrawSprite(rt, ImageId(SPR_G2_LOGO), screenCoords); diff --git a/src/openrct2-ui/windows/TitleMenu.cpp b/src/openrct2-ui/windows/TitleMenu.cpp index 62e6dac5ea08..a40dc82d3bf1 100644 --- a/src/openrct2-ui/windows/TitleMenu.cpp +++ b/src/openrct2-ui/windows/TitleMenu.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -212,11 +212,11 @@ namespace OpenRCT2::Ui::Windows int32_t yOffset = 0; if (i > 5) { - yOffset = -(widget->height() + 5 + (i * 12)); + yOffset = -(widget->height() - 1 + 5 + (i * 12)); } WindowDropdownShowText( - windowPos + ScreenCoordsXY{ widget->left, widget->top + yOffset }, widget->height() + 1, + windowPos + ScreenCoordsXY{ widget->left, widget->top + yOffset }, widget->height(), colours[0].withFlag(ColourFlag::translucent, true), Dropdown::Flag::StayOpen, i); } } @@ -275,7 +275,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { Rectangle::filter(rt, _filterRect, FilterPaletteID::palette51); drawWidgets(rt); diff --git a/src/openrct2-ui/windows/TitleOptions.cpp b/src/openrct2-ui/windows/TitleOptions.cpp index 29f8b6970341..f73e3fa26c35 100644 --- a/src/openrct2-ui/windows/TitleOptions.cpp +++ b/src/openrct2-ui/windows/TitleOptions.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -43,7 +43,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); } diff --git a/src/openrct2-ui/windows/TitleVersion.cpp b/src/openrct2-ui/windows/TitleVersion.cpp index fe9999d5f172..f949f1ef8ac4 100644 --- a/src/openrct2-ui/windows/TitleVersion.cpp +++ b/src/openrct2-ui/windows/TitleVersion.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -24,7 +24,7 @@ namespace OpenRCT2::Ui::Windows class TitleVersionWindow final : public Window { - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { // Write name and version information const auto whiteOutline = ColourWithFlags{ COLOUR_WHITE }.withFlag(ColourFlag::withOutline, true); diff --git a/src/openrct2-ui/windows/Tooltip.cpp b/src/openrct2-ui/windows/Tooltip.cpp index ceb503f1e361..933c14b10f9e 100644 --- a/src/openrct2-ui/windows/Tooltip.cpp +++ b/src/openrct2-ui/windows/Tooltip.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -103,7 +103,7 @@ namespace OpenRCT2::Ui::Windows UpdatePosition(gTooltipCursor); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { int32_t left = windowPos.x; int32_t top = windowPos.y; diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index 8528081871bc..432dc9692a2a 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -316,8 +317,8 @@ namespace OpenRCT2::Ui::Windows SetItems(items); WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() + 1, - colours[1].withFlag(ColourFlag::translucent, true), 0, TOP_TOOLBAR_VIEW_MENU_COUNT); + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), + colours[1].withFlag(ColourFlag::translucent, true), Dropdown::Flag::StayOpen, TOP_TOOLBAR_VIEW_MENU_COUNT); auto mvpFlags = WindowGetMain()->viewport->flags; gDropdown.items[DDIDX_UNDERGROUND_INSIDE].setChecked(mvpFlags & VIEWPORT_FLAG_UNDERGROUND_INSIDE); @@ -448,7 +449,7 @@ namespace OpenRCT2::Ui::Windows #endif WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() + 1, + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), colours[1].withFlag(ColourFlag::translucent, true), 0, i); gDropdown.defaultIndex = DDIDX_SHOW_MAP; } @@ -515,7 +516,7 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() + 1, + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), colours[0].withFlag(ColourFlag::translucent, true), 0, num_items); // Set checkmarks @@ -627,7 +628,7 @@ namespace OpenRCT2::Ui::Windows } WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() + 1, + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), colours[0].withFlag(ColourFlag::translucent, true), Dropdown::Flag::StayOpen, numItems); } @@ -651,7 +652,7 @@ namespace OpenRCT2::Ui::Windows SetItems(items); WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() + 1, + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), colours[0].withFlag(ColourFlag::translucent, true), Dropdown::Flag::StayOpen, TOP_TOOLBAR_CHEATS_COUNT); // Disable items that are not yet available in multiplayer @@ -727,7 +728,7 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[DDIDX_DEBUG_PAINT] = Dropdown::ToggleOption(STR_DEBUG_DROPDOWN_DEBUG_PAINT); WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() + 1, + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), colours[0].withFlag(ColourFlag::translucent, true), Dropdown::Flag::StayOpen, TOP_TOOLBAR_DEBUG_COUNT); auto* windowMgr = GetWindowManager(); @@ -771,7 +772,7 @@ namespace OpenRCT2::Ui::Windows gDropdown.items[DDIDX_MULTIPLAYER_RECONNECT] = Dropdown::PlainMenuLabel(STR_MULTIPLAYER_RECONNECT); WindowDropdownShowText( - { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height() + 1, + { windowPos.x + widget.left, windowPos.y + widget.top }, widget.height(), colours[0].withFlag(ColourFlag::translucent, true), 0, TOP_TOOLBAR_NETWORK_COUNT); gDropdown.items[DDIDX_MULTIPLAYER_RECONNECT].setDisabled(!Network::IsDesynchronised()); @@ -1268,16 +1269,16 @@ namespace OpenRCT2::Ui::Windows }; uint32_t mapImageId = _imageIdByRotation[GetCurrentRotation()]; - widgets[WIDX_MAP].image = ImageId(mapImageId, FilterPaletteID::paletteNull); + widgets[WIDX_MAP].image = ImageId(mapImageId, Drawing::FilterPaletteID::paletteNull); } } void ApplyAudioState() { if (!OpenRCT2::Audio::gGameSoundsOff) - widgets[WIDX_MUTE].image = ImageId(SPR_G2_TOOLBAR_MUTE, FilterPaletteID::paletteNull); + widgets[WIDX_MUTE].image = ImageId(SPR_G2_TOOLBAR_MUTE, Drawing::FilterPaletteID::paletteNull); else - widgets[WIDX_MUTE].image = ImageId(SPR_G2_TOOLBAR_UNMUTE, FilterPaletteID::paletteNull); + widgets[WIDX_MUTE].image = ImageId(SPR_G2_TOOLBAR_UNMUTE, Drawing::FilterPaletteID::paletteNull); } void ApplyFootpathPressed() @@ -1305,7 +1306,7 @@ namespace OpenRCT2::Ui::Windows if (firstItem && widgetIndex == WIDX_SEPARATOR) continue; - totalWidth += widget->width() + 1; + totalWidth += widget->width(); firstItem = false; } return totalWidth; @@ -1325,7 +1326,7 @@ namespace OpenRCT2::Ui::Windows if (firstItem && widgetIndex == WIDX_SEPARATOR) continue; - auto widgetWidth = widget->width(); + auto widgetWidth = widget->width() - 1; widget->left = xPos; xPos += widgetWidth; widget->right = xPos; @@ -1378,7 +1379,7 @@ namespace OpenRCT2::Ui::Windows AlignButtonsCentre(); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { const auto& gameState = getGameState(); int32_t imgId; diff --git a/src/openrct2-ui/windows/TrackDesignManage.cpp b/src/openrct2-ui/windows/TrackDesignManage.cpp index d4f9ec98a388..e9142fd17090 100644 --- a/src/openrct2-ui/windows/TrackDesignManage.cpp +++ b/src/openrct2-ui/windows/TrackDesignManage.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -133,7 +133,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { Formatter::Common().Add(_trackDesignFileReference->name.c_str()); drawWidgets(rt); @@ -183,7 +183,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index b8f1db2c44a0..f6c7fc1eb064 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include #include #include @@ -40,19 +42,20 @@ using namespace OpenRCT2::Numerics; using namespace OpenRCT2::TrackMetaData; +using OpenRCT2::Drawing::PaletteIndex; +using OpenRCT2::GameActions::CommandFlag; +using OpenRCT2::GameActions::CommandFlags; namespace OpenRCT2::Ui::Windows { static constexpr StringId kWindowTitle = STR_STRING; static constexpr ScreenSize kWindowSize = { 200, 124 }; - constexpr int16_t kTrackMiniPreviewWidth = 168; - constexpr int16_t kTrackMiniPreviewHeight = 78; - constexpr uint16_t kTrackMiniPreviewSize = kTrackMiniPreviewWidth * kTrackMiniPreviewHeight; + static constexpr ScreenSize kTrackMiniPreviewSize = { 168, 78 }; - static constexpr uint8_t kPaletteIndexColourEntrance = PaletteIndex::pi20; // White - static constexpr uint8_t kPaletteIndexColourExit = PaletteIndex::pi10; // Black - static constexpr uint8_t kPaletteIndexColourTrack = PaletteIndex::pi248; // Grey (dark) - static constexpr uint8_t kPaletteIndexColourStation = PaletteIndex::pi252; // Grey (light) + static constexpr auto kPaletteIndexColourEntrance = PaletteIndex::pi20; // White + static constexpr auto kPaletteIndexColourExit = PaletteIndex::pi10; // Black + static constexpr auto kPaletteIndexColourTrack = PaletteIndex::pi248; // Grey (dark) + static constexpr auto kPaletteIndexColourStation = PaletteIndex::pi252; // Grey (light) enum { @@ -62,7 +65,8 @@ namespace OpenRCT2::Ui::Windows WIDX_ROTATE, WIDX_MIRROR, WIDX_SELECT_DIFFERENT_DESIGN, - WIDX_PRICE + WIDX_PRICE, + WIDX_PREVIEW, }; VALIDATE_GLOBAL_WIDX(WC_TRACK_DESIGN_PLACE, WIDX_ROTATE); @@ -70,10 +74,11 @@ namespace OpenRCT2::Ui::Windows // clang-format off static constexpr auto _trackPlaceWidgets = makeWidgets( makeWindowShim(kWindowTitle, kWindowSize), - makeWidget({173, 83}, { 24, 24}, WidgetType::flatBtn, WindowColour::primary, ImageId(SPR_ROTATE_ARROW), STR_ROTATE_90_TIP ), - makeWidget({173, 59}, { 24, 24}, WidgetType::flatBtn, WindowColour::primary, ImageId(SPR_MIRROR_ARROW), STR_MIRROR_IMAGE_TIP ), - makeWidget({ 4, 109}, {192, 12}, WidgetType::button, WindowColour::primary, STR_SELECT_A_DIFFERENT_DESIGN, STR_GO_BACK_TO_DESIGN_SELECTION_WINDOW_TIP), - makeWidget({ 0, 0}, { 1, 1}, WidgetType::empty, WindowColour::primary) + makeWidget({173, 83}, { 24, 24}, WidgetType::flatBtn, WindowColour::primary, ImageId(SPR_ROTATE_ARROW), STR_ROTATE_90_TIP ), + makeWidget({173, 59}, { 24, 24}, WidgetType::flatBtn, WindowColour::primary, ImageId(SPR_MIRROR_ARROW), STR_MIRROR_IMAGE_TIP ), + makeWidget({ 4, 109}, {192, 12}, WidgetType::button, WindowColour::primary, STR_SELECT_A_DIFFERENT_DESIGN, STR_GO_BACK_TO_DESIGN_SELECTION_WINDOW_TIP), + makeWidget({ 88, 93}, { 1, 1}, WidgetType::empty, WindowColour::primary), + makeWidget({ 4, 17}, kTrackMiniPreviewSize, WidgetType::empty, WindowColour::primary) ); // clang-format on @@ -90,7 +95,7 @@ namespace OpenRCT2::Ui::Windows money64 _placementCost; CoordsXYZD _placementGhostLoc; - std::vector _miniPreview; + std::vector _miniPreview; bool _trackPlaceCtrlState = false; int32_t _trackPlaceCtrlZ; @@ -108,10 +113,10 @@ namespace OpenRCT2::Ui::Windows setWidgets(_trackPlaceWidgets); WindowInitScrollWidgets(*this); ToolSet(*this, WIDX_PRICE, Tool::crosshair); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); WindowPushOthersRight(*this); ShowGridlines(); - _miniPreview.resize(kTrackMiniPreviewSize); + _miniPreview.resize(kTrackMiniPreviewSize.width * kTrackMiniPreviewSize.height); _placementCost = kMoney64Undefined; _placementLoc.SetNull(); _currentTrackPieceDirection = (2 - GetCurrentRotation()) & 3; @@ -121,7 +126,6 @@ namespace OpenRCT2::Ui::Windows { ClearProvisional(); ViewportSetVisibility(ViewportVisibility::standard); - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); gMapSelectFlags.unset(MapSelectFlag::enableArrow); HideGridlines(); @@ -172,7 +176,6 @@ namespace OpenRCT2::Ui::Windows { TrackDesignState tds{}; - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enable); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); gMapSelectFlags.unset(MapSelectFlag::enableArrow); @@ -220,23 +223,25 @@ namespace OpenRCT2::Ui::Windows { ClearProvisional(); CoordsXYZD ghostTrackLoc = trackLoc; - auto res = FindValidTrackDesignPlaceHeight(ghostTrackLoc, GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + auto res = FindValidTrackDesignPlaceHeight(ghostTrackLoc, { CommandFlag::noSpend, CommandFlag::ghost }); - if (res.Error == GameActions::Status::Ok) + if (res.error == GameActions::Status::ok) { // Valid location found. Place the ghost at the location. - auto tdAction = GameActions::TrackDesignAction(ghostTrackLoc, *_trackDesign, !gTrackDesignSceneryToggle); - tdAction.SetFlags(GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + auto tdAction = GameActions::TrackDesignAction( + ghostTrackLoc, *_trackDesign, !gTrackDesignSceneryToggle, + Config::Get().general.defaultInspectionInterval); + tdAction.SetFlags({ CommandFlag::noSpend, CommandFlag::ghost }); tdAction.SetCallback([&](const GameActions::GameAction*, const GameActions::Result* result) { - if (result->Error == GameActions::Status::Ok) + if (result->error == GameActions::Status::ok) { - _placementGhostRideId = result->GetData(); + _placementGhostRideId = result->getData(); _placementGhostLoc = ghostTrackLoc; _hasPlacementGhost = true; } }); res = GameActions::Execute(&tdAction, getGameState()); - cost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + cost = res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; VirtualFloorSetHeight(ghostTrackLoc.z); } @@ -256,7 +261,6 @@ namespace OpenRCT2::Ui::Windows void onToolDown(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) override { ClearProvisional(); - MapInvalidateMapSelectionTiles(); gMapSelectFlags.unset(MapSelectFlag::enable); gMapSelectFlags.unset(MapSelectFlag::enableConstruct); gMapSelectFlags.unset(MapSelectFlag::enableArrow); @@ -284,30 +288,31 @@ namespace OpenRCT2::Ui::Windows // Try increasing Z until a feasible placement is found CoordsXYZ trackLoc = { mapCoords, maybeMapZ.value() }; - auto res = FindValidTrackDesignPlaceHeight(trackLoc, 0); - if (res.Error != GameActions::Status::Ok) + auto res = FindValidTrackDesignPlaceHeight(trackLoc, {}); + if (res.error != GameActions::Status::ok) { // Unable to build track Audio::Play3D(Audio::SoundId::error, trackLoc); auto windowManager = GetWindowManager(); - windowManager->ShowError(res.GetErrorTitle(), res.GetErrorMessage()); + windowManager->ShowError(res.getErrorTitle(), res.getErrorMessage()); return; } _placingTrackDesign = true; auto tdAction = GameActions::TrackDesignAction( - { trackLoc, _currentTrackPieceDirection }, *_trackDesign, !gTrackDesignSceneryToggle); - tdAction.SetCallback([&](const GameActions::GameAction*, const GameActions::Result* result) { - if (result->Error != GameActions::Status::Ok) + { trackLoc, _currentTrackPieceDirection }, *_trackDesign, !gTrackDesignSceneryToggle, + Config::Get().general.defaultInspectionInterval); + tdAction.SetCallback([&, trackLoc](const GameActions::GameAction*, const GameActions::Result* result) { + if (result->error != GameActions::Status::ok) { - Audio::Play3D(Audio::SoundId::error, result->Position); + Audio::Play3D(Audio::SoundId::error, result->position); _placingTrackDesign = false; return; } - rideId = result->GetData(); + rideId = result->getData(); auto getRide = GetRide(rideId); if (getRide != nullptr) { @@ -352,20 +357,22 @@ namespace OpenRCT2::Ui::Windows DrawMiniPreview(*_trackDesign); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { auto ft = Formatter::Common(); ft.Add(_trackDesign->gameStateData.name.c_str()); WindowDrawWidgets(*this, rt); // Draw mini tile preview - RenderTarget clippedRT; - if (ClipDrawPixelInfo(clippedRT, rt, this->windowPos + ScreenCoordsXY{ 4, 18 }, 168, 78)) + Drawing::RenderTarget clippedRT; + const auto& previewWidget = widgets[WIDX_PREVIEW]; + const auto previewCoords = windowPos + ScreenCoordsXY{ previewWidget.left, previewWidget.top }; + if (ClipRenderTarget(clippedRT, rt, previewCoords, previewWidget.width(), previewWidget.height())) { G1Element g1temp = {}; - g1temp.offset = _miniPreview.data(); - g1temp.width = kTrackMiniPreviewWidth; - g1temp.height = kTrackMiniPreviewHeight; + g1temp.offset = reinterpret_cast(_miniPreview.data()); + g1temp.width = kTrackMiniPreviewSize.width; + g1temp.height = kTrackMiniPreviewSize.height; GfxSetG1Element(SPR_TEMP, &g1temp); DrawingEngineInvalidateImage(SPR_TEMP); GfxDrawSprite(clippedRT, ImageId(SPR_TEMP, this->colours[0].colour), { 0, 0 }); @@ -376,7 +383,9 @@ namespace OpenRCT2::Ui::Windows { ft = Formatter(); ft.Add(_placementCost); - DrawTextBasic(rt, this->windowPos + ScreenCoordsXY{ 88, 94 }, STR_COST_LABEL, ft, { TextAlignment::centre }); + const auto& priceWidget = widgets[WIDX_PRICE]; + const auto priceCoords = windowPos + ScreenCoordsXY{ priceWidget.left, priceWidget.top }; + DrawTextBasic(rt, priceCoords, STR_COST_LABEL, ft, { TextAlignment::centre }); } } @@ -397,10 +406,11 @@ namespace OpenRCT2::Ui::Windows if (_hasPlacementGhost) { auto tdAction = GameActions::TrackDesignAction( - { _placementGhostLoc }, *_trackDesign, !gTrackDesignSceneryToggle); - tdAction.SetFlags(GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + { _placementGhostLoc }, *_trackDesign, !gTrackDesignSceneryToggle, + Config::Get().general.defaultInspectionInterval); + tdAction.SetFlags({ CommandFlag::noSpend, CommandFlag::ghost }); auto res = GameActions::Execute(&tdAction, getGameState()); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) { _hasPlacementGhost = false; } @@ -600,8 +610,8 @@ namespace OpenRCT2::Ui::Windows auto pixelPosition = DrawMiniPreviewGetPixelPosition(rotatedAndOffsetEntrance); if (DrawMiniPreviewIsPixelInBounds(pixelPosition)) { - uint8_t* pixel = DrawMiniPreviewGetPixelPtr(pixelPosition); - uint8_t colour = entrance.isExit ? kPaletteIndexColourExit : kPaletteIndexColourEntrance; + PaletteIndex* pixel = DrawMiniPreviewGetPixelPtr(pixelPosition); + auto colour = entrance.isExit ? kPaletteIndexColourExit : kPaletteIndexColourEntrance; for (int32_t i = 0; i < 4; i++) { pixel[338 + i] = colour; // x + 2, y + 2 @@ -642,13 +652,13 @@ namespace OpenRCT2::Ui::Windows auto pixelPosition = DrawMiniPreviewGetPixelPosition(rotatedAndOffsetTrackBlock); if (DrawMiniPreviewIsPixelInBounds(pixelPosition)) { - uint8_t* pixel = DrawMiniPreviewGetPixelPtr(pixelPosition); + PaletteIndex* pixel = DrawMiniPreviewGetPixelPtr(pixelPosition); auto bits = trackBlock.quarterTile.Rotate(curTrackRotation & 3).GetBaseQuarterOccupied(); // Station track is a lighter colour - uint8_t colour = (ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN) ? kPaletteIndexColourStation - : kPaletteIndexColourTrack; + auto colour = ted.sequences[0].flags.has(SequenceFlag::trackOrigin) ? kPaletteIndexColourStation + : kPaletteIndexColourTrack; for (int32_t i = 0; i < 4; i++) { @@ -705,9 +715,9 @@ namespace OpenRCT2::Ui::Windows auto pixelPosition = DrawMiniPreviewGetPixelPosition(rotatedMazeCoords); if (DrawMiniPreviewIsPixelInBounds(pixelPosition)) { - uint8_t* pixel = DrawMiniPreviewGetPixelPtr(pixelPosition); + auto* pixel = DrawMiniPreviewGetPixelPtr(pixelPosition); - uint8_t colour = kPaletteIndexColourTrack; + auto colour = kPaletteIndexColourTrack; for (int32_t i = 0; i < 4; i++) { pixel[338 + i] = colour; // x + 2, y + 2 @@ -733,24 +743,25 @@ namespace OpenRCT2::Ui::Windows return pixel.x >= 0 && pixel.y >= 0 && pixel.x <= 160 && pixel.y <= 75; } - uint8_t* DrawMiniPreviewGetPixelPtr(const ScreenCoordsXY& pixel) + PaletteIndex* DrawMiniPreviewGetPixelPtr(const ScreenCoordsXY& pixel) { - return &_miniPreview[pixel.y * kTrackMiniPreviewWidth + pixel.x]; + return &_miniPreview[pixel.y * kTrackMiniPreviewSize.width + pixel.x]; } - GameActions::Result FindValidTrackDesignPlaceHeight(CoordsXYZ& loc, uint32_t newFlags) + GameActions::Result FindValidTrackDesignPlaceHeight(CoordsXYZ& loc, CommandFlags newFlags) { GameActions::Result res; for (int32_t i = 0; i < 7; i++, loc.z += kCoordsZStep) { auto tdAction = GameActions::TrackDesignAction( - CoordsXYZD{ loc.x, loc.y, loc.z, _currentTrackPieceDirection }, *_trackDesign, !gTrackDesignSceneryToggle); + CoordsXYZD{ loc.x, loc.y, loc.z, _currentTrackPieceDirection }, *_trackDesign, !gTrackDesignSceneryToggle, + Config::Get().general.defaultInspectionInterval); tdAction.SetFlags(newFlags); res = GameActions::Query(&tdAction, getGameState()); // If successful don't keep trying. // If failure due to no money then increasing height only makes problem worse - if (res.Error == GameActions::Status::Ok || res.Error == GameActions::Status::InsufficientFunds) + if (res.error == GameActions::Status::ok || res.error == GameActions::Status::insufficientFunds) { return res; } diff --git a/src/openrct2-ui/windows/TrackList.cpp b/src/openrct2-ui/windows/TrackList.cpp index d577872c25cd..dd2fdff9ddaf 100644 --- a/src/openrct2-ui/windows/TrackList.cpp +++ b/src/openrct2-ui/windows/TrackList.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -452,7 +453,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -470,7 +471,7 @@ namespace OpenRCT2::Ui::Windows // Track preview auto& tdWidget = widgets[WIDX_TRACK_PREVIEW]; - int32_t colour = ColourMapA[colours[0].colour].darkest; + auto colour = ColourMapA[colours[0].colour].darkest; u8string path = _trackDesigns[trackIndex].path; // Show track file path (in debug mode) @@ -511,7 +512,7 @@ namespace OpenRCT2::Ui::Windows g1temp.offset = _trackDesignPreviewPixels.data() + (_currentTrackPieceDirection * kTrackPreviewImageSize); g1temp.width = 370; g1temp.height = 217; - g1temp.flags = G1_FLAG_HAS_TRANSPARENCY; + g1temp.flags = { G1Flag::hasTransparency }; GfxSetG1Element(SPR_TEMP, &g1temp); DrawingEngineInvalidateImage(SPR_TEMP); GfxDrawSprite(rt, ImageId(SPR_TEMP), trackPreview); @@ -673,9 +674,9 @@ namespace OpenRCT2::Ui::Windows } } - void onScrollDraw(const int32_t scrollIndex, RenderTarget& rt) override + void onScrollDraw(const int32_t scrollIndex, Drawing::RenderTarget& rt) override { - uint8_t paletteIndex = ColourMapA[colours[0].colour].mid_light; + auto paletteIndex = ColourMapA[colours[0].colour].mid_light; GfxClear(rt, paletteIndex); auto screenCoords = ScreenCoordsXY{ 0, 0 }; diff --git a/src/openrct2-ui/windows/Transparency.cpp b/src/openrct2-ui/windows/Transparency.cpp index 0c13353dec82..636a3e592d6c 100644 --- a/src/openrct2-ui/windows/Transparency.cpp +++ b/src/openrct2-ui/windows/Transparency.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -141,7 +142,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); // Locate mechanic button image diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index 9c536ef8f9cf..edb27ed5a095 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -181,7 +181,7 @@ namespace OpenRCT2::Ui::Windows { const auto& widget = widgets[WIDX_CLIP_HEIGHT_SLIDER]; const ScrollArea* const scroll = &this->scrolls[0]; - const int16_t scroll_width = widget.width() - 1; + const int16_t scroll_width = widget.width() - 2; const uint8_t clip_height = static_cast( (static_cast(scroll->contentOffsetX) / (scroll->contentWidth - scroll_width)) * 255); if (clip_height != gClipHeight) @@ -248,14 +248,12 @@ namespace OpenRCT2::Ui::Windows auto mapCoords = ScreenPosToMapPos(screenCoords, &direction); if (mapCoords) { - MapInvalidateSelectionRect(); gMapSelectFlags.set(MapSelectFlag::enable); gMapSelectPositionA.x = std::min(_selectionStart.x, mapCoords->x); gMapSelectPositionB.x = std::max(_selectionStart.x, mapCoords->x); gMapSelectPositionA.y = std::min(_selectionStart.y, mapCoords->y); gMapSelectPositionB.y = std::max(_selectionStart.y, mapCoords->y); gMapSelectType = MapSelectType::full; - MapInvalidateSelectionRect(); } } @@ -290,7 +288,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { WindowDrawWidgets(*this, rt); @@ -402,7 +400,7 @@ namespace OpenRCT2::Ui::Windows const auto& widget = widgets[WIDX_CLIP_HEIGHT_SLIDER]; const float clip_height_ratio = static_cast(gClipHeight) / 255; this->scrolls[0].contentOffsetX = static_cast( - std::ceil(clip_height_ratio * (this->scrolls[0].contentWidth - (widget.width() - 1)))); + std::ceil(clip_height_ratio * (this->scrolls[0].contentWidth - (widget.width() - 2)))); } bool IsActive() diff --git a/src/openrct2-ui/windows/Viewport.cpp b/src/openrct2-ui/windows/Viewport.cpp index 8dee649d2707..e5e5b1b9aad3 100644 --- a/src/openrct2-ui/windows/Viewport.cpp +++ b/src/openrct2-ui/windows/Viewport.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -149,7 +149,7 @@ namespace OpenRCT2::Ui::Windows } } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { drawWidgets(rt); @@ -199,8 +199,8 @@ namespace OpenRCT2::Ui::Windows { Widget* viewportWidget = &widgets[WIDX_VIEWPORT]; viewport->pos = windowPos + ScreenCoordsXY{ viewportWidget->left + 1, viewportWidget->top + 1 }; - viewport->width = widgets[WIDX_VIEWPORT].width() - 1; - viewport->height = widgets[WIDX_VIEWPORT].height() - 1; + viewport->width = widgets[WIDX_VIEWPORT].width() - 2; + viewport->height = widgets[WIDX_VIEWPORT].height() - 2; } } }; diff --git a/src/openrct2-ui/windows/Water.cpp b/src/openrct2-ui/windows/Water.cpp index b8af23f4ad0d..f652f1eb3132 100644 --- a/src/openrct2-ui/windows/Water.cpp +++ b/src/openrct2-ui/windows/Water.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -149,7 +149,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_PREVIEW].image = ImageId(LandTool::SizeToSpriteIndex(gLandToolSize)); } - void onDraw(RenderTarget& rt) override + void onDraw(Drawing::RenderTarget& rt) override { auto screenCoords = ScreenCoordsXY{ windowPos.x + widgets[WIDX_PREVIEW].midX(), windowPos.y + widgets[WIDX_PREVIEW].midY() }; @@ -224,7 +224,6 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_BACKGROUND: - MapInvalidateSelectionRect(); gMapSelectFlags.unset(MapSelectFlag::enable); gCurrentToolId = Tool::waterDown; break; @@ -295,14 +294,12 @@ namespace OpenRCT2::Ui::Windows */ void ToolUpdateWater(const ScreenCoordsXY& screenPos) { - MapInvalidateSelectionRect(); - auto* windowMgr = Ui::GetWindowManager(); auto& gameState = getGameState(); if (gCurrentToolId == Tool::upDownArrow) { - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) return; auto waterLowerAction = GameActions::WaterLowerAction( @@ -311,10 +308,10 @@ namespace OpenRCT2::Ui::Windows { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); auto res = GameActions::Query(&waterLowerAction, gameState); - money64 lowerCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + money64 lowerCost = res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; res = GameActions::Query(&waterRaiseAction, gameState); - money64 raiseCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + money64 raiseCost = res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; if (_waterToolRaiseCost != raiseCost || _waterToolLowerCost != lowerCost) { @@ -345,7 +342,7 @@ namespace OpenRCT2::Ui::Windows uint8_t state_changed = 0; - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) + if (!gMapSelectFlags.has(MapSelectFlag::enable)) { gMapSelectFlags.set(MapSelectFlag::enable); state_changed++; @@ -392,7 +389,6 @@ namespace OpenRCT2::Ui::Windows state_changed++; } - MapInvalidateSelectionRect(); if (!state_changed) return; @@ -402,10 +398,10 @@ namespace OpenRCT2::Ui::Windows { gMapSelectPositionA.x, gMapSelectPositionA.y, gMapSelectPositionB.x, gMapSelectPositionB.y }); auto res = GameActions::Query(&waterLowerAction, gameState); - money64 lowerCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + money64 lowerCost = res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; res = GameActions::Query(&waterRaiseAction, gameState); - money64 raiseCost = res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + money64 raiseCost = res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; if (_waterToolRaiseCost != raiseCost || _waterToolLowerCost != lowerCost) { @@ -447,7 +443,7 @@ namespace OpenRCT2::Ui::Windows ShowGridlines(); auto* toolWindow = ContextOpenWindow(WindowClass::water); ToolSet(*toolWindow, WIDX_BACKGROUND, Tool::waterDown); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); } } } // namespace OpenRCT2::Ui::Windows diff --git a/src/openrct2-ui/windows/Windows.h b/src/openrct2-ui/windows/Windows.h index 3a32e6e8a7f4..2e296db1a1bc 100644 --- a/src/openrct2-ui/windows/Windows.h +++ b/src/openrct2-ui/windows/Windows.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -233,12 +233,12 @@ namespace OpenRCT2::Ui::Windows WindowBase* ResearchFundingOpen(); void WindowResearchDevelopmentMouseUp(WidgetIndex widgetIndex, WidgetIndex baseWidgetIndex); void WindowResearchDevelopmentPrepareDraw(WindowBase* w, WidgetIndex baseWidgetIndex); - void WindowResearchDevelopmentDraw(WindowBase* w, RenderTarget& rt, WidgetIndex baseWidgetIndex); + void WindowResearchDevelopmentDraw(WindowBase* w, Drawing::RenderTarget& rt, WidgetIndex baseWidgetIndex); void WindowResearchFundingMouseDown(WindowBase* w, WidgetIndex widgetIndex, WidgetIndex baseWidgetIndex); void WindowResearchFundingMouseUp(WidgetIndex widgetIndex, WidgetIndex baseWidgetIndex); void WindowResearchFundingDropdown(WidgetIndex widgetIndex, int32_t selectedIndex, WidgetIndex baseWidgetIndex); void WindowResearchFundingPrepareDraw(WindowBase* w, WidgetIndex baseWidgetIndex); - void WindowResearchFundingDraw(WindowBase* w, RenderTarget& dpi); + void WindowResearchFundingDraw(WindowBase* w, Drawing::RenderTarget& rt); // Ride WindowBase* RideMainOpen(const Ride& ride); diff --git a/src/openrct2-win/openrct2-win.cpp b/src/openrct2-win/openrct2-win.cpp index d640e46f9a3a..ed4bed2c9236 100644 --- a/src/openrct2-win/openrct2-win.cpp +++ b/src/openrct2-win/openrct2-win.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -8,6 +8,9 @@ *****************************************************************************/ // Windows.h needs to be included first +#ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN +#endif #include // Enable visual styles @@ -20,13 +23,9 @@ #include #include #include -#include -#include #include #include -using namespace OpenRCT2; - static std::vector GetCommandLineArgs(int argc, wchar_t** argvW); /** @@ -54,7 +53,7 @@ static std::vector GetCommandLineArgs(int argc, wchar_t** argvW) std::vector argv; for (int i = 0; i < argc; i++) { - argv.push_back(String::toUtf8(argvW[i])); + argv.push_back(OpenRCT2::String::toUtf8(argvW[i])); } return argv; } diff --git a/src/openrct2/AssetPack.cpp b/src/openrct2/AssetPack.cpp index c843cf652a4d..389e7d6a4bd1 100644 --- a/src/openrct2/AssetPack.cpp +++ b/src/openrct2/AssetPack.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/AssetPack.h b/src/openrct2/AssetPack.h index a6a1a5d65a1d..0aec092ad023 100644 --- a/src/openrct2/AssetPack.h +++ b/src/openrct2/AssetPack.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/AssetPackManager.cpp b/src/openrct2/AssetPackManager.cpp index 9e12d400b752..f1c90edb9383 100644 --- a/src/openrct2/AssetPackManager.cpp +++ b/src/openrct2/AssetPackManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/AssetPackManager.h b/src/openrct2/AssetPackManager.h index 2fcf5dba117a..e8ad2aac1d2d 100644 --- a/src/openrct2/AssetPackManager.h +++ b/src/openrct2/AssetPackManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/CMakeLists.txt b/src/openrct2/CMakeLists.txt index e5283e13816a..5571bc02843b 100644 --- a/src/openrct2/CMakeLists.txt +++ b/src/openrct2/CMakeLists.txt @@ -202,7 +202,7 @@ if (MINGW) target_link_libraries(libopenrct2 -fstack-protector-strong) endif() -if (UNIX AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "BSD") +if (UNIX AND NOT HAIKU AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "BSD") # Include libdl for dlopen target_link_libraries(libopenrct2 dl) endif () diff --git a/src/openrct2/Cheats.cpp b/src/openrct2/Cheats.cpp index 72d6db7fcb50..190aa6633d5d 100644 --- a/src/openrct2/Cheats.cpp +++ b/src/openrct2/Cheats.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Cheats.h b/src/openrct2/Cheats.h index 85b14724b4bf..b81c28b02208 100644 --- a/src/openrct2/Cheats.h +++ b/src/openrct2/Cheats.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 78867e2f8346..6c32660e175a 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,6 +19,7 @@ #include "Game.h" #include "GameState.h" #include "GameStateSnapshots.h" +#include "Input.h" #include "OpenRCT2.h" #include "ParkImporter.h" #include "PlatformEnvironment.h" @@ -38,10 +39,12 @@ #include "core/Path.hpp" #include "core/String.hpp" #include "core/Timer.hpp" +#include "drawing/Drawing.h" #include "drawing/IDrawingEngine.h" #include "drawing/Image.h" #include "drawing/LightFX.h" #include "entity/EntityTweener.h" +#include "entity/PatrolArea.h" #include "interface/Chat.h" #include "interface/StdInOutConsole.h" #include "interface/Viewport.h" @@ -72,6 +75,7 @@ #include "ui/UiContext.h" #include "ui/WindowManager.h" #include "world/MapAnimation.h" +#include "world/MapSelection.h" #include #include @@ -480,6 +484,7 @@ namespace OpenRCT2 } #endif +#ifndef __HAIKU__ // Haiku's user is always root, skip warning them about it. if (Platform::ProcessIsElevated()) { std::string elevationWarning = _localisationService->GetString(STR_ADMIN_NOT_RECOMMENDED); @@ -492,6 +497,7 @@ namespace OpenRCT2 _uiContext->ShowMessageBox(elevationWarning); } } +#endif if (Platform::IsRunningInWine()) { @@ -533,9 +539,8 @@ namespace OpenRCT2 Drawing::LightFx::Init(); } - ViewportInitAll(); - ContextInit(); + ResetSubsystems(); if (!gOpenRCT2Headless) { @@ -555,6 +560,28 @@ namespace OpenRCT2 return true; } + /** + * rct2: 0x006E6EAC + */ + void ResetSubsystems() override + { + if (!gOpenRCT2NoGraphics) + { + ColoursInitMaps(); + } + + WindowInitAll(); + + gInputFlags.clearAll(); + InputSetState(InputState::Reset); + gPressedWidget.windowClassification = WindowClass::null; + gPickupPeepImage = ImageId(); + ResetTooltipNotShown(); + gMapSelectFlags.clearAll(); + ClearPatrolAreaToRender(); + TextinputCancel(); + } + private: void InitialiseRepositories() { @@ -1215,7 +1242,7 @@ namespace OpenRCT2 if (!gOpenRCT2Headless) { - _preloaderScene->SetOnComplete([&]() { SwitchToStartUpScene(); }); + GetPreloaderScene()->SetOnComplete([&]() { SwitchToStartUpScene(); }); } else { @@ -1299,6 +1326,8 @@ namespace OpenRCT2 UpdateTimeAccumulators(deltaTime); + Network::Update(); + if (useVariableFrame) { RunVariableFrame(deltaTime); @@ -1307,6 +1336,8 @@ namespace OpenRCT2 { RunFixedFrame(deltaTime); } + + Network::Flush(); } void UpdateTimeAccumulators(float deltaTime) @@ -1332,7 +1363,7 @@ namespace OpenRCT2 if (_ticksAccumulator < kGameUpdateTimeMS) { - const auto sleepTimeSec = (kGameUpdateTimeMS - _ticksAccumulator); + const auto sleepTimeSec = std::min(kNetworkUpdateTimeMS, kGameUpdateTimeMS - _ticksAccumulator); Platform::Sleep(static_cast(sleepTimeSec * 1000.f)); return; } @@ -1596,6 +1627,11 @@ namespace OpenRCT2 GetWindowManager()->Init(); } + void ContextResetSubsystems() + { + GetContext()->ResetSubsystems(); + } + bool ContextLoadParkFromStream(void* stream) { return GetContext()->LoadParkFromStream(static_cast(stream), ""); diff --git a/src/openrct2/Context.h b/src/openrct2/Context.h index a6ba477f6d3f..46738aca3018 100644 --- a/src/openrct2/Context.h +++ b/src/openrct2/Context.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -119,6 +119,8 @@ namespace OpenRCT2 virtual int32_t RunOpenRCT2(int argc, const char** argv) = 0; virtual bool Initialise() = 0; + virtual void ResetSubsystems() = 0; + virtual void InitialiseDrawingEngine() = 0; virtual void DisposeDrawingEngine() = 0; @@ -151,6 +153,7 @@ namespace OpenRCT2 [[nodiscard]] IContext* GetContext(); void ContextInit(); + void ContextResetSubsystems(); void ContextSetCurrentCursor(CursorID cursor); void ContextUpdateCursorScale(); void ContextHideCursor(); diff --git a/src/openrct2/Date.cpp b/src/openrct2/Date.cpp index 1375677a480c..af1d5af71281 100644 --- a/src/openrct2/Date.cpp +++ b/src/openrct2/Date.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Date.h b/src/openrct2/Date.h index 74cda83ac7d3..936bac86e067 100644 --- a/src/openrct2/Date.h +++ b/src/openrct2/Date.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Diagnostic.cpp b/src/openrct2/Diagnostic.cpp index 713b34b6fd2d..c59b0227f548 100644 --- a/src/openrct2/Diagnostic.cpp +++ b/src/openrct2/Diagnostic.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Diagnostic.h b/src/openrct2/Diagnostic.h index d718c3b2c7c3..5b6336a1f5bd 100644 --- a/src/openrct2/Diagnostic.h +++ b/src/openrct2/Diagnostic.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Editor.cpp b/src/openrct2/Editor.cpp index eb0596f0b552..16c695f49f9a 100644 --- a/src/openrct2/Editor.cpp +++ b/src/openrct2/Editor.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -23,12 +23,12 @@ #include "core/EnumUtils.hpp" #include "core/Path.hpp" #include "core/String.hpp" +#include "drawing/Drawing.h" #include "entity/EntityList.h" #include "entity/EntityRegistry.h" #include "entity/Guest.h" #include "entity/PatrolArea.h" #include "entity/Staff.h" -#include "interface/Viewport.h" #include "interface/WindowBase.h" #include "localisation/LocalisationService.h" #include "management/Finance.h" @@ -55,6 +55,7 @@ #include using namespace OpenRCT2; +using OpenRCT2::GameActions::CommandFlag; namespace OpenRCT2::Editor { @@ -117,7 +118,7 @@ namespace OpenRCT2::Editor gameState.park.flags |= PARK_FLAGS_SHOW_REAL_GUEST_NAMES; gameState.scenarioOptions.category = Scenario::Category::other; ObjectListLoad(); - ViewportInitAll(); + ContextResetSubsystems(); WindowBase* mainWindow = OpenEditorWindows(); mainWindow->setViewportLocation(TileCoordsXYZ{ 75, 75, 14 }.ToCoordsXYZ()); LoadPalette(); @@ -160,7 +161,7 @@ namespace OpenRCT2::Editor gLegacyScene = LegacyScene::scenarioEditor; gameState.editorStep = EditorStep::OptionsSelection; gameState.scenarioOptions.category = Scenario::Category::other; - ViewportInitAll(); + ContextResetSubsystems(); OpenEditorWindows(); FinaliseMainView(); gScreenAge = 0; @@ -194,7 +195,7 @@ namespace OpenRCT2::Editor gameState.editorStep = EditorStep::ObjectSelection; SetAllLandOwned(); ObjectListLoad(); - ViewportInitAll(); + ContextResetSubsystems(); WindowBase* mainWindow = OpenEditorWindows(); mainWindow->setViewportLocation(TileCoordsXYZ{ 75, 75, 14 }.ToCoordsXYZ()); LoadPalette(); @@ -222,7 +223,7 @@ namespace OpenRCT2::Editor SetAllLandOwned(); gameState.editorStep = EditorStep::ObjectSelection; ObjectListLoad(); - ViewportInitAll(); + ContextResetSubsystems(); WindowBase* mainWindow = OpenEditorWindows(); mainWindow->setViewportLocation(TileCoordsXYZ{ 75, 75, 14 }.ToCoordsXYZ()); LoadPalette(); @@ -243,11 +244,11 @@ namespace OpenRCT2::Editor (gameState.mapSize.y - 3) * kCoordsXYStep }; auto landSetRightsAction = GameActions::LandSetRightsAction(range, GameActions::LandSetRightSetting::SetForSale); - landSetRightsAction.SetFlags(GAME_COMMAND_FLAG_NO_SPEND); + landSetRightsAction.SetFlags({ CommandFlag::noSpend }); GameActions::Execute(&landSetRightsAction, gameState); auto landBuyRightsAction = GameActions::LandBuyRightsAction(range, GameActions::LandBuyRightSetting::BuyLand); - landBuyRightsAction.SetFlags(GAME_COMMAND_FLAG_NO_SPEND); + landBuyRightsAction.SetFlags({ CommandFlag::noSpend }); GameActions::Execute(&landBuyRightsAction, gameState); } @@ -262,7 +263,7 @@ namespace OpenRCT2::Editor getGameState().editorStep = EditorStep::LandscapeEditor; gScreenAge = 0; gLegacyScene = LegacyScene::scenarioEditor; - ViewportInitAll(); + ContextResetSubsystems(); OpenEditorWindows(); FinaliseMainView(); diff --git a/src/openrct2/Editor.h b/src/openrct2/Editor.h index 6281cee5cfc5..c696dd9aaa40 100644 --- a/src/openrct2/Editor.h +++ b/src/openrct2/Editor.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,7 +9,9 @@ #pragma once -#include "object/Object.h" +#include "core/StringTypes.h" +#include "localisation/StringIdType.h" +#include "object/ObjectTypes.h" struct ResultWithMessage; diff --git a/src/openrct2/EditorObjectSelectionSession.cpp b/src/openrct2/EditorObjectSelectionSession.cpp index 356c3f0056d6..6e3977797e30 100644 --- a/src/openrct2/EditorObjectSelectionSession.cpp +++ b/src/openrct2/EditorObjectSelectionSession.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,6 +15,7 @@ #include "Game.h" #include "GameState.h" #include "OpenRCT2.h" +#include "actions/ResultWithMessage.h" #include "drawing/Drawing.h" #include "entity/EntityList.h" #include "entity/Guest.h" @@ -142,12 +143,12 @@ void SetupInUseSelectionFlags() { for (auto i = 0u; i < getObjectEntryGroupCount(objectType); i++) { - Editor::ClearSelectedObject(static_cast(objectType), i, ObjectSelectionFlags::AllFlags); + Editor::ClearSelectedObject(objectType, i, ObjectSelectionFlags::AllFlags); - auto loadedObj = objectMgr.GetLoadedObject(static_cast(objectType), i); + auto loadedObj = objectMgr.GetLoadedObject(objectType, i); if (loadedObj != nullptr) { - Editor::SetSelectedObject(static_cast(objectType), i, ObjectSelectionFlags::Selected); + Editor::SetSelectedObject(objectType, i, ObjectSelectionFlags::Selected); } } } diff --git a/src/openrct2/EditorObjectSelectionSession.h b/src/openrct2/EditorObjectSelectionSession.h index 527704cc2b5e..2acf3eb91846 100644 --- a/src/openrct2/EditorObjectSelectionSession.h +++ b/src/openrct2/EditorObjectSelectionSession.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,10 +11,18 @@ #include "core/EnumUtils.hpp" #include "core/FlagHolder.hpp" -#include "object/Object.h" +#include "localisation/StringIdType.h" +#include "object/ObjectTypes.h" +#include #include +namespace OpenRCT2 +{ + struct ObjectEntryDescriptor; + struct ObjectRepositoryItem; +} // namespace OpenRCT2 + struct ResultWithMessage; enum class EditorInputFlag : uint8_t diff --git a/src/openrct2/FileClassifier.cpp b/src/openrct2/FileClassifier.cpp index 1b0bc7f4ffa6..e666116c1390 100644 --- a/src/openrct2/FileClassifier.cpp +++ b/src/openrct2/FileClassifier.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/FileClassifier.h b/src/openrct2/FileClassifier.h index e360b8d3c98e..b0d168c987af 100644 --- a/src/openrct2/FileClassifier.h +++ b/src/openrct2/FileClassifier.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Game.cpp b/src/openrct2/Game.cpp index fb037c21d6a5..2952540dfb2c 100644 --- a/src/openrct2/Game.cpp +++ b/src/openrct2/Game.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -31,6 +31,7 @@ #include "core/Money.hpp" #include "core/Path.hpp" #include "core/String.hpp" +#include "drawing/Drawing.h" #include "entity/EntityList.h" #include "entity/EntityRegistry.h" #include "entity/PatrolArea.h" @@ -364,7 +365,7 @@ void GameLoadInit() if (!gLoadKeepWindowsOpen) { - ViewportInitAll(); + ContextResetSubsystems(); GameCreateWindows(); } else diff --git a/src/openrct2/Game.h b/src/openrct2/Game.h index 9b08cf16c3a9..3971cc2e1ad0 100644 --- a/src/openrct2/Game.h +++ b/src/openrct2/Game.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -26,6 +26,11 @@ namespace OpenRCT2 // The maximum threshold to advance. constexpr float kGameUpdateMaxThreshold = kGameUpdateTimeMS * kGameMaxUpdates; + // The network update runs at a different rate to the game update. + constexpr uint32_t kNetworkUpdateFPS = 140; + // The network update interval in milliseconds, (1000 / 140fps) = ~7.14ms + constexpr float kNetworkUpdateTimeMS = 1.0f / kNetworkUpdateFPS; + constexpr float kGameMinTimeScale = 0.1f; constexpr float kGameMaxTimeScale = 5.0f; } // namespace OpenRCT2 @@ -121,19 +126,6 @@ enum class GameCommand : int32_t Count, }; -enum : uint32_t -{ - GAME_COMMAND_FLAG_APPLY = (1 << 0), // If this flag is set, the command is applied, otherwise only the cost is retrieved - GAME_COMMAND_FLAG_REPLAY = (1 << 1), // Command was issued from replay manager. - GAME_COMMAND_FLAG_2 = (1 << 2), // Unused - GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED = (1 << 3), // Allow while paused - GAME_COMMAND_FLAG_4 = (1 << 4), // Unused - GAME_COMMAND_FLAG_NO_SPEND = (1 << 5), // Game command is not networked - GAME_COMMAND_FLAG_GHOST = (1 << 6), // Game command is not networked - GAME_COMMAND_FLAG_TRACK_DESIGN = (1 << 7), - GAME_COMMAND_FLAG_NETWORKED = (1u << 31) // Game command is coming from network -}; - enum { GAME_PAUSED_NORMAL = 1 << 0, diff --git a/src/openrct2/GameState.cpp b/src/openrct2/GameState.cpp index d8ec67127b0c..2b968193916d 100644 --- a/src/openrct2/GameState.cpp +++ b/src/openrct2/GameState.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,6 +16,7 @@ #include "ReplayManager.h" #include "actions/GameAction.h" #include "config/Config.h" +#include "drawing/Drawing.h" #include "entity/EntityTweener.h" #include "entity/PatrolArea.h" #include "interface/Screenshot.h" @@ -170,17 +171,24 @@ namespace OpenRCT2 } // Keep updating the money effect even when paused. - getGameState().entities.UpdateMoneyEffect(); + auto& gameState = getGameState(); + gameState.entities.UpdateMoneyEffect(); // Post-tick network update - Network::ProcessPending(); + Network::PostTick(); // Post-tick game actions. - GameActions::ProcessQueue(); - getGameState().entities.UpdateEntitiesSpatialIndex(); + GameActions::ProcessQueue(gameState); + gameState.entities.UpdateEntitiesSpatialIndex(); } } + // Network has to always tick. + if (numUpdates == 0) + { + Network::Tick(); + } + // Update the game one or more times for (uint32_t i = 0; i < numUpdates; i++) { @@ -251,7 +259,7 @@ namespace OpenRCT2 GetContext()->GetReplayManager()->Update(); - Network::Update(); + Network::Tick(); auto& gameState = getGameState(); @@ -342,9 +350,9 @@ namespace OpenRCT2 gLastAutoSaveUpdate = Platform::GetTicks(); } - GameActions::ProcessQueue(); + GameActions::ProcessQueue(gameState); - Network::ProcessPending(); + Network::PostTick(); Network::Flush(); gameState.currentTicks++; diff --git a/src/openrct2/GameState.h b/src/openrct2/GameState.h index 7370c08f3d05..06ff80274973 100644 --- a/src/openrct2/GameState.h +++ b/src/openrct2/GameState.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/GameStateSnapshots.cpp b/src/openrct2/GameStateSnapshots.cpp index 1bbfd3f1d64f..58eaeae29cc7 100644 --- a/src/openrct2/GameStateSnapshots.cpp +++ b/src/openrct2/GameStateSnapshots.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/GameStateSnapshots.h b/src/openrct2/GameStateSnapshots.h index 87d892b9ab28..32601e3628c8 100644 --- a/src/openrct2/GameStateSnapshots.h +++ b/src/openrct2/GameStateSnapshots.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Identifiers.h b/src/openrct2/Identifiers.h index 96d8949f6c7c..f8fd87fddf1d 100644 --- a/src/openrct2/Identifiers.h +++ b/src/openrct2/Identifiers.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Input.cpp b/src/openrct2/Input.cpp index da023b981648..f0c5c359a8e6 100644 --- a/src/openrct2/Input.cpp +++ b/src/openrct2/Input.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Input.h b/src/openrct2/Input.h index 04efdf88b421..d5898444db99 100644 --- a/src/openrct2/Input.h +++ b/src/openrct2/Input.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,28 +15,18 @@ namespace OpenRCT2 { - enum InputFlag + enum class InputFlag : uint8_t { widgetPressed, - // The dropdown can stay open if the mouse is released, set on flag Dropdown::Flag::StayOpen. dropdownStayOpen, - - // The mouse has been released and the dropdown is still open. - // InputFlag::dropdownStayOpen is already set if this happens. + // The mouse has been released and the dropdown is still open. dropdownStayOpen is already set if this happens. dropdownMouseUp, - toolActive, - // Left click on a viewport leftMousePressed, - rightMousePressed, - - // Some of the map tools (clear, footpath, scenery) - // never read as far as I know. - unk6, - + allowRightMouseRemoval, viewportScrolling, }; using InputFlags = FlagHolder; diff --git a/src/openrct2/Limits.h b/src/openrct2/Limits.h index c2a07a01abe6..ed45a66d03f0 100644 --- a/src/openrct2/Limits.h +++ b/src/openrct2/Limits.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/OpenRCT2.cpp b/src/openrct2/OpenRCT2.cpp index 4e87220dcb31..1243ecdcf46c 100644 --- a/src/openrct2/OpenRCT2.cpp +++ b/src/openrct2/OpenRCT2.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/OpenRCT2.h b/src/openrct2/OpenRCT2.h index bef33cfd47bb..5c658ded5712 100644 --- a/src/openrct2/OpenRCT2.h +++ b/src/openrct2/OpenRCT2.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ParkImporter.cpp b/src/openrct2/ParkImporter.cpp index 01d127a0c986..daae96f70c2e 100644 --- a/src/openrct2/ParkImporter.cpp +++ b/src/openrct2/ParkImporter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ParkImporter.h b/src/openrct2/ParkImporter.h index 15ccc0b3c019..97119a538a24 100644 --- a/src/openrct2/ParkImporter.h +++ b/src/openrct2/ParkImporter.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,7 +10,6 @@ #pragma once #include "core/StringTypes.h" -#include "object/Object.h" #include "object/ObjectList.h" #include diff --git a/src/openrct2/PlatformEnvironment.cpp b/src/openrct2/PlatformEnvironment.cpp index 877204870381..9434eeab12ac 100644 --- a/src/openrct2/PlatformEnvironment.cpp +++ b/src/openrct2/PlatformEnvironment.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -108,6 +108,9 @@ class PlatformEnvironment final : public IPlatformEnvironment { default: case DirBase::rct1: + if (basePath.empty()) + return {}; + directoryName = kDirectoryNamesRCT2[EnumValue(did)]; break; case DirBase::rct2: diff --git a/src/openrct2/PlatformEnvironment.h b/src/openrct2/PlatformEnvironment.h index 99f1abb24c27..f3142e4842d0 100644 --- a/src/openrct2/PlatformEnvironment.h +++ b/src/openrct2/PlatformEnvironment.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ReplayManager.cpp b/src/openrct2/ReplayManager.cpp index f20979fce246..b7e30e1942f1 100644 --- a/src/openrct2/ReplayManager.cpp +++ b/src/openrct2/ReplayManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,18 +21,22 @@ #include "actions/FootpathPlaceAction.h" #include "actions/GameAction.h" #include "actions/RideEntranceExitPlaceAction.h" -// #include "actions/RideSetSettingAction.h" #include "actions/TileModifyAction.h" #include "actions/TrackPlaceAction.h" #include "config/Config.h" #include "core/Compression.h" #include "core/DataSerialiser.h" +#include "core/EnumUtils.hpp" #include "core/FileStream.h" #include "core/FileSystem.hpp" +#include "core/Guard.hpp" #include "core/Path.hpp" +#include "core/String.hpp" #include "entity/EntityRegistry.h" #include "entity/EntityTweener.h" #include "interface/Window.h" +#include "localisation/Formatting.h" +#include "localisation/StringIds.h" #include "management/NewsItem.h" #include "object/ObjectManager.h" #include "object/ObjectRepository.h" @@ -41,7 +45,10 @@ #include "world/Park.h" #include +#include #include +#include +#include #include namespace OpenRCT2 @@ -121,6 +128,13 @@ namespace OpenRCT2 NORMALISATION, }; + static constexpr std::array modeToName = { + "NONE", + "RECORDING", + "PLAYING", + "NORMALISATION", + }; + public: virtual ~ReplayManager() { @@ -415,23 +429,25 @@ namespace OpenRCT2 } } - virtual bool StartPlayback(const std::string& file) override + void StartPlayback(const std::string& file) override { if (_mode != ReplayMode::NONE && _mode != ReplayMode::NORMALISATION) - return false; + throw std::invalid_argument(std::string("Unexpected mode ") + modeToName[EnumValue(_mode)]); auto replayData = std::make_unique(); - if (!ReadReplayData(file, *replayData)) + try { - LOG_ERROR("Unable to read replay data."); - return false; + ReadReplayData(file, *replayData); + } + catch (const std::exception&) + { + throw; } if (!LoadReplayDataMap(*replayData)) { - LOG_ERROR("Unable to load map."); - return false; + throw std::runtime_error("Unable to load map."); } getGameState().currentTicks = replayData->tickStart; @@ -447,8 +463,6 @@ namespace OpenRCT2 if (_mode != ReplayMode::NORMALISATION) _mode = ReplayMode::PLAYING; - - return true; } virtual bool IsPlaybackStateMismatching() const override @@ -485,7 +499,11 @@ namespace OpenRCT2 { _mode = ReplayMode::NORMALISATION; - if (!StartPlayback(file)) + try + { + StartPlayback(file); + } + catch (const std::invalid_argument&) { return false; } @@ -595,23 +613,31 @@ namespace OpenRCT2 return recFile.data; } - bool ReadReplayData(const std::string& file, ReplayRecordData& data) + void ReadReplayData(const std::string& file, ReplayRecordData& data) { fs::path filePath = file; - if (filePath.extension() != ".parkrep") - filePath += ".parkrep"; - if (filePath.is_relative()) + if (filePath.is_absolute()) + { + if (!fs::exists(filePath)) + { + throw std::runtime_error(FormatStringID(STR_REPLAY_FILE_NOT_FOUND, filePath.u8string().c_str())); + } + } + else if (filePath.is_relative()) { + if (filePath.extension() != ".parkrep") + filePath += ".parkrep"; fs::path replayPath = GetContext()->GetPlatformEnvironment().GetDirectoryPath( DirBase::user, DirId::replayRecordings) / filePath; - if (fs::is_regular_file(replayPath)) - filePath = replayPath; + filePath = replayPath; } if (!fs::is_regular_file(filePath)) - return false; + { + throw std::runtime_error(FormatStringID(STR_REPLAY_FILE_NOT_FOUND, filePath.u8string().c_str())); + } FileStream fileStream(filePath, FileMode::open); MemoryStream stream = DecompressFile(fileStream); @@ -620,7 +646,7 @@ namespace OpenRCT2 DataSerialiser serialiser(false, stream); if (!Serialise(serialiser, data)) { - return false; + throw std::runtime_error(LanguageGetString(STR_REPLAY_NOT_STARTED)); } // Reset position of all streams. @@ -628,8 +654,6 @@ namespace OpenRCT2 data.parkParams.SetPosition(0); data.cheatData.SetPosition(0); data.gameStateSnapshots.SetPosition(0); - - return true; } bool SerialiseCheats(DataSerialiser& serialiser) @@ -837,20 +861,20 @@ namespace OpenRCT2 bool isPositionValid = false; GameAction* action = command.action.get(); - action->SetFlags(action->GetFlags() | GAME_COMMAND_FLAG_REPLAY); + action->SetFlags(action->GetFlags().with(CommandFlag::replay)); GameActions::Result result = GameActions::Execute(action, gameState); - if (result.Error == GameActions::Status::Ok) + if (result.error == GameActions::Status::ok) { isPositionValid = true; } // Focus camera on event. - if (!gSilentReplays && isPositionValid && !result.Position.IsNull()) + if (!gSilentReplays && isPositionValid && !result.position.IsNull()) { auto* mainWindow = WindowGetMain(); if (mainWindow != nullptr) - WindowScrollToLocation(*mainWindow, result.Position); + WindowScrollToLocation(*mainWindow, result.position); } replayQueue.erase(replayQueue.begin()); diff --git a/src/openrct2/ReplayManager.h b/src/openrct2/ReplayManager.h index c2286bf62fe1..7fd61f709689 100644 --- a/src/openrct2/ReplayManager.h +++ b/src/openrct2/ReplayManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,7 @@ #pragma once +#include #include #include #include @@ -59,7 +60,7 @@ namespace OpenRCT2 virtual bool StopRecording(bool discard = false) = 0; virtual bool GetCurrentReplayInfo(ReplayRecordInfo& info) const = 0; - virtual bool StartPlayback(const std::string& file) = 0; + virtual void StartPlayback(const std::string& file) = 0; virtual bool IsPlaybackStateMismatching() const = 0; virtual bool StopPlayback() = 0; diff --git a/src/openrct2/SpriteIds.h b/src/openrct2/SpriteIds.h index 0527a457c453..19dee65185fb 100644 --- a/src/openrct2/SpriteIds.h +++ b/src/openrct2/SpriteIds.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -23,7 +23,7 @@ enum : ImageIndex SPR_DEFAULT_PALETTE = 1532, SPR_SCROLLING_TEXT_LEGACY_START = 1542, - SPR_SCROLLING_TEXT_LEGACY_END = SPR_SCROLLING_TEXT_LEGACY_START + OpenRCT2::kMaxScrollingTextLegacyEntries, + SPR_SCROLLING_TEXT_LEGACY_END = SPR_SCROLLING_TEXT_LEGACY_START + OpenRCT2::Drawing::ScrollingText::kMaxLegacyEntries, SPR_SCROLLING_TEXT_DEFAULT = 1574, SPR_EDGE_ROCK_BASE = 1579, @@ -1809,7 +1809,7 @@ enum : ImageIndex SPR_CSG_END = SPR_CSG_BEGIN + OpenRCT2::RCT1::Limits::kNumLLCsgEntries, SPR_SCROLLING_TEXT_START = SPR_CSG_END, - SPR_SCROLLING_TEXT_END = SPR_SCROLLING_TEXT_START + OpenRCT2::kMaxScrollingTextEntries, + SPR_SCROLLING_TEXT_END = SPR_SCROLLING_TEXT_START + OpenRCT2::Drawing::ScrollingText::kMaxEntries, SPR_IMAGE_LIST_LENGTH = 1000000, SPR_IMAGE_LIST_BEGIN = SPR_SCROLLING_TEXT_END, diff --git a/src/openrct2/System.hpp b/src/openrct2/System.hpp index 510097d7403a..644e7d391c96 100644 --- a/src/openrct2/System.hpp +++ b/src/openrct2/System.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/TrackImporter.cpp b/src/openrct2/TrackImporter.cpp index fb77f38e5a19..530a3602704c 100644 --- a/src/openrct2/TrackImporter.cpp +++ b/src/openrct2/TrackImporter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/TrackImporter.h b/src/openrct2/TrackImporter.h index 6c2afa0cc379..10c807b783a1 100644 --- a/src/openrct2/TrackImporter.h +++ b/src/openrct2/TrackImporter.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Version.cpp b/src/openrct2/Version.cpp index 921bd12be923..4025f148733a 100644 --- a/src/openrct2/Version.cpp +++ b/src/openrct2/Version.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/Version.h b/src/openrct2/Version.h index c60fff777c47..cb63bc4dd238 100644 --- a/src/openrct2/Version.h +++ b/src/openrct2/Version.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,7 +12,7 @@ #include #define OPENRCT2_NAME "OpenRCT2" -#define kOpenRCT2Version "0.4.28" +#define kOpenRCT2Version "0.4.30" #if defined(__amd64__) || defined(_M_AMD64) #define OPENRCT2_ARCHITECTURE "x86-64" @@ -72,6 +72,9 @@ #ifdef __EMSCRIPTEN__ #define OPENRCT2_PLATFORM "Emscripten" #endif +#ifdef __HAIKU__ + #define OPENRCT2_PLATFORM "Haiku" +#endif #ifndef OPENRCT2_PLATFORM #error Unknown platform! #endif diff --git a/src/openrct2/actions/BalloonPressAction.cpp b/src/openrct2/actions/BalloonPressAction.cpp index f3562fb95687..19c72338de98 100644 --- a/src/openrct2/actions/BalloonPressAction.cpp +++ b/src/openrct2/actions/BalloonPressAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -44,7 +44,7 @@ namespace OpenRCT2::GameActions if (balloon == nullptr) { LOG_ERROR("Balloon not found for spriteIndex %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_BALLOON_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_BALLOON_NOT_FOUND); } return Result(); } @@ -55,7 +55,7 @@ namespace OpenRCT2::GameActions if (balloon == nullptr) { LOG_ERROR("Balloon not found for spriteIndex %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_BALLOON_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_BALLOON_NOT_FOUND); } balloon->Press(); diff --git a/src/openrct2/actions/BalloonPressAction.h b/src/openrct2/actions/BalloonPressAction.h index 468cba5809c2..75928a472e9a 100644 --- a/src/openrct2/actions/BalloonPressAction.h +++ b/src/openrct2/actions/BalloonPressAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/BannerPlaceAction.cpp b/src/openrct2/actions/BannerPlaceAction.cpp index 7f8fa5fca43c..e2132addf406 100644 --- a/src/openrct2/actions/BannerPlaceAction.cpp +++ b/src/openrct2/actions/BannerPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,6 +10,7 @@ #include "BannerPlaceAction.h" #include "../Diagnostic.h" +#include "../core/Guard.hpp" #include "../management/Finance.h" #include "../object/BannerSceneryEntry.h" #include "../object/ObjectEntryManager.h" @@ -54,56 +55,56 @@ namespace OpenRCT2::GameActions Result BannerPlaceAction::Query(GameState_t& gameState) const { auto res = Result(); - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.Expenditure = ExpenditureType::landscaping; - res.ErrorTitle = STR_CANT_POSITION_THIS_HERE; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.expenditure = ExpenditureType::landscaping; + res.errorTitle = STR_CANT_POSITION_THIS_HERE; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_OFF_EDGE_OF_MAP); } if (!MapCheckCapacityAndReorganise(_loc)) { LOG_ERROR("No free map elements."); - return Result(Status::NoFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + return Result(Status::noFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } auto pathElement = GetValidPathElement(); if (pathElement == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BE_BUILT_ACROSS_PATHS); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BE_BUILT_ACROSS_PATHS); } if (!MapCanBuildAt(_loc)) { - return Result(Status::NotOwned, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); } auto baseHeight = _loc.z + kPathHeightStep; BannerElement* existingBannerElement = MapGetBannerElementAt({ _loc.x, _loc.y, baseHeight }, _loc.direction); if (existingBannerElement != nullptr) { - return Result(Status::ItemAlreadyPlaced, STR_CANT_POSITION_THIS_HERE, STR_BANNER_SIGN_IN_THE_WAY); + return Result(Status::itemAlreadyPlaced, STR_CANT_POSITION_THIS_HERE, STR_BANNER_SIGN_IN_THE_WAY); } if (HasReachedBannerLimit()) { LOG_ERROR("No free banners available"); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); } - auto* bannerEntry = OpenRCT2::ObjectManager::GetObjectEntry(_bannerType); + auto* bannerEntry = ObjectManager::GetObjectEntry(_bannerType); if (bannerEntry == nullptr) { LOG_ERROR("Banner entry not found for bannerType %u", _bannerType); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } - res.Cost = bannerEntry->price; - res.SetData(BannerPlaceActionResult{}); + res.cost = bannerEntry->price; + res.setData(BannerPlaceActionResult{}); return res; } @@ -111,39 +112,39 @@ namespace OpenRCT2::GameActions Result BannerPlaceAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.Expenditure = ExpenditureType::landscaping; - res.ErrorTitle = STR_CANT_POSITION_THIS_HERE; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.expenditure = ExpenditureType::landscaping; + res.errorTitle = STR_CANT_POSITION_THIS_HERE; if (!MapCheckCapacityAndReorganise(_loc)) { LOG_ERROR("No free map elements."); - return Result(Status::NoFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + return Result(Status::noFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } - auto* bannerEntry = OpenRCT2::ObjectManager::GetObjectEntry(_bannerType); + auto* bannerEntry = ObjectManager::GetObjectEntry(_bannerType); if (bannerEntry == nullptr) { LOG_ERROR("Banner entry not found for bannerType %u", _bannerType); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } auto banner = CreateBanner(); if (banner == nullptr) { LOG_ERROR("No free banners available"); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); } banner->flags = {}; banner->text = {}; - banner->textColour = TextColour::white; + banner->textColour = Drawing::TextColour::white; banner->type = _bannerType; // Banner must be deleted after this point in an early return banner->colour = _primaryColour; banner->position = TileCoordsXY(_loc); - res.SetData(BannerPlaceActionResult{ banner->id }); + res.setData(BannerPlaceActionResult{ banner->id }); auto* bannerElement = TileElementInsert({ _loc, _loc.z + (2 * kCoordsZStep) }, 0b0000); Guard::Assert(bannerElement != nullptr); @@ -151,12 +152,12 @@ namespace OpenRCT2::GameActions bannerElement->SetPosition(_loc.direction); bannerElement->ResetAllowedEdges(); bannerElement->SetIndex(banner->id); - bannerElement->SetGhost(GetFlags() & GAME_COMMAND_FLAG_GHOST); + bannerElement->SetGhost(GetFlags().has(CommandFlag::ghost)); MapInvalidateTileFull(_loc); MapAnimations::MarkTileForInvalidation(TileCoordsXY(_loc)); - res.Cost = bannerEntry->price; + res.cost = bannerEntry->price; return res; } @@ -170,7 +171,7 @@ namespace OpenRCT2::GameActions if (!(pathElement->GetEdges() & (1 << _loc.direction))) continue; - if (pathElement->IsGhost() && !(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (pathElement->IsGhost() && !GetFlags().has(CommandFlag::ghost)) continue; return pathElement; diff --git a/src/openrct2/actions/BannerPlaceAction.h b/src/openrct2/actions/BannerPlaceAction.h index b6dbd55e4673..115886acf564 100644 --- a/src/openrct2/actions/BannerPlaceAction.h +++ b/src/openrct2/actions/BannerPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/BannerRemoveAction.cpp b/src/openrct2/actions/BannerRemoveAction.cpp index af96b926a95c..61a389a36331 100644 --- a/src/openrct2/actions/BannerRemoveAction.cpp +++ b/src/openrct2/actions/BannerRemoveAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -47,19 +47,19 @@ namespace OpenRCT2::GameActions Result BannerRemoveAction::Query(GameState_t& gameState) const { auto res = Result(); - res.Expenditure = ExpenditureType::landscaping; - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.ErrorTitle = STR_CANT_REMOVE_THIS; + res.expenditure = ExpenditureType::landscaping; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.errorTitle = STR_CANT_REMOVE_THIS; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); } if (!MapCanBuildAt({ _loc.x, _loc.y, _loc.z - 16 })) { - return Result(Status::NotOwned, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); } BannerElement* bannerElement = GetBannerElementAt(); @@ -67,27 +67,27 @@ namespace OpenRCT2::GameActions { LOG_ERROR( "Invalid banner location, x = %d, y = %d, z = %d, direction = %d", _loc.x, _loc.y, _loc.z, _loc.direction); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); } auto bannerIndex = bannerElement->GetIndex(); if (bannerIndex == BannerIndex::GetNull()) { LOG_ERROR("Invalid banner index %u", bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); } auto banner = bannerElement->GetBanner(); if (banner == nullptr) { LOG_ERROR("Invalid banner index %u", bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); } auto* bannerEntry = ObjectManager::GetObjectEntry(banner->type); if (bannerEntry != nullptr) { - res.Cost = -((bannerEntry->price * 3) / 4); + res.cost = -((bannerEntry->price * 3) / 4); } return res; @@ -96,38 +96,38 @@ namespace OpenRCT2::GameActions Result BannerRemoveAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Expenditure = ExpenditureType::landscaping; - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.ErrorTitle = STR_CANT_REMOVE_THIS; + res.expenditure = ExpenditureType::landscaping; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.errorTitle = STR_CANT_REMOVE_THIS; BannerElement* bannerElement = GetBannerElementAt(); if (bannerElement == nullptr) { LOG_ERROR( "Invalid banner location, x = %d, y = %d, z = %d, direction = %d", _loc.x, _loc.y, _loc.z, _loc.direction); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); } auto bannerIndex = bannerElement->GetIndex(); if (bannerIndex == BannerIndex::GetNull()) { LOG_ERROR("Invalid banner index %u", bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); } auto banner = bannerElement->GetBanner(); if (banner == nullptr) { LOG_ERROR("Invalid banner index %u", bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); } auto* bannerEntry = ObjectManager::GetObjectEntry(banner->type); if (bannerEntry != nullptr) { - res.Cost = -((bannerEntry->price * 3) / 4); + res.cost = -((bannerEntry->price * 3) / 4); } reinterpret_cast(bannerElement)->RemoveBannerEntry(); @@ -144,7 +144,7 @@ namespace OpenRCT2::GameActions { if (bannerElement->GetBaseZ() != _loc.z) continue; - if (bannerElement->IsGhost() && !(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (bannerElement->IsGhost() && !GetFlags().has(CommandFlag::ghost)) continue; if (bannerElement->GetPosition() != _loc.direction) continue; diff --git a/src/openrct2/actions/BannerRemoveAction.h b/src/openrct2/actions/BannerRemoveAction.h index 448e7e82a6a7..d2063d321f42 100644 --- a/src/openrct2/actions/BannerRemoveAction.h +++ b/src/openrct2/actions/BannerRemoveAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/BannerSetColourAction.cpp b/src/openrct2/actions/BannerSetColourAction.cpp index 1b8348513d68..f376beee991d 100644 --- a/src/openrct2/actions/BannerSetColourAction.cpp +++ b/src/openrct2/actions/BannerSetColourAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -57,27 +57,27 @@ namespace OpenRCT2::GameActions Result BannerSetColourAction::QueryExecute(bool isExecuting) const { auto res = Result(); - res.Expenditure = ExpenditureType::landscaping; - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.ErrorTitle = STR_CANT_REPAINT_THIS; + res.expenditure = ExpenditureType::landscaping; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.errorTitle = STR_CANT_REPAINT_THIS; if (!LocationValid(_loc)) { LOG_ERROR("Invalid x / y coordinates: x = %d, y = %d", _loc.x, _loc.y); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); } if (_primaryColour > 31) { LOG_ERROR("Invalid primary colour %u", _primaryColour); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); } if (!MapCanBuildAt({ _loc.x, _loc.y, _loc.z - 16 })) { - return Result(Status::NotOwned, STR_CANT_REPAINT_THIS, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_REPAINT_THIS, STR_LAND_NOT_OWNED_BY_PARK); } auto bannerElement = MapGetBannerElementAt(_loc, _loc.direction); @@ -85,7 +85,7 @@ namespace OpenRCT2::GameActions if (bannerElement == nullptr) { LOG_ERROR("No banner at x = %d, y = %d, z = %d, direction = %u", _loc.x, _loc.y, _loc.z, _loc.direction); - return Result(Status::Unknown, STR_CANT_REPAINT_THIS, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::unknown, STR_CANT_REPAINT_THIS, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } auto index = bannerElement->GetIndex(); @@ -93,7 +93,7 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("Invalid banner index %u", index); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } if (isExecuting) diff --git a/src/openrct2/actions/BannerSetColourAction.h b/src/openrct2/actions/BannerSetColourAction.h index 271c2073a475..56fec7f7b294 100644 --- a/src/openrct2/actions/BannerSetColourAction.h +++ b/src/openrct2/actions/BannerSetColourAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/BannerSetNameAction.cpp b/src/openrct2/actions/BannerSetNameAction.cpp index e2252acf2c66..28c2fff10098 100644 --- a/src/openrct2/actions/BannerSetNameAction.cpp +++ b/src/openrct2/actions/BannerSetNameAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include "../Diagnostic.h" #include "../core/String.hpp" #include "../drawing/Drawing.h" +#include "../drawing/ScrollingText.h" #include "../localisation/StringIds.h" #include "../windows/Intent.h" #include "../world/Banner.h" @@ -51,7 +52,7 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("Banner not found for bannerIndex %d", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_RENAME_BANNER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_RENAME_BANNER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } TileElement* tileElement = BannerGetTileElement(_bannerIndex); @@ -59,7 +60,7 @@ namespace OpenRCT2::GameActions if (tileElement == nullptr) { LOG_ERROR("Banner tile element not found for bannerIndex %d", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_RENAME_BANNER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_RENAME_BANNER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } BannerElement* bannerElement = tileElement->AsBanner(); @@ -67,11 +68,11 @@ namespace OpenRCT2::GameActions if (!LocationValid(loc)) { - return Result(Status::InvalidParameters, STR_CANT_RENAME_BANNER, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_RENAME_BANNER, STR_OFF_EDGE_OF_MAP); } if (!MapCanBuildAt({ loc.x, loc.y, loc.z - 16 })) { - return Result(Status::NotOwned, STR_CANT_RENAME_BANNER, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_RENAME_BANNER, STR_LAND_NOT_OWNED_BY_PARK); } return Result(); @@ -83,7 +84,7 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("Banner not found for bannerIndex %d", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_RENAME_BANNER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_RENAME_BANNER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } banner->text = _name; @@ -92,7 +93,7 @@ namespace OpenRCT2::GameActions intent.PutExtra(INTENT_EXTRA_BANNER_INDEX, _bannerIndex); ContextBroadcastIntent(&intent); - ScrollingTextInvalidate(); + Drawing::ScrollingText::invalidate(); GfxInvalidateScreen(); return Result(); diff --git a/src/openrct2/actions/BannerSetNameAction.h b/src/openrct2/actions/BannerSetNameAction.h index f4b75ac5064a..38d9bbd35f55 100644 --- a/src/openrct2/actions/BannerSetNameAction.h +++ b/src/openrct2/actions/BannerSetNameAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/BannerSetStyleAction.cpp b/src/openrct2/actions/BannerSetStyleAction.cpp index 1101da6b14bf..d14bdc21b95f 100644 --- a/src/openrct2/actions/BannerSetStyleAction.cpp +++ b/src/openrct2/actions/BannerSetStyleAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,8 @@ #include "../Context.h" #include "../Diagnostic.h" +#include "../drawing/Drawing.h" +#include "../drawing/ScrollingText.h" #include "../localisation/StringIdType.h" #include "../management/Finance.h" #include "../windows/Intent.h" @@ -61,19 +63,19 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("Banner not found for bannerIndex %d", _bannerIndex); - return Result(Status::InvalidParameters, errorTitle, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, errorTitle, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } - res.Expenditure = ExpenditureType::landscaping; + res.expenditure = ExpenditureType::landscaping; auto location = banner->position.ToCoordsXY().ToTileCentre(); - res.Position = { location, TileElementHeight(location) }; + res.position = { location, TileElementHeight(location) }; TileElement* tileElement = BannerGetTileElement(_bannerIndex); if (tileElement == nullptr) { LOG_ERROR("Banner tile element not found for bannerIndex %d", _bannerIndex); - return Result(Status::InvalidParameters, errorTitle, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, errorTitle, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } BannerElement* bannerElement = tileElement->AsBanner(); @@ -81,11 +83,11 @@ namespace OpenRCT2::GameActions if (!LocationValid(loc)) { - return Result(Status::InvalidParameters, errorTitle, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, errorTitle, STR_OFF_EDGE_OF_MAP); } if (!MapCanBuildAt({ loc.x, loc.y, loc.z - 16 })) { - return Result(Status::NotOwned, errorTitle, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, errorTitle, STR_LAND_NOT_OWNED_BY_PARK); } switch (_type) @@ -94,7 +96,7 @@ namespace OpenRCT2::GameActions if (_parameter > COLOUR_COUNT) { LOG_ERROR("Invalid primary colour %u", _parameter); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); } break; @@ -102,19 +104,19 @@ namespace OpenRCT2::GameActions if (_parameter > 13) { LOG_ERROR("Invalid text colour %u", _parameter); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); } break; case BannerSetStyleType::NoEntry: if (tileElement->AsBanner() == nullptr) { LOG_ERROR("Tile element was not a banner."); - return Result(Status::Unknown, STR_CANT_RENAME_BANNER, kStringIdNone); + return Result(Status::unknown, STR_CANT_RENAME_BANNER, kStringIdNone); } break; default: LOG_ERROR("Invalid banner style type %u", _type); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_VALUE_OUT_OF_RANGE); } return res; } @@ -127,19 +129,19 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("Banner not found for bannerIndex %d", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } - res.Expenditure = ExpenditureType::landscaping; + res.expenditure = ExpenditureType::landscaping; auto location = banner->position.ToCoordsXY().ToTileCentre(); - res.Position = { location, TileElementHeight(location) }; + res.position = { location, TileElementHeight(location) }; TileElement* tileElement = BannerGetTileElement(_bannerIndex); if (tileElement == nullptr) { LOG_ERROR("Banner tile element not found for bannerIndex &u", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } switch (_type) @@ -148,7 +150,7 @@ namespace OpenRCT2::GameActions banner->colour = _parameter; break; case BannerSetStyleType::TextColour: - banner->textColour = static_cast(_parameter); + banner->textColour = static_cast(_parameter); break; case BannerSetStyleType::NoEntry: { @@ -156,7 +158,7 @@ namespace OpenRCT2::GameActions if (bannerElement == nullptr) { LOG_ERROR("Tile element was not a banner."); - return Result(Status::Unknown, STR_CANT_REPAINT_THIS, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::unknown, STR_CANT_REPAINT_THIS, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } banner->flags.set(BannerFlag::noEntry, (_parameter != 0)); @@ -170,14 +172,14 @@ namespace OpenRCT2::GameActions } default: LOG_ERROR("Invalid banner style type %u", _type); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_VALUE_OUT_OF_RANGE); } auto intent = Intent(INTENT_ACTION_UPDATE_BANNER); intent.PutExtra(INTENT_EXTRA_BANNER_INDEX, _bannerIndex); ContextBroadcastIntent(&intent); - ScrollingTextInvalidate(); + Drawing::ScrollingText::invalidate(); GfxInvalidateScreen(); return res; diff --git a/src/openrct2/actions/BannerSetStyleAction.h b/src/openrct2/actions/BannerSetStyleAction.h index 504e301cd2e7..7af76d39817c 100644 --- a/src/openrct2/actions/BannerSetStyleAction.h +++ b/src/openrct2/actions/BannerSetStyleAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/CheatSetAction.cpp b/src/openrct2/actions/CheatSetAction.cpp index cc2e3fc1e2eb..ef294ef70e45 100644 --- a/src/openrct2/actions/CheatSetAction.cpp +++ b/src/openrct2/actions/CheatSetAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,11 +10,11 @@ #include "CheatSetAction.h" #include "../Cheats.h" -#include "../Context.h" #include "../Diagnostic.h" #include "../GameState.h" #include "../config/Config.h" #include "../core/EnumUtils.hpp" +#include "../core/Guard.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" #include "../entity/Duck.h" @@ -32,13 +32,10 @@ #include "../ui/WindowManager.h" #include "../util/Util.h" #include "../windows/Intent.h" -#include "../world/Banner.h" #include "../world/Climate.h" -#include "../world/Footpath.h" #include "../world/Location.hpp" #include "../world/Map.h" #include "../world/Park.h" -#include "../world/Scenery.h" #include "../world/tile_element/PathElement.h" #include "../world/tile_element/SmallSceneryElement.h" #include "../world/tile_element/SurfaceElement.h" @@ -79,7 +76,7 @@ namespace OpenRCT2::GameActions if (static_cast(_cheatType) >= static_cast(CheatType::count)) { LOG_ERROR("Invalid cheat type %u", _cheatType); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } ParametersRange validRange = GetParameterRange(static_cast(_cheatType.id)); @@ -89,14 +86,14 @@ namespace OpenRCT2::GameActions LOG_ERROR( "The first cheat parameter is out of range. Value = %d, min = %d, max = %d", _param1, validRange.first.first, validRange.first.second); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } if (_param2 < validRange.second.first || _param2 > validRange.second.second) { LOG_ERROR( "The second cheat parameter is out of range. Value = %d, min = %d, max = %d", _param2, validRange.second.first, validRange.second.second); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); @@ -161,10 +158,10 @@ namespace OpenRCT2::GameActions SetScenarioNoMoney(gameState, _param1 != 0); break; case CheatType::addMoney: - AddMoney(_param1); + AddMoney(gameState, _param1); break; case CheatType::setMoney: - SetMoney(_param1); + SetMoney(gameState, _param1); break; case CheatType::clearLoan: ClearLoan(gameState); @@ -242,7 +239,7 @@ namespace OpenRCT2::GameActions windowMgr->InvalidateByClass(WindowClass::ride); break; case CheatType::ownAllLand: - OwnAllLand(); + OwnAllLand(gameState); break; case CheatType::disableRideValueAging: gameState.cheats.disableRideValueAging = _param1 != 0; @@ -274,7 +271,7 @@ namespace OpenRCT2::GameActions default: { LOG_ERROR("Invalid cheat type %d", _cheatType.id); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } } @@ -529,20 +526,18 @@ namespace OpenRCT2::GameActions if (mechanic != nullptr) { - if (ride.mechanicStatus == RIDE_MECHANIC_STATUS_FIXING) + if (ride.mechanicStatus == MechanicStatus::fixing) { mechanic->RideSubState = PeepRideSubState::approachExit; } - else if ( - ride.mechanicStatus == RIDE_MECHANIC_STATUS_CALLING - || ride.mechanicStatus == RIDE_MECHANIC_STATUS_HEADING) + else if (ride.mechanicStatus == MechanicStatus::calling || ride.mechanicStatus == MechanicStatus::heading) { mechanic->RemoveFromRide(); } } RideFixBreakdown(ride, 0); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride.windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); } } } @@ -574,7 +569,7 @@ namespace OpenRCT2::GameActions for (auto& ride : RideManager(gameState)) { // Set inspection interval to 10 minutes - ride.inspectionInterval = RIDE_INSPECTION_EVERY_10_MINUTES; + ride.inspectionInterval = RideInspection::every10Minutes; } auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByClass(WindowClass::ride); @@ -603,19 +598,19 @@ namespace OpenRCT2::GameActions windowMgr->InvalidateByClass(WindowClass::cheats); } - void CheatSetAction::SetMoney(money64 amount) const + void CheatSetAction::SetMoney(GameState_t& gameState, money64 amount) const { - getGameState().park.cash = amount; + gameState.park.cash = amount; auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByClass(WindowClass::finances); windowMgr->InvalidateByClass(WindowClass::bottomToolbar); } - void CheatSetAction::AddMoney(money64 amount) const + void CheatSetAction::AddMoney(GameState_t& gameState, money64 amount) const { - auto& park = getGameState().park; - park.cash = AddClamp(park.cash, amount); + auto& park = gameState.park; + park.cash = AddClamp(park.cash, amount); auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByClass(WindowClass::finances); @@ -625,7 +620,7 @@ namespace OpenRCT2::GameActions void CheatSetAction::ClearLoan(GameState_t& gameState) const { // First give money - AddMoney(getGameState().park.bankLoan); + AddMoney(gameState, gameState.park.bankLoan); // Then pay the loan auto gameAction = ParkSetLoanAction(0.00_GBP); @@ -706,7 +701,7 @@ namespace OpenRCT2::GameActions break; case OBJECT_UMBRELLA: peep->GiveItem(ShopItem::umbrella); - peep->UmbrellaColour = ScenarioRandMax(kColourNumOriginal); + peep->UmbrellaColour = ScenarioRandMax(kColourNumNormal); peep->UpdateAnimationGroup(); break; } @@ -731,8 +726,8 @@ namespace OpenRCT2::GameActions for (auto trainIndex : ride.vehicles) { - for (Vehicle* vehicle = getGameState().entities.TryGetEntity(trainIndex); vehicle != nullptr; - vehicle = getGameState().entities.TryGetEntity(vehicle->next_vehicle_on_train)) + for (Vehicle* vehicle = gameState.entities.TryGetEntity(trainIndex); vehicle != nullptr; + vehicle = gameState.entities.TryGetEntity(vehicle->next_vehicle_on_train)) { auto i = 0; for (auto& peepInTrainIndex : vehicle->peep) @@ -740,7 +735,7 @@ namespace OpenRCT2::GameActions if (i >= vehicle->num_peeps) break; - auto peep = getGameState().entities.TryGetEntity(peepInTrainIndex); + auto peep = gameState.entities.TryGetEntity(peepInTrainIndex); if (peep != nullptr && peep->CurrentRide == ride.id) { if ((peep->State == PeepState::onRide && peep->RideSubState == PeepRideSubState::onRide) @@ -786,7 +781,7 @@ namespace OpenRCT2::GameActions } } - void CheatSetAction::OwnAllLand() const + void CheatSetAction::OwnAllLand(GameState_t& gameState) const { const auto min = CoordsXY{ kCoordsXYStep, kCoordsXYStep }; const auto max = GetMapSizeUnits() - CoordsXY{ kCoordsXYStep, kCoordsXYStep }; @@ -817,7 +812,7 @@ namespace OpenRCT2::GameActions } // Completely unown peep spawn points - for (const auto& spawn : getGameState().peepSpawns) + for (const auto& spawn : gameState.peepSpawns) { auto* surfaceElement = MapGetSurfaceElementAt(spawn); if (surfaceElement != nullptr) diff --git a/src/openrct2/actions/CheatSetAction.h b/src/openrct2/actions/CheatSetAction.h index 750e19583624..934ce956ba08 100644 --- a/src/openrct2/actions/CheatSetAction.h +++ b/src/openrct2/actions/CheatSetAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -45,15 +45,15 @@ namespace OpenRCT2::GameActions void ResetRideCrashStatus(GameState_t& gameState) const; void Set10MinuteInspection(GameState_t& gameState) const; void SetScenarioNoMoney(GameState_t& gameState, bool enabled) const; - void SetMoney(money64 amount) const; - void AddMoney(money64 amount) const; + void SetMoney(GameState_t& gameState, money64 amount) const; + void AddMoney(GameState_t& gameState, money64 amount) const; void ClearLoan(GameState_t& gameState) const; void GenerateGuests(int32_t count) const; void SetGuestParameter(int32_t parameter, int32_t value) const; void GiveObjectToGuests(int32_t object) const; void RemoveAllGuests(GameState_t& gameState) const; void SetStaffSpeed(uint8_t value) const; - void OwnAllLand() const; + void OwnAllLand(GameState_t& gameState) const; void ParkSetOpen(bool isOpen, GameState_t& gameState) const; void CreateDucks(int count) const; void RemoveParkFences() const; diff --git a/src/openrct2/actions/ClearAction.cpp b/src/openrct2/actions/ClearAction.cpp index 379a844d9ad5..8bf6667bd6c0 100644 --- a/src/openrct2/actions/ClearAction.cpp +++ b/src/openrct2/actions/ClearAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -64,13 +64,13 @@ namespace OpenRCT2::GameActions Result ClearAction::CreateResult() const { auto result = Result(); - result.ErrorTitle = STR_UNABLE_TO_REMOVE_ALL_SCENERY_FROM_HERE; - result.Expenditure = ExpenditureType::landscaping; + result.errorTitle = STR_UNABLE_TO_REMOVE_ALL_SCENERY_FROM_HERE; + result.expenditure = ExpenditureType::landscaping; auto x = (_range.GetX1() + _range.GetX2()) / 2 + 16; auto y = (_range.GetY1() + _range.GetY2()) / 2 + 16; auto z = TileElementHeight({ x, y }); - result.Position = CoordsXYZ(x, y, z); + result.position = CoordsXYZ(x, y, z); return result; } @@ -80,7 +80,7 @@ namespace OpenRCT2::GameActions auto result = CreateResult(); auto noValidTiles = true; - auto error = Status::Ok; + auto error = Status::ok; StringId errorMessage = kStringIdNone; money64 totalCost = 0; @@ -100,7 +100,7 @@ namespace OpenRCT2::GameActions } else { - error = Status::NotOwned; + error = Status::notOwned; errorMessage = STR_LAND_NOT_OWNED_BY_PARK; } } @@ -113,11 +113,11 @@ namespace OpenRCT2::GameActions if (noValidTiles) { - result.Error = error; - result.ErrorMessage = errorMessage; + result.error = error; + result.errorMessage = errorMessage; } - result.Cost = totalCost; + result.cost = totalCost; return result; } @@ -149,11 +149,15 @@ namespace OpenRCT2::GameActions auto res = executing ? ExecuteNested(&footpathRemoveAction, gameState) : QueryNested(&footpathRemoveAction, gameState); - if (res.Error == Status::Ok) + if (res.error == Status::ok) { - totalCost += res.Cost; + totalCost += res.cost; tileEdited = executing; } + else if (res.error == Status::insufficientFunds) + { + totalCost += res.cost; + } } break; case TileElementType::SmallScenery: @@ -167,11 +171,15 @@ namespace OpenRCT2::GameActions auto res = executing ? ExecuteNested(&removeSceneryAction, gameState) : QueryNested(&removeSceneryAction, gameState); - if (res.Error == Status::Ok) + if (res.error == Status::ok) { - totalCost += res.Cost; + totalCost += res.cost; tileEdited = executing; } + else if (res.error == Status::insufficientFunds) + { + totalCost += res.cost; + } } break; case TileElementType::Wall: @@ -184,11 +192,15 @@ namespace OpenRCT2::GameActions auto res = executing ? ExecuteNested(&wallRemoveAction, gameState) : QueryNested(&wallRemoveAction, gameState); - if (res.Error == Status::Ok) + if (res.error == Status::ok) { - totalCost += res.Cost; + totalCost += res.cost; tileEdited = executing; } + else if (res.error == Status::insufficientFunds) + { + totalCost += res.cost; + } } break; case TileElementType::LargeScenery: @@ -197,16 +209,20 @@ namespace OpenRCT2::GameActions auto removeSceneryAction = LargeSceneryRemoveAction( { tilePos, tileElement->GetBaseZ(), tileElement->GetDirection() }, tileElement->AsLargeScenery()->GetSequenceIndex()); - removeSceneryAction.SetFlags(GetFlags() | GAME_COMMAND_FLAG_TRACK_DESIGN); + removeSceneryAction.SetFlags(GetFlags().with(CommandFlag::trackDesign)); auto res = executing ? ExecuteNested(&removeSceneryAction, gameState) : QueryNested(&removeSceneryAction, gameState); - if (res.Error == Status::Ok) + if (res.error == Status::ok) { - totalCost += res.Cost; + totalCost += res.cost; tileEdited = executing; } + else if (res.error == Status::insufficientFunds) + { + totalCost += res.cost; + } } break; default: diff --git a/src/openrct2/actions/ClearAction.h b/src/openrct2/actions/ClearAction.h index d0d9b58a42c9..d087b251571d 100644 --- a/src/openrct2/actions/ClearAction.h +++ b/src/openrct2/actions/ClearAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/CommandFlag.h b/src/openrct2/actions/CommandFlag.h new file mode 100644 index 000000000000..b77f3b175c92 --- /dev/null +++ b/src/openrct2/actions/CommandFlag.h @@ -0,0 +1,44 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../core/FlagHolder.hpp" + +#include + +namespace OpenRCT2::GameActions +{ + enum class CommandFlag : uint8_t + { + /** + * If this flag is set, the command is applied, otherwise only the cost is retrieved. + */ + apply, + /** + * Command was issued from replay manager. + */ + replay, + allowDuringPaused = 3, + /** + * Game command is not networked + */ + noSpend = 5, + /** + * Game command is not networked + */ + ghost = 6, + trackDesign = 7, + /** + * Game command is coming from network + */ + networked = 31, + }; + using CommandFlags = FlagHolder; +} // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/CustomAction.cpp b/src/openrct2/actions/CustomAction.cpp index 1a4c08a62f2a..90f70fff026a 100644 --- a/src/openrct2/actions/CustomAction.cpp +++ b/src/openrct2/actions/CustomAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/CustomAction.h b/src/openrct2/actions/CustomAction.h index fcf8ca14b27e..0ee60f159c10 100644 --- a/src/openrct2/actions/CustomAction.h +++ b/src/openrct2/actions/CustomAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/FootpathAdditionPlaceAction.cpp b/src/openrct2/actions/FootpathAdditionPlaceAction.cpp index ed3e3c816a5e..83d600758feb 100644 --- a/src/openrct2/actions/FootpathAdditionPlaceAction.cpp +++ b/src/openrct2/actions/FootpathAdditionPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -54,44 +54,44 @@ namespace OpenRCT2::GameActions Result FootpathAdditionPlaceAction::Query(GameState_t& gameState) const { auto res = Result(); - res.Expenditure = ExpenditureType::landscaping; - res.Position = _loc; + res.expenditure = ExpenditureType::landscaping; + res.position = _loc; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_OFF_EDGE_OF_MAP); } - if (!(gLegacyScene == LegacyScene::scenarioEditor || getGameState().cheats.sandboxMode) && !MapIsLocationOwned(_loc)) + if (!(gLegacyScene == LegacyScene::scenarioEditor || gameState.cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); } if (_loc.z < kFootpathMinHeight) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_LOW); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_LOW); } if (_loc.z > kFootpathMaxHeight) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_HIGH); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_HIGH); } auto tileElement = MapGetFootpathElement(_loc); if (tileElement == nullptr) { LOG_ERROR("No path element at x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_PATH_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_PATH_ELEMENT_NOT_FOUND); } auto pathElement = tileElement->AsPath(); if (pathElement->IsLevelCrossing(_loc)) { return Result( - Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CANNOT_BUILD_PATH_ADDITIONS_ON_LEVEL_CROSSINGS); + Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CANNOT_BUILD_PATH_ADDITIONS_ON_LEVEL_CROSSINGS); } // No change - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && pathElement->GetAdditionEntryIndex() == _entryIndex + if (!GetFlags().has(CommandFlag::ghost) && pathElement->GetAdditionEntryIndex() == _entryIndex && !(pathElement->IsBroken())) { return res; @@ -101,40 +101,40 @@ namespace OpenRCT2::GameActions if (pathAdditionEntry == nullptr) { LOG_ERROR("Unknown footpath addition entry for entryIndex %d", _entryIndex); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } uint16_t sceneryFlags = pathAdditionEntry->flags; if ((sceneryFlags & PATH_ADDITION_FLAG_DONT_ALLOW_ON_SLOPE) && pathElement->IsSloped()) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CANT_BUILD_THIS_ON_SLOPED_FOOTPATH); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CANT_BUILD_THIS_ON_SLOPED_FOOTPATH); } if ((sceneryFlags & PATH_ADDITION_FLAG_DONT_ALLOW_ON_QUEUE) && pathElement->IsQueue()) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CANNOT_PLACE_THESE_ON_QUEUE_LINE_AREA); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CANNOT_PLACE_THESE_ON_QUEUE_LINE_AREA); } if (!(sceneryFlags & (PATH_ADDITION_FLAG_JUMPING_FOUNTAIN_WATER | PATH_ADDITION_FLAG_JUMPING_FOUNTAIN_SNOW)) && (pathElement->GetEdges()) == 0x0F) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BE_PLACED_ON_PATH_EDGES); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BE_PLACED_ON_PATH_EDGES); } if ((sceneryFlags & PATH_ADDITION_FLAG_IS_QUEUE_SCREEN) && !pathElement->IsQueue()) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_PLACE_THESE_ON_QUEUE_AREA); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_PLACE_THESE_ON_QUEUE_AREA); } - res.Cost = pathAdditionEntry->price; + res.cost = pathAdditionEntry->price; // Should place a ghost? - if (GetFlags() & GAME_COMMAND_FLAG_GHOST) + if (GetFlags().has(CommandFlag::ghost)) { // Check if there is something on the path already if (pathElement->HasAddition()) { - return Result(Status::ItemAlreadyPlaced, STR_CANT_POSITION_THIS_HERE, kStringIdNone); + return Result(Status::itemAlreadyPlaced, STR_CANT_POSITION_THIS_HERE, kStringIdNone); } } return res; @@ -143,8 +143,8 @@ namespace OpenRCT2::GameActions Result FootpathAdditionPlaceAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Position = _loc; - res.Expenditure = ExpenditureType::landscaping; + res.position = _loc; + res.expenditure = ExpenditureType::landscaping; auto tileElement = MapGetFootpathElement(_loc); auto pathElement = tileElement->AsPath(); @@ -152,26 +152,26 @@ namespace OpenRCT2::GameActions if (pathElement == nullptr) { LOG_ERROR("No path element at x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_PATH_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_PATH_ELEMENT_NOT_FOUND); } // No change - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && pathElement->GetAdditionEntryIndex() == _entryIndex + if (!GetFlags().has(CommandFlag::ghost) && pathElement->GetAdditionEntryIndex() == _entryIndex && !(pathElement->IsBroken()) && !pathElement->AdditionIsGhost()) { return res; } - auto* pathAdditionEntry = OpenRCT2::ObjectManager::GetObjectEntry(_entryIndex); + auto* pathAdditionEntry = ObjectManager::GetObjectEntry(_entryIndex); if (pathAdditionEntry == nullptr) { LOG_ERROR("Unknown footpath addition entry for entryIndex %d", _entryIndex); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } - res.Cost = pathAdditionEntry->price; + res.cost = pathAdditionEntry->price; - if (GetFlags() & GAME_COMMAND_FLAG_GHOST) + if (GetFlags().has(CommandFlag::ghost)) { pathElement->SetAdditionIsGhost(true); } diff --git a/src/openrct2/actions/FootpathAdditionPlaceAction.h b/src/openrct2/actions/FootpathAdditionPlaceAction.h index 4e032c4c88c1..c5a40a033ecf 100644 --- a/src/openrct2/actions/FootpathAdditionPlaceAction.h +++ b/src/openrct2/actions/FootpathAdditionPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/FootpathAdditionRemoveAction.cpp b/src/openrct2/actions/FootpathAdditionRemoveAction.cpp index bf90e9b4b359..e96b996943b3 100644 --- a/src/openrct2/actions/FootpathAdditionRemoveAction.cpp +++ b/src/openrct2/actions/FootpathAdditionRemoveAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -50,53 +50,53 @@ namespace OpenRCT2::GameActions { if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); } - if (!(gLegacyScene == LegacyScene::scenarioEditor || getGameState().cheats.sandboxMode) && !MapIsLocationOwned(_loc)) + if (!(gLegacyScene == LegacyScene::scenarioEditor || gameState.cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { - return Result(Status::Disallowed, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); } if (_loc.z < kFootpathMinHeight) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_TOO_LOW); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_TOO_LOW); } if (_loc.z > kFootpathMaxHeight) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_TOO_HIGH); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_TOO_HIGH); } auto tileElement = MapGetFootpathElement(_loc); if (tileElement == nullptr) { LOG_ERROR("No path element at x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_ERR_PATH_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_ERR_PATH_ELEMENT_NOT_FOUND); } auto pathElement = tileElement->AsPath(); if (pathElement == nullptr) { LOG_ERROR("No path element at x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_ERR_PATH_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_ERR_PATH_ELEMENT_NOT_FOUND); } - if (!pathElement->AdditionIsGhost() && (GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!pathElement->AdditionIsGhost() && (GetFlags().has(CommandFlag::ghost))) { LOG_WARNING("Tried to remove non ghost during ghost removal."); - return Result(Status::Disallowed, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::disallowed, STR_CANT_REMOVE_THIS, kStringIdNone); } auto res = Result(); - res.Position = _loc; - res.Cost = 0.00_GBP; + res.position = _loc; + res.cost = 0.00_GBP; return res; } Result FootpathAdditionRemoveAction::Execute(GameState_t& gameState) const { auto* pathElement = MapGetFootpathElement(_loc); - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { FootpathInterruptPeeps(_loc); } @@ -104,15 +104,15 @@ namespace OpenRCT2::GameActions if (pathElement == nullptr) { LOG_ERROR("No path element at x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_ERR_PATH_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_ERR_PATH_ELEMENT_NOT_FOUND); } pathElement->SetAddition(0); MapInvalidateTileFull(_loc); auto res = Result(); - res.Position = _loc; - res.Cost = 0.00_GBP; + res.position = _loc; + res.cost = 0.00_GBP; return res; } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/FootpathAdditionRemoveAction.h b/src/openrct2/actions/FootpathAdditionRemoveAction.h index c7f2b9298b61..8e7f02fc9ab7 100644 --- a/src/openrct2/actions/FootpathAdditionRemoveAction.h +++ b/src/openrct2/actions/FootpathAdditionRemoveAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/FootpathLayoutPlaceAction.cpp b/src/openrct2/actions/FootpathLayoutPlaceAction.cpp index 0b6aa37e9c18..ce53879f5b81 100644 --- a/src/openrct2/actions/FootpathLayoutPlaceAction.cpp +++ b/src/openrct2/actions/FootpathLayoutPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../Cheats.h" #include "../GameState.h" #include "../OpenRCT2.h" +#include "../core/Guard.hpp" #include "../core/MemoryStream.h" #include "../localisation/StringIds.h" #include "../management/Finance.h" @@ -20,6 +21,7 @@ #include "../world/Footpath.h" #include "../world/Location.hpp" #include "../world/Map.h" +#include "../world/MapLimits.h" #include "../world/Park.h" #include "../world/QuarterTile.h" #include "../world/tile_element/EntranceElement.h" @@ -68,43 +70,43 @@ namespace OpenRCT2::GameActions Result FootpathLayoutPlaceAction::Query(GameState_t& gameState) const { auto res = Result(); - res.Cost = 0; - res.Expenditure = ExpenditureType::landscaping; - res.Position = _loc.ToTileCentre(); + res.cost = 0; + res.expenditure = ExpenditureType::landscaping; + res.position = _loc.ToTileCentre(); gFootpathGroundFlags = 0; if (!LocationValid(_loc) || MapIsEdge(_loc)) { - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_OFF_EDGE_OF_MAP); } - if (!(gLegacyScene == LegacyScene::scenarioEditor || getGameState().cheats.sandboxMode) && !MapIsLocationOwned(_loc)) + if (!(gLegacyScene == LegacyScene::scenarioEditor || gameState.cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { - return Result(Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); } if (_loc.z < kFootpathMinHeight) { - return Result(Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_LOW); + return Result(Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_LOW); } if (_loc.z > kFootpathMaxHeight) { - return Result(Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_HIGH); + return Result(Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_HIGH); } - return ElementInsertQuery(std::move(res)); + return ElementInsertQuery(gameState, std::move(res)); } Result FootpathLayoutPlaceAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Cost = 0; - res.Expenditure = ExpenditureType::landscaping; - res.Position = _loc.ToTileCentre(); + res.cost = 0; + res.expenditure = ExpenditureType::landscaping; + res.position = _loc.ToTileCentre(); - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { FootpathInterruptPeeps(_loc); } @@ -117,17 +119,17 @@ namespace OpenRCT2::GameActions return ElementInsertExecute(std::move(res)); } - Result FootpathLayoutPlaceAction::ElementInsertQuery(Result res) const + Result FootpathLayoutPlaceAction::ElementInsertQuery(GameState_t& gameState, Result res) const { bool entrancePath = false, entranceIsSamePath = false; if (!MapCheckCapacityAndReorganise(_loc)) { return Result( - Status::NoFreeElements, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + Status::noFreeElements, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } - res.Cost = 12.00_GBP; + res.cost = 12.00_GBP; QuarterTile quarterTile{ 0b1111, 0 }; auto zLow = _loc.z; @@ -147,7 +149,7 @@ namespace OpenRCT2::GameActions if (IsSameAsEntranceElement(*entranceElement)) entranceIsSamePath = true; else - res.Cost -= 6.00_GBP; + res.cost -= 6.00_GBP; } // Do not attempt to build a crossing with a queue or a sloped path. @@ -155,34 +157,34 @@ namespace OpenRCT2::GameActions auto crossingMode = isQueue || (_slope.type != FootpathSlopeType::flat) ? CreateCrossingMode::none : CreateCrossingMode::pathOverTrack; auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); - if (!entrancePath && canBuild.Error != Status::Ok) + { _loc, zLow, zHigh }, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); + if (!entrancePath && canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + canBuild.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; return canBuild; } - res.Cost += canBuild.Cost; + res.cost += canBuild.cost; - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); gFootpathGroundFlags = clearanceData.GroundFlags; - if (!getGameState().cheats.disableClearanceChecks && (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER)) + if (!gameState.cheats.disableClearanceChecks && (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER)) { - return Result(Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); + return Result(Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); } auto surfaceElement = MapGetSurfaceElementAt(_loc); if (surfaceElement == nullptr) { return Result( - Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } int32_t supportHeight = zLow - surfaceElement->GetBaseZ(); - res.Cost += supportHeight < 0 ? 20.00_GBP : (supportHeight / kPathHeightStep) * 5.00_GBP; + res.cost += supportHeight < 0 ? 20.00_GBP : (supportHeight / kPathHeightStep) * 5.00_GBP; // Prevent the place sound from being spammed if (entranceIsSamePath) - res.Cost = 0; + res.cost = 0; return res; } @@ -191,12 +193,12 @@ namespace OpenRCT2::GameActions { bool entrancePath = false, entranceIsSamePath = false; - if (!(GetFlags() & (GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_GHOST))) + if (!GetFlags().hasAny(CommandFlag::allowDuringPaused, CommandFlag::ghost)) { FootpathRemoveLitter(_loc); } - res.Cost = 12.00_GBP; + res.cost = 12.00_GBP; QuarterTile quarterTile{ 0b1111, 0 }; auto zLow = _loc.z; @@ -216,7 +218,7 @@ namespace OpenRCT2::GameActions if (IsSameAsEntranceElement(*entranceElement)) entranceIsSamePath = true; else - res.Cost -= 6.00_GBP; + res.cost -= 6.00_GBP; } // Do not attempt to build a crossing with a queue or a sloped path. @@ -224,30 +226,30 @@ namespace OpenRCT2::GameActions auto crossingMode = isQueue || (_slope.type != FootpathSlopeType::flat) ? CreateCrossingMode::none : CreateCrossingMode::pathOverTrack; auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceNonSceneryClearFunc, quarterTile, GAME_COMMAND_FLAG_APPLY | GetFlags(), + { _loc, zLow, zHigh }, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags().with(CommandFlag::apply), kTileSlopeFlat, crossingMode); - if (!entrancePath && canBuild.Error != Status::Ok) + if (!entrancePath && canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + canBuild.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; return canBuild; } - res.Cost += canBuild.Cost; + res.cost += canBuild.cost; - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); gFootpathGroundFlags = clearanceData.GroundFlags; auto surfaceElement = MapGetSurfaceElementAt(_loc); if (surfaceElement == nullptr) { return Result( - Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } int32_t supportHeight = zLow - surfaceElement->GetBaseZ(); - res.Cost += supportHeight < 0 ? 20.00_GBP : (supportHeight / kPathHeightStep) * 5.00_GBP; + res.cost += supportHeight < 0 ? 20.00_GBP : (supportHeight / kPathHeightStep) * 5.00_GBP; if (entrancePath) { - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && !entranceIsSamePath) + if (!GetFlags().has(CommandFlag::ghost) && !entranceIsSamePath) { if (_constructFlags & PathConstructFlag::IsLegacyPathObject) { @@ -284,14 +286,14 @@ namespace OpenRCT2::GameActions pathElement->SetIsBroken(false); pathElement->SetEdges(_edges); pathElement->SetCorners(0); - pathElement->SetGhost(GetFlags() & GAME_COMMAND_FLAG_GHOST); + pathElement->SetGhost(GetFlags().has(CommandFlag::ghost)); MapInvalidateTileFull(_loc); } // Prevent the place sound from being spammed if (entranceIsSamePath) - res.Cost = 0; + res.cost = 0; return res; } diff --git a/src/openrct2/actions/FootpathLayoutPlaceAction.h b/src/openrct2/actions/FootpathLayoutPlaceAction.h index c971241c4d58..a90ce529b79a 100644 --- a/src/openrct2/actions/FootpathLayoutPlaceAction.h +++ b/src/openrct2/actions/FootpathLayoutPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -39,7 +39,7 @@ namespace OpenRCT2::GameActions Result Execute(GameState_t& gameState) const override; private: - Result ElementInsertQuery(Result res) const; + Result ElementInsertQuery(GameState_t& gameState, Result res) const; Result ElementInsertExecute(Result res) const; bool IsSameAsEntranceElement(const EntranceElement& entranceElement) const; }; diff --git a/src/openrct2/actions/FootpathPlaceAction.cpp b/src/openrct2/actions/FootpathPlaceAction.cpp index 6883a092c847..3204d94b6eec 100644 --- a/src/openrct2/actions/FootpathPlaceAction.cpp +++ b/src/openrct2/actions/FootpathPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,6 +14,7 @@ #include "../Diagnostic.h" #include "../GameState.h" #include "../OpenRCT2.h" +#include "../core/Guard.hpp" #include "../core/MemoryStream.h" #include "../localisation/StringIds.h" #include "../management/Finance.h" @@ -77,41 +78,41 @@ namespace OpenRCT2::GameActions Result FootpathPlaceAction::Query(GameState_t& gameState) const { auto res = Result(); - res.Cost = 0; - res.Expenditure = ExpenditureType::landscaping; - res.Position = _loc.ToTileCentre(); + res.cost = 0; + res.expenditure = ExpenditureType::landscaping; + res.position = _loc.ToTileCentre(); gFootpathGroundFlags = 0; if (!LocationValid(_loc) || MapIsEdge(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_BUILD_FOOTPATH_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_BUILD_FOOTPATH_HERE, STR_OFF_EDGE_OF_MAP); } - if (!(gLegacyScene == LegacyScene::scenarioEditor || getGameState().cheats.sandboxMode) && !MapIsLocationOwned(_loc)) + if (!(gLegacyScene == LegacyScene::scenarioEditor || gameState.cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { - return Result(Status::Disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_LAND_NOT_OWNED_BY_PARK); } if (_slope.type == FootpathSlopeType::irregular || _slope.type == FootpathSlopeType::raise) { - return Result(Status::Disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_LAND_SLOPE_UNSUITABLE); + return Result(Status::disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_LAND_SLOPE_UNSUITABLE); } if (_loc.z < kFootpathMinHeight) { - return Result(Status::Disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_TOO_LOW); + return Result(Status::disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_TOO_LOW); } if (_loc.z > kFootpathMaxHeight) { - return Result(Status::Disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_TOO_HIGH); + return Result(Status::disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_TOO_HIGH); } if (_direction != kInvalidDirection && !DirectionValid(_direction)) { LOG_ERROR("Direction invalid. direction = %u", _direction); - return Result(Status::InvalidParameters, STR_CANT_BUILD_FOOTPATH_HERE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_BUILD_FOOTPATH_HERE, STR_ERR_VALUE_OUT_OF_RANGE); } auto intent = Intent(INTENT_ACTION_REMOVE_PROVISIONAL_FOOTPATH); @@ -120,7 +121,7 @@ namespace OpenRCT2::GameActions auto tileElement = MapGetFootpathElementWithSlope(_loc, _slope); if (tileElement == nullptr) { - return ElementInsertQuery(std::move(res)); + return ElementInsertQuery(gameState, std::move(res)); } return ElementUpdateQuery(tileElement, std::move(res)); } @@ -128,11 +129,11 @@ namespace OpenRCT2::GameActions Result FootpathPlaceAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Cost = 0; - res.Expenditure = ExpenditureType::landscaping; - res.Position = _loc.ToTileCentre(); + res.cost = 0; + res.expenditure = ExpenditureType::landscaping; + res.position = _loc.ToTileCentre(); - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { FootpathInterruptPeeps(_loc); } @@ -142,9 +143,9 @@ namespace OpenRCT2::GameActions // Force ride construction to recheck area _currentTrackSelectionFlags.set(TrackSelectionFlag::recheck); - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { - if (_direction != kInvalidDirection && !getGameState().cheats.disableClearanceChecks) + if (_direction != kInvalidDirection && !gameState.cheats.disableClearanceChecks) { // It is possible, let's remove walls between the old and new piece of path auto zLow = _loc.z; @@ -161,7 +162,7 @@ namespace OpenRCT2::GameActions auto tileElement = MapGetFootpathElementWithSlope(_loc, _slope); if (tileElement == nullptr) { - return ElementInsertExecute(std::move(res)); + return ElementInsertExecute(gameState, std::move(res)); } return ElementUpdateExecute(tileElement, std::move(res)); } @@ -215,17 +216,17 @@ namespace OpenRCT2::GameActions { if (_constructFlags & PathConstructFlag::IsQueue && pathElement->IsLevelCrossing(_loc)) { - return Result(Status::Disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_QUEUE_PATHS_CANNOT_BE_USED_FOR_LEVEL_CROSSINGS); + return Result(Status::disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_QUEUE_PATHS_CANNOT_BE_USED_FOR_LEVEL_CROSSINGS); } if (!IsSameAsPathElement(pathElement)) { - res.Cost += 6.00_GBP; + res.cost += 6.00_GBP; } - if (GetFlags() & GAME_COMMAND_FLAG_GHOST && !pathElement->IsGhost()) + if (GetFlags().has(CommandFlag::ghost) && !pathElement->IsGhost()) { - return Result(Status::ItemAlreadyPlaced, STR_CANT_BUILD_FOOTPATH_HERE, kStringIdNone); + return Result(Status::itemAlreadyPlaced, STR_CANT_BUILD_FOOTPATH_HERE, kStringIdNone); } return res; } @@ -234,12 +235,12 @@ namespace OpenRCT2::GameActions { if (!IsSameAsPathElement(pathElement)) { - res.Cost += 6.00_GBP; + res.cost += 6.00_GBP; } FootpathQueueChainReset(); - if (!(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN)) + if (!GetFlags().has(CommandFlag::trackDesign)) { FootpathRemoveEdgesAt(_loc, reinterpret_cast(pathElement)); } @@ -283,16 +284,16 @@ namespace OpenRCT2::GameActions return res; } - Result FootpathPlaceAction::ElementInsertQuery(Result res) const + Result FootpathPlaceAction::ElementInsertQuery(GameState_t& gameState, Result res) const { bool entrancePath = false, entranceIsSamePath = false; if (!MapCheckCapacityAndReorganise(_loc)) { - return Result(Status::NoFreeElements, STR_CANT_BUILD_FOOTPATH_HERE, kStringIdNone); + return Result(Status::noFreeElements, STR_CANT_BUILD_FOOTPATH_HERE, kStringIdNone); } - res.Cost = 12.00_GBP; + res.cost = 12.00_GBP; QuarterTile quarterTile{ 0b1111, 0 }; auto zLow = _loc.z; @@ -312,7 +313,7 @@ namespace OpenRCT2::GameActions if (IsSameAsEntranceElement(*entranceElement)) entranceIsSamePath = true; else - res.Cost -= 6.00_GBP; + res.cost -= 6.00_GBP; } // Do not attempt to build a crossing with a queue or a sloped path. @@ -320,47 +321,47 @@ namespace OpenRCT2::GameActions auto crossingMode = isQueue || (_slope.type != FootpathSlopeType::flat) ? CreateCrossingMode::none : CreateCrossingMode::pathOverTrack; auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); - if (!entrancePath && canBuild.Error != Status::Ok) + { _loc, zLow, zHigh }, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); + if (!entrancePath && canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_CANT_BUILD_FOOTPATH_HERE; + canBuild.errorTitle = STR_CANT_BUILD_FOOTPATH_HERE; return canBuild; } - res.Cost += canBuild.Cost; + res.cost += canBuild.cost; - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); gFootpathGroundFlags = clearanceData.GroundFlags; - if (!getGameState().cheats.disableClearanceChecks && (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER)) + if (!gameState.cheats.disableClearanceChecks && (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER)) { - return Result(Status::Disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_CANT_BUILD_THIS_UNDERWATER); + return Result(Status::disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_CANT_BUILD_THIS_UNDERWATER); } auto surfaceElement = MapGetSurfaceElementAt(_loc); if (surfaceElement == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_BUILD_FOOTPATH_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_BUILD_FOOTPATH_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } int32_t supportHeight = zLow - surfaceElement->GetBaseZ(); - res.Cost += supportHeight < 0 ? 20.00_GBP : (supportHeight / kPathHeightStep) * 5.00_GBP; + res.cost += supportHeight < 0 ? 20.00_GBP : (supportHeight / kPathHeightStep) * 5.00_GBP; // Prevent the place sound from being spammed if (entranceIsSamePath) - res.Cost = 0; + res.cost = 0; return res; } - Result FootpathPlaceAction::ElementInsertExecute(Result res) const + Result FootpathPlaceAction::ElementInsertExecute(GameState_t& gameState, Result res) const { bool entrancePath = false, entranceIsSamePath = false; - if (!(GetFlags() & (GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_GHOST))) + if (!GetFlags().hasAny(CommandFlag::allowDuringPaused, CommandFlag::ghost)) { FootpathRemoveLitter(_loc); } - res.Cost = 12.00_GBP; + res.cost = 12.00_GBP; QuarterTile quarterTile{ 0b1111, 0 }; auto zLow = _loc.z; @@ -380,7 +381,7 @@ namespace OpenRCT2::GameActions if (IsSameAsEntranceElement(*entranceElement)) entranceIsSamePath = true; else - res.Cost -= 6.00_GBP; + res.cost -= 6.00_GBP; } // Do not attempt to build a crossing with a queue or a sloped. @@ -388,29 +389,29 @@ namespace OpenRCT2::GameActions auto crossingMode = isQueue || (_slope.type != FootpathSlopeType::flat) ? CreateCrossingMode::none : CreateCrossingMode::pathOverTrack; auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceNonSceneryClearFunc, quarterTile, GAME_COMMAND_FLAG_APPLY | GetFlags(), + { _loc, zLow, zHigh }, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags().with(CommandFlag::apply), kTileSlopeFlat, crossingMode); - if (!entrancePath && canBuild.Error != Status::Ok) + if (!entrancePath && canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_CANT_BUILD_FOOTPATH_HERE; + canBuild.errorTitle = STR_CANT_BUILD_FOOTPATH_HERE; return canBuild; } - res.Cost += canBuild.Cost; + res.cost += canBuild.cost; - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); gFootpathGroundFlags = clearanceData.GroundFlags; auto surfaceElement = MapGetSurfaceElementAt(_loc); if (surfaceElement == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_BUILD_FOOTPATH_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_BUILD_FOOTPATH_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } int32_t supportHeight = zLow - surfaceElement->GetBaseZ(); - res.Cost += supportHeight < 0 ? 20.00_GBP : (supportHeight / kPathHeightStep) * 5.00_GBP; + res.cost += supportHeight < 0 ? 20.00_GBP : (supportHeight / kPathHeightStep) * 5.00_GBP; if (entrancePath) { - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && !entranceIsSamePath) + if (!GetFlags().has(CommandFlag::ghost) && !entranceIsSamePath) { if (_constructFlags & PathConstructFlag::IsLegacyPathObject) { @@ -445,17 +446,17 @@ namespace OpenRCT2::GameActions pathElement->SetRideIndex(RideId::GetNull()); pathElement->SetAdditionStatus(255); pathElement->SetIsBroken(false); - pathElement->SetGhost(GetFlags() & GAME_COMMAND_FLAG_GHOST); + pathElement->SetGhost(GetFlags().has(CommandFlag::ghost)); FootpathQueueChainReset(); - if (!(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN)) + if (!GetFlags().has(CommandFlag::trackDesign)) { FootpathRemoveEdgesAt(_loc, pathElement->as()); } - if (gLegacyScene == LegacyScene::scenarioEditor && !(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (gLegacyScene == LegacyScene::scenarioEditor && !GetFlags().has(CommandFlag::ghost)) { - AutomaticallySetPeepSpawn(); + AutomaticallySetPeepSpawn(gameState); } RemoveIntersectingWalls(pathElement); @@ -463,7 +464,7 @@ namespace OpenRCT2::GameActions // Prevent the place sound from being spammed if (entranceIsSamePath) - res.Cost = 0; + res.cost = 0; return res; } @@ -472,7 +473,7 @@ namespace OpenRCT2::GameActions * * rct2: 0x006A65AD */ - void FootpathPlaceAction::AutomaticallySetPeepSpawn() const + void FootpathPlaceAction::AutomaticallySetPeepSpawn(GameState_t& gameState) const { auto mapSizeUnits = GetMapSizeUnits(); uint8_t direction = 0; @@ -491,7 +492,6 @@ namespace OpenRCT2::GameActions } } - auto& gameState = getGameState(); if (gameState.peepSpawns.empty()) { gameState.peepSpawns.emplace_back(); @@ -505,7 +505,7 @@ namespace OpenRCT2::GameActions void FootpathPlaceAction::RemoveIntersectingWalls(PathElement* pathElement) const { - if (pathElement->IsSloped() && !(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (pathElement->IsSloped() && !GetFlags().has(CommandFlag::ghost)) { auto direction = pathElement->GetSlopeDirection(); int32_t z = pathElement->GetBaseZ(); @@ -520,7 +520,7 @@ namespace OpenRCT2::GameActions } } - if (!(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN)) + if (!GetFlags().has(CommandFlag::trackDesign)) FootpathConnectEdges(_loc, reinterpret_cast(pathElement), GetFlags()); FootpathUpdateQueueChains(); diff --git a/src/openrct2/actions/FootpathPlaceAction.h b/src/openrct2/actions/FootpathPlaceAction.h index 325e139766ea..ed2fcb2a42e4 100644 --- a/src/openrct2/actions/FootpathPlaceAction.h +++ b/src/openrct2/actions/FootpathPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -40,9 +40,9 @@ namespace OpenRCT2::GameActions private: Result ElementUpdateQuery(PathElement* pathElement, Result res) const; Result ElementUpdateExecute(PathElement* pathElement, Result res) const; - Result ElementInsertQuery(Result res) const; - Result ElementInsertExecute(Result res) const; - void AutomaticallySetPeepSpawn() const; + Result ElementInsertQuery(GameState_t& gameState, Result res) const; + Result ElementInsertExecute(GameState_t& gameState, Result res) const; + void AutomaticallySetPeepSpawn(GameState_t& gameState) const; void RemoveIntersectingWalls(PathElement* pathElement) const; PathElement* MapGetFootpathElementWithSlope(const CoordsXYZ& footpathPos, FootpathSlope slope) const; bool IsSameAsPathElement(const PathElement* pathElement) const; diff --git a/src/openrct2/actions/FootpathRemoveAction.cpp b/src/openrct2/actions/FootpathRemoveAction.cpp index 072adea40cc7..a0924ee45532 100644 --- a/src/openrct2/actions/FootpathRemoveAction.cpp +++ b/src/openrct2/actions/FootpathRemoveAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -51,27 +51,27 @@ namespace OpenRCT2::GameActions Result FootpathRemoveAction::Query(GameState_t& gameState) const { auto res = Result(); - res.Cost = 0; - res.Expenditure = ExpenditureType::landscaping; - res.Position = { _loc.x + 16, _loc.y + 16, _loc.z }; + res.cost = 0; + res.expenditure = ExpenditureType::landscaping; + res.position = { _loc.x + 16, _loc.y + 16, _loc.z }; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, STR_OFF_EDGE_OF_MAP); } - if (!(gLegacyScene == LegacyScene::scenarioEditor || getGameState().cheats.sandboxMode) && !MapIsLocationOwned(_loc)) + if (!(gLegacyScene == LegacyScene::scenarioEditor || gameState.cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { - return Result(Status::NotOwned, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, STR_LAND_NOT_OWNED_BY_PARK); } TileElement* footpathElement = GetFootpathElement(); if (footpathElement == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, STR_ERR_PATH_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, STR_ERR_PATH_ELEMENT_NOT_FOUND); } - res.Cost = GetRefundPrice(footpathElement); + res.cost = GetRefundPrice(footpathElement); return res; } @@ -79,11 +79,11 @@ namespace OpenRCT2::GameActions Result FootpathRemoveAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Cost = 0; - res.Expenditure = ExpenditureType::landscaping; - res.Position = { _loc.x + 16, _loc.y + 16, _loc.z }; + res.cost = 0; + res.expenditure = ExpenditureType::landscaping; + res.position = { _loc.x + 16, _loc.y + 16, _loc.z }; - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { FootpathInterruptPeeps(_loc); FootpathRemoveLitter(_loc); @@ -94,9 +94,9 @@ namespace OpenRCT2::GameActions { FootpathQueueChainReset(); auto bannerRes = RemoveBannersAtElement(gameState, _loc, footpathElement); - if (bannerRes.Error == Status::Ok) + if (bannerRes.error == Status::ok) { - res.Cost += bannerRes.Cost; + res.cost += bannerRes.cost; } FootpathRemoveEdgesAt(_loc, footpathElement); MapInvalidateTileFull(_loc); @@ -116,17 +116,17 @@ namespace OpenRCT2::GameActions } else { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, kStringIdNone); } - res.Cost += GetRefundPrice(footpathElement); + res.cost += GetRefundPrice(footpathElement); return res; } TileElement* FootpathRemoveAction::GetFootpathElement() const { - bool getGhostPath = GetFlags() & GAME_COMMAND_FLAG_GHOST; + bool getGhostPath = GetFlags().has(CommandFlag::ghost); for (auto* pathElement : TileElementsView(_loc)) { @@ -167,14 +167,16 @@ namespace OpenRCT2::GameActions auto bannerRemoveAction = BannerRemoveAction( { loc, tileElement->GetBaseZ(), tileElement->AsBanner()->GetPosition() }); bool isGhost = tileElement->IsGhost(); - auto bannerFlags = GetFlags() | (isGhost ? static_cast(GAME_COMMAND_FLAG_GHOST) : 0); + auto bannerFlags = GetFlags(); + if (isGhost) + bannerFlags.set(CommandFlag::ghost); bannerRemoveAction.SetFlags(bannerFlags); auto res = ExecuteNested(&bannerRemoveAction, gameState); // Ghost removal is free - if (res.Error == Status::Ok && !isGhost) + if (res.error == Status::ok && !isGhost) { - result.Cost += res.Cost; + result.cost += res.cost; } tileElement--; } diff --git a/src/openrct2/actions/FootpathRemoveAction.h b/src/openrct2/actions/FootpathRemoveAction.h index 302bde76e320..c0284793fa4e 100644 --- a/src/openrct2/actions/FootpathRemoveAction.h +++ b/src/openrct2/actions/FootpathRemoveAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/GameAction.cpp b/src/openrct2/actions/GameAction.cpp index 9fdff4938d1d..e8b1fc77b065 100644 --- a/src/openrct2/actions/GameAction.cpp +++ b/src/openrct2/actions/GameAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -91,7 +91,7 @@ namespace OpenRCT2::GameActions _actionQueue.emplace(tick, std::move(ga), _nextUniqueId++); } - void ProcessQueue() + void ProcessQueue(GameState_t& gameState) { if (_suspended) { @@ -99,7 +99,7 @@ namespace OpenRCT2::GameActions return; } - const uint32_t currentTick = getGameState().currentTicks; + const uint32_t currentTick = gameState.currentTicks; while (_actionQueue.begin() != _actionQueue.end()) { @@ -138,12 +138,12 @@ namespace OpenRCT2::GameActions } GameAction* action = queued.action.get(); - action->SetFlags(action->GetFlags() | GAME_COMMAND_FLAG_NETWORKED); + action->SetFlags(action->GetFlags().with(CommandFlag::networked)); Guard::Assert(action != nullptr); - Result result = Execute(action, getGameState()); - if (result.Error == Status::Ok && Network::GetMode() == Network::Mode::server) + Result result = Execute(action, gameState); + if (result.error == Status::ok && Network::GetMode() == Network::Mode::server) { // Relay this action to all other clients. Network::SendGameAction(action); @@ -177,11 +177,11 @@ namespace OpenRCT2::GameActions return ga; } - static bool CheckActionInPausedMode(uint32_t actionFlags) + static bool CheckActionInPausedMode(const GameState_t& gameState, uint32_t actionFlags) { if (gGamePaused == 0) return true; - if (getGameState().cheats.buildInPauseMode) + if (gameState.cheats.buildInPauseMode) return true; if (actionFlags & Flags::AllowWhilePaused) return true; @@ -193,27 +193,27 @@ namespace OpenRCT2::GameActions Guard::ArgumentNotNull(action); uint16_t actionFlags = action->GetActionFlags(); - if (topLevel && !CheckActionInPausedMode(actionFlags)) + if (topLevel && !CheckActionInPausedMode(gameState, actionFlags)) { Result result = Result(); - result.Error = Status::GamePaused; - result.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; - result.ErrorMessage = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; + result.error = Status::gamePaused; + result.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + result.errorMessage = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return result; } auto result = action->Query(gameState); - if (result.Error == Status::Ok) + if (result.error == Status::ok) { - if (!FinanceCheckAffordability(result.Cost, action->GetFlags())) + if (!FinanceCheckAffordability(result.cost, action->GetFlags())) { - result.Error = Status::InsufficientFunds; - result.ErrorTitle = STR_CANT_DO_THIS; - result.ErrorMessage = STR_NOT_ENOUGH_CASH_REQUIRES; - Formatter(result.ErrorMessageArgs.data()).Add(result.Cost); + result.error = Status::insufficientFunds; + result.errorTitle = STR_CANT_DO_THIS; + result.errorMessage = STR_NOT_ENOUGH_CASH_REQUIRES; + Formatter(result.errorMessageArgs.data()).Add(result.cost); } } return result; @@ -243,13 +243,13 @@ namespace OpenRCT2::GameActions MemoryStream output; }; - static void LogActionBegin(ActionLogContext& ctx, const GameAction* action) + static void LogActionBegin(const GameState_t& gameState, ActionLogContext& ctx, const GameAction* action) { MemoryStream& output = ctx.output; char temp[128] = {}; snprintf( - temp, sizeof(temp), "[%s] Tick: %u, GA: %s (%08X) (", GetRealm(), getGameState().currentTicks, action->GetName(), + temp, sizeof(temp), "[%s] Tick: %u, GA: %s (%08X) (", GetRealm(), gameState.currentTicks, action->GetName(), EnumValue(action->GetType())); output.Write(temp, strlen(temp)); @@ -266,9 +266,9 @@ namespace OpenRCT2::GameActions char temp[128] = {}; - if (result.Error != Status::Ok) + if (result.error != Status::ok) { - snprintf(temp, sizeof(temp), ") Failed, %u", static_cast(result.Error)); + snprintf(temp, sizeof(temp), ") Failed, %u", static_cast(result.error)); } else { @@ -288,22 +288,22 @@ namespace OpenRCT2::GameActions Guard::ArgumentNotNull(action); uint16_t actionFlags = action->GetActionFlags(); - uint32_t flags = action->GetFlags(); + auto flags = action->GetFlags(); // Some actions are not recorded in the replay. const auto ignoreForReplays = (actionFlags & Flags::IgnoreForReplays) != 0; - auto* replayManager = OpenRCT2::GetContext()->GetReplayManager(); + auto* replayManager = GetContext()->GetReplayManager(); if (replayManager != nullptr && (replayManager->IsReplaying() || replayManager->IsNormalising())) { // We only accept replay commands as long the replay is active. - if ((flags & GAME_COMMAND_FLAG_REPLAY) == 0 && !ignoreForReplays) + if (!flags.has(CommandFlag::replay) && !ignoreForReplays) { // TODO: Introduce proper error. auto result = Result(); - result.Error = Status::GamePaused; - result.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; - result.ErrorMessage = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; + result.error = Status::gamePaused; + result.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + result.errorMessage = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return result; } @@ -311,15 +311,14 @@ namespace OpenRCT2::GameActions Result result = QueryInternal(action, gameState, topLevel); #ifdef ENABLE_SCRIPTING - if (result.Error == Status::Ok - && ((Network::GetMode() == Network::Mode::none) || (flags & GAME_COMMAND_FLAG_NETWORKED))) + if (result.error == Status::ok && ((Network::GetMode() == Network::Mode::none) || flags.has(CommandFlag::networked))) { auto& scriptEngine = GetContext()->GetScriptEngine(); scriptEngine.RunGameActionHooks(*action, result, false); // Script hooks may now have changed the game action result... } #endif - if (result.Error == Status::Ok) + if (result.error == Status::ok) { if (topLevel) { @@ -327,7 +326,7 @@ namespace OpenRCT2::GameActions if (Network::GetMode() == Network::Mode::client) { // As a client we have to wait or send it first. - if (!(actionFlags & Flags::ClientOnly) && !(flags & GAME_COMMAND_FLAG_NETWORKED)) + if (!(actionFlags & Flags::ClientOnly) && !flags.has(CommandFlag::networked)) { LOG_VERBOSE("[%s] GameAction::Execute %s (Out)", GetRealm(), action->GetName()); Network::SendGameAction(action); @@ -340,10 +339,10 @@ namespace OpenRCT2::GameActions // If player is the server it would execute right away as where clients execute the commands // at the beginning of the frame, so we have to put them into the queue. // This is also the case when its executed from the UI update. - if (!(actionFlags & Flags::ClientOnly) && !(flags & GAME_COMMAND_FLAG_NETWORKED)) + if (!(actionFlags & Flags::ClientOnly) && !flags.has(CommandFlag::networked)) { LOG_VERBOSE("[%s] GameAction::Execute %s (Queue)", GetRealm(), action->GetName()); - Enqueue(action, getGameState().currentTicks); + Enqueue(action, gameState.currentTicks); return result; } @@ -351,33 +350,38 @@ namespace OpenRCT2::GameActions } ActionLogContext logContext; - LogActionBegin(logContext, action); + if (topLevel && !flags.has(CommandFlag::ghost)) + { + LogActionBegin(gameState, logContext, action); + } // Execute the action, changing the game state result = action->Execute(gameState); #ifdef ENABLE_SCRIPTING - if (result.Error == Status::Ok) + if (result.error == Status::ok) { auto& scriptEngine = GetContext()->GetScriptEngine(); scriptEngine.RunGameActionHooks(*action, result, true); // Script hooks may now have changed the game action result... } #endif - - LogActionFinish(logContext, action, result); + if (topLevel && !flags.has(CommandFlag::ghost)) + { + LogActionFinish(logContext, action, result); + } // If not top level just give away the result. if (!topLevel) return result; // Update money balance - if (result.Error == Status::Ok && FinanceCheckMoneyRequired(flags) && result.Cost != 0) + if (result.error == Status::ok && FinanceCheckMoneyRequired(flags) && result.cost != 0) { - FinancePayment(result.Cost, result.Expenditure); - MoneyEffect::Create(result.Cost, result.Position); + FinancePayment(result.cost, result.expenditure); + MoneyEffect::Create(result.cost, result.position); } - if (!(actionFlags & Flags::ClientOnly) && result.Error == Status::Ok) + if (!(actionFlags & Flags::ClientOnly) && result.error == Status::ok) { if (Network::GetMode() != Network::Mode::none) { @@ -389,31 +393,31 @@ namespace OpenRCT2::GameActions Network::SetPlayerLastAction(playerIndex, action->GetType()); Network::IncrementPlayerNumCommands(playerIndex); - if (result.Cost > 0) + if (result.cost > 0) { - Network::AddPlayerMoneySpent(playerIndex, result.Cost); + Network::AddPlayerMoneySpent(playerIndex, result.cost); } - if (!result.Position.IsNull()) + if (!result.position.IsNull()) { - Network::SetPlayerLastActionCoord(playerIndex, result.Position); + Network::SetPlayerLastActionCoord(playerIndex, result.position); } } else { - bool commandExecutes = (flags & GAME_COMMAND_FLAG_GHOST) == 0 && (flags & GAME_COMMAND_FLAG_NO_SPEND) == 0; + bool commandExecutes = !flags.hasAny(CommandFlag::ghost, CommandFlag::noSpend); bool recordAction = false; if (replayManager != nullptr && !ignoreForReplays) { if (replayManager->IsRecording() && commandExecutes) recordAction = true; - else if (replayManager->IsNormalising() && (flags & GAME_COMMAND_FLAG_REPLAY) != 0) + else if (replayManager->IsNormalising() && flags.has(CommandFlag::replay)) recordAction = true; // In normalisation we only feed back actions issued by the replay manager. } if (recordAction) { - replayManager->AddGameAction(getGameState().currentTicks, action); + replayManager->AddGameAction(gameState.currentTicks, action); } } } @@ -433,24 +437,24 @@ namespace OpenRCT2::GameActions } // Only show errors when its not a ghost and not a preview and also top level action. - bool shouldShowError = !(flags & GAME_COMMAND_FLAG_GHOST) && !(flags & GAME_COMMAND_FLAG_NO_SPEND) && topLevel; + bool shouldShowError = !flags.has(CommandFlag::ghost) && !flags.has(CommandFlag::noSpend) && topLevel; // In network mode the error should be only shown to the issuer of the action. if (Network::GetMode() != Network::Mode::none) { // If the action was never networked and query fails locally the player id is not assigned. // So compare only if the action went into the queue otherwise show errors by default. - const bool isActionFromNetwork = (action->GetFlags() & GAME_COMMAND_FLAG_NETWORKED) != 0; + const bool isActionFromNetwork = action->GetFlags().has(CommandFlag::networked); if (isActionFromNetwork && action->GetPlayer() != Network::GetCurrentPlayerId()) { shouldShowError = false; } } - if (result.Error != Status::Ok && shouldShowError) + if (result.error != Status::ok && shouldShowError) { auto windowManager = Ui::GetWindowManager(); - windowManager->ShowError(result.GetErrorTitle(), result.GetErrorMessage()); + windowManager->ShowError(result.getErrorTitle(), result.getErrorMessage()); } return result; @@ -468,7 +472,7 @@ namespace OpenRCT2::GameActions const char* GameAction::GetName() const { - return OpenRCT2::GameActions::GetName(_type); + return GameActions::GetName(_type); } bool GameAction::LocationValid(const CoordsXY& coords) const @@ -490,7 +494,7 @@ namespace OpenRCT2::GameActions obj.Set("type", EnumValue(_type)); auto flags = GetActionFlags(); - obj.Set("isClientOnly", (flags & GameActions::Flags::ClientOnly) != 0); + obj.Set("isClientOnly", (flags & Flags::ClientOnly) != 0); obj.Set("result", true); // Call the subscriptions diff --git a/src/openrct2/actions/GameAction.h b/src/openrct2/actions/GameAction.h index 7f4dee877ac3..3eb4f9c62cf6 100644 --- a/src/openrct2/actions/GameAction.h +++ b/src/openrct2/actions/GameAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -113,13 +113,13 @@ namespace OpenRCT2::GameActions { public: using Ptr = std::unique_ptr; - using Callback_t = std::function; + using Callback_t = std::function; private: GameCommand const _type; Network::PlayerId_t _playerId = { -1 }; // Callee - uint32_t _flags = 0; // GAME_COMMAND_FLAGS + CommandFlags _flags = {}; uint32_t _networkId = 0; Callback_t _callback; @@ -139,7 +139,7 @@ namespace OpenRCT2::GameActions void AcceptFlags(GameActionParameterVisitor& visitor) { - visitor.Visit("flags", _flags); + visitor.Visit("flags", _flags.holder); } Network::PlayerId_t GetPlayer() const @@ -160,28 +160,25 @@ namespace OpenRCT2::GameActions // Make sure we execute some things only on the client. uint16_t flags = 0; - if ((GetFlags() & GAME_COMMAND_FLAG_GHOST) != 0 || (GetFlags() & GAME_COMMAND_FLAG_NO_SPEND) != 0) + if (GetFlags().hasAny(CommandFlag::ghost, CommandFlag::noSpend)) { - flags |= OpenRCT2::GameActions::Flags::ClientOnly; + flags |= Flags::ClientOnly; } - if (GetFlags() & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) + if (GetFlags().has(CommandFlag::allowDuringPaused)) { - flags |= OpenRCT2::GameActions::Flags::AllowWhilePaused; + flags |= Flags::AllowWhilePaused; } return flags; } - /** - * Currently used for GAME_COMMAND_FLAGS, needs refactoring once everything is replaced. - */ - uint32_t GetFlags() const + CommandFlags GetFlags() const { return _flags; } - uint32_t SetFlags(uint32_t flags) + CommandFlags SetFlags(CommandFlags flags) { return _flags = flags; } @@ -213,7 +210,7 @@ namespace OpenRCT2::GameActions virtual void Serialise(DataSerialiser& stream) { - stream << DS_TAG(_networkId) << DS_TAG(_flags) << DS_TAG(_playerId); + stream << DS_TAG(_networkId) << DS_TAG(_flags.holder) << DS_TAG(_playerId); } // Helper function, allows const Objects to still serialize into DataSerialiser while being const. @@ -280,7 +277,7 @@ namespace OpenRCT2::GameActions void Enqueue(const GameAction* ga, uint32_t tick); void Enqueue(GameAction::Ptr&& ga, uint32_t tick); - void ProcessQueue(); + void ProcessQueue(GameState_t& gameState); void ClearQueue(); GameAction::Ptr Create(GameCommand id); diff --git a/src/openrct2/actions/GameActionRegistry.cpp b/src/openrct2/actions/GameActionRegistry.cpp index de3bb3516817..9d8a2bd15c64 100644 --- a/src/openrct2/actions/GameActionRegistry.cpp +++ b/src/openrct2/actions/GameActionRegistry.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -7,6 +7,7 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ +#include "../core/Guard.hpp" #include "BalloonPressAction.h" #include "BannerPlaceAction.h" #include "BannerRemoveAction.h" diff --git a/src/openrct2/actions/GameActionResult.cpp b/src/openrct2/actions/GameActionResult.cpp index bb53ea1010b7..94940c69c608 100644 --- a/src/openrct2/actions/GameActionResult.cpp +++ b/src/openrct2/actions/GameActionResult.cpp @@ -8,14 +8,14 @@ using namespace OpenRCT2; namespace OpenRCT2::GameActions { - Result::Result(Status error, StringId title, StringId message, uint8_t* args /*= nullptr*/) - : Error(error) - , ErrorTitle(title) - , ErrorMessage(message) + Result::Result(Status status, StringId title, StringId message, uint8_t* args /*= nullptr*/) + : error(status) + , errorTitle(title) + , errorMessage(message) { if (args != nullptr) { - std::copy_n(args, ErrorMessageArgs.size(), ErrorMessageArgs.begin()); + std::copy_n(args, errorMessageArgs.size(), errorMessageArgs.begin()); } } @@ -33,14 +33,14 @@ namespace OpenRCT2::GameActions } }; - std::string Result::GetErrorTitle() const + std::string Result::getErrorTitle() const { - return std::visit(StringVariantVisitor{ ErrorMessageArgs.data() }, ErrorTitle); + return std::visit(StringVariantVisitor{ errorMessageArgs.data() }, errorTitle); } - std::string Result::GetErrorMessage() const + std::string Result::getErrorMessage() const { - return std::visit(StringVariantVisitor{ ErrorMessageArgs.data() }, ErrorMessage); + return std::visit(StringVariantVisitor{ errorMessageArgs.data() }, errorMessage); } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/GameActionResult.h b/src/openrct2/actions/GameActionResult.h index f40d2b311f98..c97ab32d583b 100644 --- a/src/openrct2/actions/GameActionResult.h +++ b/src/openrct2/actions/GameActionResult.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -28,25 +28,25 @@ namespace OpenRCT2::GameActions */ enum class Status : uint16_t { - Ok, - InvalidParameters, - Disallowed, - GamePaused, - InsufficientFunds, - NotInEditorMode, + ok, + invalidParameters, + disallowed, + gamePaused, + insufficientFunds, + notInEditorMode, - NotOwned, - TooLow, - TooHigh, - NoClearance, - ItemAlreadyPlaced, + notOwned, + tooLow, + tooHigh, + noClearance, + itemAlreadyPlaced, - NotClosed, - Broken, + notClosed, + broken, - NoFreeElements, + noFreeElements, - Unknown = std::numeric_limits>::max(), + unknown = std::numeric_limits>::max(), }; /** @@ -57,50 +57,50 @@ namespace OpenRCT2::GameActions public: using StringVariant = std::variant; - Status Error = Status::Ok; - StringVariant ErrorTitle = kStringIdNone; - StringVariant ErrorMessage = kStringIdNone; - std::array ErrorMessageArgs{}; - CoordsXYZ Position = { kLocationNull, kLocationNull, kLocationNull }; - money64 Cost = 0; - ExpenditureType Expenditure = ExpenditureType::count; + Status error = Status::ok; + StringVariant errorTitle = kStringIdNone; + StringVariant errorMessage = kStringIdNone; + std::array errorMessageArgs{}; + CoordsXYZ position = { kLocationNull, kLocationNull, kLocationNull }; + money64 cost = 0; + ExpenditureType expenditure = ExpenditureType::count; #ifdef __ANDROID__ // Any_cast throws a bad_any_cast exception on Android // To avoid this in the Android release, a shared void pointer is used to store the result data. - std::shared_ptr ResultData; + std::shared_ptr resultData; #else // Other platforms still use Any as this provides type checks - std::any ResultData; + std::any resultData; #endif Result() = default; - Result(Status error, StringId title, StringId message, uint8_t* args = nullptr); + Result(Status status, StringId title, StringId message, uint8_t* args = nullptr); - std::string GetErrorTitle() const; - std::string GetErrorMessage() const; + std::string getErrorTitle() const; + std::string getErrorMessage() const; // It is recommended to use strong types since a type alias such as 'using MyType = uint32_t' // is still just uint32_t, this guarantees the data is associated with the correct type. template - void SetData(const T&& data) + void setData(const T&& data) { #ifdef __ANDROID__ - ResultData = std::make_shared(data); + resultData = std::make_shared(data); #else - ResultData = std::forward(data); + resultData = std::forward(data); #endif } template - T GetData() const + T getData() const { #ifdef __ANDROID__ - return *static_cast(ResultData.get()); + return *static_cast(resultData.get()); ; #else // This function will throw std::bad_any_cast if the type mismatches. - return std::any_cast(ResultData); + return std::any_cast(resultData); #endif } }; diff --git a/src/openrct2/actions/GameSetSpeedAction.cpp b/src/openrct2/actions/GameSetSpeedAction.cpp index d62a8090e08b..f17ba9a0ed06 100644 --- a/src/openrct2/actions/GameSetSpeedAction.cpp +++ b/src/openrct2/actions/GameSetSpeedAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -44,7 +44,7 @@ namespace OpenRCT2::GameActions if (!IsValidSpeed(_speed)) { LOG_ERROR("Invalid speed %u", _speed); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } return res; @@ -57,7 +57,7 @@ namespace OpenRCT2::GameActions if (!IsValidSpeed(_speed)) { LOG_ERROR("Invalid speed %u", _speed); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } gGameSpeed = _speed; diff --git a/src/openrct2/actions/GameSetSpeedAction.h b/src/openrct2/actions/GameSetSpeedAction.h index e42cfed52738..89842556c271 100644 --- a/src/openrct2/actions/GameSetSpeedAction.h +++ b/src/openrct2/actions/GameSetSpeedAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/GuestSetFlagsAction.cpp b/src/openrct2/actions/GuestSetFlagsAction.cpp index 5183f15ee817..f3c921fa2a47 100644 --- a/src/openrct2/actions/GuestSetFlagsAction.cpp +++ b/src/openrct2/actions/GuestSetFlagsAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -47,7 +47,7 @@ namespace OpenRCT2::GameActions if (peep == nullptr) { LOG_ERROR("Guest entity not found for peepID %u", _peepId.ToUnderlying()); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_CHANGE_THIS, kStringIdNone); } return Result(); } @@ -58,7 +58,7 @@ namespace OpenRCT2::GameActions if (peep == nullptr) { LOG_ERROR("Guest entity not found for peepID %u", _peepId.ToUnderlying()); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_CHANGE_THIS, kStringIdNone); } peep->PeepFlags = _newFlags; diff --git a/src/openrct2/actions/GuestSetFlagsAction.h b/src/openrct2/actions/GuestSetFlagsAction.h index d20c58e7c39b..1cda6807a3d6 100644 --- a/src/openrct2/actions/GuestSetFlagsAction.h +++ b/src/openrct2/actions/GuestSetFlagsAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/GuestSetNameAction.cpp b/src/openrct2/actions/GuestSetNameAction.cpp index 6c0f622f5ae3..a104edcf4d4e 100644 --- a/src/openrct2/actions/GuestSetNameAction.cpp +++ b/src/openrct2/actions/GuestSetNameAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -60,14 +60,14 @@ namespace OpenRCT2::GameActions { if (_spriteIndex.ToUnderlying() >= kMaxEntities || _spriteIndex.IsNull()) { - return Result(Status::InvalidParameters, STR_CANT_NAME_GUEST, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_NAME_GUEST, STR_ERR_VALUE_OUT_OF_RANGE); } - auto guest = getGameState().entities.TryGetEntity(_spriteIndex); + auto guest = gameState.entities.TryGetEntity(_spriteIndex); if (guest == nullptr) { LOG_ERROR("Guest entity not found for spriteIndex %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_CANT_NAME_GUEST, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_NAME_GUEST, kStringIdNone); } return Result(); @@ -75,11 +75,11 @@ namespace OpenRCT2::GameActions Result GuestSetNameAction::Execute(GameState_t& gameState) const { - auto guest = getGameState().entities.TryGetEntity(_spriteIndex); + auto guest = gameState.entities.TryGetEntity(_spriteIndex); if (guest == nullptr) { LOG_ERROR("Guest entity not found for spriteIndex %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_CANT_NAME_GUEST, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_NAME_GUEST, kStringIdNone); } auto curName = guest->GetName(); @@ -90,7 +90,7 @@ namespace OpenRCT2::GameActions if (!guest->SetName(_name)) { - return Result(Status::Unknown, STR_CANT_NAME_GUEST, kStringIdNone); + return Result(Status::unknown, STR_CANT_NAME_GUEST, kStringIdNone); } // Easter egg functions are for guests only @@ -102,7 +102,7 @@ namespace OpenRCT2::GameActions ContextBroadcastIntent(&intent); auto res = Result(); - res.Position = guest->GetLocation(); + res.position = guest->GetLocation(); return res; } diff --git a/src/openrct2/actions/GuestSetNameAction.h b/src/openrct2/actions/GuestSetNameAction.h index d9a423c0a471..9fb1f7581a83 100644 --- a/src/openrct2/actions/GuestSetNameAction.h +++ b/src/openrct2/actions/GuestSetNameAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/LandBuyRightsAction.cpp b/src/openrct2/actions/LandBuyRightsAction.cpp index c61f5bc4f910..568a9231d3f9 100644 --- a/src/openrct2/actions/LandBuyRightsAction.cpp +++ b/src/openrct2/actions/LandBuyRightsAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -59,15 +59,15 @@ namespace OpenRCT2::GameActions Result LandBuyRightsAction::Query(GameState_t& gameState) const { - return QueryExecute(false); + return QueryExecute(gameState, false); } Result LandBuyRightsAction::Execute(GameState_t& gameState) const { - return QueryExecute(true); + return QueryExecute(gameState, true); } - Result LandBuyRightsAction::QueryExecute(bool isExecuting) const + Result LandBuyRightsAction::QueryExecute(GameState_t& gameState, bool isExecuting) const { auto res = Result(); @@ -85,8 +85,8 @@ namespace OpenRCT2::GameActions (validRange.GetY1() + validRange.GetY2()) / 2 + 16, 0 }; centre.z = TileElementHeight(centre); - res.Position = centre; - res.Expenditure = ExpenditureType::landPurchase; + res.position = centre; + res.expenditure = ExpenditureType::landPurchase; // Game command modified to accept selection size for (auto y = validRange.GetY1(); y <= validRange.GetY2(); y += kCoordsXYStep) @@ -95,10 +95,10 @@ namespace OpenRCT2::GameActions { if (!LocationValid({ x, y })) continue; - auto result = MapBuyLandRightsForTile({ x, y }, isExecuting); - if (result.Error == Status::Ok) + auto result = MapBuyLandRightsForTile(gameState, { x, y }, isExecuting); + if (result.error == Status::ok) { - res.Cost += result.Cost; + res.cost += result.cost; } } } @@ -109,19 +109,19 @@ namespace OpenRCT2::GameActions return res; } - Result LandBuyRightsAction::MapBuyLandRightsForTile(const CoordsXY& loc, bool isExecuting) const + Result LandBuyRightsAction::MapBuyLandRightsForTile(GameState_t& gameState, const CoordsXY& loc, bool isExecuting) const { if (_setting >= LandBuyRightSetting::Count) { LOG_ERROR("Invalid land buying setting %u", _setting); - return Result(Status::InvalidParameters, kErrorTitles[0], STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, kErrorTitles[0], STR_ERR_VALUE_OUT_OF_RANGE); } SurfaceElement* surfaceElement = MapGetSurfaceElementAt(loc); if (surfaceElement == nullptr) { LOG_ERROR("No surface at x = %d, y = %d", loc.x, loc.y); - return Result(Status::InvalidParameters, kErrorTitles[EnumValue(_setting)], STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, kErrorTitles[EnumValue(_setting)], STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } auto res = Result(); @@ -135,14 +135,14 @@ namespace OpenRCT2::GameActions if (gLegacyScene == LegacyScene::scenarioEditor || (surfaceElement->GetOwnership() & OWNERSHIP_AVAILABLE) == 0) { - return Result(Status::NotOwned, kErrorTitles[EnumValue(_setting)], STR_LAND_NOT_FOR_SALE); + return Result(Status::notOwned, kErrorTitles[EnumValue(_setting)], STR_LAND_NOT_FOR_SALE); } if (isExecuting) { surfaceElement->SetOwnership(OWNERSHIP_OWNED); Park::UpdateFencesAroundTile(loc); } - res.Cost = getGameState().scenarioOptions.landPrice; + res.cost = gameState.scenarioOptions.landPrice; return res; case LandBuyRightSetting::BuyConstructionRights: // 2 @@ -154,7 +154,7 @@ namespace OpenRCT2::GameActions if (gLegacyScene == LegacyScene::scenarioEditor || (surfaceElement->GetOwnership() & OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE) == 0) { - return Result(Status::NotOwned, kErrorTitles[EnumValue(_setting)], STR_CONSTRUCTION_RIGHTS_NOT_FOR_SALE); + return Result(Status::notOwned, kErrorTitles[EnumValue(_setting)], STR_CONSTRUCTION_RIGHTS_NOT_FOR_SALE); } if (isExecuting) @@ -163,12 +163,12 @@ namespace OpenRCT2::GameActions uint16_t baseZ = surfaceElement->GetBaseZ(); MapInvalidateTile({ loc, baseZ, baseZ + 16 }); } - res.Cost = getGameState().scenarioOptions.constructionRightsPrice; + res.cost = gameState.scenarioOptions.constructionRightsPrice; return res; default: LOG_ERROR("Invalid land buying setting %u", _setting); - return Result(Status::InvalidParameters, kErrorTitles[0], STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, kErrorTitles[0], STR_ERR_VALUE_OUT_OF_RANGE); } } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/LandBuyRightsAction.h b/src/openrct2/actions/LandBuyRightsAction.h index 6269d633e061..60c4433bb00a 100644 --- a/src/openrct2/actions/LandBuyRightsAction.h +++ b/src/openrct2/actions/LandBuyRightsAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -45,7 +45,7 @@ namespace OpenRCT2::GameActions Result Execute(GameState_t& gameState) const override; private: - Result QueryExecute(bool isExecuting) const; - Result MapBuyLandRightsForTile(const CoordsXY& loc, bool isExecuting) const; + Result QueryExecute(GameState_t& gameState, bool isExecuting) const; + Result MapBuyLandRightsForTile(GameState_t& gameState, const CoordsXY& loc, bool isExecuting) const; }; } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/LandLowerAction.cpp b/src/openrct2/actions/LandLowerAction.cpp index 629530681912..c2fde776eef0 100644 --- a/src/openrct2/actions/LandLowerAction.cpp +++ b/src/openrct2/actions/LandLowerAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -76,12 +76,12 @@ namespace OpenRCT2::GameActions auto validRange = ClampRangeWithinMap(_range); - res.Position = { _coords.x, _coords.y, TileElementHeight(_coords) }; - res.Expenditure = ExpenditureType::landscaping; + res.position = { _coords.x, _coords.y, TileElementHeight(_coords) }; + res.expenditure = ExpenditureType::landscaping; if (isExecuting) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, { _coords.x, _coords.y, TileElementHeight(_coords) }); + Audio::Play3D(Audio::SoundId::placeItem, { _coords.x, _coords.y, TileElementHeight(_coords) }); } uint8_t maxHeight = MapGetHighestLandHeight(validRange); @@ -97,7 +97,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) continue; - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { @@ -127,13 +127,13 @@ namespace OpenRCT2::GameActions landSetHeightAction.SetFlags(GetFlags()); auto result = isExecuting ? ExecuteNested(&landSetHeightAction, gameState) : QueryNested(&landSetHeightAction, gameState); - if (result.Error == Status::Ok) + if (result.error == Status::ok) { - res.Cost += result.Cost; + res.cost += result.cost; } else { - result.ErrorTitle = STR_CANT_LOWER_LAND_HERE; + result.errorTitle = STR_CANT_LOWER_LAND_HERE; return result; } } @@ -141,7 +141,7 @@ namespace OpenRCT2::GameActions if (!withinOwnership) { - return Result(Status::Disallowed, STR_CANT_LOWER_LAND_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_CANT_LOWER_LAND_HERE, STR_LAND_NOT_OWNED_BY_PARK); } // Force ride construction to recheck area diff --git a/src/openrct2/actions/LandLowerAction.h b/src/openrct2/actions/LandLowerAction.h index e7bb79fc342f..a9aba164be88 100644 --- a/src/openrct2/actions/LandLowerAction.h +++ b/src/openrct2/actions/LandLowerAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/LandRaiseAction.cpp b/src/openrct2/actions/LandRaiseAction.cpp index 6d2237fd1303..aa55d8d7ab9c 100644 --- a/src/openrct2/actions/LandRaiseAction.cpp +++ b/src/openrct2/actions/LandRaiseAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -77,12 +77,12 @@ namespace OpenRCT2::GameActions auto validRange = ClampRangeWithinMap(_range); - res.Position = { _coords.x, _coords.y, TileElementHeight(_coords) }; - res.Expenditure = ExpenditureType::landscaping; + res.position = { _coords.x, _coords.y, TileElementHeight(_coords) }; + res.expenditure = ExpenditureType::landscaping; if (isExecuting) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, { _coords.x, _coords.y, TileElementHeight(_coords) }); + Audio::Play3D(Audio::SoundId::placeItem, { _coords.x, _coords.y, TileElementHeight(_coords) }); } uint8_t minHeight = MapGetLowestLandHeight(validRange); @@ -98,7 +98,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) continue; - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { @@ -131,13 +131,13 @@ namespace OpenRCT2::GameActions landSetHeightAction.SetFlags(GetFlags()); auto result = isExecuting ? ExecuteNested(&landSetHeightAction, gameState) : QueryNested(&landSetHeightAction, gameState); - if (result.Error == Status::Ok) + if (result.error == Status::ok) { - res.Cost += result.Cost; + res.cost += result.cost; } else { - result.ErrorTitle = STR_CANT_RAISE_LAND_HERE; + result.errorTitle = STR_CANT_RAISE_LAND_HERE; return result; } } @@ -145,7 +145,7 @@ namespace OpenRCT2::GameActions if (!withinOwnership) { - return Result(Status::Disallowed, STR_CANT_RAISE_LAND_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_CANT_RAISE_LAND_HERE, STR_LAND_NOT_OWNED_BY_PARK); } // Force ride construction to recheck area diff --git a/src/openrct2/actions/LandRaiseAction.h b/src/openrct2/actions/LandRaiseAction.h index 2987288edca2..36b9ade0f253 100644 --- a/src/openrct2/actions/LandRaiseAction.h +++ b/src/openrct2/actions/LandRaiseAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/LandSetHeightAction.cpp b/src/openrct2/actions/LandSetHeightAction.cpp index 2321b64a0a7e..24b23b2120b7 100644 --- a/src/openrct2/actions/LandSetHeightAction.cpp +++ b/src/openrct2/actions/LandSetHeightAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -62,20 +62,20 @@ namespace OpenRCT2::GameActions { if (gameState.park.flags & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES) { - return Result(Status::Disallowed, STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY, kStringIdNone); + return Result(Status::disallowed, STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY, kStringIdNone); } StringId errorMessage = CheckParameters(); if (errorMessage != kStringIdNone) { - return Result(Status::Disallowed, kStringIdNone, errorMessage); + return Result(Status::disallowed, kStringIdNone, errorMessage); } if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationInPark(_coords)) { - return Result(Status::Disallowed, STR_LAND_NOT_OWNED_BY_PARK, kStringIdNone); + return Result(Status::disallowed, STR_LAND_NOT_OWNED_BY_PARK, kStringIdNone); } } @@ -88,7 +88,7 @@ namespace OpenRCT2::GameActions TileElement* tileElement = CheckTreeObstructions(); if (tileElement != nullptr) { - auto res = Result(Status::Disallowed, kStringIdNone, kStringIdNone); + auto res = Result(Status::disallowed, kStringIdNone, kStringIdNone); MapGetObstructionErrorText(tileElement, res); return res; } @@ -102,13 +102,13 @@ namespace OpenRCT2::GameActions errorMessage = CheckRideSupports(); if (errorMessage != kStringIdNone) { - return Result(Status::Disallowed, kStringIdNone, errorMessage); + return Result(Status::disallowed, kStringIdNone, errorMessage); } } auto* surfaceElement = MapGetSurfaceElementAt(_coords); if (surfaceElement == nullptr) - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); // We need to check if there is _currently_ a level crossing on the tile. // For that, we need the old height, so we can't use the _height variable. @@ -116,13 +116,13 @@ namespace OpenRCT2::GameActions auto* pathElement = MapGetFootpathElement(oldCoords); if (pathElement != nullptr && pathElement->AsPath()->IsLevelCrossing(oldCoords)) { - return Result(Status::Disallowed, STR_REMOVE_LEVEL_CROSSING_FIRST, kStringIdNone); + return Result(Status::disallowed, STR_REMOVE_LEVEL_CROSSING_FIRST, kStringIdNone); } TileElement* tileElement = CheckFloatingStructures(reinterpret_cast(surfaceElement), _height); if (tileElement != nullptr) { - auto res = Result(Status::Disallowed, kStringIdNone, kStringIdNone); + auto res = Result(Status::disallowed, kStringIdNone, kStringIdNone); MapGetObstructionErrorText(tileElement, res); return res; } @@ -140,17 +140,17 @@ namespace OpenRCT2::GameActions } auto clearResult = MapCanConstructWithClearAt( - { _coords, _height * kCoordsZStep, zCorner * kCoordsZStep }, &MapSetLandHeightClearFunc, { 0b1111, 0 }, 0, + { _coords, _height * kCoordsZStep, zCorner * kCoordsZStep }, MapSetLandHeightClearFunc, { 0b1111, 0 }, {}, _style, CreateCrossingMode::none); - if (clearResult.Error != Status::Ok) + if (clearResult.error != Status::ok) { - clearResult.Error = Status::Disallowed; + clearResult.error = Status::disallowed; return clearResult; } } auto res = Result(); - res.Cost = sceneryRemovalCost + GetSurfaceHeightChangeCost(surfaceElement); - res.Expenditure = ExpenditureType::landscaping; + res.cost = sceneryRemovalCost + GetSurfaceHeightChangeCost(surfaceElement); + res.expenditure = ExpenditureType::landscaping; return res; } @@ -160,7 +160,7 @@ namespace OpenRCT2::GameActions auto surfaceHeight = TileElementHeight(_coords); FootpathRemoveLitter({ _coords, surfaceHeight }); - if (!getGameState().cheats.disableClearanceChecks) + if (!gameState.cheats.disableClearanceChecks) { WallRemoveAt({ _coords, _height * 8 - 16, _height * 8 + 32 }); cost += GetSmallSceneryRemovalCost(); @@ -169,15 +169,15 @@ namespace OpenRCT2::GameActions auto* surfaceElement = MapGetSurfaceElementAt(_coords); if (surfaceElement == nullptr) - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); cost += GetSurfaceHeightChangeCost(surfaceElement); SetSurfaceHeight(reinterpret_cast(surfaceElement)); auto res = Result(); - res.Position = { _coords.x + 16, _coords.y + 16, surfaceHeight }; - res.Cost = cost; - res.Expenditure = ExpenditureType::landscaping; + res.position = { _coords.x + 16, _coords.y + 16, surfaceHeight }; + res.cost = cost; + res.expenditure = ExpenditureType::landscaping; return res; } @@ -347,16 +347,16 @@ namespace OpenRCT2::GameActions MapInvalidateTileFull(_coords); } - int32_t LandSetHeightAction::MapSetLandHeightClearFunc( - TileElement** tile_element, [[maybe_unused]] const CoordsXY& coords, [[maybe_unused]] uint8_t flags, + bool LandSetHeightAction::MapSetLandHeightClearFunc( + TileElement** tile_element, [[maybe_unused]] const CoordsXY& coords, [[maybe_unused]] CommandFlags flags, [[maybe_unused]] money64* price) { if ((*tile_element)->GetType() == TileElementType::Surface) - return 0; + return true; if ((*tile_element)->GetType() == TileElementType::SmallScenery) - return 0; + return true; - return 1; + return false; } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/LandSetHeightAction.h b/src/openrct2/actions/LandSetHeightAction.h index 191d56ec4eec..b6a0fe93c6e3 100644 --- a/src/openrct2/actions/LandSetHeightAction.h +++ b/src/openrct2/actions/LandSetHeightAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -46,8 +46,8 @@ namespace OpenRCT2::GameActions * * rct2: 0x00663CB9 */ - static int32_t MapSetLandHeightClearFunc( - TileElement** tile_element, [[maybe_unused]] const CoordsXY& coords, [[maybe_unused]] uint8_t flags, + static bool MapSetLandHeightClearFunc( + TileElement** tile_element, [[maybe_unused]] const CoordsXY& coords, [[maybe_unused]] CommandFlags flags, [[maybe_unused]] money64* price); }; } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/LandSetRightsAction.cpp b/src/openrct2/actions/LandSetRightsAction.cpp index 4b47b49ad9f3..1c197773be6b 100644 --- a/src/openrct2/actions/LandSetRightsAction.cpp +++ b/src/openrct2/actions/LandSetRightsAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -66,15 +66,15 @@ namespace OpenRCT2::GameActions Result LandSetRightsAction::Query(GameState_t& gameState) const { - return QueryExecute(false); + return QueryExecute(gameState, false); } Result LandSetRightsAction::Execute(GameState_t& gameState) const { - return QueryExecute(true); + return QueryExecute(gameState, true); } - Result LandSetRightsAction::QueryExecute(bool isExecuting) const + Result LandSetRightsAction::QueryExecute(GameState_t& gameState, bool isExecuting) const { auto res = Result(); @@ -83,12 +83,12 @@ namespace OpenRCT2::GameActions (validRange.GetY1() + validRange.GetY2()) / 2 + 16, 0 }; centre.z = TileElementHeight(centre); - res.Position = centre; - res.Expenditure = ExpenditureType::landPurchase; + res.position = centre; + res.expenditure = ExpenditureType::landPurchase; - if (!isInEditorMode() && !getGameState().cheats.sandboxMode) + if (!isInEditorMode() && !gameState.cheats.sandboxMode) { - return Result(Status::NotInEditorMode, kStringIdNone, STR_LAND_NOT_FOR_SALE); + return Result(Status::notInEditorMode, kStringIdNone, STR_LAND_NOT_FOR_SALE); } // Game command modified to accept selection size @@ -98,10 +98,10 @@ namespace OpenRCT2::GameActions { if (!LocationValid({ x, y })) continue; - auto result = MapBuyLandRightsForTile({ x, y }, isExecuting); - if (result.Error == Status::Ok) + auto result = MapBuyLandRightsForTile(gameState, { x, y }, isExecuting); + if (result.error == Status::ok) { - res.Cost += result.Cost; + res.cost += result.cost; } } } @@ -109,18 +109,18 @@ namespace OpenRCT2::GameActions if (isExecuting) { MapCountRemainingLandRights(); - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::placeItem, centre); + Audio::Play3D(Audio::SoundId::placeItem, centre); } return res; } - Result LandSetRightsAction::MapBuyLandRightsForTile(const CoordsXY& loc, bool isExecuting) const + Result LandSetRightsAction::MapBuyLandRightsForTile(GameState_t& gameState, const CoordsXY& loc, bool isExecuting) const { SurfaceElement* surfaceElement = MapGetSurfaceElementAt(loc); if (surfaceElement == nullptr) { LOG_ERROR("No surface at x = %d, y = %d", loc.x, loc.y); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } auto res = Result(); @@ -187,7 +187,6 @@ namespace OpenRCT2::GameActions } } - auto& gameState = getGameState(); const uint8_t currentOwnership = surfaceElement->GetOwnership(); // Are land rights or construction rights currently owned? @@ -195,23 +194,23 @@ namespace OpenRCT2::GameActions { // Buying land if (!(currentOwnership & OWNERSHIP_OWNED) && (_ownership & OWNERSHIP_OWNED)) - res.Cost = gameState.scenarioOptions.landPrice; + res.cost = gameState.scenarioOptions.landPrice; // Buying construction rights if (!(currentOwnership & OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED) && (_ownership & OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED)) - res.Cost = gameState.scenarioOptions.constructionRightsPrice; + res.cost = gameState.scenarioOptions.constructionRightsPrice; } else { // Selling land if ((currentOwnership & OWNERSHIP_OWNED) && !(_ownership & OWNERSHIP_OWNED)) - res.Cost = -gameState.scenarioOptions.landPrice; + res.cost = -gameState.scenarioOptions.landPrice; // Selling construction rights if ((currentOwnership & OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED) && !(_ownership & OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED)) - res.Cost = -gameState.scenarioOptions.constructionRightsPrice; + res.cost = -gameState.scenarioOptions.constructionRightsPrice; } if (isExecuting) @@ -234,7 +233,7 @@ namespace OpenRCT2::GameActions } default: LOG_ERROR("Invalid setting %u to set land rights", _setting); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/LandSetRightsAction.h b/src/openrct2/actions/LandSetRightsAction.h index e64975708b7d..46bbde6f4235 100644 --- a/src/openrct2/actions/LandSetRightsAction.h +++ b/src/openrct2/actions/LandSetRightsAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -44,7 +44,7 @@ namespace OpenRCT2::GameActions Result Execute(GameState_t& gameState) const override; private: - Result QueryExecute(bool isExecuting) const; - Result MapBuyLandRightsForTile(const CoordsXY& loc, bool isExecuting) const; + Result QueryExecute(GameState_t& gameState, bool isExecuting) const; + Result MapBuyLandRightsForTile(GameState_t& gameState, const CoordsXY& loc, bool isExecuting) const; }; } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/LandSmoothAction.cpp b/src/openrct2/actions/LandSmoothAction.cpp index 8c65e4b5bfe2..07616351eee6 100644 --- a/src/openrct2/actions/LandSmoothAction.cpp +++ b/src/openrct2/actions/LandSmoothAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -238,9 +238,9 @@ namespace OpenRCT2::GameActions landSetHeightAction.SetFlags(GetFlags()); auto res = isExecuting ? ExecuteNested(&landSetHeightAction, gameState) : QueryNested(&landSetHeightAction, gameState); - if (res.Error == Status::Ok) + if (res.error == Status::ok) { - totalCost += res.Cost; + totalCost += res.cost; } } return totalCost; @@ -326,9 +326,9 @@ namespace OpenRCT2::GameActions expectedLandHeight += landChangePerTile; // change land of current tile auto result = SmoothLandTile(gameState, direction, isExecuting, nextLoc, surfaceElement); - if (result.Error == Status::Ok) + if (result.error == Status::ok) { - totalCost += result.Cost; + totalCost += result.cost; } } return totalCost; @@ -351,9 +351,9 @@ namespace OpenRCT2::GameActions int32_t centreZ = TileElementHeight(_coords); auto res = Result(); - res.ErrorTitle = kErrorTitles[_isLowering ? 0 : 1]; - res.Expenditure = ExpenditureType::landscaping; - res.Position = { _coords.x, _coords.y, centreZ }; + res.errorTitle = kErrorTitles[_isLowering ? 0 : 1]; + res.expenditure = ExpenditureType::landscaping; + res.position = { _coords.x, _coords.y, centreZ }; // Do the smoothing switch (selectionType) @@ -370,7 +370,7 @@ namespace OpenRCT2::GameActions { int32_t z = std::clamp( static_cast(TileElementGetCornerHeight(surfaceElement, 2)), minHeight, maxHeight); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, -32, -32, 0, 2); } } @@ -380,7 +380,7 @@ namespace OpenRCT2::GameActions { int32_t z = std::clamp( static_cast(TileElementGetCornerHeight(surfaceElement, 3)), minHeight, maxHeight); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY2() }, z, -32, 32, 1, 3); } } @@ -390,7 +390,7 @@ namespace OpenRCT2::GameActions { int32_t z = std::clamp( static_cast(TileElementGetCornerHeight(surfaceElement, 0)), minHeight, maxHeight); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX2(), validRange.GetY2() }, z, 32, 32, 2, 0); } } @@ -400,7 +400,7 @@ namespace OpenRCT2::GameActions { int32_t z = std::clamp( static_cast(TileElementGetCornerHeight(surfaceElement, 1)), minHeight, maxHeight); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX2(), validRange.GetY1() }, z, 32, -32, 3, 1); } } @@ -416,7 +416,7 @@ namespace OpenRCT2::GameActions static_cast(TileElementGetCornerHeight(surfaceElement, 3)), minHeight, maxHeight); z2 = std::clamp( static_cast(TileElementGetCornerHeight(surfaceElement, 2)), minHeight, maxHeight); - res.Cost += SmoothLandRowByEdge( + res.cost += SmoothLandRowByEdge( gameState, isExecuting, { validRange.GetX1(), y }, z1, z2, -32, 0, 0, 1, 3, 2); } @@ -427,7 +427,7 @@ namespace OpenRCT2::GameActions static_cast(TileElementGetCornerHeight(surfaceElement, 1)), minHeight, maxHeight); z2 = std::clamp( static_cast(TileElementGetCornerHeight(surfaceElement, 0)), minHeight, maxHeight); - res.Cost += SmoothLandRowByEdge( + res.cost += SmoothLandRowByEdge( gameState, isExecuting, { validRange.GetX2(), y }, z1, z2, 32, 0, 2, 3, 1, 0); } } @@ -441,7 +441,7 @@ namespace OpenRCT2::GameActions static_cast(TileElementGetCornerHeight(surfaceElement, 1)), minHeight, maxHeight); z2 = std::clamp( static_cast(TileElementGetCornerHeight(surfaceElement, 2)), minHeight, maxHeight); - res.Cost += SmoothLandRowByEdge( + res.cost += SmoothLandRowByEdge( gameState, isExecuting, { x, validRange.GetY1() }, z1, z2, 0, -32, 0, 3, 1, 2); } @@ -452,7 +452,7 @@ namespace OpenRCT2::GameActions static_cast(TileElementGetCornerHeight(surfaceElement, 0)), minHeight, maxHeight); z2 = std::clamp( static_cast(TileElementGetCornerHeight(surfaceElement, 3)), minHeight, maxHeight); - res.Cost += SmoothLandRowByEdge( + res.cost += SmoothLandRowByEdge( gameState, isExecuting, { x, validRange.GetY2() }, z1, z2, 0, 32, 1, 2, 0, 3); } } @@ -487,16 +487,16 @@ namespace OpenRCT2::GameActions // Smooth the corners int32_t z = MapGetCornerHeight(newBaseZ, newSlope, 2); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, -32, -32, 0, 2); z = MapGetCornerHeight(newBaseZ, newSlope, 0); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 32, 32, 2, 0); z = MapGetCornerHeight(newBaseZ, newSlope, 3); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, -32, 32, 1, 3); z = MapGetCornerHeight(newBaseZ, newSlope, 1); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 32, -32, 3, 1); // Smooth the edges @@ -504,54 +504,54 @@ namespace OpenRCT2::GameActions { case MapSelectType::corner0: z = MapGetCornerHeight(newBaseZ, newSlope, 0); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 32, 0, 3, 0); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 0, 32, 1, 0); z = MapGetCornerHeight(newBaseZ, newSlope, 3); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, -32, 0, 0, 3); z = MapGetCornerHeight(newBaseZ, newSlope, 1); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 0, -32, 0, 1); break; case MapSelectType::corner1: z = MapGetCornerHeight(newBaseZ, newSlope, 1); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 32, 0, 2, 1); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 0, -32, 0, 1); z = MapGetCornerHeight(newBaseZ, newSlope, 2); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, -32, 0, 1, 2); z = MapGetCornerHeight(newBaseZ, newSlope, 0); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 0, 32, 1, 0); break; case MapSelectType::corner2: z = MapGetCornerHeight(newBaseZ, newSlope, 2); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, -32, 0, 1, 2); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 0, -32, 3, 2); z = MapGetCornerHeight(newBaseZ, newSlope, 1); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 32, 0, 2, 1); z = MapGetCornerHeight(newBaseZ, newSlope, 3); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 0, 32, 2, 3); break; case MapSelectType::corner3: z = MapGetCornerHeight(newBaseZ, newSlope, 3); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, -32, 0, 0, 3); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 0, 32, 2, 3); z = MapGetCornerHeight(newBaseZ, newSlope, 0); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 32, 0, 3, 0); z = MapGetCornerHeight(newBaseZ, newSlope, 2); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 0, -32, 3, 2); break; default: @@ -611,38 +611,38 @@ namespace OpenRCT2::GameActions uint8_t z3 = MapGetCornerHeight(newBaseZ, newSlope, c3); uint8_t z4 = MapGetCornerHeight(newBaseZ, newSlope, c4); // Smooth the edge at the top of the new slope - res.Cost += SmoothLandRowByEdge( + res.cost += SmoothLandRowByEdge( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z1, z2, stepOffsets[edge].x, stepOffsets[edge].y, c3, c4, c1, c2); // Smooth the edge at the bottom of the new slope - res.Cost += SmoothLandRowByEdge( + res.cost += SmoothLandRowByEdge( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z3, z4, -stepOffsets[edge].x, -stepOffsets[edge].y, c1, c2, c3, c4); // Smooth corners - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z1, -stepOffsets[edge].y, stepOffsets[edge].x, c2, c1); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z2, stepOffsets[edge].y, -stepOffsets[edge].x, c1, c2); int32_t z = MapGetCornerHeight(newBaseZ, newSlope, 2); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, -32, -32, 0, 2); z = MapGetCornerHeight(newBaseZ, newSlope, 0); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 32, 32, 2, 0); z = MapGetCornerHeight(newBaseZ, newSlope, 3); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, -32, 32, 1, 3); z = MapGetCornerHeight(newBaseZ, newSlope, 1); - res.Cost += SmoothLandRowByCorner( + res.cost += SmoothLandRowByCorner( gameState, isExecuting, { validRange.GetX1(), validRange.GetY1() }, z, 32, -32, 3, 1); break; } default: LOG_ERROR("Invalid map selection type %u", _selectionType); - return Result(Status::InvalidParameters, std::get(res.ErrorTitle), STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, std::get(res.errorTitle), STR_ERR_VALUE_OUT_OF_RANGE); } // switch selectionType // Raise / lower the land tool selection area @@ -659,7 +659,7 @@ namespace OpenRCT2::GameActions lowerLandAction.SetFlags(GetFlags()); result = isExecuting ? ExecuteNested(&lowerLandAction, gameState) : QueryNested(&lowerLandAction, gameState); } - if (result.Error != Status::Ok) + if (result.error != Status::ok) { return result; } @@ -668,7 +668,7 @@ namespace OpenRCT2::GameActions { Audio::Play3D(Audio::SoundId::placeItem, { _coords.x, _coords.y, centreZ }); } - res.Cost += result.Cost; + res.cost += result.cost; return res; } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/LandSmoothAction.h b/src/openrct2/actions/LandSmoothAction.h index a78f2e1346e4..bedab19c47dc 100644 --- a/src/openrct2/actions/LandSmoothAction.h +++ b/src/openrct2/actions/LandSmoothAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/LargeSceneryPlaceAction.cpp b/src/openrct2/actions/LargeSceneryPlaceAction.cpp index 96ea7bf18451..22f0514bb5ab 100644 --- a/src/openrct2/actions/LargeSceneryPlaceAction.cpp +++ b/src/openrct2/actions/LargeSceneryPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../Diagnostic.h" #include "../GameState.h" #include "../OpenRCT2.h" +#include "../core/Guard.hpp" #include "../management/Finance.h" #include "../object/LargeSceneryEntry.h" #include "../object/ObjectEntryManager.h" @@ -67,12 +68,12 @@ namespace OpenRCT2::GameActions Result LargeSceneryPlaceAction::Query(GameState_t& gameState) const { auto res = Result(); - res.ErrorTitle = STR_CANT_POSITION_THIS_HERE; - res.Expenditure = ExpenditureType::landscaping; + res.errorTitle = STR_CANT_POSITION_THIS_HERE; + res.expenditure = ExpenditureType::landscaping; int16_t surfaceHeight = TileElementHeight(_loc); - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = surfaceHeight; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = surfaceHeight; auto resultData = LargeSceneryPlaceActionResult{}; @@ -81,29 +82,29 @@ namespace OpenRCT2::GameActions if (_primaryColour >= COLOUR_COUNT) { LOG_ERROR("Invalid primary colour %u", _primaryColour); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_INVALID_COLOUR); } else if (_secondaryColour >= COLOUR_COUNT) { LOG_ERROR("Invalid secondary colour %u", _secondaryColour); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_INVALID_COLOUR); } else if (_tertiaryColour >= COLOUR_COUNT) { LOG_ERROR("Invalid tertiary colour %u", _tertiaryColour); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_INVALID_COLOUR); } else if (_sceneryType >= kMaxLargeSceneryObjects) { LOG_ERROR("Invalid sceneryType %u", _sceneryType); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_VALUE_OUT_OF_RANGE); } auto* sceneryEntry = ObjectManager::GetObjectEntry(_sceneryType); if (sceneryEntry == nullptr) { LOG_ERROR("Large scenery entry not found for sceneryType %u", _sceneryType); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } const auto totalNumTiles = sceneryEntry->tiles.size(); @@ -114,14 +115,14 @@ namespace OpenRCT2::GameActions maxHeight = _loc.z; } - res.Position.z = maxHeight; + res.position.z = maxHeight; if (sceneryEntry->scrolling_mode != kScrollingModeNone) { if (HasReachedBannerLimit()) { LOG_ERROR("No free banners available"); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); } } @@ -138,28 +139,28 @@ namespace OpenRCT2::GameActions QuarterTile quarterTile = QuarterTile{ tile.corners, 0 }.Rotate(_loc.direction); const auto isTree = (sceneryEntry->flags & LARGE_SCENERY_FLAG_IS_TREE) != 0; auto canBuild = MapCanConstructWithClearAt( - { curTile, zLow, zHigh }, &MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, + { curTile, zLow, zHigh }, MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, CreateCrossingMode::none, isTree); - if (canBuild.Error != Status::Ok) + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_CANT_POSITION_THIS_HERE; + canBuild.errorTitle = STR_CANT_POSITION_THIS_HERE; return canBuild; } - supportsCost += canBuild.Cost; + supportsCost += canBuild.cost; - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); int32_t tempSceneryGroundFlags = clearanceData.GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); if (!gameState.cheats.disableClearanceChecks) { if ((clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER) || (clearanceData.GroundFlags & ELEMENT_IS_UNDERGROUND)) { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); } if (resultData.GroundFlags && !(resultData.GroundFlags & tempSceneryGroundFlags)) { return Result( - Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND); + Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND); } } @@ -167,27 +168,27 @@ namespace OpenRCT2::GameActions if (!LocationValid(curTile) || MapIsEdge(curTile)) { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_OFF_EDGE_OF_MAP); } if (gLegacyScene != LegacyScene::scenarioEditor && !MapIsLocationOwned({ curTile, zLow }) && !gameState.cheats.sandboxMode) { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); } } if (!CheckMapCapacity(sceneryEntry->tiles, totalNumTiles)) { LOG_ERROR("No free map elements available"); - return Result(Status::NoFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + return Result(Status::noFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } // Force ride construction to recheck area _currentTrackSelectionFlags.set(TrackSelectionFlag::recheck); - res.Cost = sceneryEntry->price + supportsCost; - res.SetData(std::move(resultData)); + res.cost = sceneryEntry->price + supportsCost; + res.setData(std::move(resultData)); return res; } @@ -195,13 +196,13 @@ namespace OpenRCT2::GameActions Result LargeSceneryPlaceAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.ErrorTitle = STR_CANT_POSITION_THIS_HERE; - res.Expenditure = ExpenditureType::landscaping; + res.errorTitle = STR_CANT_POSITION_THIS_HERE; + res.expenditure = ExpenditureType::landscaping; int16_t surfaceHeight = TileElementHeight(_loc); - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = surfaceHeight; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = surfaceHeight; auto resultData = LargeSceneryPlaceActionResult{}; @@ -211,13 +212,13 @@ namespace OpenRCT2::GameActions if (sceneryEntry == nullptr) { LOG_ERROR("Large scenery entry not found for sceneryType = %u", _sceneryType); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } if (sceneryEntry->tiles.empty()) { LOG_ERROR("Invalid large scenery object, sceneryType = %u", _sceneryType); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, kStringIdNone); } int16_t maxHeight = GetMaxSurfaceHeight(sceneryEntry->tiles); @@ -227,7 +228,7 @@ namespace OpenRCT2::GameActions maxHeight = _loc.z; } - res.Position.z = maxHeight; + res.position.z = maxHeight; // Allocate banner Banner* banner = nullptr; @@ -237,12 +238,12 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("No free banners available"); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); } banner->text = {}; banner->colour = 2; - banner->textColour = TextColour::white; + banner->textColour = Drawing::TextColour::white; banner->flags = { BannerFlag::isLargeScenery }; banner->type = 0; banner->position = TileCoordsXY(_loc); @@ -270,27 +271,27 @@ namespace OpenRCT2::GameActions QuarterTile quarterTile = QuarterTile{ tile.corners, 0 }.Rotate(_loc.direction); const auto isTree = (sceneryEntry->flags & LARGE_SCENERY_FLAG_IS_TREE) != 0; auto canBuild = MapCanConstructWithClearAt( - { curTile, zLow, zHigh }, &MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, + { curTile, zLow, zHigh }, MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, CreateCrossingMode::none, isTree); - if (canBuild.Error != Status::Ok) + if (canBuild.error != Status::ok) { if (banner != nullptr) { DeleteBanner(banner->id); } - canBuild.ErrorTitle = STR_CANT_POSITION_THIS_HERE; + canBuild.errorTitle = STR_CANT_POSITION_THIS_HERE; return canBuild; } - supportsCost += canBuild.Cost; + supportsCost += canBuild.cost; - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); resultData.GroundFlags = clearanceData.GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { FootpathRemoveLitter({ curTile, zLow }); - if (!getGameState().cheats.disableClearanceChecks) + if (!gameState.cheats.disableClearanceChecks) { WallRemoveAt({ curTile, zLow, zHigh }); } @@ -319,8 +320,8 @@ namespace OpenRCT2::GameActions // Force ride construction to recheck area _currentTrackSelectionFlags.set(TrackSelectionFlag::recheck); - res.Cost = sceneryEntry->price + supportsCost; - res.SetData(std::move(resultData)); + res.cost = sceneryEntry->price + supportsCost; + res.setData(std::move(resultData)); return res; } @@ -389,7 +390,7 @@ namespace OpenRCT2::GameActions sceneryElement.SetSecondaryColour(_secondaryColour); sceneryElement.SetTertiaryColour(_tertiaryColour); - if (GetFlags() & GAME_COMMAND_FLAG_GHOST) + if (GetFlags().has(CommandFlag::ghost)) { sceneryElement.SetGhost(true); } diff --git a/src/openrct2/actions/LargeSceneryPlaceAction.h b/src/openrct2/actions/LargeSceneryPlaceAction.h index a9956df98803..504cd38a90ef 100644 --- a/src/openrct2/actions/LargeSceneryPlaceAction.h +++ b/src/openrct2/actions/LargeSceneryPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/LargeSceneryRemoveAction.cpp b/src/openrct2/actions/LargeSceneryRemoveAction.cpp index f7aed1901669..15e577e66fd3 100644 --- a/src/openrct2/actions/LargeSceneryRemoveAction.cpp +++ b/src/openrct2/actions/LargeSceneryRemoveAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -53,19 +53,19 @@ namespace OpenRCT2::GameActions { auto res = Result(); - const uint32_t flags = GetFlags(); + const auto flags = GetFlags(); - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.Expenditure = ExpenditureType::landscaping; - res.Cost = 0; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.expenditure = ExpenditureType::landscaping; + res.cost = 0; TileElement* tileElement = FindLargeSceneryElement(_loc, _tileIndex); if (tileElement == nullptr) { LOG_ERROR("No large scenery element to remove at x = %d, y = %d", _loc.x, _loc.y); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); } auto* sceneryEntry = tileElement->AsLargeScenery()->GetEntry(); @@ -73,7 +73,7 @@ namespace OpenRCT2::GameActions if (sceneryEntry == nullptr) { LOG_WARNING("Scenery entry at x = %d, y = %d not removed because it is an unknown object type", _loc.x, _loc.y); - return Result(Status::Unknown, STR_CANT_REMOVE_THIS, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::unknown, STR_CANT_REMOVE_THIS, STR_UNKNOWN_OBJECT_TYPE); } auto rotatedOffsets = CoordsXYZ{ CoordsXY{ sceneryEntry->tiles[_tileIndex].offset }.Rotate(_loc.direction), @@ -88,32 +88,32 @@ namespace OpenRCT2::GameActions auto currentTile = CoordsXYZ{ firstTile.x, firstTile.y, firstTile.z } + currentTileRotatedOffset; - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { - if (getGameState().park.flags & PARK_FLAGS_FORBID_TREE_REMOVAL) + if (gameState.park.flags & PARK_FLAGS_FORBID_TREE_REMOVAL) { if (sceneryEntry->HasFlag(LARGE_SCENERY_FLAG_IS_TREE)) { - res.Error = Status::NoClearance; - res.ErrorTitle = STR_CANT_REMOVE_THIS; - res.ErrorMessage = STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY; + res.error = Status::noClearance; + res.errorTitle = STR_CANT_REMOVE_THIS; + res.errorMessage = STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY; return res; } } if (!MapIsLocationOwned({ currentTile.x, currentTile.y, currentTile.z })) { - return Result(Status::NoClearance, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::noClearance, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); } } if (!LocationValid(currentTile)) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); } // Prevent duplicate costs when using the clear scenery tool that overlaps multiple large // scenery tile elements. - if (flags & GAME_COMMAND_FLAG_TRACK_DESIGN) + if (flags.has(CommandFlag::trackDesign)) { if (tileElement->AsLargeScenery()->IsAccounted()) calculate_cost = false; @@ -124,7 +124,7 @@ namespace OpenRCT2::GameActions } if (calculate_cost) - res.Cost = sceneryEntry->removal_price; + res.cost = sceneryEntry->removal_price; return res; } @@ -133,17 +133,17 @@ namespace OpenRCT2::GameActions { auto res = Result(); - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.Expenditure = ExpenditureType::landscaping; - res.Cost = 0; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.expenditure = ExpenditureType::landscaping; + res.cost = 0; TileElement* tileElement = FindLargeSceneryElement(_loc, _tileIndex); if (tileElement == nullptr) { LOG_ERROR("No large scenery element to remove at %d, y = %d", _loc.x, _loc.y); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); } auto* sceneryEntry = tileElement->AsLargeScenery()->GetEntry(); @@ -151,7 +151,7 @@ namespace OpenRCT2::GameActions if (sceneryEntry == nullptr) { LOG_WARNING("Scenery entry at x = %d, y = %d not removed because it is an unknown object type", _loc.x, _loc.y); - return Result(Status::Unknown, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::unknown, STR_CANT_REMOVE_THIS, kStringIdNone); } tileElement->RemoveBannerEntry(); @@ -167,11 +167,11 @@ namespace OpenRCT2::GameActions auto currentTile = CoordsXYZ{ firstTile.x, firstTile.y, firstTile.z } + rotatedCurrentTile; - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationOwned({ currentTile.x, currentTile.y, currentTile.z })) { - return Result(Status::NoClearance, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::noClearance, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); } } @@ -187,14 +187,14 @@ namespace OpenRCT2::GameActions } } - res.Cost = sceneryEntry->removal_price; + res.cost = sceneryEntry->removal_price; return res; } TileElement* LargeSceneryRemoveAction::FindLargeSceneryElement(const CoordsXYZ& pos, int32_t sequenceIndex) const { - const bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; + const bool isGhost = GetFlags().has(CommandFlag::ghost); for (auto* sceneryElement : TileElementsView(pos)) { // If we are removing ghost elements diff --git a/src/openrct2/actions/LargeSceneryRemoveAction.h b/src/openrct2/actions/LargeSceneryRemoveAction.h index eb95d08a3cec..2c6ad2c9df50 100644 --- a/src/openrct2/actions/LargeSceneryRemoveAction.h +++ b/src/openrct2/actions/LargeSceneryRemoveAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/LargeScenerySetColourAction.cpp b/src/openrct2/actions/LargeScenerySetColourAction.cpp index d4a5a43ef54f..0c1ed4fd7c6a 100644 --- a/src/openrct2/actions/LargeScenerySetColourAction.cpp +++ b/src/openrct2/actions/LargeScenerySetColourAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -54,44 +54,44 @@ namespace OpenRCT2::GameActions Result LargeScenerySetColourAction::Query(GameState_t& gameState) const { - return QueryExecute(false); + return QueryExecute(gameState, false); } Result LargeScenerySetColourAction::Execute(GameState_t& gameState) const { - return QueryExecute(true); + return QueryExecute(gameState, true); } - Result LargeScenerySetColourAction::QueryExecute(bool isExecuting) const + Result LargeScenerySetColourAction::QueryExecute(GameState_t& gameState, bool isExecuting) const { auto res = Result(); - res.Expenditure = ExpenditureType::landscaping; - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = TileElementHeight(_loc); - res.ErrorTitle = STR_CANT_REPAINT_THIS; + res.expenditure = ExpenditureType::landscaping; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = TileElementHeight(_loc); + res.errorTitle = STR_CANT_REPAINT_THIS; auto mapSizeMax = GetMapSizeMaxXY(); if (_loc.x < 0 || _loc.y < 0 || _loc.x > mapSizeMax.x || _loc.y > mapSizeMax.y) { LOG_ERROR("Invalid x / y coordinates: x = %d, y = %d", _loc.x, _loc.y); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_VALUE_OUT_OF_RANGE); } if (_primaryColour >= COLOUR_COUNT) { LOG_ERROR("Invalid primary colour %u", _primaryColour); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); } else if (_secondaryColour >= COLOUR_COUNT) { LOG_ERROR("Invalid secondary colour %u", _secondaryColour); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); } else if (_tertiaryColour >= COLOUR_COUNT) { LOG_ERROR("Invalid tertiary colour %u", _tertiaryColour); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); } auto largeElement = MapGetLargeScenerySegment(_loc, _tileIndex); @@ -101,10 +101,10 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Could not find large scenery at: x = %d, y = %d, z = %d, direction = %d, tileIndex = %u", _loc.x, _loc.y, _loc.z, _loc.direction, _tileIndex); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } - if ((GetFlags() & GAME_COMMAND_FLAG_GHOST) && !(largeElement->IsGhost())) + if ((GetFlags().has(CommandFlag::ghost)) && !(largeElement->IsGhost())) { return res; } @@ -114,7 +114,7 @@ namespace OpenRCT2::GameActions if (sceneryEntry == nullptr) { LOG_ERROR("Scenery element doesn't have scenery entry"); - return Result(Status::Unknown, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::unknown, STR_CANT_REPAINT_THIS, kStringIdNone); } // Work out the base tile coordinates (Tile with index 0) auto rotatedBaseCoordsOffset = CoordsXYZ{ CoordsXY{ sceneryEntry->tiles[_tileIndex].offset }.Rotate(_loc.direction), @@ -128,17 +128,17 @@ namespace OpenRCT2::GameActions auto rotatedTileCoords = CoordsXYZ{ CoordsXY{ tile.offset }.Rotate(_loc.direction), tile.offset.z }; auto currentTile = CoordsXYZ{ baseTile.x, baseTile.y, baseTile.z } + rotatedTileCoords; - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationOwned(currentTile)) { - return Result(Status::NotOwned, STR_CANT_REPAINT_THIS, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_REPAINT_THIS, STR_LAND_NOT_OWNED_BY_PARK); } } if (!LocationValid(currentTile)) { - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); } auto tileElement = MapGetLargeScenerySegment({ currentTile.x, currentTile.y, _loc.z, _loc.direction }, tile.index); @@ -148,7 +148,7 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Large scenery element not found at: x = %d, y = %d, z = %d, direction = %d", _loc.x, _loc.y, _loc.z, _loc.direction); - return Result(Status::Unknown, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::unknown, STR_CANT_REPAINT_THIS, kStringIdNone); } if (isExecuting) { diff --git a/src/openrct2/actions/LargeScenerySetColourAction.h b/src/openrct2/actions/LargeScenerySetColourAction.h index 5c0af2bc6169..75b5790ef475 100644 --- a/src/openrct2/actions/LargeScenerySetColourAction.h +++ b/src/openrct2/actions/LargeScenerySetColourAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -36,6 +36,6 @@ namespace OpenRCT2::GameActions Result Execute(GameState_t& gameState) const override; private: - Result QueryExecute(bool isExecuting) const; + Result QueryExecute(GameState_t& gameState, bool isExecuting) const; }; } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/LoadOrQuitAction.cpp b/src/openrct2/actions/LoadOrQuitAction.cpp index 9c978305dde7..9adc39f1d615 100644 --- a/src/openrct2/actions/LoadOrQuitAction.cpp +++ b/src/openrct2/actions/LoadOrQuitAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/LoadOrQuitAction.h b/src/openrct2/actions/LoadOrQuitAction.h index 271dac08ebf0..e9d25553d1d4 100644 --- a/src/openrct2/actions/LoadOrQuitAction.h +++ b/src/openrct2/actions/LoadOrQuitAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/MapChangeSizeAction.cpp b/src/openrct2/actions/MapChangeSizeAction.cpp index 97249334441b..503f83665196 100644 --- a/src/openrct2/actions/MapChangeSizeAction.cpp +++ b/src/openrct2/actions/MapChangeSizeAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,7 +11,7 @@ #include "../Context.h" #include "../GameState.h" -#include "../drawing/IDrawingEngine.h" +#include "../drawing/Drawing.h" #include "../ui/UiContext.h" #include "../ui/WindowManager.h" #include "../windows/Intent.h" @@ -47,11 +47,11 @@ namespace OpenRCT2::GameActions { if (_targetSize.x > kMaximumMapSizeTechnical || _targetSize.y > kMaximumMapSizeTechnical) { - return Result(Status::InvalidParameters, STR_CANT_INCREASE_MAP_SIZE_ANY_FURTHER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_INCREASE_MAP_SIZE_ANY_FURTHER, STR_ERR_VALUE_OUT_OF_RANGE); } if (_targetSize.x < kMinimumMapSizeTechnical || _targetSize.y < kMinimumMapSizeTechnical) { - return Result(Status::InvalidParameters, STR_CANT_DECREASE_MAP_SIZE_ANY_FURTHER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_DECREASE_MAP_SIZE_ANY_FURTHER, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); } @@ -80,7 +80,7 @@ namespace OpenRCT2::GameActions MapRemoveOutOfRangeElements(); } - auto* ctx = OpenRCT2::GetContext(); + auto* ctx = GetContext(); auto& uiContext = ctx->GetUiContext(); auto* windowManager = uiContext.GetWindowManager(); diff --git a/src/openrct2/actions/MapChangeSizeAction.h b/src/openrct2/actions/MapChangeSizeAction.h index 95bff8bebd09..dd3562155c44 100644 --- a/src/openrct2/actions/MapChangeSizeAction.h +++ b/src/openrct2/actions/MapChangeSizeAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/MazePlaceTrackAction.cpp b/src/openrct2/actions/MazePlaceTrackAction.cpp index 54bc77b0c5a0..cbe10d5cec6d 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.cpp +++ b/src/openrct2/actions/MazePlaceTrackAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,6 +10,7 @@ #include "../Diagnostic.h" #include "../GameState.h" +#include "../core/Guard.hpp" #include "../management/Finance.h" #include "../ride/MazeCost.h" #include "../ride/RideData.h" @@ -50,41 +51,41 @@ namespace OpenRCT2::GameActions { auto res = Result(); - res.Position = _loc + CoordsXYZ{ 8, 8, 0 }; - res.Expenditure = ExpenditureType::rideConstruction; - res.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + res.position = _loc + CoordsXYZ{ 8, 8, 0 }; + res.expenditure = ExpenditureType::rideConstruction; + res.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; if ((_loc.z & 0xF) != 0) { - res.Error = Status::Unknown; - res.ErrorMessage = STR_INVALID_HEIGHT; + res.error = Status::unknown; + res.errorMessage = STR_INVALID_HEIGHT; return res; } if (!LocationValid(_loc)) { - res.Error = Status::InvalidParameters; - res.ErrorMessage = STR_OFF_EDGE_OF_MAP; + res.error = Status::invalidParameters; + res.errorMessage = STR_OFF_EDGE_OF_MAP; return res; } if (!MapIsLocationOwned(_loc) && !gameState.cheats.sandboxMode) { - res.Error = Status::NotOwned; - res.ErrorMessage = STR_LAND_NOT_OWNED_BY_PARK; + res.error = Status::notOwned; + res.errorMessage = STR_LAND_NOT_OWNED_BY_PARK; return res; } if (!MapCheckCapacityAndReorganise(_loc)) { - res.Error = Status::NoFreeElements; - res.ErrorMessage = STR_TILE_ELEMENT_LIMIT_REACHED; + res.error = Status::noFreeElements; + res.errorMessage = STR_TILE_ELEMENT_LIMIT_REACHED; return res; } auto surfaceElement = MapGetSurfaceElementAt(_loc); if (surfaceElement == nullptr) { - res.Error = Status::Unknown; - res.ErrorMessage = STR_INVALID_SELECTION_OF_OBJECTS; + res.error = Status::unknown; + res.errorMessage = STR_INVALID_SELECTION_OF_OBJECTS; return res; } @@ -100,33 +101,33 @@ namespace OpenRCT2::GameActions const auto& rtd = ride->getRideTypeDescriptor(); if (heightDifference > rtd.Heights.MaxHeight) { - res.Error = Status::TooHigh; - res.ErrorMessage = STR_TOO_HIGH_FOR_SUPPORTS; + res.error = Status::tooHigh; + res.errorMessage = STR_TOO_HIGH_FOR_SUPPORTS; return res; } } auto canBuild = MapCanConstructWithClearAt( - { _loc.ToTileStart(), baseHeight, clearanceHeight }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags(), + { _loc.ToTileStart(), baseHeight, clearanceHeight }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags(), kTileSlopeFlat); - if (canBuild.Error != Status::Ok) + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + canBuild.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; return canBuild; } - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); if (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER) { - res.Error = Status::NoClearance; - res.ErrorMessage = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; + res.error = Status::noClearance; + res.errorMessage = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; return res; } if (clearanceData.GroundFlags & ELEMENT_IS_UNDERGROUND) { - res.Error = Status::NoClearance; - res.ErrorMessage = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; + res.error = Status::noClearance; + res.errorMessage = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; return res; } @@ -134,12 +135,12 @@ namespace OpenRCT2::GameActions if (ride == nullptr || ride->type == kRideTypeNull) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex); - res.Error = Status::InvalidParameters; - res.ErrorMessage = STR_ERR_RIDE_NOT_FOUND; + res.error = Status::invalidParameters; + res.errorMessage = STR_ERR_RIDE_NOT_FOUND; return res; } - res.Cost = MazeCalculateCost(canBuild.Cost, *ride, _loc); + res.cost = MazeCalculateCost(canBuild.cost, *ride, _loc); return res; } @@ -148,21 +149,21 @@ namespace OpenRCT2::GameActions { auto res = Result(); - res.Position = _loc + CoordsXYZ{ 8, 8, 0 }; - res.Expenditure = ExpenditureType::rideConstruction; - res.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + res.position = _loc + CoordsXYZ{ 8, 8, 0 }; + res.expenditure = ExpenditureType::rideConstruction; + res.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; auto ride = GetRide(_rideIndex); if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex); - res.Error = Status::InvalidParameters; - res.ErrorMessage = STR_ERR_RIDE_NOT_FOUND; + res.error = Status::invalidParameters; + res.errorMessage = STR_ERR_RIDE_NOT_FOUND; return res; } - uint32_t flags = GetFlags(); - if (!(flags & GAME_COMMAND_FLAG_GHOST)) + auto flags = GetFlags(); + if (!flags.has(CommandFlag::ghost)) { FootpathRemoveLitter(_loc); WallRemoveAt({ _loc.ToTileStart(), _loc.z, _loc.z + 32 }); @@ -172,15 +173,15 @@ namespace OpenRCT2::GameActions auto clearanceHeight = _loc.z + kMazeClearanceHeight; auto canBuild = MapCanConstructWithClearAt( - { _loc.ToTileStart(), baseHeight, clearanceHeight }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, - GetFlags() | GAME_COMMAND_FLAG_APPLY, kTileSlopeFlat); - if (canBuild.Error != Status::Ok) + { _loc.ToTileStart(), baseHeight, clearanceHeight }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, + GetFlags().with(CommandFlag::apply), kTileSlopeFlat); + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + canBuild.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; return canBuild; } - res.Cost = MazeCalculateCost(canBuild.Cost, *ride, _loc); + res.cost = MazeCalculateCost(canBuild.cost, *ride, _loc); auto startLoc = _loc.ToTileStart(); @@ -188,11 +189,11 @@ namespace OpenRCT2::GameActions Guard::Assert(trackElement != nullptr); trackElement->SetClearanceZ(clearanceHeight); - trackElement->SetTrackType(TrackElemType::Maze); + trackElement->SetTrackType(TrackElemType::maze); trackElement->SetRideType(ride->type); trackElement->SetRideIndex(_rideIndex); trackElement->SetMazeEntry(_mazeEntry); - trackElement->SetGhost(flags & GAME_COMMAND_FLAG_GHOST); + trackElement->SetGhost(flags.has(CommandFlag::ghost)); MapInvalidateTileFull(startLoc); diff --git a/src/openrct2/actions/MazePlaceTrackAction.h b/src/openrct2/actions/MazePlaceTrackAction.h index 7d0cb6baf8fc..f118d14e333c 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.h +++ b/src/openrct2/actions/MazePlaceTrackAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/MazeSetTrackAction.cpp b/src/openrct2/actions/MazeSetTrackAction.cpp index 0ca2fcf3e859..0ad14ab426f8 100644 --- a/src/openrct2/actions/MazeSetTrackAction.cpp +++ b/src/openrct2/actions/MazeSetTrackAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../Cheats.h" #include "../Diagnostic.h" #include "../GameState.h" +#include "../core/Guard.hpp" #include "../core/MemoryStream.h" #include "../localisation/StringIds.h" #include "../management/Finance.h" @@ -58,7 +59,8 @@ namespace OpenRCT2::GameActions }; // clang-format on - MazeSetTrackAction::MazeSetTrackAction(const CoordsXYZD& location, bool initialPlacement, RideId rideIndex, uint8_t mode) + MazeSetTrackAction::MazeSetTrackAction( + const CoordsXYZD& location, bool initialPlacement, RideId rideIndex, MazeBuildMode mode) : _loc(location) , _initialPlacement(initialPlacement) , _rideIndex(rideIndex) @@ -84,41 +86,41 @@ namespace OpenRCT2::GameActions { auto res = Result(); - res.Position = _loc + CoordsXYZ{ 8, 8, 0 }; - res.Expenditure = ExpenditureType::rideConstruction; - res.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; - if ((_loc.z & 0xF) != 0 && _mode == GC_SET_MAZE_TRACK_BUILD) + res.position = _loc + CoordsXYZ{ 8, 8, 0 }; + res.expenditure = ExpenditureType::rideConstruction; + res.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + if ((_loc.z & 0xF) != 0 && _mode == MazeBuildMode::build) { - res.Error = Status::Unknown; - res.ErrorMessage = STR_INVALID_HEIGHT; + res.error = Status::unknown; + res.errorMessage = STR_INVALID_HEIGHT; return res; } if (!LocationValid(_loc)) { - res.Error = Status::InvalidParameters; - res.ErrorMessage = STR_OFF_EDGE_OF_MAP; + res.error = Status::invalidParameters; + res.errorMessage = STR_OFF_EDGE_OF_MAP; return res; } if (!MapIsLocationOwned(_loc) && !gameState.cheats.sandboxMode) { - res.Error = Status::NotOwned; - res.ErrorMessage = STR_LAND_NOT_OWNED_BY_PARK; + res.error = Status::notOwned; + res.errorMessage = STR_LAND_NOT_OWNED_BY_PARK; return res; } if (!MapCheckCapacityAndReorganise(_loc)) { - res.Error = Status::NoFreeElements; - res.ErrorMessage = STR_TILE_ELEMENT_LIMIT_REACHED; + res.error = Status::noFreeElements; + res.errorMessage = STR_TILE_ELEMENT_LIMIT_REACHED; return res; } auto surfaceElement = MapGetSurfaceElementAt(_loc); if (surfaceElement == nullptr) { - res.Error = Status::Unknown; - res.ErrorMessage = STR_INVALID_SELECTION_OF_OBJECTS; + res.error = Status::unknown; + res.errorMessage = STR_INVALID_SELECTION_OF_OBJECTS; return res; } @@ -134,40 +136,40 @@ namespace OpenRCT2::GameActions const auto& rtd = ride->getRideTypeDescriptor(); if (heightDifference > rtd.Heights.MaxHeight) { - res.Error = Status::TooHigh; - res.ErrorMessage = STR_TOO_HIGH_FOR_SUPPORTS; + res.error = Status::tooHigh; + res.errorMessage = STR_TOO_HIGH_FOR_SUPPORTS; return res; } } - TileElement* tileElement = MapGetTrackElementAtOfTypeFromRide(_loc, TrackElemType::Maze, _rideIndex); + TileElement* tileElement = MapGetTrackElementAtOfTypeFromRide(_loc, TrackElemType::maze, _rideIndex); if (tileElement == nullptr) { - if (_mode != GC_SET_MAZE_TRACK_BUILD) + if (_mode != MazeBuildMode::build) { - res.Error = Status::Unknown; - res.ErrorMessage = STR_INVALID_SELECTION_OF_OBJECTS; + res.error = Status::unknown; + res.errorMessage = STR_INVALID_SELECTION_OF_OBJECTS; return res; } auto constructResult = MapCanConstructAt({ _loc.ToTileStart(), baseHeight, clearanceHeight }, { 0b1111, 0 }); - if (constructResult.Error != Status::Ok) + if (constructResult.error != Status::ok) { - constructResult.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + constructResult.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; return constructResult; } - const auto clearanceData = constructResult.GetData(); + const auto clearanceData = constructResult.getData(); if (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER) { - res.Error = Status::NoClearance; - res.ErrorMessage = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; + res.error = Status::noClearance; + res.errorMessage = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; return res; } if (clearanceData.GroundFlags & ELEMENT_IS_UNDERGROUND) { - res.Error = Status::NoClearance; - res.ErrorMessage = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; + res.error = Status::noClearance; + res.errorMessage = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; return res; } @@ -175,12 +177,12 @@ namespace OpenRCT2::GameActions if (ride == nullptr || !RideTypeIsValid(ride->type)) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex); - res.Error = Status::NoClearance; - res.ErrorMessage = STR_ERR_RIDE_NOT_FOUND; + res.error = Status::noClearance; + res.errorMessage = STR_ERR_RIDE_NOT_FOUND; return res; } - res.Cost = MazeCalculateCost(constructResult.Cost, *ride, _loc); + res.cost = MazeCalculateCost(constructResult.cost, *ride, _loc); return res; } @@ -192,30 +194,30 @@ namespace OpenRCT2::GameActions { auto res = Result(); - res.Position = _loc + CoordsXYZ{ 8, 8, 0 }; - res.Expenditure = ExpenditureType::rideConstruction; - res.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + res.position = _loc + CoordsXYZ{ 8, 8, 0 }; + res.expenditure = ExpenditureType::rideConstruction; + res.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; auto ride = GetRide(_rideIndex); if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex); - res.Error = Status::InvalidParameters; - res.ErrorMessage = STR_ERR_RIDE_NOT_FOUND; + res.error = Status::invalidParameters; + res.errorMessage = STR_ERR_RIDE_NOT_FOUND; return res; } - uint32_t flags = GetFlags(); - if (!(flags & GAME_COMMAND_FLAG_GHOST)) + auto flags = GetFlags(); + if (!flags.has(CommandFlag::ghost)) { FootpathRemoveLitter(_loc); WallRemoveAt({ _loc.ToTileStart(), _loc.z, _loc.z + 32 }); } - auto tileElement = MapGetTrackElementAtOfTypeFromRide(_loc, TrackElemType::Maze, _rideIndex); + auto tileElement = MapGetTrackElementAtOfTypeFromRide(_loc, TrackElemType::maze, _rideIndex); if (tileElement == nullptr) { - res.Cost = MazeCalculateCost(0, *ride, _loc); + res.cost = MazeCalculateCost(0, *ride, _loc); auto startLoc = _loc.ToTileStart(); @@ -223,11 +225,11 @@ namespace OpenRCT2::GameActions Guard::Assert(trackElement != nullptr); trackElement->SetClearanceZ(_loc.z + kMazeClearanceHeight); - trackElement->SetTrackType(TrackElemType::Maze); + trackElement->SetTrackType(TrackElemType::maze); trackElement->SetRideType(ride->type); trackElement->SetRideIndex(_rideIndex); trackElement->SetMazeEntry(0xFFFF); - trackElement->SetGhost(flags & GAME_COMMAND_FLAG_GHOST); + trackElement->SetGhost(flags.has(CommandFlag::ghost)); tileElement = trackElement->as(); @@ -237,7 +239,7 @@ namespace OpenRCT2::GameActions ride->getStation().SetBaseZ(tileElement->GetBaseZ()); ride->getStation().Start = { 0, 0 }; - if (_initialPlacement && !(flags & GAME_COMMAND_FLAG_GHOST)) + if (_initialPlacement && !flags.has(CommandFlag::ghost)) { ride->overallView = startLoc; } @@ -245,7 +247,7 @@ namespace OpenRCT2::GameActions switch (_mode) { - case GC_SET_MAZE_TRACK_BUILD: + case MazeBuildMode::build: { uint8_t segmentOffset = MazeGetSegmentBit(_loc); @@ -262,7 +264,7 @@ namespace OpenRCT2::GameActions auto previousElementLoc = CoordsXY{ _loc }.ToTileStart() - CoordsDirectionDelta[_loc.direction]; TileElement* previousTileElement = MapGetTrackElementAtOfTypeFromRide( - { previousElementLoc, _loc.z }, TrackElemType::Maze, _rideIndex); + { previousElementLoc, _loc.z }, TrackElemType::maze, _rideIndex); if (previousTileElement != nullptr) { @@ -278,24 +280,24 @@ namespace OpenRCT2::GameActions break; } - case GC_SET_MAZE_TRACK_MOVE: + case MazeBuildMode::move: break; - case GC_SET_MAZE_TRACK_FILL: + case MazeBuildMode::fill: if (!_initialPlacement) { auto previousSegment = CoordsXY{ _loc.x - CoordsDirectionDelta[_loc.direction].x / 2, _loc.y - CoordsDirectionDelta[_loc.direction].y / 2 }; tileElement = MapGetTrackElementAtOfTypeFromRide( - { previousSegment, _loc.z }, TrackElemType::Maze, _rideIndex); + { previousSegment, _loc.z }, TrackElemType::maze, _rideIndex); MapInvalidateTileFull(previousSegment.ToTileStart()); if (tileElement == nullptr) { LOG_ERROR("No surface found"); - res.Error = Status::Unknown; - res.ErrorMessage = STR_ERR_SURFACE_ELEMENT_NOT_FOUND; + res.error = Status::unknown; + res.errorMessage = STR_ERR_SURFACE_ELEMENT_NOT_FOUND; return res; } @@ -316,7 +318,7 @@ namespace OpenRCT2::GameActions auto nextElementLoc = previousSegment.ToTileStart() + CoordsDirectionDelta[direction1]; TileElement* tmp_tileElement = MapGetTrackElementAtOfTypeFromRide( - { nextElementLoc, _loc.z }, TrackElemType::Maze, _rideIndex); + { nextElementLoc, _loc.z }, TrackElemType::maze, _rideIndex); if (tmp_tileElement != nullptr) { diff --git a/src/openrct2/actions/MazeSetTrackAction.h b/src/openrct2/actions/MazeSetTrackAction.h index 72a0f221a15e..a7db54aa1875 100644 --- a/src/openrct2/actions/MazeSetTrackAction.h +++ b/src/openrct2/actions/MazeSetTrackAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,17 +13,24 @@ namespace OpenRCT2::GameActions { + enum class MazeBuildMode : uint8_t + { + build, + move, + fill, + }; + class MazeSetTrackAction final : public GameActionBase { private: CoordsXYZD _loc; bool _initialPlacement{}; RideId _rideIndex{ RideId::GetNull() }; - uint8_t _mode{}; + MazeBuildMode _mode{}; public: MazeSetTrackAction() = default; - MazeSetTrackAction(const CoordsXYZD& location, bool initialPlacement, RideId rideIndex, uint8_t mode); + MazeSetTrackAction(const CoordsXYZD& location, bool initialPlacement, RideId rideIndex, MazeBuildMode mode); void AcceptParameters(GameActionParameterVisitor&) final; void Serialise(DataSerialiser& stream) override; diff --git a/src/openrct2/actions/NetworkModifyGroupAction.cpp b/src/openrct2/actions/NetworkModifyGroupAction.cpp index aefbbe9f54f5..b276dbe405f3 100644 --- a/src/openrct2/actions/NetworkModifyGroupAction.cpp +++ b/src/openrct2/actions/NetworkModifyGroupAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/NetworkModifyGroupAction.h b/src/openrct2/actions/NetworkModifyGroupAction.h index b70296dc940b..41d5aebc0fd6 100644 --- a/src/openrct2/actions/NetworkModifyGroupAction.h +++ b/src/openrct2/actions/NetworkModifyGroupAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ParkEntrancePlaceAction.cpp b/src/openrct2/actions/ParkEntrancePlaceAction.cpp index 831f631bb337..99b2649b31de 100644 --- a/src/openrct2/actions/ParkEntrancePlaceAction.cpp +++ b/src/openrct2/actions/ParkEntrancePlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../Cheats.h" #include "../GameState.h" #include "../OpenRCT2.h" +#include "../core/Guard.hpp" #include "../core/MemoryStream.h" #include "../localisation/StringIds.h" #include "../management/Finance.h" @@ -59,30 +60,30 @@ namespace OpenRCT2::GameActions Result ParkEntrancePlaceAction::Query(GameState_t& gameState) const { - if (!isInEditorMode() && !getGameState().cheats.sandboxMode) + if (!isInEditorMode() && !gameState.cheats.sandboxMode) { - return Result(Status::NotInEditorMode, STR_CANT_BUILD_THIS_HERE, kStringIdNone); + return Result(Status::notInEditorMode, STR_CANT_BUILD_THIS_HERE, kStringIdNone); } auto res = Result(); - res.Expenditure = ExpenditureType::landPurchase; - res.Position = _loc; + res.expenditure = ExpenditureType::landPurchase; + res.position = _loc; auto mapSizeUnits = GetMapSizeUnits() - CoordsXY{ kCoordsXYStep, kCoordsXYStep }; if (!LocationValid(_loc) || _loc.x <= kCoordsXYStep || _loc.y <= kCoordsXYStep || _loc.x >= mapSizeUnits.x || _loc.y >= mapSizeUnits.y) { - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_TOO_CLOSE_TO_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_TOO_CLOSE_TO_EDGE_OF_MAP); } if (!CheckMapCapacity(3)) { - return Result(Status::NoFreeElements, STR_CANT_BUILD_THIS_HERE, STR_ERR_LANDSCAPE_DATA_AREA_FULL); + return Result(Status::noFreeElements, STR_CANT_BUILD_THIS_HERE, STR_ERR_LANDSCAPE_DATA_AREA_FULL); } - if (gameState.park.entrances.size() >= OpenRCT2::Limits::kMaxParkEntrances) + if (gameState.park.entrances.size() >= Limits::kMaxParkEntrances) { - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_TOO_MANY_PARK_ENTRANCES); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_TOO_MANY_PARK_ENTRANCES); } auto zLow = _loc.z; @@ -100,9 +101,9 @@ namespace OpenRCT2::GameActions entranceLoc.y += CoordsDirectionDelta[(_loc.direction + 1) & 0x3].y * 2; } - if (auto res2 = MapCanConstructAt({ entranceLoc, zLow, zHigh }, { 0b1111, 0 }); res2.Error != Status::Ok) + if (auto res2 = MapCanConstructAt({ entranceLoc, zLow, zHigh }, { 0b1111, 0 }); res2.error != Status::ok) { - res2.ErrorTitle = STR_CANT_BUILD_THIS_HERE; + res2.errorTitle = STR_CANT_BUILD_THIS_HERE; return res2; } @@ -110,7 +111,7 @@ namespace OpenRCT2::GameActions EntranceElement* entranceElement = MapGetParkEntranceElementAt(entranceLoc, false); if (entranceElement != nullptr) { - return Result(Status::ItemAlreadyPlaced, STR_CANT_BUILD_THIS_HERE, kStringIdNone); + return Result(Status::itemAlreadyPlaced, STR_CANT_BUILD_THIS_HERE, kStringIdNone); } } @@ -120,12 +121,12 @@ namespace OpenRCT2::GameActions Result ParkEntrancePlaceAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Expenditure = ExpenditureType::landPurchase; - res.Position = CoordsXYZ{ _loc.x, _loc.y, _loc.z }; + res.expenditure = ExpenditureType::landPurchase; + res.position = CoordsXYZ{ _loc.x, _loc.y, _loc.z }; - uint32_t flags = GetFlags(); + auto flags = GetFlags(); - getGameState().park.entrances.push_back(_loc); + gameState.park.entrances.push_back(_loc); auto zLow = _loc.z; auto zHigh = zLow + ParkEntranceHeight; @@ -143,7 +144,7 @@ namespace OpenRCT2::GameActions entranceLoc.y += CoordsDirectionDelta[(_loc.direction + 1) & 0x3].y * 2; } - if (!(flags & GAME_COMMAND_FLAG_GHOST)) + if (!flags.has(CommandFlag::ghost)) { SurfaceElement* surfaceElement = MapGetSurfaceElementAt(entranceLoc); if (surfaceElement != nullptr) @@ -156,7 +157,7 @@ namespace OpenRCT2::GameActions Guard::Assert(entranceElement != nullptr); entranceElement->SetClearanceZ(zHigh); - entranceElement->SetGhost(flags & GAME_COMMAND_FLAG_GHOST); + entranceElement->SetGhost(flags.has(CommandFlag::ghost)); entranceElement->SetDirection(_loc.direction); entranceElement->SetSequenceIndex(index); entranceElement->SetEntranceType(ENTRANCE_TYPE_PARK_ENTRANCE); @@ -172,7 +173,7 @@ namespace OpenRCT2::GameActions if (!entranceElement->IsGhost()) { - FootpathConnectEdges(entranceLoc, entranceElement->as(), GAME_COMMAND_FLAG_APPLY); + FootpathConnectEdges(entranceLoc, entranceElement->as(), { CommandFlag::apply }); } Park::UpdateFences(entranceLoc); diff --git a/src/openrct2/actions/ParkEntrancePlaceAction.h b/src/openrct2/actions/ParkEntrancePlaceAction.h index 7f642b6c2f14..60164a22dcd3 100644 --- a/src/openrct2/actions/ParkEntrancePlaceAction.h +++ b/src/openrct2/actions/ParkEntrancePlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ParkEntranceRemoveAction.cpp b/src/openrct2/actions/ParkEntranceRemoveAction.cpp index e3b76272fdc7..cb77ee87cbdc 100644 --- a/src/openrct2/actions/ParkEntranceRemoveAction.cpp +++ b/src/openrct2/actions/ParkEntranceRemoveAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -44,24 +44,24 @@ namespace OpenRCT2::GameActions Result ParkEntranceRemoveAction::Query(GameState_t& gameState) const { - if (!isInEditorMode() && !getGameState().cheats.sandboxMode) + if (!isInEditorMode() && !gameState.cheats.sandboxMode) { - return Result(Status::NotInEditorMode, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::notInEditorMode, STR_CANT_REMOVE_THIS, kStringIdNone); } auto res = Result(); - res.Expenditure = ExpenditureType::landPurchase; - res.Position = _loc; - res.ErrorTitle = STR_CANT_REMOVE_THIS; + res.expenditure = ExpenditureType::landPurchase; + res.position = _loc; + res.errorTitle = STR_CANT_REMOVE_THIS; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); } if (ParkEntranceGetIndex(_loc) == -1) { LOG_ERROR("No park entrance at x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); } return res; } @@ -69,18 +69,18 @@ namespace OpenRCT2::GameActions Result ParkEntranceRemoveAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Expenditure = ExpenditureType::landPurchase; - res.Position = _loc; - res.ErrorTitle = STR_CANT_REMOVE_THIS; + res.expenditure = ExpenditureType::landPurchase; + res.position = _loc; + res.errorTitle = STR_CANT_REMOVE_THIS; auto entranceIndex = ParkEntranceGetIndex(_loc); if (entranceIndex == -1) { LOG_ERROR("No park entrance at x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, kStringIdNone); } - auto& park = getGameState().park; + auto& park = gameState.park; auto direction = (park.entrances[entranceIndex].direction - 1) & 3; // Centre (sign) diff --git a/src/openrct2/actions/ParkEntranceRemoveAction.h b/src/openrct2/actions/ParkEntranceRemoveAction.h index 56c5a9e7e0c7..e459a45f7ef1 100644 --- a/src/openrct2/actions/ParkEntranceRemoveAction.h +++ b/src/openrct2/actions/ParkEntranceRemoveAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ParkMarketingAction.cpp b/src/openrct2/actions/ParkMarketingAction.cpp index 44c60c2da645..c3f5f10f0be7 100644 --- a/src/openrct2/actions/ParkMarketingAction.cpp +++ b/src/openrct2/actions/ParkMarketingAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -52,12 +52,12 @@ namespace OpenRCT2::GameActions { if (static_cast(_type) >= std::size(AdvertisingCampaignPricePerWeek) || _numWeeks >= 256) { - return Result(Status::InvalidParameters, STR_CANT_START_MARKETING_CAMPAIGN, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_START_MARKETING_CAMPAIGN, STR_ERR_VALUE_OUT_OF_RANGE); } - if (getGameState().park.flags & PARK_FLAGS_FORBID_MARKETING_CAMPAIGN) + if (gameState.park.flags & PARK_FLAGS_FORBID_MARKETING_CAMPAIGN) { return Result( - Status::Disallowed, STR_CANT_START_MARKETING_CAMPAIGN, STR_MARKETING_CAMPAIGNS_FORBIDDEN_BY_LOCAL_AUTHORITY); + Status::disallowed, STR_CANT_START_MARKETING_CAMPAIGN, STR_MARKETING_CAMPAIGNS_FORBIDDEN_BY_LOCAL_AUTHORITY); } return CreateResult(); @@ -80,7 +80,7 @@ namespace OpenRCT2::GameActions MarketingNewCampaign(campaign); // We are only interested in invalidating the finances (marketing) window - auto windowManager = OpenRCT2::Ui::GetWindowManager(); + auto windowManager = Ui::GetWindowManager(); windowManager->BroadcastIntent(Intent(INTENT_ACTION_UPDATE_CASH)); return CreateResult(); @@ -89,9 +89,9 @@ namespace OpenRCT2::GameActions Result ParkMarketingAction::CreateResult() const { auto result = Result(); - result.ErrorTitle = STR_CANT_START_MARKETING_CAMPAIGN; - result.Expenditure = ExpenditureType::marketing; - result.Cost = CalculatePrice(); + result.errorTitle = STR_CANT_START_MARKETING_CAMPAIGN; + result.expenditure = ExpenditureType::marketing; + result.cost = CalculatePrice(); return result; } diff --git a/src/openrct2/actions/ParkMarketingAction.h b/src/openrct2/actions/ParkMarketingAction.h index 996f836c91c4..7e5aec1f0620 100644 --- a/src/openrct2/actions/ParkMarketingAction.h +++ b/src/openrct2/actions/ParkMarketingAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ParkSetDateAction.cpp b/src/openrct2/actions/ParkSetDateAction.cpp index 583ffde86661..8827905481a9 100644 --- a/src/openrct2/actions/ParkSetDateAction.cpp +++ b/src/openrct2/actions/ParkSetDateAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -50,17 +50,17 @@ namespace OpenRCT2::GameActions if (_year < 0 || _year >= kMaxYear) { LOG_ERROR("Invalid park date year %d", _year); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } else if (_month < 0 || _month >= MONTH_COUNT) { LOG_ERROR("Invalid park date month %d", _year); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } else if (_day < 0 || _day >= 31) { LOG_ERROR("Invalid park date day %d", _year); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); diff --git a/src/openrct2/actions/ParkSetDateAction.h b/src/openrct2/actions/ParkSetDateAction.h index bc9836b7e813..a42c8c870c49 100644 --- a/src/openrct2/actions/ParkSetDateAction.h +++ b/src/openrct2/actions/ParkSetDateAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ParkSetEntranceFeeAction.cpp b/src/openrct2/actions/ParkSetEntranceFeeAction.cpp index 02f6bd76a5df..e15d39f642a1 100644 --- a/src/openrct2/actions/ParkSetEntranceFeeAction.cpp +++ b/src/openrct2/actions/ParkSetEntranceFeeAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -43,20 +43,20 @@ namespace OpenRCT2::GameActions Result ParkSetEntranceFeeAction::Query(GameState_t& gameState) const { - if ((getGameState().park.flags & PARK_FLAGS_NO_MONEY) != 0) + if ((gameState.park.flags & PARK_FLAGS_NO_MONEY) != 0) { LOG_ERROR("Can't set park entrance fee because the park has no money"); - return Result(Status::Disallowed, STR_ERR_CANT_CHANGE_PARK_ENTRANCE_FEE, kStringIdNone); + return Result(Status::disallowed, STR_ERR_CANT_CHANGE_PARK_ENTRANCE_FEE, kStringIdNone); } else if (!Park::EntranceFeeUnlocked()) { LOG_ERROR("Park entrance fee is locked"); - return Result(Status::Disallowed, STR_ERR_CANT_CHANGE_PARK_ENTRANCE_FEE, kStringIdNone); + return Result(Status::disallowed, STR_ERR_CANT_CHANGE_PARK_ENTRANCE_FEE, kStringIdNone); } else if (_fee < 0.00_GBP || _fee > kMaxEntranceFee) { LOG_ERROR("Invalid park entrance fee %d", _fee); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); @@ -64,7 +64,7 @@ namespace OpenRCT2::GameActions Result ParkSetEntranceFeeAction::Execute(GameState_t& gameState) const { - getGameState().park.entranceFee = _fee; + gameState.park.entranceFee = _fee; auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByClass(WindowClass::parkInformation); diff --git a/src/openrct2/actions/ParkSetEntranceFeeAction.h b/src/openrct2/actions/ParkSetEntranceFeeAction.h index 748b826280f9..84ef9c79f468 100644 --- a/src/openrct2/actions/ParkSetEntranceFeeAction.h +++ b/src/openrct2/actions/ParkSetEntranceFeeAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ParkSetLoanAction.cpp b/src/openrct2/actions/ParkSetLoanAction.cpp index c32654d84e58..8c7206c7c758 100644 --- a/src/openrct2/actions/ParkSetLoanAction.cpp +++ b/src/openrct2/actions/ParkSetLoanAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -42,28 +42,28 @@ namespace OpenRCT2::GameActions Result ParkSetLoanAction::Query(GameState_t& gameState) const { - auto& park = getGameState().park; + auto& park = gameState.park; if (_value > park.bankLoan && _value > park.maxBankLoan) { - return Result(Status::Disallowed, STR_CANT_BORROW_ANY_MORE_MONEY, STR_BANK_REFUSES_TO_INCREASE_LOAN); + return Result(Status::disallowed, STR_CANT_BORROW_ANY_MORE_MONEY, STR_BANK_REFUSES_TO_INCREASE_LOAN); } if (_value < park.bankLoan && _value < 0.00_GBP) { - return Result(Status::InvalidParameters, STR_CANT_PAY_BACK_LOAN, STR_LOAN_CANT_BE_NEGATIVE); + return Result(Status::invalidParameters, STR_CANT_PAY_BACK_LOAN, STR_LOAN_CANT_BE_NEGATIVE); } // The “isPayingBack” check is needed to allow increasing the loan when the player is in debt. const auto isPayingBack = park.bankLoan > _value; const auto amountToPayBack = park.bankLoan - _value; if (isPayingBack && amountToPayBack > park.cash) { - return Result(Status::InsufficientFunds, STR_CANT_PAY_BACK_LOAN, STR_NOT_ENOUGH_CASH_AVAILABLE); + return Result(Status::insufficientFunds, STR_CANT_PAY_BACK_LOAN, STR_NOT_ENOUGH_CASH_AVAILABLE); } return Result(); } Result ParkSetLoanAction::Execute(GameState_t& gameState) const { - auto& park = getGameState().park; + auto& park = gameState.park; park.cash -= (park.bankLoan - _value); park.bankLoan = _value; diff --git a/src/openrct2/actions/ParkSetLoanAction.h b/src/openrct2/actions/ParkSetLoanAction.h index 6bdd27c49c18..e2ed95511c9a 100644 --- a/src/openrct2/actions/ParkSetLoanAction.h +++ b/src/openrct2/actions/ParkSetLoanAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ParkSetNameAction.cpp b/src/openrct2/actions/ParkSetNameAction.cpp index ea47f52c8588..1be9b72981e5 100644 --- a/src/openrct2/actions/ParkSetNameAction.cpp +++ b/src/openrct2/actions/ParkSetNameAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -48,7 +48,7 @@ namespace OpenRCT2::GameActions if (_name.empty()) { LOG_ERROR("Can't set park name to empty string"); - return Result(Status::InvalidParameters, STR_CANT_RENAME_PARK, STR_INVALID_NAME_FOR_PARK); + return Result(Status::invalidParameters, STR_CANT_RENAME_PARK, STR_INVALID_NAME_FOR_PARK); } return Result(); } @@ -56,11 +56,11 @@ namespace OpenRCT2::GameActions Result ParkSetNameAction::Execute(GameState_t& gameState) const { // Do a no-op if new name is the same as the current name is the same - auto& park = getGameState().park; + auto& park = gameState.park; if (_name != park.name) { park.name = _name; - ScrollingTextInvalidate(); + Drawing::ScrollingText::invalidate(); GfxInvalidateScreen(); } return Result(); diff --git a/src/openrct2/actions/ParkSetNameAction.h b/src/openrct2/actions/ParkSetNameAction.h index 1c4682f54ac0..96b083d8c8de 100644 --- a/src/openrct2/actions/ParkSetNameAction.h +++ b/src/openrct2/actions/ParkSetNameAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ParkSetParameterAction.cpp b/src/openrct2/actions/ParkSetParameterAction.cpp index 8a6b5df475cd..3b1c74dec622 100644 --- a/src/openrct2/actions/ParkSetParameterAction.cpp +++ b/src/openrct2/actions/ParkSetParameterAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -46,17 +46,17 @@ namespace OpenRCT2::GameActions if (_parameter >= ParkParameter::Count) { LOG_ERROR("Invalid park parameter %d", _parameter); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } auto res = Result(); - res.ErrorTitle = kErrorTitles[EnumValue(_parameter)]; + res.errorTitle = kErrorTitles[EnumValue(_parameter)]; return res; } Result ParkSetParameterAction::Execute(GameState_t& gameState) const { - auto& park = getGameState().park; + auto& park = gameState.park; auto* windowMgr = Ui::GetWindowManager(); switch (_parameter) @@ -81,11 +81,11 @@ namespace OpenRCT2::GameActions break; default: LOG_ERROR("Invalid park parameter %d", _parameter); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } auto res = Result(); - res.ErrorTitle = kErrorTitles[EnumValue(_parameter)]; + res.errorTitle = kErrorTitles[EnumValue(_parameter)]; return res; } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/ParkSetParameterAction.h b/src/openrct2/actions/ParkSetParameterAction.h index 162a74527521..6fca01c2018c 100644 --- a/src/openrct2/actions/ParkSetParameterAction.h +++ b/src/openrct2/actions/ParkSetParameterAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ParkSetResearchFundingAction.cpp b/src/openrct2/actions/ParkSetResearchFundingAction.cpp index fd2a3e044250..666852afa579 100644 --- a/src/openrct2/actions/ParkSetResearchFundingAction.cpp +++ b/src/openrct2/actions/ParkSetResearchFundingAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -48,7 +48,7 @@ namespace OpenRCT2::GameActions if (_fundingAmount >= RESEARCH_FUNDING_COUNT) { LOG_ERROR("Invalid research funding amount %d", _fundingAmount); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); } diff --git a/src/openrct2/actions/ParkSetResearchFundingAction.h b/src/openrct2/actions/ParkSetResearchFundingAction.h index 7650ada7d892..587800ac4384 100644 --- a/src/openrct2/actions/ParkSetResearchFundingAction.h +++ b/src/openrct2/actions/ParkSetResearchFundingAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/PauseToggleAction.cpp b/src/openrct2/actions/PauseToggleAction.cpp index 1e59ec4eb9b3..c89d6738a983 100644 --- a/src/openrct2/actions/PauseToggleAction.cpp +++ b/src/openrct2/actions/PauseToggleAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/PauseToggleAction.h b/src/openrct2/actions/PauseToggleAction.h index 25dc7cb78adb..6d93c12b9c76 100644 --- a/src/openrct2/actions/PauseToggleAction.h +++ b/src/openrct2/actions/PauseToggleAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/PeepPickupAction.cpp b/src/openrct2/actions/PeepPickupAction.cpp index 10143d25d19f..f24e8f12911b 100644 --- a/src/openrct2/actions/PeepPickupAction.cpp +++ b/src/openrct2/actions/PeepPickupAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -51,19 +51,19 @@ namespace OpenRCT2::GameActions if (_entityId.ToUnderlying() >= kMaxEntities || _entityId.IsNull()) { LOG_ERROR("Failed to pick up peep for sprite %d", _entityId); - return Result(Status::InvalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); } if (!_loc.IsNull() && !LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); } - auto* const peep = getGameState().entities.TryGetEntity(_entityId); + auto* const peep = gameState.entities.TryGetEntity(_entityId); if (peep == nullptr) { LOG_ERROR("Failed to pick up peep for sprite %d", _entityId); - return Result(Status::InvalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); } auto res = Result(); @@ -72,10 +72,10 @@ namespace OpenRCT2::GameActions { case PeepPickupType::Pickup: { - res.Position = peep->GetLocation(); + res.position = peep->GetLocation(); if (!peep->CanBePickedUp()) { - return Result(Status::Disallowed, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); + return Result(Status::disallowed, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); } Peep* existing = Network::GetPickupPeep(_owner); if (existing != nullptr) @@ -94,34 +94,34 @@ namespace OpenRCT2::GameActions } break; case PeepPickupType::Cancel: - res.Position = peep->GetLocation(); + res.position = peep->GetLocation(); break; case PeepPickupType::Place: - res.Position = _loc; + res.position = _loc; if (Network::GetPickupPeep(_owner) != peep) { - return Result(Status::Unknown, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); + return Result(Status::unknown, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); } - if (auto res2 = peep->Place(TileCoordsXYZ(_loc), false); res2.Error != Status::Ok) + if (auto res2 = peep->Place(TileCoordsXYZ(_loc), false); res2.error != Status::ok) { return res2; } break; default: LOG_ERROR("Invalid peep pickup type %u", _type); - return Result(Status::InvalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); } return res; } Result PeepPickupAction::Execute(GameState_t& gameState) const { - Peep* const peep = getGameState().entities.TryGetEntity(_entityId); + Peep* const peep = gameState.entities.TryGetEntity(_entityId); if (peep == nullptr) { LOG_ERROR("Failed to pick up peep for sprite %d", _entityId); - return Result(Status::InvalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); } auto res = Result(); @@ -130,7 +130,7 @@ namespace OpenRCT2::GameActions { case PeepPickupType::Pickup: { - res.Position = peep->GetLocation(); + res.position = peep->GetLocation(); Peep* existing = Network::GetPickupPeep(_owner); if (existing != nullptr) @@ -159,7 +159,7 @@ namespace OpenRCT2::GameActions break; case PeepPickupType::Cancel: { - res.Position = peep->GetLocation(); + res.position = peep->GetLocation(); Peep* const pickedUpPeep = Network::GetPickupPeep(_owner); if (pickedUpPeep != nullptr) @@ -170,8 +170,8 @@ namespace OpenRCT2::GameActions } break; case PeepPickupType::Place: - res.Position = _loc; - if (auto res2 = peep->Place(TileCoordsXYZ(_loc), true); res2.Error != Status::Ok) + res.position = _loc; + if (auto res2 = peep->Place(TileCoordsXYZ(_loc), true); res2.error != Status::ok) { return res2; } @@ -179,7 +179,7 @@ namespace OpenRCT2::GameActions break; default: LOG_ERROR("Invalid peep pickup type %u", _type); - return Result(Status::InvalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); } return res; } diff --git a/src/openrct2/actions/PeepPickupAction.h b/src/openrct2/actions/PeepPickupAction.h index 90dd05b75215..b59054eb27ce 100644 --- a/src/openrct2/actions/PeepPickupAction.h +++ b/src/openrct2/actions/PeepPickupAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/PeepSpawnPlaceAction.cpp b/src/openrct2/actions/PeepSpawnPlaceAction.cpp index 79777bf968c6..4dad0df46c70 100644 --- a/src/openrct2/actions/PeepSpawnPlaceAction.cpp +++ b/src/openrct2/actions/PeepSpawnPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -46,39 +46,39 @@ namespace OpenRCT2::GameActions Result PeepSpawnPlaceAction::Query(GameState_t& gameState) const { - if (!isInEditorMode() && !getGameState().cheats.sandboxMode) + if (!isInEditorMode() && !gameState.cheats.sandboxMode) { - return Result(Status::NotInEditorMode, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, kStringIdNone); + return Result(Status::notInEditorMode, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, kStringIdNone); } auto res = Result(); - res.Expenditure = ExpenditureType::landPurchase; - res.Position = _location; + res.expenditure = ExpenditureType::landPurchase; + res.position = _location; auto mapSizeUnits = GetMapSizeUnits() - CoordsXY{ 16, 16 }; if (!LocationValid(_location) || _location.x <= 16 || _location.y <= 16 || _location.x >= mapSizeUnits.x || _location.y >= mapSizeUnits.y) { - return Result(Status::InvalidParameters, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, STR_OFF_EDGE_OF_MAP); } // Verify footpath exists at location, and retrieve coordinates auto pathElement = MapGetPathElementAt(TileCoordsXYZ{ _location }); if (pathElement == nullptr) { - return Result(Status::InvalidParameters, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, STR_CAN_ONLY_BE_BUILT_ON_PATHS); + return Result(Status::invalidParameters, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, STR_CAN_ONLY_BE_BUILT_ON_PATHS); } // Verify location is unowned auto surfaceMapElement = MapGetSurfaceElementAt(_location); if (surfaceMapElement == nullptr) { - return Result(Status::Unknown, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::unknown, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } if (surfaceMapElement->GetOwnership() != OWNERSHIP_UNOWNED) { return Result( - Status::InvalidParameters, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, STR_ERR_MUST_BE_OUTSIDE_PARK_BOUNDARIES); + Status::invalidParameters, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, STR_ERR_MUST_BE_OUTSIDE_PARK_BOUNDARIES); } return res; @@ -87,8 +87,8 @@ namespace OpenRCT2::GameActions Result PeepSpawnPlaceAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Expenditure = ExpenditureType::landPurchase; - res.Position = _location; + res.expenditure = ExpenditureType::landPurchase; + res.position = _location; // Shift the spawn point to the edge of the tile auto spawnPos = CoordsXY{ _location.ToTileCentre() } diff --git a/src/openrct2/actions/PeepSpawnPlaceAction.h b/src/openrct2/actions/PeepSpawnPlaceAction.h index cba9dec74b08..274455beb0a6 100644 --- a/src/openrct2/actions/PeepSpawnPlaceAction.h +++ b/src/openrct2/actions/PeepSpawnPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/PlayerKickAction.cpp b/src/openrct2/actions/PlayerKickAction.cpp index 7d22599eae3e..33bebb40ee79 100644 --- a/src/openrct2/actions/PlayerKickAction.cpp +++ b/src/openrct2/actions/PlayerKickAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/PlayerKickAction.h b/src/openrct2/actions/PlayerKickAction.h index 9aba3822e3c2..783550a6960e 100644 --- a/src/openrct2/actions/PlayerKickAction.h +++ b/src/openrct2/actions/PlayerKickAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/PlayerSetGroupAction.cpp b/src/openrct2/actions/PlayerSetGroupAction.cpp index 1b6029e4e583..731dbda09c6e 100644 --- a/src/openrct2/actions/PlayerSetGroupAction.cpp +++ b/src/openrct2/actions/PlayerSetGroupAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/PlayerSetGroupAction.h b/src/openrct2/actions/PlayerSetGroupAction.h index c4adba0eb4d8..bccbeca1b8e4 100644 --- a/src/openrct2/actions/PlayerSetGroupAction.h +++ b/src/openrct2/actions/PlayerSetGroupAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ResultWithMessage.h b/src/openrct2/actions/ResultWithMessage.h index f78b8b5b7579..f7b888a51260 100644 --- a/src/openrct2/actions/ResultWithMessage.h +++ b/src/openrct2/actions/ResultWithMessage.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/RideCreateAction.cpp b/src/openrct2/actions/RideCreateAction.cpp index e4c210f1ac85..dace05ba1fb0 100644 --- a/src/openrct2/actions/RideCreateAction.cpp +++ b/src/openrct2/actions/RideCreateAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -31,13 +31,14 @@ namespace OpenRCT2::GameActions { RideCreateAction::RideCreateAction( - ride_type_t rideType, ObjectEntryIndex subType, colour_t colour1, colour_t colour2, - ObjectEntryIndex entranceObjectIndex) + ride_type_t rideType, ObjectEntryIndex subType, uint8_t trackColourPreset, uint8_t vehicleColourPreset, + ObjectEntryIndex entranceObjectIndex, RideInspection inspectionInterval) : _rideType(rideType) , _subType(subType) , _entranceObjectIndex(entranceObjectIndex) - , _colour1(colour1) - , _colour2(colour2) + , _trackColourPreset(trackColourPreset) + , _vehicleColourPreset(vehicleColourPreset) + , _inspectionInterval(inspectionInterval) { } @@ -46,8 +47,9 @@ namespace OpenRCT2::GameActions visitor.Visit("rideType", _rideType); visitor.Visit("rideObject", _subType); visitor.Visit("entranceObject", _entranceObjectIndex); - visitor.Visit("colour1", _colour1); - visitor.Visit("colour2", _colour2); + visitor.Visit("colour1", _trackColourPreset); + visitor.Visit("colour2", _vehicleColourPreset); + visitor.Visit("inspectionInterval", _inspectionInterval); } ride_type_t RideCreateAction::GetRideType() const @@ -69,53 +71,60 @@ namespace OpenRCT2::GameActions { GameAction::Serialise(stream); - stream << DS_TAG(_rideType) << DS_TAG(_subType) << DS_TAG(_entranceObjectIndex) << DS_TAG(_colour1) << DS_TAG(_colour2); + stream << DS_TAG(_rideType) << DS_TAG(_subType) << DS_TAG(_entranceObjectIndex) << DS_TAG(_trackColourPreset) + << DS_TAG(_vehicleColourPreset) << DS_TAG(_inspectionInterval); } Result RideCreateAction::Query(GameState_t& gameState) const { + if (_inspectionInterval > RideInspection::never) + { + LOG_ERROR("Invalid inspection interval: %u", EnumValue(_inspectionInterval)); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); + } + auto rideIndex = GetNextFreeRideId(); if (rideIndex.IsNull()) { // No more free slots available. - return Result(Status::NoFreeElements, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_TOO_MANY_RIDES); + return Result(Status::noFreeElements, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_TOO_MANY_RIDES); } if (_rideType >= RIDE_TYPE_COUNT) { LOG_ERROR("Invalid ride type %d", _rideType); - return Result(Status::InvalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_INVALID_RIDE_TYPE); + return Result(Status::invalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_INVALID_RIDE_TYPE); } int32_t rideEntryIndex = RideGetEntryIndex(_rideType, _subType); if (rideEntryIndex >= kMaxRideObjects) { LOG_ERROR("Ride entry not found for rideType %d, subType %d", _rideType, _subType); - return Result(Status::InvalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_INVALID_RIDE_TYPE); + return Result(Status::invalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_INVALID_RIDE_TYPE); } const auto& colourPresets = GetRideTypeDescriptor(_rideType).ColourPresets; - if (_colour1 >= colourPresets.count) + if (_trackColourPreset >= colourPresets.count) { - LOG_ERROR("Can't create ride, invalid colour preset %d", _colour1); - return Result(Status::InvalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_ERR_INVALID_COLOUR); + LOG_ERROR("Can't create ride, invalid colour preset %d", _trackColourPreset); + return Result(Status::invalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_ERR_INVALID_COLOUR); } const auto* rideEntry = GetRideEntryByIndex(rideEntryIndex); if (rideEntry == nullptr) { LOG_ERROR("Ride entry not found for rideEntryIndex %d", rideEntryIndex); - return Result(Status::InvalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_UNKNOWN_OBJECT_TYPE); } const auto* presetList = rideEntry->vehicle_preset_list; - if ((presetList->count > 0 && presetList->count != 255) && _colour2 >= presetList->count) + if ((presetList->count > 0 && presetList->count != 255) && _vehicleColourPreset >= presetList->count) { - return Result(Status::InvalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, kStringIdNone); } auto res = Result(); - res.SetData(RideId{ rideIndex }); + res.setData(RideId{ rideIndex }); return res; } @@ -134,12 +143,12 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Ride entry not found for index rideEntryIndex %u (from rideType %u, subType %u)", rideEntryIndex, _rideType, _subType); - return Result(Status::Unknown, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::unknown, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, STR_UNKNOWN_OBJECT_TYPE); } ride->type = _rideType; ride->subtype = rideEntryIndex; - ride->setColourPreset(_colour1); + ride->setColourPreset(_trackColourPreset, _vehicleColourPreset); ride->overallView.SetNull(); ride->setNameToDefault(); @@ -169,7 +178,7 @@ namespace OpenRCT2::GameActions { ride->proposedNumTrains = 32; } - ride->maxTrains = OpenRCT2::Limits::kMaxTrainsPerRide; + ride->maxTrains = Limits::kMaxTrainsPerRide; ride->numCarsPerTrain = 1; ride->proposedNumCarsPerTrain = rideEntry->max_cars_in_train; ride->minWaitingTime = 10; @@ -179,7 +188,7 @@ namespace OpenRCT2::GameActions const auto& rtd = ride->getRideTypeDescriptor(); if (rtd.HasFlag(RtdFlag::allowMusic)) { - auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); + auto& objManager = GetContext()->GetObjectManager(); ride->music = objManager.GetLoadedObjectEntryIndex(rtd.DefaultMusic); if (ride->music != kObjectEntryIndexNull) { @@ -273,7 +282,7 @@ namespace OpenRCT2::GameActions ride->upkeepCost = kMoney64Undefined; ride->reliability = kRideInitialReliability; ride->unreliabilityFactor = 1; - ride->inspectionInterval = RIDE_INSPECTION_EVERY_30_MINUTES; + ride->inspectionInterval = _inspectionInterval; ride->lastCrashType = RIDE_CRASH_TYPE_NONE; ride->incomePerHour = kMoney64Undefined; ride->profit = kMoney64Undefined; @@ -288,13 +297,13 @@ namespace OpenRCT2::GameActions ride->mode = ride->getDefaultMode(); ride->minCarsPerTrain = rideEntry->min_cars_in_train; ride->maxCarsPerTrain = rideEntry->max_cars_in_train; - RideSetVehicleColoursToRandomPreset(*ride, _colour2); + RideSetVehicleColoursToRandomPreset(*ride, _vehicleColourPreset); auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByClass(WindowClass::rideList); - res.Expenditure = ExpenditureType::rideConstruction; - res.SetData(RideId{ rideIndex }); + res.expenditure = ExpenditureType::rideConstruction; + res.setData(RideId{ rideIndex }); return res; } diff --git a/src/openrct2/actions/RideCreateAction.h b/src/openrct2/actions/RideCreateAction.h index fd881d981675..698243f860ed 100644 --- a/src/openrct2/actions/RideCreateAction.h +++ b/src/openrct2/actions/RideCreateAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,14 +19,15 @@ namespace OpenRCT2::GameActions ride_type_t _rideType{ kRideTypeNull }; ObjectEntryIndex _subType{ kObjectEntryIndexNull }; ObjectEntryIndex _entranceObjectIndex{ kObjectEntryIndexNull }; - colour_t _colour1{ COLOUR_NULL }; - colour_t _colour2{ COLOUR_NULL }; + uint8_t _trackColourPreset{ COLOUR_NULL }; + uint8_t _vehicleColourPreset{ COLOUR_NULL }; + RideInspection _inspectionInterval{ RideInspection::every30Minutes }; public: RideCreateAction() = default; RideCreateAction( - ride_type_t rideType, ObjectEntryIndex subType, colour_t colour1, colour_t colour2, - ObjectEntryIndex entranceStyleIndex); + ride_type_t rideType, ObjectEntryIndex subType, uint8_t trackColourPreset, uint8_t vehicleColourPreset, + ObjectEntryIndex entranceStyleIndex, RideInspection inspectionInterval); void AcceptParameters(GameActionParameterVisitor&) final; diff --git a/src/openrct2/actions/RideDemolishAction.cpp b/src/openrct2/actions/RideDemolishAction.cpp index f511324130d1..68a1df124cae 100644 --- a/src/openrct2/actions/RideDemolishAction.cpp +++ b/src/openrct2/actions/RideDemolishAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,6 +15,7 @@ #include "../GameState.h" #include "../core/MemoryStream.h" #include "../drawing/Drawing.h" +#include "../drawing/ScrollingText.h" #include "../entity/EntityList.h" #include "../management/NewsItem.h" #include "../peep/RideUseSystem.h" @@ -61,15 +62,15 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_CANT_DEMOLISH_RIDE, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_DEMOLISH_RIDE, STR_ERR_RIDE_NOT_FOUND); } if ((ride->lifecycleFlags & (RIDE_LIFECYCLE_INDESTRUCTIBLE | RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) && _modifyType == RideModifyType::demolish) - && !getGameState().cheats.makeAllDestructible) + && !gameState.cheats.makeAllDestructible) { return Result( - Status::NoClearance, STR_CANT_DEMOLISH_RIDE, + Status::noClearance, STR_CANT_DEMOLISH_RIDE, STR_LOCAL_AUTHORITY_FORBIDS_DEMOLITION_OR_MODIFICATIONS_TO_THIS_RIDE); } @@ -79,22 +80,22 @@ namespace OpenRCT2::GameActions { if (ride->status != RideStatus::closed && ride->status != RideStatus::simulating) { - return Result(Status::Disallowed, STR_CANT_REFURBISH_RIDE, STR_MUST_BE_CLOSED_FIRST); + return Result(Status::disallowed, STR_CANT_REFURBISH_RIDE, STR_MUST_BE_CLOSED_FIRST); } if (ride->numRiders > 0) { - return Result(Status::Disallowed, STR_CANT_REFURBISH_RIDE, STR_RIDE_NOT_YET_EMPTY); + return Result(Status::disallowed, STR_CANT_REFURBISH_RIDE, STR_RIDE_NOT_YET_EMPTY); } if (!(ride->lifecycleFlags & RIDE_LIFECYCLE_EVER_BEEN_OPENED) || ride->getRideTypeDescriptor().AvailableBreakdowns == 0) { - return Result(Status::Disallowed, STR_CANT_REFURBISH_RIDE, STR_CANT_REFURBISH_NOT_NEEDED); + return Result(Status::disallowed, STR_CANT_REFURBISH_RIDE, STR_CANT_REFURBISH_NOT_NEEDED); } - result.ErrorTitle = STR_CANT_REFURBISH_RIDE; - result.Cost = GetRefurbishPrice(*ride); + result.errorTitle = STR_CANT_REFURBISH_RIDE; + result.cost = GetRefurbishPrice(*ride); } return result; @@ -106,7 +107,7 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_CANT_DEMOLISH_RIDE, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_DEMOLISH_RIDE, STR_ERR_RIDE_NOT_FOUND); } switch (_modifyType) @@ -117,7 +118,7 @@ namespace OpenRCT2::GameActions return RefurbishRide(gameState, *ride); default: LOG_ERROR("Unknown ride demolish type %d", _modifyType); - return Result(Status::InvalidParameters, STR_CANT_DO_THIS, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_DO_THIS, STR_ERR_VALUE_OUT_OF_RANGE); } } @@ -146,13 +147,13 @@ namespace OpenRCT2::GameActions MarketingCancelCampaignsForRide(_rideIndex); auto res = Result(); - res.Expenditure = ExpenditureType::rideConstruction; - res.Cost = refundPrice; + res.expenditure = ExpenditureType::rideConstruction; + res.cost = refundPrice; if (!ride.overallView.IsNull()) { auto xy = ride.overallView.ToTileCentre(); - res.Position = { xy, TileElementHeight(xy) }; + res.position = { xy, TileElementHeight(xy) }; } ride.remove(); @@ -171,7 +172,7 @@ namespace OpenRCT2::GameActions windowMgr->BroadcastIntent(Intent(INTENT_ACTION_REFRESH_RIDE_LIST)); windowMgr->BroadcastIntent(Intent(INTENT_ACTION_REFRESH_GUEST_LIST)); - ScrollingTextInvalidate(); + Drawing::ScrollingText::invalidate(); GfxInvalidateScreen(); return res; @@ -179,13 +180,13 @@ namespace OpenRCT2::GameActions money64 RideDemolishAction::MazeRemoveTrack(GameState_t& gameState, const CoordsXYZD& coords) const { - auto setMazeTrack = MazeSetTrackAction(coords, false, _rideIndex, GC_SET_MAZE_TRACK_FILL); + auto setMazeTrack = MazeSetTrackAction(coords, false, _rideIndex, MazeBuildMode::fill); setMazeTrack.SetFlags(GetFlags()); auto execRes = ExecuteNested(&setMazeTrack, gameState); - if (execRes.Error == Status::Ok) + if (execRes.error == Status::ok) { - return execRes.Cost; + return execRes.cost; } return kMoney64Undefined; @@ -224,19 +225,19 @@ namespace OpenRCT2::GameActions const auto location = CoordsXYZD(tileCoords, trackElement->GetBaseZ(), trackElement->GetDirection()); const auto type = trackElement->GetTrackType(); - if (type != TrackElemType::Maze) + if (type != TrackElemType::maze) { auto trackRemoveAction = TrackRemoveAction(type, trackElement->GetSequenceIndex(), location); - trackRemoveAction.SetFlags(GAME_COMMAND_FLAG_NO_SPEND); + trackRemoveAction.SetFlags({ CommandFlag::noSpend }); - auto removRes = ExecuteNested(&trackRemoveAction, gameState); - if (removRes.Error != Status::Ok) + auto removeRes = ExecuteNested(&trackRemoveAction, gameState); + if (removeRes.error != Status::ok) { TileElementRemove(tileElement); } else { - refundPrice += removRes.Cost; + refundPrice += removeRes.cost; } } else @@ -271,20 +272,20 @@ namespace OpenRCT2::GameActions Result RideDemolishAction::RefurbishRide(GameState_t& gameState, Ride& ride) const { auto res = Result(); - res.Expenditure = ExpenditureType::rideConstruction; - res.Cost = GetRefurbishPrice(ride); + res.expenditure = ExpenditureType::rideConstruction; + res.cost = GetRefurbishPrice(ride); ride.renew(); ride.lifecycleFlags &= ~RIDE_LIFECYCLE_EVER_BEEN_OPENED; ride.lastCrashType = RIDE_CRASH_TYPE_NONE; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE | RIDE_INVALIDATE_RIDE_CUSTOMER; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance, RideInvalidateFlag::customers); if (!ride.overallView.IsNull()) { auto location = ride.overallView.ToTileCentre(); - res.Position = { location, TileElementHeight(location) }; + res.position = { location, TileElementHeight(location) }; } auto* windowMgr = Ui::GetWindowManager(); diff --git a/src/openrct2/actions/RideDemolishAction.h b/src/openrct2/actions/RideDemolishAction.h index fcd598380675..6bacbd2d7e1f 100644 --- a/src/openrct2/actions/RideDemolishAction.h +++ b/src/openrct2/actions/RideDemolishAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/RideEntranceExitPlaceAction.cpp b/src/openrct2/actions/RideEntranceExitPlaceAction.cpp index 90acdf34bf77..2f9faddcb9be 100644 --- a/src/openrct2/actions/RideEntranceExitPlaceAction.cpp +++ b/src/openrct2/actions/RideEntranceExitPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../Diagnostic.h" #include "../GameState.h" #include "../actions/RideEntranceExitRemoveAction.h" +#include "../core/Guard.hpp" #include "../management/Finance.h" #include "../ride/Ride.h" #include "../ride/Station.h" @@ -64,23 +65,23 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, errorTitle, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, errorTitle, STR_ERR_RIDE_NOT_FOUND); } if (_stationNum.ToUnderlying() >= Limits::kMaxStationsPerRide) { LOG_ERROR("Invalid station number for ride. stationNum: %u", _stationNum.ToUnderlying()); - return Result(Status::InvalidParameters, errorTitle, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, errorTitle, STR_ERR_VALUE_OUT_OF_RANGE); } if (ride->status != RideStatus::closed && ride->status != RideStatus::simulating) { - return Result(Status::NotClosed, errorTitle, STR_MUST_BE_CLOSED_FIRST); + return Result(Status::notClosed, errorTitle, STR_MUST_BE_CLOSED_FIRST); } if (ride->lifecycleFlags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) { - return Result(Status::Disallowed, errorTitle, STR_NOT_ALLOWED_TO_MODIFY_STATION); + return Result(Status::disallowed, errorTitle, STR_NOT_ALLOWED_TO_MODIFY_STATION); } const auto& station = ride->getStation(_stationNum); @@ -88,14 +89,13 @@ namespace OpenRCT2::GameActions if (!location.IsNull()) { - auto rideEntranceExitRemove = GameActions::RideEntranceExitRemoveAction( - location.ToCoordsXY(), _rideIndex, _stationNum, _isExit); + auto rideEntranceExitRemove = RideEntranceExitRemoveAction(location.ToCoordsXY(), _rideIndex, _stationNum, _isExit); rideEntranceExitRemove.SetFlags(GetFlags()); auto result = QueryNested(&rideEntranceExitRemove, gameState); - if (result.Error != Status::Ok) + if (result.error != Status::ok) { - result.ErrorTitle = errorTitle; + result.errorTitle = errorTitle; return result; } } @@ -103,41 +103,41 @@ namespace OpenRCT2::GameActions auto z = ride->getStation(_stationNum).GetBaseZ(); if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, errorTitle, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, errorTitle, STR_OFF_EDGE_OF_MAP); } - if (!getGameState().cheats.sandboxMode && !MapIsLocationOwned({ _loc, z })) + if (!gameState.cheats.sandboxMode && !MapIsLocationOwned({ _loc, z })) { - return Result(Status::NotOwned, errorTitle, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, errorTitle, STR_LAND_NOT_OWNED_BY_PARK); } if (!MapCheckCapacityAndReorganise(_loc)) { - return Result(Status::NoFreeElements, errorTitle, STR_TILE_ELEMENT_LIMIT_REACHED); + return Result(Status::noFreeElements, errorTitle, STR_TILE_ELEMENT_LIMIT_REACHED); } auto clear_z = z + (_isExit ? RideExitHeight : RideEntranceHeight); auto canBuild = MapCanConstructWithClearAt( - { _loc, z, clear_z }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags(), kTileSlopeFlat); - if (canBuild.Error != Status::Ok) + { _loc, z, clear_z }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags(), kTileSlopeFlat); + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = errorTitle; + canBuild.errorTitle = errorTitle; return canBuild; } - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); if (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER) { - return Result(Status::Disallowed, errorTitle, STR_RIDE_CANT_BUILD_THIS_UNDERWATER); + return Result(Status::disallowed, errorTitle, STR_RIDE_CANT_BUILD_THIS_UNDERWATER); } if (z > MaxRideEntranceOrExitHeight) { - return Result(Status::Disallowed, errorTitle, STR_TOO_HIGH); + return Result(Status::disallowed, errorTitle, STR_TOO_HIGH); } auto res = Result(); - res.Position = { _loc.ToTileCentre(), z }; - res.Expenditure = ExpenditureType::rideConstruction; - res.Cost += canBuild.Cost; + res.position = { _loc.ToTileCentre(), z }; + res.expenditure = ExpenditureType::rideConstruction; + res.cost += canBuild.cost; return res; } @@ -151,10 +151,10 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, errorTitle, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, errorTitle, STR_ERR_RIDE_NOT_FOUND); } - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { RideClearForConstruction(*ride); ride->removePeeps(); @@ -164,21 +164,20 @@ namespace OpenRCT2::GameActions const auto location = _isExit ? station.Exit : station.Entrance; if (!location.IsNull()) { - auto rideEntranceExitRemove = GameActions::RideEntranceExitRemoveAction( - location.ToCoordsXY(), _rideIndex, _stationNum, _isExit); + auto rideEntranceExitRemove = RideEntranceExitRemoveAction(location.ToCoordsXY(), _rideIndex, _stationNum, _isExit); rideEntranceExitRemove.SetFlags(GetFlags()); auto result = ExecuteNested(&rideEntranceExitRemove, gameState); - if (result.Error != Status::Ok) + if (result.error != Status::ok) { - result.ErrorTitle = errorTitle; + result.errorTitle = errorTitle; return result; } } auto z = station.GetBaseZ(); - if (!(GetFlags() & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && !(GetFlags() & GAME_COMMAND_FLAG_GHOST) - && !getGameState().cheats.disableClearanceChecks) + if (!GetFlags().has(CommandFlag::allowDuringPaused) && !GetFlags().has(CommandFlag::ghost) + && !gameState.cheats.disableClearanceChecks) { FootpathRemoveLitter({ _loc, z }); WallRemoveAtZ({ _loc, z }); @@ -186,18 +185,18 @@ namespace OpenRCT2::GameActions auto clear_z = z + (_isExit ? RideExitHeight : RideEntranceHeight); auto canBuild = MapCanConstructWithClearAt( - { _loc, z, clear_z }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags() | GAME_COMMAND_FLAG_APPLY, + { _loc, z, clear_z }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags().with(CommandFlag::apply), kTileSlopeFlat); - if (canBuild.Error != Status::Ok) + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = errorTitle; + canBuild.errorTitle = errorTitle; return canBuild; } auto res = Result(); - res.Position = { _loc.ToTileCentre(), z }; - res.Expenditure = ExpenditureType::rideConstruction; - res.Cost += canBuild.Cost; + res.position = { _loc.ToTileCentre(), z }; + res.expenditure = ExpenditureType::rideConstruction; + res.cost += canBuild.cost; auto* entranceElement = TileElementInsert(CoordsXYZ{ _loc, z }, 0b1111); Guard::Assert(entranceElement != nullptr); @@ -207,7 +206,7 @@ namespace OpenRCT2::GameActions entranceElement->SetEntranceType(_isExit ? ENTRANCE_TYPE_RIDE_EXIT : ENTRANCE_TYPE_RIDE_ENTRANCE); entranceElement->SetStationIndex(_stationNum); entranceElement->SetRideIndex(_rideIndex); - entranceElement->SetGhost(GetFlags() & GAME_COMMAND_FLAG_GHOST); + entranceElement->SetGhost(GetFlags().has(CommandFlag::ghost)); if (_isExit) { @@ -224,7 +223,7 @@ namespace OpenRCT2::GameActions FootpathQueueChainReset(); - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { MazeEntranceHedgeRemoval({ _loc, entranceElement->as() }); } @@ -237,44 +236,44 @@ namespace OpenRCT2::GameActions return res; } - Result RideEntranceExitPlaceAction::TrackPlaceQuery(const CoordsXYZ& loc, const bool isExit) + Result RideEntranceExitPlaceAction::TrackPlaceQuery(GameState_t& gameState, const CoordsXYZ& loc, const bool isExit) { const auto errorTitle = isExit ? STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION : STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION; - if (!getGameState().cheats.sandboxMode && !MapIsLocationOwned(loc)) + if (!gameState.cheats.sandboxMode && !MapIsLocationOwned(loc)) { - return Result(Status::NotOwned, errorTitle, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, errorTitle, STR_LAND_NOT_OWNED_BY_PARK); } if (!MapCheckCapacityAndReorganise(loc)) { - return Result(Status::NoFreeElements, errorTitle, STR_TILE_ELEMENT_LIMIT_REACHED); + return Result(Status::noFreeElements, errorTitle, STR_TILE_ELEMENT_LIMIT_REACHED); } int16_t baseZ = loc.z; int16_t clearZ = baseZ + (isExit ? RideExitHeight : RideEntranceHeight); auto canBuild = MapCanConstructWithClearAt( - { loc, baseZ, clearZ }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, 0, kTileSlopeFlat); - if (canBuild.Error != Status::Ok) + { loc, baseZ, clearZ }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, {}, kTileSlopeFlat); + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = errorTitle; + canBuild.errorTitle = errorTitle; return canBuild; } - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); if (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER) { - return Result(Status::Disallowed, errorTitle, STR_RIDE_CANT_BUILD_THIS_UNDERWATER); + return Result(Status::disallowed, errorTitle, STR_RIDE_CANT_BUILD_THIS_UNDERWATER); } if (baseZ > MaxRideEntranceOrExitHeight) { - return Result(Status::Disallowed, errorTitle, STR_TOO_HIGH); + return Result(Status::disallowed, errorTitle, STR_TOO_HIGH); } auto res = Result(); - res.Position = { loc.ToTileCentre(), TileElementHeight(loc) }; - res.Expenditure = ExpenditureType::rideConstruction; - res.Cost += canBuild.Cost; + res.position = { loc.ToTileCentre(), TileElementHeight(loc) }; + res.expenditure = ExpenditureType::rideConstruction; + res.cost += canBuild.cost; return res; } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/RideEntranceExitPlaceAction.h b/src/openrct2/actions/RideEntranceExitPlaceAction.h index a0b2be59ad12..709a0b67b7ae 100644 --- a/src/openrct2/actions/RideEntranceExitPlaceAction.h +++ b/src/openrct2/actions/RideEntranceExitPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -36,6 +36,6 @@ namespace OpenRCT2::GameActions Result Query(GameState_t& gameState) const override; Result Execute(GameState_t& gameState) const override; - static Result TrackPlaceQuery(const CoordsXYZ& loc, const bool isExit); + static Result TrackPlaceQuery(GameState_t& gameState, const CoordsXYZ& loc, const bool isExit); }; } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/RideEntranceExitRemoveAction.cpp b/src/openrct2/actions/RideEntranceExitRemoveAction.cpp index 686daf20166c..4dc23352109c 100644 --- a/src/openrct2/actions/RideEntranceExitRemoveAction.cpp +++ b/src/openrct2/actions/RideEntranceExitRemoveAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -49,7 +49,7 @@ namespace OpenRCT2::GameActions } static TileElement* FindEntranceElement( - const CoordsXY& loc, RideId rideIndex, StationIndex stationNum, int32_t entranceType, uint32_t flags) + const CoordsXY& loc, RideId rideIndex, StationIndex stationNum, int32_t entranceType) { for (auto* entranceElement : TileElementsView(loc)) { @@ -73,38 +73,38 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); } if (ride->status != RideStatus::closed && ride->status != RideStatus::simulating) { - return Result(Status::InvalidParameters, STR_MUST_BE_CLOSED_FIRST, kStringIdNone); + return Result(Status::invalidParameters, STR_MUST_BE_CLOSED_FIRST, kStringIdNone); } if (ride->lifecycleFlags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) { - return Result(Status::InvalidParameters, STR_NOT_ALLOWED_TO_MODIFY_STATION, kStringIdNone); + return Result(Status::invalidParameters, STR_NOT_ALLOWED_TO_MODIFY_STATION, kStringIdNone); } if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); } auto* entranceElement = FindEntranceElement( - _loc, _rideIndex, _stationNum, _isExit ? ENTRANCE_TYPE_RIDE_EXIT : ENTRANCE_TYPE_RIDE_ENTRANCE, GetFlags()); + _loc, _rideIndex, _stationNum, _isExit ? ENTRANCE_TYPE_RIDE_EXIT : ENTRANCE_TYPE_RIDE_ENTRANCE); // If we are trying to remove a ghost and the element we found is real, return an error, but don't log a warning - if (entranceElement != nullptr && (GetFlags() & GAME_COMMAND_FLAG_GHOST) && !(entranceElement->IsGhost())) + if (entranceElement != nullptr && (GetFlags().has(CommandFlag::ghost)) && !(entranceElement->IsGhost())) { - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_GHOST_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_GHOST_ELEMENT_NOT_FOUND); } else if (entranceElement == nullptr) { LOG_ERROR( "Entrance/exit element not found. x = %d, y = %d, ride = %u, station = %u", _loc.x, _loc.y, _rideIndex.ToUnderlying(), _stationNum.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ENTRANCE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ENTRANCE_ELEMENT_NOT_FOUND); } return Result(); @@ -116,10 +116,10 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); } - const bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; + const bool isGhost = GetFlags().has(CommandFlag::ghost); if (!isGhost) { RideClearForConstruction(*ride); @@ -128,25 +128,25 @@ namespace OpenRCT2::GameActions } auto* entranceElement = FindEntranceElement( - _loc, _rideIndex, _stationNum, _isExit ? ENTRANCE_TYPE_RIDE_EXIT : ENTRANCE_TYPE_RIDE_ENTRANCE, GetFlags()); + _loc, _rideIndex, _stationNum, _isExit ? ENTRANCE_TYPE_RIDE_EXIT : ENTRANCE_TYPE_RIDE_ENTRANCE); // If we are trying to remove a ghost and the element we found is real, return an error, but don't log a warning if (entranceElement != nullptr && isGhost && !(entranceElement->IsGhost())) { - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_GHOST_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_GHOST_ELEMENT_NOT_FOUND); } else if (entranceElement == nullptr) { LOG_ERROR( "Entrance/exit element not found. x = %d, y = %d, ride = %u, station = %d", _loc.x, _loc.y, _rideIndex.ToUnderlying(), _stationNum); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ENTRANCE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ENTRANCE_ELEMENT_NOT_FOUND); } auto res = Result(); - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = TileElementHeight(res.Position); + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = TileElementHeight(res.position); FootpathQueueChainReset(); MazeEntranceHedgeReplacement({ _loc, entranceElement }); diff --git a/src/openrct2/actions/RideEntranceExitRemoveAction.h b/src/openrct2/actions/RideEntranceExitRemoveAction.h index cb955f86ea7c..ba118a189224 100644 --- a/src/openrct2/actions/RideEntranceExitRemoveAction.h +++ b/src/openrct2/actions/RideEntranceExitRemoveAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/RideFreezeRatingAction.cpp b/src/openrct2/actions/RideFreezeRatingAction.cpp index 9d4d9ed9e4fb..f7844e324bee 100644 --- a/src/openrct2/actions/RideFreezeRatingAction.cpp +++ b/src/openrct2/actions/RideFreezeRatingAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -40,13 +40,13 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); } if (_value <= 0) { LOG_ERROR("Rating value must be positive: %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); diff --git a/src/openrct2/actions/RideFreezeRatingAction.h b/src/openrct2/actions/RideFreezeRatingAction.h index adf90b74b3b7..2e7942988897 100644 --- a/src/openrct2/actions/RideFreezeRatingAction.h +++ b/src/openrct2/actions/RideFreezeRatingAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/RideSetAppearanceAction.cpp b/src/openrct2/actions/RideSetAppearanceAction.cpp index 370d25218532..19e3b9b0685d 100644 --- a/src/openrct2/actions/RideSetAppearanceAction.cpp +++ b/src/openrct2/actions/RideSetAppearanceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -41,7 +41,7 @@ namespace OpenRCT2::GameActions uint16_t RideSetAppearanceAction::GetActionFlags() const { - return GameAction::GetActionFlags() | GameActions::Flags::AllowWhilePaused; + return GameAction::GetActionFlags() | Flags::AllowWhilePaused; } void RideSetAppearanceAction::Serialise(DataSerialiser& stream) @@ -50,14 +50,13 @@ namespace OpenRCT2::GameActions stream << DS_TAG(_rideIndex) << DS_TAG(_type) << DS_TAG(_value) << DS_TAG(_index); } - GameActions::Result RideSetAppearanceAction::Query(GameState_t& gameState) const + Result RideSetAppearanceAction::Query(GameState_t& gameState) const { auto ride = GetRide(_rideIndex); if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); } switch (_type) @@ -68,8 +67,7 @@ namespace OpenRCT2::GameActions if (_index >= std::size(ride->trackColours)) { LOG_ERROR("Invalid track colour %u", _index); - return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_INVALID_COLOUR); } break; case RideSetAppearanceType::VehicleColourBody: @@ -78,8 +76,7 @@ namespace OpenRCT2::GameActions if (_index >= std::size(ride->vehicleColours)) { LOG_ERROR("Invalid vehicle colour %u", _index); - return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_INVALID_COLOUR); } break; case RideSetAppearanceType::VehicleColourScheme: @@ -88,21 +85,19 @@ namespace OpenRCT2::GameActions break; default: LOG_ERROR("Invalid ride appearance type %u", _type); - return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } - return GameActions::Result(); + return Result(); } - GameActions::Result RideSetAppearanceAction::Execute(GameState_t& gameState) const + Result RideSetAppearanceAction::Execute(GameState_t& gameState) const { auto ride = GetRide(_rideIndex); if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); } switch (_type) @@ -151,11 +146,11 @@ namespace OpenRCT2::GameActions auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByNumber(WindowClass::ride, _rideIndex.ToUnderlying()); - auto res = GameActions::Result(); + auto res = Result(); if (!ride->overallView.IsNull()) { auto location = ride->overallView.ToTileCentre(); - res.Position = { location, TileElementHeight(location) }; + res.position = { location, TileElementHeight(location) }; } return res; diff --git a/src/openrct2/actions/RideSetAppearanceAction.h b/src/openrct2/actions/RideSetAppearanceAction.h index 58f8055ff8d4..8d6b06d878b9 100644 --- a/src/openrct2/actions/RideSetAppearanceAction.h +++ b/src/openrct2/actions/RideSetAppearanceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/RideSetColourSchemeAction.cpp b/src/openrct2/actions/RideSetColourSchemeAction.cpp index 01b1bcd7c836..31030b11ce5b 100644 --- a/src/openrct2/actions/RideSetColourSchemeAction.cpp +++ b/src/openrct2/actions/RideSetColourSchemeAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -51,7 +51,7 @@ namespace OpenRCT2::GameActions { if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_SET_COLOUR_SCHEME, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_SET_COLOUR_SCHEME, STR_OFF_EDGE_OF_MAP); } // Find the relevant track piece, prefer sequence 0 (logic copied from GetTrackElementOriginAndApplyChanges) auto trackElement = MapGetTrackElementAtOfTypeSeq(_loc, _trackType, 0); @@ -60,12 +60,12 @@ namespace OpenRCT2::GameActions trackElement = MapGetTrackElementAtOfType(_loc, _trackType); if (trackElement == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_SET_COLOUR_SCHEME, STR_INVALID_TRACK_PARAMETERS); + return Result(Status::invalidParameters, STR_CANT_SET_COLOUR_SCHEME, STR_INVALID_TRACK_PARAMETERS); } } if (_newColourScheme >= kNumRideColourSchemes) { - return Result(Status::InvalidParameters, STR_CANT_SET_COLOUR_SCHEME, STR_INVALID_COLOUR_SCHEME_PARAMETER); + return Result(Status::invalidParameters, STR_CANT_SET_COLOUR_SCHEME, STR_INVALID_COLOUR_SCHEME_PARAMETER); } return Result(); } @@ -73,8 +73,8 @@ namespace OpenRCT2::GameActions Result RideSetColourSchemeAction::Execute(GameState_t& gameState) const { Result res = Result(); - res.Expenditure = ExpenditureType::rideConstruction; - res.ErrorTitle = STR_CANT_SET_COLOUR_SCHEME; + res.expenditure = ExpenditureType::rideConstruction; + res.errorTitle = STR_CANT_SET_COLOUR_SCHEME; GetTrackElementOriginAndApplyChanges( _loc, _trackType, _newColourScheme, nullptr, { TrackElementSetFlag::colourScheme }); diff --git a/src/openrct2/actions/RideSetColourSchemeAction.h b/src/openrct2/actions/RideSetColourSchemeAction.h index 398effee96f3..cb59860b3e52 100644 --- a/src/openrct2/actions/RideSetColourSchemeAction.h +++ b/src/openrct2/actions/RideSetColourSchemeAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/RideSetNameAction.cpp b/src/openrct2/actions/RideSetNameAction.cpp index 37b728114dbf..0e68b9a02e53 100644 --- a/src/openrct2/actions/RideSetNameAction.cpp +++ b/src/openrct2/actions/RideSetNameAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,6 +14,7 @@ #include "../Diagnostic.h" #include "../core/MemoryStream.h" #include "../drawing/Drawing.h" +#include "../drawing/ScrollingText.h" #include "../localisation/StringIds.h" #include "../ride/Ride.h" #include "../ui/WindowManager.h" @@ -52,12 +53,12 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_CANT_RENAME_RIDE_ATTRACTION, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_RENAME_RIDE_ATTRACTION, STR_ERR_RIDE_NOT_FOUND); } if (!_name.empty() && Ride::nameExists(_name, ride->id)) { - return Result(Status::InvalidParameters, STR_CANT_RENAME_RIDE_ATTRACTION, STR_ERROR_EXISTING_NAME); + return Result(Status::invalidParameters, STR_CANT_RENAME_RIDE_ATTRACTION, STR_ERROR_EXISTING_NAME); } return Result(); @@ -69,7 +70,7 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_CANT_RENAME_RIDE_ATTRACTION, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_RENAME_RIDE_ATTRACTION, STR_ERR_RIDE_NOT_FOUND); } if (_name.empty()) @@ -81,7 +82,7 @@ namespace OpenRCT2::GameActions ride->customName = _name; } - ScrollingTextInvalidate(); + Drawing::ScrollingText::invalidate(); GfxInvalidateScreen(); // Refresh windows that display ride name @@ -92,7 +93,7 @@ namespace OpenRCT2::GameActions auto res = Result(); auto location = ride->overallView.ToTileCentre(); - res.Position = { location, TileElementHeight(location) }; + res.position = { location, TileElementHeight(location) }; return res; } diff --git a/src/openrct2/actions/RideSetNameAction.h b/src/openrct2/actions/RideSetNameAction.h index 4a4c14fa318e..b48a6e03f586 100644 --- a/src/openrct2/actions/RideSetNameAction.h +++ b/src/openrct2/actions/RideSetNameAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/RideSetPriceAction.cpp b/src/openrct2/actions/RideSetPriceAction.cpp index 8889a2d43310..bbe3c3c8ea95 100644 --- a/src/openrct2/actions/RideSetPriceAction.cpp +++ b/src/openrct2/actions/RideSetPriceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -56,20 +56,20 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); } const auto* rideEntry = GetRideEntryByIndex(ride->subtype); if (rideEntry == nullptr) { LOG_ERROR("Ride entry not found for ride subtype %u", ride->subtype); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_OBJECT_ENTRY_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_OBJECT_ENTRY_NOT_FOUND); } if (_price < kRideMinPrice || _price > kRideMaxPrice) { LOG_ERROR("Attempting to set an invalid price for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, kStringIdEmpty); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, kStringIdEmpty); } return Result(); @@ -78,32 +78,32 @@ namespace OpenRCT2::GameActions Result RideSetPriceAction::Execute(GameState_t& gameState) const { Result res = Result(); - res.Expenditure = ExpenditureType::parkRideTickets; + res.expenditure = ExpenditureType::parkRideTickets; auto ride = GetRide(_rideIndex); if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); } const auto* rideEntry = GetRideEntryByIndex(ride->subtype); if (rideEntry == nullptr) { LOG_ERROR("Ride entry not found for ride subtype %u", ride->subtype); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_OBJECT_ENTRY_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_OBJECT_ENTRY_NOT_FOUND); } if (_price < kRideMinPrice || _price > kRideMaxPrice) { LOG_ERROR("Attempting to set an invalid price for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, kStringIdEmpty); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, kStringIdEmpty); } if (!ride->overallView.IsNull()) { auto location = ride->overallView.ToTileCentre(); - res.Position = { location, TileElementHeight(location) }; + res.position = { location, TileElementHeight(location) }; } auto* windowMgr = Ui::GetWindowManager(); diff --git a/src/openrct2/actions/RideSetPriceAction.h b/src/openrct2/actions/RideSetPriceAction.h index b3800f8a0fda..12630228ff4d 100644 --- a/src/openrct2/actions/RideSetPriceAction.h +++ b/src/openrct2/actions/RideSetPriceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/RideSetSettingAction.cpp b/src/openrct2/actions/RideSetSettingAction.cpp index 52b04dbe29f2..6d3b0fdbe6c8 100644 --- a/src/openrct2/actions/RideSetSettingAction.cpp +++ b/src/openrct2/actions/RideSetSettingAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,8 @@ #include "../Context.h" #include "../Diagnostic.h" #include "../GameState.h" +#include "../drawing/Drawing.h" +#include "../object/MusicObject.h" #include "../object/ObjectManager.h" #include "../ride/Ride.h" #include "../ride/RideData.h" @@ -52,7 +54,7 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u.", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_RIDE_NOT_FOUND); } switch (_setting) @@ -60,18 +62,18 @@ namespace OpenRCT2::GameActions case RideSetSetting::Mode: if (ride->lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN) { - return Result(Status::Disallowed, STR_CANT_CHANGE_OPERATING_MODE, STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING); + return Result(Status::disallowed, STR_CANT_CHANGE_OPERATING_MODE, STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING); } if (ride->status != RideStatus::closed && ride->status != RideStatus::simulating) { - return Result(Status::Disallowed, STR_CANT_CHANGE_OPERATING_MODE, STR_MUST_BE_CLOSED_FIRST); + return Result(Status::disallowed, STR_CANT_CHANGE_OPERATING_MODE, STR_MUST_BE_CLOSED_FIRST); } - if (!RideIsModeValid(*ride) && !getGameState().cheats.showAllOperatingModes) + if (!RideIsModeValid(*ride) && !gameState.cheats.showAllOperatingModes) { LOG_ERROR("Invalid ride mode: %u", _value); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); } break; case RideSetSetting::Departure: @@ -80,28 +82,28 @@ namespace OpenRCT2::GameActions if (_value > 250) { LOG_ERROR("Invalid minimum waiting time: %u", _value); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); } break; case RideSetSetting::MaxWaitingTime: if (_value > 250) { LOG_ERROR("Invalid maximum waiting time: %u", _value); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); } break; case RideSetSetting::Operation: - if (!RideIsValidOperationOption(*ride)) + if (!RideIsValidOperationOption(gameState, *ride)) { LOG_ERROR("Invalid operation option value: %u", _value); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, GetOperationErrorMessage(*ride)); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, GetOperationErrorMessage(*ride)); } break; case RideSetSetting::InspectionInterval: - if (_value > RIDE_INSPECTION_NEVER) + if (_value > EnumValue(RideInspection::never)) { LOG_ERROR("Invalid inspection interval: %u", _value); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); } break; case RideSetSetting::Music: @@ -113,41 +115,41 @@ namespace OpenRCT2::GameActions if (musicObj == nullptr) { LOG_ERROR("Invalid music style: %u", _value); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); } break; } case RideSetSetting::LiftHillSpeed: - if (!RideIsValidLiftHillSpeed(*ride)) + if (!RideIsValidLiftHillSpeed(gameState, *ride)) { LOG_ERROR("Invalid lift hill speed: %u", _value); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); } break; case RideSetSetting::NumCircuits: if (ride->lifecycleFlags & RIDE_LIFECYCLE_CABLE_LIFT && _value > 1) { return Result( - Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, + Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_MULTICIRCUIT_NOT_POSSIBLE_WITH_CABLE_LIFT_HILL); } - if (!RideIsValidNumCircuits()) + if (!RideIsValidNumCircuits(gameState)) { LOG_ERROR("Invalid number of circuits: %u", _value); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); } break; case RideSetSetting::RideType: - if (!getGameState().cheats.allowArbitraryRideTypeChanges) + if (!gameState.cheats.allowArbitraryRideTypeChanges) { LOG_ERROR("Arbitrary ride type changes not allowed."); - return Result(Status::Disallowed, STR_CANT_CHANGE_OPERATING_MODE, kStringIdNone); + return Result(Status::disallowed, STR_CANT_CHANGE_OPERATING_MODE, kStringIdNone); } break; default: LOG_ERROR("Invalid ride setting %u", static_cast(_setting)); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); @@ -159,7 +161,7 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_RIDE_NOT_FOUND); } switch (_setting) @@ -190,12 +192,12 @@ namespace OpenRCT2::GameActions break; case RideSetSetting::InspectionInterval: - if (_value == RIDE_INSPECTION_NEVER) + if (_value == EnumValue(RideInspection::never)) { ride->lifecycleFlags &= ~RIDE_LIFECYCLE_DUE_INSPECTION; } - ride->inspectionInterval = _value; + ride->inspectionInterval = static_cast(_value); break; case RideSetSetting::Music: ride->lifecycleFlags &= ~RIDE_LIFECYCLE_MUSIC; @@ -203,7 +205,7 @@ namespace OpenRCT2::GameActions { ride->lifecycleFlags |= RIDE_LIFECYCLE_MUSIC; } - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MUSIC; + ride->windowInvalidateFlags.set(RideInvalidateFlag::music); break; case RideSetSetting::MusicType: if (_value != ride->music) @@ -238,7 +240,7 @@ namespace OpenRCT2::GameActions if (!ride->overallView.IsNull()) { auto location = ride->overallView.ToTileCentre(); - res.Position = { location, TileElementHeight(location) }; + res.position = { location, TileElementHeight(location) }; } auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByNumber(WindowClass::ride, _rideIndex.ToUnderlying()); @@ -250,27 +252,26 @@ namespace OpenRCT2::GameActions return ride.getRideTypeDescriptor().RideModes & (1uLL << _value); } - bool RideSetSettingAction::RideIsValidLiftHillSpeed(const Ride& ride) const + bool RideSetSettingAction::RideIsValidLiftHillSpeed(GameState_t& gameState, const Ride& ride) const { - auto& gameState = getGameState(); int32_t minSpeed = gameState.cheats.unlockOperatingLimits ? 0 : ride.getRideTypeDescriptor().LiftData.minimum_speed; int32_t maxSpeed = gameState.cheats.unlockOperatingLimits ? 255 : ride.getRideTypeDescriptor().LiftData.maximum_speed; return _value >= minSpeed && _value <= maxSpeed; } - bool RideSetSettingAction::RideIsValidNumCircuits() const + bool RideSetSettingAction::RideIsValidNumCircuits(GameState_t& gameState) const { int32_t minNumCircuits = 1; - int32_t maxNumCircuits = getGameState().cheats.unlockOperatingLimits ? 255 : Limits::kMaxCircuitsPerRide; + int32_t maxNumCircuits = gameState.cheats.unlockOperatingLimits ? 255 : Limits::kMaxCircuitsPerRide; return _value >= minNumCircuits && _value <= maxNumCircuits; } - bool RideSetSettingAction::RideIsValidOperationOption(const Ride& ride) const + bool RideSetSettingAction::RideIsValidOperationOption(GameState_t& gameState, const Ride& ride) const { const auto& operatingSettings = ride.getRideTypeDescriptor().OperatingSettings; uint8_t minValue = operatingSettings.MinValue; uint8_t maxValue = operatingSettings.MaxValue; - if (getGameState().cheats.unlockOperatingLimits) + if (gameState.cheats.unlockOperatingLimits) { minValue = 0; maxValue = 255; diff --git a/src/openrct2/actions/RideSetSettingAction.h b/src/openrct2/actions/RideSetSettingAction.h index 55e2c74e4290..d971853fad13 100644 --- a/src/openrct2/actions/RideSetSettingAction.h +++ b/src/openrct2/actions/RideSetSettingAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -49,9 +49,9 @@ namespace OpenRCT2::GameActions private: bool RideIsModeValid(const Ride& ride) const; - bool RideIsValidLiftHillSpeed(const Ride& ride) const; - bool RideIsValidNumCircuits() const; - bool RideIsValidOperationOption(const Ride& ride) const; + bool RideIsValidLiftHillSpeed(GameState_t& gameState, const Ride& ride) const; + bool RideIsValidNumCircuits(GameState_t& gameState) const; + bool RideIsValidOperationOption(GameState_t& gameState, const Ride& ride) const; StringId GetOperationErrorMessage(const Ride& ride) const; }; } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/RideSetStatusAction.cpp b/src/openrct2/actions/RideSetStatusAction.cpp index 0826a1ff5d41..2d37ec141841 100644 --- a/src/openrct2/actions/RideSetStatusAction.cpp +++ b/src/openrct2/actions/RideSetStatusAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,6 +19,7 @@ #include "../ui/WindowManager.h" #include "../world/Map.h" #include "../world/Park.h" +#include "ResultWithMessage.h" namespace OpenRCT2::GameActions { @@ -61,32 +62,32 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - res.Error = Status::InvalidParameters; - res.ErrorTitle = STR_RIDE_DESCRIPTION_UNKNOWN; - res.ErrorMessage = STR_ERR_RIDE_NOT_FOUND; + res.error = Status::invalidParameters; + res.errorTitle = STR_RIDE_DESCRIPTION_UNKNOWN; + res.errorMessage = STR_ERR_RIDE_NOT_FOUND; return res; } if (_status >= RideStatus::count) { LOG_ERROR("Invalid ride status %u for ride %u", EnumValue(_status), _rideIndex.ToUnderlying()); - res.Error = Status::InvalidParameters; - res.ErrorTitle = STR_RIDE_DESCRIPTION_UNKNOWN; - res.ErrorMessage = kStringIdNone; + res.error = Status::invalidParameters; + res.errorTitle = STR_RIDE_DESCRIPTION_UNKNOWN; + res.errorMessage = kStringIdNone; return res; } - res.ErrorTitle = _StatusErrorTitles[EnumValue(_status)]; + res.errorTitle = _StatusErrorTitles[EnumValue(_status)]; - Formatter ft(res.ErrorMessageArgs.data()); + Formatter ft(res.errorMessageArgs.data()); ride->formatNameTo(ft); if (_status != ride->status) { if (_status == RideStatus::simulating && (ride->lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN)) { // Simulating will force clear the track, so make sure player can't cheat around a break down - res.Error = Status::Disallowed; - res.ErrorMessage = STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING; + res.error = Status::disallowed; + res.errorMessage = STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING; return res; } @@ -108,8 +109,8 @@ namespace OpenRCT2::GameActions if (!modeSwitchResult.Successful) { - res.Error = Status::Unknown; - res.ErrorMessage = modeSwitchResult.Message; + res.error = Status::unknown; + res.errorMessage = modeSwitchResult.Message; return res; } } @@ -119,27 +120,27 @@ namespace OpenRCT2::GameActions Result RideSetStatusAction::Execute(GameState_t& gameState) const { Result res = Result(); - res.Expenditure = ExpenditureType::rideRunningCosts; + res.expenditure = ExpenditureType::rideRunningCosts; auto ride = GetRide(_rideIndex); if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - res.Error = Status::InvalidParameters; - res.ErrorTitle = STR_RIDE_DESCRIPTION_UNKNOWN; - res.ErrorMessage = STR_ERR_RIDE_NOT_FOUND; + res.error = Status::invalidParameters; + res.errorTitle = STR_RIDE_DESCRIPTION_UNKNOWN; + res.errorMessage = STR_ERR_RIDE_NOT_FOUND; return res; } - res.ErrorTitle = _StatusErrorTitles[EnumValue(_status)]; + res.errorTitle = _StatusErrorTitles[EnumValue(_status)]; - Formatter ft(res.ErrorMessageArgs.data()); + Formatter ft(res.errorMessageArgs.data()); ft.Increment(6); ride->formatNameTo(ft); if (!ride->overallView.IsNull()) { auto location = ride->overallView.ToTileCentre(); - res.Position = { location, TileElementHeight(location) }; + res.position = { location, TileElementHeight(location) }; } auto* windowMgr = Ui::GetWindowManager(); @@ -160,7 +161,7 @@ namespace OpenRCT2::GameActions ride->status = RideStatus::closed; ride->lifecycleFlags &= ~RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING; ride->raceWinner = EntityId::GetNull(); - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride->windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); windowMgr->InvalidateByNumber(WindowClass::ride, _rideIndex.ToUnderlying()); break; case RideStatus::simulating: @@ -172,8 +173,8 @@ namespace OpenRCT2::GameActions const auto modeSwitchResult = ride->simulate(true); if (!modeSwitchResult.Successful) { - res.Error = Status::Unknown; - res.ErrorMessage = modeSwitchResult.Message; + res.error = Status::unknown; + res.errorMessage = modeSwitchResult.Message; return res; } @@ -183,7 +184,7 @@ namespace OpenRCT2::GameActions ride->currentIssues = 0; ride->lastIssueTime = 0; ride->getMeasurement(); - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride->windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); windowMgr->InvalidateByNumber(WindowClass::ride, _rideIndex.ToUnderlying()); break; } @@ -215,8 +216,8 @@ namespace OpenRCT2::GameActions const auto modeSwitchResult = ride->test(true); if (!modeSwitchResult.Successful) { - res.Error = Status::Unknown; - res.ErrorMessage = modeSwitchResult.Message; + res.error = Status::unknown; + res.errorMessage = modeSwitchResult.Message; return res; } } @@ -225,8 +226,8 @@ namespace OpenRCT2::GameActions const auto modeSwitchResult = ride->open(true); if (!modeSwitchResult.Successful) { - res.Error = Status::Unknown; - res.ErrorMessage = modeSwitchResult.Message; + res.error = Status::unknown; + res.errorMessage = modeSwitchResult.Message; return res; } } @@ -236,7 +237,7 @@ namespace OpenRCT2::GameActions ride->currentIssues = 0; ride->lastIssueTime = 0; ride->getMeasurement(); - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride->windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); windowMgr->InvalidateByNumber(WindowClass::ride, _rideIndex.ToUnderlying()); break; } @@ -244,7 +245,7 @@ namespace OpenRCT2::GameActions Guard::Assert(false, "Invalid ride status %u", _status); break; } - auto windowManager = OpenRCT2::Ui::GetWindowManager(); + auto windowManager = Ui::GetWindowManager(); windowManager->BroadcastIntent(Intent(INTENT_ACTION_REFRESH_CAMPAIGN_RIDE_LIST)); return res; diff --git a/src/openrct2/actions/RideSetStatusAction.h b/src/openrct2/actions/RideSetStatusAction.h index 78cf3a046f78..1a6b4905222d 100644 --- a/src/openrct2/actions/RideSetStatusAction.h +++ b/src/openrct2/actions/RideSetStatusAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/RideSetVehicleAction.cpp b/src/openrct2/actions/RideSetVehicleAction.cpp index eca7b7c0cb88..bba6028979a6 100644 --- a/src/openrct2/actions/RideSetVehicleAction.cpp +++ b/src/openrct2/actions/RideSetVehicleAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -73,17 +73,17 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, errTitle, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, errTitle, STR_ERR_RIDE_NOT_FOUND); } if (ride->lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN) { - return Result(Status::Broken, errTitle, STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING); + return Result(Status::broken, errTitle, STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING); } if (ride->status != RideStatus::closed && ride->status != RideStatus::simulating) { - return Result(Status::NotClosed, errTitle, STR_MUST_BE_CLOSED_FIRST); + return Result(Status::notClosed, errTitle, STR_MUST_BE_CLOSED_FIRST); } switch (_type) @@ -94,16 +94,16 @@ namespace OpenRCT2::GameActions break; case RideSetVehicleType::RideEntry: { - if (!RideIsVehicleTypeValid(*ride)) + if (!RideIsVehicleTypeValid(gameState, *ride)) { LOG_ERROR("Invalid vehicle type %d", _value); - return Result(Status::InvalidParameters, errTitle, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, errTitle, STR_ERR_VALUE_OUT_OF_RANGE); } auto rideEntry = GetRideEntryByIndex(_value); if (rideEntry == nullptr) { LOG_ERROR("Ride entry not found for _value %d", _value); - return Result(Status::InvalidParameters, errTitle, kStringIdNone); + return Result(Status::invalidParameters, errTitle, kStringIdNone); } // Validate preset @@ -111,14 +111,14 @@ namespace OpenRCT2::GameActions if (_colour >= presetList->count && _colour != 255 && _colour != 0) { LOG_ERROR("Unknown vehicle colour preset. colour = %d", _colour); - return Result(Status::InvalidParameters, errTitle, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, errTitle, STR_ERR_INVALID_COLOUR); } break; } default: LOG_ERROR("Invalid ride vehicle setting %d", _type); - return Result(Status::InvalidParameters, errTitle, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, errTitle, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); @@ -131,7 +131,7 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %u", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, errTitle, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, errTitle, STR_ERR_RIDE_NOT_FOUND); } switch (_type) @@ -154,11 +154,11 @@ namespace OpenRCT2::GameActions if (rideEntry == nullptr) { LOG_ERROR("Ride entry not found for index %d", ride->subtype); - return Result(Status::InvalidParameters, errTitle, kStringIdNone); + return Result(Status::invalidParameters, errTitle, kStringIdNone); } uint8_t clampValue = _value; static_assert(sizeof(clampValue) == sizeof(ride->proposedNumCarsPerTrain)); - if (!getGameState().cheats.disableTrainLengthLimit) + if (!gameState.cheats.disableTrainLengthLimit) { clampValue = std::clamp(clampValue, rideEntry->min_cars_in_train, rideEntry->max_cars_in_train); } @@ -177,11 +177,11 @@ namespace OpenRCT2::GameActions if (rideEntry == nullptr) { LOG_ERROR("Ride entry not found for index %d", ride->subtype); - return Result(Status::InvalidParameters, errTitle, kStringIdNone); + return Result(Status::invalidParameters, errTitle, kStringIdNone); } RideSetVehicleColoursToRandomPreset(*ride, _colour); - if (!getGameState().cheats.disableTrainLengthLimit) + if (!gameState.cheats.disableTrainLengthLimit) { ride->proposedNumCarsPerTrain = std::clamp( ride->proposedNumCarsPerTrain, rideEntry->min_cars_in_train, rideEntry->max_cars_in_train); @@ -200,7 +200,7 @@ namespace OpenRCT2::GameActions default: LOG_ERROR("Invalid ride vehicle setting %d", _type); - return Result(Status::InvalidParameters, errTitle, kStringIdNone); + return Result(Status::invalidParameters, errTitle, kStringIdNone); } ride->numCircuits = 1; @@ -210,7 +210,7 @@ namespace OpenRCT2::GameActions if (!ride->overallView.IsNull()) { auto location = ride->overallView.ToTileCentre(); - res.Position = { location, TileElementHeight(res.Position) }; + res.position = { location, TileElementHeight(res.position) }; } auto intent = Intent(INTENT_ACTION_RIDE_PAINT_RESET_VEHICLE); @@ -221,11 +221,10 @@ namespace OpenRCT2::GameActions return res; } - bool RideSetVehicleAction::RideIsVehicleTypeValid(const Ride& ride) const + bool RideSetVehicleAction::RideIsVehicleTypeValid(GameState_t& gameState, const Ride& ride) const { bool selectionShouldBeExpanded; ride_type_t rideTypeIterator, rideTypeIteratorMax; - auto& gameState = getGameState(); { const auto& rtd = ride.getRideTypeDescriptor(); diff --git a/src/openrct2/actions/RideSetVehicleAction.h b/src/openrct2/actions/RideSetVehicleAction.h index 625f9b7741b0..be760513fdc4 100644 --- a/src/openrct2/actions/RideSetVehicleAction.h +++ b/src/openrct2/actions/RideSetVehicleAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -43,7 +43,7 @@ namespace OpenRCT2::GameActions Result Execute(GameState_t& gameState) const override; private: - bool RideIsVehicleTypeValid(const Ride& ride) const; + bool RideIsVehicleTypeValid(GameState_t& gameState, const Ride& ride) const; static_assert(sizeof(_value) >= sizeof(ObjectEntryIndex)); }; diff --git a/src/openrct2/actions/ScenarioSetSettingAction.cpp b/src/openrct2/actions/ScenarioSetSettingAction.cpp index ce56096c3390..a9c95b981ae6 100644 --- a/src/openrct2/actions/ScenarioSetSettingAction.cpp +++ b/src/openrct2/actions/ScenarioSetSettingAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -38,7 +38,7 @@ namespace OpenRCT2::GameActions if (_setting >= ScenarioSetSetting::Count) { LOG_ERROR("Invalid scenario setting: %u", _setting); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); @@ -263,7 +263,7 @@ namespace OpenRCT2::GameActions } default: LOG_ERROR("Invalid scenario setting %u", _setting); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } windowMgr->InvalidateByClass(WindowClass::editorScenarioOptions); return Result(); diff --git a/src/openrct2/actions/ScenarioSetSettingAction.h b/src/openrct2/actions/ScenarioSetSettingAction.h index a06e24cfac88..e7959aa77922 100644 --- a/src/openrct2/actions/ScenarioSetSettingAction.h +++ b/src/openrct2/actions/ScenarioSetSettingAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/ScenerySetRestrictedAction.cpp b/src/openrct2/actions/ScenerySetRestrictedAction.cpp index f2d2fc2d30fe..d9b7a5cb693e 100644 --- a/src/openrct2/actions/ScenerySetRestrictedAction.cpp +++ b/src/openrct2/actions/ScenerySetRestrictedAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -38,12 +38,12 @@ namespace OpenRCT2::GameActions { if (!ObjectTypeCanBeRestricted(_objectType)) { - return Result(Status::InvalidParameters, STR_CANT_RESTRICT_OBJECT, STR_OBJECT_TYPE_CANNOT_BE_RESTRICTED); + return Result(Status::invalidParameters, STR_CANT_RESTRICT_OBJECT, STR_OBJECT_TYPE_CANNOT_BE_RESTRICTED); } const auto* loadedObject = ObjectEntryGetObject(_objectType, _objectIndex); if (loadedObject == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_RESTRICT_OBJECT, STR_OBJECT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_RESTRICT_OBJECT, STR_OBJECT_NOT_FOUND); } return Result(); diff --git a/src/openrct2/actions/ScenerySetRestrictedAction.h b/src/openrct2/actions/ScenerySetRestrictedAction.h index 32e227090fe8..cf88c98037dd 100644 --- a/src/openrct2/actions/ScenerySetRestrictedAction.h +++ b/src/openrct2/actions/ScenerySetRestrictedAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/SignSetNameAction.cpp b/src/openrct2/actions/SignSetNameAction.cpp index 247bcbe35ac6..8a9fd2bdd1a6 100644 --- a/src/openrct2/actions/SignSetNameAction.cpp +++ b/src/openrct2/actions/SignSetNameAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../Context.h" #include "../Diagnostic.h" #include "../drawing/Drawing.h" +#include "../drawing/ScrollingText.h" #include "../localisation/StringIds.h" #include "../ride/Ride.h" #include "../world/Banner.h" @@ -50,7 +51,7 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("Banner not found for bannerIndex %d", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_RENAME_SIGN, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_RENAME_SIGN, kStringIdNone); } TileElement* tileElement = BannerGetTileElement(_bannerIndex); @@ -58,18 +59,18 @@ namespace OpenRCT2::GameActions if (tileElement == nullptr) { LOG_ERROR("Banner tile element not found for bannerIndex %d", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_RENAME_BANNER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_RENAME_BANNER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } CoordsXYZ loc = { banner->position.ToCoordsXY(), tileElement->GetBaseZ() }; if (!LocationValid(loc)) { - return Result(Status::InvalidParameters, STR_CANT_RENAME_BANNER, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_RENAME_BANNER, STR_OFF_EDGE_OF_MAP); } if (!MapCanBuildAt({ loc.x, loc.y, loc.z - 16 })) { - return Result(Status::NotOwned, STR_CANT_RENAME_BANNER, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_RENAME_BANNER, STR_LAND_NOT_OWNED_BY_PARK); } return Result(); @@ -81,7 +82,7 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("Banner not found for bannerIndex %d", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_RENAME_SIGN, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_RENAME_SIGN, kStringIdNone); } if (!_name.empty()) @@ -108,7 +109,7 @@ namespace OpenRCT2::GameActions } } - ScrollingTextInvalidate(); + Drawing::ScrollingText::invalidate(); GfxInvalidateScreen(); return Result(); } diff --git a/src/openrct2/actions/SignSetNameAction.h b/src/openrct2/actions/SignSetNameAction.h index 1114f47d3d57..0f1374d68191 100644 --- a/src/openrct2/actions/SignSetNameAction.h +++ b/src/openrct2/actions/SignSetNameAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/SignSetStyleAction.cpp b/src/openrct2/actions/SignSetStyleAction.cpp index 088f25b2a5a3..d075f9574e67 100644 --- a/src/openrct2/actions/SignSetStyleAction.cpp +++ b/src/openrct2/actions/SignSetStyleAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -56,7 +56,7 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("Banner not found for bannerIndex %u", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } CoordsXYZ loc; @@ -67,14 +67,14 @@ namespace OpenRCT2::GameActions if (tileElement == nullptr) { LOG_ERROR("Banner tile element not found for bannerIndex %u", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } if (tileElement->GetType() != TileElementType::LargeScenery) { LOG_ERROR( "Tile element has type %u, expected %d (LargeScenery)", tileElement->GetType(), TileElementType::LargeScenery); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } loc = { banner->position.ToCoordsXY(), tileElement->GetBaseZ() }; } @@ -85,18 +85,18 @@ namespace OpenRCT2::GameActions if (wallElement == nullptr) { LOG_ERROR("Wall element not found for bannerIndex", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } loc = { banner->position.ToCoordsXY(), wallElement->GetBaseZ() }; } if (!LocationValid(loc)) { - return Result(Status::InvalidParameters, STR_CANT_RENAME_BANNER, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_RENAME_BANNER, STR_OFF_EDGE_OF_MAP); } if (!MapCanBuildAt({ loc.x, loc.y, loc.z - 16 })) { - return Result(Status::NotOwned, STR_CANT_RENAME_BANNER, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_RENAME_BANNER, STR_LAND_NOT_OWNED_BY_PARK); } return Result(); @@ -108,7 +108,7 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("Invalid banner id %u", _bannerIndex); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } CoordsXY coords = banner->position.ToCoordsXY(); @@ -120,7 +120,7 @@ namespace OpenRCT2::GameActions { coords, tileElement->GetBaseZ(), tileElement->GetDirection() }, tileElement->AsLargeScenery()->GetSequenceIndex(), _mainColour, _textColour)) { - return Result(Status::Unknown, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::unknown, STR_CANT_REPAINT_THIS, kStringIdNone); } } else diff --git a/src/openrct2/actions/SignSetStyleAction.h b/src/openrct2/actions/SignSetStyleAction.h index 9626bc7baf35..fc0ba3fdd819 100644 --- a/src/openrct2/actions/SignSetStyleAction.h +++ b/src/openrct2/actions/SignSetStyleAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/SmallSceneryPlaceAction.cpp b/src/openrct2/actions/SmallSceneryPlaceAction.cpp index 42d65af5aec9..aa4ca90076a2 100644 --- a/src/openrct2/actions/SmallSceneryPlaceAction.cpp +++ b/src/openrct2/actions/SmallSceneryPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -97,36 +97,36 @@ namespace OpenRCT2::GameActions } auto res = Result(); auto centre = _loc.ToTileCentre(); - res.Position.x = centre.x; - res.Position.y = centre.y; - res.Position.z = surfaceHeight; + res.position.x = centre.x; + res.position.y = centre.y; + res.position.z = surfaceHeight; if (_loc.z != 0) { surfaceHeight = _loc.z; - res.Position.z = surfaceHeight; + res.position.z = surfaceHeight; } if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_OFF_EDGE_OF_MAP); } if (!MapCheckCapacityAndReorganise(_loc)) { - return Result(Status::NoFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + return Result(Status::noFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } auto maxSizeMax = GetMapSizeMaxXY(); if (!_trackDesignDrawingPreview && (_loc.x > maxSizeMax.x || _loc.y > maxSizeMax.y)) { - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_ERR_VALUE_OUT_OF_RANGE); } auto* sceneryEntry = ObjectManager::GetObjectEntry(_sceneryType); if (sceneryEntry == nullptr) { LOG_ERROR("Small scenery object entry not found for sceneryType %u", _sceneryType); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } auto quadrant = _quadrant; @@ -173,7 +173,7 @@ namespace OpenRCT2::GameActions if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode && !MapIsLocationOwned({ _loc.x, _loc.y, targetHeight })) { - return Result(Status::NotOwned, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); } auto* surfaceElement = MapGetSurfaceElementAt(_loc); @@ -183,7 +183,7 @@ namespace OpenRCT2::GameActions int32_t water_height = surfaceElement->GetWaterHeight() - 1; if (water_height > targetHeight) { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); } } @@ -191,14 +191,14 @@ namespace OpenRCT2::GameActions { if (isOnWater) { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_LAND); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_LAND); } if (surfaceElement != nullptr && surfaceElement->GetWaterHeight() > 0) { if (surfaceElement->GetWaterHeight() > targetHeight) { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_LAND); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_LAND); } } } @@ -206,7 +206,7 @@ namespace OpenRCT2::GameActions if (!gameState.cheats.disableClearanceChecks && (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_REQUIRE_FLAT_SURFACE)) && !supportsRequired && !isOnWater && surfaceElement != nullptr && (surfaceElement->GetSlope() != kTileSlopeFlat)) { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_LEVEL_LAND_REQUIRED); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_LEVEL_LAND_REQUIRED); } if (!gameState.cheats.disableSupportLimits && !(sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_STACKABLE)) @@ -218,13 +218,13 @@ namespace OpenRCT2::GameActions { if (surfaceElement->GetWaterHeight() > 0 || (surfaceElement->GetBaseZ()) != targetHeight) { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_LEVEL_LAND_REQUIRED); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_LEVEL_LAND_REQUIRED); } } } else { - return Result(Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_LAND); + return Result(Status::disallowed, STR_CANT_POSITION_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_LAND); } } @@ -267,20 +267,20 @@ namespace OpenRCT2::GameActions QuarterTile quarterTile = QuarterTile{ collisionQuadrants, supports }.Rotate(quadRotation); const auto isTree = sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_IS_TREE); auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, CreateCrossingMode::none, + { _loc, zLow, zHigh }, MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, CreateCrossingMode::none, isTree); - if (canBuild.Error != Status::Ok) + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_CANT_POSITION_THIS_HERE; + canBuild.errorTitle = STR_CANT_POSITION_THIS_HERE; return canBuild; } - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); const uint8_t groundFlags = clearanceData.GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); - res.SetData(SmallSceneryPlaceActionResult{ groundFlags, 0, 0 }); + res.setData(SmallSceneryPlaceActionResult{ groundFlags, 0, 0 }); - res.Expenditure = ExpenditureType::landscaping; - res.Cost = sceneryEntry->price + canBuild.Cost; + res.expenditure = ExpenditureType::landscaping; + res.cost = sceneryEntry->price + canBuild.cost; return res; } @@ -303,20 +303,20 @@ namespace OpenRCT2::GameActions } auto res = Result(); auto centre = _loc.ToTileCentre(); - res.Position.x = centre.x; - res.Position.y = centre.y; - res.Position.z = surfaceHeight; + res.position.x = centre.x; + res.position.y = centre.y; + res.position.z = surfaceHeight; if (_loc.z != 0) { surfaceHeight = _loc.z; - res.Position.z = surfaceHeight; + res.position.z = surfaceHeight; } auto* sceneryEntry = ObjectManager::GetObjectEntry(_sceneryType); if (sceneryEntry == nullptr) { LOG_ERROR("Small scenery object entry not found for sceneryType %u", _sceneryType); - return Result(Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_POSITION_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } auto quadrant = _quadrant; @@ -358,10 +358,10 @@ namespace OpenRCT2::GameActions targetHeight = surfaceHeight; } - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { FootpathRemoveLitter({ _loc, targetHeight }); - if (!getGameState().cheats.disableClearanceChecks && (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_NO_WALLS))) + if (!gameState.cheats.disableClearanceChecks && (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_NO_WALLS))) { WallRemoveAt({ _loc, targetHeight, targetHeight + sceneryEntry->height }); } @@ -406,22 +406,22 @@ namespace OpenRCT2::GameActions QuarterTile quarterTile = QuarterTile{ collisionQuadrants, supports }.Rotate(quadRotation); const auto isTree = sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_IS_TREE); auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceSceneryClearFunc, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, kTileSlopeFlat, + { _loc, zLow, zHigh }, MapPlaceSceneryClearFunc, quarterTile, GetFlags().with(CommandFlag::apply), kTileSlopeFlat, CreateCrossingMode::none, isTree); - if (canBuild.Error != Status::Ok) + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_CANT_POSITION_THIS_HERE; + canBuild.errorTitle = STR_CANT_POSITION_THIS_HERE; return canBuild; } - res.Expenditure = ExpenditureType::landscaping; - res.Cost = sceneryEntry->price + canBuild.Cost; + res.expenditure = ExpenditureType::landscaping; + res.cost = sceneryEntry->price + canBuild.cost; auto* sceneryElement = TileElementInsert( CoordsXYZ{ _loc, zLow }, quarterTile.GetBaseQuarterOccupied()); if (sceneryElement == nullptr) { - return Result(Status::NoFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + return Result(Status::noFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } sceneryElement->SetDirection(_loc.direction); @@ -432,15 +432,15 @@ namespace OpenRCT2::GameActions sceneryElement->SetSecondaryColour(_secondaryColour); sceneryElement->SetTertiaryColour(_tertiaryColour); sceneryElement->SetClearanceZ(sceneryElement->GetBaseZ() + sceneryEntry->height + 7); - sceneryElement->SetGhost(GetFlags() & GAME_COMMAND_FLAG_GHOST); + sceneryElement->SetGhost(GetFlags().has(CommandFlag::ghost)); if (supportsRequired) { sceneryElement->SetNeedsSupports(); } - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); const uint8_t groundFlags = clearanceData.GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); - res.SetData( + res.setData( SmallSceneryPlaceActionResult{ groundFlags, sceneryElement->GetBaseZ(), sceneryElement->GetSceneryQuadrant() }); MapInvalidateTileFull(_loc); diff --git a/src/openrct2/actions/SmallSceneryPlaceAction.h b/src/openrct2/actions/SmallSceneryPlaceAction.h index e94343375973..1419b07dc520 100644 --- a/src/openrct2/actions/SmallSceneryPlaceAction.h +++ b/src/openrct2/actions/SmallSceneryPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/SmallSceneryRemoveAction.cpp b/src/openrct2/actions/SmallSceneryRemoveAction.cpp index 5117a3cfd510..d812907f3691 100644 --- a/src/openrct2/actions/SmallSceneryRemoveAction.cpp +++ b/src/openrct2/actions/SmallSceneryRemoveAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -61,30 +61,29 @@ namespace OpenRCT2::GameActions if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); } - auto* entry = OpenRCT2::ObjectManager::GetObjectEntry(_sceneryType); + auto* entry = ObjectManager::GetObjectEntry(_sceneryType); if (entry == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); } - res.Cost = entry->removal_price; - res.Expenditure = ExpenditureType::landscaping; - res.Position = _loc; + res.cost = entry->removal_price; + res.expenditure = ExpenditureType::landscaping; + res.position = _loc; - if (gLegacyScene != LegacyScene::scenarioEditor && !(GetFlags() & GAME_COMMAND_FLAG_GHOST) - && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !GetFlags().has(CommandFlag::ghost) && !gameState.cheats.sandboxMode) { // Check if allowed to remove item - if (getGameState().park.flags & PARK_FLAGS_FORBID_TREE_REMOVAL) + if (gameState.park.flags & PARK_FLAGS_FORBID_TREE_REMOVAL) { if (entry->HasFlag(SMALL_SCENERY_FLAG_IS_TREE)) { - res.Error = Status::NoClearance; - res.ErrorTitle = STR_CANT_REMOVE_THIS; - res.ErrorMessage = STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY; + res.error = Status::noClearance; + res.errorTitle = STR_CANT_REMOVE_THIS; + res.errorMessage = STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY; return res; } } @@ -92,9 +91,9 @@ namespace OpenRCT2::GameActions // Check if the land is owned if (!MapIsLocationOwned(_loc)) { - res.Error = Status::NoClearance; - res.ErrorTitle = STR_CANT_REMOVE_THIS; - res.ErrorMessage = STR_LAND_NOT_OWNED_BY_PARK; + res.error = Status::noClearance; + res.errorTitle = STR_CANT_REMOVE_THIS; + res.errorMessage = STR_LAND_NOT_OWNED_BY_PARK; return res; } } @@ -102,7 +101,7 @@ namespace OpenRCT2::GameActions TileElement* tileElement = FindSceneryElement(); if (tileElement == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); } return res; @@ -112,21 +111,21 @@ namespace OpenRCT2::GameActions { Result res = Result(); - auto* entry = OpenRCT2::ObjectManager::GetObjectEntry(_sceneryType); + auto* entry = ObjectManager::GetObjectEntry(_sceneryType); if (entry == nullptr) { LOG_ERROR("Invalid small scenery type %u", _sceneryType); - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); } - res.Cost = entry->removal_price; - res.Expenditure = ExpenditureType::landscaping; - res.Position = _loc; + res.cost = entry->removal_price; + res.expenditure = ExpenditureType::landscaping; + res.position = _loc; TileElement* tileElement = FindSceneryElement(); if (tileElement == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); } MapInvalidateTileFull(_loc); @@ -137,7 +136,7 @@ namespace OpenRCT2::GameActions TileElement* SmallSceneryRemoveAction::FindSceneryElement() const { - const bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; + const bool isGhost = GetFlags().has(CommandFlag::ghost); for (auto* sceneryElement : TileElementsView(_loc)) { // If we are removing ghost elements diff --git a/src/openrct2/actions/SmallSceneryRemoveAction.h b/src/openrct2/actions/SmallSceneryRemoveAction.h index a75ce17e6e4e..432dc704aa42 100644 --- a/src/openrct2/actions/SmallSceneryRemoveAction.h +++ b/src/openrct2/actions/SmallSceneryRemoveAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/SmallScenerySetColourAction.cpp b/src/openrct2/actions/SmallScenerySetColourAction.cpp index 28ed907fa0e2..d2fd1d20b62b 100644 --- a/src/openrct2/actions/SmallScenerySetColourAction.cpp +++ b/src/openrct2/actions/SmallScenerySetColourAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -61,33 +61,33 @@ namespace OpenRCT2::GameActions Result SmallScenerySetColourAction::Query(GameState_t& gameState) const { - return QueryExecute(false); + return QueryExecute(gameState, false); } Result SmallScenerySetColourAction::Execute(GameState_t& gameState) const { - return QueryExecute(true); + return QueryExecute(gameState, true); } - Result SmallScenerySetColourAction::QueryExecute(bool isExecuting) const + Result SmallScenerySetColourAction::QueryExecute(GameState_t& gameState, bool isExecuting) const { auto res = Result(); - res.Expenditure = ExpenditureType::landscaping; - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.ErrorTitle = STR_CANT_REPAINT_THIS; + res.expenditure = ExpenditureType::landscaping; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.errorTitle = STR_CANT_REPAINT_THIS; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); } - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationOwned(_loc)) { - return Result(Status::NotOwned, STR_CANT_REPAINT_THIS, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_REPAINT_THIS, STR_LAND_NOT_OWNED_BY_PARK); } } @@ -96,10 +96,10 @@ namespace OpenRCT2::GameActions if (sceneryElement == nullptr) { LOG_ERROR("Small scenery not found at: x = %d, y = %d, z = %d", _loc.x, _loc.y, _loc.z); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } - if ((GetFlags() & GAME_COMMAND_FLAG_GHOST) && !(sceneryElement->IsGhost())) + if ((GetFlags().has(CommandFlag::ghost)) && !(sceneryElement->IsGhost())) { return res; } diff --git a/src/openrct2/actions/SmallScenerySetColourAction.h b/src/openrct2/actions/SmallScenerySetColourAction.h index 1b1e76ca0cdb..80f085565df2 100644 --- a/src/openrct2/actions/SmallScenerySetColourAction.h +++ b/src/openrct2/actions/SmallScenerySetColourAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -38,6 +38,6 @@ namespace OpenRCT2::GameActions Result Execute(GameState_t& gameState) const override; private: - Result QueryExecute(bool isExecuting) const; + Result QueryExecute(GameState_t& gameState, bool isExecuting) const; }; } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/StaffFireAction.cpp b/src/openrct2/actions/StaffFireAction.cpp index 5404ead00101..0c06e4563da8 100644 --- a/src/openrct2/actions/StaffFireAction.cpp +++ b/src/openrct2/actions/StaffFireAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,7 @@ #include "../Diagnostic.h" #include "../GameState.h" +#include "../drawing/Drawing.h" #include "../entity/EntityRegistry.h" #include "../entity/Staff.h" #include "../ui/WindowManager.h" @@ -43,23 +44,23 @@ namespace OpenRCT2::GameActions if (_spriteId.ToUnderlying() >= kMaxEntities || _spriteId.IsNull()) { LOG_ERROR("Invalid spriteId %u", _spriteId); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } - auto staff = getGameState().entities.TryGetEntity(_spriteId); + auto staff = gameState.entities.TryGetEntity(_spriteId); if (staff == nullptr) { LOG_ERROR("Staff entity not found for spriteId %u", _spriteId); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); } if (staff->State == PeepState::fixing) { - return Result(Status::Disallowed, STR_CANT_FIRE_STAFF_FIXING, kStringIdNone); + return Result(Status::disallowed, STR_CANT_FIRE_STAFF_FIXING, kStringIdNone); } else if (staff->State == PeepState::inspecting) { - return Result(Status::Disallowed, STR_CANT_FIRE_STAFF_INSPECTING, kStringIdNone); + return Result(Status::disallowed, STR_CANT_FIRE_STAFF_INSPECTING, kStringIdNone); } return Result(); @@ -67,11 +68,11 @@ namespace OpenRCT2::GameActions Result StaffFireAction::Execute(GameState_t& gameState) const { - auto staff = getGameState().entities.TryGetEntity(_spriteId); + auto staff = gameState.entities.TryGetEntity(_spriteId); if (staff == nullptr) { LOG_ERROR("Staff entity not found for spriteId %u", _spriteId); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); } auto* windowMgr = Ui::GetWindowManager(); diff --git a/src/openrct2/actions/StaffFireAction.h b/src/openrct2/actions/StaffFireAction.h index b1ba498729a6..8c0841e92d17 100644 --- a/src/openrct2/actions/StaffFireAction.h +++ b/src/openrct2/actions/StaffFireAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/StaffHireNewAction.cpp b/src/openrct2/actions/StaffHireNewAction.cpp index e426427e007f..e1be2212e9c5 100644 --- a/src/openrct2/actions/StaffHireNewAction.cpp +++ b/src/openrct2/actions/StaffHireNewAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -64,28 +64,28 @@ namespace OpenRCT2::GameActions Result StaffHireNewAction::Query(GameState_t& gameState) const { - return QueryExecute(false); + return QueryExecute(gameState, false); } Result StaffHireNewAction::Execute(GameState_t& gameState) const { - return QueryExecute(true); + return QueryExecute(gameState, true); } - Result StaffHireNewAction::QueryExecute(bool execute) const + Result StaffHireNewAction::QueryExecute(GameState_t& gameState, bool execute) const { auto res = Result(); - res.Expenditure = ExpenditureType::wages; + res.expenditure = ExpenditureType::wages; if (_staffType >= static_cast(StaffType::count)) { LOG_ERROR("Invalid staff type %u", static_cast(_staffType)); - return Result(Status::InvalidParameters, STR_CANT_HIRE_NEW_STAFF, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_HIRE_NEW_STAFF, STR_ERR_VALUE_OUT_OF_RANGE); } - if (getGameState().entities.GetNumFreeEntities() < 400) + if (gameState.entities.GetNumFreeEntities() < 400) { - return Result(Status::NoFreeElements, STR_CANT_HIRE_NEW_STAFF, STR_TOO_MANY_PEOPLE_IN_GAME); + return Result(Status::noFreeElements, STR_CANT_HIRE_NEW_STAFF, STR_TOO_MANY_PEOPLE_IN_GAME); } if (_staffType == static_cast(StaffType::entertainer)) @@ -94,23 +94,23 @@ namespace OpenRCT2::GameActions if (std::find(costumes.begin(), costumes.end(), _costumeIndex) == costumes.end()) { LOG_ERROR("Unavailable entertainer costume %u", static_cast(_costumeIndex)); - return Result(Status::InvalidParameters, STR_CANT_HIRE_NEW_STAFF, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_CANT_HIRE_NEW_STAFF, STR_ERR_VALUE_OUT_OF_RANGE); } } - Staff* newPeep = getGameState().entities.CreateEntity(); + Staff* newPeep = gameState.entities.CreateEntity(); if (newPeep == nullptr) { // Too many peeps exist already. - return Result(Status::NoFreeElements, STR_CANT_HIRE_NEW_STAFF, STR_TOO_MANY_PEOPLE_IN_GAME); + return Result(Status::noFreeElements, STR_CANT_HIRE_NEW_STAFF, STR_TOO_MANY_PEOPLE_IN_GAME); } if (execute == false) { // In query we just want to see if we can obtain a sprite slot. - getGameState().entities.EntityRemove(newPeep); + gameState.entities.EntityRemove(newPeep); - res.SetData(StaffHireNewActionResult{ EntityId::GetNull() }); + res.setData(StaffHireNewActionResult{ EntityId::GetNull() }); } else { @@ -171,7 +171,7 @@ namespace OpenRCT2::GameActions if (_autoPosition) { - AutoPositionNewStaff(newPeep); + AutoPositionNewStaff(gameState, newPeep); } else { @@ -194,7 +194,7 @@ namespace OpenRCT2::GameActions newPeep->TrousersColour = colour; // Staff energy determines their walking speed - switch (getGameState().cheats.selectedStaffSpeed) + switch (gameState.cheats.selectedStaffSpeed) { case StaffSpeedCheat::None: newPeep->Energy = kCheatsStaffNormalSpeed; @@ -215,13 +215,13 @@ namespace OpenRCT2::GameActions newPeep->StaffMowingTimeout = 0; newPeep->PatrolInfo = nullptr; - res.SetData(StaffHireNewActionResult{ newPeep->Id }); + res.setData(StaffHireNewActionResult{ newPeep->Id }); } return res; } - void StaffHireNewAction::AutoPositionNewStaff(Peep* newPeep) const + void StaffHireNewAction::AutoPositionNewStaff(GameState_t& gameState, Peep* newPeep) const { // Find a location to place new staff member newPeep->State = PeepState::falling; @@ -281,7 +281,7 @@ namespace OpenRCT2::GameActions else { // No walking guests; pick random park entrance - const auto& park = getGameState().park; + const auto& park = gameState.park; if (!park.entrances.empty()) { auto rand = ScenarioRandMax(static_cast(park.entrances.size())); diff --git a/src/openrct2/actions/StaffHireNewAction.h b/src/openrct2/actions/StaffHireNewAction.h index 0e3a635fec0f..cd30b6ec185c 100644 --- a/src/openrct2/actions/StaffHireNewAction.h +++ b/src/openrct2/actions/StaffHireNewAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -40,7 +40,7 @@ namespace OpenRCT2::GameActions Result Execute(GameState_t& gameState) const override; private: - Result QueryExecute(bool execute) const; - void AutoPositionNewStaff(Peep* newPeep) const; + Result QueryExecute(GameState_t& gameState, bool execute) const; + void AutoPositionNewStaff(GameState_t& gameState, Peep* newPeep) const; }; } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/StaffSetColourAction.cpp b/src/openrct2/actions/StaffSetColourAction.cpp index b8ad72c43596..6c91ecb264fc 100644 --- a/src/openrct2/actions/StaffSetColourAction.cpp +++ b/src/openrct2/actions/StaffSetColourAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -50,7 +50,7 @@ namespace OpenRCT2::GameActions if (staffType != StaffType::handyman && staffType != StaffType::mechanic && staffType != StaffType::security) { LOG_ERROR("Staff color can't be changed for staff type %d", _staffType); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ACTION_INVALID_FOR_THAT_STAFF_TYPE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ACTION_INVALID_FOR_THAT_STAFF_TYPE); } return Result(); } @@ -59,7 +59,7 @@ namespace OpenRCT2::GameActions { // Update global uniform colour property auto res = StaffSetColour(static_cast(_staffType), _colour); - if (res.Error != Status::Ok) + if (res.error != Status::ok) { return res; } diff --git a/src/openrct2/actions/StaffSetColourAction.h b/src/openrct2/actions/StaffSetColourAction.h index 22dce4465b50..0f1ff392d31e 100644 --- a/src/openrct2/actions/StaffSetColourAction.h +++ b/src/openrct2/actions/StaffSetColourAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/StaffSetCostumeAction.cpp b/src/openrct2/actions/StaffSetCostumeAction.cpp index 8cc1cb6f4899..a2e622c40698 100644 --- a/src/openrct2/actions/StaffSetCostumeAction.cpp +++ b/src/openrct2/actions/StaffSetCostumeAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -50,14 +50,14 @@ namespace OpenRCT2::GameActions if (_spriteIndex.ToUnderlying() >= kMaxEntities || _spriteIndex.IsNull()) { LOG_ERROR("Invalid sprite index %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } - auto* staff = getGameState().entities.TryGetEntity(_spriteIndex); + auto* staff = gameState.entities.TryGetEntity(_spriteIndex); if (staff == nullptr) { LOG_ERROR("Staff entity not found for spriteIndex %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); } auto& objManager = GetContext()->GetObjectManager(); @@ -67,18 +67,18 @@ namespace OpenRCT2::GameActions if (animObj->GetPeepType() != animPeepType) { LOG_ERROR("Invalid entertainer costume %u", _costume); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } return Result(); } Result StaffSetCostumeAction::Execute(GameState_t& gameState) const { - auto* staff = getGameState().entities.TryGetEntity(_spriteIndex); + auto* staff = gameState.entities.TryGetEntity(_spriteIndex); if (staff == nullptr) { LOG_ERROR("Staff entity not found for spriteIndex %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); } staff->AnimationObjectIndex = _costume; @@ -102,7 +102,7 @@ namespace OpenRCT2::GameActions ContextBroadcastIntent(&intent); auto res = Result(); - res.Position = staff->GetLocation(); + res.position = staff->GetLocation(); return res; } diff --git a/src/openrct2/actions/StaffSetCostumeAction.h b/src/openrct2/actions/StaffSetCostumeAction.h index 9e544031ef08..e7e868b3b0fd 100644 --- a/src/openrct2/actions/StaffSetCostumeAction.h +++ b/src/openrct2/actions/StaffSetCostumeAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,11 +18,11 @@ namespace OpenRCT2::GameActions { private: EntityId _spriteIndex{ EntityId::GetNull() }; - ObjectEntryIndex _costume = OpenRCT2::kObjectEntryIndexNull; + ObjectEntryIndex _costume = kObjectEntryIndexNull; public: StaffSetCostumeAction() = default; - StaffSetCostumeAction(EntityId spriteIndex, OpenRCT2::ObjectEntryIndex costume); + StaffSetCostumeAction(EntityId spriteIndex, ObjectEntryIndex costume); void AcceptParameters(GameActionParameterVisitor&) final; diff --git a/src/openrct2/actions/StaffSetNameAction.cpp b/src/openrct2/actions/StaffSetNameAction.cpp index d199dc56ec77..5818a074540d 100644 --- a/src/openrct2/actions/StaffSetNameAction.cpp +++ b/src/openrct2/actions/StaffSetNameAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -52,14 +52,14 @@ namespace OpenRCT2::GameActions if (_spriteIndex.ToUnderlying() >= kMaxEntities || _spriteIndex.IsNull()) { LOG_ERROR("Invalid sprite index %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_STAFF_ERROR_CANT_NAME_STAFF_MEMBER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_STAFF_ERROR_CANT_NAME_STAFF_MEMBER, STR_ERR_VALUE_OUT_OF_RANGE); } - auto staff = getGameState().entities.TryGetEntity(_spriteIndex); + auto staff = gameState.entities.TryGetEntity(_spriteIndex); if (staff == nullptr) { LOG_ERROR("Staff entity not found for spriteIndex %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_STAFF_ERROR_CANT_NAME_STAFF_MEMBER, STR_ERR_STAFF_NOT_FOUND); + return Result(Status::invalidParameters, STR_STAFF_ERROR_CANT_NAME_STAFF_MEMBER, STR_ERR_STAFF_NOT_FOUND); } return Result(); @@ -67,11 +67,11 @@ namespace OpenRCT2::GameActions Result StaffSetNameAction::Execute(GameState_t& gameState) const { - auto staff = getGameState().entities.TryGetEntity(_spriteIndex); + auto staff = gameState.entities.TryGetEntity(_spriteIndex); if (staff == nullptr) { LOG_ERROR("Staff entity not found for spriteIndex %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_STAFF_ERROR_CANT_NAME_STAFF_MEMBER, STR_ERR_STAFF_NOT_FOUND); + return Result(Status::invalidParameters, STR_STAFF_ERROR_CANT_NAME_STAFF_MEMBER, STR_ERR_STAFF_NOT_FOUND); } auto curName = staff->GetName(); @@ -82,7 +82,7 @@ namespace OpenRCT2::GameActions if (!staff->SetName(_name)) { - return Result(Status::Unknown, STR_CANT_NAME_GUEST, kStringIdNone); + return Result(Status::unknown, STR_CANT_NAME_GUEST, kStringIdNone); } GfxInvalidateScreen(); @@ -91,7 +91,7 @@ namespace OpenRCT2::GameActions ContextBroadcastIntent(&intent); auto res = Result(); - res.Position = staff->GetLocation(); + res.position = staff->GetLocation(); return res; } diff --git a/src/openrct2/actions/StaffSetNameAction.h b/src/openrct2/actions/StaffSetNameAction.h index 20afb793919d..29dcf578ce21 100644 --- a/src/openrct2/actions/StaffSetNameAction.h +++ b/src/openrct2/actions/StaffSetNameAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/StaffSetOrdersAction.cpp b/src/openrct2/actions/StaffSetOrdersAction.cpp index 2266e41fab00..c6c67ac034c8 100644 --- a/src/openrct2/actions/StaffSetOrdersAction.cpp +++ b/src/openrct2/actions/StaffSetOrdersAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -49,15 +49,15 @@ namespace OpenRCT2::GameActions if (_spriteIndex.ToUnderlying() >= kMaxEntities || _spriteIndex.IsNull()) { LOG_ERROR("Invalid sprite index %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } - auto* staff = getGameState().entities.TryGetEntity(_spriteIndex); + auto* staff = gameState.entities.TryGetEntity(_spriteIndex); if (staff == nullptr || (staff->AssignedStaffType != StaffType::handyman && staff->AssignedStaffType != StaffType::mechanic)) { LOG_ERROR("Staff orders can't be changed for staff of type %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ACTION_INVALID_FOR_THAT_STAFF_TYPE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ACTION_INVALID_FOR_THAT_STAFF_TYPE); } return Result(); @@ -65,11 +65,11 @@ namespace OpenRCT2::GameActions Result StaffSetOrdersAction::Execute(GameState_t& gameState) const { - auto* staff = getGameState().entities.TryGetEntity(_spriteIndex); + auto* staff = gameState.entities.TryGetEntity(_spriteIndex); if (staff == nullptr) { LOG_ERROR("Staff entity not found for spriteIndex %u", _spriteIndex); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); } staff->StaffOrders = _ordersId; @@ -79,7 +79,7 @@ namespace OpenRCT2::GameActions ContextBroadcastIntent(&intent); auto res = Result(); - res.Position = staff->GetLocation(); + res.position = staff->GetLocation(); return res; } diff --git a/src/openrct2/actions/StaffSetOrdersAction.h b/src/openrct2/actions/StaffSetOrdersAction.h index 08aabd7e1fcd..a1538eea1c58 100644 --- a/src/openrct2/actions/StaffSetOrdersAction.h +++ b/src/openrct2/actions/StaffSetOrdersAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/StaffSetPatrolAreaAction.cpp b/src/openrct2/actions/StaffSetPatrolAreaAction.cpp index ad0fdd77359f..6126d636ece0 100644 --- a/src/openrct2/actions/StaffSetPatrolAreaAction.cpp +++ b/src/openrct2/actions/StaffSetPatrolAreaAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,7 @@ #include "../Diagnostic.h" #include "../GameState.h" +#include "../drawing/Drawing.h" #include "../entity/EntityRegistry.h" #include "../entity/PatrolArea.h" #include "../entity/Peep.h" @@ -47,12 +48,12 @@ namespace OpenRCT2::GameActions Result StaffSetPatrolAreaAction::Query(GameState_t& gameState) const { - return QueryExecute(false); + return QueryExecute(gameState, false); } Result StaffSetPatrolAreaAction::Execute(GameState_t& gameState) const { - return QueryExecute(true); + return QueryExecute(gameState, true); } static void InvalidatePatrolTiles(const MapRange& range) @@ -60,13 +61,13 @@ namespace OpenRCT2::GameActions MapInvalidateRegion(range.Point1, range.Point2); } - Result StaffSetPatrolAreaAction::QueryExecute(bool executing) const + Result StaffSetPatrolAreaAction::QueryExecute(GameState_t& gameState, bool executing) const { - auto staff = getGameState().entities.TryGetEntity(_spriteId); + auto staff = gameState.entities.TryGetEntity(_spriteId); if (staff == nullptr) { LOG_ERROR("Staff entity not found for spriteID %u", _spriteId.ToUnderlying()); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND); } auto validRange = ClampRangeWithinMap(_range); @@ -76,7 +77,7 @@ namespace OpenRCT2::GameActions { if (!LocationValid({ x, y })) { - return Result(Status::InvalidParameters, STR_SET_PATROL_AREA, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_SET_PATROL_AREA, STR_OFF_EDGE_OF_MAP); } } } diff --git a/src/openrct2/actions/StaffSetPatrolAreaAction.h b/src/openrct2/actions/StaffSetPatrolAreaAction.h index 5c2b89757b45..8b4616c285e1 100644 --- a/src/openrct2/actions/StaffSetPatrolAreaAction.h +++ b/src/openrct2/actions/StaffSetPatrolAreaAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -27,7 +27,7 @@ namespace OpenRCT2::GameActions MapRange _range; StaffSetPatrolAreaMode _mode; - Result QueryExecute(bool executing) const; + Result QueryExecute(GameState_t& gameState, bool executing) const; public: StaffSetPatrolAreaAction() = default; diff --git a/src/openrct2/actions/SurfaceSetStyleAction.cpp b/src/openrct2/actions/SurfaceSetStyleAction.cpp index f965b1f1eefe..072175d4a4f3 100644 --- a/src/openrct2/actions/SurfaceSetStyleAction.cpp +++ b/src/openrct2/actions/SurfaceSetStyleAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -48,20 +48,19 @@ namespace OpenRCT2::GameActions Result SurfaceSetStyleAction::Query(GameState_t& gameState) const { auto res = Result(); - res.ErrorTitle = STR_CANT_CHANGE_LAND_TYPE; - res.Expenditure = ExpenditureType::landscaping; + res.errorTitle = STR_CANT_CHANGE_LAND_TYPE; + res.expenditure = ExpenditureType::landscaping; auto validRange = ClampRangeWithinMap(_range.Normalise()); - auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); + auto& objManager = GetContext()->GetObjectManager(); if (_surfaceStyle != kObjectEntryIndexNull) { - const auto surfaceObj = static_cast( - objManager.GetLoadedObject(_surfaceStyle)); + const auto surfaceObj = objManager.GetLoadedObject(_surfaceStyle); if (surfaceObj == nullptr) { LOG_ERROR("Invalid surface style %u", _surfaceStyle); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_LAND_TYPE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_LAND_TYPE, STR_UNKNOWN_OBJECT_TYPE); } } @@ -72,7 +71,7 @@ namespace OpenRCT2::GameActions if (edgeObj == nullptr) { LOG_ERROR("Invalid edge style %u", _edgeStyle); - return Result(Status::InvalidParameters, STR_CANT_CHANGE_LAND_TYPE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_CHANGE_LAND_TYPE, STR_UNKNOWN_OBJECT_TYPE); } } @@ -80,15 +79,15 @@ namespace OpenRCT2::GameActions auto yMid = (validRange.GetY1() + validRange.GetY2()) / 2 + 16; auto heightMid = TileElementHeight({ xMid, yMid }); - res.Position.x = xMid; - res.Position.y = yMid; - res.Position.z = heightMid; + res.position.x = xMid; + res.position.y = yMid; + res.position.z = heightMid; // Do nothing if not in editor, sandbox mode or landscaping is forbidden if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode && (gameState.park.flags & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES)) { - return Result(Status::Disallowed, STR_CANT_CHANGE_LAND_TYPE, STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY); + return Result(Status::disallowed, STR_CANT_CHANGE_LAND_TYPE, STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY); } money64 surfaceCost = 0; @@ -138,7 +137,7 @@ namespace OpenRCT2::GameActions } } } - res.Cost = surfaceCost + edgeCost; + res.cost = surfaceCost + edgeCost; return res; } @@ -146,17 +145,17 @@ namespace OpenRCT2::GameActions Result SurfaceSetStyleAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.ErrorTitle = STR_CANT_CHANGE_LAND_TYPE; - res.Expenditure = ExpenditureType::landscaping; + res.errorTitle = STR_CANT_CHANGE_LAND_TYPE; + res.expenditure = ExpenditureType::landscaping; auto validRange = ClampRangeWithinMap(_range.Normalise()); auto xMid = (validRange.GetX1() + validRange.GetX2()) / 2 + 16; auto yMid = (validRange.GetY1() + validRange.GetY2()) / 2 + 16; auto heightMid = TileElementHeight({ xMid, yMid }); - res.Position.x = xMid; - res.Position.y = yMid; - res.Position.z = heightMid; + res.position.x = xMid; + res.position.y = yMid; + res.position.z = heightMid; money64 surfaceCost = 0; money64 edgeCost = 0; @@ -168,7 +167,7 @@ namespace OpenRCT2::GameActions if (!LocationValid(coords)) continue; - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationInPark(coords)) continue; @@ -186,7 +185,7 @@ namespace OpenRCT2::GameActions if (_surfaceStyle != curSurfaceStyle) { - auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); + auto& objManager = GetContext()->GetObjectManager(); const auto* surfaceObject = objManager.GetLoadedObject(_surfaceStyle); if (surfaceObject != nullptr) { @@ -220,7 +219,7 @@ namespace OpenRCT2::GameActions } } } - res.Cost = surfaceCost + edgeCost; + res.cost = surfaceCost + edgeCost; return res; } diff --git a/src/openrct2/actions/SurfaceSetStyleAction.h b/src/openrct2/actions/SurfaceSetStyleAction.h index 1017dcd79ccc..c47d961c18f0 100644 --- a/src/openrct2/actions/SurfaceSetStyleAction.h +++ b/src/openrct2/actions/SurfaceSetStyleAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/TileModifyAction.cpp b/src/openrct2/actions/TileModifyAction.cpp index fe793ca31403..95a964664913 100644 --- a/src/openrct2/actions/TileModifyAction.cpp +++ b/src/openrct2/actions/TileModifyAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -63,7 +63,7 @@ namespace OpenRCT2::GameActions { if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_CHANGE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_CHANGE_THIS, STR_OFF_EDGE_OF_MAP); } auto res = Result(); switch (_setting) @@ -240,12 +240,12 @@ namespace OpenRCT2::GameActions } default: LOG_ERROR("Invalid tile modification type %u", _setting); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } - res.Position.x = _loc.x; - res.Position.y = _loc.y; - res.Position.z = TileElementHeight(_loc); + res.position.x = _loc.x; + res.position.y = _loc.y; + res.position.z = TileElementHeight(_loc); if (isExecuting) { diff --git a/src/openrct2/actions/TileModifyAction.h b/src/openrct2/actions/TileModifyAction.h index a91e61f212b5..1c0214353c79 100644 --- a/src/openrct2/actions/TileModifyAction.h +++ b/src/openrct2/actions/TileModifyAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/TrackDesignAction.cpp b/src/openrct2/actions/TrackDesignAction.cpp index 275b5165ee55..289d0961bcc1 100644 --- a/src/openrct2/actions/TrackDesignAction.cpp +++ b/src/openrct2/actions/TrackDesignAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -27,10 +27,12 @@ namespace OpenRCT2::GameActions { - TrackDesignAction::TrackDesignAction(const CoordsXYZD& location, const TrackDesign& td, bool placeScenery) + TrackDesignAction::TrackDesignAction( + const CoordsXYZD& location, const TrackDesign& td, bool placeScenery, RideInspection inspectionInterval) : _loc(location) , _td(td) , _placeScenery(placeScenery) + , _inspectionInterval(inspectionInterval) { } @@ -52,19 +54,26 @@ namespace OpenRCT2::GameActions stream << DS_TAG(_loc); _td.Serialise(stream); stream << DS_TAG(_placeScenery); + stream << DS_TAG(_inspectionInterval); } Result TrackDesignAction::Query(GameState_t& gameState) const { auto res = Result(); - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.Expenditure = ExpenditureType::rideConstruction; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.expenditure = ExpenditureType::rideConstruction; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_OFF_EDGE_OF_MAP); + } + + if (_inspectionInterval > RideInspection::never) + { + LOG_ERROR("Invalid inspection interval: %u", EnumValue(_inspectionInterval)); + return Result(Status::invalidParameters, STR_CANT_CHANGE_OPERATING_MODE, STR_ERR_VALUE_OUT_OF_RANGE); } auto& objManager = GetContext()->GetObjectManager(); @@ -80,29 +89,28 @@ namespace OpenRCT2::GameActions } // Colours do not matter as will be overwritten - auto rideCreateAction = RideCreateAction(_td.trackAndVehicle.rtdIndex, entryIndex, 0, 0, gameState.lastEntranceStyle); + auto rideCreateAction = RideCreateAction( + _td.trackAndVehicle.rtdIndex, entryIndex, 0, 0, gameState.lastEntranceStyle, _inspectionInterval); rideCreateAction.SetFlags(GetFlags()); auto r = ExecuteNested(&rideCreateAction, gameState); - if (r.Error != Status::Ok) + if (r.error != Status::ok) { - return Result(Status::NoFreeElements, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, kStringIdNone); + return Result(Status::noFreeElements, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, kStringIdNone); } - const auto rideIndex = r.GetData(); + const auto rideIndex = r.getData(); auto ride = GetRide(rideIndex); if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %d", rideIndex); - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_RIDE_NOT_FOUND); } bool placeScenery = _placeScenery; - uint32_t flags = 0; - if (GetFlags() & GAME_COMMAND_FLAG_GHOST) - flags |= GAME_COMMAND_FLAG_GHOST; - if (GetFlags() & GAME_COMMAND_FLAG_REPLAY) - flags |= GAME_COMMAND_FLAG_REPLAY; + CommandFlags flags = {}; + flags.set(CommandFlag::ghost, GetFlags().has(CommandFlag::ghost)); + flags.set(CommandFlag::replay, GetFlags().has(CommandFlag::replay)); auto queryRes = TrackDesignPlace(_td, flags, placeScenery, *ride, _loc); if (_trackDesignPlaceStateSceneryUnavailable) @@ -116,17 +124,17 @@ namespace OpenRCT2::GameActions ExecuteNested(&gameAction, gameState); - if (queryRes.Error != Status::Ok) + if (queryRes.error != Status::ok) { - res.Error = queryRes.Error; - res.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; - res.ErrorMessage = queryRes.ErrorMessage; - res.ErrorMessageArgs = queryRes.ErrorMessageArgs; + res.error = queryRes.error; + res.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + res.errorMessage = queryRes.errorMessage; + res.errorMessageArgs = queryRes.errorMessageArgs; return res; } - res.Cost = queryRes.Cost; - res.SetData(RideId{ RideId::GetNull() }); + res.cost = queryRes.cost; + res.setData(RideId{ RideId::GetNull() }); return res; } @@ -134,10 +142,10 @@ namespace OpenRCT2::GameActions Result TrackDesignAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.Expenditure = ExpenditureType::rideConstruction; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.expenditure = ExpenditureType::rideConstruction; auto& objManager = GetContext()->GetObjectManager(); auto entryIndex = objManager.GetLoadedObjectEntryIndex(_td.trackAndVehicle.vehicleObject); @@ -152,24 +160,25 @@ namespace OpenRCT2::GameActions } // Colours do not matter as will be overwritten - auto rideCreateAction = RideCreateAction(_td.trackAndVehicle.rtdIndex, entryIndex, 0, 0, gameState.lastEntranceStyle); + auto rideCreateAction = RideCreateAction( + _td.trackAndVehicle.rtdIndex, entryIndex, 0, 0, gameState.lastEntranceStyle, _inspectionInterval); rideCreateAction.SetFlags(GetFlags()); auto r = ExecuteNested(&rideCreateAction, gameState); - if (r.Error != Status::Ok) + if (r.error != Status::ok) { - return Result(Status::NoFreeElements, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, kStringIdNone); + return Result(Status::noFreeElements, STR_CANT_CREATE_NEW_RIDE_ATTRACTION, kStringIdNone); } - const auto rideIndex = r.GetData(); + const auto rideIndex = r.getData(); auto ride = GetRide(rideIndex); if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %d", rideIndex); - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_RIDE_NOT_FOUND); } // Query first, this is required again to determine if scenery is available. - uint32_t flags = GetFlags() & ~GAME_COMMAND_FLAG_APPLY; + auto flags = GetFlags().without(CommandFlag::apply); bool placeScenery = _placeScenery; @@ -180,34 +189,34 @@ namespace OpenRCT2::GameActions queryRes = TrackDesignPlace(_td, flags, placeScenery, *ride, _loc); } - if (queryRes.Error != Status::Ok) + if (queryRes.error != Status::ok) { auto gameAction = RideDemolishAction(ride->id, RideModifyType::demolish); gameAction.SetFlags(GetFlags()); ExecuteNested(&gameAction, gameState); - res.Error = queryRes.Error; - res.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; - res.ErrorMessage = queryRes.ErrorMessage; - res.ErrorMessageArgs = queryRes.ErrorMessageArgs; + res.error = queryRes.error; + res.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + res.errorMessage = queryRes.errorMessage; + res.errorMessageArgs = queryRes.errorMessageArgs; return res; } // Execute. - flags |= GAME_COMMAND_FLAG_APPLY; + flags.set(CommandFlag::apply); auto execRes = TrackDesignPlace(_td, flags, placeScenery, *ride, _loc); - if (execRes.Error != Status::Ok) + if (execRes.error != Status::ok) { auto gameAction = RideDemolishAction(ride->id, RideModifyType::demolish); gameAction.SetFlags(GetFlags()); ExecuteNested(&gameAction, gameState); - res.Error = execRes.Error; - res.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; - res.ErrorMessage = execRes.ErrorMessage; - res.ErrorMessageArgs = execRes.ErrorMessageArgs; + res.error = execRes.error; + res.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + res.errorMessage = execRes.errorMessage; + res.errorMessageArgs = execRes.errorMessageArgs; return res; } @@ -215,18 +224,17 @@ namespace OpenRCT2::GameActions if (entryIndex != kObjectEntryIndexNull) { auto colour = RideGetUnusedPresetVehicleColour(entryIndex); - auto rideSetVehicleAction = GameActions::RideSetVehicleAction( - ride->id, GameActions::RideSetVehicleType::RideEntry, entryIndex, colour); + auto rideSetVehicleAction = RideSetVehicleAction(ride->id, RideSetVehicleType::RideEntry, entryIndex, colour); ExecuteNested(&rideSetVehicleAction, gameState); } SetOperatingSettingNested(ride->id, RideSetSetting::Mode, static_cast(_td.operation.rideMode), flags); - auto rideSetVehicleAction2 = GameActions::RideSetVehicleAction( - ride->id, GameActions::RideSetVehicleType::NumTrains, _td.trackAndVehicle.numberOfTrains); + auto rideSetVehicleAction2 = RideSetVehicleAction( + ride->id, RideSetVehicleType::NumTrains, _td.trackAndVehicle.numberOfTrains); ExecuteNested(&rideSetVehicleAction2, gameState); - auto rideSetVehicleAction3 = GameActions::RideSetVehicleAction( - ride->id, GameActions::RideSetVehicleType::NumCarsPerTrain, _td.trackAndVehicle.numberOfCarsPerTrain); + auto rideSetVehicleAction3 = RideSetVehicleAction( + ride->id, RideSetVehicleType::NumCarsPerTrain, _td.trackAndVehicle.numberOfCarsPerTrain); ExecuteNested(&rideSetVehicleAction3, gameState); SetOperatingSettingNested(ride->id, RideSetSetting::Departure, _td.operation.departFlags, flags); @@ -238,10 +246,6 @@ namespace OpenRCT2::GameActions auto numCircuits = std::max(1, _td.operation.numCircuits); SetOperatingSettingNested(ride->id, RideSetSetting::NumCircuits, numCircuits, flags); - uint8_t defaultInspectionInterval = Config::Get().general.defaultInspectionInterval; - if (defaultInspectionInterval <= RIDE_INSPECTION_NEVER) - SetOperatingSettingNested(ride->id, RideSetSetting::InspectionInterval, defaultInspectionInterval, flags); - ride->lifecycleFlags |= RIDE_LIFECYCLE_NOT_CUSTOM_DESIGN; ride->vehicleColourSettings = _td.appearance.vehicleColourSettings; @@ -261,18 +265,15 @@ namespace OpenRCT2::GameActions ride->vehicleColours[i] = _td.appearance.vehicleColours[i]; } - for (int32_t count = 1; count == 1 || r.Error != Status::Ok; ++count) + for (int32_t count = 1; count == 1 || r.error != Status::ok; ++count) { auto name = count == 1 ? _td.gameStateData.name : (_td.gameStateData.name + " " + std::to_string(count)); auto gameAction = RideSetNameAction(ride->id, name); gameAction.SetFlags(GetFlags()); r = ExecuteNested(&gameAction, gameState); } - res.Cost = execRes.Cost; - // Use rideIndex (from RideCreateAction result) rather than ride->id - // because the ride pointer could become stale if nested actions cause - // the rides array to be reallocated - res.SetData(RideId{ rideIndex }); + res.cost = execRes.cost; + res.setData(RideId{ ride->id }); return res; } diff --git a/src/openrct2/actions/TrackDesignAction.h b/src/openrct2/actions/TrackDesignAction.h index 1b5acfa8886b..2b658d24865c 100644 --- a/src/openrct2/actions/TrackDesignAction.h +++ b/src/openrct2/actions/TrackDesignAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,10 +20,12 @@ namespace OpenRCT2::GameActions CoordsXYZD _loc; TrackDesign _td; bool _placeScenery{ false }; + RideInspection _inspectionInterval{ RideInspection::every30Minutes }; public: TrackDesignAction() = default; - TrackDesignAction(const CoordsXYZD& location, const TrackDesign& td, bool placeScenery); + TrackDesignAction( + const CoordsXYZD& location, const TrackDesign& td, bool placeScenery, RideInspection inspectionInterval); void AcceptParameters(GameActionParameterVisitor&) final; diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 4992211324fb..2bbaf3596e25 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -28,6 +28,7 @@ #include "../world/tile_element/Slope.h" #include "../world/tile_element/SurfaceElement.h" #include "../world/tile_element/TrackElement.h" +#include "ResultWithMessage.h" #include "RideSetSettingAction.h" namespace OpenRCT2::GameActions @@ -83,54 +84,54 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %d", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_RIDE_NOT_FOUND); } const auto* rideEntry = GetRideEntryByIndex(ride->subtype); if (rideEntry == nullptr) { LOG_ERROR("Invalid ride subtype for track placement, rideIndex = %d", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } if (!DirectionValid(_origin.direction)) { LOG_ERROR("Invalid direction for track placement, direction = %d", _origin.direction); return Result( - Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_VALUE_OUT_OF_RANGE); + Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_VALUE_OUT_OF_RANGE); } if (_rideType != ride->type && !gameState.cheats.allowArbitraryRideTypeChanges) { - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, kStringIdNone); } if (_rideType > RIDE_TYPE_COUNT) { LOG_ERROR("Invalid ride type for track placement, rideType = %d", _rideType); return Result( - Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_VALUE_OUT_OF_RANGE); + Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_VALUE_OUT_OF_RANGE); } if (_brakeSpeed > kMaximumTrackSpeed) { LOG_WARNING("Invalid speed for track placement, speed = %d", _brakeSpeed); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_SPEED_TOO_HIGH); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_SPEED_TOO_HIGH); } auto res = Result(); - res.Expenditure = ExpenditureType::rideConstruction; - res.Position.x = _origin.x + 16; - res.Position.y = _origin.y + 16; - res.Position.z = _origin.z; + res.expenditure = ExpenditureType::rideConstruction; + res.position.x = _origin.x + 16; + res.position.y = _origin.y + 16; + res.position.z = _origin.z; auto resultData = TrackPlaceActionResult{}; const auto& rtd = ride->getRideTypeDescriptor(); - if ((ride->lifecycleFlags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) && _trackType == TrackElemType::EndStation) + if ((ride->lifecycleFlags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) && _trackType == TrackElemType::endStation) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_NOT_ALLOWED_TO_MODIFY_STATION); + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_NOT_ALLOWED_TO_MODIFY_STATION); } if (!(GetActionFlags() & Flags::AllowWhilePaused)) @@ -138,28 +139,28 @@ namespace OpenRCT2::GameActions if (GameIsPaused() && !gameState.cheats.buildInPauseMode) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED); } } if (!rtd.HasFlag(RtdFlag::isFlatRide)) { - if (_trackType == TrackElemType::OnRidePhoto) + if (_trackType == TrackElemType::onRidePhoto) { if (ride->lifecycleFlags & RIDE_LIFECYCLE_ON_RIDE_PHOTO) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ONLY_ONE_ON_RIDE_PHOTO_PER_RIDE); } } - else if (_trackType == TrackElemType::CableLiftHill) + else if (_trackType == TrackElemType::cableLiftHill) { if (ride->lifecycleFlags & RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ONLY_ONE_CABLE_LIFT_HILL_PER_RIDE); } } @@ -168,10 +169,10 @@ namespace OpenRCT2::GameActions && !gameState.cheats.enableChainLiftOnAllTrack) { const auto& ted = GetTrackElementDescriptor(_trackType); - if (ted.flags & TRACK_ELEM_FLAG_IS_STEEP_UP) + if (ted.flags.has(TrackElementFlag::isSteepUp)) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_STEEP_FOR_LIFT_HILL); + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_STEEP_FOR_LIFT_HILL); } } } @@ -187,14 +188,11 @@ namespace OpenRCT2::GameActions if (!LocationValid(tileCoords)) { - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_OFF_EDGE_OF_MAP); } if (!MapIsLocationOwned(tileCoords) && !gameState.cheats.sandboxMode) { - LOG_INFO( - "TrackPlaceAction ownership fail at (%d,%d,%d) for ride %u", tileCoords.x, tileCoords.y, tileCoords.z, - _rideIndex.ToUnderlying()); - return Result(Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); } numElements++; } @@ -203,17 +201,17 @@ namespace OpenRCT2::GameActions { LOG_ERROR("Not enough free map elements to place track."); return Result( - Status::NoFreeElements, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + Status::noFreeElements, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } if (!gameState.cheats.allowTrackPlaceInvalidHeights) { - if (ted.flags & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT) + if (ted.flags.has(TrackElementFlag::startsAtHalfHeight)) { if ((_origin.z & 0x0F) != 8) { return Result( - Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_INVALID_HEIGHT); + Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_INVALID_HEIGHT); } } else @@ -221,7 +219,7 @@ namespace OpenRCT2::GameActions if ((_origin.z & 0x0F) != 0) { return Result( - Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_INVALID_HEIGHT); + Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_INVALID_HEIGHT); } } } @@ -240,7 +238,7 @@ namespace OpenRCT2::GameActions if (mapLoc.z < 16) { - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_LOW); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_LOW); } int32_t baseZ = floor2(mapLoc.z, kCoordsZStep); @@ -257,60 +255,60 @@ namespace OpenRCT2::GameActions clearanceZ = floor2(clearanceZ, kCoordsZStep) + baseZ; - if (clearanceZ > MAX_TRACK_HEIGHT) + if (clearanceZ > kMaximumTrackHeight) { - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_HIGH); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_HIGH); } - auto crossingMode = (rtd.HasFlag(RtdFlag::supportsLevelCrossings) && _trackType == TrackElemType::Flat) + auto crossingMode = (rtd.HasFlag(RtdFlag::supportsLevelCrossings) && _trackType == TrackElemType::flat) ? CreateCrossingMode::trackOverPath : CreateCrossingMode::none; auto canBuild = MapCanConstructWithClearAt( - { mapLoc, baseZ, clearanceZ }, &MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, + { mapLoc, baseZ, clearanceZ }, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); - if (canBuild.Error != Status::Ok) + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + canBuild.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; return canBuild; } - costs += canBuild.Cost; + costs += canBuild.cost; - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); uint8_t mapGroundFlags = clearanceData.GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); - if (!(ted.flags & TRACK_ELEM_FLAG_CAN_BE_PARTLY_UNDERGROUND)) + if (!ted.flags.has(TrackElementFlag::canBePartlyUnderground)) { if (resultData.GroundFlags != 0 && (resultData.GroundFlags & mapGroundFlags) == 0) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND); } } resultData.GroundFlags = mapGroundFlags; - if (ted.flags & TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND) + if (ted.flags.has(TrackElementFlag::onlyAboveGround)) { if (resultData.GroundFlags & ELEMENT_IS_UNDERGROUND) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); } } - if (ted.flags & TRACK_ELEM_FLAG_ONLY_UNDERWATER) + if (ted.flags.has(TrackElementFlag::onlyUnderwater)) { // No element has this flag if (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_UNDERWATER); + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_UNDERWATER); } } if (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER && !gameState.cheats.disableClearanceChecks) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_RIDE_CANT_BUILD_THIS_UNDERWATER); + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_RIDE_CANT_BUILD_THIS_UNDERWATER); } if (rtd.HasFlag(RtdFlag::trackMustBeOnWater) && !_trackDesignDrawingPreview) @@ -319,20 +317,20 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) { return Result( - Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + Status::unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } auto waterHeight = surfaceElement->GetWaterHeight(); if (waterHeight == 0) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_WATER); + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_WATER); } if (waterHeight != baseZ) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_WATER); + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_WATER); } waterHeight -= kLandHeightStep; if (waterHeight == surfaceElement->GetBaseZ()) @@ -342,20 +340,19 @@ namespace OpenRCT2::GameActions || slope == kTileSlopeNCornerDown) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ON_WATER); } } } - int32_t entranceDirections = ted.sequences[0].flags; - if ((entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN) && blockIndex == 0) + if (ted.sequences[0].flags.has(SequenceFlag::trackOrigin) && blockIndex == 0) { const auto addElementResult = TrackAddStationElement( - { mapLoc, baseZ, _origin.direction }, _rideIndex, 0, _fromTrackDesign); + { mapLoc, baseZ, _origin.direction }, _rideIndex, {}, _fromTrackDesign); if (!addElementResult.Successful) { - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, addElementResult.Message); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, addElementResult.Message); } } @@ -364,7 +361,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) { return Result( - Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + Status::unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } if (!gameState.cheats.disableSupportLimits) @@ -387,7 +384,7 @@ namespace OpenRCT2::GameActions if (ride_height > maxHeight && !_trackDesignDrawingPreview) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_HIGH_FOR_SUPPORTS); + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_HIGH_FOR_SUPPORTS); } } } @@ -405,8 +402,8 @@ namespace OpenRCT2::GameActions price *= ted.priceModifier; price >>= 16; - res.Cost = costs + supportCosts + price; - res.SetData(std::move(resultData)); + res.cost = costs + supportCosts + price; + res.setData(std::move(resultData)); return res; } @@ -417,21 +414,21 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Invalid ride for track placement, rideIndex = %d", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_RIDE_NOT_FOUND); } const auto* rideEntry = GetRideEntryByIndex(ride->subtype); if (rideEntry == nullptr) { LOG_ERROR("Invalid ride subtype for track placement, rideIndex = %d", _rideIndex.ToUnderlying()); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } auto res = Result(); - res.Expenditure = ExpenditureType::rideConstruction; - res.Position.x = _origin.x + 16; - res.Position.y = _origin.y + 16; - res.Position.z = _origin.z; + res.expenditure = ExpenditureType::rideConstruction; + res.position.x = _origin.x + 16; + res.position.y = _origin.y + 16; + res.position.z = _origin.z; auto resultData = TrackPlaceActionResult{}; @@ -467,21 +464,21 @@ namespace OpenRCT2::GameActions clearanceZ = floor2(clearanceZ, kCoordsZStep) + baseZ; const auto mapLocWithClearance = CoordsXYRangedZ(mapLoc, baseZ, clearanceZ); - auto crossingMode = (rtd.HasFlag(RtdFlag::supportsLevelCrossings) && _trackType == TrackElemType::Flat) + auto crossingMode = (rtd.HasFlag(RtdFlag::supportsLevelCrossings) && _trackType == TrackElemType::flat) ? CreateCrossingMode::trackOverPath : CreateCrossingMode::none; auto canBuild = MapCanConstructWithClearAt( - mapLocWithClearance, &MapPlaceNonSceneryClearFunc, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, + mapLocWithClearance, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags().with(CommandFlag::apply), kTileSlopeFlat, crossingMode); - if (canBuild.Error != Status::Ok) + if (canBuild.error != Status::ok) { - canBuild.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + canBuild.errorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; return canBuild; } - costs += canBuild.Cost; + costs += canBuild.cost; // When building a level crossing, remove any pre-existing path furniture. - if (crossingMode == CreateCrossingMode::trackOverPath && !(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (crossingMode == CreateCrossingMode::trackOverPath && !GetFlags().has(CommandFlag::ghost)) { auto footpathElement = MapGetFootpathElement(mapLoc); if (footpathElement != nullptr && footpathElement->HasAddition()) @@ -490,7 +487,7 @@ namespace OpenRCT2::GameActions } } - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && !gameState.cheats.disableClearanceChecks) + if (!GetFlags().has(CommandFlag::ghost) && !gameState.cheats.disableClearanceChecks) { FootpathRemoveLitter(mapLoc); if (rtd.HasFlag(RtdFlag::noWallsAroundTrack)) @@ -502,7 +499,7 @@ namespace OpenRCT2::GameActions // Remove walls in the directions this track intersects uint8_t intersectingDirections = ted.sequences[blockIndex].allowedWallEdges; intersectingDirections ^= 0x0F; - intersectingDirections = Numerics::rol4(intersectingDirections, _origin.direction); + intersectingDirections = rol4(intersectingDirections, _origin.direction); for (int32_t i = 0; i < kNumOrthogonalDirections; i++) { if (intersectingDirections & (1 << i)) @@ -513,14 +510,14 @@ namespace OpenRCT2::GameActions } } - const auto clearanceData = canBuild.GetData(); + const auto clearanceData = canBuild.getData(); uint8_t mapGroundFlags = clearanceData.GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); - if (!(ted.flags & TRACK_ELEM_FLAG_CAN_BE_PARTLY_UNDERGROUND)) + if (!ted.flags.has(TrackElementFlag::canBePartlyUnderground)) { if (resultData.GroundFlags != 0 && (resultData.GroundFlags & mapGroundFlags) == 0) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND); } } @@ -532,7 +529,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) { return Result( - Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + Status::unknown, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } int32_t supportHeight = baseZ - surfaceElement->GetBaseZ(); @@ -543,16 +540,16 @@ namespace OpenRCT2::GameActions supportCosts += (supportHeight / (2 * kCoordsZStep)) * rtd.BuildCosts.SupportPrice; - int32_t entranceDirections = 0; + bool isOrigin = false; if (!ride->overallView.IsNull()) { - if (!(GetFlags() & GAME_COMMAND_FLAG_NO_SPEND)) + if (!GetFlags().has(CommandFlag::noSpend)) { - entranceDirections = ted.sequences[0].flags; + isOrigin = ted.sequences[0].flags.has(SequenceFlag::trackOrigin); } } - if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN || ride->overallView.IsNull()) + if (isOrigin || ride->overallView.IsNull()) { ride->overallView = mapLoc; } @@ -562,7 +559,7 @@ namespace OpenRCT2::GameActions { LOG_ERROR("Cannot create track element for ride = %d", _rideIndex.ToUnderlying()); return Result( - Status::NoFreeElements, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + Status::noFreeElements, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } trackElement->SetClearanceZ(clearanceZ); @@ -572,18 +569,18 @@ namespace OpenRCT2::GameActions trackElement->SetRideIndex(_rideIndex); trackElement->SetTrackType(_trackType); trackElement->SetRideType(_rideType); - trackElement->SetGhost(GetFlags() & GAME_COMMAND_FLAG_GHOST); + trackElement->SetGhost(GetFlags().has(CommandFlag::ghost)); switch (_trackType) { - case TrackElemType::Waterfall: - case TrackElemType::Rapids: - case TrackElemType::Whirlpool: - case TrackElemType::SpinningTunnel: + case TrackElemType::waterfall: + case TrackElemType::rapids: + case TrackElemType::whirlpool: + case TrackElemType::spinningTunnel: MapAnimations::MarkTileForInvalidation(TileCoordsXY(mapLoc)); break; - case TrackElemType::Brakes: - case TrackElemType::DiagBrakes: + case TrackElemType::brakes: + case TrackElemType::diagBrakes: trackElement->SetBrakeClosed(true); break; default: @@ -610,18 +607,17 @@ namespace OpenRCT2::GameActions } trackElement->SetColourScheme(static_cast(_colour)); - entranceDirections = ted.sequences[0].flags; - if (entranceDirections & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) + if (ted.sequences[0].flags.has(SequenceFlag::connectsToPath)) { - uint32_t availableDirections = entranceDirections & 0x0F; - if (availableDirections != 0) + uint32_t connectionSides = ted.sequences[0].getEntranceConnectionSides(); + if (connectionSides != 0) { - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && !gameState.cheats.disableClearanceChecks) + if (!GetFlags().has(CommandFlag::ghost) && !gameState.cheats.disableClearanceChecks) { - for (int32_t chosenDirection = Numerics::bitScanForward(availableDirections); chosenDirection != -1; - chosenDirection = Numerics::bitScanForward(availableDirections)) + for (int32_t chosenDirection = bitScanForward(connectionSides); chosenDirection != -1; + chosenDirection = bitScanForward(connectionSides)) { - availableDirections &= ~(1 << chosenDirection); + connectionSides &= ~(1 << chosenDirection); CoordsXY tempLoc{ mapLoc.x, mapLoc.y }; int32_t tempDirection = (_origin.direction + chosenDirection) & 3; tempLoc.x += CoordsDirectionDelta[tempDirection].x; @@ -636,13 +632,12 @@ namespace OpenRCT2::GameActions // If the placed tile is a station modify station properties. // Don't do this if the tile is a ghost to prevent desyncs // However, ghost tiles from track designs need to modify station data to display properly - if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN - && (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) || _fromTrackDesign)) + if (ted.sequences[0].flags.has(SequenceFlag::trackOrigin) + && (!GetFlags().has(CommandFlag::ghost) || _fromTrackDesign)) { if (blockIndex == 0) { - TrackAddStationElement( - { mapLoc, _origin.direction }, _rideIndex, GAME_COMMAND_FLAG_APPLY, _fromTrackDesign); + TrackAddStationElement({ mapLoc, _origin.direction }, _rideIndex, { CommandFlag::apply }, _fromTrackDesign); } ride->validateStations(); ride->updateMaxVehicles(); @@ -660,7 +655,7 @@ namespace OpenRCT2::GameActions } } - if (!gameState.cheats.disableClearanceChecks || !(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!gameState.cheats.disableClearanceChecks || !GetFlags().has(CommandFlag::ghost)) { FootpathConnectEdges(mapLoc, tileElement, GetFlags()); } @@ -668,33 +663,33 @@ namespace OpenRCT2::GameActions } // Update ride stats and block brake count if the piece was successfully built - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { switch (_trackType) { - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: ride->lifecycleFlags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO; InvalidateTestResults(*ride); break; - case TrackElemType::CableLiftHill: + case TrackElemType::cableLiftHill: ride->lifecycleFlags |= RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED; ride->cableLiftLoc = originLocation; InvalidateTestResults(*ride); break; - case TrackElemType::DiagBlockBrakes: - case TrackElemType::BlockBrakes: + case TrackElemType::diagBlockBrakes: + case TrackElemType::blockBrakes: { ride->numBlockBrakes++; auto newMode = RideModeGetBlockSectionedCounterpart(ride->mode); if (ride->mode != newMode) { - bool canSwitch = rtd.SupportsRideMode(newMode) || getGameState().cheats.showAllOperatingModes; + bool canSwitch = rtd.SupportsRideMode(newMode) || gameState.cheats.showAllOperatingModes; if (canSwitch) { - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_OPERATING; - auto rideSetSetting = GameActions::RideSetSettingAction( - ride->id, GameActions::RideSetSetting::Mode, static_cast(newMode)); + ride->windowInvalidateFlags.set(RideInvalidateFlag::operatingSettings); + auto rideSetSetting = RideSetSettingAction( + ride->id, RideSetSetting::Mode, static_cast(newMode)); ExecuteNested(&rideSetSetting, gameState); } } @@ -707,14 +702,14 @@ namespace OpenRCT2::GameActions switch (_trackType) { - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::up25ToFlat: + case TrackElemType::up60ToFlat: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagUp60ToFlat: if (!_trackPlaceFlags.has(LiftHillAndInverted::liftHill)) break; [[fallthrough]]; - case TrackElemType::CableLiftHill: + case TrackElemType::cableLiftHill: ride->numBlockBrakes++; break; default: @@ -726,8 +721,8 @@ namespace OpenRCT2::GameActions price *= ted.priceModifier; price >>= 16; - res.Cost = costs + supportCosts + price; - res.SetData(std::move(resultData)); + res.cost = costs + supportCosts + price; + res.setData(std::move(resultData)); return res; } diff --git a/src/openrct2/actions/TrackPlaceAction.h b/src/openrct2/actions/TrackPlaceAction.h index b01472e05193..8604c4d09bae 100644 --- a/src/openrct2/actions/TrackPlaceAction.h +++ b/src/openrct2/actions/TrackPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -43,8 +43,8 @@ namespace OpenRCT2::GameActions uint16_t GetActionFlags() const final; void Serialise(DataSerialiser& stream) override; - GameActions::Result Query(GameState_t& gameState) const override; - GameActions::Result Execute(GameState_t& gameState) const override; + Result Query(GameState_t& gameState) const override; + Result Execute(GameState_t& gameState) const override; private: bool CheckMapCapacity(int16_t numTiles) const; diff --git a/src/openrct2/actions/TrackRemoveAction.cpp b/src/openrct2/actions/TrackRemoveAction.cpp index 19bd8ed2c4e9..5a0f9f43bd5c 100644 --- a/src/openrct2/actions/TrackRemoveAction.cpp +++ b/src/openrct2/actions/TrackRemoveAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,6 +20,7 @@ #include "../world/Map.h" #include "../world/tile_element/SurfaceElement.h" #include "../world/tile_element/TrackElement.h" +#include "ResultWithMessage.h" #include "RideSetSettingAction.h" namespace OpenRCT2::GameActions @@ -50,9 +51,9 @@ namespace OpenRCT2::GameActions { switch (trackType) { - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: - return TrackElemType::EndStation; + case TrackElemType::beginStation: + case TrackElemType::middleStation: + return TrackElemType::endStation; default: return trackType; } @@ -68,15 +69,15 @@ namespace OpenRCT2::GameActions Result TrackRemoveAction::Query(GameState_t& gameState) const { auto res = Result(); - res.Position.x = _origin.x + 16; - res.Position.y = _origin.y + 16; - res.Position.z = _origin.z; - res.Expenditure = ExpenditureType::rideConstruction; + res.position.x = _origin.x + 16; + res.position.y = _origin.y + 16; + res.position.z = _origin.z; + res.expenditure = ExpenditureType::rideConstruction; auto comparableTrackType = normaliseTrackType(_trackType); bool found = false; - bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; + bool isGhost = GetFlags().has(CommandFlag::ghost); TileElement* tileElement = MapGetFirstElementAt(_origin); do @@ -113,13 +114,13 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Track Element not found. x = %d, y = %d, z = %d, d = %d, seq = %d.", _origin.x, _origin.y, _origin.z, _origin.direction, _sequence); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_ELEMENT_NOT_FOUND); } if (tileElement->AsTrack()->IsIndestructible()) { return Result( - Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_YOU_ARE_NOT_ALLOWED_TO_REMOVE_THIS_SECTION); + Status::disallowed, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_YOU_ARE_NOT_ALLOWED_TO_REMOVE_THIS_SECTION); } RideId rideIndex = tileElement->AsTrack()->GetRideIndex(); @@ -129,20 +130,20 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found for rideIndex %d.", rideIndex); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_RIDE_NOT_FOUND); } if (ride->type >= RIDE_TYPE_COUNT) { LOG_ERROR("Ride type not found. ride type = %d.", ride->type); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_VALUE_OUT_OF_RANGE); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_VALUE_OUT_OF_RANGE); } const auto& ted = GetTrackElementDescriptor(trackType); auto sequenceIndex = tileElement->AsTrack()->GetSequenceIndex(); if (sequenceIndex >= ted.numSequences) { LOG_ERROR("Track block %d not found for track type %d.", sequenceIndex, trackType); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_BLOCK_NOT_FOUND); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_BLOCK_NOT_FOUND); } const auto& currentTrackBlock = ted.sequences[sequenceIndex].clearance; @@ -154,9 +155,9 @@ namespace OpenRCT2::GameActions startLoc.x -= rotatedTrack.x; startLoc.y -= rotatedTrack.y; startLoc.z -= rotatedTrack.z; - res.Position.x = startLoc.x; - res.Position.y = startLoc.y; - res.Position.z = startLoc.z; + res.position.x = startLoc.x; + res.position.y = startLoc.y; + res.position.z = startLoc.z; money64 supportCosts = 0; @@ -168,7 +169,7 @@ namespace OpenRCT2::GameActions if (!LocationValid(mapLoc)) { - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); } MapInvalidateTileFull(mapLoc); @@ -206,16 +207,15 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Track Element not found. x = %d, y = %d, z = %d, d = %d, seq = %d.", mapLoc.x, mapLoc.y, mapLoc.z, _origin.direction, i); - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_ELEMENT_NOT_FOUND); } - int32_t entranceDirections = ted.sequences[0].flags; - if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN && (tileElement->AsTrack()->GetSequenceIndex() == 0)) + if (ted.sequences[0].flags.has(SequenceFlag::trackOrigin) && (tileElement->AsTrack()->GetSequenceIndex() == 0)) { - const auto removeElementResult = TrackRemoveStationElement({ mapLoc, _origin.direction }, rideIndex, 0); + const auto removeElementResult = TrackRemoveStationElement({ mapLoc, _origin.direction }, rideIndex, {}); if (!removeElementResult.Successful) { - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, removeElementResult.Message); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, removeElementResult.Message); } } @@ -223,7 +223,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) { LOG_ERROR("Surface Element not found. x = %d, y = %d", mapLoc.x, mapLoc.y); - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } int16_t _support_height = tileElement->BaseHeight - surfaceElement->BaseHeight; @@ -245,22 +245,22 @@ namespace OpenRCT2::GameActions price = (price * 45875) / 65536; } - res.Cost = -price; + res.cost = -price; return res; } Result TrackRemoveAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Position.x = _origin.x + 16; - res.Position.y = _origin.y + 16; - res.Position.z = _origin.z; - res.Expenditure = ExpenditureType::rideConstruction; + res.position.x = _origin.x + 16; + res.position.y = _origin.y + 16; + res.position.z = _origin.z; + res.expenditure = ExpenditureType::rideConstruction; auto comparableTrackType = normaliseTrackType(_trackType); bool found = false; - bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; + bool isGhost = GetFlags().has(CommandFlag::ghost); TileElement* tileElement = MapGetFirstElementAt(_origin); do @@ -297,7 +297,7 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Track Element not found. x = %d, y = %d, z = %d, d = %d, seq = %d.", _origin.x, _origin.y, _origin.z, _origin.direction, _sequence); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_ELEMENT_NOT_FOUND); } RideId rideIndex = tileElement->AsTrack()->GetRideIndex(); @@ -308,14 +308,14 @@ namespace OpenRCT2::GameActions if (ride == nullptr) { LOG_ERROR("Ride not found. ride index = %d.", rideIndex); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_RIDE_NOT_FOUND); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_RIDE_NOT_FOUND); } const auto& ted = GetTrackElementDescriptor(trackType); auto sequenceIndex = tileElement->AsTrack()->GetSequenceIndex(); if (sequenceIndex >= ted.numSequences) { LOG_ERROR("Track block %d not found for track type %d.", sequenceIndex, trackType); - return Result(Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_BLOCK_NOT_FOUND); + return Result(Status::invalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_BLOCK_NOT_FOUND); } auto startLoc = _origin; @@ -327,9 +327,9 @@ namespace OpenRCT2::GameActions startLoc.x -= rotatedTrackLoc.x; startLoc.y -= rotatedTrackLoc.y; startLoc.z -= rotatedTrackLoc.z; - res.Position.x = startLoc.x; - res.Position.y = startLoc.y; - res.Position.z = startLoc.z; + res.position.x = startLoc.x; + res.position.y = startLoc.y; + res.position.z = startLoc.z; money64 supportCosts = 0; @@ -376,16 +376,15 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Track Element not found. x = %d, y = %d, z = %d, d = %d, seq = %d.", mapLoc.x, mapLoc.y, mapLoc.z, _origin.direction, i); - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_TRACK_ELEMENT_NOT_FOUND); } - int32_t entranceDirections = ted.sequences[0].flags; - if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN && (tileElement->AsTrack()->GetSequenceIndex() == 0)) + if (ted.sequences[0].flags.has(SequenceFlag::trackOrigin) && (tileElement->AsTrack()->GetSequenceIndex() == 0)) { - const auto removeElementResult = TrackRemoveStationElement({ mapLoc, _origin.direction }, rideIndex, 0); + const auto removeElementResult = TrackRemoveStationElement({ mapLoc, _origin.direction }, rideIndex, {}); if (!removeElementResult.Successful) { - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, removeElementResult.Message); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, removeElementResult.Message); } } @@ -393,7 +392,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) { LOG_ERROR("Surface Element not found. x = %d, y = %d", mapLoc.x, mapLoc.y); - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } int16_t _support_height = tileElement->BaseHeight - surfaceElement->BaseHeight; @@ -406,15 +405,15 @@ namespace OpenRCT2::GameActions // If the removed tile is a station modify station properties. // Don't do this if the ride is simulating and the tile is a ghost to prevent desyncs. - if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN - && (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) || (GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN)) + if (ted.sequences[0].flags.has(SequenceFlag::trackOrigin) + && (!GetFlags().has(CommandFlag::ghost) || (GetFlags().has(CommandFlag::trackDesign))) && (tileElement->AsTrack()->GetSequenceIndex() == 0)) { const auto removeElementResult = TrackRemoveStationElement( - { mapLoc, _origin.direction }, rideIndex, GAME_COMMAND_FLAG_APPLY); + { mapLoc, _origin.direction }, rideIndex, { CommandFlag::apply }); if (!removeElementResult.Successful) { - return Result(Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, removeElementResult.Message); + return Result(Status::unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS, removeElementResult.Message); } } @@ -425,30 +424,30 @@ namespace OpenRCT2::GameActions InvalidateTestResults(*ride); FootpathQueueChainReset(); - if (!getGameState().cheats.disableClearanceChecks || !(tileElement->IsGhost())) + if (!gameState.cheats.disableClearanceChecks || !(tileElement->IsGhost())) { FootpathRemoveEdgesAt(mapLoc, tileElement); } TileElementRemove(tileElement); ride->validateStations(); - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { ride->updateMaxVehicles(); } } - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!GetFlags().has(CommandFlag::ghost)) { switch (trackType) { - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: ride->lifecycleFlags &= ~RIDE_LIFECYCLE_ON_RIDE_PHOTO; break; - case TrackElemType::CableLiftHill: + case TrackElemType::cableLiftHill: ride->lifecycleFlags &= ~RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED; break; - case TrackElemType::BlockBrakes: - case TrackElemType::DiagBlockBrakes: + case TrackElemType::blockBrakes: + case TrackElemType::diagBlockBrakes: ride->numBlockBrakes--; if (ride->numBlockBrakes == 0 && ride->isBlockSectioned()) { @@ -462,12 +461,12 @@ namespace OpenRCT2::GameActions if (ride->mode != newMode) { bool canSwitch = ride->getRideTypeDescriptor().SupportsRideMode(newMode) - || getGameState().cheats.showAllOperatingModes; + || gameState.cheats.showAllOperatingModes; if (canSwitch) { - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_OPERATING; - auto rideSetSetting = GameActions::RideSetSettingAction( - ride->id, GameActions::RideSetSetting::Mode, static_cast(newMode)); + ride->windowInvalidateFlags.set(RideInvalidateFlag::operatingSettings); + auto rideSetSetting = RideSetSettingAction( + ride->id, RideSetSetting::Mode, static_cast(newMode)); ExecuteNested(&rideSetSetting, gameState); } } @@ -480,14 +479,14 @@ namespace OpenRCT2::GameActions switch (trackType) { - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::up25ToFlat: + case TrackElemType::up60ToFlat: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagUp60ToFlat: if (!isLiftHill) break; [[fallthrough]]; - case TrackElemType::CableLiftHill: + case TrackElemType::cableLiftHill: ride->numBlockBrakes--; break; default: @@ -505,7 +504,7 @@ namespace OpenRCT2::GameActions price = (price * 45875) / 65536; } - res.Cost = -price; + res.cost = -price; return res; } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/TrackRemoveAction.h b/src/openrct2/actions/TrackRemoveAction.h index cdcf3ce97d06..ffad32da2f11 100644 --- a/src/openrct2/actions/TrackRemoveAction.h +++ b/src/openrct2/actions/TrackRemoveAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp b/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp index f50530a88169..b971dd1011ce 100644 --- a/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp +++ b/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,8 +17,7 @@ namespace OpenRCT2::GameActions { - TrackSetBrakeSpeedAction::TrackSetBrakeSpeedAction( - const CoordsXYZ& loc, OpenRCT2::TrackElemType trackType, uint8_t brakeSpeed) + TrackSetBrakeSpeedAction::TrackSetBrakeSpeedAction(const CoordsXYZ& loc, TrackElemType trackType, uint8_t brakeSpeed) : _loc(loc) , _trackType(trackType) , _brakeSpeed(brakeSpeed) @@ -57,27 +56,27 @@ namespace OpenRCT2::GameActions { auto res = Result(); - res.Position = _loc; - res.Position.x += 16; - res.Position.y += 16; - res.Expenditure = ExpenditureType::rideConstruction; + res.position = _loc; + res.position.x += 16; + res.position.y += 16; + res.expenditure = ExpenditureType::rideConstruction; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_CHANGE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_CHANGE_THIS, STR_OFF_EDGE_OF_MAP); } TileElement* tileElement = MapGetTrackElementAtOfType(_loc, _trackType); if (tileElement == nullptr) { LOG_ERROR("Track element of type %u not found at x = %d, y = %d, z = %d", _trackType, _loc.x, _loc.y, _loc.z); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); } if (_brakeSpeed > kMaximumTrackSpeed) { LOG_WARNING("Invalid speed for track, speed = %d", _brakeSpeed); - return Result(Status::InvalidParameters, STR_SPEED_TOO_HIGH, kStringIdNone); + return Result(Status::invalidParameters, STR_SPEED_TOO_HIGH, kStringIdNone); } if (isExecuting) diff --git a/src/openrct2/actions/TrackSetBrakeSpeedAction.h b/src/openrct2/actions/TrackSetBrakeSpeedAction.h index 05740afe0f1d..65447a992a8e 100644 --- a/src/openrct2/actions/TrackSetBrakeSpeedAction.h +++ b/src/openrct2/actions/TrackSetBrakeSpeedAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -22,7 +22,7 @@ namespace OpenRCT2::GameActions public: TrackSetBrakeSpeedAction() = default; - TrackSetBrakeSpeedAction(const CoordsXYZ& loc, OpenRCT2::TrackElemType trackType, uint8_t brakeSpeed); + TrackSetBrakeSpeedAction(const CoordsXYZ& loc, TrackElemType trackType, uint8_t brakeSpeed); void AcceptParameters(GameActionParameterVisitor&) final; diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index 68ebf70c4736..781012522fe4 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -74,48 +74,48 @@ namespace OpenRCT2::GameActions Result WallPlaceAction::Query(GameState_t& gameState) const { auto res = Result(); - res.ErrorTitle = STR_CANT_BUILD_THIS_HERE; - res.Position = _loc; + res.errorTitle = STR_CANT_BUILD_THIS_HERE; + res.position = _loc; - res.Expenditure = ExpenditureType::landscaping; - res.Position.x += 16; - res.Position.y += 16; + res.expenditure = ExpenditureType::landscaping; + res.position.x += 16; + res.position.y += 16; if (_loc.z == 0) { - res.Position.z = TileElementHeight(res.Position); + res.position.z = TileElementHeight(res.position); } if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_OFF_EDGE_OF_MAP); } auto mapSizeMax = GetMapSizeMaxXY(); - if (gLegacyScene != LegacyScene::scenarioEditor && !(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN) + if (gLegacyScene != LegacyScene::scenarioEditor && !GetFlags().has(CommandFlag::trackDesign) && !gameState.cheats.sandboxMode) { if (_loc.z == 0) { if (!MapIsLocationInPark(_loc)) { - return Result(Status::NotOwned, STR_CANT_BUILD_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_BUILD_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); } } else if (!MapIsLocationOwned(_loc)) { - return Result(Status::NotOwned, STR_CANT_BUILD_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_BUILD_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); } } else if (!_trackDesignDrawingPreview && (_loc.x > mapSizeMax.x || _loc.y > mapSizeMax.y)) { LOG_ERROR("Invalid x/y coordinates. x = %d y = %d", _loc.x, _loc.y); - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_OFF_EDGE_OF_MAP); } if (_edge > 3) { - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, kStringIdNone); } uint8_t edgeSlope = 0; @@ -126,7 +126,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) { LOG_ERROR("Surface element not found at %d, %d.", _loc.x, _loc.y); - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } targetHeight = surfaceElement->GetBaseZ(); @@ -143,7 +143,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) { LOG_ERROR("Surface element not found at %d, %d.", _loc.x, _loc.y); - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } if (surfaceElement->GetWaterHeight() > 0) @@ -152,13 +152,13 @@ namespace OpenRCT2::GameActions if (targetHeight < waterHeight && !gameState.cheats.disableClearanceChecks) { - return Result(Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); + return Result(Status::disallowed, STR_CANT_BUILD_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); } } if (targetHeight < surfaceElement->GetBaseZ() && !gameState.cheats.disableClearanceChecks) { - return Result(Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); + return Result(Status::disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); } if (!(edgeSlope & (EDGE_SLOPE_UPWARDS | EDGE_SLOPE_DOWNWARDS))) @@ -170,7 +170,7 @@ namespace OpenRCT2::GameActions { if (targetHeight / 8 < newBaseHeight && !gameState.cheats.disableClearanceChecks) { - return Result(Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); + return Result(Status::disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); } if (surfaceElement->GetSlope() & kTileSlopeDiagonalFlag) @@ -186,7 +186,7 @@ namespace OpenRCT2::GameActions if (targetHeight / 8 < newBaseHeight && !gameState.cheats.disableClearanceChecks) { return Result( - Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); + Status::disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); } newBaseHeight -= 2; } @@ -199,7 +199,7 @@ namespace OpenRCT2::GameActions { if (targetHeight / 8 < newBaseHeight && !gameState.cheats.disableClearanceChecks) { - return Result(Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); + return Result(Status::disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); } if (surfaceElement->GetSlope() & kTileSlopeDiagonalFlag) @@ -215,7 +215,7 @@ namespace OpenRCT2::GameActions if (targetHeight / 8 < newBaseHeight && !gameState.cheats.disableClearanceChecks) { return Result( - Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); + Status::disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); } } } @@ -228,7 +228,7 @@ namespace OpenRCT2::GameActions if (wallEntry == nullptr) { LOG_ERROR("Wall Type not found %d", _wallType); - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } if (wallEntry->scrolling_mode != kScrollingModeNone) @@ -236,7 +236,7 @@ namespace OpenRCT2::GameActions if (HasReachedBannerLimit()) { LOG_ERROR("No free banners available"); - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); } } @@ -245,17 +245,17 @@ namespace OpenRCT2::GameActions { if (wallEntry->flags & WALL_SCENERY_CANT_BUILD_ON_SLOPE) { - return Result(Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_ERR_UNABLE_TO_BUILD_THIS_ON_SLOPE); + return Result(Status::disallowed, STR_CANT_BUILD_THIS_HERE, STR_ERR_UNABLE_TO_BUILD_THIS_ON_SLOPE); } clearanceHeight += 2; } clearanceHeight += wallEntry->height; bool wallAcrossTrack = false; - if (!(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN) && !gameState.cheats.disableClearanceChecks) + if (!GetFlags().has(CommandFlag::trackDesign) && !gameState.cheats.disableClearanceChecks) { auto result = WallCheckObstruction(wallEntry, targetHeight / 8, clearanceHeight, &wallAcrossTrack); - if (result.Error != Status::Ok) + if (result.error != Status::ok) { return result; } @@ -263,12 +263,12 @@ namespace OpenRCT2::GameActions if (!MapCheckCapacityAndReorganise(_loc)) { - return Result(Status::NoFreeElements, STR_CANT_BUILD_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + return Result(Status::noFreeElements, STR_CANT_BUILD_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } - res.Cost = wallEntry->price; + res.cost = wallEntry->price; - res.SetData(WallPlaceActionResult{}); + res.setData(WallPlaceActionResult{ targetHeight }); return res; } @@ -276,16 +276,16 @@ namespace OpenRCT2::GameActions Result WallPlaceAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.ErrorTitle = STR_CANT_BUILD_THIS_HERE; - res.Position = _loc; + res.errorTitle = STR_CANT_BUILD_THIS_HERE; + res.position = _loc; - res.Expenditure = ExpenditureType::landscaping; - res.Position.x += 16; - res.Position.y += 16; + res.expenditure = ExpenditureType::landscaping; + res.position.x += 16; + res.position.y += 16; - if (res.Position.z == 0) + if (res.position.z == 0) { - res.Position.z = TileElementHeight(res.Position); + res.position.z = TileElementHeight(res.position); } uint8_t edgeSlope = 0; @@ -296,7 +296,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) { LOG_ERROR("Surface element not found at %d, %d.", _loc.x, _loc.y); - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } targetHeight = surfaceElement->GetBaseZ(); @@ -315,7 +315,7 @@ namespace OpenRCT2::GameActions if (wallEntry == nullptr) { LOG_ERROR("Wall Type not found %d", _wallType); - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_UNKNOWN_OBJECT_TYPE); } uint8_t clearanceHeight = targetHeight / kCoordsZStep; @@ -326,10 +326,10 @@ namespace OpenRCT2::GameActions clearanceHeight += wallEntry->height; bool wallAcrossTrack = false; - if (!(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN) && !gameState.cheats.disableClearanceChecks) + if (!GetFlags().has(CommandFlag::trackDesign) && !gameState.cheats.disableClearanceChecks) { auto result = WallCheckObstruction(wallEntry, targetHeight / kCoordsZStep, clearanceHeight, &wallAcrossTrack); - if (result.Error != Status::Ok) + if (result.error != Status::ok) { return result; } @@ -342,12 +342,12 @@ namespace OpenRCT2::GameActions if (banner == nullptr) { LOG_ERROR("No free banners available"); - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); } banner->text = {}; banner->colour = COLOUR_WHITE; - banner->textColour = TextColour::white; + banner->textColour = Drawing::TextColour::white; banner->flags = { BannerFlag::isWall }; banner->type = 0; // Banner must be deleted after this point in an early return banner->position = TileCoordsXY(_loc); @@ -363,7 +363,7 @@ namespace OpenRCT2::GameActions auto* wallElement = TileElementInsert(targetLoc, 0b0000); if (wallElement == nullptr) { - return Result(Status::NoFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); + return Result(Status::noFreeElements, STR_CANT_POSITION_THIS_HERE, STR_TILE_ELEMENT_LIMIT_REACHED); } wallElement->ClearanceHeight = clearanceHeight; @@ -382,15 +382,15 @@ namespace OpenRCT2::GameActions wallElement->SetTertiaryColour(_tertiaryColour); } - wallElement->SetGhost(GetFlags() & GAME_COMMAND_FLAG_GHOST); + wallElement->SetGhost(GetFlags().has(CommandFlag::ghost)); MapAnimations::MarkTileForInvalidation(TileCoordsXY(targetLoc)); MapInvalidateTileZoom1({ _loc, wallElement->GetBaseZ(), wallElement->GetBaseZ() + 72 }); - res.Cost = wallEntry->price; + res.cost = wallEntry->price; const auto bannerId = banner != nullptr ? banner->id : BannerIndex::GetNull(); - res.SetData(WallPlaceActionResult{ wallElement->GetBaseZ(), bannerId }); + res.setData(WallPlaceActionResult{ wallElement->GetBaseZ(), bannerId }); return res; } @@ -402,7 +402,7 @@ namespace OpenRCT2::GameActions bool WallPlaceAction::WallCheckObstructionWithTrack( const WallSceneryEntry* wall, int32_t z0, TrackElement* trackElement, bool* wallAcrossTrack) const { - OpenRCT2::TrackElemType trackType = trackElement->GetTrackType(); + TrackElemType trackType = trackElement->GetTrackType(); using namespace OpenRCT2::TrackMetaData; const auto& ted = GetTrackElementDescriptor(trackType); @@ -438,12 +438,12 @@ namespace OpenRCT2::GameActions int32_t z; if (sequence == 0) { - if (ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_DISALLOW_DOORS) + if (ted.sequences[0].flags.has(SequenceFlag::disallowDoors)) { return false; } - if (ted.definition.rollStart == TrackRoll::None) + if (ted.definition.rollStart == TrackRoll::none) { if (!(ted.coordinates.rotationBegin & 4)) { @@ -467,7 +467,7 @@ namespace OpenRCT2::GameActions return false; } - if (ted.definition.rollEnd != TrackRoll::None) + if (ted.definition.rollEnd != TrackRoll::none) { return false; } @@ -499,7 +499,7 @@ namespace OpenRCT2::GameActions *wallAcrossTrack = false; if (MapIsEdge(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_BUILD_THIS_HERE, STR_OFF_EDGE_OF_MAP); } TileElement* tileElement = MapGetFirstElementAt(_loc); @@ -521,7 +521,7 @@ namespace OpenRCT2::GameActions int32_t direction = tileElement->GetDirection(); if (_edge == direction) { - auto res = Result(Status::NoClearance, STR_CANT_BUILD_THIS_HERE, kStringIdNone); + auto res = Result(Status::noClearance, STR_CANT_BUILD_THIS_HERE, kStringIdNone); MapGetObstructionErrorText(tileElement, res); return res; } @@ -529,7 +529,7 @@ namespace OpenRCT2::GameActions } if (tileElement->GetOccupiedQuadrants() == 0) continue; - auto res = Result(Status::NoClearance, STR_CANT_BUILD_THIS_HERE, kStringIdNone); + auto res = Result(Status::noClearance, STR_CANT_BUILD_THIS_HERE, kStringIdNone); switch (elementType) { case TileElementType::Entrance: @@ -588,7 +588,7 @@ namespace OpenRCT2::GameActions } bool WallPlaceAction::TrackIsAllowedWallEdges( - ride_type_t rideType, OpenRCT2::TrackElemType trackType, uint8_t trackSequence, uint8_t direction) + ride_type_t rideType, TrackElemType trackType, uint8_t trackSequence, uint8_t direction) { if (!GetRideTypeDescriptor(rideType).HasFlag(RtdFlag::noWallsAroundTrack)) { diff --git a/src/openrct2/actions/WallPlaceAction.h b/src/openrct2/actions/WallPlaceAction.h index 94f9f031d07a..a33eaef21d18 100644 --- a/src/openrct2/actions/WallPlaceAction.h +++ b/src/openrct2/actions/WallPlaceAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -70,6 +70,6 @@ namespace OpenRCT2::GameActions * Some thin tracks for example are allowed to have walls either side of the track, but wider tracks can not. */ static bool TrackIsAllowedWallEdges( - ride_type_t rideType, OpenRCT2::TrackElemType trackType, uint8_t trackSequence, uint8_t direction); + ride_type_t rideType, TrackElemType trackType, uint8_t trackSequence, uint8_t direction); }; } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/WallRemoveAction.cpp b/src/openrct2/actions/WallRemoveAction.cpp index 77686514eea9..3003f0b58038 100644 --- a/src/openrct2/actions/WallRemoveAction.cpp +++ b/src/openrct2/actions/WallRemoveAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -42,48 +42,48 @@ namespace OpenRCT2::GameActions Result WallRemoveAction::Query(GameState_t& gameState) const { Result res = Result(); - res.Cost = 0; - res.Expenditure = ExpenditureType::landscaping; + res.cost = 0; + res.expenditure = ExpenditureType::landscaping; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); } - const bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; - if (!isGhost && gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode + const bool isGhost = GetFlags().has(CommandFlag::ghost); + if (!isGhost && gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode && !MapIsLocationOwned(_loc)) { - return Result(Status::NotOwned, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); } TileElement* wallElement = GetFirstWallElementAt(_loc, isGhost); if (wallElement == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); } - res.Cost = 0; + res.cost = 0; return res; } Result WallRemoveAction::Execute(GameState_t& gameState) const { Result res = Result(); - res.Cost = 0; - res.Expenditure = ExpenditureType::landscaping; + res.cost = 0; + res.expenditure = ExpenditureType::landscaping; - const bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; + const bool isGhost = GetFlags().has(CommandFlag::ghost); TileElement* wallElement = GetFirstWallElementAt(_loc, isGhost); if (wallElement == nullptr) { - return Result(Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); + return Result(Status::invalidParameters, STR_CANT_REMOVE_THIS, STR_INVALID_SELECTION_OF_OBJECTS); } - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; wallElement->RemoveBannerEntry(); MapInvalidateTileZoom1({ _loc, wallElement->GetBaseZ(), (wallElement->GetBaseZ()) + 72 }); diff --git a/src/openrct2/actions/WallRemoveAction.h b/src/openrct2/actions/WallRemoveAction.h index 51fa65c13b69..1a233da0644c 100644 --- a/src/openrct2/actions/WallRemoveAction.h +++ b/src/openrct2/actions/WallRemoveAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/WallSetColourAction.cpp b/src/openrct2/actions/WallSetColourAction.cpp index 216177082d55..2372be514774 100644 --- a/src/openrct2/actions/WallSetColourAction.cpp +++ b/src/openrct2/actions/WallSetColourAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -55,21 +55,21 @@ namespace OpenRCT2::GameActions Result WallSetColourAction::Query(GameState_t& gameState) const { auto res = Result(); - res.ErrorTitle = STR_CANT_REPAINT_THIS; - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; + res.errorTitle = STR_CANT_REPAINT_THIS; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; - res.Expenditure = ExpenditureType::landscaping; + res.expenditure = ExpenditureType::landscaping; if (!LocationValid(_loc)) { - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); } - if (gLegacyScene != LegacyScene::scenarioEditor && !MapIsLocationInPark(_loc) && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !MapIsLocationInPark(_loc) && !gameState.cheats.sandboxMode) { - return Result(Status::NotOwned, STR_CANT_REPAINT_THIS, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, STR_CANT_REPAINT_THIS, STR_LAND_NOT_OWNED_BY_PARK); } auto wallElement = MapGetWallElementAt(_loc); @@ -78,10 +78,10 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Could not find wall element at: x = %d, y = %d, z = %d, direction = %u", _loc.x, _loc.y, _loc.z, _loc.direction); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_WALL_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_WALL_ELEMENT_NOT_FOUND); } - if ((GetFlags() & GAME_COMMAND_FLAG_GHOST) && !(wallElement->IsGhost())) + if ((GetFlags().has(CommandFlag::ghost)) && !(wallElement->IsGhost())) { return res; } @@ -92,25 +92,25 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Wall element does not have wall entry at x = %d, y = %d, z = %d, direction = %u", _loc.x, _loc.y, _loc.z, _loc.direction); - return Result(Status::Unknown, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::unknown, STR_CANT_REPAINT_THIS, kStringIdNone); } if (_primaryColour >= COLOUR_COUNT) { LOG_ERROR("Primary colour invalid: colour = %d", _primaryColour); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); } else if (_secondaryColour >= COLOUR_COUNT) { LOG_ERROR("Secondary colour invalid: colour = %d", _secondaryColour); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, STR_ERR_INVALID_COLOUR); } else if (wallEntry->flags & WALL_SCENERY_HAS_TERTIARY_COLOUR) { if (_tertiaryColour >= COLOUR_COUNT) { LOG_ERROR("Tertiary colour invalid: colour = %d", _tertiaryColour); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } } return res; @@ -119,11 +119,11 @@ namespace OpenRCT2::GameActions Result WallSetColourAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.ErrorTitle = STR_CANT_REPAINT_THIS; - res.Position.x = _loc.x + 16; - res.Position.y = _loc.y + 16; - res.Position.z = _loc.z; - res.Expenditure = ExpenditureType::landscaping; + res.errorTitle = STR_CANT_REPAINT_THIS; + res.position.x = _loc.x + 16; + res.position.y = _loc.y + 16; + res.position.z = _loc.z; + res.expenditure = ExpenditureType::landscaping; auto wallElement = MapGetWallElementAt(_loc); if (wallElement == nullptr) @@ -131,10 +131,10 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Could not find wall element at: x = %d, y = %d, z = %d, direction = %u", _loc.x, _loc.y, _loc.z, _loc.direction); - return Result(Status::InvalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::invalidParameters, STR_CANT_REPAINT_THIS, kStringIdNone); } - if ((GetFlags() & GAME_COMMAND_FLAG_GHOST) && !(wallElement->IsGhost())) + if ((GetFlags().has(CommandFlag::ghost)) && !(wallElement->IsGhost())) { return res; } @@ -145,7 +145,7 @@ namespace OpenRCT2::GameActions LOG_ERROR( "Wall element does not have wall entry at x = %d, y = %d, z = %d, direction = %u", _loc.x, _loc.y, _loc.z, _loc.direction); - return Result(Status::Unknown, STR_CANT_REPAINT_THIS, kStringIdNone); + return Result(Status::unknown, STR_CANT_REPAINT_THIS, kStringIdNone); } wallElement->SetPrimaryColour(_primaryColour); diff --git a/src/openrct2/actions/WallSetColourAction.h b/src/openrct2/actions/WallSetColourAction.h index 8aceb414bea0..d4823f4f685e 100644 --- a/src/openrct2/actions/WallSetColourAction.h +++ b/src/openrct2/actions/WallSetColourAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/WaterLowerAction.cpp b/src/openrct2/actions/WaterLowerAction.cpp index bbf3a65437d2..b8beec0a1277 100644 --- a/src/openrct2/actions/WaterLowerAction.cpp +++ b/src/openrct2/actions/WaterLowerAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -56,16 +56,16 @@ namespace OpenRCT2::GameActions auto res = Result(); auto validRange = ClampRangeWithinMap(_range); - res.Position.x = ((validRange.GetX1() + validRange.GetX2()) / 2) + 16; - res.Position.y = ((validRange.GetY1() + validRange.GetY2()) / 2) + 16; - int16_t z = TileElementHeight(res.Position); - int16_t waterHeight = TileElementWaterHeight(res.Position); + res.position.x = ((validRange.GetX1() + validRange.GetX2()) / 2) + 16; + res.position.y = ((validRange.GetY1() + validRange.GetY2()) / 2) + 16; + int16_t z = TileElementHeight(res.position); + int16_t waterHeight = TileElementWaterHeight(res.position); if (waterHeight != 0) { z = waterHeight; } - res.Position.z = z; - res.Expenditure = ExpenditureType::landscaping; + res.position.z = z; + res.expenditure = ExpenditureType::landscaping; uint8_t minHeight = GetLowestHeight(gameState, validRange); bool hasChanged = false; @@ -81,7 +81,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) continue; - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { @@ -102,14 +102,14 @@ namespace OpenRCT2::GameActions waterSetHeightAction.SetFlags(GetFlags()); auto result = isExecuting ? ExecuteNested(&waterSetHeightAction, gameState) : QueryNested(&waterSetHeightAction, gameState); - if (result.Error == Status::Ok) + if (result.error == Status::ok) { - res.Cost += result.Cost; + res.cost += result.cost; hasChanged = true; } else { - result.ErrorTitle = STR_CANT_LOWER_WATER_LEVEL_HERE; + result.errorTitle = STR_CANT_LOWER_WATER_LEVEL_HERE; return result; } } @@ -117,13 +117,13 @@ namespace OpenRCT2::GameActions if (!withinOwnership) { - return Result(Status::Disallowed, STR_CANT_LOWER_WATER_LEVEL_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_CANT_LOWER_WATER_LEVEL_HERE, STR_LAND_NOT_OWNED_BY_PARK); ; } if (isExecuting && hasChanged) { - Audio::Play3D(Audio::SoundId::layingOutWater, res.Position); + Audio::Play3D(Audio::SoundId::layingOutWater, res.position); } // Force ride construction to recheck area _currentTrackSelectionFlags.set(TrackSelectionFlag::recheck); @@ -139,7 +139,7 @@ namespace OpenRCT2::GameActions { for (int32_t x = validRange.GetX1(); x <= validRange.GetX2(); x += kCoordsXYStep) { - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { diff --git a/src/openrct2/actions/WaterLowerAction.h b/src/openrct2/actions/WaterLowerAction.h index 2dcafd1529b2..ca9642f0bfc9 100644 --- a/src/openrct2/actions/WaterLowerAction.h +++ b/src/openrct2/actions/WaterLowerAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/WaterRaiseAction.cpp b/src/openrct2/actions/WaterRaiseAction.cpp index 2d05aa5a7a9a..e118e02b94b3 100644 --- a/src/openrct2/actions/WaterRaiseAction.cpp +++ b/src/openrct2/actions/WaterRaiseAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -56,16 +56,16 @@ namespace OpenRCT2::GameActions auto res = Result(); auto validRange = ClampRangeWithinMap(_range); - res.Position.x = ((validRange.GetX1() + validRange.GetX2()) / 2) + 16; - res.Position.y = ((validRange.GetY1() + validRange.GetY2()) / 2) + 16; - int32_t z = TileElementHeight(res.Position); - int16_t waterHeight = TileElementWaterHeight(res.Position); + res.position.x = ((validRange.GetX1() + validRange.GetX2()) / 2) + 16; + res.position.y = ((validRange.GetY1() + validRange.GetY2()) / 2) + 16; + int32_t z = TileElementHeight(res.position); + int16_t waterHeight = TileElementWaterHeight(res.position); if (waterHeight != 0) { z = waterHeight; } - res.Position.z = z; - res.Expenditure = ExpenditureType::landscaping; + res.position.z = z; + res.expenditure = ExpenditureType::landscaping; auto maxHeight = GetHighestHeight(gameState, validRange) / kCoordsZStep; bool hasChanged = false; @@ -81,7 +81,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) continue; - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { @@ -116,14 +116,14 @@ namespace OpenRCT2::GameActions waterSetHeightAction.SetFlags(GetFlags()); auto result = isExecuting ? ExecuteNested(&waterSetHeightAction, gameState) : QueryNested(&waterSetHeightAction, gameState); - if (result.Error == Status::Ok) + if (result.error == Status::ok) { - res.Cost += result.Cost; + res.cost += result.cost; hasChanged = true; } else { - result.ErrorTitle = STR_CANT_RAISE_WATER_LEVEL_HERE; + result.errorTitle = STR_CANT_RAISE_WATER_LEVEL_HERE; return result; } } @@ -131,12 +131,12 @@ namespace OpenRCT2::GameActions if (!withinOwnership) { - return Result(Status::Disallowed, STR_CANT_RAISE_WATER_LEVEL_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, STR_CANT_RAISE_WATER_LEVEL_HERE, STR_LAND_NOT_OWNED_BY_PARK); } if (isExecuting && hasChanged) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::layingOutWater, res.Position); + Audio::Play3D(Audio::SoundId::layingOutWater, res.position); } // Force ride construction to recheck area _currentTrackSelectionFlags.set(TrackSelectionFlag::recheck); @@ -152,7 +152,7 @@ namespace OpenRCT2::GameActions { for (int32_t x = validRange.GetX1(); x <= validRange.GetX2(); x += kCoordsXYStep) { - if (gLegacyScene != LegacyScene::scenarioEditor && !getGameState().cheats.sandboxMode) + if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { diff --git a/src/openrct2/actions/WaterRaiseAction.h b/src/openrct2/actions/WaterRaiseAction.h index 3e2313e9f293..adc69bfaa301 100644 --- a/src/openrct2/actions/WaterRaiseAction.h +++ b/src/openrct2/actions/WaterRaiseAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/actions/WaterSetHeightAction.cpp b/src/openrct2/actions/WaterSetHeightAction.cpp index f894b97db8c9..ffd0208ce616 100644 --- a/src/openrct2/actions/WaterSetHeightAction.cpp +++ b/src/openrct2/actions/WaterSetHeightAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -49,31 +49,31 @@ namespace OpenRCT2::GameActions Result WaterSetHeightAction::Query(GameState_t& gameState) const { auto res = Result(); - res.Expenditure = ExpenditureType::landscaping; - res.Position = { _coords, _height * kCoordsZStep }; + res.expenditure = ExpenditureType::landscaping; + res.position = { _coords, _height * kCoordsZStep }; if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode && gameState.park.flags & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES) { - return Result(Status::Disallowed, kStringIdNone, STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY); + return Result(Status::disallowed, kStringIdNone, STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY); } StringId errorMsg = CheckParameters(); if (errorMsg != kStringIdNone) { - return Result(Status::InvalidParameters, kStringIdNone, errorMsg); + return Result(Status::invalidParameters, kStringIdNone, errorMsg); } if (!LocationValid(_coords)) { - return Result(Status::NotOwned, kStringIdNone, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::notOwned, kStringIdNone, STR_LAND_NOT_OWNED_BY_PARK); } if (gLegacyScene != LegacyScene::scenarioEditor && !gameState.cheats.sandboxMode) { if (!MapIsLocationInPark(_coords)) { - return Result(Status::Disallowed, kStringIdNone, STR_LAND_NOT_OWNED_BY_PARK); + return Result(Status::disallowed, kStringIdNone, STR_LAND_NOT_OWNED_BY_PARK); } } @@ -81,7 +81,7 @@ namespace OpenRCT2::GameActions if (surfaceElement == nullptr) { LOG_ERROR("No surface element at: x %u, y %u", _coords.x, _coords.y); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } int32_t zHigh = surfaceElement->GetBaseZ(); @@ -97,16 +97,16 @@ namespace OpenRCT2::GameActions zLow = temp; } - if (auto res2 = MapCanConstructAt({ _coords, zLow, zHigh }, { 0b1111, 0b1111 }); res2.Error != Status::Ok) + if (auto res2 = MapCanConstructAt({ _coords, zLow, zHigh }, { 0b1111, 0b1111 }); res2.error != Status::ok) { return res2; } if (surfaceElement->HasTrackThatNeedsWater()) { - return Result(Status::Disallowed, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ON_THIS_TILE_NEEDS_WATER); + return Result(Status::disallowed, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ON_THIS_TILE_NEEDS_WATER); } - res.Cost = 250; + res.cost = 250; return res; } @@ -114,19 +114,19 @@ namespace OpenRCT2::GameActions Result WaterSetHeightAction::Execute(GameState_t& gameState) const { auto res = Result(); - res.Expenditure = ExpenditureType::landscaping; - res.Position = { _coords, _height * kCoordsZStep }; + res.expenditure = ExpenditureType::landscaping; + res.position = { _coords, _height * kCoordsZStep }; int32_t surfaceHeight = TileElementHeight(_coords); FootpathRemoveLitter({ _coords, surfaceHeight }); - if (!getGameState().cheats.disableClearanceChecks) + if (!gameState.cheats.disableClearanceChecks) WallRemoveAtZ({ _coords, surfaceHeight }); SurfaceElement* surfaceElement = MapGetSurfaceElementAt(_coords); if (surfaceElement == nullptr) { LOG_ERROR("No surface element at: x %u, y %u", _coords.x, _coords.y); - return Result(Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + return Result(Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } if (_height > surfaceElement->BaseHeight) @@ -139,7 +139,7 @@ namespace OpenRCT2::GameActions } MapInvalidateTileFull(_coords); - res.Cost = 250; + res.cost = 250; return res; } diff --git a/src/openrct2/actions/WaterSetHeightAction.h b/src/openrct2/actions/WaterSetHeightAction.h index 243f0fe36322..3b9ebc843b56 100644 --- a/src/openrct2/actions/WaterSetHeightAction.h +++ b/src/openrct2/actions/WaterSetHeightAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/audio/Audio.cpp b/src/openrct2/audio/Audio.cpp index a12c789048df..c57f37e153b4 100644 --- a/src/openrct2/audio/Audio.cpp +++ b/src/openrct2/audio/Audio.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -128,11 +128,12 @@ namespace OpenRCT2::Audio } } -#ifndef __linux__ - // The first device is always system default on Windows and macOS + // The first device is always system default std::string defaultDevice = LanguageGetString(STR_OPTIONS_SOUND_VALUE_DEFAULT); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnull-dereference" devices.insert(devices.begin(), defaultDevice); -#endif +#pragma GCC diagnostic pop _audioDevices = devices; } diff --git a/src/openrct2/audio/Audio.h b/src/openrct2/audio/Audio.h index b7ffcfa3650a..6691609b5b66 100644 --- a/src/openrct2/audio/Audio.h +++ b/src/openrct2/audio/Audio.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/audio/AudioChannel.h b/src/openrct2/audio/AudioChannel.h index 4d54e1f0075c..365d19c25c40 100644 --- a/src/openrct2/audio/AudioChannel.h +++ b/src/openrct2/audio/AudioChannel.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/audio/AudioContext.h b/src/openrct2/audio/AudioContext.h index c2c949828d66..937b7d2e34cb 100644 --- a/src/openrct2/audio/AudioContext.h +++ b/src/openrct2/audio/AudioContext.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/audio/AudioMixer.h b/src/openrct2/audio/AudioMixer.h index f59d87adefb4..703f9869a544 100644 --- a/src/openrct2/audio/AudioMixer.h +++ b/src/openrct2/audio/AudioMixer.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,7 @@ #pragma once +#include #include namespace OpenRCT2::Audio diff --git a/src/openrct2/audio/AudioSource.h b/src/openrct2/audio/AudioSource.h index 08cfeeb40cd0..e9a916d48914 100644 --- a/src/openrct2/audio/AudioSource.h +++ b/src/openrct2/audio/AudioSource.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/audio/DummyAudioContext.cpp b/src/openrct2/audio/DummyAudioContext.cpp index 82ca69dc600f..afb988aa8298 100644 --- a/src/openrct2/audio/DummyAudioContext.cpp +++ b/src/openrct2/audio/DummyAudioContext.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/command_line/CommandLine.cpp b/src/openrct2/command_line/CommandLine.cpp index c6aea16821dc..238d751789c5 100644 --- a/src/openrct2/command_line/CommandLine.cpp +++ b/src/openrct2/command_line/CommandLine.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/command_line/CommandLine.hpp b/src/openrct2/command_line/CommandLine.hpp index 9d5dcdfd029a..3f1dca1f6bd2 100644 --- a/src/openrct2/command_line/CommandLine.hpp +++ b/src/openrct2/command_line/CommandLine.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -125,5 +125,6 @@ namespace OpenRCT2 exitcode_t HandleCommandDefault(); exitcode_t HandleCommandUri(CommandLineArgEnumerator* enumerator); + exitcode_t HandleCommandTriggerSteamDownload(CommandLineArgEnumerator* enumerator); } // namespace CommandLine } // namespace OpenRCT2 diff --git a/src/openrct2/command_line/ConvertCommand.cpp b/src/openrct2/command_line/ConvertCommand.cpp index 0d6851c27938..6d128379eae2 100644 --- a/src/openrct2/command_line/ConvertCommand.cpp +++ b/src/openrct2/command_line/ConvertCommand.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/command_line/ParkInfoCommands.cpp b/src/openrct2/command_line/ParkInfoCommands.cpp index ecb96124ed12..d73e6f9b73d7 100644 --- a/src/openrct2/command_line/ParkInfoCommands.cpp +++ b/src/openrct2/command_line/ParkInfoCommands.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/command_line/RootCommands.cpp b/src/openrct2/command_line/RootCommands.cpp index 2d5d09f8950a..c7015c72c2b4 100644 --- a/src/openrct2/command_line/RootCommands.cpp +++ b/src/openrct2/command_line/RootCommands.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -140,6 +140,7 @@ namespace OpenRCT2 DefineCommand("set-rct2", "", kStandardOptions, HandleCommandSetRCT2), DefineCommand("scan-objects", "", kStandardOptions, HandleCommandScanObjects), DefineCommand("handle-uri", "openrct2://.../", kStandardOptions, CommandLine::HandleCommandUri), + DefineCommand("trigger-steam-download", "", kStandardOptions, CommandLine::HandleCommandTriggerSteamDownload), #if defined(_WIN32) DefineCommand("register-shell", "", RegisterShellOptions, HandleCommandRegisterShell), @@ -516,4 +517,14 @@ namespace OpenRCT2 // TODO Print other potential information (e.g. user, hardware) } + + exitcode_t CommandLine::HandleCommandTriggerSteamDownload([[maybe_unused]] CommandLineArgEnumerator* enumerator) + { + if (!Platform::triggerSteamDownload()) + { + return EXITCODE_FAIL; + } + + return EXITCODE_OK; + } } // namespace OpenRCT2 diff --git a/src/openrct2/command_line/ScreenshotCommands.cpp b/src/openrct2/command_line/ScreenshotCommands.cpp index 215f622a7efd..3ed43fd7e47d 100644 --- a/src/openrct2/command_line/ScreenshotCommands.cpp +++ b/src/openrct2/command_line/ScreenshotCommands.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/command_line/SimulateCommands.cpp b/src/openrct2/command_line/SimulateCommands.cpp index e2fcaf276b2b..ec34d4365b0d 100644 --- a/src/openrct2/command_line/SimulateCommands.cpp +++ b/src/openrct2/command_line/SimulateCommands.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/command_line/UriHandler.cpp b/src/openrct2/command_line/UriHandler.cpp index 3e2443b7d6f3..d9bc95189210 100644 --- a/src/openrct2/command_line/UriHandler.cpp +++ b/src/openrct2/command_line/UriHandler.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/command_line/sprite/SpriteAppend.cpp b/src/openrct2/command_line/sprite/SpriteAppend.cpp index a3a581da52f9..c7a2a2ca9d4e 100644 --- a/src/openrct2/command_line/sprite/SpriteAppend.cpp +++ b/src/openrct2/command_line/sprite/SpriteAppend.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -52,9 +52,11 @@ namespace OpenRCT2::CommandLine::Sprite constexpr uint8_t importFlags = EnumToFlag(ImportFlags::RLE); ImageImportMeta meta = { { xOffset, yOffset }, Palette::OpenRCT2, importFlags, spriteMode }; - auto importResult = SpriteImageImport(imagePath, meta); - if (!importResult.has_value()) + const auto image = SpriteImageLoad(imagePath, meta); + if (!image.has_value()) return -1; + ImageImporter importer; + auto importResult = importer.Import(image.value(), meta); auto spriteFile = SpriteFile::Open(spriteFilePath); if (!spriteFile.has_value()) @@ -63,7 +65,7 @@ namespace OpenRCT2::CommandLine::Sprite return -1; } - spriteFile->AddImage(importResult.value()); + spriteFile->AddImage(importResult); if (!spriteFile->Save(spriteFilePath)) return -1; diff --git a/src/openrct2/command_line/sprite/SpriteBuild.cpp b/src/openrct2/command_line/sprite/SpriteBuild.cpp index d3bf7428ea7d..74f9cc214dce 100644 --- a/src/openrct2/command_line/sprite/SpriteBuild.cpp +++ b/src/openrct2/command_line/sprite/SpriteBuild.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -53,8 +53,8 @@ namespace OpenRCT2::CommandLine::Sprite // keep sprite file entirely in memory until ready to write out a complete, // correct file SpriteFile spriteFile; - spriteFile.Header.num_entries = 0; - spriteFile.Header.total_size = 0; + spriteFile.Header.numEntries = 0; + spriteFile.Header.totalSize = 0; fprintf(stdout, "Building: %s\n", spriteFilePath); @@ -62,6 +62,8 @@ namespace OpenRCT2::CommandLine::Sprite uint32_t numSuccessful = 0; + std::unordered_map images{}; + // Note: jsonSprite is deliberately left non-const: json_t behaviour changes when const for (auto& [jsonKey, jsonSprite] : jsonSprites.items()) { @@ -84,14 +86,28 @@ namespace OpenRCT2::CommandLine::Sprite auto imagePath = Path::GetAbsolute(Path::Combine(directoryPath, strPath)); - auto importResult = SpriteImageImport(imagePath, meta); - if (importResult == std::nullopt) + const auto image_iter = images.find(imagePath); + if (image_iter != images.end()) { - fprintf(stderr, "Could not import image file: %s\nCanceling\n", imagePath.c_str()); - return -1; + ImageImporter importer; + auto importResult = importer.Import(image_iter->second, meta); + spriteFile.AddImage(importResult); + } + else + { + const auto image = SpriteImageLoad(imagePath, meta); + if (image == std::nullopt) + { + fprintf(stderr, "Could not read image file: %s\nCanceling\n", imagePath.c_str()); + return -1; + } + images[imagePath] = image.value(); + + ImageImporter importer; + auto importResult = importer.Import(image.value(), meta); + + spriteFile.AddImage(importResult); } - - spriteFile.AddImage(importResult.value()); if (!silent) fprintf(stdout, "Added: %s\n", imagePath.c_str()); diff --git a/src/openrct2/command_line/sprite/SpriteCombine.cpp b/src/openrct2/command_line/sprite/SpriteCombine.cpp index 6b518732207e..102ed15b1203 100644 --- a/src/openrct2/command_line/sprite/SpriteCombine.cpp +++ b/src/openrct2/command_line/sprite/SpriteCombine.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -32,25 +32,25 @@ namespace OpenRCT2::CommandLine::Sprite auto fileHeaderSize = fileHeader.GetLength(); auto fileDataSize = fileData.GetLength(); - uint32_t numEntries = fileHeaderSize / sizeof(RCTG1Element); + uint32_t numEntries = fileHeaderSize / sizeof(StoredG1Element); - RCTG1Header header = {}; - header.num_entries = numEntries; - header.total_size = fileDataSize; + G1Header header = {}; + header.numEntries = numEntries; + header.totalSize = fileDataSize; FileStream outputStream(outputPath, FileMode::write); - outputStream.Write(&header, sizeof(RCTG1Header)); - auto g1Elements32 = std::make_unique(numEntries); - fileHeader.Read(g1Elements32.get(), numEntries * sizeof(RCTG1Element)); + outputStream.Write(&header, sizeof(G1Header)); + auto g1Elements32 = std::make_unique(numEntries); + fileHeader.Read(g1Elements32.get(), numEntries * sizeof(StoredG1Element)); for (uint32_t i = 0; i < numEntries; i++) { // RCT1 used zoomed offsets that counted from the beginning of the file, rather than from the current sprite. - if (g1Elements32[i].flags & G1_FLAG_HAS_ZOOM_SPRITE) + if (g1Elements32[i].flags.has(G1Flag::hasZoomSprite)) { - g1Elements32[i].zoomed_offset = i - g1Elements32[i].zoomed_offset; + g1Elements32[i].zoomedOffset = i - g1Elements32[i].zoomedOffset; } - outputStream.Write(&g1Elements32[i], sizeof(RCTG1Element)); + outputStream.Write(&g1Elements32[i], sizeof(StoredG1Element)); } std::vector data; diff --git a/src/openrct2/command_line/sprite/SpriteCommands.cpp b/src/openrct2/command_line/sprite/SpriteCommands.cpp index 018261b725bc..2f4919d3bae7 100644 --- a/src/openrct2/command_line/sprite/SpriteCommands.cpp +++ b/src/openrct2/command_line/sprite/SpriteCommands.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include "../../OpenRCT2.h" #include "../../core/Memory.hpp" #include "../../core/String.hpp" +#include "../../drawing/Drawing.h" #include "../../object/ObjectFactory.h" #include "../CommandLine.hpp" @@ -162,7 +163,7 @@ namespace OpenRCT2::CommandLine::Sprite } } - std::optional SpriteImageImport(u8string_view path, ImageImportMeta meta) + std::optional SpriteImageLoad(u8string_view path, ImageImportMeta meta) { try { @@ -171,11 +172,7 @@ namespace OpenRCT2::CommandLine::Sprite { format = ImageFormat::png; } - - ImageImporter importer; - auto image = Imaging::ReadFromFile(path, format); - - return importer.Import(image, meta); + return Imaging::ReadFromFile(path, format); } catch (const std::exception& e) { diff --git a/src/openrct2/command_line/sprite/SpriteCommands.h b/src/openrct2/command_line/sprite/SpriteCommands.h index 0a24147e6b18..16e847a1516d 100644 --- a/src/openrct2/command_line/sprite/SpriteCommands.h +++ b/src/openrct2/command_line/sprite/SpriteCommands.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,21 +9,22 @@ #pragma once +#include "../../core/StringTypes.h" #include "../../drawing/ImageImporter.h" #include #include -#include -struct G1Element; -using utf8 = char; -using u8string_view = std::basic_string_view; +namespace OpenRCT2 +{ + struct G1Element; +} namespace OpenRCT2::CommandLine::Sprite { using namespace OpenRCT2::Drawing; bool SpriteImageExport(const G1Element& spriteElement, u8string_view outPath); - std::optional SpriteImageImport(u8string_view path, ImageImportMeta meta); + std::optional SpriteImageLoad(u8string_view path, ImageImportMeta meta); std::string PopStr(std::ostringstream& oss); int32_t append(const char** argv, int32_t argc, ImportMode spriteMode); diff --git a/src/openrct2/command_line/sprite/SpriteCreate.cpp b/src/openrct2/command_line/sprite/SpriteCreate.cpp index c88564e79c59..e0f726d806e2 100644 --- a/src/openrct2/command_line/sprite/SpriteCreate.cpp +++ b/src/openrct2/command_line/sprite/SpriteCreate.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/command_line/sprite/SpriteDetails.cpp b/src/openrct2/command_line/sprite/SpriteDetails.cpp index 98766c7ac6a6..d4729d262e5f 100644 --- a/src/openrct2/command_line/sprite/SpriteDetails.cpp +++ b/src/openrct2/command_line/sprite/SpriteDetails.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -35,8 +35,8 @@ namespace OpenRCT2::CommandLine::Sprite return -1; } - printf("sprites: %u\n", spriteFile->Header.num_entries); - printf("data size: %u\n", spriteFile->Header.total_size); + printf("sprites: %u\n", spriteFile->Header.numEntries); + printf("data size: %u\n", spriteFile->Header.totalSize); return 0; } @@ -49,7 +49,7 @@ namespace OpenRCT2::CommandLine::Sprite return -1; } - if (spriteIndex < 0 || spriteIndex >= static_cast(spriteFile->Header.num_entries)) + if (spriteIndex < 0 || spriteIndex >= static_cast(spriteFile->Header.numEntries)) { fprintf(stderr, "Sprite #%d does not exist in sprite file.\n", spriteIndex); return -1; @@ -58,8 +58,8 @@ namespace OpenRCT2::CommandLine::Sprite G1Element* g1 = &spriteFile->Entries[spriteIndex]; printf("width: %d\n", g1->width); printf("height: %d\n", g1->height); - printf("x offset: %d\n", g1->x_offset); - printf("y offset: %d\n", g1->y_offset); + printf("x offset: %d\n", g1->xOffset); + printf("y offset: %d\n", g1->yOffset); printf("data offset: %p\n", g1->offset); return 0; } diff --git a/src/openrct2/command_line/sprite/SpriteExport.cpp b/src/openrct2/command_line/sprite/SpriteExport.cpp index 08b3c79e9665..72546d71c0ab 100644 --- a/src/openrct2/command_line/sprite/SpriteExport.cpp +++ b/src/openrct2/command_line/sprite/SpriteExport.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -35,7 +35,7 @@ namespace OpenRCT2::CommandLine::Sprite return -1; } - if (spriteIndex < 0 || spriteIndex >= static_cast(spriteFile->Header.num_entries)) + if (spriteIndex < 0 || spriteIndex >= static_cast(spriteFile->Header.numEntries)) { fprintf(stderr, "Sprite #%d does not exist in sprite file.\n", spriteIndex); return -1; @@ -47,7 +47,7 @@ namespace OpenRCT2::CommandLine::Sprite fprintf(stderr, "Could not export\n"); return -1; } - fprintf(stdout, "{ \"x\": %d, \"y\": %d }\n", spriteHeader.x_offset, spriteHeader.y_offset); + fprintf(stdout, "{ \"x\": %d, \"y\": %d }\n", spriteHeader.xOffset, spriteHeader.yOffset); return 0; } } // namespace OpenRCT2::CommandLine::Sprite diff --git a/src/openrct2/command_line/sprite/SpriteExportAll.cpp b/src/openrct2/command_line/sprite/SpriteExportAll.cpp index 567f91df5fd0..1af3684a9b77 100644 --- a/src/openrct2/command_line/sprite/SpriteExportAll.cpp +++ b/src/openrct2/command_line/sprite/SpriteExportAll.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -46,7 +46,7 @@ namespace OpenRCT2::CommandLine::Sprite return -1; } - const uint32_t maxIndex = spriteFile->Header.num_entries; + const uint32_t maxIndex = spriteFile->Header.numEntries; const int32_t numbers = static_cast(std::floor(std::log10(maxIndex) + 1)); std::ostringstream oss; // TODO: Remove when C++20 is enabled and std::format can be used diff --git a/src/openrct2/command_line/sprite/SpriteExportObject.cpp b/src/openrct2/command_line/sprite/SpriteExportObject.cpp index a29f5828d72d..36922485d5ca 100644 --- a/src/openrct2/command_line/sprite/SpriteExportObject.cpp +++ b/src/openrct2/command_line/sprite/SpriteExportObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -71,7 +71,7 @@ namespace OpenRCT2::CommandLine::Sprite } path = fs::u8path(path).generic_u8string(); - fprintf(stdout, "{ \"path\": \"%s\", \"x\": %d, \"y\": %d }", path.c_str(), g1.x_offset, g1.y_offset); + fprintf(stdout, "{ \"path\": \"%s\", \"x\": %d, \"y\": %d }", path.c_str(), g1.xOffset, g1.yOffset); } fprintf(stdout, (spriteIndex + 1 != maxIndex) ? ",\n" : "\n"); diff --git a/src/openrct2/command_line/sprite/SpriteFile.cpp b/src/openrct2/command_line/sprite/SpriteFile.cpp index 6bbaae440e65..a2b58b38fa1f 100644 --- a/src/openrct2/command_line/sprite/SpriteFile.cpp +++ b/src/openrct2/command_line/sprite/SpriteFile.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,6 +10,7 @@ #include "SpriteFile.h" #include "../../core/FileStream.h" +#include "../../drawing/ImageImporter.h" namespace OpenRCT2::CommandLine::Sprite { @@ -20,29 +21,29 @@ namespace OpenRCT2::CommandLine::Sprite FileStream stream(path, FileMode::open); SpriteFile spriteFile; - stream.Read(&spriteFile.Header, sizeof(RCTG1Header)); + stream.Read(&spriteFile.Header, sizeof(G1Header)); - if (spriteFile.Header.num_entries > 0) + if (spriteFile.Header.numEntries > 0) { - spriteFile.Entries.reserve(spriteFile.Header.num_entries); + spriteFile.Entries.reserve(spriteFile.Header.numEntries); - for (uint32_t i = 0; i < spriteFile.Header.num_entries; ++i) + for (uint32_t i = 0; i < spriteFile.Header.numEntries; ++i) { - RCTG1Element entry32bit{}; + StoredG1Element entry32bit{}; stream.Read(&entry32bit, sizeof(entry32bit)); G1Element entry{}; entry.offset = reinterpret_cast(static_cast(entry32bit.offset)); entry.width = entry32bit.width; entry.height = entry32bit.height; - entry.x_offset = entry32bit.x_offset; - entry.y_offset = entry32bit.y_offset; + entry.xOffset = entry32bit.xOffset; + entry.yOffset = entry32bit.yOffset; entry.flags = entry32bit.flags; - entry.zoomed_offset = entry32bit.zoomed_offset; + entry.zoomedOffset = entry32bit.zoomedOffset; spriteFile.Entries.push_back(std::move(entry)); } - spriteFile.Data.resize(spriteFile.Header.total_size); - stream.Read(spriteFile.Data.data(), spriteFile.Header.total_size); + spriteFile.Data.resize(spriteFile.Header.totalSize); + stream.Read(spriteFile.Data.data(), spriteFile.Header.totalSize); } spriteFile.MakeEntriesAbsolute(); return spriteFile; @@ -73,17 +74,17 @@ namespace OpenRCT2::CommandLine::Sprite isAbsolute = false; } - void SpriteFile::AddImage(ImageImporter::ImportResult& image) + void SpriteFile::AddImage(Drawing::ImageImportResult& image) { - Header.num_entries++; + Header.numEntries++; // New image will have its data inserted after previous image - uint8_t* newElementOffset = reinterpret_cast(static_cast(Header.total_size)); - Header.total_size += static_cast(image.Buffer.size()); - Entries.reserve(Header.num_entries); + uint8_t* newElementOffset = reinterpret_cast(static_cast(Header.totalSize)); + Header.totalSize += static_cast(image.Buffer.size()); + Entries.reserve(Header.numEntries); { ScopedRelativeSpriteFile scopedRelative(*this); - Data.reserve(Header.total_size); + Data.reserve(Header.totalSize); Entries.push_back(image.Element); Entries.back().offset = newElementOffset; const auto& buffer = image.Buffer; @@ -96,27 +97,27 @@ namespace OpenRCT2::CommandLine::Sprite try { FileStream stream(path, FileMode::write); - stream.Write(&Header, sizeof(RCTG1Header)); + stream.Write(&Header, sizeof(G1Header)); - if (Header.num_entries > 0) + if (Header.numEntries > 0) { ScopedRelativeSpriteFile scopedRelative(*this); for (const auto& entry : Entries) { - RCTG1Element entry32bit{}; + StoredG1Element entry32bit{}; entry32bit.offset = static_cast(reinterpret_cast(const_cast(entry.offset))); entry32bit.width = entry.width; entry32bit.height = entry.height; - entry32bit.x_offset = entry.x_offset; - entry32bit.y_offset = entry.y_offset; + entry32bit.xOffset = entry.xOffset; + entry32bit.yOffset = entry.yOffset; entry32bit.flags = entry.flags; - entry32bit.zoomed_offset = entry.zoomed_offset; + entry32bit.zoomedOffset = entry.zoomedOffset; stream.Write(&entry32bit, sizeof(entry32bit)); } - stream.Write(Data.data(), Header.total_size); + stream.Write(Data.data(), Header.totalSize); } return true; } diff --git a/src/openrct2/command_line/sprite/SpriteFile.h b/src/openrct2/command_line/sprite/SpriteFile.h index 4344288f38ee..3318b8e2fdf3 100644 --- a/src/openrct2/command_line/sprite/SpriteFile.h +++ b/src/openrct2/command_line/sprite/SpriteFile.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,20 +9,25 @@ #pragma once -#include "../../drawing/Drawing.h" -#include "../../drawing/ImageImporter.h" +#include "../../core/StringTypes.h" +#include "../../drawing/G1Element.h" -namespace OpenRCT2::CommandLine::Sprite +#include + +namespace OpenRCT2::Drawing { - using OpenRCT2::Drawing::ImageImporter; + struct ImageImportResult; +} +namespace OpenRCT2::CommandLine::Sprite +{ class SpriteFile { public: - RCTG1Header Header{}; - std::vector Entries; + OpenRCT2::G1Header Header{}; + std::vector Entries; std::vector Data; - void AddImage(ImageImporter::ImportResult& image); + void AddImage(Drawing::ImageImportResult& image); bool Save(const utf8* path); static std::optional Open(const utf8* path); diff --git a/src/openrct2/config/Config.cpp b/src/openrct2/config/Config.cpp index c9502f8cc029..2979274e8e17 100644 --- a/src/openrct2/config/Config.cpp +++ b/src/openrct2/config/Config.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,6 +30,7 @@ #include "../paint/VirtualFloor.h" #include "../platform/Platform.h" #include "../rct1/Csg.h" +#include "../ride/Ride.h" #include "../scenario/Scenario.h" #include "../ui/UiContext.h" #include "ConfigEnum.hpp" @@ -49,6 +50,11 @@ static constexpr bool kEnlargedUiDefault = true; #else static constexpr bool kEnlargedUiDefault = false; #endif +#ifdef __HAIKU__ // Multi-threading is unstable here +static constexpr bool kMultiThreadingDefault = false; +#else +static constexpr bool kMultiThreadingDefault = true; +#endif namespace OpenRCT2::Config { @@ -131,6 +137,16 @@ namespace OpenRCT2::Config ConfigEnumEntry("GLASSY", VirtualFloorStyles::Glassy), }); + static const auto Enum_RideInspectionInterval = ConfigEnum({ + ConfigEnumEntry("EVERY_10_MINUTES", RideInspection::every10Minutes), + ConfigEnumEntry("EVERY_20_MINUTES", RideInspection::every20Minutes), + ConfigEnumEntry("EVERY_30_MINUTES", RideInspection::every30Minutes), + ConfigEnumEntry("EVERY_45_MINUTES", RideInspection::every45Minutes), + ConfigEnumEntry("EVERY_HOUR", RideInspection::everyHour), + ConfigEnumEntry("EVERY_2_HOURS", RideInspection::every2Hours), + ConfigEnumEntry("NEVER", RideInspection::never), + }); + /** * Config enum wrapping LanguagesDescriptors. */ @@ -204,7 +220,8 @@ namespace OpenRCT2::Config model->dateFormat = reader->GetEnum("date_format", Platform::GetLocaleDateFormat(), Enum_DateFormat); model->autoStaffPlacement = reader->GetBoolean("auto_staff", true); model->handymenMowByDefault = reader->GetBoolean("handymen_mow_default", false); - model->defaultInspectionInterval = reader->GetInt32("default_inspection_interval", 2); + model->defaultInspectionInterval = reader->GetEnum( + "default_inspection_interval", RideInspection::every30Minutes, Enum_RideInspectionInterval); model->lastRunVersion = reader->GetString("last_run_version", ""); model->invertViewportDrag = reader->GetBoolean("invert_viewport_drag", false); model->loadSaveSort = reader->GetEnum( @@ -226,7 +243,7 @@ namespace OpenRCT2::Config // Always have multi-threading disabled in debug builds, this makes things slower. model->multiThreading = false; #else - model->multiThreading = reader->GetBoolean("multithreading", true); + model->multiThreading = reader->GetBoolean("multithreading", kMultiThreadingDefault); #endif // _DEBUG model->trapCursor = reader->GetBoolean("trap_cursor", false); model->autoOpenShops = reader->GetBoolean("auto_open_shops", false); @@ -309,7 +326,8 @@ namespace OpenRCT2::Config writer->WriteEnum("date_format", model->dateFormat, Enum_DateFormat); writer->WriteBoolean("auto_staff", model->autoStaffPlacement); writer->WriteBoolean("handymen_mow_default", model->handymenMowByDefault); - writer->WriteInt32("default_inspection_interval", model->defaultInspectionInterval); + writer->WriteEnum( + "default_inspection_interval", model->defaultInspectionInterval, Enum_RideInspectionInterval); writer->WriteString("last_run_version", model->lastRunVersion); writer->WriteBoolean("invert_viewport_drag", model->invertViewportDrag); writer->WriteEnum("load_save_sort", model->loadSaveSort, Enum_FileBrowserSort); @@ -735,13 +753,24 @@ namespace OpenRCT2::Config } } - auto steamPath = Platform::GetSteamPath(); - if (!steamPath.empty()) + auto steamPaths = Platform::GetSteamPaths(); + if (steamPaths.isSteamPresent()) { - std::string location = Path::Combine(steamPath, Platform::GetRCT1SteamDir()); - if (RCT1DataPresentAtLocation(location)) + for (const auto& root : steamPaths.roots) { - return location; + auto nativePath = Path::Combine(root, steamPaths.nativeFolder, Platform::kSteamRCT1Data.nativeFolder); + if (RCT1DataPresentAtLocation(nativePath)) + { + return nativePath; + } + if (!steamPaths.downloadDepotFolder.empty()) + { + auto downloadDepotPath = steamPaths.getDownloadDepotFolder(root, Platform::kSteamRCT1Data); + if (RCT1DataPresentAtLocation(downloadDepotPath)) + { + return downloadDepotPath; + } + } } } @@ -753,6 +782,39 @@ namespace OpenRCT2::Config return {}; } + static u8string FindRCT2SteamPath() + { + auto steamPaths = Platform::GetSteamPaths(); + if (steamPaths.isSteamPresent()) + { + const std::array gamesToCheck = { + Platform::kSteamRCT2Data, + Platform::kSteamRCTCData, + }; + for (const auto& root : steamPaths.roots) + { + for (const auto& game : gamesToCheck) + { + auto nativePath = Path::Combine(root, steamPaths.nativeFolder, game.nativeFolder); + if (Platform::OriginalGameDataExists(nativePath)) + { + return nativePath; + } + if (!steamPaths.downloadDepotFolder.empty()) + { + auto downloadDepotPath = steamPaths.getDownloadDepotFolder(root, game); + if (Platform::OriginalGameDataExists(downloadDepotPath)) + { + return downloadDepotPath; + } + } + } + } + } + + return {}; + } + /** * Attempts to find the RCT2 installation directory. * This should be created from some other resource when OpenRCT2 grows. @@ -772,20 +834,11 @@ namespace OpenRCT2::Config } } - auto steamPath = Platform::GetSteamPath(); + // Will only return a path if the RCT2 data is present, so no need to check twice. + auto steamPath = FindRCT2SteamPath(); if (!steamPath.empty()) { - std::string location = Path::Combine(steamPath, Platform::GetRCT2SteamDir()); - if (Platform::OriginalGameDataExists(location)) - { - return location; - } - - std::string location2 = Path::Combine(steamPath, Platform::GetRCTClassicSteamDir()); - if (Platform::OriginalGameDataExists(location2)) - { - return location2; - } + return steamPath; } auto discordPath = Platform::GetFolderPath(SpecialFolder::rct2Discord); @@ -893,6 +946,7 @@ namespace OpenRCT2::Config { uiContext.ShowMessageBox(LanguageGetString(STR_NEEDS_RCT2_FILES)); std::string gog = LanguageGetString(STR_OWN_ON_GOG); + std::string steam = LanguageGetString(STR_OWN_ON_STEAM); std::string hdd = LanguageGetString(STR_INSTALLED_ON_HDD); std::vector options; @@ -902,6 +956,7 @@ namespace OpenRCT2::Config { options.push_back(hdd); options.push_back(gog); + options.push_back(steam); int optionIndex = uiContext.ShowMenuDialog( options, LanguageGetString(STR_OPENRCT2_SETUP), LanguageGetString(STR_WHICH_APPLIES_BEST)); if (optionIndex < 0 || static_cast(optionIndex) >= options.size()) @@ -959,6 +1014,21 @@ namespace OpenRCT2::Config possibleInstallPaths.emplace_back(dest); possibleInstallPaths.emplace_back(Path::Combine(dest, u8"app")); } + else if (chosenOption == steam) + { + uiContext.ShowMessageBox(LanguageGetString(STR_PLEASE_CLOSE_STEAM)); + + Platform::triggerSteamDownload(); + + uiContext.ShowMessageBox(LanguageGetString(STR_WAIT_FOR_STEAM_DOWNLOAD)); + + auto steamPath = FindRCT2SteamPath(); + if (!steamPath.empty()) + { + Get().general.rct2Path = steamPath; + return true; + } + } if (possibleInstallPaths.empty()) { return false; @@ -986,7 +1056,7 @@ namespace OpenRCT2::Config std::string rct1Path = FindRCT1Path(); if (!rct1Path.empty()) { - Get().general.rct2Path = std::move(rct1Path); + Get().general.rct1Path = std::move(rct1Path); } return true; diff --git a/src/openrct2/config/Config.h b/src/openrct2/config/Config.h index 3b89f3c060a8..8c00e28d30a9 100644 --- a/src/openrct2/config/Config.h +++ b/src/openrct2/config/Config.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,6 +19,8 @@ #undef interface #endif +enum class RideInspection : uint8_t; + namespace OpenRCT2::Config { struct General @@ -98,7 +100,7 @@ namespace OpenRCT2::Config bool autoStaffPlacement; bool handymenMowByDefault; bool autoOpenShops; - int32_t defaultInspectionInterval; + RideInspection defaultInspectionInterval; int32_t windowLimit; bool scenarioUnlockingEnabled; bool scenarioHideMegaPark; diff --git a/src/openrct2/config/ConfigEnum.hpp b/src/openrct2/config/ConfigEnum.hpp index 22a2b6d34201..0964af7e7703 100644 --- a/src/openrct2/config/ConfigEnum.hpp +++ b/src/openrct2/config/ConfigEnum.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/config/ConfigTypes.h b/src/openrct2/config/ConfigTypes.h index 080bcd59ba79..423ed6fc87a7 100644 --- a/src/openrct2/config/ConfigTypes.h +++ b/src/openrct2/config/ConfigTypes.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/config/IniReader.cpp b/src/openrct2/config/IniReader.cpp index 55c4956209ee..3867bc17da46 100644 --- a/src/openrct2/config/IniReader.cpp +++ b/src/openrct2/config/IniReader.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/config/IniReader.hpp b/src/openrct2/config/IniReader.hpp index 3fe2e4b72bba..be1057f0506e 100644 --- a/src/openrct2/config/IniReader.hpp +++ b/src/openrct2/config/IniReader.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/config/IniWriter.cpp b/src/openrct2/config/IniWriter.cpp index 5a527757fd73..99460dfa26ef 100644 --- a/src/openrct2/config/IniWriter.cpp +++ b/src/openrct2/config/IniWriter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/config/IniWriter.hpp b/src/openrct2/config/IniWriter.hpp index c78bc20eca9e..1dbcf0469210 100644 --- a/src/openrct2/config/IniWriter.hpp +++ b/src/openrct2/config/IniWriter.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Algorithm.hpp b/src/openrct2/core/Algorithm.hpp index decbe916f14e..479840874d02 100644 --- a/src/openrct2/core/Algorithm.hpp +++ b/src/openrct2/core/Algorithm.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/BackgroundWorker.hpp b/src/openrct2/core/BackgroundWorker.hpp index cb3535271944..5d840754a0e9 100644 --- a/src/openrct2/core/BackgroundWorker.hpp +++ b/src/openrct2/core/BackgroundWorker.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/BitSet.hpp b/src/openrct2/core/BitSet.hpp index 232aba9e7ed3..ebe148f34e84 100644 --- a/src/openrct2/core/BitSet.hpp +++ b/src/openrct2/core/BitSet.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -28,8 +28,8 @@ namespace OpenRCT2 template static constexpr size_t ByteAlignBits() { - const auto reminder = TNumBits % kBitsPerByte; - if constexpr (reminder == 0u) + const auto remainder = TNumBits % kBitsPerByte; + if constexpr (remainder == 0u) { return TNumBits; } @@ -145,13 +145,13 @@ namespace OpenRCT2 template class BitSet { - static constexpr size_t ByteAlignedBitSize = Detail::BitSet::ByteAlignBits(); + static constexpr size_t kByteAlignedBitSize = Detail::BitSet::ByteAlignBits(); - using StorageBlockType = typename Detail::BitSet::storage_block_type_aligned::value_type; + using StorageBlockType = typename Detail::BitSet::storage_block_type_aligned::value_type; static constexpr size_t kBlockByteSize = sizeof(StorageBlockType); static constexpr size_t kBlockBitSize = kBlockByteSize * Detail::BitSet::kBitsPerByte; - static constexpr size_t kBlockCount = Detail::BitSet::ComputekBlockCount(); + static constexpr size_t kBlockCount = Detail::BitSet::ComputekBlockCount(); static constexpr size_t kCapacityBits = kBlockCount * kBlockBitSize; static constexpr StorageBlockType kBlockValueZero = StorageBlockType{ 0u }; diff --git a/src/openrct2/core/CallingConventions.h b/src/openrct2/core/CallingConventions.h index 1a1a978ebd8e..142a7ccc5c5a 100644 --- a/src/openrct2/core/CallingConventions.h +++ b/src/openrct2/core/CallingConventions.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/ChecksumStream.cpp b/src/openrct2/core/ChecksumStream.cpp index 477acb8eb04b..1b96b4e9c89f 100644 --- a/src/openrct2/core/ChecksumStream.cpp +++ b/src/openrct2/core/ChecksumStream.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/ChecksumStream.h b/src/openrct2/core/ChecksumStream.h index 248e9fbc00b4..466669285c59 100644 --- a/src/openrct2/core/ChecksumStream.h +++ b/src/openrct2/core/ChecksumStream.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/CircularBuffer.h b/src/openrct2/core/CircularBuffer.h index 432a20f8efd7..271308706f05 100644 --- a/src/openrct2/core/CircularBuffer.h +++ b/src/openrct2/core/CircularBuffer.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/CodepointView.hpp b/src/openrct2/core/CodepointView.hpp index 2e3775211038..8f06f82de61f 100644 --- a/src/openrct2/core/CodepointView.hpp +++ b/src/openrct2/core/CodepointView.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Collections.hpp b/src/openrct2/core/Collections.hpp index dee800ef6faa..4ce368078323 100644 --- a/src/openrct2/core/Collections.hpp +++ b/src/openrct2/core/Collections.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Compression.cpp b/src/openrct2/core/Compression.cpp index 5f05b41e9d7c..ec89398eac4e 100644 --- a/src/openrct2/core/Compression.cpp +++ b/src/openrct2/core/Compression.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Compression.h b/src/openrct2/core/Compression.h index ecbf5cf0545e..7cbe6485464e 100644 --- a/src/openrct2/core/Compression.h +++ b/src/openrct2/core/Compression.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Console.cpp b/src/openrct2/core/Console.cpp index c73c42a60b51..7facc09888be 100644 --- a/src/openrct2/core/Console.cpp +++ b/src/openrct2/core/Console.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Console.hpp b/src/openrct2/core/Console.hpp index 23eb496430c3..52723cf4071a 100644 --- a/src/openrct2/core/Console.hpp +++ b/src/openrct2/core/Console.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Crypt.CNG.cpp b/src/openrct2/core/Crypt.CNG.cpp index dc1b096598b3..cceac0670f33 100644 --- a/src/openrct2/core/Crypt.CNG.cpp +++ b/src/openrct2/core/Crypt.CNG.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -24,12 +24,17 @@ #include // clang-format off -// CNG: Cryptography API: Next Generation (CNG) -// available in Windows Vista onwards. -#include -#include -#include -constexpr bool NT_SUCCESS(NTSTATUS status) {return status >= 0;} + // windows.h needs to be included first + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include + + // CNG: Cryptography API: Next Generation (CNG) + // available in Windows Vista onwards. + #include + #include + constexpr bool NT_SUCCESS(NTSTATUS status) {return status >= 0;} // clang-format on using namespace OpenRCT2::Crypt; diff --git a/src/openrct2/core/Crypt.OpenRCT2.cpp b/src/openrct2/core/Crypt.OpenRCT2.cpp index 9add20257ab1..6ebfc3c42c6e 100644 --- a/src/openrct2/core/Crypt.OpenRCT2.cpp +++ b/src/openrct2/core/Crypt.OpenRCT2.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Crypt.OpenSSL.cpp b/src/openrct2/core/Crypt.OpenSSL.cpp index 4169d7219543..8b08fa788af2 100644 --- a/src/openrct2/core/Crypt.OpenSSL.cpp +++ b/src/openrct2/core/Crypt.OpenSSL.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Crypt.h b/src/openrct2/core/Crypt.h index 8694683c3ebe..3d8779dd9b62 100644 --- a/src/openrct2/core/Crypt.h +++ b/src/openrct2/core/Crypt.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,6 +10,7 @@ #pragma once #include +#include #include #include #include diff --git a/src/openrct2/core/DataSerialiser.h b/src/openrct2/core/DataSerialiser.h index 59d9a3aae81d..caee893affcb 100644 --- a/src/openrct2/core/DataSerialiser.h +++ b/src/openrct2/core/DataSerialiser.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/DataSerialiserTag.h b/src/openrct2/core/DataSerialiserTag.h index 55de42cd716d..9b83872165c6 100644 --- a/src/openrct2/core/DataSerialiserTag.h +++ b/src/openrct2/core/DataSerialiserTag.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/DataSerialiserTraits.h b/src/openrct2/core/DataSerialiserTraits.h index 01e9af91c695..72d2bad2b199 100644 --- a/src/openrct2/core/DataSerialiserTraits.h +++ b/src/openrct2/core/DataSerialiserTraits.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/DateTime.h b/src/openrct2/core/DateTime.h index 95132e23a3cd..7d752dd2b5e7 100644 --- a/src/openrct2/core/DateTime.h +++ b/src/openrct2/core/DateTime.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Diagnostics.cpp b/src/openrct2/core/Diagnostics.cpp index a8840a9089c4..110f8c746c31 100644 --- a/src/openrct2/core/Diagnostics.cpp +++ b/src/openrct2/core/Diagnostics.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -8,6 +8,9 @@ *****************************************************************************/ #if defined(DEBUG) && defined(_WIN32) + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif #include #endif diff --git a/src/openrct2/core/Diagnostics.hpp b/src/openrct2/core/Diagnostics.hpp index 0950302a3197..77ed05571893 100644 --- a/src/openrct2/core/Diagnostics.hpp +++ b/src/openrct2/core/Diagnostics.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Endianness.h b/src/openrct2/core/Endianness.h index cebb5de0993d..b0683738abd4 100644 --- a/src/openrct2/core/Endianness.h +++ b/src/openrct2/core/Endianness.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/EnumMap.hpp b/src/openrct2/core/EnumMap.hpp index 7aeccf0fb588..8eeb3aeb0234 100644 --- a/src/openrct2/core/EnumMap.hpp +++ b/src/openrct2/core/EnumMap.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/EnumUtils.hpp b/src/openrct2/core/EnumUtils.hpp index eead9b76a271..8c1bc0e2b488 100644 --- a/src/openrct2/core/EnumUtils.hpp +++ b/src/openrct2/core/EnumUtils.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/File.cpp b/src/openrct2/core/File.cpp index 1296e1cba0c8..b7e82f68e64c 100644 --- a/src/openrct2/core/File.cpp +++ b/src/openrct2/core/File.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -8,6 +8,9 @@ *****************************************************************************/ #ifdef _WIN32 + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif #include #else #include diff --git a/src/openrct2/core/File.h b/src/openrct2/core/File.h index bac10253b534..35be6d4ac35a 100644 --- a/src/openrct2/core/File.h +++ b/src/openrct2/core/File.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/FileIndex.hpp b/src/openrct2/core/FileIndex.hpp index cd4af38ec385..af9e7c00874f 100644 --- a/src/openrct2/core/FileIndex.hpp +++ b/src/openrct2/core/FileIndex.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -144,6 +144,9 @@ class FileIndex std::vector files; for (const auto& directory : SearchPaths) { + if (directory.empty()) + continue; + auto absoluteDirectory = OpenRCT2::Path::GetAbsolute(directory); LOG_VERBOSE("FileIndex:Scanning for %s in '%s'", _pattern.c_str(), absoluteDirectory.c_str()); diff --git a/src/openrct2/core/FileScanner.cpp b/src/openrct2/core/FileScanner.cpp index 936dbe64f312..18d3c7207593 100644 --- a/src/openrct2/core/FileScanner.cpp +++ b/src/openrct2/core/FileScanner.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -8,8 +8,11 @@ *****************************************************************************/ #ifdef _WIN32 + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif #include -#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) +#elif defined(__unix__) || defined(__HAIKU__) || (defined(__APPLE__) && defined(__MACH__)) #include #include #include @@ -248,7 +251,7 @@ class FileScannerWindows final : public FileScannerBase #endif // _WIN32 -#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) +#if defined(__unix__) || defined(__HAIKU__) || (defined(__APPLE__) && defined(__MACH__)) class FileScannerUnix final : public FileScannerBase { @@ -287,7 +290,13 @@ class FileScannerUnix final : public FileScannerBase { DirectoryChild result; result.Name = std::string(node->d_name); + #ifdef __HAIKU__ + struct stat stbuf; + stat(node->d_name, &stbuf); + if (S_ISDIR(stbuf.st_mode)) + #else if (node->d_type == DT_DIR) + #endif { result.Type = DirectoryChildType::directory; } @@ -315,13 +324,13 @@ class FileScannerUnix final : public FileScannerBase } }; -#endif // defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) +#endif // defined(__unix__) || defined(__HAIKU__) || (defined(__APPLE__) && defined(__MACH__)) std::unique_ptr Path::ScanDirectory(const std::string& pattern, bool recurse) { #ifdef _WIN32 return std::make_unique(pattern, recurse); -#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) +#elif defined(__unix__) || defined(__HAIKU__) || (defined(__APPLE__) && defined(__MACH__)) return std::make_unique(pattern, recurse); #endif } diff --git a/src/openrct2/core/FileScanner.h b/src/openrct2/core/FileScanner.h index ba102aec1c0b..783bdc5f09dc 100644 --- a/src/openrct2/core/FileScanner.h +++ b/src/openrct2/core/FileScanner.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/FileStream.cpp b/src/openrct2/core/FileStream.cpp index 7a0c551ddbf9..301ef639fa1b 100644 --- a/src/openrct2/core/FileStream.cpp +++ b/src/openrct2/core/FileStream.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/FileStream.h b/src/openrct2/core/FileStream.h index ca11d8ac83a9..dc22add6004a 100644 --- a/src/openrct2/core/FileStream.h +++ b/src/openrct2/core/FileStream.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/FileSystem.hpp b/src/openrct2/core/FileSystem.hpp index c5b9d0f3d5b2..758c49612802 100644 --- a/src/openrct2/core/FileSystem.hpp +++ b/src/openrct2/core/FileSystem.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/FileWatcher.cpp b/src/openrct2/core/FileWatcher.cpp index c75dbee05624..899cc5972604 100644 --- a/src/openrct2/core/FileWatcher.cpp +++ b/src/openrct2/core/FileWatcher.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,6 +15,9 @@ #include #ifdef _WIN32 + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif #include #elif defined(__linux__) #include diff --git a/src/openrct2/core/FileWatcher.h b/src/openrct2/core/FileWatcher.h index 4fd673a9244e..efbf16edd65f 100644 --- a/src/openrct2/core/FileWatcher.h +++ b/src/openrct2/core/FileWatcher.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/FixedPoint.hpp b/src/openrct2/core/FixedPoint.hpp index d892d01a86b1..5d573d188c29 100644 --- a/src/openrct2/core/FixedPoint.hpp +++ b/src/openrct2/core/FixedPoint.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/FlagHolder.hpp b/src/openrct2/core/FlagHolder.hpp index a63ac376204e..ce47af480fce 100644 --- a/src/openrct2/core/FlagHolder.hpp +++ b/src/openrct2/core/FlagHolder.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -68,7 +68,7 @@ struct FlagHolder } template - constexpr FlagHolder with(TTypes... types) + [[nodiscard]] constexpr FlagHolder with(TTypes... types) { FlagHolder res = *this; res.set(types...); @@ -76,7 +76,7 @@ struct FlagHolder } template - constexpr FlagHolder without(TTypes... types) + [[nodiscard]] constexpr FlagHolder without(TTypes... types) { FlagHolder res = *this; res.unset(types...); diff --git a/src/openrct2/core/GroupVector.hpp b/src/openrct2/core/GroupVector.hpp index cb5a03f7a7b4..00ddcb13dd0d 100644 --- a/src/openrct2/core/GroupVector.hpp +++ b/src/openrct2/core/GroupVector.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Guard.cpp b/src/openrct2/core/Guard.cpp index dc318c885a1c..b844ec726f7f 100644 --- a/src/openrct2/core/Guard.cpp +++ b/src/openrct2/core/Guard.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -8,7 +8,9 @@ *****************************************************************************/ #ifdef _WIN32 - #include + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif #include #endif diff --git a/src/openrct2/core/Guard.hpp b/src/openrct2/core/Guard.hpp index 1160de6ff6a6..5da9e319e306 100644 --- a/src/openrct2/core/Guard.hpp +++ b/src/openrct2/core/Guard.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Http.Android.cpp b/src/openrct2/core/Http.Android.cpp index 244765ba6385..ad4c469f9184 100644 --- a/src/openrct2/core/Http.Android.cpp +++ b/src/openrct2/core/Http.Android.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Http.WinHttp.cpp b/src/openrct2/core/Http.WinHttp.cpp index a18cc5a733ea..71e9d7f7dc40 100644 --- a/src/openrct2/core/Http.WinHttp.cpp +++ b/src/openrct2/core/Http.WinHttp.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,6 +17,10 @@ #include #include + + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif #include #include @@ -232,7 +236,11 @@ namespace OpenRCT2::Http WinHttpCloseHandle(hSession); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hRequest); - throw; + + Response response; + response.status = Status::Error; + response.error = e.what(); + return response; } } } // namespace OpenRCT2::Http diff --git a/src/openrct2/core/Http.cURL.cpp b/src/openrct2/core/Http.cURL.cpp index 447a5ed0b64f..add4e4221d22 100644 --- a/src/openrct2/core/Http.cURL.cpp +++ b/src/openrct2/core/Http.cURL.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -84,81 +84,91 @@ namespace OpenRCT2::Http Response Do(const Request& req) { - CURL* curl = curl_easy_init(); - std::shared_ptr _(nullptr, [curl](...) { curl_easy_cleanup(curl); }); + try + { + CURL* curl = curl_easy_init(); + std::shared_ptr _(nullptr, [curl](...) { curl_easy_cleanup(curl); }); - if (!curl) - throw std::runtime_error("Failed to initialize curl"); + if (!curl) + throw std::runtime_error("Failed to initialize curl"); - Response res; - WriteThis wt; + Response res; + WriteThis wt; - if (req.method == Method::POST || req.method == Method::PUT) - { - wt.readptr = req.body.c_str(); - wt.sizeleft = req.body.size(); + if (req.method == Method::POST || req.method == Method::PUT) + { + wt.readptr = req.body.c_str(); + wt.sizeleft = req.body.size(); - curl_easy_setopt(curl, CURLOPT_READFUNCTION, ReadCallback); - curl_easy_setopt(curl, CURLOPT_READDATA, &wt); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast(wt.sizeleft)); - } + curl_easy_setopt(curl, CURLOPT_READFUNCTION, ReadCallback); + curl_easy_setopt(curl, CURLOPT_READDATA, &wt); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast(wt.sizeleft)); + } - if (req.forceIPv4) - curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); + if (req.forceIPv4) + curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); - if (req.method == Method::POST) - curl_easy_setopt(curl, CURLOPT_POST, 1L); + if (req.method == Method::POST) + curl_easy_setopt(curl, CURLOPT_POST, 1L); - if (req.method == Method::PUT) - curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + if (req.method == Method::PUT) + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); - curl_easy_setopt(curl, CURLOPT_URL, req.url.c_str()); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast(&res)); - curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, HeaderCallback); - curl_easy_setopt(curl, CURLOPT_HEADERDATA, static_cast(&res)); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); - curl_easy_setopt(curl, CURLOPT_USERAGENT, kOpenRCT2UserAgent); + curl_easy_setopt(curl, CURLOPT_URL, req.url.c_str()); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast(&res)); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, HeaderCallback); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, static_cast(&res)); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); + curl_easy_setopt(curl, CURLOPT_USERAGENT, kOpenRCT2UserAgent); - curl_slist* chunk = nullptr; - std::shared_ptr __(nullptr, [chunk](...) { curl_slist_free_all(chunk); }); - for (auto header : req.header) - { - std::string hs = header.first + ": " + header.second; - chunk = curl_slist_append(chunk, hs.c_str()); - } - if (req.header.size() != 0) - { - if (chunk == nullptr) + curl_slist* chunk = nullptr; + std::shared_ptr __(nullptr, [chunk](...) { curl_slist_free_all(chunk); }); + for (auto header : req.header) { - throw std::runtime_error("Failed to set headers"); + std::string hs = header.first + ": " + header.second; + chunk = curl_slist_append(chunk, hs.c_str()); + } + if (req.header.size() != 0) + { + if (chunk == nullptr) + { + throw std::runtime_error("Failed to set headers"); + } + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); } - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); - } - CURLcode curl_code = curl_easy_perform(curl); - if (curl_code != CURLE_OK) - { - using namespace std::literals; - throw std::runtime_error( - "Failed to perform request. curl error code: "s + std::to_string(curl_code) + ": " - + curl_easy_strerror(curl_code)); - } + CURLcode curl_code = curl_easy_perform(curl); + if (curl_code != CURLE_OK) + { + using namespace std::literals; + throw std::runtime_error( + "Failed to perform request. curl error code: "s + std::to_string(curl_code) + ": " + + curl_easy_strerror(curl_code)); + } - // gets freed by curl_easy_cleanup - char* content_type; - long code; - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); - curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &content_type); - res.status = static_cast(code); - if (content_type != nullptr) + // gets freed by curl_easy_cleanup + char* content_type; + long code; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &content_type); + res.status = static_cast(code); + if (content_type != nullptr) + { + res.content_type = std::string(content_type); + } + + return res; + } + catch (const std::exception& e) { - res.content_type = std::string(content_type); + Response response; + response.status = Status::Error; + response.error = e.what(); + return response; } - - return res; } } // namespace OpenRCT2::Http diff --git a/src/openrct2/core/Http.h b/src/openrct2/core/Http.h index cafd8e8de0ec..667a1bed3e51 100644 --- a/src/openrct2/core/Http.h +++ b/src/openrct2/core/Http.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,15 +12,16 @@ #ifndef DISABLE_HTTP #include + #include #include #include - #include namespace OpenRCT2::Http { enum class Status { Invalid = 0, + Error = 1, Ok = 200, NotFound = 404 }; @@ -52,9 +53,9 @@ namespace OpenRCT2::Http Response Do(const Request& req); - inline void DoAsync(const Request& req, std::function fn) + inline auto DoAsync(const Request& req, std::function fn) { - auto thread = std::thread([=]() { + return std::async(std::launch::async, [=]() { Response res{}; try { @@ -67,7 +68,6 @@ namespace OpenRCT2::Http } fn(res); }); - thread.detach(); } } // namespace OpenRCT2::Http diff --git a/src/openrct2/core/IStream.cpp b/src/openrct2/core/IStream.cpp index 9824a3a2028c..dac47978dffa 100644 --- a/src/openrct2/core/IStream.cpp +++ b/src/openrct2/core/IStream.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/IStream.hpp b/src/openrct2/core/IStream.hpp index fd0135d80463..c4db46b000d8 100644 --- a/src/openrct2/core/IStream.hpp +++ b/src/openrct2/core/IStream.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Identifier.hpp b/src/openrct2/core/Identifier.hpp index 9d0190774b55..fca9fa16710b 100644 --- a/src/openrct2/core/Identifier.hpp +++ b/src/openrct2/core/Identifier.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Imaging.cpp b/src/openrct2/core/Imaging.cpp index 24042a089848..38dd8656fbc7 100644 --- a/src/openrct2/core/Imaging.cpp +++ b/src/openrct2/core/Imaging.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Imaging.h b/src/openrct2/core/Imaging.h index 05200fe02fb2..281159d94b15 100644 --- a/src/openrct2/core/Imaging.h +++ b/src/openrct2/core/Imaging.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,7 +9,7 @@ #pragma once -#include "../drawing/Drawing.h" +#include "../drawing/ColourPalette.h" #include #include @@ -18,8 +18,6 @@ #include #include -struct RenderTarget; - enum class ImageFormat { unknown, diff --git a/src/openrct2/core/JobPool.cpp b/src/openrct2/core/JobPool.cpp index f2f087c71d66..5f2e9e3cb2df 100644 --- a/src/openrct2/core/JobPool.cpp +++ b/src/openrct2/core/JobPool.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/JobPool.h b/src/openrct2/core/JobPool.h index bc724ff30910..5835cc0e287c 100644 --- a/src/openrct2/core/JobPool.h +++ b/src/openrct2/core/JobPool.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Json.cpp b/src/openrct2/core/Json.cpp index d30ba56d1372..8217316d9a9d 100644 --- a/src/openrct2/core/Json.cpp +++ b/src/openrct2/core/Json.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Json.hpp b/src/openrct2/core/Json.hpp index e93c68db8c57..bc59eeded457 100644 --- a/src/openrct2/core/Json.hpp +++ b/src/openrct2/core/Json.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/JsonFwd.hpp b/src/openrct2/core/JsonFwd.hpp index f4f4c487455f..18feb097c400 100644 --- a/src/openrct2/core/JsonFwd.hpp +++ b/src/openrct2/core/JsonFwd.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Memory.hpp b/src/openrct2/core/Memory.hpp index 5e5cfbf8883f..7accb81dfe6f 100644 --- a/src/openrct2/core/Memory.hpp +++ b/src/openrct2/core/Memory.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/MemoryStream.cpp b/src/openrct2/core/MemoryStream.cpp index c3ad06a8e7fd..de3d3574708f 100644 --- a/src/openrct2/core/MemoryStream.cpp +++ b/src/openrct2/core/MemoryStream.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/MemoryStream.h b/src/openrct2/core/MemoryStream.h index ee5af581b8a4..ad0e7fc38759 100644 --- a/src/openrct2/core/MemoryStream.h +++ b/src/openrct2/core/MemoryStream.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Meta.hpp b/src/openrct2/core/Meta.hpp index f0e653897f5b..a4895a9ebb65 100644 --- a/src/openrct2/core/Meta.hpp +++ b/src/openrct2/core/Meta.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Money.hpp b/src/openrct2/core/Money.hpp index 2af65b4a05e1..ef803316f8f5 100644 --- a/src/openrct2/core/Money.hpp +++ b/src/openrct2/core/Money.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Numerics.hpp b/src/openrct2/core/Numerics.hpp index d85e04d90a49..3be6171b62c4 100644 --- a/src/openrct2/core/Numerics.hpp +++ b/src/openrct2/core/Numerics.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/OrcaStream.hpp b/src/openrct2/core/OrcaStream.hpp index 519dccd7ad55..093f27fbc7ed 100644 --- a/src/openrct2/core/OrcaStream.hpp +++ b/src/openrct2/core/OrcaStream.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -671,7 +671,10 @@ namespace OpenRCT2 { len = s.size(); } - _buffer.Write(s.data(), len); + if (len > 0) + { + _buffer.Write(s.data(), len); + } _buffer.Write(&nullt, sizeof(nullt)); } diff --git a/src/openrct2/core/Path.cpp b/src/openrct2/core/Path.cpp index 4880ba99c064..5a9f414b1ac3 100644 --- a/src/openrct2/core/Path.cpp +++ b/src/openrct2/core/Path.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Path.hpp b/src/openrct2/core/Path.hpp index 5bc2c034f282..7386b30541cc 100644 --- a/src/openrct2/core/Path.hpp +++ b/src/openrct2/core/Path.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/RTL.FriBidi.cpp b/src/openrct2/core/RTL.FriBidi.cpp index b428716eab07..e909e370e222 100644 --- a/src/openrct2/core/RTL.FriBidi.cpp +++ b/src/openrct2/core/RTL.FriBidi.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/RTL.ICU.cpp b/src/openrct2/core/RTL.ICU.cpp index 7d76b896e571..c1a12f979126 100644 --- a/src/openrct2/core/RTL.ICU.cpp +++ b/src/openrct2/core/RTL.ICU.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/RTL.h b/src/openrct2/core/RTL.h index 2383a1d64e5b..12b79448781c 100644 --- a/src/openrct2/core/RTL.h +++ b/src/openrct2/core/RTL.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Random.hpp b/src/openrct2/core/Random.hpp index 2d051b186ef5..3ac484af6c47 100644 --- a/src/openrct2/core/Random.hpp +++ b/src/openrct2/core/Random.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Range.hpp b/src/openrct2/core/Range.hpp index 49adfd9ee592..6e15dd643891 100644 --- a/src/openrct2/core/Range.hpp +++ b/src/openrct2/core/Range.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Speed.hpp b/src/openrct2/core/Speed.hpp index f1a14cf5d3f4..7246438f376b 100644 --- a/src/openrct2/core/Speed.hpp +++ b/src/openrct2/core/Speed.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/StreamBuffer.cpp b/src/openrct2/core/StreamBuffer.cpp index 9378bee9401f..d440bbc65ee9 100644 --- a/src/openrct2/core/StreamBuffer.cpp +++ b/src/openrct2/core/StreamBuffer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/StreamBuffer.hpp b/src/openrct2/core/StreamBuffer.hpp index 48d0a89732b9..cf1395085609 100644 --- a/src/openrct2/core/StreamBuffer.hpp +++ b/src/openrct2/core/StreamBuffer.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/String.cpp b/src/openrct2/core/String.cpp index 5efccf864924..276f80bf9b5e 100644 --- a/src/openrct2/core/String.cpp +++ b/src/openrct2/core/String.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -27,6 +27,9 @@ #include #include #else + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif #include #endif diff --git a/src/openrct2/core/String.hpp b/src/openrct2/core/String.hpp index 42b80cd787e2..abc6ef2326bb 100644 --- a/src/openrct2/core/String.hpp +++ b/src/openrct2/core/String.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/StringBuilder.cpp b/src/openrct2/core/StringBuilder.cpp index f8ff0df51952..ad334fab9e10 100644 --- a/src/openrct2/core/StringBuilder.cpp +++ b/src/openrct2/core/StringBuilder.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/StringBuilder.h b/src/openrct2/core/StringBuilder.h index 9787bafe2959..eb96e2d6fc66 100644 --- a/src/openrct2/core/StringBuilder.h +++ b/src/openrct2/core/StringBuilder.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/StringReader.cpp b/src/openrct2/core/StringReader.cpp index 952f2b0bdbb1..9f3f5e78b94e 100644 --- a/src/openrct2/core/StringReader.cpp +++ b/src/openrct2/core/StringReader.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/StringReader.h b/src/openrct2/core/StringReader.h index 717c4154f5ea..160b6ed9cdcd 100644 --- a/src/openrct2/core/StringReader.h +++ b/src/openrct2/core/StringReader.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/StringTypes.h b/src/openrct2/core/StringTypes.h index a60a2d0dec1c..77488a202aa1 100644 --- a/src/openrct2/core/StringTypes.h +++ b/src/openrct2/core/StringTypes.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Timer.hpp b/src/openrct2/core/Timer.hpp index cc7559751e24..5ee0973aa3b2 100644 --- a/src/openrct2/core/Timer.hpp +++ b/src/openrct2/core/Timer.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/UTF8.cpp b/src/openrct2/core/UTF8.cpp index 713ed89f69fc..f078075651e8 100644 --- a/src/openrct2/core/UTF8.cpp +++ b/src/openrct2/core/UTF8.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/UTF8.h b/src/openrct2/core/UTF8.h index f4bce12b36a5..10547e5adc54 100644 --- a/src/openrct2/core/UTF8.h +++ b/src/openrct2/core/UTF8.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/UnicodeChar.h b/src/openrct2/core/UnicodeChar.h index 03bfa62c4c46..29ca2f1edfac 100644 --- a/src/openrct2/core/UnicodeChar.h +++ b/src/openrct2/core/UnicodeChar.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/UnitConversion.cpp b/src/openrct2/core/UnitConversion.cpp index 8ed4b2aa6ef9..77b88ae87333 100644 --- a/src/openrct2/core/UnitConversion.cpp +++ b/src/openrct2/core/UnitConversion.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/UnitConversion.h b/src/openrct2/core/UnitConversion.h index 0c45c3f6c4b1..cd205f96f9a4 100644 --- a/src/openrct2/core/UnitConversion.h +++ b/src/openrct2/core/UnitConversion.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Zip.cpp b/src/openrct2/core/Zip.cpp index a8baf7756cf2..3cabcaf3f8e5 100644 --- a/src/openrct2/core/Zip.cpp +++ b/src/openrct2/core/Zip.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/Zip.h b/src/openrct2/core/Zip.h index b8c3c656ca17..fc840db04beb 100644 --- a/src/openrct2/core/Zip.h +++ b/src/openrct2/core/Zip.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,7 @@ #pragma once +#include #include #include #include diff --git a/src/openrct2/core/ZipAndroid.cpp b/src/openrct2/core/ZipAndroid.cpp index 13fb35b24d52..87a8ee0c741a 100644 --- a/src/openrct2/core/ZipAndroid.cpp +++ b/src/openrct2/core/ZipAndroid.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/core/ZipStream.hpp b/src/openrct2/core/ZipStream.hpp index aada34d302d2..89e397a0a90a 100644 --- a/src/openrct2/core/ZipStream.hpp +++ b/src/openrct2/core/ZipStream.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/AVX2Drawing.cpp b/src/openrct2/drawing/AVX2Drawing.cpp index 4672cc141895..a8eda8b118dc 100644 --- a/src/openrct2/drawing/AVX2Drawing.cpp +++ b/src/openrct2/drawing/AVX2Drawing.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/ColourPalette.h b/src/openrct2/drawing/ColourPalette.h index ee15a1b63c3f..4425568b9b38 100644 --- a/src/openrct2/drawing/ColourPalette.h +++ b/src/openrct2/drawing/ColourPalette.h @@ -5,6 +5,12 @@ namespace OpenRCT2::Drawing { + struct BGRColour + { + uint8_t blue{}; + uint8_t green{}; + uint8_t red{}; + }; struct PaletteBGRA { diff --git a/src/openrct2/drawing/Drawing.Sprite.BMP.cpp b/src/openrct2/drawing/Drawing.Sprite.BMP.cpp index 9509ddbee481..7f7fa2a0cf61 100644 --- a/src/openrct2/drawing/Drawing.Sprite.BMP.cpp +++ b/src/openrct2/drawing/Drawing.Sprite.BMP.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,12 +9,15 @@ #include "Drawing.h" +using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; + template static void FASTCALL DrawBMPSpriteMagnify(RenderTarget& rt, const DrawSpriteArgs& args) { auto& paletteMap = args.PalMap; auto src0 = args.SourceImage.offset; - auto dst = args.DestinationBits; + auto dst = reinterpret_cast(args.DestinationBits); auto srcX = args.SrcX; auto srcY = args.SrcY; auto width = args.Width; @@ -28,7 +31,8 @@ static void FASTCALL DrawBMPSpriteMagnify(RenderTarget& rt, const DrawSpriteArgs auto nextDst = dst + dstLineWidth; for (int32_t x = 0; x < width; x++, dst++) { - auto src = src0 + (srcLineWidth * zoom.ApplyTo(srcY + y) + zoom.ApplyTo(srcX + x)); + PaletteIndex* src = reinterpret_cast( + src0 + (srcLineWidth * zoom.ApplyTo(srcY + y) + zoom.ApplyTo(srcX + x))); BlitPixel(src, dst, paletteMap); } dst = nextDst; @@ -39,8 +43,8 @@ template static void FASTCALL DrawBMPSpriteMinify(RenderTarget& rt, const DrawSpriteArgs& args) { auto& g1 = args.SourceImage; - auto src = g1.offset + ((static_cast(g1.width) * args.SrcY) + args.SrcX); - auto dst = args.DestinationBits; + auto* src = reinterpret_cast(g1.offset + ((static_cast(g1.width) * args.SrcY) + args.SrcX)); + auto* dst = reinterpret_cast(args.DestinationBits); auto& paletteMap = args.PalMap; auto width = args.Width; auto height = args.Height; @@ -104,7 +108,7 @@ void FASTCALL GfxBmpSpriteToBuffer(RenderTarget& rt, const DrawSpriteArgs& args) // Used for glass. DrawBMPSprite(rt, args); } - else if (!(args.SourceImage.flags & G1_FLAG_HAS_TRANSPARENCY)) + else if (!args.SourceImage.flags.has(G1Flag::hasTransparency)) { // Copy raw bitmap data to target DrawBMPSprite(rt, args); diff --git a/src/openrct2/drawing/Drawing.Sprite.RLE.cpp b/src/openrct2/drawing/Drawing.Sprite.RLE.cpp index 0c0757387aee..7287d26484e7 100644 --- a/src/openrct2/drawing/Drawing.Sprite.RLE.cpp +++ b/src/openrct2/drawing/Drawing.Sprite.RLE.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,12 +12,14 @@ #include #include +using namespace OpenRCT2::Drawing; + template static void FASTCALL DrawRLESpriteMagnify(RenderTarget& rt, const DrawSpriteArgs& args) { auto& paletteMap = args.PalMap; auto imgData = args.SourceImage.offset; - auto dst = args.DestinationBits; + auto* dst = reinterpret_cast(args.DestinationBits); auto srcX = args.SrcX; auto srcY = args.SrcY; auto width = args.Width; @@ -27,7 +29,7 @@ static void FASTCALL DrawRLESpriteMagnify(RenderTarget& rt, const DrawSpriteArgs for (int32_t y = 0; y < height; y++) { - uint8_t* nextDst = dst + dstLineWidth; + PaletteIndex* nextDst = dst + dstLineWidth; const int32_t rowNum = zoom.ApplyTo(srcY + y); uint16_t lineOffset; std::memcpy(&lineOffset, &imgData[rowNum * sizeof(uint16_t)], sizeof(uint16_t)); @@ -49,7 +51,7 @@ static void FASTCALL DrawRLESpriteMagnify(RenderTarget& rt, const DrawSpriteArgs numPixels &= 0x7F; } if (pixelRunStart <= colNum && colNum < pixelRunStart + numPixels) - BlitPixel(data8 + colNum - pixelRunStart, dst, paletteMap); + BlitPixel(reinterpret_cast(data8 + colNum - pixelRunStart), dst, paletteMap); dst++; } @@ -86,7 +88,7 @@ static void FASTCALL DrawRLESpriteMinify(RenderTarget& rt, const DrawSpriteArgs& // This will move the pointer to the correct source line. uint16_t lineOffset = src0[y * 2] | (src0[y * 2 + 1] << 8); auto nextRun = src0 + lineOffset; - auto dstLineStart = dst0 + dstLineWidth * (i >> TZoom); + auto* dstLineStart = reinterpret_cast(dst0 + dstLineWidth * (i >> TZoom)); // For every data chunk in the line auto isEndOfLine = false; @@ -142,7 +144,7 @@ static void FASTCALL DrawRLESpriteMinify(RenderTarget& rt, const DrawSpriteArgs& auto& paletteMap = args.PalMap; while (numPixels > 0) { - BlitPixel(src, dst, paletteMap); + BlitPixel(reinterpret_cast(src), dst, paletteMap); numPixels -= zoom; src += zoom; dst++; diff --git a/src/openrct2/drawing/Drawing.Sprite.cpp b/src/openrct2/drawing/Drawing.Sprite.cpp index 5bd630f0fb6d..63c2266dcc28 100644 --- a/src/openrct2/drawing/Drawing.Sprite.cpp +++ b/src/openrct2/drawing/Drawing.Sprite.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,6 +30,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; using namespace OpenRCT2::Ui; /** @@ -38,7 +39,7 @@ using namespace OpenRCT2::Ui; * rct2: 0x0009ABE0C */ // clang-format off -static thread_local uint8_t secondaryRemapPalette[256] = { +static thread_local uint8_t kSecondaryRemapPalette[256] = { 0x00, 0xF3, 0xF4, 0xF5, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, @@ -58,7 +59,7 @@ static thread_local uint8_t secondaryRemapPalette[256] = { }; /** rct2: 0x009ABF0C */ -static thread_local uint8_t tertiaryRemapPalette[256] = { +static thread_local uint8_t kTertiaryRemapPalette[256] = { 0x00, 0xF3, 0xF4, 0xF5, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, @@ -121,7 +122,7 @@ static void OverrideElementOffsets(size_t index, G1Element& element) switch (index) { case 25285: - element.x_offset -= 1; + element.xOffset -= 1; break; case 25286: case 25317: @@ -287,24 +288,24 @@ static void OverrideElementOffsets(size_t index, G1Element& element) case 25850: case 25851: case 25852: - element.y_offset += 1; + element.yOffset += 1; break; case 25307: case 25315: case 25319: - element.x_offset -= 1; - element.y_offset += 1; + element.xOffset -= 1; + element.yOffset += 1; break; case 25802: - element.y_offset += 2; + element.yOffset += 2; break; } } static void ReadAndConvertGxDat(IStream* stream, size_t count, bool is_rctc, G1Element* elements) { - auto g1Elements32 = std::make_unique(count); - stream->Read(g1Elements32.get(), count * sizeof(RCTG1Element)); + auto g1Elements32 = std::make_unique(count); + stream->Read(g1Elements32.get(), count * sizeof(StoredG1Element)); if (is_rctc) { // Process RCTC's g1.dat file @@ -333,24 +334,24 @@ static void ReadAndConvertGxDat(IStream* stream, size_t count, bool is_rctc, G1E break; } - const RCTG1Element& src = g1Elements32[rctc]; + const StoredG1Element& src = g1Elements32[rctc]; // Double cast to silence compiler warning about casting to // pointer from integer of mismatched length. elements[i].offset = reinterpret_cast(static_cast(src.offset)); elements[i].width = src.width; elements[i].height = src.height; - elements[i].x_offset = src.x_offset; - elements[i].y_offset = src.y_offset; + elements[i].xOffset = src.xOffset; + elements[i].yOffset = src.yOffset; elements[i].flags = src.flags; - if (src.flags & G1_FLAG_HAS_ZOOM_SPRITE) + if (src.flags.has(G1Flag::hasZoomSprite)) { - elements[i].zoomed_offset = static_cast(i - rctc_to_rct2_index(rctc - src.zoomed_offset)); + elements[i].zoomedOffset = static_cast(i - rctc_to_rct2_index(rctc - src.zoomedOffset)); } else { - elements[i].zoomed_offset = src.zoomed_offset; + elements[i].zoomedOffset = src.zoomedOffset; } ++rctc; @@ -363,8 +364,8 @@ static void ReadAndConvertGxDat(IStream* stream, size_t count, bool is_rctc, G1E { for (auto i = 0u; i < SPR_PEEP_PICKUP_COUNT; ++i) { - elements[animation.start + i].x_offset -= animation.x_offset; - elements[animation.start + i].y_offset -= animation.y_offset; + elements[animation.start + i].xOffset -= animation.x_offset; + elements[animation.start + i].yOffset -= animation.y_offset; } } } @@ -372,17 +373,17 @@ static void ReadAndConvertGxDat(IStream* stream, size_t count, bool is_rctc, G1E { for (size_t i = 0; i < count; i++) { - const RCTG1Element& src = g1Elements32[i]; + const StoredG1Element& src = g1Elements32[i]; // Double cast to silence compiler warning about casting to // pointer from integer of mismatched length. elements[i].offset = reinterpret_cast(static_cast(src.offset)); elements[i].width = src.width; elements[i].height = src.height; - elements[i].x_offset = src.x_offset; - elements[i].y_offset = src.y_offset; + elements[i].xOffset = src.xOffset; + elements[i].yOffset = src.yOffset; elements[i].flags = src.flags; - elements[i].zoomed_offset = src.zoomed_offset; + elements[i].zoomedOffset = src.zoomedOffset; } } } @@ -437,7 +438,7 @@ static Gx _g2 = {}; static Gx _fonts = {}; static Gx _tracks = {}; static Gx _csg = {}; -static G1Element _scrollingText[kMaxScrollingTextEntries]{}; +static G1Element _scrollingText[Drawing::ScrollingText::kMaxEntries]{}; static bool _csgLoaded = false; static G1Element _g1Temp = {}; @@ -454,25 +455,25 @@ bool GfxLoadG1(const IPlatformEnvironment& env) { auto path = env.FindFile(DirBase::rct2, DirId::data, u8"g1.dat"); auto fs = FileStream(path, FileMode::open); - _g1.header = fs.ReadValue(); + _g1.header = fs.ReadValue(); - LOG_VERBOSE("g1.dat, number of entries: %u", _g1.header.num_entries); + LOG_VERBOSE("g1.dat, number of entries: %u", _g1.header.numEntries); - if (_g1.header.num_entries < SPR_G1_END) + if (_g1.header.numEntries < SPR_G1_END) { throw std::runtime_error("Not enough elements in g1.dat"); } // Read element headers - bool is_rctc = _g1.header.num_entries == SPR_RCTC_G1_END; - _g1.elements.resize(_g1.header.num_entries); - ReadAndConvertGxDat(&fs, _g1.header.num_entries, is_rctc, _g1.elements.data()); + bool is_rctc = _g1.header.numEntries == SPR_RCTC_G1_END; + _g1.elements.resize(_g1.header.numEntries); + ReadAndConvertGxDat(&fs, _g1.header.numEntries, is_rctc, _g1.elements.data()); // Read element data - _g1.data = fs.ReadArray(_g1.header.total_size); + _g1.data = fs.ReadArray(_g1.header.totalSize); // Fix entry data offsets - for (uint32_t i = 0; i < _g1.header.num_entries; i++) + for (uint32_t i = 0; i < _g1.header.numEntries; i++) { if (_g1.elements[i].offset == nullptr) { @@ -538,19 +539,19 @@ static bool GfxLoadOpenRCT2Gx(std::string filename, Gx& target, size_t expectedN try { auto fs = FileStream(path, FileMode::open); - target.header = fs.ReadValue(); + target.header = fs.ReadValue(); // Read element headers - target.elements.resize(target.header.num_entries); - ReadAndConvertGxDat(&fs, target.header.num_entries, false, target.elements.data()); + target.elements.resize(target.header.numEntries); + ReadAndConvertGxDat(&fs, target.header.numEntries, false, target.elements.data()); // Read element data - target.data = fs.ReadArray(target.header.total_size); + target.data = fs.ReadArray(target.header.totalSize); - if (target.header.num_entries != expectedNumItems) + if (target.header.numEntries != expectedNumItems) { std::string errorMessage = "Mismatched " + filename + " size.\nExpected: " + std::to_string(expectedNumItems) - + "\nActual: " + std::to_string(target.header.num_entries) + "\n" + filename + + "\nActual: " + std::to_string(target.header.numEntries) + "\n" + filename + " may be installed improperly.\nPath to " + filename + ": " + path; LOG_ERROR(errorMessage.c_str()); @@ -567,7 +568,7 @@ static bool GfxLoadOpenRCT2Gx(std::string filename, Gx& target, size_t expectedN } // Fix entry data offsets - for (uint32_t i = 0; i < target.header.num_entries; i++) + for (uint32_t i = 0; i < target.header.numEntries; i++) { if (target.elements[i].offset == nullptr) { @@ -621,8 +622,8 @@ bool GfxLoadCsg() size_t fileHeaderSize = fileHeader.GetLength(); size_t fileDataSize = fileData.GetLength(); - _csg.header.num_entries = static_cast(fileHeaderSize / sizeof(RCTG1Element)); - _csg.header.total_size = static_cast(fileDataSize); + _csg.header.numEntries = static_cast(fileHeaderSize / sizeof(StoredG1Element)); + _csg.header.totalSize = static_cast(fileDataSize); if (!CsgIsUsable(_csg)) { @@ -631,14 +632,14 @@ bool GfxLoadCsg() } // Read element headers - _csg.elements.resize(_csg.header.num_entries); - ReadAndConvertGxDat(&fileHeader, _csg.header.num_entries, false, _csg.elements.data()); + _csg.elements.resize(_csg.header.numEntries); + ReadAndConvertGxDat(&fileHeader, _csg.header.numEntries, false, _csg.elements.data()); // Read element data - _csg.data = fileData.ReadArray(_csg.header.total_size); + _csg.data = fileData.ReadArray(_csg.header.totalSize); // Fix entry data offsets - for (uint32_t i = 0; i < _csg.header.num_entries; i++) + for (uint32_t i = 0; i < _csg.header.numEntries; i++) { if (_csg.elements[i].offset == nullptr) { @@ -649,9 +650,9 @@ bool GfxLoadCsg() _csg.elements[i].offset += reinterpret_cast(_csg.data.get()); } // RCT1 used zoomed offsets that counted from the beginning of the file, rather than from the current sprite. - if (_csg.elements[i].flags & G1_FLAG_HAS_ZOOM_SPRITE) + if (_csg.elements[i].flags.has(G1Flag::hasZoomSprite)) { - _csg.elements[i].zoomed_offset = i - _csg.elements[i].zoomed_offset; + _csg.elements[i].zoomedOffset = i - _csg.elements[i].zoomedOffset; } } _csgLoaded = true; @@ -674,14 +675,14 @@ std::optional GfxLoadGx(const std::vector& buffer) OpenRCT2::MemoryStream istream(buffer.data(), buffer.size()); Gx gx; - gx.header = istream.ReadValue(); + gx.header = istream.ReadValue(); // Read element headers - gx.elements.resize(gx.header.num_entries); - ReadAndConvertGxDat(&istream, gx.header.num_entries, false, gx.elements.data()); + gx.elements.resize(gx.header.numEntries); + ReadAndConvertGxDat(&istream, gx.header.numEntries, false, gx.elements.data()); // Read element data - gx.data = istream.ReadArray(gx.header.total_size); + gx.data = istream.ReadArray(gx.header.totalSize); return std::make_optional(std::move(gx)); } @@ -701,14 +702,14 @@ static std::optional FASTCALL GfxDrawSpriteGetPalette(ImageId imageI { paletteId &= 0x7F; } - return GetPaletteMapForColour(paletteId); + return GetPaletteMapForColour(static_cast(paletteId)); } - auto paletteMap = PaletteMap(secondaryRemapPalette); + auto paletteMap = PaletteMap(std::span(reinterpret_cast(kSecondaryRemapPalette), 256)); if (imageId.HasTertiary()) { - paletteMap = PaletteMap(tertiaryRemapPalette); - auto tertiaryPaletteMap = GetPaletteMapForColour(imageId.GetTertiary()); + paletteMap = PaletteMap(std::span(reinterpret_cast(kTertiaryRemapPalette), 256)); + auto tertiaryPaletteMap = GetPaletteMapForColour(static_cast(imageId.GetTertiary())); if (tertiaryPaletteMap.has_value()) { paletteMap.Copy( @@ -716,13 +717,13 @@ static std::optional FASTCALL GfxDrawSpriteGetPalette(ImageId imageI } } - auto primaryPaletteMap = GetPaletteMapForColour(imageId.GetPrimary()); + auto primaryPaletteMap = GetPaletteMapForColour(static_cast(imageId.GetPrimary())); if (primaryPaletteMap.has_value()) { paletteMap.Copy(kPaletteOffsetRemapPrimary, primaryPaletteMap.value(), kPaletteOffsetRemapPrimary, kPaletteLengthRemap); } - auto secondaryPaletteMap = GetPaletteMapForColour(imageId.GetSecondary()); + auto secondaryPaletteMap = GetPaletteMapForColour(static_cast(imageId.GetSecondary())); if (secondaryPaletteMap.has_value()) { paletteMap.Copy( @@ -750,7 +751,7 @@ void FASTCALL GfxDrawSpriteSoftware(RenderTarget& rt, const ImageId imageId, con * image_id (ebx) and also (0x00EDF81C) * palette_pointer (0x9ABDA4) * unknown_pointer (0x9E3CDC) - * dpi (edi) + * rt (edi) * x (cx) * y (dx) */ @@ -767,7 +768,7 @@ void FASTCALL GfxDrawSpritePaletteSetSoftware( return; } - if (zoomLevel > ZoomLevel{ 0 } && (g1->flags & G1_FLAG_HAS_ZOOM_SPRITE)) + if (zoomLevel > ZoomLevel{ 0 } && g1->flags.has(G1Flag::hasZoomSprite)) { RenderTarget zoomedRT = rt; zoomedRT.bits = rt.bits; @@ -780,11 +781,11 @@ void FASTCALL GfxDrawSpritePaletteSetSoftware( const auto spriteCoords = ScreenCoordsXY{ coords.x / 2, coords.y / 2 }; GfxDrawSpritePaletteSetSoftware( - zoomedRT, imageId.WithIndex(imageId.GetIndex() - g1->zoomed_offset), spriteCoords, paletteMap); + zoomedRT, imageId.WithIndex(imageId.GetIndex() - g1->zoomedOffset), spriteCoords, paletteMap); return; } - if (zoomLevel > ZoomLevel{ 0 } && (g1->flags & G1_FLAG_NO_ZOOM_DRAW)) + if (zoomLevel > ZoomLevel{ 0 } && g1->flags.has(G1Flag::noZoomDraw)) { return; } @@ -794,11 +795,11 @@ void FASTCALL GfxDrawSpritePaletteSetSoftware( // For the moment, I've added this block here just for magnification with the old code continuing below. if (zoomLevel < ZoomLevel{ 0 }) { - ScreenCoordsXY spriteTopLeft = { zoomLevel.ApplyInversedTo(coords.x + g1->x_offset), - zoomLevel.ApplyInversedTo(coords.y + g1->y_offset) }; + ScreenCoordsXY spriteTopLeft = { zoomLevel.ApplyInversedTo(coords.x + g1->xOffset), + zoomLevel.ApplyInversedTo(coords.y + g1->yOffset) }; - ScreenCoordsXY spriteBottomLeft{ zoomLevel.ApplyInversedTo(coords.x + g1->x_offset + g1->width), - zoomLevel.ApplyInversedTo(coords.y + g1->y_offset + g1->height) }; + ScreenCoordsXY spriteBottomLeft{ zoomLevel.ApplyInversedTo(coords.x + g1->xOffset + g1->width), + zoomLevel.ApplyInversedTo(coords.y + g1->yOffset + g1->height) }; const int32_t width = std::min(spriteBottomLeft.x, rt.x + rt.width) - std::max(spriteTopLeft.x, rt.x); const int32_t height = std::min(spriteBottomLeft.y, rt.y + rt.height) - std::max(spriteTopLeft.y, rt.y); @@ -819,7 +820,7 @@ void FASTCALL GfxDrawSpritePaletteSetSoftware( const int32_t zoom_mask = zoomLevel > ZoomLevel{ 0 } ? zoomLevel.ApplyTo(0xFFFFFFFF) : 0xFFFFFFFF; - if (zoomLevel > ZoomLevel{ 0 } && g1->flags & G1_FLAG_RLE_COMPRESSION) + if (zoomLevel > ZoomLevel{ 0 } && g1->flags.has(G1Flag::hasRLECompression)) { x -= ~zoom_mask; y -= ~zoom_mask; @@ -829,11 +830,11 @@ void FASTCALL GfxDrawSpritePaletteSetSoftware( int32_t height = g1->height; // This is the start y coordinate on the destination - int16_t dest_start_y = y + g1->y_offset; + int16_t dest_start_y = y + g1->yOffset; // For whatever reason the RLE version does not use // the zoom mask on the y coordinate but does on x. - if (g1->flags & G1_FLAG_RLE_COMPRESSION) + if (g1->flags.has(G1Flag::hasRLECompression)) { dest_start_y -= rt.WorldY(); } @@ -861,7 +862,7 @@ void FASTCALL GfxDrawSpritePaletteSetSoftware( } else { - if ((g1->flags & G1_FLAG_RLE_COMPRESSION) && zoomLevel > ZoomLevel{ 0 }) + if (g1->flags.has(G1Flag::hasRLECompression) && zoomLevel > ZoomLevel{ 0 }) { source_start_y -= dest_start_y & ~zoom_mask; height += dest_start_y & ~zoom_mask; @@ -888,7 +889,7 @@ void FASTCALL GfxDrawSpritePaletteSetSoftware( // This is the source start x coordinate int32_t source_start_x = 0; // This is the destination start x coordinate - int16_t dest_start_x = ((x + g1->x_offset + ~zoom_mask) & zoom_mask) - rt.WorldX(); + int16_t dest_start_x = ((x + g1->xOffset + ~zoom_mask) & zoom_mask) - rt.WorldX(); if (dest_start_x < 0) { @@ -907,7 +908,7 @@ void FASTCALL GfxDrawSpritePaletteSetSoftware( } else { - if ((g1->flags & G1_FLAG_RLE_COMPRESSION) && zoomLevel > ZoomLevel{ 0 }) + if (g1->flags.has(G1Flag::hasRLECompression) && zoomLevel > ZoomLevel{ 0 }) { source_start_x -= dest_start_x & ~zoom_mask; } @@ -937,11 +938,11 @@ void FASTCALL GfxDrawSpritePaletteSetSoftware( void FASTCALL GfxSpriteToBuffer(RenderTarget& rt, const DrawSpriteArgs& args) { - if (args.SourceImage.flags & G1_FLAG_RLE_COMPRESSION) + if (args.SourceImage.flags.has(G1Flag::hasRLECompression)) { GfxRleSpriteToBuffer(rt, args); } - else if (!(args.SourceImage.flags & G1_FLAG_1)) + else if (!args.SourceImage.flags.has(G1Flag::one)) { GfxBmpSpriteToBuffer(rt, args); } @@ -965,7 +966,7 @@ void FASTCALL GfxDrawSpriteRawMaskedSoftware( } // Must have transparency in order to pass check - if (!(imgMask->flags & G1_FLAG_HAS_TRANSPARENCY) || !(imgColour->flags & G1_FLAG_HAS_TRANSPARENCY)) + if (!imgMask->flags.has(G1Flag::hasTransparency) || !imgColour->flags.has(G1Flag::hasTransparency)) { GfxDrawSpriteSoftware(rt, colourImage, scrCoords); return; @@ -980,7 +981,7 @@ void FASTCALL GfxDrawSpriteRawMaskedSoftware( width = zoom.ApplyInversedTo(std::min(imgMask->width, imgColour->width)); height = zoom.ApplyInversedTo(std::min(imgMask->height, imgColour->height)); - ScreenCoordsXY offsetCoords = scrCoords + ScreenCoordsXY{ imgMask->x_offset, imgMask->y_offset }; + ScreenCoordsXY offsetCoords = scrCoords + ScreenCoordsXY{ imgMask->xOffset, imgMask->yOffset }; offsetCoords.x = zoom.ApplyInversedTo(offsetCoords.x); offsetCoords.y = zoom.ApplyInversedTo(offsetCoords.y); @@ -1045,7 +1046,7 @@ const G1Element* GfxGetG1Element(ImageIndex image_id) else if (offset < SPR_G2_END) { size_t idx = offset - SPR_G2_BEGIN; - if (idx < _g2.header.num_entries) + if (idx < _g2.header.numEntries) { return &_g2.elements[idx]; } @@ -1055,7 +1056,7 @@ const G1Element* GfxGetG1Element(ImageIndex image_id) else if (offset < SPR_FONTS_END) { size_t idx = offset - SPR_FONTS_BEGIN; - if (idx < _fonts.header.num_entries) + if (idx < _fonts.header.numEntries) { return &_fonts.elements[idx]; } @@ -1065,7 +1066,7 @@ const G1Element* GfxGetG1Element(ImageIndex image_id) else if (offset < SPR_TRACKS_END) { size_t idx = offset - SPR_TRACKS_BEGIN; - if (idx < _tracks.header.num_entries) + if (idx < _tracks.header.numEntries) { return &_tracks.elements[idx]; } @@ -1077,7 +1078,7 @@ const G1Element* GfxGetG1Element(ImageIndex image_id) if (IsCsgLoaded()) { size_t idx = offset - SPR_CSG_BEGIN; - if (idx < _csg.header.num_entries) + if (idx < _csg.header.numEntries) { return &_csg.elements[idx]; } @@ -1104,6 +1105,15 @@ const G1Element* GfxGetG1Element(ImageIndex image_id) return nullptr; } +const G1Palette* GfxGetG1Palette(ImageIndex imageId) +{ + const auto* element = GfxGetG1Element(imageId); + if (element == nullptr) + return nullptr; + + return element->asPalette(); +} + void GfxSetG1Element(ImageIndex imageId, const G1Element* g1) { bool isTemp = imageId == SPR_TEMP; @@ -1160,12 +1170,12 @@ bool IsCsgLoaded() size_t G1CalculateDataSize(const G1Element* g1) { - if (g1->flags & G1_FLAG_PALETTE) + if (const auto* asPalette = g1->asPalette()) { - return g1->width * 3; + return asPalette->numColours * 3; } - if (g1->flags & G1_FLAG_RLE_COMPRESSION) + if (g1->flags.has(G1Flag::hasRLECompression)) { if (g1->offset == nullptr) { diff --git a/src/openrct2/drawing/Drawing.String.cpp b/src/openrct2/drawing/Drawing.String.cpp index 0c151260f52e..6575f814fa28 100644 --- a/src/openrct2/drawing/Drawing.String.cpp +++ b/src/openrct2/drawing/Drawing.String.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,6 +16,7 @@ #include "../core/String.hpp" #include "../core/UTF8.h" #include "../core/UnicodeChar.h" +#include "../drawing/Drawing.h" #include "../drawing/IDrawingContext.h" #include "../drawing/IDrawingEngine.h" #include "../drawing/Text.h" @@ -27,6 +28,7 @@ #include "TTF.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; static int32_t TTFGetStringWidth(std::string_view text, FontStyle fontStyle, bool noFormatting); @@ -274,45 +276,38 @@ void GfxDrawStringLeftCentred( /** * Changes the palette so that the next character changes colour */ -static void ColourCharacter(TextColour colour, bool withOutline, uint8_t* palette_pointer) +static void ColourCharacter(Drawing::TextColour colour, bool withOutline, Drawing::TextColours& textPalette) { - int32_t colour32 = 0; - const G1Element* g1 = GfxGetG1Element(SPR_TEXT_PALETTE); - if (g1 != nullptr) - { - uint32_t idx = EnumValue(colour) * 4; - std::memcpy(&colour32, &g1->offset[idx], sizeof(colour32)); - } + auto mapping = Drawing::getTextColourMapping(colour); if (!withOutline) { - colour32 = colour32 & 0x0FF0000FF; + mapping.sunnyOutline = PaletteIndex::pi0; + mapping.shadowOutline = PaletteIndex::pi0; } - // Adjust text palette. Store current colour? - palette_pointer[1] = colour32 & 0xFF; - palette_pointer[2] = (colour32 >> 8) & 0xFF; - palette_pointer[3] = (colour32 >> 16) & 0xFF; - palette_pointer[4] = (colour32 >> 24) & 0xFF; + + textPalette = mapping; } /** * Changes the palette so that the next character changes colour * This is specific to changing to a predefined window related colour */ -static void ColourCharacterWindow(colour_t colour, bool withOutline, uint8_t* palette_pointer) +static void ColourCharacterWindow(colour_t colour, bool withOutline, Drawing::TextColours& textPalette) { - int32_t eax; + Drawing::TextColours mapping = { + ColourMapA[colour].colour_11, + PaletteIndex::pi0, + PaletteIndex::pi0, + }; - eax = ColourMapA[colour].colour_11; if (withOutline) { - eax |= 0x0A0A00; + mapping.sunnyOutline = PaletteIndex::pi10; + mapping.shadowOutline = PaletteIndex::pi10; } - // Adjust text palette. Store current colour? - palette_pointer[1] = eax & 0xFF; - palette_pointer[2] = (eax >> 8) & 0xFF; - palette_pointer[3] = (eax >> 16) & 0xFF; - palette_pointer[4] = (eax >> 24) & 0xFF; + + textPalette = mapping; } /** @@ -323,7 +318,7 @@ static void ColourCharacterWindow(colour_t colour, bool withOutline, uint8_t* pa * top : dx * numLines : bp * text : esi - * dpi : edi + * rt : edi */ void DrawStringCentredRaw( RenderTarget& rt, const ScreenCoordsXY& coords, int32_t numLines, const utf8* text, FontStyle fontStyle) @@ -416,7 +411,7 @@ int32_t StringGetHeightRaw(std::string_view text, FontStyle fontStyle) * x : cx * y : dx * text : esi - * dpi : edi + * rt : edi * width : bp * ticks : ebp >> 16 */ @@ -491,7 +486,12 @@ static void TTFDrawCharacterSprite(RenderTarget& rt, int32_t codepoint, TextDraw screenCoords.y += *info->yOffset++; } - PaletteMap paletteMap(info->palette); + PaletteIndex palette[8]{}; + palette[1] = info->palette.fill; + palette[2] = info->palette.sunnyOutline; + palette[3] = info->palette.shadowOutline; + + PaletteMap paletteMap(palette); GfxDrawGlyph(rt, sprite, screenCoords, paletteMap); } @@ -753,38 +753,30 @@ static void TTFProcessInitialColour(ColourWithFlags colour, TextDrawInfo* info) info->colourFlags = colour.flags; if (!colour.flags.has(ColourFlag::inset)) { - ColourCharacterWindow( - colour.colour, info->colourFlags.has(ColourFlag::withOutline), reinterpret_cast(&info->palette)); + ColourCharacterWindow(colour.colour, info->colourFlags.has(ColourFlag::withOutline), info->palette); } else { - uint32_t eax = 0; + Drawing::TextColours newPalette = {}; switch (info->darkness) { case TextDarkness::extraDark: - eax = ColourMapA[colour.colour].mid_light; - eax = eax << 16; - eax = eax | ColourMapA[colour.colour].dark; + newPalette.fill = ColourMapA[colour.colour].dark; + newPalette.shadowOutline = ColourMapA[colour.colour].mid_light; break; case TextDarkness::dark: - eax = ColourMapA[colour.colour].light; - eax = eax << 16; - eax = eax | ColourMapA[colour.colour].mid_dark; + newPalette.fill = ColourMapA[colour.colour].mid_dark; + newPalette.shadowOutline = ColourMapA[colour.colour].light; break; case TextDarkness::regular: - eax = ColourMapA[colour.colour].lighter; - eax = eax << 16; - eax = eax | ColourMapA[colour.colour].mid_light; + newPalette.fill = ColourMapA[colour.colour].mid_light; + newPalette.shadowOutline = ColourMapA[colour.colour].lighter; break; } - // Adjust text palette. Store current colour? ; - info->palette[1] = eax & 0xFF; - info->palette[2] = (eax >> 8) & 0xFF; - info->palette[3] = (eax >> 16) & 0xFF; - info->palette[4] = (eax >> 24) & 0xFF; + info->palette = newPalette; } } } @@ -814,10 +806,10 @@ void TTFDrawString( info.textDrawFlags.set(TextDrawFlag::noFormatting); } - std::memcpy(info.palette, gTextPalette, sizeof(info.palette)); + info.palette = gTextPalette; TTFProcessInitialColour(colour, &info); TTFProcessString(rt, text, &info); - std::memcpy(gTextPalette, info.palette, sizeof(info.palette)); + gTextPalette = info.palette; rt.lastStringPos = { info.x, info.y }; } @@ -873,10 +865,10 @@ void GfxDrawStringWithYOffsets( info.textDrawFlags.set(TextDrawFlag::ttf); } - std::memcpy(info.palette, gTextPalette, sizeof(info.palette)); + info.palette = gTextPalette; TTFProcessInitialColour(colour, &info); TTFProcessString(rt, text, &info); - std::memcpy(gTextPalette, info.palette, sizeof(info.palette)); + gTextPalette = info.palette; rt.lastStringPos = { info.x, info.y }; } diff --git a/src/openrct2/drawing/Drawing.String.h b/src/openrct2/drawing/Drawing.String.h index 8ef8e1432c65..249bd1d37ca2 100644 --- a/src/openrct2/drawing/Drawing.String.h +++ b/src/openrct2/drawing/Drawing.String.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../core/FlagHolder.hpp" #include "../interface/Colour.h" #include "../interface/ColourWithFlags.h" +#include "TextColour.h" #include @@ -38,7 +39,7 @@ struct TextDrawInfo TextDrawFlags textDrawFlags{}; OpenRCT2::ColourFlags colourFlags{}; TextDarkness darkness{}; - uint8_t palette[8]{}; + OpenRCT2::Drawing::TextColours palette{}; FontStyle fontStyle{}; const int8_t* yOffset{}; }; diff --git a/src/openrct2/drawing/Drawing.cpp b/src/openrct2/drawing/Drawing.cpp index c32f59fdac30..2cbea2cee9b7 100644 --- a/src/openrct2/drawing/Drawing.cpp +++ b/src/openrct2/drawing/Drawing.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,7 +17,6 @@ #include "../SpriteIds.h" #include "../config/Config.h" #include "../core/Guard.hpp" -#include "../object/Object.h" #include "../object/ObjectEntryManager.h" #include "../object/WaterEntry.h" #include "../platform/Platform.h" @@ -36,8 +35,11 @@ using namespace OpenRCT2; using namespace OpenRCT2::Drawing; static auto _defaultPaletteMapping = []() { - std::array res; - std::iota(res.begin(), res.end(), 0); + std::array res; + for (size_t i = 0; i < std::size(res); i++) + { + res[i] = static_cast(i); + } return res; }(); @@ -46,33 +48,35 @@ PaletteMap PaletteMap::GetDefault() return PaletteMap(_defaultPaletteMapping); } -uint8_t& PaletteMap::operator[](size_t index) +PaletteIndex& PaletteMap::operator[](size_t index) { return _data[index]; } -uint8_t PaletteMap::operator[](size_t index) const +PaletteIndex PaletteMap::operator[](size_t index) const { return _data[index]; } -uint8_t PaletteMap::Blend(uint8_t src, uint8_t dst) const +PaletteIndex PaletteMap::Blend(PaletteIndex src, PaletteIndex dst) const { #ifdef _DEBUG // src = 0 would be transparent so there is no blend palette for that, hence (src - 1) - assert(src != 0 && (src - 1) < _numMaps); - assert(dst < _mapLength); + assert(src != PaletteIndex::pi0 && (EnumValue(src) - 1) < _numMaps); + assert(EnumValue(dst) < _mapLength); #endif - auto idx = ((src - 1) * 256) + dst; + auto idx = ((EnumValue(src) - 1) * 256) + EnumValue(dst); return _data[idx]; } -void PaletteMap::Copy(size_t dstIndex, const PaletteMap& src, size_t srcIndex, size_t length) +void PaletteMap::Copy(PaletteIndex dstIndex, const PaletteMap& src, PaletteIndex srcIndex, size_t length) { - auto maxLength = std::min(_data.size() - srcIndex, _data.size() - dstIndex); + auto srcOffset = EnumValue(srcIndex); + auto dstOffset = EnumValue(dstIndex); + auto maxLength = std::min(_data.size() - srcOffset, _data.size() - dstOffset); assert(length <= maxLength); auto copyLength = std::min(length, maxLength); - std::copy(src._data.begin() + srcIndex, src._data.begin() + srcIndex + copyLength, _data.begin() + dstIndex); + std::copy(src._data.begin() + srcOffset, src._data.begin() + srcOffset + copyLength, _data.begin() + dstOffset); } OpenRCT2::Drawing::GamePalette gPalette; @@ -84,8 +88,10 @@ int32_t gPickupPeepX; int32_t gPickupPeepY; // Originally 0x9ABE04 -uint8_t gTextPalette[0x8] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +OpenRCT2::Drawing::TextColours gTextPalette = { + PaletteIndex::pi0, + PaletteIndex::pi0, + PaletteIndex::pi0, }; bool gPaintForceRedraw{ false }; @@ -692,29 +698,28 @@ void GfxFilterPixel(RenderTarget& rt, const ScreenCoordsXY& coords, FilterPalett * a1 (ebx) * product (cl) */ -void GfxTransposePalette(int32_t pal, uint8_t product) +void GfxTransposePalette(ImageIndex pal, uint8_t product) { - const G1Element* g1 = GfxGetG1Element(pal); - if (g1 != nullptr) - { - int32_t width = g1->width; - int32_t x = g1->x_offset; - uint8_t* source_pointer = g1->offset; + const auto* g1 = GfxGetG1Palette(pal); + if (g1 == nullptr) + return; - for (; width > 0; width--) - { - auto& dest_pointer = gGamePalette[x]; - // Make sure the image never gets darker than the void colour (not-quite-block), to the background colour jumping - // between void and 100% black. - dest_pointer.Blue = std::max(35, ((source_pointer[0] * product) >> 8)); - dest_pointer.Green = std::max(35, ((source_pointer[1] * product) >> 8)); - dest_pointer.Red = std::max(23, ((source_pointer[2] * product) >> 8)); - source_pointer += 3; - - x++; - } - UpdatePalette(gGamePalette, 10, 236); + auto index = g1->startIndex; + auto* src = g1->palette; + + for (auto numColours = g1->numColours; numColours > 0; numColours--) + { + auto& dst = gGamePalette[index]; + // Make sure the image never gets darker than the void colour (not-quite-black), to avoid the background colour + // jumping between void and 100% black. + dst.Blue = std::max(35, ((src->blue * product) >> 8)); + dst.Green = std::max(35, ((src->green * product) >> 8)); + dst.Red = std::max(23, ((src->red * product) >> 8)); + src++; + + index++; } + UpdatePalette(gGamePalette, PaletteIndex::pi10, 236); } /** @@ -737,23 +742,22 @@ void LoadPalette() palette = water_type->image_id; } - const G1Element* g1 = GfxGetG1Element(palette); + const auto* g1 = GfxGetG1Palette(palette); if (g1 != nullptr) { - int32_t width = g1->width; - int32_t x = g1->x_offset; - uint8_t* src = g1->offset; - for (; width > 0; width--) + auto index = g1->startIndex; + auto* src = g1->palette; + for (auto numColours = g1->numColours; numColours > 0; numColours--) { - auto& dst = gGamePalette[x]; - dst.Blue = src[0]; - dst.Green = src[1]; - dst.Red = src[2]; - src += 3; - x++; + auto& dst = gGamePalette[index]; + dst.Blue = src->blue; + dst.Green = src->green; + dst.Red = src->red; + src++; + index++; } } - UpdatePalette(gGamePalette, 10, 236); + UpdatePalette(gGamePalette, PaletteIndex::pi10, 236); GfxInvalidateScreen(); } @@ -775,7 +779,7 @@ void GfxInvalidateScreen() * height (dx) * drawpixelinfo (edi) */ -bool ClipDrawPixelInfo(RenderTarget& dst, RenderTarget& src, const ScreenCoordsXY& coords, int32_t width, int32_t height) +bool ClipRenderTarget(RenderTarget& dst, RenderTarget& src, const ScreenCoordsXY& coords, int32_t width, int32_t height) { assert(src.zoom_level == ZoomLevel{ 0 }); int32_t right = coords.x + width; @@ -833,8 +837,8 @@ void GfxInvalidatePickedUpPeep() auto* g1 = GfxGetG1Element(imageId); if (g1 != nullptr) { - int32_t left = gPickupPeepX + g1->x_offset; - int32_t top = gPickupPeepY + g1->y_offset; + int32_t left = gPickupPeepX + g1->xOffset; + int32_t top = gPickupPeepY + g1->yOffset; int32_t right = left + g1->width; int32_t bottom = top + g1->height; GfxSetDirtyBlocks({ { left, top }, { right, bottom } }); @@ -850,16 +854,16 @@ void GfxDrawPickedUpPeep(RenderTarget& rt) } } -std::optional GetPaletteG1Index(colour_t paletteId) +std::optional GetPaletteG1Index(FilterPaletteID paletteId) { - if (paletteId < kPaletteTotalOffsets) + if (EnumValue(paletteId) < kPaletteTotalOffsets) { - return kPaletteToG1Offset[paletteId]; + return kPaletteToG1Offset[EnumValue(paletteId)]; } return std::nullopt; } -std::optional GetPaletteMapForColour(colour_t paletteId) +std::optional GetPaletteMapForColour(FilterPaletteID paletteId) { auto g1Index = GetPaletteG1Index(paletteId); if (g1Index.has_value()) @@ -867,37 +871,20 @@ std::optional GetPaletteMapForColour(colour_t paletteId) auto g1 = GfxGetG1Element(g1Index.value()); if (g1 != nullptr) { - return PaletteMap(g1->offset, g1->height, g1->width); + return PaletteMap(reinterpret_cast(g1->offset), g1->height, g1->width); } } return std::nullopt; } -uint8_t* RenderTarget::GetBitsOffset(const ScreenCoordsXY& pos) const -{ - return bits + pos.x + pos.y * LineStride(); -} - -RenderTarget RenderTarget::Crop(const ScreenCoordsXY& pos, const ScreenSize& size) const -{ - RenderTarget result = *this; - result.bits = GetBitsOffset(pos); - result.x = pos.x; - result.y = pos.y; - result.width = size.width; - result.height = size.height; - result.pitch = width + pitch - size.width; - return result; -} - FilterPaletteID GetGlassPaletteId(colour_t c) { return kGlassPaletteIds[c]; } -void UpdatePalette(std::span palette, int32_t start_index, int32_t num_colours) +void UpdatePalette(std::span palette, PaletteIndex startIndex, int32_t numColours) { - for (int32_t i = start_index; i < num_colours + start_index; i++) + for (int32_t i = EnumValue(startIndex); i < numColours + EnumValue(startIndex); i++) { const auto& colour = palette[i]; uint8_t b = colour.Blue; @@ -968,17 +955,18 @@ void UpdatePaletteEffects() { palette = water_type->image_id; } - const G1Element* g1 = GfxGetG1Element(palette); + const auto* g1 = GfxGetG1Palette(palette); if (g1 != nullptr) { - int32_t xoffset = g1->x_offset; + auto startIndex = g1->startIndex; - for (int32_t i = 0; i < g1->width; i++) + for (int32_t i = 0; i < g1->numColours; i++) { - auto& paletteOffset = gGamePalette[xoffset + i]; - paletteOffset.Blue = -((0xFF - g1->offset[(i * 3) + 0]) / 2) - 1; - paletteOffset.Green = -((0xFF - g1->offset[(i * 3) + 1]) / 2) - 1; - paletteOffset.Red = -((0xFF - g1->offset[(i * 3) + 2]) / 2) - 1; + auto& paletteOffset = gGamePalette[startIndex + i]; + const auto& g1PaletteEntry = g1->palette[i]; + paletteOffset.Blue = -((0xFF - g1PaletteEntry.blue) / 2) - 1; + paletteOffset.Green = -((0xFF - g1PaletteEntry.green) / 2) - 1; + paletteOffset.Red = -((0xFF - g1PaletteEntry.red) / 2) - 1; } UpdatePalette(gGamePalette, kPaletteOffsetDynamic, kPaletteLengthDynamic); @@ -997,17 +985,18 @@ void UpdatePaletteEffects() palette = water_type->image_id; } - const G1Element* g1 = GfxGetG1Element(palette); + const auto* g1 = GfxGetG1Palette(palette); if (g1 != nullptr) { - int32_t xoffset = g1->x_offset; + auto startIndex = g1->startIndex; - for (int32_t i = 0; i < g1->width; i++) + for (int32_t i = 0; i < g1->numColours; i++) { - auto& paletteOffset = gGamePalette[xoffset + i]; - paletteOffset.Blue = g1->offset[(i * 3) + 0]; - paletteOffset.Green = g1->offset[(i * 3) + 1]; - paletteOffset.Red = g1->offset[(i * 3) + 2]; + auto& paletteOffset = gGamePalette[startIndex + i]; + const auto& g1PaletteEntry = g1->palette[i]; + paletteOffset.Blue = g1PaletteEntry.blue; + paletteOffset.Green = g1PaletteEntry.green; + paletteOffset.Red = g1PaletteEntry.red; } } } @@ -1033,21 +1022,21 @@ void UpdatePaletteEffects() { waterId = water_type->palette_index_1; } - const G1Element* g1 = GfxGetG1Element(shade + waterId); + const auto* g1 = GfxGetG1Palette(shade + waterId); if (g1 != nullptr) { - uint8_t* vs = &g1->offset[j * 3]; + const auto* g1PaletteEntry = &g1->palette[j]; int32_t n = kPaletteLengthWaterWaves; for (int32_t i = 0; i < n; i++) { - auto& vd = gGamePalette[kPaletteOffsetWaterWaves + i]; - vd.Blue = vs[0]; - vd.Green = vs[1]; - vd.Red = vs[2]; - vs += 9; - if (vs >= &g1->offset[9 * n]) + auto& vd = gGamePalette[EnumValue(kPaletteOffsetWaterWaves) + i]; + vd.Blue = g1PaletteEntry->blue; + vd.Green = g1PaletteEntry->green; + vd.Red = g1PaletteEntry->red; + g1PaletteEntry += 3; + if (g1PaletteEntry >= &g1->palette[3 * n]) { - vs -= 9 * n; + g1PaletteEntry -= 3 * n; } } } @@ -1058,42 +1047,42 @@ void UpdatePaletteEffects() waterId = water_type->palette_index_2; } - g1 = GfxGetG1Element(shade + waterId); + g1 = GfxGetG1Palette(shade + waterId); if (g1 != nullptr) { - uint8_t* vs = &g1->offset[j * 3]; + auto* src = &g1->palette[j]; int32_t n = kPaletteLengthWaterSparkles; for (int32_t i = 0; i < n; i++) { - auto& vd = gGamePalette[kPaletteOffsetWaterSparkles + i]; - vd.Blue = vs[0]; - vd.Green = vs[1]; - vd.Red = vs[2]; - vs += 9; - if (vs >= &g1->offset[9 * n]) + auto& vd = gGamePalette[EnumValue(kPaletteOffsetWaterSparkles) + i]; + vd.Blue = src->blue; + vd.Green = src->green; + vd.Red = src->red; + src += 3; + if (src >= &g1->palette[3 * n]) { - vs -= 9 * n; + src -= 3 * n; } } } j = (static_cast(gPaletteEffectFrame * -960) * 3) >> 16; waterId = SPR_GAME_PALETTE_4; - g1 = GfxGetG1Element(shade + waterId); + g1 = GfxGetG1Palette(shade + waterId); if (g1 != nullptr) { - uint8_t* vs = &g1->offset[j * 3]; - int32_t n = 3; + auto* src = &g1->palette[j]; + const int32_t n = 3; for (int32_t i = 0; i < n; i++) { - auto& vd = gGamePalette[PaletteIndex::pi243 + i]; - vd.Blue = vs[0]; - vd.Green = vs[1]; - vd.Red = vs[2]; - vs += 3; - if (vs >= &g1->offset[3 * n]) + auto& vd = gGamePalette[EnumValue(PaletteIndex::pi243) + i]; + vd.Blue = src->blue; + vd.Green = src->green; + vd.Red = src->red; + src++; + if (src >= &g1->palette[3]) { - vs -= 3 * n; + src -= n; } } } @@ -1122,7 +1111,7 @@ void ToggleWindowedMode() Config::Save(); } -void DebugDPI(RenderTarget& rt) +void DebugRT(RenderTarget& rt) { ScreenCoordsXY topLeft = { rt.x, rt.y }; ScreenCoordsXY bottomRight = { rt.x + rt.width - 1, rt.y + rt.height - 1 }; diff --git a/src/openrct2/drawing/Drawing.h b/src/openrct2/drawing/Drawing.h index ca70996546b4..0f508aa475fb 100644 --- a/src/openrct2/drawing/Drawing.h +++ b/src/openrct2/drawing/Drawing.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,9 +15,13 @@ #include "../interface/ZoomLevel.h" #include "../world/Location.hpp" #include "ColourPalette.h" +#include "FilterPaletteIds.h" #include "Font.h" +#include "G1Element.h" #include "ImageId.hpp" +#include "RenderTarget.h" #include "Text.h" +#include "TextColour.h" #include #include @@ -40,101 +44,8 @@ namespace OpenRCT2 namespace OpenRCT2::Drawing { struct IDrawingEngine; -} - -struct G1Element -{ - uint8_t* offset = nullptr; // 0x00 - int16_t width = 0; // 0x04 - int16_t height = 0; // 0x06 - int16_t x_offset = 0; // 0x08 - int16_t y_offset = 0; // 0x0A - uint16_t flags = 0; // 0x0C - int32_t zoomed_offset = 0; // 0x0E -}; - -#pragma pack(push, 1) -struct RCTG1Header -{ - uint32_t num_entries = 0; - uint32_t total_size = 0; -}; -static_assert(sizeof(RCTG1Header) == 8); -#pragma pack(pop) - -struct Gx -{ - RCTG1Header header; - std::vector elements; - std::unique_ptr data; -}; - -struct RenderTarget -{ - uint8_t* bits{}; - int32_t x{}; - int32_t y{}; - int32_t width{}; - int32_t height{}; - int32_t pitch{}; // note: this is actually (pitch - width) - int32_t cullingX{}; - int32_t cullingY{}; - int32_t cullingWidth{}; - int32_t cullingHeight{}; - ZoomLevel zoom_level{}; - - // Last position of drawn text. - ScreenCoordsXY lastStringPos{}; - - OpenRCT2::Drawing::IDrawingEngine* DrawingEngine{}; - - uint8_t* GetBitsOffset(const ScreenCoordsXY& pos) const; - RenderTarget Crop(const ScreenCoordsXY& pos, const ScreenSize& size) const; - - [[nodiscard]] constexpr int32_t WorldX() const - { - return zoom_level.ApplyTo(x); - } - [[nodiscard]] constexpr int32_t WorldY() const - { - return zoom_level.ApplyTo(y); - } - [[nodiscard]] constexpr int32_t WorldWidth() const - { - return zoom_level.ApplyTo(width); - } - [[nodiscard]] constexpr int32_t WorldHeight() const - { - return zoom_level.ApplyTo(height); - } - - [[nodiscard]] constexpr int32_t LineStride() const - { - return width + pitch; - } -}; - -struct RCTG1Element -{ - uint32_t offset; // 0x00 note: uint32_t always! - int16_t width; // 0x04 - int16_t height; // 0x06 - int16_t x_offset; // 0x08 - int16_t y_offset; // 0x0A - uint16_t flags; // 0x0C - uint16_t zoomed_offset; // 0x0E -}; -static_assert(sizeof(RCTG1Element) == 0x10); - -enum -{ - G1_FLAG_HAS_TRANSPARENCY = (1 << 0), // Image data contains transparent pixels (0XFF) which will not be rendered - G1_FLAG_1 = (1 << 1), - G1_FLAG_RLE_COMPRESSION = (1 << 2), // Image data is encoded using RCT2's form of run length encoding - G1_FLAG_PALETTE = (1 << 3), // Image data is a sequence of palette entries R8G8B8 - G1_FLAG_HAS_ZOOM_SPRITE = (1 << 4), // Use a different sprite for higher zoom levels - G1_FLAG_NO_ZOOM_DRAW = (1 << 5), // Does not get drawn at higher zoom levels (only zoom 0) -}; + enum class FilterPaletteID : int32_t; +} // namespace OpenRCT2::Drawing using DrawBlendOp = uint8_t; @@ -158,157 +69,15 @@ constexpr DrawBlendOp kBlendSrc = 1 << 1; */ constexpr DrawBlendOp kBlendDst = 2 << 2; -enum class FilterPaletteID : int32_t -{ - paletteNull = 0, - - paletteWater = COLOUR_COUNT, - - paletteLandMarker0, // North (corner/edge) - paletteLandMarker1, // East (corner/edge) - paletteLandMarker2, // South (corner/edge) - paletteLandMarker3, // West (corner/edge) - paletteSceneryGroundMarker, - paletteWaterMarker, - paletteQuarterMarker0, // North (not sure why it couldn't just use PaletteLandMarker0) - paletteQuarterMarker1, // East - paletteQuarterMarker2, // South - paletteQuarterMarker3, // West - paletteRideGroundMarker, - paletteGhost, // Construction marker - palette45, // Decolourise + lighten - palette46, - - paletteDarken3, - - paletteDarken1 = paletteDarken3 + 2, - paletteDarken2, - palette51, // Decolourise + darken - paletteTranslucentGrey, - paletteTranslucentGreyHighlight, - paletteTranslucentGreyShadow, - paletteTranslucentLightBlue, - paletteTranslucentLightBlueHighlight, - paletteTranslucentLightBlueShadow, - paletteTranslucentBordeauxRed, - paletteTranslucentBordeauxRedHighlight, - paletteTranslucentBordeauxRedShadow, - paletteTranslucentDarkGreen, - paletteTranslucentDarkGreenHighlight, - paletteTranslucentDarkGreenShadow, - paletteTranslucentLightPurple, - paletteTranslucentLightPurpleHighlight, - paletteTranslucentLightPurpleShadow, - paletteTranslucentDarkOliveGreen, - paletteTranslucentDarkOliveGreenHighlight, - paletteTranslucentDarkOliveGreenShadow, - paletteTranslucentLightBrown, - paletteTranslucentLightBrownHighlight, - paletteTranslucentLightBrownShadow, - paletteTranslucentYellow, - paletteTranslucentYellowHighlight, - paletteTranslucentYellowShadow, - paletteTranslucentMossGreen, - paletteTranslucentMossGreenHighlight, - paletteTranslucentMossGreenShadow, - paletteTranslucentOliveGreen, - paletteTranslucentOliveGreenHighlight, - paletteTranslucentOliveGreenShadow, - paletteTranslucentBrightGreen, - paletteTranslucentBrightGreenHighlight, - paletteTranslucentBrightGreenShadow, - paletteTranslucentSalmonPink, - paletteTranslucentSalmonPinkHighlight, - paletteTranslucentSalmonPinkShadow, - paletteTranslucentBrightPurple, - paletteTranslucentBrightPurpleHighlight, - paletteTranslucentBrightPurpleShadow, - paletteTranslucentBrightRed, - paletteTranslucentBrightRedHighlight, - paletteTranslucentBrightRedShadow, - paletteTranslucentLightOrange, - paletteTranslucentLightOrangeHighlight, - paletteTranslucentLightOrangeShadow, - paletteTranslucentTeal, - paletteTranslucentTealHighlight, - paletteTranslucentTealShadow, - paletteTranslucentBrightPink, - paletteTranslucentBrightPinkHighlight, - paletteTranslucentBrightPinkShadow, - paletteTranslucentDarkBrown, - paletteTranslucentDarkBrownHighlight, - paletteTranslucentDarkBrownShadow, - paletteTranslucentLightPink, - paletteTranslucentLightPinkHighlight, - paletteTranslucentLightPinkShadow, - paletteTranslucentWhite, - paletteTranslucentWhiteHighlight, - paletteTranslucentWhiteShadow, - paletteGlass, - paletteGlassBlack = paletteGlass + COLOUR_BLACK, - paletteGlassGrey = paletteGlass + COLOUR_GREY, - paletteGlassWhite = paletteGlass + COLOUR_WHITE, - paletteGlassDarkPurple = paletteGlass + COLOUR_DARK_PURPLE, - paletteGlassLightPurple = paletteGlass + COLOUR_LIGHT_PURPLE, - paletteGlassBrightPurple = paletteGlass + COLOUR_BRIGHT_PURPLE, - paletteGlassDarkBlue = paletteGlass + COLOUR_DARK_BLUE, - paletteGlassLightBlue = paletteGlass + COLOUR_LIGHT_BLUE, - paletteGlassIcyBlue = paletteGlass + COLOUR_ICY_BLUE, - paletteGlassTeal = paletteGlass + COLOUR_TEAL, - paletteGlassAquamarine = paletteGlass + COLOUR_AQUAMARINE, - paletteGlassSaturatedGreen = paletteGlass + COLOUR_SATURATED_GREEN, - paletteGlassDarkGreen = paletteGlass + COLOUR_DARK_GREEN, - paletteGlassMossGreen = paletteGlass + COLOUR_MOSS_GREEN, - paletteGlassBrightGreen = paletteGlass + COLOUR_BRIGHT_GREEN, - paletteGlassOliveGreen = paletteGlass + COLOUR_OLIVE_GREEN, - paletteGlassDarkOliveGreen = paletteGlass + COLOUR_DARK_OLIVE_GREEN, - paletteGlassBrightYellow = paletteGlass + COLOUR_BRIGHT_YELLOW, - paletteGlassYellow = paletteGlass + COLOUR_YELLOW, - paletteGlassDarkYellow = paletteGlass + COLOUR_DARK_YELLOW, - paletteGlassLightOrange = paletteGlass + COLOUR_LIGHT_ORANGE, - paletteGlassDarkOrange = paletteGlass + COLOUR_DARK_ORANGE, - paletteGlassLightBrown = paletteGlass + COLOUR_LIGHT_BROWN, - paletteGlassSaturatedBrown = paletteGlass + COLOUR_SATURATED_BROWN, - paletteGlassDarkBrown = paletteGlass + COLOUR_DARK_BROWN, - paletteGlassSalmonPink = paletteGlass + COLOUR_SALMON_PINK, - paletteGlassBordeauxRed = paletteGlass + COLOUR_BORDEAUX_RED, - paletteGlassSaturatedRed = paletteGlass + COLOUR_SATURATED_RED, - paletteGlassBrightRed = paletteGlass + COLOUR_BRIGHT_RED, - paletteGlassDarkPink = paletteGlass + COLOUR_DARK_PINK, - paletteGlassBrightPink = paletteGlass + COLOUR_BRIGHT_PINK, - paletteGlassLightPink = paletteGlass + COLOUR_LIGHT_PINK, - paletteGlassDarkOliveDark = paletteGlass + COLOUR_DARK_OLIVE_DARK, - paletteGlassDarkOliveLight = paletteGlass + COLOUR_DARK_OLIVE_LIGHT, - paletteGlassSaturatedBrownLight = paletteGlass + COLOUR_SATURATED_BROWN_LIGHT, - paletteGlassBordeauxRedDark = paletteGlass + COLOUR_BORDEAUX_RED_DARK, - paletteGlassBordeauxRedLight = paletteGlass + COLOUR_BORDEAUX_RED_LIGHT, - paletteGlassGrassGreenDark = paletteGlass + COLOUR_GRASS_GREEN_DARK, - paletteGlassGrassGreenLight = paletteGlass + COLOUR_GRASS_GREEN_LIGHT, - paletteGlassOliveDark = paletteGlass + COLOUR_OLIVE_DARK, - paletteGlassOliveLight = paletteGlass + COLOUR_OLIVE_LIGHT, - paletteGlassSaturatedGreenLight = paletteGlass + COLOUR_SATURATED_GREEN_LIGHT, - paletteGlassTanDark = paletteGlass + COLOUR_TAN_DARK, - paletteGlassTanLight = paletteGlass + COLOUR_TAN_LIGHT, - paletteGlassDullPurpleLight = paletteGlass + COLOUR_DULL_PURPLE_LIGHT, - paletteGlassDullGreenDark = paletteGlass + COLOUR_DULL_GREEN_DARK, - paletteGlassDullGreenLight = paletteGlass + COLOUR_DULL_GREEN_LIGHT, - paletteGlassSaturatedPurpleDark = paletteGlass + COLOUR_SATURATED_PURPLE_DARK, - paletteGlassSaturatedPurpleLight = paletteGlass + COLOUR_SATURATED_PURPLE_LIGHT, - paletteGlassOrangeLight = paletteGlass + COLOUR_ORANGE_LIGHT, - paletteGlassAquaDark = paletteGlass + COLOUR_AQUA_DARK, - paletteGlassMagentaLight = paletteGlass + COLOUR_MAGENTA_LIGHT, - paletteGlassDullBrownDark = paletteGlass + COLOUR_DULL_BROWN_DARK, - paletteGlassDullBrownLight = paletteGlass + COLOUR_DULL_BROWN_LIGHT, - paletteGlassInvisible = paletteGlass + COLOUR_INVISIBLE, - paletteGlassVoid = paletteGlass + COLOUR_VOID, -}; - -struct TranslucentWindowPalette +namespace OpenRCT2::Drawing { - FilterPaletteID base; - FilterPaletteID highlight; - FilterPaletteID shadow; -}; + struct TranslucentWindowPalette + { + FilterPaletteID base; + FilterPaletteID highlight; + FilterPaletteID shadow; + }; +} // namespace OpenRCT2::Drawing /** * Represents an 8-bit indexed map that maps from one palette index to another. @@ -316,7 +85,7 @@ struct TranslucentWindowPalette struct PaletteMap { private: - std::span _data{}; + std::span _data{}; #ifdef _DEBUG // We only require those fields for the asserts in debug builds. size_t _numMaps{}; @@ -328,7 +97,7 @@ struct PaletteMap constexpr PaletteMap() = default; - constexpr PaletteMap(uint8_t* data, size_t numMaps, size_t mapLength) + constexpr PaletteMap(OpenRCT2::Drawing::PaletteIndex* data, size_t numMaps, size_t mapLength) : _data{ data, numMaps * mapLength } #ifdef _DEBUG , _numMaps(numMaps) @@ -337,7 +106,7 @@ struct PaletteMap { } - constexpr PaletteMap(std::span map) + constexpr PaletteMap(std::span map) : _data(map) #ifdef _DEBUG , _numMaps(1) @@ -346,18 +115,20 @@ struct PaletteMap { } - uint8_t& operator[](size_t index); - uint8_t operator[](size_t index) const; + OpenRCT2::Drawing::PaletteIndex& operator[](size_t index); + OpenRCT2::Drawing::PaletteIndex operator[](size_t index) const; - uint8_t Blend(uint8_t src, uint8_t dst) const; - void Copy(size_t dstIndex, const PaletteMap& src, size_t srcIndex, size_t length); + OpenRCT2::Drawing::PaletteIndex Blend(OpenRCT2::Drawing::PaletteIndex src, OpenRCT2::Drawing::PaletteIndex dst) const; + void Copy( + OpenRCT2::Drawing::PaletteIndex dstIndex, const PaletteMap& src, OpenRCT2::Drawing::PaletteIndex srcIndex, + size_t length); }; struct DrawSpriteArgs { ImageId Image; PaletteMap PalMap; - const G1Element& SourceImage; + const OpenRCT2::G1Element& SourceImage; int32_t SrcX; int32_t SrcY; int32_t Width; @@ -365,8 +136,8 @@ struct DrawSpriteArgs uint8_t* DestinationBits; DrawSpriteArgs( - ImageId image, const PaletteMap& palMap, const G1Element& sourceImage, int32_t srcX, int32_t srcY, int32_t width, - int32_t height, uint8_t* destinationBits) + ImageId image, const PaletteMap& palMap, const OpenRCT2::G1Element& sourceImage, int32_t srcX, int32_t srcY, + int32_t width, int32_t height, uint8_t* destinationBits) : Image(image) , PalMap(palMap) , SourceImage(sourceImage) @@ -380,12 +151,13 @@ struct DrawSpriteArgs }; template -bool FASTCALL BlitPixel(const uint8_t* src, uint8_t* dst, const PaletteMap& paletteMap) +bool FASTCALL + BlitPixel(const OpenRCT2::Drawing::PaletteIndex* src, OpenRCT2::Drawing::PaletteIndex* dst, const PaletteMap& paletteMap) { if constexpr (TBlendOp & kBlendTransparent) { // Ignore transparent pixels - if (*src == 0) + if (*src == OpenRCT2::Drawing::PaletteIndex::pi0) { return false; } @@ -396,7 +168,7 @@ bool FASTCALL BlitPixel(const uint8_t* src, uint8_t* dst, const PaletteMap& pale auto pixel = paletteMap.Blend(*src, *dst); if constexpr (TBlendOp & kBlendTransparent) { - if (pixel == 0) + if (pixel == OpenRCT2::Drawing::PaletteIndex::pi0) { return false; } @@ -406,10 +178,10 @@ bool FASTCALL BlitPixel(const uint8_t* src, uint8_t* dst, const PaletteMap& pale } else if constexpr ((TBlendOp & kBlendSrc) != 0) { - auto pixel = paletteMap[*src]; + auto pixel = paletteMap[EnumValue(*src)]; if constexpr (TBlendOp & kBlendTransparent) { - if (pixel == 0) + if (pixel == OpenRCT2::Drawing::PaletteIndex::pi0) { return false; } @@ -419,10 +191,10 @@ bool FASTCALL BlitPixel(const uint8_t* src, uint8_t* dst, const PaletteMap& pale } else if constexpr ((TBlendOp & kBlendDst) != 0) { - auto pixel = paletteMap[*dst]; + auto pixel = paletteMap[EnumValue(*dst)]; if constexpr (TBlendOp & kBlendTransparent) { - if (pixel == 0) + if (pixel == OpenRCT2::Drawing::PaletteIndex::pi0) { return false; } @@ -454,39 +226,41 @@ void FASTCALL BlitPixels(const uint8_t* src, uint8_t* dst, const PaletteMap& pal constexpr uint8_t kPaletteTotalOffsets = 192; -constexpr int8_t kMaxScrollingTextModes = 38; - extern OpenRCT2::Drawing::GamePalette gPalette; extern OpenRCT2::Drawing::GamePalette gGamePalette; extern uint32_t gPaletteEffectFrame; -extern uint8_t gTextPalette[]; -extern const TranslucentWindowPalette kTranslucentWindowPalettes[COLOUR_COUNT]; +extern OpenRCT2::Drawing::TextColours gTextPalette; +extern const OpenRCT2::Drawing::TranslucentWindowPalette kTranslucentWindowPalettes[COLOUR_COUNT]; extern ImageId gPickupPeepImage; extern int32_t gPickupPeepX; extern int32_t gPickupPeepY; extern bool gPaintForceRedraw; -bool ClipDrawPixelInfo(RenderTarget& dst, RenderTarget& src, const ScreenCoordsXY& coords, int32_t width, int32_t height); +bool ClipRenderTarget( + OpenRCT2::Drawing::RenderTarget& dst, OpenRCT2::Drawing::RenderTarget& src, const ScreenCoordsXY& coords, int32_t width, + int32_t height); void GfxSetDirtyBlocks(const ScreenRect& rect); void GfxInvalidateScreen(); // palette -void GfxTransposePalette(int32_t pal, uint8_t product); +void GfxTransposePalette(ImageIndex pal, uint8_t product); void LoadPalette(); // other -void GfxClear(RenderTarget& rt, uint8_t paletteIndex); -void GfxFilterPixel(RenderTarget& rt, const ScreenCoordsXY& coords, FilterPaletteID palette); +void GfxClear(OpenRCT2::Drawing::RenderTarget& rt, OpenRCT2::Drawing::PaletteIndex paletteIndex); +void GfxFilterPixel( + OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, OpenRCT2::Drawing::FilterPaletteID palette); void GfxInvalidatePickedUpPeep(); -void GfxDrawPickedUpPeep(RenderTarget& rt); +void GfxDrawPickedUpPeep(OpenRCT2::Drawing::RenderTarget& rt); // line -void GfxDrawLine(RenderTarget& rt, const ScreenLine& line, int32_t colour); -void GfxDrawLineSoftware(RenderTarget& rt, const ScreenLine& line, int32_t colour); +void GfxDrawLine(OpenRCT2::Drawing::RenderTarget& rt, const ScreenLine& line, OpenRCT2::Drawing::PaletteIndex colour); +void GfxDrawLineSoftware(OpenRCT2::Drawing::RenderTarget& rt, const ScreenLine& line, OpenRCT2::Drawing::PaletteIndex colour); void GfxDrawDashedLine( - RenderTarget& rt, const ScreenLine& screenLine, const int32_t dashedLineSegmentLength, const int32_t color); + OpenRCT2::Drawing::RenderTarget& rt, const ScreenLine& screenLine, const int32_t dashedLineSegmentLength, + OpenRCT2::Drawing::PaletteIndex colour); // sprite bool GfxLoadG1(const OpenRCT2::IPlatformEnvironment& env); @@ -495,36 +269,41 @@ bool GfxLoadCsg(); void GfxUnloadG1(); void GfxUnloadG2AndFonts(); void GfxUnloadCsg(); -const G1Element* GfxGetG1Element(const ImageId imageId); -const G1Element* GfxGetG1Element(ImageIndex image_id); -void GfxSetG1Element(ImageIndex imageId, const G1Element* g1); -std::optional GfxLoadGx(const std::vector& buffer); +const OpenRCT2::G1Element* GfxGetG1Element(const ImageId imageId); +const OpenRCT2::G1Element* GfxGetG1Element(ImageIndex image_id); +const OpenRCT2::G1Palette* GfxGetG1Palette(ImageIndex imageId); +void GfxSetG1Element(ImageIndex imageId, const OpenRCT2::G1Element* g1); +std::optional GfxLoadGx(const std::vector& buffer); bool IsCsgLoaded(); -void FASTCALL GfxSpriteToBuffer(RenderTarget& rt, const DrawSpriteArgs& args); -void FASTCALL GfxBmpSpriteToBuffer(RenderTarget& rt, const DrawSpriteArgs& args); -void FASTCALL GfxRleSpriteToBuffer(RenderTarget& rt, const DrawSpriteArgs& args); -void FASTCALL GfxDrawSprite(RenderTarget& rt, const ImageId image_id, const ScreenCoordsXY& coords); -void FASTCALL GfxDrawGlyph(RenderTarget& rt, const ImageId image, const ScreenCoordsXY& coords, const PaletteMap& paletteMap); -void FASTCALL GfxDrawSpriteSolid(RenderTarget& rt, const ImageId image, const ScreenCoordsXY& coords, uint8_t colour); +void FASTCALL GfxSpriteToBuffer(OpenRCT2::Drawing::RenderTarget& rt, const DrawSpriteArgs& args); +void FASTCALL GfxBmpSpriteToBuffer(OpenRCT2::Drawing::RenderTarget& rt, const DrawSpriteArgs& args); +void FASTCALL GfxRleSpriteToBuffer(OpenRCT2::Drawing::RenderTarget& rt, const DrawSpriteArgs& args); +void FASTCALL GfxDrawSprite(OpenRCT2::Drawing::RenderTarget& rt, const ImageId image_id, const ScreenCoordsXY& coords); +void FASTCALL GfxDrawGlyph( + OpenRCT2::Drawing::RenderTarget& rt, const ImageId image, const ScreenCoordsXY& coords, const PaletteMap& paletteMap); +void FASTCALL GfxDrawSpriteSolid( + OpenRCT2::Drawing::RenderTarget& rt, const ImageId image, const ScreenCoordsXY& coords, + OpenRCT2::Drawing::PaletteIndex colour); +void FASTCALL GfxDrawSpriteRawMasked( + OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, const ImageId maskImage, const ImageId colourImage); void FASTCALL - GfxDrawSpriteRawMasked(RenderTarget& rt, const ScreenCoordsXY& coords, const ImageId maskImage, const ImageId colourImage); -void FASTCALL GfxDrawSpriteSoftware(RenderTarget& rt, const ImageId imageId, const ScreenCoordsXY& spriteCoords); + GfxDrawSpriteSoftware(OpenRCT2::Drawing::RenderTarget& rt, const ImageId imageId, const ScreenCoordsXY& spriteCoords); void FASTCALL GfxDrawSpritePaletteSetSoftware( - RenderTarget& rt, const ImageId imageId, const ScreenCoordsXY& coords, const PaletteMap& paletteMap); + OpenRCT2::Drawing::RenderTarget& rt, const ImageId imageId, const ScreenCoordsXY& coords, const PaletteMap& paletteMap); void FASTCALL GfxDrawSpriteRawMaskedSoftware( - RenderTarget& rt, const ScreenCoordsXY& scrCoords, const ImageId maskImage, const ImageId colourImage); + OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& scrCoords, const ImageId maskImage, const ImageId colourImage); // string void GfxDrawStringLeftCentred( - RenderTarget& rt, StringId format, void* args, ColourWithFlags colour, const ScreenCoordsXY& coords); + OpenRCT2::Drawing::RenderTarget& rt, StringId format, void* args, ColourWithFlags colour, const ScreenCoordsXY& coords); void DrawStringCentredRaw( - RenderTarget& rt, const ScreenCoordsXY& coords, int32_t numLines, const utf8* text, FontStyle fontStyle); + OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, int32_t numLines, const utf8* text, FontStyle fontStyle); void DrawNewsTicker( - RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, colour_t colour, StringId format, u8string_view args, - int32_t ticks); + OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, colour_t colour, StringId format, + u8string_view args, int32_t ticks); void GfxDrawStringWithYOffsets( - RenderTarget& rt, const utf8* text, ColourWithFlags colour, const ScreenCoordsXY& coords, const int8_t* yOffsets, - bool forceSpriteFont, FontStyle fontStyle); + OpenRCT2::Drawing::RenderTarget& rt, const utf8* text, ColourWithFlags colour, const ScreenCoordsXY& coords, + const int8_t* yOffsets, bool forceSpriteFont, FontStyle fontStyle); int32_t GfxWrapString(u8string_view text, int32_t width, FontStyle fontStyle, u8string* outWrappedText, int32_t* outNumLines); int32_t GfxGetStringWidth(std::string_view text, FontStyle fontStyle); @@ -534,23 +313,10 @@ int32_t StringGetHeightRaw(std::string_view text, FontStyle fontStyle); int32_t GfxClipString(char* buffer, int32_t width, FontStyle fontStyle); u8string ShortenPath(const u8string& path, int32_t availableWidth, FontStyle fontStyle); void TTFDrawString( - RenderTarget& rt, const_utf8string text, ColourWithFlags colour, const ScreenCoordsXY& coords, bool noFormatting, - FontStyle fontStyle, TextDarkness darkness); - -// scrolling text -void ScrollingTextInitialiseBitmaps(); -void ScrollingTextInvalidate(); - -namespace OpenRCT2 -{ - class Formatter; -} - -ImageId ScrollingTextSetup( - struct PaintSession& session, StringId stringId, OpenRCT2::Formatter& ft, uint16_t scroll, uint16_t scrollingMode, - colour_t colour); + OpenRCT2::Drawing::RenderTarget& rt, const_utf8string text, ColourWithFlags colour, const ScreenCoordsXY& coords, + bool noFormatting, FontStyle fontStyle, TextDarkness darkness); -size_t G1CalculateDataSize(const G1Element* g1); +size_t G1CalculateDataSize(const OpenRCT2::G1Element* g1); void MaskScalar( int32_t width, int32_t height, const uint8_t* RESTRICT maskSrc, const uint8_t* RESTRICT colourSrc, uint8_t* RESTRICT dst, @@ -566,14 +332,15 @@ void MaskFn( int32_t width, int32_t height, const uint8_t* RESTRICT maskSrc, const uint8_t* RESTRICT colourSrc, uint8_t* RESTRICT dst, int32_t maskWrap, int32_t colourWrap, int32_t dstWrap); -std::optional GetPaletteG1Index(colour_t paletteId); -std::optional GetPaletteMapForColour(colour_t paletteId); -void UpdatePalette(std::span palette, int32_t start_index, int32_t num_colours); +std::optional GetPaletteG1Index(OpenRCT2::Drawing::FilterPaletteID paletteId); +std::optional GetPaletteMapForColour(OpenRCT2::Drawing::FilterPaletteID paletteId); +void UpdatePalette( + std::span palette, OpenRCT2::Drawing::PaletteIndex startIndex, int32_t numColours); void UpdatePaletteEffects(); void RefreshVideo(); void ToggleWindowedMode(); -void DebugDPI(RenderTarget& rt); +void DebugRT(OpenRCT2::Drawing::RenderTarget& rt); #include "NewDrawing.h" diff --git a/src/openrct2/drawing/DrawingLock.hpp b/src/openrct2/drawing/DrawingLock.hpp index dfee74002855..f04acaff8a8f 100644 --- a/src/openrct2/drawing/DrawingLock.hpp +++ b/src/openrct2/drawing/DrawingLock.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/FilterPaletteIds.h b/src/openrct2/drawing/FilterPaletteIds.h new file mode 100644 index 000000000000..729e65dd2ada --- /dev/null +++ b/src/openrct2/drawing/FilterPaletteIds.h @@ -0,0 +1,160 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../interface/Colour.h" + +namespace OpenRCT2::Drawing +{ + enum class FilterPaletteID : int32_t + { + paletteNull = 0, + + paletteWater = COLOUR_COUNT, + + paletteLandMarker0, // North (corner/edge) + paletteLandMarker1, // East (corner/edge) + paletteLandMarker2, // South (corner/edge) + paletteLandMarker3, // West (corner/edge) + paletteSceneryGroundMarker, + paletteWaterMarker, + paletteQuarterMarker0, // North (not sure why it couldn't just use PaletteLandMarker0) + paletteQuarterMarker1, // East + paletteQuarterMarker2, // South + paletteQuarterMarker3, // West + paletteRideGroundMarker, + paletteGhost, // Construction marker + palette45, // Decolourise + lighten + palette46, + + paletteDarken3, + + paletteDarken1 = paletteDarken3 + 2, + paletteDarken2, + palette51, // Decolourise + darken + paletteTranslucentGrey, + paletteTranslucentGreyHighlight, + paletteTranslucentGreyShadow, + paletteTranslucentLightBlue, + paletteTranslucentLightBlueHighlight, + paletteTranslucentLightBlueShadow, + paletteTranslucentBordeauxRed, + paletteTranslucentBordeauxRedHighlight, + paletteTranslucentBordeauxRedShadow, + paletteTranslucentDarkGreen, + paletteTranslucentDarkGreenHighlight, + paletteTranslucentDarkGreenShadow, + paletteTranslucentLightPurple, + paletteTranslucentLightPurpleHighlight, + paletteTranslucentLightPurpleShadow, + paletteTranslucentDarkOliveGreen, + paletteTranslucentDarkOliveGreenHighlight, + paletteTranslucentDarkOliveGreenShadow, + paletteTranslucentLightBrown, + paletteTranslucentLightBrownHighlight, + paletteTranslucentLightBrownShadow, + paletteTranslucentYellow, + paletteTranslucentYellowHighlight, + paletteTranslucentYellowShadow, + paletteTranslucentMossGreen, + paletteTranslucentMossGreenHighlight, + paletteTranslucentMossGreenShadow, + paletteTranslucentOliveGreen, + paletteTranslucentOliveGreenHighlight, + paletteTranslucentOliveGreenShadow, + paletteTranslucentBrightGreen, + paletteTranslucentBrightGreenHighlight, + paletteTranslucentBrightGreenShadow, + paletteTranslucentSalmonPink, + paletteTranslucentSalmonPinkHighlight, + paletteTranslucentSalmonPinkShadow, + paletteTranslucentBrightPurple, + paletteTranslucentBrightPurpleHighlight, + paletteTranslucentBrightPurpleShadow, + paletteTranslucentBrightRed, + paletteTranslucentBrightRedHighlight, + paletteTranslucentBrightRedShadow, + paletteTranslucentLightOrange, + paletteTranslucentLightOrangeHighlight, + paletteTranslucentLightOrangeShadow, + paletteTranslucentTeal, + paletteTranslucentTealHighlight, + paletteTranslucentTealShadow, + paletteTranslucentBrightPink, + paletteTranslucentBrightPinkHighlight, + paletteTranslucentBrightPinkShadow, + paletteTranslucentDarkBrown, + paletteTranslucentDarkBrownHighlight, + paletteTranslucentDarkBrownShadow, + paletteTranslucentLightPink, + paletteTranslucentLightPinkHighlight, + paletteTranslucentLightPinkShadow, + paletteTranslucentWhite, + paletteTranslucentWhiteHighlight, + paletteTranslucentWhiteShadow, + paletteGlass, + paletteGlassBlack = paletteGlass + COLOUR_BLACK, + paletteGlassGrey = paletteGlass + COLOUR_GREY, + paletteGlassWhite = paletteGlass + COLOUR_WHITE, + paletteGlassDarkPurple = paletteGlass + COLOUR_DARK_PURPLE, + paletteGlassLightPurple = paletteGlass + COLOUR_LIGHT_PURPLE, + paletteGlassBrightPurple = paletteGlass + COLOUR_BRIGHT_PURPLE, + paletteGlassDarkBlue = paletteGlass + COLOUR_DARK_BLUE, + paletteGlassLightBlue = paletteGlass + COLOUR_LIGHT_BLUE, + paletteGlassIcyBlue = paletteGlass + COLOUR_ICY_BLUE, + paletteGlassTeal = paletteGlass + COLOUR_TEAL, + paletteGlassAquamarine = paletteGlass + COLOUR_AQUAMARINE, + paletteGlassSaturatedGreen = paletteGlass + COLOUR_SATURATED_GREEN, + paletteGlassDarkGreen = paletteGlass + COLOUR_DARK_GREEN, + paletteGlassMossGreen = paletteGlass + COLOUR_MOSS_GREEN, + paletteGlassBrightGreen = paletteGlass + COLOUR_BRIGHT_GREEN, + paletteGlassOliveGreen = paletteGlass + COLOUR_OLIVE_GREEN, + paletteGlassDarkOliveGreen = paletteGlass + COLOUR_DARK_OLIVE_GREEN, + paletteGlassBrightYellow = paletteGlass + COLOUR_BRIGHT_YELLOW, + paletteGlassYellow = paletteGlass + COLOUR_YELLOW, + paletteGlassDarkYellow = paletteGlass + COLOUR_DARK_YELLOW, + paletteGlassLightOrange = paletteGlass + COLOUR_LIGHT_ORANGE, + paletteGlassDarkOrange = paletteGlass + COLOUR_DARK_ORANGE, + paletteGlassLightBrown = paletteGlass + COLOUR_LIGHT_BROWN, + paletteGlassSaturatedBrown = paletteGlass + COLOUR_SATURATED_BROWN, + paletteGlassDarkBrown = paletteGlass + COLOUR_DARK_BROWN, + paletteGlassSalmonPink = paletteGlass + COLOUR_SALMON_PINK, + paletteGlassBordeauxRed = paletteGlass + COLOUR_BORDEAUX_RED, + paletteGlassSaturatedRed = paletteGlass + COLOUR_SATURATED_RED, + paletteGlassBrightRed = paletteGlass + COLOUR_BRIGHT_RED, + paletteGlassDarkPink = paletteGlass + COLOUR_DARK_PINK, + paletteGlassBrightPink = paletteGlass + COLOUR_BRIGHT_PINK, + paletteGlassLightPink = paletteGlass + COLOUR_LIGHT_PINK, + paletteGlassDarkOliveDark = paletteGlass + COLOUR_DARK_OLIVE_DARK, + paletteGlassDarkOliveLight = paletteGlass + COLOUR_DARK_OLIVE_LIGHT, + paletteGlassSaturatedBrownLight = paletteGlass + COLOUR_SATURATED_BROWN_LIGHT, + paletteGlassBordeauxRedDark = paletteGlass + COLOUR_BORDEAUX_RED_DARK, + paletteGlassBordeauxRedLight = paletteGlass + COLOUR_BORDEAUX_RED_LIGHT, + paletteGlassGrassGreenDark = paletteGlass + COLOUR_GRASS_GREEN_DARK, + paletteGlassGrassGreenLight = paletteGlass + COLOUR_GRASS_GREEN_LIGHT, + paletteGlassOliveDark = paletteGlass + COLOUR_OLIVE_DARK, + paletteGlassOliveLight = paletteGlass + COLOUR_OLIVE_LIGHT, + paletteGlassSaturatedGreenLight = paletteGlass + COLOUR_SATURATED_GREEN_LIGHT, + paletteGlassTanDark = paletteGlass + COLOUR_TAN_DARK, + paletteGlassTanLight = paletteGlass + COLOUR_TAN_LIGHT, + paletteGlassDullPurpleLight = paletteGlass + COLOUR_DULL_PURPLE_LIGHT, + paletteGlassDullGreenDark = paletteGlass + COLOUR_DULL_GREEN_DARK, + paletteGlassDullGreenLight = paletteGlass + COLOUR_DULL_GREEN_LIGHT, + paletteGlassSaturatedPurpleDark = paletteGlass + COLOUR_SATURATED_PURPLE_DARK, + paletteGlassSaturatedPurpleLight = paletteGlass + COLOUR_SATURATED_PURPLE_LIGHT, + paletteGlassOrangeLight = paletteGlass + COLOUR_ORANGE_LIGHT, + paletteGlassAquaDark = paletteGlass + COLOUR_AQUA_DARK, + paletteGlassMagentaLight = paletteGlass + COLOUR_MAGENTA_LIGHT, + paletteGlassDullBrownDark = paletteGlass + COLOUR_DULL_BROWN_DARK, + paletteGlassDullBrownLight = paletteGlass + COLOUR_DULL_BROWN_LIGHT, + paletteGlassInvisible = paletteGlass + COLOUR_INVISIBLE, + paletteGlassVoid = paletteGlass + COLOUR_VOID, + }; +} diff --git a/src/openrct2/drawing/Font.cpp b/src/openrct2/drawing/Font.cpp index 41744bd777ae..5fa48895dd6d 100644 --- a/src/openrct2/drawing/Font.cpp +++ b/src/openrct2/drawing/Font.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,6 +17,7 @@ #include "../localisation/LocalisationService.h" #include "../rct12/CSChar.h" #include "Drawing.h" +#include "ScrollingText.h" #include "TTF.h" #include @@ -273,13 +274,13 @@ void FontSpriteInitialiseCharacters() int32_t width = 0; if (g1 != nullptr) { - width = g1->width + (2 * g1->x_offset) - 1; + width = g1->width + (2 * g1->xOffset) - 1; } _spriteFontCharacterWidths[EnumValue(fontStyle)][glyphIndex] = static_cast(width); } } - ScrollingTextInitialiseBitmaps(); + Drawing::ScrollingText::initialiseBitmaps(); } int32_t FontSpriteGetCodepointOffset(int32_t codepoint) diff --git a/src/openrct2/drawing/Font.h b/src/openrct2/drawing/Font.h index fda084eee8b9..282778db5a5e 100644 --- a/src/openrct2/drawing/Font.h +++ b/src/openrct2/drawing/Font.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/G1Element.h b/src/openrct2/drawing/G1Element.h new file mode 100644 index 000000000000..798e5f6b76cd --- /dev/null +++ b/src/openrct2/drawing/G1Element.h @@ -0,0 +1,95 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../core/CallingConventions.h" +#include "../core/FlagHolder.hpp" + +#include +#include + +namespace OpenRCT2::Drawing +{ + struct BGRColour; +} + +namespace OpenRCT2 +{ + enum class G1Flag : uint8_t + { + hasTransparency, // Image data contains transparent pixels (0XFF) which will not be rendered + one, + hasRLECompression, // Image data is encoded using RCT2's form of run length encoding + isPalette, // Image data is a sequence of palette entries R8G8B8 + hasZoomSprite, // Use a different sprite for higher zoom levels + noZoomDraw, // Does not get drawn at higher zoom levels (only zoom 0) + }; + using G1Flags = FlagHolder; + + struct G1Palette + { + Drawing::BGRColour* palette = nullptr; + int16_t numColours = 0; + int16_t pad1 = 0; // unused for palettes + int16_t startIndex = 0; + int16_t pad2 = 0; // unused for palettes + G1Flags flags = { G1Flag::isPalette }; + int32_t pad3 = 0; // unused for palettes + }; + + struct G1Element + { + uint8_t* offset = nullptr; + int16_t width = 0; + int16_t height = 0; + int16_t xOffset = 0; + int16_t yOffset = 0; + + G1Flags flags = {}; + int32_t zoomedOffset = 0; + + const G1Palette* asPalette() const + { + if (!flags.has(G1Flag::isPalette)) + return nullptr; + + return reinterpret_cast(this); + } + }; + static_assert(sizeof(G1Palette) == sizeof(G1Element)); + +#pragma pack(push, 1) + struct G1Header + { + uint32_t numEntries = 0; + uint32_t totalSize = 0; + }; + static_assert(sizeof(G1Header) == 8); +#pragma pack(pop) + + struct Gx + { + G1Header header; + std::vector elements; + std::unique_ptr data; + }; + + struct StoredG1Element + { + uint32_t offset; // 0x00 note: uint32_t always! + int16_t width; // 0x04 + int16_t height; // 0x06 + int16_t xOffset; // 0x08 + int16_t yOffset; // 0x0A + G1Flags flags; // 0x0C + uint16_t zoomedOffset; // 0x0E + }; + static_assert(sizeof(StoredG1Element) == 0x10); +} // namespace OpenRCT2 diff --git a/src/openrct2/drawing/IDrawingContext.h b/src/openrct2/drawing/IDrawingContext.h index 5183296d4fb0..2677081f7321 100644 --- a/src/openrct2/drawing/IDrawingContext.h +++ b/src/openrct2/drawing/IDrawingContext.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,30 +9,37 @@ #pragma once -#include "Drawing.h" +#include "../world/Location.hpp" +#include "FilterPaletteIds.h" +#include "PaletteIndex.h" #include "TTF.h" +struct PaletteMap; struct TextDrawInfo; namespace OpenRCT2::Drawing { struct IDrawingEngine; + struct RenderTarget; struct IDrawingContext { virtual ~IDrawingContext() = default; - virtual void Clear(RenderTarget& rt, uint8_t paletteIndex) = 0; - virtual void FillRect(RenderTarget& rt, uint32_t colour, int32_t left, int32_t top, int32_t right, int32_t bottom) = 0; + virtual void Clear(RenderTarget& rt, PaletteIndex paletteIndex) = 0; + virtual void FillRect( + RenderTarget& rt, PaletteIndex paletteIndex, int32_t left, int32_t top, int32_t right, int32_t bottom, + bool crossHatch = false) + = 0; virtual void FilterRect( RenderTarget& rt, FilterPaletteID palette, int32_t left, int32_t top, int32_t right, int32_t bottom) = 0; - virtual void DrawLine(RenderTarget& rt, uint32_t colour, const ScreenLine& line) = 0; + virtual void DrawLine(RenderTarget& rt, PaletteIndex colour, const ScreenLine& line) = 0; virtual void DrawSprite(RenderTarget& rt, const ImageId image, int32_t x, int32_t y) = 0; virtual void DrawSpriteRawMasked( RenderTarget& rt, int32_t x, int32_t y, const ImageId maskImage, const ImageId colourImage) = 0; - virtual void DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, uint8_t colour) = 0; + virtual void DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, PaletteIndex colour) = 0; virtual void DrawGlyph(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, const PaletteMap& palette) = 0; virtual void DrawTTFBitmap( RenderTarget& rt, TextDrawInfo* info, TTFSurface* surface, int32_t x, int32_t y, uint8_t hintingThreshold) diff --git a/src/openrct2/drawing/IDrawingEngine.h b/src/openrct2/drawing/IDrawingEngine.h index 94c7d6627043..8786adccff76 100644 --- a/src/openrct2/drawing/IDrawingEngine.h +++ b/src/openrct2/drawing/IDrawingEngine.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -38,8 +38,6 @@ enum DrawingEngineFlag }; using DrawingEngineFlags = FlagHolder; -struct RenderTarget; - namespace OpenRCT2::Ui { struct IUiContext; @@ -48,6 +46,7 @@ namespace OpenRCT2::Ui namespace OpenRCT2::Drawing { struct IDrawingContext; + struct RenderTarget; struct IDrawingEngine { @@ -70,7 +69,7 @@ namespace OpenRCT2::Drawing virtual std::string Screenshot() = 0; virtual IDrawingContext* GetDrawingContext() = 0; - virtual RenderTarget* GetDrawingPixelInfo() = 0; + virtual RenderTarget* getRT() = 0; virtual DrawingEngineFlags GetFlags() = 0; diff --git a/src/openrct2/drawing/Image.cpp b/src/openrct2/drawing/Image.cpp index 0433333ced16..9c1ab72d5c30 100644 --- a/src/openrct2/drawing/Image.cpp +++ b/src/openrct2/drawing/Image.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/Image.h b/src/openrct2/drawing/Image.h index 1529b1429e00..8302d7898546 100644 --- a/src/openrct2/drawing/Image.h +++ b/src/openrct2/drawing/Image.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,7 +15,10 @@ #include #include -struct G1Element; +namespace OpenRCT2 +{ + struct G1Element; +} struct ImageList { @@ -55,7 +58,7 @@ constexpr bool operator!=(const ImageList& lhs, const ImageList& rhs) return !(lhs == rhs); } -uint32_t GfxObjectAllocateImages(const G1Element* images, uint32_t count); +uint32_t GfxObjectAllocateImages(const OpenRCT2::G1Element* images, uint32_t count); void GfxObjectFreeImages(uint32_t baseImageId, uint32_t count); void GfxObjectCheckAllImagesFreed(); size_t ImageListGetUsedCount(); diff --git a/src/openrct2/drawing/ImageId.hpp b/src/openrct2/drawing/ImageId.hpp index 8a0cdaaa45ac..699b096ae857 100644 --- a/src/openrct2/drawing/ImageId.hpp +++ b/src/openrct2/drawing/ImageId.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,9 +16,11 @@ #include using colour_t = uint8_t; -enum class FilterPaletteID : int32_t; -static constexpr ImageIndex kImageIndexUndefined = std::numeric_limits::max(); +namespace OpenRCT2::Drawing +{ + enum class FilterPaletteID : int32_t; +} enum class ImageCatalogue { @@ -30,7 +32,7 @@ enum class ImageCatalogue TEMPORARY, }; -FilterPaletteID GetGlassPaletteId(colour_t); +OpenRCT2::Drawing::FilterPaletteID GetGlassPaletteId(colour_t); /** * Represents a specific image from a catalogue such as G1, G2, CSG etc. with remap @@ -67,7 +69,7 @@ struct ImageId { } - constexpr ImageId(uint32_t index, FilterPaletteID palette) + constexpr ImageId(uint32_t index, OpenRCT2::Drawing::FilterPaletteID palette) : ImageId(ImageId(index).WithRemap(palette)) { } @@ -158,7 +160,7 @@ struct ImageId return result; } - [[nodiscard]] constexpr ImageId WithRemap(FilterPaletteID paletteId) const + [[nodiscard]] constexpr ImageId WithRemap(OpenRCT2::Drawing::FilterPaletteID paletteId) const { return WithRemap(static_cast(paletteId)); } @@ -218,7 +220,7 @@ struct ImageId return WithTransparency(GetGlassPaletteId(colour)); } - [[nodiscard]] ImageId WithTransparency(FilterPaletteID palette) const + [[nodiscard]] ImageId WithTransparency(OpenRCT2::Drawing::FilterPaletteID palette) const { ImageId result = *this; result._primary = static_cast(palette); diff --git a/src/openrct2/drawing/ImageImporter.cpp b/src/openrct2/drawing/ImageImporter.cpp index 2814e871d714..e3f4073666f2 100644 --- a/src/openrct2/drawing/ImageImporter.cpp +++ b/src/openrct2/drawing/ImageImporter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2::Drawing { static constexpr int32_t kPaletteTransparent = -1; - ImageImporter::ImportResult ImageImporter::Import(const Image& image, ImageImportMeta& meta) const + ImageImportResult ImageImporter::Import(const Image& image, ImageImportMeta& meta) const { if (meta.srcSize.width == 0) meta.srcSize.width = image.Width; @@ -45,14 +45,14 @@ namespace OpenRCT2::Drawing G1Element outElement; outElement.width = meta.srcSize.width; outElement.height = meta.srcSize.height; - outElement.flags = isRLE ? G1_FLAG_RLE_COMPRESSION : G1_FLAG_HAS_TRANSPARENCY; - outElement.x_offset = meta.offset.x; - outElement.y_offset = meta.offset.y; - outElement.zoomed_offset = meta.zoomedOffset; + outElement.flags = { isRLE ? G1Flag::hasRLECompression : G1Flag::hasTransparency }; + outElement.xOffset = meta.offset.x; + outElement.yOffset = meta.offset.y; + outElement.zoomedOffset = meta.zoomedOffset; if (HasFlag(meta.importFlags, ImportFlags::NoDrawOnZoom)) - outElement.flags |= G1_FLAG_NO_ZOOM_DRAW; + outElement.flags.set(G1Flag::noZoomDraw); - ImageImporter::ImportResult result; + ImageImportResult result; result.Element = outElement; result.Buffer = std::move(buffer); result.Element.offset = result.Buffer.data(); diff --git a/src/openrct2/drawing/ImageImporter.h b/src/openrct2/drawing/ImageImporter.h index 0a957e02aa79..af581b3c4bcc 100644 --- a/src/openrct2/drawing/ImageImporter.h +++ b/src/openrct2/drawing/ImageImporter.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,7 +12,8 @@ #include "../core/EnumUtils.hpp" #include "../core/Imaging.h" #include "../core/JsonFwd.hpp" -#include "Drawing.h" +#include "../drawing/G1Element.h" +#include "../world/Location.hpp" #include #include @@ -51,19 +52,19 @@ namespace OpenRCT2::Drawing int32_t zoomedOffset{}; }; + struct ImageImportResult + { + G1Element Element{}; + std::vector Buffer; + }; + /** * Imports images to the internal RCT G1 format. */ class ImageImporter { public: - struct ImportResult - { - G1Element Element{}; - std::vector Buffer; - }; - - ImportResult Import(const Image& image, ImageImportMeta& meta) const; + ImageImportResult Import(const Image& image, ImageImportMeta& meta) const; private: enum class PaletteIndexType : uint8_t diff --git a/src/openrct2/drawing/ImageIndexType.h b/src/openrct2/drawing/ImageIndexType.h index c88581561e67..bf345f3fc2a4 100644 --- a/src/openrct2/drawing/ImageIndexType.h +++ b/src/openrct2/drawing/ImageIndexType.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,4 +14,4 @@ using ImageIndex = uint32_t; -constexpr ImageIndex kSpriteIdNull = std::numeric_limits::max(); +constexpr ImageIndex kImageIndexUndefined = std::numeric_limits::max(); diff --git a/src/openrct2/drawing/LightFX.cpp b/src/openrct2/drawing/LightFX.cpp index 2325588820d0..fbcfa6037200 100644 --- a/src/openrct2/drawing/LightFX.cpp +++ b/src/openrct2/drawing/LightFX.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/LightFX.h b/src/openrct2/drawing/LightFX.h index 8ce68a7bd1ca..8ee5dcb482fe 100644 --- a/src/openrct2/drawing/LightFX.h +++ b/src/openrct2/drawing/LightFX.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,7 +15,6 @@ struct CoordsXY; struct Vehicle; -struct RenderTarget; struct CoordsXYZ; struct EntityBase; @@ -24,6 +23,11 @@ namespace OpenRCT2 struct Viewport; } +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} + namespace OpenRCT2::Drawing::LightFx { enum class LightType : uint8_t diff --git a/src/openrct2/drawing/Line.cpp b/src/openrct2/drawing/Line.cpp index 07f3e3feb0ff..e3d9b82f2ffc 100644 --- a/src/openrct2/drawing/Line.cpp +++ b/src/openrct2/drawing/Line.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,11 +12,13 @@ #include #include +using namespace OpenRCT2::Drawing; + /** * Draws a horizontal line of specified colour to a buffer. * rct2: 0x0068474C */ -static void GfxDrawLineOnBuffer(RenderTarget& rt, char colour, const ScreenCoordsXY& coords, int32_t no_pixels) +static void GfxDrawLineOnBuffer(RenderTarget& rt, PaletteIndex colour, const ScreenCoordsXY& coords, int32_t no_pixels) { ScreenCoordsXY offset{ coords.x - rt.x, coords.y - rt.y }; @@ -54,7 +56,7 @@ static void GfxDrawLineOnBuffer(RenderTarget& rt, char colour, const ScreenCoord } // Get the buffer we are drawing to and move to the first coordinate. - uint8_t* bits_pointer = rt.bits + offset.y * rt.LineStride() + offset.x; + PaletteIndex* bits_pointer = reinterpret_cast(rt.bits + offset.y * rt.LineStride() + offset.x); // Draw the line to the specified colour for (; no_pixels > 0; --no_pixels, ++bits_pointer) @@ -64,9 +66,9 @@ static void GfxDrawLineOnBuffer(RenderTarget& rt, char colour, const ScreenCoord } /** - * Draws a line on dpi if within dpi boundaries + * Draws a line on rt if within rt boundaries * rct2: 0x00684466 - * dpi (edi) + * rt (edi) * x1 (ax) * y1 (bx) * x2 (cx) @@ -74,7 +76,7 @@ static void GfxDrawLineOnBuffer(RenderTarget& rt, char colour, const ScreenCoord * colour (ebp) */ -void GfxDrawLineSoftware(RenderTarget& rt, const ScreenLine& line, int32_t colour) +void GfxDrawLineSoftware(RenderTarget& rt, const ScreenLine& line, PaletteIndex colour) { const ZoomLevel zoom = rt.zoom_level; int32_t x1 = zoom.ApplyInversedTo(line.GetX1()); diff --git a/src/openrct2/drawing/NewDrawing.cpp b/src/openrct2/drawing/NewDrawing.cpp index c66ff5f78e09..b9a0367e8551 100644 --- a/src/openrct2/drawing/NewDrawing.cpp +++ b/src/openrct2/drawing/NewDrawing.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -109,11 +109,11 @@ void DrawingEngineDispose() } } -RenderTarget& DrawingEngineGetDpi() +RenderTarget& DrawingEngineGetRT() { auto context = GetContext(); auto drawingEngine = context->GetDrawingEngine(); - return *(drawingEngine->GetDrawingPixelInfo()); + return *(drawingEngine->getRT()); } bool DrawingEngineHasDirtyOptimisations() @@ -154,7 +154,7 @@ void GfxSetDirtyBlocks(const ScreenRect& rect) } } -void GfxClear(RenderTarget& rt, uint8_t paletteIndex) +void GfxClear(RenderTarget& rt, PaletteIndex paletteIndex) { auto drawingEngine = rt.DrawingEngine; if (drawingEngine != nullptr) @@ -164,7 +164,7 @@ void GfxClear(RenderTarget& rt, uint8_t paletteIndex) } } -void GfxDrawLine(RenderTarget& rt, const ScreenLine& line, int32_t colour) +void GfxDrawLine(RenderTarget& rt, const ScreenLine& line, PaletteIndex colour) { auto drawingEngine = rt.DrawingEngine; if (drawingEngine != nullptr) @@ -175,7 +175,7 @@ void GfxDrawLine(RenderTarget& rt, const ScreenLine& line, int32_t colour) } void GfxDrawDashedLine( - RenderTarget& rt, const ScreenLine& screenLine, const int32_t dashedLineSegmentLength, const int32_t color) + RenderTarget& rt, const ScreenLine& screenLine, const int32_t dashedLineSegmentLength, const PaletteIndex colour) { assert(dashedLineSegmentLength > 0); @@ -202,7 +202,7 @@ void GfxDrawDashedLine( { x = screenLine.GetX1() + dxPrecise * i * 2 / kPrecisionFactor; y = screenLine.GetY1() + dyPrecise * i * 2 / kPrecisionFactor; - dc->DrawLine(rt, color, { { x, y }, { x + dxPrecise / kPrecisionFactor, y + dyPrecise / kPrecisionFactor } }); + dc->DrawLine(rt, colour, { { x, y }, { x + dxPrecise / kPrecisionFactor, y + dyPrecise / kPrecisionFactor } }); } } } @@ -238,7 +238,7 @@ void FASTCALL } } -void FASTCALL GfxDrawSpriteSolid(RenderTarget& rt, const ImageId image, const ScreenCoordsXY& coords, uint8_t colour) +void FASTCALL GfxDrawSpriteSolid(RenderTarget& rt, const ImageId image, const ScreenCoordsXY& coords, PaletteIndex colour) { auto drawingEngine = rt.DrawingEngine; if (drawingEngine != nullptr) diff --git a/src/openrct2/drawing/NewDrawing.h b/src/openrct2/drawing/NewDrawing.h index 962041c51d74..dc08368c183f 100644 --- a/src/openrct2/drawing/NewDrawing.h +++ b/src/openrct2/drawing/NewDrawing.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,7 +12,10 @@ #include "../localisation/StringIdType.h" #include "ColourPalette.h" -struct RenderTarget; +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} enum class DrawingEngine : int32_t; @@ -24,7 +27,7 @@ void DrawingEngineSetPalette(const OpenRCT2::Drawing::GamePalette& colours); void DrawingEngineCopyRect(int32_t x, int32_t y, int32_t width, int32_t height, int32_t dx, int32_t dy); void DrawingEngineDispose(); -RenderTarget& DrawingEngineGetDpi(); +OpenRCT2::Drawing::RenderTarget& DrawingEngineGetRT(); bool DrawingEngineHasDirtyOptimisations(); void DrawingEngineInvalidateImage(uint32_t image); void DrawingEngineSetVSync(bool vsync); diff --git a/src/openrct2/drawing/PaletteIndex.h b/src/openrct2/drawing/PaletteIndex.h new file mode 100644 index 000000000000..79664e2c9af6 --- /dev/null +++ b/src/openrct2/drawing/PaletteIndex.h @@ -0,0 +1,122 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include + +namespace OpenRCT2::Drawing +{ + enum class PaletteIndex : uint8_t + { + pi0 = 0, // Transparent + pi10 = 10, // Black (0-dark), Dark grey (0) + pi11 = 11, // Black (middark) + pi12 = 12, // Black (midlight), Dark grey (1-darkest) + pi14 = 14, // Black (lighter), Dark grey (dark) + pi13 = 13, // + pi16 = 16, // + pi17 = 17, // Black (11), Dark grey (light), White (dark) + pi18 = 18, + pi20 = 20, // Dark grey (10), White (light) + pi21 = 21, // Dark grey (11), White (lighter-11) + pi40 = 40, // + pi42 = 42, // Light Brown (lighter), Saturated brown (11) + pi43 = 43, // + pi44 = 44, // Construction marker + pi46 = 46, // Tertiary remap 0 / Yellow (darkest) + pi47 = 47, // Tertiary remap 1 / Yellow + pi48 = 48, // Tertiary remap 2 / Yellow + pi49 = 49, // Tertiary remap 3 / Yellow + pi50 = 50, // Tertiary remap 4 / Yellow + pi51 = 51, // Tertiary remap 5 / Yellow + pi52 = 52, // Tertiary remap 6 / Yellow + pi53 = 53, // Tertiary remap 7 / Yellow + pi54 = 54, // Tertiary remap 8 / Yellow + pi55 = 55, // Tertiary remap 9 / Yellow + pi56 = 56, // Tertiary remap 10 / Yellow + pi57 = 57, // Tertiary remap 11 / Yellow (lightest) + pi61 = 61, // Bordeaux Red (darker) + pi62 = 62, // + pi68 = 68, // + pi69 = 69, // + pi73 = 73, // + pi99 = 99, // + pi102 = 102, // Bright green (lighter) + pi108 = 108, // + pi111 = 111, // + pi114 = 114, + pi126 = 126, + pi129 = 129, // Light Purple (11) + pi135 = 135, // + pi136 = 136, // Dark Blue (10-11), Light Blue (midlight), Icy Blue (darker) + pi138 = 138, // Light Blue (lighter), Icy Blue (middark) + pi139 = 139, + pi141 = 141, // + pi144 = 144, // Dark Green (1-darkest, + pi150 = 150, + pi152 = 152, + pi161 = 161, // Bright Purple (light) + pi162 = 162, // + pi164 = 164, // + pi171 = 171, // Saturated Red (lightest) Bright Red (middark) + pi172 = 172, // Saturated Red (10-11), Bright Red (midlight) + pi173 = 173, // Used to draw intense lines in the Ride Graphs window + pi174 = 174, + pi183 = 183, // Used to draw rides in the Map window + pi186 = 186, // + pi187 = 187, // + pi194 = 194, // + pi195 = 195, // + pi198 = 198, + pi199 = 199, // + pi202 = 202, // Secondary remap 0 / Pink (darkest) + pi203 = 203, // Secondary remap 1 / Pink + pi204 = 204, // Secondary remap 2 / Pink + pi205 = 205, // Secondary remap 3 / Pink + pi206 = 206, // Secondary remap 4 / Pink + pi207 = 207, // Secondary remap 5 / Pink + pi208 = 208, // Secondary remap 6 / Pink + pi209 = 209, // Secondary remap 7 / Pink + pi210 = 210, // Secondary remap 8 / Pink + pi211 = 211, // Secondary remap 9 / Pink + pi212 = 212, // Secondary remap 10 / Pink + pi213 = 213, // Secondary remap 11 / Pink (lightest) + pi222 = 222, // + pi223 = 223, // + pi229 = 229, + pi230 = 230, // Water (waves) + pi231 = 231, // Water (waves) + pi232 = 232, // Water (waves) + pi233 = 233, // Water (waves) + pi234 = 234, // Water (waves) + pi235 = 235, // Water (sparkles) + pi236 = 236, // Water (sparkles) + pi237 = 237, // Water (sparkles) + pi238 = 238, // Water (sparkles) + pi239 = 239, // Water (sparkles) + pi240 = 240, // Track rails + pi241 = 241, // Track rails + pi242 = 242, // Track rails + pi243 = 243, // Primary remap 0 + pi244 = 244, // Primary remap 1 + pi245 = 245, // Primary remap 2 + pi246 = 246, // Primary remap 3 + pi247 = 247, // Primary remap 4 + pi248 = 248, // Primary remap 5 + pi249 = 249, // Primary remap 6 + pi250 = 250, // Primary remap 7 + pi251 = 251, // Primary remap 8 + pi252 = 252, // Primary remap 9 + pi253 = 253, // Primary remap 10 + pi254 = 254, // Primary remap 11 + pi255 = 255, // White + }; + +} diff --git a/src/openrct2/drawing/Rectangle.cpp b/src/openrct2/drawing/Rectangle.cpp index d0bb871490f2..dbc2d18b4fd1 100644 --- a/src/openrct2/drawing/Rectangle.cpp +++ b/src/openrct2/drawing/Rectangle.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,13 +20,13 @@ using OpenRCT2::Drawing::IDrawingContext; namespace OpenRCT2::Drawing::Rectangle { - void fill(RenderTarget& rt, const ScreenRect& rect, int32_t colour) + void fill(RenderTarget& rt, const ScreenRect& rect, PaletteIndex paletteIndex, bool crossHatch) { auto drawingEngine = rt.DrawingEngine; if (drawingEngine != nullptr) { IDrawingContext* dc = drawingEngine->GetDrawingContext(); - dc->FillRect(rt, colour, rect.GetLeft(), rect.GetTop(), rect.GetRight(), rect.GetBottom()); + dc->FillRect(rt, paletteIndex, rect.GetLeft(), rect.GetTop(), rect.GetRight(), rect.GetBottom(), crossHatch); } } @@ -34,7 +34,7 @@ namespace OpenRCT2::Drawing::Rectangle * Draw a rectangle, with optional border or fill * * rct2: 0x006E6F81 - * dpi (edi) + * rt (edi) * left (ax) * top (cx) * right (bx) @@ -91,7 +91,7 @@ namespace OpenRCT2::Drawing::Rectangle } else { - uint8_t shadow, fill, hilight; + PaletteIndex shadow, fill, hilight; if (brightness == FillBrightness::dark) { shadow = ColourMapA[colour.colour].dark; diff --git a/src/openrct2/drawing/Rectangle.h b/src/openrct2/drawing/Rectangle.h index 170be7df2acd..c36dbdfac0e2 100644 --- a/src/openrct2/drawing/Rectangle.h +++ b/src/openrct2/drawing/Rectangle.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,8 +11,6 @@ #include -enum class FilterPaletteID : int32_t; -struct RenderTarget; struct ScreenRect; namespace OpenRCT2 @@ -20,6 +18,13 @@ namespace OpenRCT2 struct ColourWithFlags; } +namespace OpenRCT2::Drawing +{ + enum class FilterPaletteID : int32_t; + enum class PaletteIndex : uint8_t; + struct RenderTarget; +} // namespace OpenRCT2::Drawing + namespace OpenRCT2::Drawing::Rectangle { enum class BorderStyle : uint8_t @@ -40,7 +45,7 @@ namespace OpenRCT2::Drawing::Rectangle dontLightenWhenInset, }; - void fill(RenderTarget& rt, const ScreenRect& rect, int32_t colour); + void fill(RenderTarget& rt, const ScreenRect& rect, PaletteIndex paletteIndex, bool crossHatch = false); void fillInset( RenderTarget& rt, const ScreenRect& rect, ColourWithFlags colour, BorderStyle borderStyle = BorderStyle::outset, FillBrightness brightness = FillBrightness::light, FillMode fillMode = FillMode::standard); diff --git a/src/openrct2/drawing/RenderTarget.cpp b/src/openrct2/drawing/RenderTarget.cpp new file mode 100644 index 000000000000..04d943c0529b --- /dev/null +++ b/src/openrct2/drawing/RenderTarget.cpp @@ -0,0 +1,30 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#include "RenderTarget.h" + +namespace OpenRCT2::Drawing +{ + uint8_t* RenderTarget::GetBitsOffset(const ScreenCoordsXY& pos) const + { + return bits + pos.x + pos.y * LineStride(); + } + + RenderTarget RenderTarget::Crop(const ScreenCoordsXY& pos, const ScreenSize& size) const + { + RenderTarget result = *this; + result.bits = GetBitsOffset(pos); + result.x = pos.x; + result.y = pos.y; + result.width = size.width; + result.height = size.height; + result.pitch = width + pitch - size.width; + return result; + } +} // namespace OpenRCT2::Drawing diff --git a/src/openrct2/drawing/RenderTarget.h b/src/openrct2/drawing/RenderTarget.h new file mode 100644 index 000000000000..8a6bc1404e5f --- /dev/null +++ b/src/openrct2/drawing/RenderTarget.h @@ -0,0 +1,63 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../interface/ZoomLevel.h" +#include "../world/Location.hpp" + +namespace OpenRCT2::Drawing +{ + struct IDrawingEngine; + + struct RenderTarget + { + uint8_t* bits{}; + int32_t x{}; + int32_t y{}; + int32_t width{}; + int32_t height{}; + int32_t pitch{}; // note: this is actually (pitch - width) + int32_t cullingX{}; + int32_t cullingY{}; + int32_t cullingWidth{}; + int32_t cullingHeight{}; + ZoomLevel zoom_level{}; + + // Last position of drawn text. + ScreenCoordsXY lastStringPos{}; + + IDrawingEngine* DrawingEngine{}; + + uint8_t* GetBitsOffset(const ScreenCoordsXY& pos) const; + RenderTarget Crop(const ScreenCoordsXY& pos, const ScreenSize& size) const; + + [[nodiscard]] constexpr int32_t WorldX() const + { + return zoom_level.ApplyTo(x); + } + [[nodiscard]] constexpr int32_t WorldY() const + { + return zoom_level.ApplyTo(y); + } + [[nodiscard]] constexpr int32_t WorldWidth() const + { + return zoom_level.ApplyTo(width); + } + [[nodiscard]] constexpr int32_t WorldHeight() const + { + return zoom_level.ApplyTo(height); + } + + [[nodiscard]] constexpr int32_t LineStride() const + { + return width + pitch; + } + }; +} // namespace OpenRCT2::Drawing diff --git a/src/openrct2/drawing/SSE41Drawing.cpp b/src/openrct2/drawing/SSE41Drawing.cpp index 4f16db22f451..5b4de493b6a2 100644 --- a/src/openrct2/drawing/SSE41Drawing.cpp +++ b/src/openrct2/drawing/SSE41Drawing.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/ScrollingText.cpp b/src/openrct2/drawing/ScrollingText.cpp index 1f1f463b152e..1cbf6276dbad 100644 --- a/src/openrct2/drawing/ScrollingText.cpp +++ b/src/openrct2/drawing/ScrollingText.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -27,140 +27,142 @@ using namespace OpenRCT2; -struct DrawScrollText +namespace OpenRCT2::Drawing::ScrollingText { - StringId string_id; - uint8_t string_args[32]; - colour_t colour; - uint16_t position; - uint16_t mode; - uint32_t id; - uint8_t bitmap[64 * 40]; -}; - -static DrawScrollText _drawScrollTextList[OpenRCT2::kMaxScrollingTextEntries]; -static uint8_t _characterBitmaps[SPR_FONTS_GLYPH_COUNT][8]; -static uint32_t _drawSCrollNextIndex = 0; -static std::mutex _scrollingTextMutex; + struct DrawScrollText + { + StringId string_id; + uint8_t string_args[32]; + PaletteIndex colour; + uint16_t position; + uint16_t mode; + uint32_t id; + PaletteIndex bitmap[64 * 40]; + }; -static void ScrollingTextSetBitmapForSprite( - std::string_view text, int32_t scroll, uint8_t* bitmap, const int16_t* scrollPositionOffsets, colour_t colour); -static void ScrollingTextSetBitmapForTTF( - std::string_view text, int32_t scroll, uint8_t* bitmap, const int16_t* scrollPositionOffsets, colour_t colour); + static DrawScrollText _drawScrollTextList[kMaxEntries]; + static uint8_t _characterBitmaps[SPR_FONTS_GLYPH_COUNT][8]; + static uint32_t _drawSCrollNextIndex = 0; + static std::mutex _mutex; -static void ScrollingTextInitialiseCharacterBitmaps(uint32_t glyphStart, uint16_t count) -{ - uint8_t drawingSurface[64]; - RenderTarget rt; - rt.bits = reinterpret_cast(&drawingSurface); - rt.width = 8; - rt.height = 8; + static void setBitmapForSprite( + std::string_view text, int32_t scroll, PaletteIndex* bitmap, const int16_t* scrollPositionOffsets, PaletteIndex colour); + static void setBitmapForTTF( + std::string_view text, int32_t scroll, PaletteIndex* bitmap, const int16_t* scrollPositionOffsets, PaletteIndex colour); - for (int32_t i = 0; i < count; i++) + static void initialiseCharacterBitmaps(uint32_t glyphStart, uint16_t count) { - std::fill_n(drawingSurface, sizeof(drawingSurface), 0x00); - GfxDrawSpriteSoftware(rt, ImageId(glyphStart + (EnumValue(FontStyle::tiny) * count) + i), { -1, 0 }); + uint8_t drawingSurface[64]; + RenderTarget rt; + rt.bits = reinterpret_cast(&drawingSurface); + rt.width = 8; + rt.height = 8; - for (int32_t x = 0; x < 8; x++) + for (int32_t i = 0; i < count; i++) { - uint8_t val = 0; - for (int32_t y = 0; y < 8; y++) + std::fill_n(drawingSurface, sizeof(drawingSurface), 0x00); + GfxDrawSpriteSoftware(rt, ImageId(glyphStart + (EnumValue(FontStyle::tiny) * count) + i), { -1, 0 }); + + for (int32_t x = 0; x < 8; x++) { - val >>= 1; - uint8_t pixel = rt.bits[x + y * 8]; - if (pixel == 1) + uint8_t val = 0; + for (int32_t y = 0; y < 8; y++) { - val |= 0x80; + val >>= 1; + uint8_t pixel = rt.bits[x + y * 8]; + if (pixel == 1) + { + val |= 0x80; + } } + _characterBitmaps[i][x] = val; } - _characterBitmaps[i][x] = val; } - } -}; + }; -static void ScrollingTextInitialiseScrollingText() -{ - for (int32_t i = 0; i < OpenRCT2::kMaxScrollingTextEntries; i++) + static void initialiseScrollingText() { - const int32_t imageId = SPR_SCROLLING_TEXT_START + i; + for (int32_t i = 0; i < kMaxEntries; i++) + { + const int32_t imageId = SPR_SCROLLING_TEXT_START + i; - // Initialize the scrolling text sprite. - G1Element g1{}; - g1.offset = _drawScrollTextList[i].bitmap; - g1.x_offset = -32; - g1.y_offset = 0; - g1.flags = G1_FLAG_HAS_TRANSPARENCY; - g1.width = 64; - g1.height = 40; - g1.offset[0] = 0xFF; - g1.offset[1] = 0xFF; - g1.offset[14] = 0; - g1.offset[15] = 0; - g1.offset[16] = 0; - g1.offset[17] = 0; + // Initialize the scrolling text sprite. + G1Element g1{}; + g1.offset = reinterpret_cast(_drawScrollTextList[i].bitmap); + g1.xOffset = -32; + g1.yOffset = 0; + g1.flags = { G1Flag::hasTransparency }; + g1.width = 64; + g1.height = 40; + g1.offset[0] = 0xFF; + g1.offset[1] = 0xFF; + g1.offset[14] = 0; + g1.offset[15] = 0; + g1.offset[16] = 0; + g1.offset[17] = 0; - GfxSetG1Element(imageId, &g1); + GfxSetG1Element(imageId, &g1); + } } -} -void ScrollingTextInitialiseBitmaps() -{ - ScrollingTextInitialiseCharacterBitmaps(SPR_FONTS_BEGIN, SPR_FONTS_GLYPH_COUNT); - ScrollingTextInitialiseScrollingText(); -} + void initialiseBitmaps() + { + initialiseCharacterBitmaps(SPR_FONTS_BEGIN, SPR_FONTS_GLYPH_COUNT); + initialiseScrollingText(); + } -static uint8_t* FontSpriteGetCodepointBitmap(int32_t codepoint) -{ - auto offset = FontSpriteGetCodepointOffset(codepoint); - return _characterBitmaps[offset]; -} + static uint8_t* FontSpriteGetCodepointBitmap(int32_t codepoint) + { + auto offset = FontSpriteGetCodepointOffset(codepoint); + return _characterBitmaps[offset]; + } -static int32_t ScrollingTextGetMatchingOrOldest( - StringId stringId, Formatter& ft, uint16_t scroll, uint16_t scrollingMode, colour_t colour) -{ - uint32_t oldestId = 0xFFFFFFFF; - int32_t scrollIndex = -1; - for (size_t i = 0; i < std::size(_drawScrollTextList); i++) + static int32_t getMatchingOrOldest( + StringId stringId, Formatter& ft, uint16_t scroll, uint16_t scrollingMode, PaletteIndex colour) { - DrawScrollText* scrollText = &_drawScrollTextList[i]; - if (oldestId >= scrollText->id) + uint32_t oldestId = 0xFFFFFFFF; + int32_t scrollIndex = -1; + for (size_t i = 0; i < std::size(_drawScrollTextList); i++) { - oldestId = scrollText->id; - scrollIndex = static_cast(i); - } + DrawScrollText* scrollText = &_drawScrollTextList[i]; + if (oldestId >= scrollText->id) + { + oldestId = scrollText->id; + scrollIndex = static_cast(i); + } - // If exact match return the matching index - if (scrollText->string_id == stringId - && std::memcmp(scrollText->string_args, ft.Buf(), sizeof(scrollText->string_args)) == 0 - && scrollText->colour == colour && scrollText->position == scroll && scrollText->mode == scrollingMode) - { - scrollText->id = _drawSCrollNextIndex; - return static_cast(i + SPR_SCROLLING_TEXT_START); + // If exact match return the matching index + if (scrollText->string_id == stringId + && std::memcmp(scrollText->string_args, ft.Buf(), sizeof(scrollText->string_args)) == 0 + && scrollText->colour == colour && scrollText->position == scroll && scrollText->mode == scrollingMode) + { + scrollText->id = _drawSCrollNextIndex; + return static_cast(i + SPR_SCROLLING_TEXT_START); + } } + return scrollIndex; } - return scrollIndex; -} -static void ScrollingTextFormat(utf8* dst, size_t size, DrawScrollText* scrollText) -{ - if (Config::Get().general.upperCaseBanners) + static void format(utf8* dst, size_t size, DrawScrollText* scrollText) { - FormatStringToUpper(dst, size, scrollText->string_id, scrollText->string_args); - } - else - { - FormatStringLegacy(dst, size, scrollText->string_id, scrollText->string_args); + if (Config::Get().general.upperCaseBanners) + { + FormatStringToUpper(dst, size, scrollText->string_id, scrollText->string_args); + } + else + { + FormatStringLegacy(dst, size, scrollText->string_id, scrollText->string_args); + } } -} -extern bool TempForScrollText; + extern bool TempForScrollText; -consteval int16_t ScrollPos(const int16_t x, const int16_t y) -{ - return y * 64 + x; -} + consteval int16_t ScrollPos(const int16_t x, const int16_t y) + { + return y * 64 + x; + } -// clang-format off + // clang-format off static constexpr int16_t kScrollPos0[] = { ScrollPos( 35, 12 ), ScrollPos( 36, 12 ), @@ -1380,7 +1382,7 @@ static constexpr int16_t kScrollPos37[] = { -1, }; -static constexpr const int16_t* kScrollPositions[kMaxScrollingTextModes] = { +static constexpr const int16_t* kScrollPositions[kMaxModes] = { kScrollPos0, kScrollPos1, kScrollPos2, @@ -1420,213 +1422,207 @@ static constexpr const int16_t* kScrollPositions[kMaxScrollingTextModes] = { kScrollPos36, kScrollPos37, }; -// clang-format on + // clang-format on -void ScrollingTextInvalidate() -{ - for (auto& scrollText : _drawScrollTextList) + void invalidate() { - scrollText.string_id = 0; - std::memset(scrollText.string_args, 0, sizeof(scrollText.string_args)); + for (auto& scrollText : _drawScrollTextList) + { + scrollText.string_id = 0; + std::memset(scrollText.string_args, 0, sizeof(scrollText.string_args)); + } } -} -ImageId ScrollingTextSetup( - PaintSession& session, StringId stringId, Formatter& ft, uint16_t scroll, uint16_t scrollingMode, colour_t colour) -{ - std::scoped_lock lock(_scrollingTextMutex); - - assert(scrollingMode < kMaxScrollingTextModes); + ImageId setup( + PaintSession& session, StringId stringId, Formatter& ft, uint16_t scroll, uint16_t scrollingMode, PaletteIndex colour) + { + std::scoped_lock lock(_mutex); - if (session.DPI.zoom_level > ZoomLevel{ 0 }) - return ImageId(SPR_SCROLLING_TEXT_DEFAULT); + assert(scrollingMode < kMaxModes); - _drawSCrollNextIndex++; - ft.Rewind(); - uint32_t scrollIndex = ScrollingTextGetMatchingOrOldest(stringId, ft, scroll, scrollingMode, colour); - if (scrollIndex >= SPR_SCROLLING_TEXT_START) - return ImageId(scrollIndex); + if (session.rt.zoom_level > ZoomLevel{ 0 }) + return ImageId(SPR_SCROLLING_TEXT_DEFAULT); - // Setup scrolling text - auto scrollText = &_drawScrollTextList[scrollIndex]; - scrollText->string_id = stringId; - std::memcpy(scrollText->string_args, ft.Buf(), sizeof(scrollText->string_args)); - scrollText->colour = colour; - scrollText->position = scroll; - scrollText->mode = scrollingMode; - scrollText->id = _drawSCrollNextIndex; + _drawSCrollNextIndex++; + ft.Rewind(); + uint32_t scrollIndex = getMatchingOrOldest(stringId, ft, scroll, scrollingMode, colour); + if (scrollIndex >= SPR_SCROLLING_TEXT_START) + return ImageId(scrollIndex); - // Create the string to draw - utf8 scrollString[256]; - ScrollingTextFormat(scrollString, 256, scrollText); + // Setup scrolling text + auto scrollText = &_drawScrollTextList[scrollIndex]; + scrollText->string_id = stringId; + std::memcpy(scrollText->string_args, ft.Buf(), sizeof(scrollText->string_args)); + scrollText->colour = colour; + scrollText->position = scroll; + scrollText->mode = scrollingMode; + scrollText->id = _drawSCrollNextIndex; - const int16_t* scrollingModePositions = kScrollPositions[scrollingMode]; + // Create the string to draw + utf8 scrollString[256]; + format(scrollString, 256, scrollText); - std::fill_n(scrollText->bitmap, 320 * 8, 0x00); - if (LocalisationService_UseTrueTypeFont()) - { - ScrollingTextSetBitmapForTTF(scrollString, scroll, scrollText->bitmap, scrollingModePositions, colour); - } - else - { - ScrollingTextSetBitmapForSprite(scrollString, scroll, scrollText->bitmap, scrollingModePositions, colour); - } + const int16_t* scrollingModePositions = kScrollPositions[scrollingMode]; - uint32_t imageId = SPR_SCROLLING_TEXT_START + scrollIndex; - DrawingEngineInvalidateImage(imageId); - return ImageId(imageId); -} + std::fill_n(scrollText->bitmap, 320 * 8, PaletteIndex::pi0); + if (LocalisationService_UseTrueTypeFont()) + { + setBitmapForTTF(scrollString, scroll, scrollText->bitmap, scrollingModePositions, colour); + } + else + { + setBitmapForSprite(scrollString, scroll, scrollText->bitmap, scrollingModePositions, colour); + } -static void ScrollingTextSetBitmapForSprite( - std::string_view text, int32_t scroll, uint8_t* bitmap, const int16_t* scrollPositionOffsets, colour_t colour) -{ - auto characterColour = colour; - auto fmt = FmtString(text); + uint32_t imageId = SPR_SCROLLING_TEXT_START + scrollIndex; + DrawingEngineInvalidateImage(imageId); + return ImageId(imageId); + } - // Repeat string a maximum of four times (eliminates possibility of infinite loop) - for (auto i = 0; i < 4; i++) + static void setBitmapForSprite( + std::string_view text, int32_t scroll, PaletteIndex* bitmap, const int16_t* scrollPositionOffsets, PaletteIndex colour) { - for (const auto& token : fmt) + auto characterColour = colour; + auto fmt = FmtString(text); + + // Repeat string a maximum of four times (eliminates possibility of infinite loop) + for (auto i = 0; i < 4; i++) { - if (token.IsLiteral()) + for (const auto& token : fmt) { - CodepointView codepoints(token.text); - for (auto codepoint : codepoints) + if (token.IsLiteral()) { - auto characterWidth = FontSpriteGetCodepointWidth(FontStyle::tiny, codepoint); - auto characterBitmap = FontSpriteGetCodepointBitmap(codepoint); - for (; characterWidth != 0; characterWidth--, characterBitmap++) + CodepointView codepoints(token.text); + for (auto codepoint : codepoints) { - // Skip any non-displayed columns - if (scroll != 0) + auto characterWidth = FontSpriteGetCodepointWidth(FontStyle::tiny, codepoint); + auto characterBitmap = FontSpriteGetCodepointBitmap(codepoint); + for (; characterWidth != 0; characterWidth--, characterBitmap++) { - scroll--; - continue; - } + // Skip any non-displayed columns + if (scroll != 0) + { + scroll--; + continue; + } - int16_t scrollPosition = *scrollPositionOffsets; - if (scrollPosition == -1) - return; + int16_t scrollPosition = *scrollPositionOffsets; + if (scrollPosition == -1) + return; - if (scrollPosition > -1) - { - auto dst = &bitmap[scrollPosition]; - for (uint8_t char_bitmap = *characterBitmap; char_bitmap != 0; char_bitmap >>= 1) + if (scrollPosition > -1) { - if (char_bitmap & 1) - *dst = characterColour; + auto dst = &bitmap[scrollPosition]; + for (uint8_t char_bitmap = *characterBitmap; char_bitmap != 0; char_bitmap >>= 1) + { + if (char_bitmap & 1) + *dst = characterColour; - // Jump to next row - dst += 64; + // Jump to next row + dst += 64; + } } + scrollPositionOffsets++; } - scrollPositionOffsets++; } } - } - else if (FormatTokenIsColour(token.kind)) - { - auto g1 = GfxGetG1Element(SPR_TEXT_PALETTE); - if (g1 != nullptr) + else if (FormatTokenIsColour(token.kind)) { auto colourIndex = FormatTokenToTextColour(token.kind); - characterColour = g1->offset[EnumValue(colourIndex) * 4]; + characterColour = getTextColourMapping(colourIndex).fill; } } } } -} -static void ScrollingTextSetBitmapForTTF( - std::string_view text, int32_t scroll, uint8_t* bitmap, const int16_t* scrollPositionOffsets, colour_t colour) -{ -#ifndef DISABLE_TTF - auto fontDesc = TTFGetFontFromSpriteBase(FontStyle::tiny); - if (fontDesc->font == nullptr) - { - ScrollingTextSetBitmapForSprite(text, scroll, bitmap, scrollPositionOffsets, colour); - return; - } - - thread_local std::string ttfBuffer; - ttfBuffer.clear(); - - auto fmt = FmtString(text); - for (const auto& token : fmt) + static void setBitmapForTTF( + std::string_view text, int32_t scroll, PaletteIndex* bitmap, const int16_t* scrollPositionOffsets, PaletteIndex colour) { - if (token.IsLiteral()) +#ifndef DISABLE_TTF + auto fontDesc = TTFGetFontFromSpriteBase(FontStyle::tiny); + if (fontDesc->font == nullptr) { - ttfBuffer.append(token.text); + setBitmapForSprite(text, scroll, bitmap, scrollPositionOffsets, colour); + return; } - else if (FormatTokenIsColour(token.kind)) + + thread_local std::string ttfBuffer; + ttfBuffer.clear(); + + auto fmt = FmtString(text); + for (const auto& token : fmt) { - auto g1 = GfxGetG1Element(SPR_TEXT_PALETTE); - if (g1 != nullptr) + if (token.IsLiteral()) + { + ttfBuffer.append(token.text); + } + else if (FormatTokenIsColour(token.kind)) { auto colourIndex = FormatTokenToTextColour(token.kind); - colour = g1->offset[EnumValue(colourIndex) * 4]; + colour = getTextColourMapping(colourIndex).fill; } } - } - auto surface = TTFSurfaceCacheGetOrAdd(fontDesc->font, ttfBuffer.c_str()); - if (surface == nullptr) - { - return; - } + auto surface = TTFSurfaceCacheGetOrAdd(fontDesc->font, ttfBuffer.c_str()); + if (surface == nullptr) + { + return; + } - int32_t width = surface->w; - auto src = static_cast(surface->pixels); + int32_t width = surface->w; + auto src = static_cast(surface->pixels); - // Pitch offset - src += 2 * width; + // Pitch offset + src += 2 * width; - // Line height offset - int32_t min_vpos = -fontDesc->offset_y; - int32_t max_vpos = std::min(surface->h - 2, min_vpos + 7); + // Line height offset + int32_t min_vpos = -fontDesc->offset_y; + int32_t max_vpos = std::min(surface->h - 2, min_vpos + 7); - bool use_hinting = Config::Get().fonts.enableHinting && fontDesc->hinting_threshold > 0; + bool use_hinting = Config::Get().fonts.enableHinting && fontDesc->hinting_threshold > 0; - for (int32_t x = 0;; x++) - { - if (x >= width) - x = 0; - - // Skip any non-displayed columns - if (scroll == 0) + for (int32_t x = 0;; x++) { - int16_t scrollPosition = *scrollPositionOffsets; - if (scrollPosition == -1) - return; + if (x >= width) + x = 0; - if (scrollPosition > -1) + // Skip any non-displayed columns + if (scroll == 0) { - uint8_t* dst = &bitmap[scrollPosition]; + int16_t scrollPosition = *scrollPositionOffsets; + if (scrollPosition == -1) + return; - for (int32_t y = min_vpos; y < max_vpos; y++) + if (scrollPosition > -1) { - uint8_t src_pixel = src[y * width + x]; - if ((!use_hinting && src_pixel != 0) || src_pixel > 140) - { - // Centre of the glyph: use full colour. - *dst = colour; - } - else if (use_hinting && src_pixel > fontDesc->hinting_threshold) + auto* dst = &bitmap[scrollPosition]; + + for (int32_t y = min_vpos; y < max_vpos; y++) { - // Simulate font hinting by shading the background colour instead. - *dst = BlendColours(colour, *dst); - } + uint8_t src_pixel = src[y * width + x]; + if ((!use_hinting && src_pixel != 0) || src_pixel > 140) + { + // Centre of the glyph: use full colour. + *dst = colour; + } + else if (use_hinting && src_pixel > fontDesc->hinting_threshold) + { + // Simulate font hinting by shading the background colour instead. + *dst = BlendColours(colour, *dst); + } - // Jump to next row - dst += 64; + // Jump to next row + dst += 64; + } } + scrollPositionOffsets++; + } + else + { + scroll--; } - scrollPositionOffsets++; - } - else - { - scroll--; } - } #endif // DISABLE_TTF -} + } + +} // namespace OpenRCT2::Drawing::ScrollingText diff --git a/src/openrct2/drawing/ScrollingText.h b/src/openrct2/drawing/ScrollingText.h index 014003c41165..0ef4d1d11b84 100644 --- a/src/openrct2/drawing/ScrollingText.h +++ b/src/openrct2/drawing/ScrollingText.h @@ -1,8 +1,41 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + #pragma once +#include + +struct ImageId; +struct PaintSession; +using StringId = uint16_t; + +constexpr uint8_t kScrollingModeNone = 255; + namespace OpenRCT2 { - static auto constexpr kMaxScrollingTextLegacyEntries = 32; - static auto constexpr kMaxScrollingTextEntries = 256; + class Formatter; +} + +namespace OpenRCT2::Drawing +{ + enum class PaletteIndex : uint8_t; +} + +namespace OpenRCT2::Drawing::ScrollingText +{ + static auto constexpr kMaxLegacyEntries = 32; + static auto constexpr kMaxEntries = 256; + constexpr int8_t kMaxModes = 38; -} // namespace OpenRCT2 + void initialiseBitmaps(); + void invalidate(); + ImageId setup( + PaintSession& session, StringId stringId, OpenRCT2::Formatter& ft, uint16_t scroll, uint16_t scrollingMode, + PaletteIndex colour); +} // namespace OpenRCT2::Drawing::ScrollingText diff --git a/src/openrct2/drawing/TTF.cpp b/src/openrct2/drawing/TTF.cpp index 358bd95f41f7..e2f853ed0935 100644 --- a/src/openrct2/drawing/TTF.cpp +++ b/src/openrct2/drawing/TTF.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/TTF.h b/src/openrct2/drawing/TTF.h index c53246c8f4c7..b63b76667aae 100644 --- a/src/openrct2/drawing/TTF.h +++ b/src/openrct2/drawing/TTF.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/Text.cpp b/src/openrct2/drawing/Text.cpp index 5f377b537343..0235ebddcf9f 100644 --- a/src/openrct2/drawing/Text.cpp +++ b/src/openrct2/drawing/Text.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -102,12 +102,12 @@ void DrawText(RenderTarget& rt, const ScreenCoordsXY& coords, const TextPaint& p { Rectangle::fill( rt, { { alignedCoords + ScreenCoordsXY{ 0, 11 } }, { alignedCoords + ScreenCoordsXY{ width, 11 } } }, - gTextPalette[1]); - if (gTextPalette[2] != 0) + gTextPalette.fill); + if (gTextPalette.sunnyOutline != PaletteIndex::pi0) { Rectangle::fill( rt, { { alignedCoords + ScreenCoordsXY{ 1, 12 } }, { alignedCoords + ScreenCoordsXY{ width + 1, 12 } } }, - gTextPalette[2]); + gTextPalette.sunnyOutline); } } } diff --git a/src/openrct2/drawing/Text.h b/src/openrct2/drawing/Text.h index 35f78423ce18..c52b842ad740 100644 --- a/src/openrct2/drawing/Text.h +++ b/src/openrct2/drawing/Text.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,7 +15,6 @@ #include "Font.h" struct ScreenCoordsXY; -struct RenderTarget; using OpenRCT2::ColourWithFlags; @@ -24,6 +23,11 @@ namespace OpenRCT2 class Formatter; } +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} + enum class TextAlignment { left, @@ -206,17 +210,19 @@ struct TextPaint } }; -void DrawTextBasic(RenderTarget& rt, const ScreenCoordsXY& coords, StringId format); -void DrawTextEllipsised(RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, StringId format); -int32_t DrawTextWrapped(RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, StringId format); +void DrawTextBasic(OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, StringId format); +void DrawTextEllipsised(OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, StringId format); +int32_t DrawTextWrapped(OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, StringId format); void DrawText( - RenderTarget& rt, const ScreenCoordsXY& coords, const TextPaint& paint, const_utf8string text, bool noFormatting = false); + OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, const TextPaint& paint, const_utf8string text, + bool noFormatting = false); void DrawTextBasic( - RenderTarget& rt, const ScreenCoordsXY& coords, StringId format, const OpenRCT2::Formatter& ft, TextPaint textPaint = {}); -void DrawTextEllipsised( - RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, StringId format, const OpenRCT2::Formatter& ft, + OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, StringId format, const OpenRCT2::Formatter& ft, TextPaint textPaint = {}); +void DrawTextEllipsised( + OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, StringId format, + const OpenRCT2::Formatter& ft, TextPaint textPaint = {}); int32_t DrawTextWrapped( - RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, StringId format, const OpenRCT2::Formatter& ft, - TextPaint textPaint = {}); + OpenRCT2::Drawing::RenderTarget& rt, const ScreenCoordsXY& coords, int32_t width, StringId format, + const OpenRCT2::Formatter& ft, TextPaint textPaint = {}); diff --git a/src/openrct2/drawing/TextColour.cpp b/src/openrct2/drawing/TextColour.cpp new file mode 100644 index 000000000000..99d02dffd968 --- /dev/null +++ b/src/openrct2/drawing/TextColour.cpp @@ -0,0 +1,85 @@ + +#include "TextColour.h" + +#include + +namespace OpenRCT2::Drawing +{ + static std::array kTextColourToPaletteIndex = { { + { + PaletteIndex::pi10, + PaletteIndex::pi0, + PaletteIndex::pi0, + }, + { + PaletteIndex::pi18, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi21, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi173, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi102, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi55, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi187, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi152, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi139, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi164, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi43, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi69, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi199, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + { + PaletteIndex::pi223, + PaletteIndex::pi10, + PaletteIndex::pi10, + }, + } }; + + TextColours getTextColourMapping(TextColour textColour) + { + return kTextColourToPaletteIndex[static_cast(textColour)]; + } +} // namespace OpenRCT2::Drawing diff --git a/src/openrct2/drawing/TextColour.h b/src/openrct2/drawing/TextColour.h index cd216b81f4d6..e1841000927f 100644 --- a/src/openrct2/drawing/TextColour.h +++ b/src/openrct2/drawing/TextColour.h @@ -4,7 +4,7 @@ #include -namespace OpenRCT2 +namespace OpenRCT2::Drawing { enum class TextColour : uint8_t { @@ -24,4 +24,13 @@ namespace OpenRCT2 paleSilver = 13, }; constexpr size_t kNumTextColours = 14; -} // namespace OpenRCT2 + + struct TextColours + { + PaletteIndex fill{}; + PaletteIndex sunnyOutline{}; + PaletteIndex shadowOutline{}; + }; + + TextColours getTextColourMapping(TextColour textColour); +} // namespace OpenRCT2::Drawing diff --git a/src/openrct2/drawing/Weather.cpp b/src/openrct2/drawing/Weather.cpp index b69cc47025c1..b7662c04bb57 100644 --- a/src/openrct2/drawing/Weather.cpp +++ b/src/openrct2/drawing/Weather.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/drawing/Weather.h b/src/openrct2/drawing/Weather.h index 260f154451e6..8cd669e9fdb4 100644 --- a/src/openrct2/drawing/Weather.h +++ b/src/openrct2/drawing/Weather.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,12 +11,11 @@ #include -struct RenderTarget; - namespace OpenRCT2::Drawing { struct IWeatherDrawer; -} + struct RenderTarget; +} // namespace OpenRCT2::Drawing // clang-format off static constexpr uint8_t kRainPattern[] = @@ -37,4 +36,4 @@ static constexpr uint8_t kSnowPattern[] = // clang-format on -void DrawWeather(RenderTarget& rt, OpenRCT2::Drawing::IWeatherDrawer* weatherDrawer); +void DrawWeather(OpenRCT2::Drawing::RenderTarget& rt, OpenRCT2::Drawing::IWeatherDrawer* weatherDrawer); diff --git a/src/openrct2/drawing/X8DrawingEngine.cpp b/src/openrct2/drawing/X8DrawingEngine.cpp index d3aa7e21f438..0eb933704da0 100644 --- a/src/openrct2/drawing/X8DrawingEngine.cpp +++ b/src/openrct2/drawing/X8DrawingEngine.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -260,11 +260,6 @@ IDrawingContext* X8DrawingEngine::GetDrawingContext() return _drawingContext; } -RenderTarget* X8DrawingEngine::GetDrawingPixelInfo() -{ - return &_mainRT; -} - DrawingEngineFlags X8DrawingEngine::GetFlags() { return { DrawingEngineFlag::dirtyOptimisations, DrawingEngineFlag::parallelDrawing }; @@ -275,7 +270,7 @@ void X8DrawingEngine::InvalidateImage([[maybe_unused]] uint32_t image) // Not applicable for this engine } -RenderTarget* X8DrawingEngine::GetDPI() +RenderTarget* X8DrawingEngine::getRT() { return &_mainRT; } @@ -373,7 +368,7 @@ X8DrawingContext::X8DrawingContext(X8DrawingEngine* engine) _engine = engine; } -void X8DrawingContext::Clear(RenderTarget& rt, uint8_t paletteIndex) +void X8DrawingContext::Clear(RenderTarget& rt, PaletteIndex paletteIndex) { Guard::Assert(_isDrawing == true); @@ -383,60 +378,13 @@ void X8DrawingContext::Clear(RenderTarget& rt, uint8_t paletteIndex) for (int32_t y = 0; y < h; y++) { - std::fill_n(ptr, w, paletteIndex); + std::fill_n(ptr, w, EnumValue(paletteIndex)); ptr += w + rt.pitch; } } -/** rct2: 0x0097FF04 */ -// clang-format off -static constexpr uint16_t kPattern[] = { - 0b0111111110000000, - 0b0011111111000000, - 0b0001111111100000, - 0b0000111111110000, - 0b0000011111111000, - 0b0000001111111100, - 0b0000000111111110, - 0b0000000011111111, - 0b1000000001111111, - 0b1100000000111111, - 0b1110000000011111, - 0b1111000000001111, - 0b1111100000000111, - 0b1111110000000011, - 0b1111111000000001, - 0b1111111100000000, -}; - -/** rct2: 0x0097FF14 */ -static constexpr uint16_t kPatternInverse[] = { - 0b1000000001111111, - 0b1100000000111111, - 0b1110000000011111, - 0b1111000000001111, - 0b1111100000000111, - 0b1111110000000011, - 0b1111111000000001, - 0b1111111100000000, - 0b0111111110000000, - 0b0011111111000000, - 0b0001111111100000, - 0b0000111111110000, - 0b0000011111111000, - 0b0000001111111100, - 0b0000000111111110, - 0b0000000011111111, -}; - -/** rct2: 0x0097FEFC */ -static constexpr const uint16_t* kPatterns[] = { - kPattern, - kPatternInverse, -}; -// clang-format on - -void X8DrawingContext::FillRect(RenderTarget& rt, uint32_t colour, int32_t left, int32_t top, int32_t right, int32_t bottom) +void X8DrawingContext::FillRect( + RenderTarget& rt, PaletteIndex paletteIndex, int32_t left, int32_t top, int32_t right, int32_t bottom, bool crossHatch) { Guard::Assert(_isDrawing == true); @@ -485,7 +433,7 @@ void X8DrawingContext::FillRect(RenderTarget& rt, uint32_t colour, int32_t left, int32_t width = endX - startX; int32_t height = endY - startY; - if (colour & 0x1000000) + if (crossHatch) { // Cross hatching uint8_t* dst = startY * rt.LineStride() + startX + rt.bits; @@ -501,7 +449,7 @@ void X8DrawingContext::FillRect(RenderTarget& rt, uint32_t colour, int32_t left, p = p ^ 0x80000000; if (p & 0x80000000) { - *dst = colour & 0xFF; + *dst = EnumValue(paletteIndex); } dst++; } @@ -509,50 +457,12 @@ void X8DrawingContext::FillRect(RenderTarget& rt, uint32_t colour, int32_t left, dst = nextdst; } } - else if (colour & 0x2000000) - { - assert(false); - } - else if (colour & 0x4000000) - { - uint8_t* dst = startY * rt.LineStride() + startX + rt.bits; - - // The pattern loops every 15 lines this is which - // part the pattern is on. - int32_t patternY = (startY + rt.y) % 16; - - // The pattern loops every 15 pixels this is which - // part the pattern is on. - int32_t startkPatternX = (startX + rt.x) % 16; - int32_t patternX = startkPatternX; - - const uint16_t* patternsrc = kPatterns[colour >> 28]; // or possibly uint8_t)[esi*4] ? - - for (int32_t numLines = height; numLines > 0; numLines--) - { - uint8_t* nextdst = dst + rt.LineStride(); - uint16_t pattern = patternsrc[patternY]; - - for (int32_t numPixels = width; numPixels > 0; numPixels--) - { - if (pattern & (1 << patternX)) - { - *dst = colour & 0xFF; - } - patternX = (patternX + 1) % 16; - dst++; - } - patternX = startkPatternX; - patternY = (patternY + 1) % 16; - dst = nextdst; - } - } else { uint8_t* dst = startY * rt.LineStride() + startX + rt.bits; for (int32_t i = 0; i < height; i++) { - std::fill_n(dst, width, colour & 0xFF); + std::fill_n(dst, width, EnumValue(paletteIndex)); dst += rt.LineStride(); } } @@ -603,10 +513,10 @@ void X8DrawingContext::FilterRect( int32_t width = endX - startX; int32_t height = endY - startY; - uint8_t* dst = rt.bits + (startY * rt.LineStride() + startX); + PaletteIndex* dst = reinterpret_cast(rt.bits + (startY * rt.LineStride() + startX)); // Find colour in colour table? - auto paletteMap = GetPaletteMapForColour(EnumValue(palette)); + auto paletteMap = GetPaletteMapForColour(palette); if (paletteMap.has_value()) { const auto& paletteEntries = paletteMap.value(); @@ -617,17 +527,17 @@ void X8DrawingContext::FilterRect( auto c = height; for (int32_t i = 0; i < c; i++) { - uint8_t* nextdst = dst + step * i; + PaletteIndex* nextdst = dst + step * i; for (int32_t j = 0; j < scaled_width; j++) { auto index = *(nextdst + j); - *(nextdst + j) = paletteEntries[index]; + *(nextdst + j) = paletteEntries[EnumValue(index)]; } } } } -void X8DrawingContext::DrawLine(RenderTarget& rt, uint32_t colour, const ScreenLine& line) +void X8DrawingContext::DrawLine(RenderTarget& rt, PaletteIndex colour, const ScreenLine& line) { Guard::Assert(_isDrawing == true); @@ -649,13 +559,13 @@ void X8DrawingContext::DrawSpriteRawMasked( GfxDrawSpriteRawMaskedSoftware(rt, { x, y }, maskImage, colourImage); } -void X8DrawingContext::DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, uint8_t colour) +void X8DrawingContext::DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, PaletteIndex colour) { Guard::Assert(_isDrawing == true); - uint8_t palette[256]; + PaletteIndex palette[256]; std::fill_n(palette, sizeof(palette), colour); - palette[0] = 0; + palette[0] = PaletteIndex::pi0; const auto spriteCoords = ScreenCoordsXY{ x, y }; GfxDrawSpritePaletteSetSoftware(rt, ImageId(image.GetIndex(), 0), spriteCoords, PaletteMap(palette)); @@ -671,7 +581,7 @@ void X8DrawingContext::DrawGlyph(RenderTarget& rt, const ImageId image, int32_t #ifndef DISABLE_TTF template static void DrawTTFBitmapInternal( - RenderTarget& rt, uint8_t colour, TTFSurface* surface, int32_t x, int32_t y, uint8_t hintingThreshold) + RenderTarget& rt, PaletteIndex colour, TTFSurface* surface, int32_t x, int32_t y, uint8_t hintingThreshold) { assert(rt.zoom_level == ZoomLevel{ 0 }); const int32_t surfaceWidth = surface->w; @@ -688,7 +598,7 @@ static void DrawTTFBitmapInternal( int32_t skipY = y - rt.y; auto src = static_cast(surface->pixels); - uint8_t* dst = rt.bits; + PaletteIndex* dst = reinterpret_cast(rt.bits); if (skipX < 0) { @@ -744,8 +654,8 @@ void X8DrawingContext::DrawTTFBitmap( RenderTarget& rt, TextDrawInfo* info, TTFSurface* surface, int32_t x, int32_t y, uint8_t hintingThreshold) { #ifndef DISABLE_TTF - const uint8_t fgColor = info->palette[1]; - const uint8_t bgColor = info->palette[3]; + const auto fgColor = info->palette.fill; + const auto bgColor = info->palette.shadowOutline; if (info->colourFlags.has(ColourFlag::withOutline)) { diff --git a/src/openrct2/drawing/X8DrawingEngine.h b/src/openrct2/drawing/X8DrawingEngine.h index a0825c35f7e7..d89edc3305d2 100644 --- a/src/openrct2/drawing/X8DrawingEngine.h +++ b/src/openrct2/drawing/X8DrawingEngine.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "IDrawingContext.h" #include "IDrawingEngine.h" #include "InvalidationGrid.h" +#include "RenderTarget.h" #include @@ -106,12 +107,10 @@ namespace OpenRCT2 void CopyRect(int32_t x, int32_t y, int32_t width, int32_t height, int32_t dx, int32_t dy) override; std::string Screenshot() override; IDrawingContext* GetDrawingContext() override; - RenderTarget* GetDrawingPixelInfo() override; + RenderTarget* getRT() override; DrawingEngineFlags GetFlags() override; void InvalidateImage(uint32_t image) override; - RenderTarget* GetDPI(); - protected: void ConfigureBits(uint32_t width, uint32_t height, uint32_t pitch); virtual void OnDrawDirtyBlock(int32_t left, int32_t top, int32_t right, int32_t bottom); @@ -136,15 +135,17 @@ namespace OpenRCT2 void BeginDraw(); void EndDraw(); - void Clear(RenderTarget& rt, uint8_t paletteIndex) override; - void FillRect(RenderTarget& rt, uint32_t colour, int32_t x, int32_t y, int32_t w, int32_t h) override; + void Clear(RenderTarget& rt, PaletteIndex paletteIndex) override; + void FillRect( + RenderTarget& rt, PaletteIndex paletteIndex, int32_t x, int32_t y, int32_t w, int32_t h, + bool crossHatch) override; void FilterRect( RenderTarget& rt, FilterPaletteID palette, int32_t left, int32_t top, int32_t right, int32_t bottom) override; - void DrawLine(RenderTarget& rt, uint32_t colour, const ScreenLine& line) override; + void DrawLine(RenderTarget& rt, PaletteIndex colour, const ScreenLine& line) override; void DrawSprite(RenderTarget& rt, const ImageId imageId, int32_t x, int32_t y) override; void DrawSpriteRawMasked( RenderTarget& rt, int32_t x, int32_t y, const ImageId maskImage, const ImageId colourImage) override; - void DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, uint8_t colour) override; + void DrawSpriteSolid(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, PaletteIndex colour) override; void DrawGlyph(RenderTarget& rt, const ImageId image, int32_t x, int32_t y, const PaletteMap& paletteMap) override; void DrawTTFBitmap( RenderTarget& rt, TextDrawInfo* info, TTFSurface* surface, int32_t x, int32_t y, diff --git a/src/openrct2/entity/Balloon.cpp b/src/openrct2/entity/Balloon.cpp index cd6de6e31bd0..9a6d1cd51672 100644 --- a/src/openrct2/entity/Balloon.cpp +++ b/src/openrct2/entity/Balloon.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/Balloon.h b/src/openrct2/entity/Balloon.h index de805d173312..0c8038f4d7bf 100644 --- a/src/openrct2/entity/Balloon.h +++ b/src/openrct2/entity/Balloon.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/Duck.cpp b/src/openrct2/entity/Duck.cpp index 3f94824339fd..9eaf11245d8d 100644 --- a/src/openrct2/entity/Duck.cpp +++ b/src/openrct2/entity/Duck.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -377,7 +377,7 @@ void Duck::Paint(PaintSession& session, int32_t imageDirection) const { PROFILED_FUNCTION(); - RenderTarget& rt = session.DPI; + auto& rt = session.rt; if (rt.zoom_level > ZoomLevel{ 1 }) return; diff --git a/src/openrct2/entity/Duck.h b/src/openrct2/entity/Duck.h index a29c64e7be39..3f0e25783234 100644 --- a/src/openrct2/entity/Duck.h +++ b/src/openrct2/entity/Duck.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/EntityBase.cpp b/src/openrct2/entity/EntityBase.cpp index cf49d24a39f4..c477fedd1aab 100644 --- a/src/openrct2/entity/EntityBase.cpp +++ b/src/openrct2/entity/EntityBase.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,6 +10,7 @@ #include "EntityBase.h" #include "../core/DataSerialiser.h" +#include "../core/Guard.hpp" #include "../interface/Viewport.h" using namespace OpenRCT2; diff --git a/src/openrct2/entity/EntityList.h b/src/openrct2/entity/EntityList.h index 05eb0269ba69..b654e047bf13 100644 --- a/src/openrct2/entity/EntityList.h +++ b/src/openrct2/entity/EntityList.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/EntityRegistry.cpp b/src/openrct2/entity/EntityRegistry.cpp index d43a69b029b7..26b7696aaf94 100644 --- a/src/openrct2/entity/EntityRegistry.cpp +++ b/src/openrct2/entity/EntityRegistry.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/EntityRegistry.h b/src/openrct2/entity/EntityRegistry.h index ae2f3a401b70..1d8797945364 100644 --- a/src/openrct2/entity/EntityRegistry.h +++ b/src/openrct2/entity/EntityRegistry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/EntityTweener.cpp b/src/openrct2/entity/EntityTweener.cpp index 460a318393a4..94e8749c41ba 100644 --- a/src/openrct2/entity/EntityTweener.cpp +++ b/src/openrct2/entity/EntityTweener.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/EntityTweener.h b/src/openrct2/entity/EntityTweener.h index 7d77f7a02e38..5e539100d926 100644 --- a/src/openrct2/entity/EntityTweener.h +++ b/src/openrct2/entity/EntityTweener.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/Fountain.cpp b/src/openrct2/entity/Fountain.cpp index 269082fedbf3..51552e825e99 100644 --- a/src/openrct2/entity/Fountain.cpp +++ b/src/openrct2/entity/Fountain.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -178,11 +178,11 @@ void JumpingFountain::Update() switch (FountainType) { case JumpingFountainType::Water: - if (frame == 11 && (fountainFlags.has(FountainFlag::fast))) + if (frame == 11 && fountainFlags.has(FountainFlag::fast)) { AdvanceAnimation(); } - if (frame == 16 && !(fountainFlags.has(FountainFlag::fast))) + if (frame == 16 && !fountainFlags.has(FountainFlag::fast)) { AdvanceAnimation(); } @@ -411,7 +411,7 @@ void JumpingFountain::Paint(PaintSession& session, int32_t imageDirection) const constexpr uint32_t kJumpingFountainSnowBaseImage = 23037; constexpr uint32_t kJumpingFountainWaterBaseImage = 22973; - RenderTarget& rt = session.DPI; + auto& rt = session.rt; if (rt.zoom_level > ZoomLevel{ 0 }) { return; diff --git a/src/openrct2/entity/Fountain.h b/src/openrct2/entity/Fountain.h index adeb42ad8b4e..bd8b7ed8c9dd 100644 --- a/src/openrct2/entity/Fountain.h +++ b/src/openrct2/entity/Fountain.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/Guest.cpp b/src/openrct2/entity/Guest.cpp index 94b56e9fdbd3..1f99206b2406 100644 --- a/src/openrct2/entity/Guest.cpp +++ b/src/openrct2/entity/Guest.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1669,32 +1669,38 @@ static bool GuestDecideAndBuyItem(Guest& guest, Ride& ride, const ShopItem shopI guest.GiveItem(shopItem); const auto hasRandomShopColour = ride.hasLifecycleFlag(RIDE_LIFECYCLE_RANDOM_SHOP_COLOURS); - if (shopItem == ShopItem::tShirt) - guest.TshirtColour = hasRandomShopColour ? ScenarioRandMax(kColourNumNormal) : ride.trackColours[0].main; - - if (shopItem == ShopItem::hat) - guest.HatColour = hasRandomShopColour ? ScenarioRandMax(kColourNumNormal) : ride.trackColours[0].main; - - if (shopItem == ShopItem::balloon) - guest.BalloonColour = hasRandomShopColour ? ScenarioRandMax(kColourNumNormal) : ride.trackColours[0].main; - - if (shopItem == ShopItem::umbrella) - guest.UmbrellaColour = hasRandomShopColour ? ScenarioRandMax(kColourNumNormal) : ride.trackColours[0].main; - - if (shopItem == ShopItem::map) - guest.ResetPathfindGoal(); - - if (shopItem == ShopItem::photo) - guest.Photo1RideRef = ride.id; - - if (shopItem == ShopItem::photo2) - guest.Photo2RideRef = ride.id; - - if (shopItem == ShopItem::photo3) - guest.Photo3RideRef = ride.id; - - if (shopItem == ShopItem::photo4) - guest.Photo4RideRef = ride.id; + switch (shopItem) + { + case ShopItem::tShirt: + guest.TshirtColour = hasRandomShopColour ? ScenarioRandMax(kColourNumNormal) : ride.trackColours[0].main; + break; + case ShopItem::hat: + guest.HatColour = hasRandomShopColour ? ScenarioRandMax(kColourNumNormal) : ride.trackColours[0].main; + break; + case ShopItem::balloon: + guest.BalloonColour = hasRandomShopColour ? ScenarioRandMax(kColourNumNormal) : ride.trackColours[0].main; + break; + case ShopItem::umbrella: + guest.UmbrellaColour = hasRandomShopColour ? ScenarioRandMax(kColourNumNormal) : ride.trackColours[0].main; + break; + case ShopItem::map: + guest.ResetPathfindGoal(); + break; + case ShopItem::photo: + guest.Photo1RideRef = ride.id; + break; + case ShopItem::photo2: + guest.Photo2RideRef = ride.id; + break; + case ShopItem::photo3: + guest.Photo3RideRef = ride.id; + break; + case ShopItem::photo4: + guest.Photo4RideRef = ride.id; + break; + default: + break; + } guest.WindowInvalidateFlags |= PEEP_INVALIDATE_PEEP_INVENTORY; guest.UpdateAnimationGroup(); @@ -1709,29 +1715,25 @@ static bool GuestDecideAndBuyItem(Guest& guest, Ride& ride, const ShopItem shopI } } - if (shopItemDescriptor.IsFood()) - guest.AmountOfFood++; - - if (shopItemDescriptor.IsDrink()) - guest.AmountOfDrinks++; - - if (shopItemDescriptor.IsSouvenir()) - guest.AmountOfSouvenirs++; - money64* expend_type = &guest.PaidOnSouvenirs; ExpenditureType expenditure = ExpenditureType::shopStock; if (shopItemDescriptor.IsFood()) { + guest.AmountOfFood++; expend_type = &guest.PaidOnFood; expenditure = ExpenditureType::foodDrinkStock; } - - if (shopItemDescriptor.IsDrink()) + else if (shopItemDescriptor.IsDrink()) { + guest.AmountOfDrinks++; expend_type = &guest.PaidOnDrink; expenditure = ExpenditureType::foodDrinkStock; } + else if (shopItemDescriptor.IsSouvenir()) + { + guest.AmountOfSouvenirs++; + } if (!(gameState.park.flags & PARK_FLAGS_NO_MONEY)) FinancePayment(shopItemDescriptor.Cost, expenditure); @@ -1748,10 +1750,10 @@ static bool GuestDecideAndBuyItem(Guest& guest, Ride& ride, const ShopItem shopI guest.SpendMoney(*expend_type, price, expenditure); } ride.totalProfit = AddClamp(ride.totalProfit, price - shopItemDescriptor.Cost); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME; + ride.windowInvalidateFlags.set(RideInvalidateFlag::income); ride.curNumCustomers++; ride.totalCustomers = AddClamp(ride.totalCustomers, 1u); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + ride.windowInvalidateFlags.set(RideInvalidateFlag::customers); return true; } @@ -1840,7 +1842,7 @@ void Guest::OnExitRide(Ride& ride) } ride.totalCustomers = AddClamp(ride.totalCustomers, 1u); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + ride.windowInvalidateFlags.set(RideInvalidateFlag::customers); } /** @@ -2346,7 +2348,7 @@ void Guest::SpendMoney(money64& peep_expend_type, money64 amount, ExpenditureTyp { assert(!(getGameState().park.flags & PARK_FLAGS_NO_MONEY)); - CashInPocket = std::max(0.00_GBP, static_cast(CashInPocket) - amount); + CashInPocket = std::max(0.00_GBP, CashInPocket - amount); CashSpent += amount; peep_expend_type += amount; @@ -2595,7 +2597,7 @@ static bool FindVehicleToEnter( if (vehicle->next_free_seat >= vehicle->num_seats) continue; - if (vehicle->status != Vehicle::Status::WaitingForPassengers) + if (vehicle->status != Vehicle::Status::waitingForPassengers) continue; chosen_train = i; break; @@ -3372,7 +3374,7 @@ static bool PeepShouldUseCashMachine(Guest& guest, RideId rideIndex) ride->updateSatisfaction(guest.Happiness >> 6); ride->curNumCustomers++; ride->totalCustomers = AddClamp(ride->totalCustomers, 1u); - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + ride->windowInvalidateFlags.set(RideInvalidateFlag::customers); } return true; } @@ -3909,7 +3911,7 @@ void Guest::UpdateRideFreeVehicleEnterRide(Ride& ride) else { ride.totalProfit = AddClamp(ride.totalProfit, ridePrice); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME; + ride.windowInvalidateFlags.set(RideInvalidateFlag::income); SpendMoney(PaidOnRides, ridePrice, ExpenditureType::parkRideTickets); } } @@ -4235,7 +4237,7 @@ void Guest::UpdateRideLeaveVehicle() vehicle = gameState.entities.GetEntity(vehicle->prev_vehicle_on_ride)) { auto trackType = vehicle->GetTrackType(); - if (trackType == TrackElemType::Flat || trackType > TrackElemType::MiddleStation) + if (trackType == TrackElemType::flat || trackType > TrackElemType::middleStation) continue; bool foundStation = false; @@ -4804,7 +4806,7 @@ void Guest::UpdateRideOnSpiralSlide() return; case PeepSpiralSlideSubState::prepareToSlide: - if (ride->slideInUse) + if (ride->slideInUse || ride->lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN) return; ride->slideInUse = 1; @@ -5216,7 +5218,7 @@ void Guest::UpdateRideShopLeave() if (ride != nullptr) { ride->totalCustomers = AddClamp(ride->totalCustomers, 1u); - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + ride->windowInvalidateFlags.set(RideInvalidateFlag::customers); ride->updateSatisfaction(Happiness / 64); } } @@ -5697,44 +5699,6 @@ void Guest::UpdateWalking() } } -void Guest::UpdateWaitingAtCrossing() -{ - if (!IsActionInterruptable()) - { - UpdateAction(); - Invalidate(); - if (!IsActionWalking()) - return; - } - - Action = PeepActionType::idle; - NextAnimationType = PeepAnimationType::watchRide; - SwitchNextAnimationType(); - - if (HasFoodOrDrink()) - { - if ((ScenarioRand() & 0xFFFF) <= 1310) - { - Action = PeepActionType::eatFood; - AnimationFrameNum = 0; - AnimationImageIdOffset = 0; - } - - UpdateCurrentAnimationType(); - - return; - } - - if ((ScenarioRand() & 0xFFFF) <= 64) - { - Action = PeepActionType::wave2; - AnimationFrameNum = 0; - AnimationImageIdOffset = 0; - } - - UpdateCurrentAnimationType(); -} - /** * * rct2: 0x69185D diff --git a/src/openrct2/entity/Guest.h b/src/openrct2/entity/Guest.h index 0257f0c93c31..66d5965a6146 100644 --- a/src/openrct2/entity/Guest.h +++ b/src/openrct2/entity/Guest.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -377,7 +377,6 @@ struct Guest : Peep void UpdateRide(); void UpdateOnRide() {}; // TODO void UpdateWalking(); - void UpdateWaitingAtCrossing(); void UpdateQueuing(); void UpdateSitting(); void UpdateEnteringPark(); diff --git a/src/openrct2/entity/Litter.cpp b/src/openrct2/entity/Litter.cpp index 9eae8b4a0796..b0001a08b902 100644 --- a/src/openrct2/entity/Litter.cpp +++ b/src/openrct2/entity/Litter.cpp @@ -184,7 +184,7 @@ void Litter::Paint(PaintSession& session, int32_t imageDirection) const { PROFILED_FUNCTION(); - RenderTarget& rt = session.DPI; + auto& rt = session.rt; if (rt.zoom_level > ZoomLevel{ 0 }) return; // If zoomed at all no litter drawn diff --git a/src/openrct2/entity/Litter.h b/src/openrct2/entity/Litter.h index 41ed66823cf5..8eacc89c642d 100644 --- a/src/openrct2/entity/Litter.h +++ b/src/openrct2/entity/Litter.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/MoneyEffect.cpp b/src/openrct2/entity/MoneyEffect.cpp index cac1ffb4d073..401177986f29 100644 --- a/src/openrct2/entity/MoneyEffect.cpp +++ b/src/openrct2/entity/MoneyEffect.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -198,7 +198,7 @@ void MoneyEffect::Paint(PaintSession& session, int32_t imageDirection) const return; } - RenderTarget& rt = session.DPI; + auto& rt = session.rt; if (rt.zoom_level > ZoomLevel{ 0 }) { return; diff --git a/src/openrct2/entity/MoneyEffect.h b/src/openrct2/entity/MoneyEffect.h index f98b7449f875..94f05f48cb79 100644 --- a/src/openrct2/entity/MoneyEffect.h +++ b/src/openrct2/entity/MoneyEffect.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/Particle.cpp b/src/openrct2/entity/Particle.cpp index 3ade9dd0c520..2e71c9e20eb8 100644 --- a/src/openrct2/entity/Particle.cpp +++ b/src/openrct2/entity/Particle.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -176,7 +176,7 @@ void VehicleCrashParticle::Paint(PaintSession& session, int32_t imageDirection) { PROFILED_FUNCTION(); - RenderTarget& rt = session.DPI; + auto& rt = session.rt; if (rt.zoom_level > ZoomLevel{ 0 }) { return; diff --git a/src/openrct2/entity/Particle.h b/src/openrct2/entity/Particle.h index 1a80c84f9c18..d5ea419a3b96 100644 --- a/src/openrct2/entity/Particle.h +++ b/src/openrct2/entity/Particle.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/PatrolArea.cpp b/src/openrct2/entity/PatrolArea.cpp index 0d4efcdaf971..eabe83e1a2d3 100644 --- a/src/openrct2/entity/PatrolArea.cpp +++ b/src/openrct2/entity/PatrolArea.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/PatrolArea.h b/src/openrct2/entity/PatrolArea.h index 463f2ef7047d..3c88facbf266 100644 --- a/src/openrct2/entity/PatrolArea.h +++ b/src/openrct2/entity/PatrolArea.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/Peep.cpp b/src/openrct2/entity/Peep.cpp index 4b34e6438359..ecf342ec6776 100644 --- a/src/openrct2/entity/Peep.cpp +++ b/src/openrct2/entity/Peep.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -25,6 +25,7 @@ #include "../core/EnumUtils.hpp" #include "../core/Guard.hpp" #include "../core/String.hpp" +#include "../drawing/Drawing.h" #include "../drawing/LightFX.h" #include "../entity/Balloon.h" #include "../entity/EntityList.h" @@ -211,7 +212,7 @@ void PeepUpdateAll() const auto currentTicksMasked = currentTicks & kTicks128Mask; uint32_t index = 0; - // Warning this loop can delete peeps + for (auto peep : EntityList()) { if ((index & kTicks128Mask) == currentTicksMasked) @@ -219,11 +220,7 @@ void PeepUpdateAll() peep->Tick128UpdateGuest(index); } - // 128 tick can delete so double check its not deleted - if (peep->Type == EntityType::guest) - { - peep->Update(); - } + peep->Update(); index++; } @@ -235,11 +232,7 @@ void PeepUpdateAll() staff->Tick128UpdateStaff(); } - // 128 tick can delete so double check its not deleted - if (staff->Type == EntityType::staff) - { - staff->Update(); - } + staff->Update(); index++; } @@ -258,6 +251,46 @@ void PeepUpdateAllBoundingBoxes() } } +void Peep::UpdateWaitingAtCrossing() +{ + if (!IsActionInterruptable()) + { + UpdateAction(); + Invalidate(); + if (!IsActionWalking()) + return; + } + + Action = PeepActionType::idle; + NextAnimationType = PeepAnimationType::watchRide; + SwitchNextAnimationType(); + + auto* guest = As(); + if (guest != nullptr) + { + if (guest->IsActionInterruptable()) + { + if (guest->HasFoodOrDrink()) + { + if ((ScenarioRand() & 0xFFFF) <= 1310) + { + Action = PeepActionType::eatFood; + AnimationFrameNum = 0; + AnimationImageIdOffset = 0; + } + } + else if ((ScenarioRand() & 0xFFFF) <= 64) + { + Action = PeepActionType::wave2; + AnimationFrameNum = 0; + AnimationImageIdOffset = 0; + } + } + } + + UpdateCurrentAnimationType(); +} + /* * rct2: 0x68F3AE * Set peep state to falling if path below has gone missing, return true if current path is valid, false if peep starts falling. @@ -558,7 +591,7 @@ void PeepDecrementNumRiders(Peep* peep) if (ride != nullptr) { ride->numRiders = std::max(0, ride->numRiders - 1); - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride->windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); } } } @@ -583,7 +616,7 @@ void PeepWindowStateUpdate(Peep* peep) if (ride != nullptr) { ride->numRiders++; - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride->windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); } } @@ -628,7 +661,7 @@ void Peep::PickupAbort(int32_t old_x) gPickupPeepImage = ImageId(); } -// Returns GameActions::Status::OK when a peep can be dropped at the given location. When apply is set to true the peep gets +// Returns GameActions::Status::ok when a peep can be dropped at the given location. When apply is set to true the peep gets // dropped. GameActions::Result Peep::Place(const TileCoordsXYZ& location, bool apply) { @@ -640,7 +673,7 @@ GameActions::Result Peep::Place(const TileCoordsXYZ& location, bool apply) } if (tileElement == nullptr) { - return GameActions::Result(GameActions::Status::InvalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); + return GameActions::Result(GameActions::Status::invalidParameters, STR_ERR_CANT_PLACE_PERSON_HERE, kStringIdNone); } // Set the coordinate of destination to be exactly @@ -649,17 +682,17 @@ GameActions::Result Peep::Place(const TileCoordsXYZ& location, bool apply) if (!MapIsLocationOwned(destination)) { - return GameActions::Result(GameActions::Status::NotOwned, STR_ERR_CANT_PLACE_PERSON_HERE, STR_LAND_NOT_OWNED_BY_PARK); + return GameActions::Result(GameActions::Status::notOwned, STR_ERR_CANT_PLACE_PERSON_HERE, STR_LAND_NOT_OWNED_BY_PARK); } if (auto res = MapCanConstructAt({ destination, destination.z, destination.z + (1 * 8) }, { 0b1111, 0 }); - res.Error != GameActions::Status::Ok) + res.error != GameActions::Status::ok) { - const auto stringId = std::get(res.ErrorMessage); + const auto stringId = std::get(res.errorMessage); if (stringId != STR_RAISE_OR_LOWER_LAND_FIRST && stringId != STR_FOOTPATH_IN_THE_WAY) { return GameActions::Result( - GameActions::Status::NoClearance, STR_ERR_CANT_PLACE_PERSON_HERE, stringId, res.ErrorMessageArgs.data()); + GameActions::Status::noClearance, STR_ERR_CANT_PLACE_PERSON_HERE, stringId, res.errorMessageArgs.data()); } } @@ -2259,8 +2292,8 @@ static bool PeepInteractWithShop(Peep* peep, const CoordsXYE& coords) if (cost != 0 && !(getGameState().park.flags & PARK_FLAGS_NO_MONEY)) { ride->totalProfit = AddClamp(ride->totalProfit, cost); - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME; - guest->SpendMoney(cost, ExpenditureType::parkRideTickets); + ride->windowInvalidateFlags.set(RideInvalidateFlag::income); + guest->SpendMoney(cost, ExpenditureType::shopSales); } auto coordsCentre = coords.ToTileCentre(); @@ -2745,7 +2778,7 @@ void Peep::Paint(PaintSession& session, int32_t imageDirection) const } } - if (session.DPI.zoom_level > ZoomLevel{ 2 }) + if (session.rt.zoom_level > ZoomLevel{ 2 }) { return; } diff --git a/src/openrct2/entity/Peep.h b/src/openrct2/entity/Peep.h index fefadec18285..72a501cae698 100644 --- a/src/openrct2/entity/Peep.h +++ b/src/openrct2/entity/Peep.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -421,15 +421,16 @@ struct Peep : EntityBase // TODO: Make these private again when done refactoring public: // Peep [[nodiscard]] bool CheckForPath(); - bool ShouldWaitForLevelCrossing() const; - bool IsOnLevelCrossing() const; - bool IsOnPathBlockedByVehicle() const; std::pair PerformNextAction(); [[nodiscard]] int32_t GetZOnSlope(int32_t tile_x, int32_t tile_y); void SwitchNextAnimationType(); [[nodiscard]] PeepAnimationType GetAnimationType(); protected: + bool ShouldWaitForLevelCrossing() const; + bool IsOnLevelCrossing() const; + bool IsOnPathBlockedByVehicle() const; + void UpdateWaitingAtCrossing(); void UpdateFalling(); void Update1(); void UpdatePicked(); diff --git a/src/openrct2/entity/Staff.cpp b/src/openrct2/entity/Staff.cpp index 21cf85b90ef4..63fa1dbf4b19 100644 --- a/src/openrct2/entity/Staff.cpp +++ b/src/openrct2/entity/Staff.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,38 +11,26 @@ #include "../Context.h" #include "../Diagnostic.h" -#include "../Game.h" #include "../GameState.h" -#include "../Input.h" #include "../actions/StaffSetOrdersAction.h" #include "../audio/Audio.h" #include "../core/DataSerialiser.h" -#include "../core/EnumUtils.hpp" #include "../entity/EntityList.h" #include "../entity/EntityRegistry.h" #include "../interface/Viewport.h" #include "../localisation/StringIds.h" -#include "../management/Finance.h" -#include "../network/Network.h" -#include "../object/ObjectEntryManager.h" -#include "../object/ObjectLimits.h" -#include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/PathAdditionEntry.h" #include "../object/PeepAnimationsObject.h" -#include "../object/SceneryGroupEntry.h" #include "../object/SmallSceneryEntry.h" -#include "../object/TerrainSurfaceObject.h" #include "../paint/tile_element/Paint.TileElement.h" #include "../peep/GuestPathfinding.h" #include "../ride/RideData.h" -#include "../ride/Station.h" #include "../ride/Track.h" #include "../ride/Vehicle.h" #include "../scenario/Scenario.h" #include "../util/Util.h" #include "../windows/Intent.h" -#include "../world/Entrance.h" #include "../world/Footpath.h" #include "../world/Map.h" #include "../world/Scenery.h" @@ -1005,7 +993,7 @@ GameActions::Result StaffSetColour(StaffType staffType, colour_t value) break; default: return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ACTION_INVALID_FOR_THAT_STAFF_TYPE); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ACTION_INVALID_FOR_THAT_STAFF_TYPE); } return GameActions::Result(); } @@ -1261,7 +1249,7 @@ void Staff::UpdateHeadingToInspect() return; } - if (ride->mechanicStatus != RIDE_MECHANIC_STATUS_HEADING || !(ride->lifecycleFlags & RIDE_LIFECYCLE_DUE_INSPECTION)) + if (ride->mechanicStatus != MechanicStatus::heading || !(ride->lifecycleFlags & RIDE_LIFECYCLE_DUE_INSPECTION)) { SetState(PeepState::falling); return; @@ -1279,9 +1267,9 @@ void Staff::UpdateHeadingToInspect() MechanicTimeSinceCall++; if (MechanicTimeSinceCall > 2500) { - if (ride->lifecycleFlags & RIDE_LIFECYCLE_DUE_INSPECTION && ride->mechanicStatus == RIDE_MECHANIC_STATUS_HEADING) + if (ride->lifecycleFlags & RIDE_LIFECYCLE_DUE_INSPECTION && ride->mechanicStatus == MechanicStatus::heading) { - ride->mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; + ride->mechanicStatus = MechanicStatus::calling; } SetState(PeepState::falling); return; @@ -1349,7 +1337,7 @@ void Staff::UpdateHeadingToInspect() void Staff::UpdateAnswering() { auto ride = GetRide(CurrentRide); - if (ride == nullptr || ride->mechanicStatus != RIDE_MECHANIC_STATUS_HEADING) + if (ride == nullptr || ride->mechanicStatus != MechanicStatus::heading) { SetState(PeepState::falling); return; @@ -1386,8 +1374,8 @@ void Staff::UpdateAnswering() MechanicTimeSinceCall++; if (MechanicTimeSinceCall > 2500) { - ride->mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; + ride->mechanicStatus = MechanicStatus::calling; + ride->windowInvalidateFlags.set(RideInvalidateFlag::maintenance); SetState(PeepState::falling); return; } @@ -1830,7 +1818,10 @@ void Staff::UpdatePatrolling() return; if (ShouldWaitForLevelCrossing() && !IsMechanicHeadingToFixRideBlockingPath()) + { + UpdateWaitingAtCrossing(); return; + } const auto [pathingResult, _] = PerformNextAction(); if (!(pathingResult & PATHING_DESTINATION_REACHED)) @@ -2083,8 +2074,8 @@ void Staff::UpdateFixing(int32_t steps) */ bool Staff::UpdateFixingEnterStation(Ride& ride) const { - ride.mechanicStatus = RIDE_MECHANIC_STATUS_FIXING; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; + ride.mechanicStatus = MechanicStatus::fixing; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance); return true; } @@ -2460,8 +2451,8 @@ bool Staff::UpdateFixingFixStationBrakes(bool firstRun, Ride& ride) if (AnimationFrameNum == 0x28) { - ride.mechanicStatus = RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; + ride.mechanicStatus = MechanicStatus::hasFixedStationBrakes; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance); } if (AnimationFrameNum == 0x13 || AnimationFrameNum == 0x19 || AnimationFrameNum == 0x1F || AnimationFrameNum == 0x25 @@ -2525,13 +2516,13 @@ bool Staff::UpdateFixingFinishFixOrInspect(bool firstRun, int32_t steps, Ride& r UpdateRideInspected(CurrentRide); StaffRidesInspected = AddClamp(StaffRidesInspected, 1u); - WindowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME | RIDE_INVALIDATE_RIDE_LIST; - ride.mechanicStatus = RIDE_MECHANIC_STATUS_UNDEFINED; + WindowInvalidateFlags |= PEEP_INVALIDATE_STAFF_STATS; + ride.mechanicStatus = MechanicStatus::undefined; return true; } StaffRidesFixed = AddClamp(StaffRidesFixed, 1u); - WindowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME | RIDE_INVALIDATE_RIDE_LIST; + WindowInvalidateFlags |= PEEP_INVALIDATE_STAFF_STATS; Orientation = PeepDirection << 3; Action = PeepActionType::staffAnswerCall2; @@ -2549,7 +2540,7 @@ bool Staff::UpdateFixingFinishFixOrInspect(bool firstRun, int32_t steps, Ride& r } RideFixBreakdown(ride, steps); - ride.mechanicStatus = RIDE_MECHANIC_STATUS_UNDEFINED; + ride.mechanicStatus = MechanicStatus::undefined; return true; } @@ -2610,7 +2601,7 @@ void Staff::UpdateRideInspected(RideId rideIndex) ride->lifecycleFlags &= ~RIDE_LIFECYCLE_DUE_INSPECTION; ride->reliability += ((100 - ride->reliabilityPercentage) / 4) * (ScenarioRand() & 0xFF); ride->lastInspection = 0; - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE | RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride->windowInvalidateFlags.set(RideInvalidateFlag::maintenance, RideInvalidateFlag::main, RideInvalidateFlag::list); } } diff --git a/src/openrct2/entity/Staff.h b/src/openrct2/entity/Staff.h index 905f5d40250f..db836bb28d4e 100644 --- a/src/openrct2/entity/Staff.h +++ b/src/openrct2/entity/Staff.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/entity/Yaw.hpp b/src/openrct2/entity/Yaw.hpp index 1c43168e25c2..c72bc08b9a15 100644 --- a/src/openrct2/entity/Yaw.hpp +++ b/src/openrct2/entity/Yaw.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/Chat.cpp b/src/openrct2/interface/Chat.cpp index c98d838b89d9..7511821759ed 100644 --- a/src/openrct2/interface/Chat.cpp +++ b/src/openrct2/interface/Chat.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/Chat.h b/src/openrct2/interface/Chat.h index f520e435c6dd..4b690e2a885f 100644 --- a/src/openrct2/interface/Chat.h +++ b/src/openrct2/interface/Chat.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -24,7 +24,6 @@ constexpr int16_t kChatInputSize = 1024; constexpr uint8_t kChatMaxMessageLength = 200; constexpr int16_t kChatMaxWindowWidth = 600; -struct RenderTarget; struct ScreenCoordsXY; enum class ChatInput : uint8_t @@ -36,6 +35,11 @@ enum class ChatInput : uint8_t extern bool gChatOpen; +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} + bool ChatAvailable(); void ChatOpen(); void ChatClose(); @@ -43,7 +47,7 @@ void ChatToggle(); void ChatInit(); void ChatUpdate(); -void ChatDraw(RenderTarget& rt, OpenRCT2::ColourWithFlags chatBackgroundColour); +void ChatDraw(OpenRCT2::Drawing::RenderTarget& rt, OpenRCT2::ColourWithFlags chatBackgroundColour); void ChatAddHistory(std::string_view s); void ChatInput(ChatInput input); diff --git a/src/openrct2/interface/Colour.cpp b/src/openrct2/interface/Colour.cpp index ad818b3dc268..1c0aa97aa3cd 100644 --- a/src/openrct2/interface/Colour.cpp +++ b/src/openrct2/interface/Colour.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -43,7 +43,7 @@ void ColoursInitMaps() { // Get palette index in g1 / g2 const auto paletteIndex = (i < kColourNumOriginal) ? SPR_PALETTE_2_START : SPR_G2_PALETTE_BEGIN - kColourNumOriginal; - const G1Element* g1 = GfxGetG1Element(paletteIndex + i); + const auto* g1 = GfxGetG1Element(paletteIndex + i); if (g1 != nullptr) { ColourMapA[i].colour_0 = static_cast(g1->offset[INDEX_COLOUR_0]); @@ -141,19 +141,20 @@ namespace OpenRCT2::Colour } // namespace OpenRCT2::Colour #ifndef DISABLE_TTF -static BlendColourMapType BlendColourMap = { 0 }; +static BlendColourMapType BlendColourMap = {}; static bool BlendColourMapInitialised = false; -static uint8_t FindClosestPaletteIndex(uint8_t red, uint8_t green, uint8_t blue) +static PaletteIndex FindClosestPaletteIndex(uint8_t red, uint8_t green, uint8_t blue) { - int16_t closest = -1; + PaletteIndex closest = PaletteIndex::pi255; int32_t closestDistance = INT32_MAX; - for (int i = PaletteIndex::pi0; i < PaletteIndex::pi230; i++) + for (auto i = PaletteIndex::pi0; i < PaletteIndex::pi230; i = static_cast(EnumValue(i) + 1)) { - const int32_t distance = std::pow(gPalette[i].Red - red, 2) + std::pow(gPalette[i].Green - green, 2) - + std::pow(gPalette[i].Blue - blue, 2); + const auto& paletteEntry = gPalette[EnumValue(i)]; + const int32_t distance = std::pow(paletteEntry.Red - red, 2) + std::pow(paletteEntry.Green - green, 2) + + std::pow(paletteEntry.Blue - blue, 2); if (distance < closestDistance) { @@ -192,13 +193,13 @@ BlendColourMapType* GetBlendColourMap() return &BlendColourMap; } -uint8_t BlendColours(const uint8_t paletteIndex1, const uint8_t paletteIndex2) +PaletteIndex BlendColours(const PaletteIndex paletteIndex1, const PaletteIndex paletteIndex2) { if (!BlendColourMapInitialised) { InitBlendColourMap(); } - return BlendColourMap[paletteIndex1][paletteIndex2]; + return BlendColourMap[EnumValue(paletteIndex1)][EnumValue(paletteIndex2)]; } #else BlendColourMapType* GetBlendColourMap() diff --git a/src/openrct2/interface/Colour.h b/src/openrct2/interface/Colour.h index 9d1523964b6c..47978f167b16 100644 --- a/src/openrct2/interface/Colour.h +++ b/src/openrct2/interface/Colour.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,6 +10,7 @@ #pragma once #include "../core/StringTypes.h" +#include "../drawing/PaletteIndex.h" #include #include @@ -96,115 +97,25 @@ enum COLOUR_DEEP_WATER = 50 }; -enum PaletteIndex : uint8_t -{ - pi0 = 0, // Transparent - pi10 = 10, // Black (0-dark), Dark grey (0) - pi11 = 11, // Black (middark) - pi12 = 12, // Black (midlight), Dark grey (1-darkest) - pi14 = 14, // Black (lighter), Dark grey (dark) - pi13 = 13, // - pi16 = 16, // - pi17 = 17, // Black (11), Dark grey (light), White (dark) - pi20 = 20, // Dark grey (10), White (light) - pi21 = 21, // Dark grey (11), White (lighter-11) - pi40 = 40, // - pi42 = 42, // Light Brown (lighter), Saturated brown (11) - pi44 = 44, // Construction marker - pi46 = 46, // Tertiary remap 0 / Yellow (darkest) - pi47 = 47, // Tertiary remap 1 / Yellow - pi48 = 48, // Tertiary remap 2 / Yellow - pi49 = 49, // Tertiary remap 3 / Yellow - pi50 = 50, // Tertiary remap 4 / Yellow - pi51 = 51, // Tertiary remap 5 / Yellow - pi52 = 52, // Tertiary remap 6 / Yellow - pi53 = 53, // Tertiary remap 7 / Yellow - pi54 = 54, // Tertiary remap 8 / Yellow - pi55 = 55, // Tertiary remap 9 / Yellow - pi56 = 56, // Tertiary remap 10 / Yellow - pi57 = 57, // Tertiary remap 11 / Yellow (lightest) - pi61 = 61, // Bordeaux Red (darker) - pi62 = 62, // - pi68 = 68, // - pi73 = 73, // - pi99 = 99, // - pi102 = 102, // Bright green (lighter) - pi108 = 108, // - pi111 = 111, // - pi129 = 129, // Light Purple (11) - pi135 = 135, // - pi136 = 136, // Dark Blue (10-11), Light Blue (midlight), Icy Blue (darker) - pi138 = 138, // Light Blue (lighter), Icy Blue (middark) - pi141 = 141, // - pi144 = 144, // Dark Green (1-darkest, - pi161 = 161, // Bright Purple (light) - pi162 = 162, // - pi171 = 171, // Saturated Red (lightest) Bright Red (middark) - pi172 = 172, // Saturated Red (10-11), Bright Red (midlight) - pi173 = 173, // Used to draw intense lines in the Ride Graphs window - pi183 = 183, // Used to draw rides in the Map window - pi186 = 186, // - pi194 = 194, // - pi195 = 195, // - pi202 = 202, // Secondary remap 0 / Pink (darkest) - pi203 = 203, // Secondary remap 1 / Pink - pi204 = 204, // Secondary remap 2 / Pink - pi205 = 205, // Secondary remap 3 / Pink - pi206 = 206, // Secondary remap 4 / Pink - pi207 = 207, // Secondary remap 5 / Pink - pi208 = 208, // Secondary remap 6 / Pink - pi209 = 209, // Secondary remap 7 / Pink - pi210 = 210, // Secondary remap 8 / Pink - pi211 = 211, // Secondary remap 9 / Pink - pi212 = 212, // Secondary remap 10 / Pink - pi213 = 213, // Secondary remap 11 / Pink (lightest) - pi222 = 222, // - pi230 = 230, // Water (waves) - pi231 = 231, // Water (waves) - pi232 = 232, // Water (waves) - pi233 = 233, // Water (waves) - pi234 = 234, // Water (waves) - pi235 = 235, // Water (sparkles) - pi236 = 236, // Water (sparkles) - pi237 = 237, // Water (sparkles) - pi238 = 238, // Water (sparkles) - pi239 = 239, // Water (sparkles) - pi240 = 240, // Track rails - pi241 = 241, // Track rails - pi242 = 242, // Track rails - pi243 = 243, // Primary remap 0 - pi244 = 244, // Primary remap 1 - pi245 = 245, // Primary remap 2 - pi246 = 246, // Primary remap 3 - pi247 = 247, // Primary remap 4 - pi248 = 248, // Primary remap 5 - pi249 = 249, // Primary remap 6 - pi250 = 250, // Primary remap 7 - pi251 = 251, // Primary remap 8 - pi252 = 252, // Primary remap 9 - pi253 = 253, // Primary remap 10 - pi254 = 254, // Primary remap 11 -}; - constexpr size_t kPaletteCount = 256; -constexpr auto kPaletteOffsetDynamic = PaletteIndex::pi10; +constexpr auto kPaletteOffsetDynamic = OpenRCT2::Drawing::PaletteIndex::pi10; constexpr uint8_t kPaletteLengthDynamic = 236; -constexpr auto kPaletteOffsetWaterWaves = PaletteIndex::pi230; -constexpr auto kPaletteOffsetWaterSparkles = PaletteIndex::pi235; +constexpr auto kPaletteOffsetWaterWaves = OpenRCT2::Drawing::PaletteIndex::pi230; +constexpr auto kPaletteOffsetWaterSparkles = OpenRCT2::Drawing::PaletteIndex::pi235; constexpr uint8_t kPaletteLengthWaterWaves = 5; constexpr uint8_t kPaletteLengthWaterSparkles = 5; -constexpr auto kPaletteOffsetTrackRails = PaletteIndex::pi240; +constexpr auto kPaletteOffsetTrackRails = OpenRCT2::Drawing::PaletteIndex::pi240; constexpr uint8_t kPaletteLengthTrackRails = 3; -constexpr auto kPaletteOffsetRemapPrimary = PaletteIndex::pi243; -constexpr auto kPaletteOffsetRemapSecondary = PaletteIndex::pi202; -constexpr auto kPaletteOffsetRemapTertiary = PaletteIndex::pi46; +constexpr auto kPaletteOffsetRemapPrimary = OpenRCT2::Drawing::PaletteIndex::pi243; +constexpr auto kPaletteOffsetRemapSecondary = OpenRCT2::Drawing::PaletteIndex::pi202; +constexpr auto kPaletteOffsetRemapTertiary = OpenRCT2::Drawing::PaletteIndex::pi46; constexpr uint8_t kPaletteLengthRemap = 12; -constexpr auto kPaletteOffsetAnimated = PaletteIndex::pi230; +constexpr auto kPaletteOffsetAnimated = OpenRCT2::Drawing::PaletteIndex::pi230; constexpr uint8_t kPaletteLengthAnimated = 16; constexpr uint8_t kColourNumOriginal = 32; @@ -215,18 +126,18 @@ constexpr colour_t kTextColour255 = 255; struct ColourShadeMap { - PaletteIndex colour_0; - PaletteIndex colour_1; - PaletteIndex darkest; - PaletteIndex darker; - PaletteIndex dark; - PaletteIndex mid_dark; - PaletteIndex mid_light; - PaletteIndex light; - PaletteIndex lighter; - PaletteIndex lightest; - PaletteIndex colour_10; - PaletteIndex colour_11; + OpenRCT2::Drawing::PaletteIndex colour_0; + OpenRCT2::Drawing::PaletteIndex colour_1; + OpenRCT2::Drawing::PaletteIndex darkest; + OpenRCT2::Drawing::PaletteIndex darker; + OpenRCT2::Drawing::PaletteIndex dark; + OpenRCT2::Drawing::PaletteIndex mid_dark; + OpenRCT2::Drawing::PaletteIndex mid_light; + OpenRCT2::Drawing::PaletteIndex light; + OpenRCT2::Drawing::PaletteIndex lighter; + OpenRCT2::Drawing::PaletteIndex lightest; + OpenRCT2::Drawing::PaletteIndex colour_10; + OpenRCT2::Drawing::PaletteIndex colour_11; }; extern ColourShadeMap ColourMapA[COLOUR_COUNT]; @@ -240,8 +151,9 @@ namespace OpenRCT2::Colour } // namespace OpenRCT2::Colour #ifndef DISABLE_TTF -uint8_t BlendColours(const uint8_t paletteIndex1, const uint8_t paletteIndex2); +OpenRCT2::Drawing::PaletteIndex BlendColours( + const OpenRCT2::Drawing::PaletteIndex paletteIndex1, const OpenRCT2::Drawing::PaletteIndex paletteIndex2); #endif -typedef uint8_t BlendColourMapType[kPaletteCount][kPaletteCount]; +typedef OpenRCT2::Drawing::PaletteIndex BlendColourMapType[kPaletteCount][kPaletteCount]; BlendColourMapType* GetBlendColourMap(); diff --git a/src/openrct2/interface/ColourWithFlags.cpp b/src/openrct2/interface/ColourWithFlags.cpp index 8ebd645551fd..f6efd053b684 100644 --- a/src/openrct2/interface/ColourWithFlags.cpp +++ b/src/openrct2/interface/ColourWithFlags.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/ColourWithFlags.h b/src/openrct2/interface/ColourWithFlags.h index 31301fd781ce..99edbdaac7e0 100644 --- a/src/openrct2/interface/ColourWithFlags.h +++ b/src/openrct2/interface/ColourWithFlags.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/Cursors.cpp b/src/openrct2/interface/Cursors.cpp index c736b9479ac0..65ca6e0d8f3f 100644 --- a/src/openrct2/interface/Cursors.cpp +++ b/src/openrct2/interface/Cursors.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/Cursors.h b/src/openrct2/interface/Cursors.h index 2d9195f93f31..b340551a624a 100644 --- a/src/openrct2/interface/Cursors.h +++ b/src/openrct2/interface/Cursors.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/FontFamilies.cpp b/src/openrct2/interface/FontFamilies.cpp index 25c085432d66..c5e89282753f 100644 --- a/src/openrct2/interface/FontFamilies.cpp +++ b/src/openrct2/interface/FontFamilies.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/FontFamilies.h b/src/openrct2/interface/FontFamilies.h index 86fde63f0114..8913b765f019 100644 --- a/src/openrct2/interface/FontFamilies.h +++ b/src/openrct2/interface/FontFamilies.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/Fonts.cpp b/src/openrct2/interface/Fonts.cpp index f4f38731219e..bf1d0d207b9c 100644 --- a/src/openrct2/interface/Fonts.cpp +++ b/src/openrct2/interface/Fonts.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/Fonts.h b/src/openrct2/interface/Fonts.h index c6098b689442..278096787a02 100644 --- a/src/openrct2/interface/Fonts.h +++ b/src/openrct2/interface/Fonts.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index 1b8a96615d0f..65b6f757712e 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -50,7 +50,6 @@ #include "../management/NewsItem.h" #include "../management/Research.h" #include "../network/Network.h" -#include "../object/Object.h" #include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/ObjectRepository.h" @@ -751,11 +750,11 @@ static void ConsoleSetVariableAction(InteractiveConsole& console, std::string va { auto action = TAction(std::forward(args)...); action.SetCallback([&console, var](const GameActions::GameAction*, const GameActions::Result* res) { - if (res->Error != GameActions::Status::Ok) + if (res->error != GameActions::Status::ok) console.WriteLineError( String::stdFormat( - "set %s command failed: %s - %s.", var.c_str(), res->GetErrorTitle().c_str(), - res->GetErrorMessage().c_str())); + "set %s command failed: %s - %s.", var.c_str(), res->getErrorTitle().c_str(), + res->getErrorMessage().c_str())); else console.Execute(String::stdFormat("get %s", var.c_str())); console.EndAsyncExecution(); @@ -1485,25 +1484,33 @@ static void ConsoleCommandReplayStart(InteractiveConsole& console, const argumen std::string name = argv[0]; auto* replayManager = OpenRCT2::GetContext()->GetReplayManager(); - if (replayManager->StartPlayback(name)) + + try { - OpenRCT2::ReplayRecordInfo info; - replayManager->GetCurrentReplayInfo(info); + replayManager->StartPlayback(name); + } + catch (const std::exception& e) + { + console.WriteLine(e.what()); + return; + } - std::time_t ts = info.TimeRecorded; + OpenRCT2::ReplayRecordInfo info; + replayManager->GetCurrentReplayInfo(info); - char recordingDate[128] = {}; - std::strftime(recordingDate, sizeof(recordingDate), "%c", std::localtime(&ts)); + std::time_t ts = info.TimeRecorded; - const char* logFmt = "Replay playback started: %s\n" - " Date Recorded: %s\n" - " Ticks: %u\n" - " Commands: %u\n" - " Checksums: %u"; + char recordingDate[128] = {}; + std::strftime(recordingDate, sizeof(recordingDate), "%c", std::localtime(&ts)); - console.WriteFormatLine(logFmt, info.FilePath.c_str(), recordingDate, info.Ticks, info.NumCommands, info.NumChecksums); - Console::WriteLine(logFmt, info.FilePath.c_str(), recordingDate, info.Ticks, info.NumCommands, info.NumChecksums); - } + const char* logFmt = "Replay playback started: %s\n" + " Date Recorded: %s\n" + " Ticks: %u\n" + " Commands: %u\n" + " Checksums: %u"; + + console.WriteFormatLine(logFmt, info.FilePath.c_str(), recordingDate, info.Ticks, info.NumCommands, info.NumChecksums); + Console::WriteLine(logFmt, info.FilePath.c_str(), recordingDate, info.Ticks, info.NumCommands, info.NumChecksums); } static void ConsoleCommandReplayStop(InteractiveConsole& console, const arguments_t& argv) diff --git a/src/openrct2/interface/InteractiveConsole.h b/src/openrct2/interface/InteractiveConsole.h index 842c5a07b18b..bc4aedf3c367 100644 --- a/src/openrct2/interface/InteractiveConsole.h +++ b/src/openrct2/interface/InteractiveConsole.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,8 +13,6 @@ #include #include -struct RenderTarget; - enum class ConsoleInput : uint8_t { None, @@ -32,6 +30,11 @@ namespace OpenRCT2 struct TextInputSession; } // namespace OpenRCT2 +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} + class InteractiveConsole { private: diff --git a/src/openrct2/interface/Screenshot.cpp b/src/openrct2/interface/Screenshot.cpp index 4ed67f180887..c5b7541e3107 100644 --- a/src/openrct2/interface/Screenshot.cpp +++ b/src/openrct2/interface/Screenshot.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -53,7 +53,7 @@ extern uint8_t gClipHeight; uint8_t gScreenshotCountdown = 0; -static bool WriteDpiToFile(std::string_view path, const RenderTarget& rt, const GamePalette& palette) +static bool WriteRTToFile(std::string_view path, const RenderTarget& rt, const GamePalette& palette) { auto const pixels8 = rt.bits; auto const pixelsLen = rt.LineStride() * rt.height; @@ -183,7 +183,7 @@ std::string ScreenshotDumpPNG(RenderTarget& rt) return {}; } - if (WriteDpiToFile(path.value(), rt, gPalette)) + if (WriteRTToFile(path.value(), rt, gPalette)) { return path.value(); } @@ -228,7 +228,7 @@ static int32_t GetTallestVisibleTileTop( return minViewY - 64; } -static RenderTarget CreateDPI(const Viewport& viewport) +static RenderTarget CreateRT(const Viewport& viewport) { RenderTarget rt; rt.width = viewport.width; @@ -241,13 +241,13 @@ static RenderTarget CreateDPI(const Viewport& viewport) if (viewport.flags & VIEWPORT_FLAG_TRANSPARENT_BACKGROUND) { - std::memset(rt.bits, PaletteIndex::pi0, static_cast(rt.width) * rt.height); + std::memset(rt.bits, EnumValue(PaletteIndex::pi0), static_cast(rt.width) * rt.height); } return rt; } -static void ReleaseDPI(RenderTarget& rt) +static void ReleaseRT(RenderTarget& rt) { if (rt.bits != nullptr) delete[] rt.bits; @@ -356,10 +356,10 @@ void ScreenshotGiant() viewport.flags |= VIEWPORT_FLAG_TRANSPARENT_BACKGROUND; } - rt = CreateDPI(viewport); + rt = CreateRT(viewport); RenderViewport(nullptr, viewport, rt); - WriteDpiToFile(path.value(), rt, gPalette); + WriteRTToFile(path.value(), rt, gPalette); // Show user that screenshot saved successfully const auto filename = Path::GetFileName(path.value()); @@ -374,7 +374,7 @@ void ScreenshotGiant() ContextShowError(STR_SCREENSHOT_FAILED, kStringIdNone, {}, true); } - ReleaseDPI(rt); + ReleaseRT(rt); } static void ApplyOptions(const ScreenshotOptions* options, Viewport& viewport) @@ -560,17 +560,17 @@ int32_t CommandLineForScreenshot(const char** argv, int32_t argc, ScreenshotOpti ApplyOptions(options, viewport); - rt = CreateDPI(viewport); + rt = CreateRT(viewport); RenderViewport(nullptr, viewport, rt); - WriteDpiToFile(outputPath, rt, gPalette); + WriteRTToFile(outputPath, rt, gPalette); } catch (const std::exception& e) { std::printf("%s\n", e.what()); exitCode = -1; } - ReleaseDPI(rt); + ReleaseRT(rt); DrawingEngineDispose(); @@ -653,8 +653,8 @@ void CaptureImage(const CaptureOptions& options) } auto outputPath = ResolveFilenameForCapture(options.Filename); - auto rt = CreateDPI(viewport); + auto rt = CreateRT(viewport); RenderViewport(nullptr, viewport, rt); - WriteDpiToFile(outputPath, rt, gPalette); - ReleaseDPI(rt); + WriteRTToFile(outputPath, rt, gPalette); + ReleaseRT(rt); } diff --git a/src/openrct2/interface/Screenshot.h b/src/openrct2/interface/Screenshot.h index d4214dcef79f..ee1bbf35370a 100644 --- a/src/openrct2/interface/Screenshot.h +++ b/src/openrct2/interface/Screenshot.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,8 +17,6 @@ #include #include -struct RenderTarget; - extern uint8_t gScreenshotCountdown; struct ScreenshotOptions @@ -53,9 +51,14 @@ struct CaptureOptions bool Transparent{}; }; +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} + void ScreenshotCheck(); std::string ScreenshotDump(); -std::string ScreenshotDumpPNG(RenderTarget& rt); +std::string ScreenshotDumpPNG(OpenRCT2::Drawing::RenderTarget& rt); void ScreenshotGiant(); int32_t CommandLineForScreenshot(const char** argv, int32_t argc, ScreenshotOptions* options); diff --git a/src/openrct2/interface/ScrollArea.h b/src/openrct2/interface/ScrollArea.h index d677085ef949..4a052a42c5db 100644 --- a/src/openrct2/interface/ScrollArea.h +++ b/src/openrct2/interface/ScrollArea.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/StdInOutConsole.cpp b/src/openrct2/interface/StdInOutConsole.cpp index 5eb143b58aee..9fe947c1de57 100644 --- a/src/openrct2/interface/StdInOutConsole.cpp +++ b/src/openrct2/interface/StdInOutConsole.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/StdInOutConsole.h b/src/openrct2/interface/StdInOutConsole.h index b79ac20c971d..7106c6d8199c 100644 --- a/src/openrct2/interface/StdInOutConsole.h +++ b/src/openrct2/interface/StdInOutConsole.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index bfbe7a72c504..af6e65d71dc4 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,7 +13,6 @@ #include "../Diagnostic.h" #include "../Game.h" #include "../GameState.h" -#include "../Input.h" #include "../OpenRCT2.h" #include "../config/Config.h" #include "../core/Guard.hpp" @@ -22,9 +21,7 @@ #include "../drawing/Drawing.h" #include "../drawing/IDrawingEngine.h" #include "../drawing/Rectangle.h" -#include "../entity/EntityList.h" #include "../entity/Guest.h" -#include "../entity/PatrolArea.h" #include "../entity/Staff.h" #include "../interface/Cursors.h" #include "../object/LargeSceneryEntry.h" @@ -39,7 +36,6 @@ #include "../ui/WindowManager.h" #include "../world/Climate.h" #include "../world/Map.h" -#include "../world/MapSelection.h" #include "../world/tile_element/LargeSceneryElement.h" #include "../world/tile_element/SmallSceneryElement.h" #include "../world/tile_element/TileElement.h" @@ -90,31 +86,6 @@ namespace OpenRCT2 static void ViewportUpdateSmartFollowVehicle(WindowBase* window); static void ViewportInvalidate(const Viewport* viewport, const ScreenRect& screenRect); - /** - * This is not a viewport function. It is used to setup many variables for - * multiple things. - * rct2: 0x006E6EAC - */ - void ViewportInitAll() - { - if (!gOpenRCT2NoGraphics) - { - ColoursInitMaps(); - } - - WindowInitAll(); - - // ? - gInputFlags.clearAll(); - InputSetState(InputState::Reset); - gPressedWidget.windowClassification = WindowClass::null; - gPickupPeepImage = ImageId(); - ResetTooltipNotShown(); - gMapSelectFlags.clearAll(); - ClearPatrolAreaToRender(); - TextinputCancel(); - } - /** * Converts between 3d point of a sprite to 2d coordinates for centring on that * sprite @@ -444,7 +415,7 @@ namespace OpenRCT2 for (; it != gWindowList.end(); it++) { auto w = it->get(); - if (!(w->flags.has(WindowFlag::transparent)) || (w->flags.has(WindowFlag::dead))) + if (!w->flags.has(WindowFlag::transparent) || w->flags.has(WindowFlag::dead)) continue; if (w->viewport == window->viewport) continue; @@ -497,7 +468,7 @@ namespace OpenRCT2 if (DrawingEngineHasDirtyOptimisations()) { - RenderTarget& rt = DrawingEngineGetDpi(); + RenderTarget& rt = DrawingEngineGetRT(); ViewportShiftPixels(rt, w, { left, top, right, bottom }, { x_diff, y_diff }); } else @@ -872,7 +843,7 @@ namespace OpenRCT2 * bx: top * dx: right * esi: viewport - * edi: dpi + * edi: rt * ebp: bottom */ void ViewportRender(RenderTarget& rt, const Viewport* viewport) @@ -909,12 +880,12 @@ namespace OpenRCT2 | VIEWPORT_FLAG_CLIP_VIEW) && (~session.ViewFlags & VIEWPORT_FLAG_TRANSPARENT_BACKGROUND)) { - uint8_t colour = COLOUR_AQUAMARINE; + PaletteIndex colour = PaletteIndex::pi10; if (session.ViewFlags & VIEWPORT_FLAG_HIDE_ENTITIES) { - colour = COLOUR_BLACK; + colour = PaletteIndex::pi0; } - GfxClear(session.DPI, colour); + GfxClear(session.rt, colour); } PaintDrawStructs(session); @@ -922,12 +893,12 @@ namespace OpenRCT2 if (Config::Get().general.renderWeatherGloom && !gTrackDesignSaveMode && !(session.ViewFlags & VIEWPORT_FLAG_HIDE_ENTITIES) && !(session.ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES)) { - ViewportPaintWeatherGloom(session.DPI); + ViewportPaintWeatherGloom(session.rt); } if (session.PSStringHead != nullptr) { - PaintDrawMoneyStructs(session.DPI, session.PSStringHead); + PaintDrawMoneyStructs(session.rt, session.PSStringHead); } } @@ -938,7 +909,7 @@ namespace OpenRCT2 * ebx: top * edx: right * esi: viewport - * edi: dpi + * edi: rt * ebp: bottom */ static void ViewportPaint(const Viewport* viewport, RenderTarget& rt) @@ -990,7 +961,7 @@ namespace OpenRCT2 PaintSession* session = PaintSessionAlloc(worldRT, viewport->flags, viewport->rotation); _paintColumns.push_back(session); - RenderTarget& columnRT = session->DPI; + RenderTarget& columnRT = session->rt; if (x >= columnRT.x) { const int32_t leftPitch = x - columnRT.x; @@ -1554,14 +1525,14 @@ namespace OpenRCT2 uint8_t* index = g1->offset + (y * g1->width) + x; // Needs investigation as it has no consideration for pure BMP maps. - if (!(g1->flags & G1_FLAG_HAS_TRANSPARENCY)) + if (!g1->flags.has(G1Flag::hasTransparency)) { return false; } if (imageType & IMAGE_TYPE_REMAP) { - return paletteMap[*index] != 0; + return paletteMap[*index] != PaletteIndex::pi0; } if (imageType & IMAGE_TYPE_TRANSPARENT) @@ -1616,16 +1587,16 @@ namespace OpenRCT2 if (rt.zoom_level > ZoomLevel{ 0 }) { - if (g1->flags & G1_FLAG_NO_ZOOM_DRAW) + if (g1->flags.has(G1Flag::noZoomDraw)) { return false; } - while (g1->flags & G1_FLAG_HAS_ZOOM_SPRITE && zoomLevel > ZoomLevel{ 0 }) + while (g1->flags.has(G1Flag::hasZoomSprite) && zoomLevel > ZoomLevel{ 0 }) { - imageId = imageId.WithIndex(imageId.GetIndex() - g1->zoomed_offset); + imageId = imageId.WithIndex(imageId.GetIndex() - g1->zoomedOffset); g1 = GfxGetG1Element(imageId); - if (g1 == nullptr || g1->flags & G1_FLAG_NO_ZOOM_DRAW) + if (g1 == nullptr || g1->flags.has(G1Flag::noZoomDraw)) { return false; } @@ -1637,8 +1608,8 @@ namespace OpenRCT2 } } - origin.x += g1->x_offset; - origin.y += g1->y_offset; + origin.x += g1->xOffset; + origin.y += g1->yOffset; interactionPoint -= origin; if (interactionPoint.x < 0 || interactionPoint.y < 0 || interactionPoint.x >= g1->width @@ -1647,12 +1618,12 @@ namespace OpenRCT2 return false; } - if (g1->flags & G1_FLAG_RLE_COMPRESSION) + if (g1->flags.has(G1Flag::hasRLECompression)) { return IsPixelPresentRLE(g1->offset, interactionPoint.x, interactionPoint.y); } - if (!(g1->flags & G1_FLAG_1)) + if (!g1->flags.has(G1Flag::one)) { return IsPixelPresentBMP(imageType, g1, interactionPoint.x, interactionPoint.y, paletteMap); } @@ -1684,7 +1655,7 @@ namespace OpenRCT2 { paletteIndex = imageId.GetRemap(); } - if (auto pm = GetPaletteMapForColour(paletteIndex); pm.has_value()) + if (auto pm = GetPaletteMapForColour(static_cast(paletteIndex)); pm.has_value()) { paletteMap = pm.value(); } @@ -1719,7 +1690,7 @@ namespace OpenRCT2 while (next_ps != nullptr) { ps = next_ps; - if (IsSpriteInteractedWith(session->DPI, ps->image_id, ps->ScreenPos)) + if (IsSpriteInteractedWith(session->rt, ps->image_id, ps->ScreenPos)) { if (PSInteractionTypeIsInFilter(ps, filter) && GetPaintStructVisibility(ps, viewFlags) == VisibilityKind::visible) @@ -1734,7 +1705,7 @@ namespace OpenRCT2 #pragma GCC diagnostic ignored "-Wnull-dereference" for (AttachedPaintStruct* attached_ps = ps->Attached; attached_ps != nullptr; attached_ps = attached_ps->NextEntry) { - if (IsSpriteInteractedWith(session->DPI, attached_ps->image_id, ps->ScreenPos + attached_ps->RelativePos)) + if (IsSpriteInteractedWith(session->rt, attached_ps->image_id, ps->ScreenPos + attached_ps->RelativePos)) { if (PSInteractionTypeIsInFilter(ps, filter) && GetPaintStructVisibility(ps, viewFlags) == VisibilityKind::visible) @@ -1780,8 +1751,7 @@ namespace OpenRCT2 Viewport* viewport = window->viewport; auto viewLoc = screenCoords; viewLoc -= viewport->pos; - if (viewLoc.x >= 0 && viewLoc.x < static_cast(viewport->width) && viewLoc.y >= 0 - && viewLoc.y < static_cast(viewport->height)) + if ((viewLoc.x >= 0) && (viewLoc.x < viewport->width) && (viewLoc.y >= 0) && (viewLoc.y < viewport->height)) { viewLoc.x = viewport->zoom.ApplyTo(viewLoc.x); viewLoc.y = viewport->zoom.ApplyTo(viewLoc.y); @@ -2058,8 +2028,3 @@ namespace OpenRCT2 return viewports; } } // namespace OpenRCT2 - -ZoomLevel ZoomLevel::min() -{ - return ZoomLevel{ -2 }; -} diff --git a/src/openrct2/interface/Viewport.h b/src/openrct2/interface/Viewport.h index c5fe5f1bf2c1..73e77cb98af2 100644 --- a/src/openrct2/interface/Viewport.h +++ b/src/openrct2/interface/Viewport.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,12 +19,16 @@ struct PaintSession; struct PaintStruct; -struct RenderTarget; struct EntityBase; struct Guest; struct Staff; struct PaintEntry; +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} + namespace OpenRCT2 { struct TileElement; @@ -183,7 +187,6 @@ namespace OpenRCT2 // rct2: 0x014234BC extern Viewport* gMusicTrackingViewport; - void ViewportInitAll(); std::optional centre2dCoordinates(const CoordsXYZ& loc, Viewport* viewport); void ViewportCreate(WindowBase& w, const ScreenCoordsXY& screenCoords, int32_t width, int32_t height, const Focus& focus); void ViewportRemove(Viewport* viewport); @@ -197,7 +200,7 @@ namespace OpenRCT2 void ViewportUpdateSmartFollowGuest(WindowBase* window, const Guest& peep); void ViewportRotateSingle(WindowBase* window, int32_t direction); void ViewportRotateAll(int32_t direction); - void ViewportRender(RenderTarget& rt, const Viewport* viewport); + void ViewportRender(OpenRCT2::Drawing::RenderTarget& rt, const Viewport* viewport); CoordsXYZ ViewportAdjustForMapHeight(const ScreenCoordsXY& startCoords, uint8_t rotation); diff --git a/src/openrct2/interface/Widget.h b/src/openrct2/interface/Widget.h index a95da188fe75..db441255cf80 100644 --- a/src/openrct2/interface/Widget.h +++ b/src/openrct2/interface/Widget.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -102,28 +102,38 @@ namespace OpenRCT2 int16_t width() const { - return right - left; + return right - left + 1; + } + + void setWidth(int16_t newWidth) + { + right = left + newWidth - 1; } int16_t height() const { - return bottom - top; + return bottom - top + 1; + } + + void setHeight(int16_t newHeight) + { + bottom = top + newHeight - 1; } int16_t midX() const { - return (left + right) / 2; + return left + (width() / 2); } int16_t midY() const { - return (top + bottom) / 2; + return top + (height() / 2); } int16_t textTop() const { - if (height() >= 10) - return std::max(top, top + (height() / 2) - 5); + if (height() >= 11) + return std::max(top, top + (height() / 2) - 6); return top - 1; } @@ -158,7 +168,7 @@ namespace OpenRCT2 bool IsVisible() const { - return !(flags.has(OpenRCT2::WidgetFlag::isHidden)); + return !flags.has(OpenRCT2::WidgetFlag::isHidden); } }; diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index a52a29c41c77..df4450cd9ad9 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -73,8 +73,10 @@ static constexpr float kWindowScrollLocations[][2] = { }; // clang-format on - static void WindowDrawCore(RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom); - static void WindowDrawSingle(RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom); + static void WindowDrawCore( + Drawing::RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom); + static void WindowDrawSingle( + Drawing::RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom); std::vector>::iterator WindowGetIterator(const WindowBase* w) { @@ -405,7 +407,7 @@ static constexpr float kWindowScrollLocations[][2] = { // rct2: 0x006E7C76 if (w.viewportTargetSprite.IsNull()) { - if (!(w.flags.has(WindowFlag::noScrolling))) + if (!w.flags.has(WindowFlag::noScrolling)) { w.savedViewPos = screenCoords - ScreenCoordsXY{ static_cast(w.viewport->ViewWidth() * kWindowScrollLocations[i][0]), @@ -535,7 +537,7 @@ static constexpr float kWindowScrollLocations[][2] = { * Splits a drawing of a window into regions that can be seen and are not hidden * by other opaque overlapping windows. */ - void WindowDraw(RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom) + void WindowDraw(Drawing::RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom) { if (!w.isVisible) return; @@ -592,7 +594,8 @@ static constexpr float kWindowScrollLocations[][2] = { /** * Draws the given window and any other overlapping transparent windows. */ - static void WindowDrawCore(RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom) + static void WindowDrawCore( + Drawing::RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom) { // Clamp region left = std::max(left, w.windowPos.x); @@ -610,18 +613,20 @@ static constexpr float kWindowScrollLocations[][2] = { auto* v = (*it).get(); if (v->flags.has(WindowFlag::dead)) continue; - if ((&w == v || (v->flags.has(WindowFlag::transparent))) && v->isVisible) + if ((&w == v || v->flags.has(WindowFlag::transparent)) && v->isVisible) { WindowDrawSingle(rt, *v, left, top, right, bottom); } } } - static void WindowDrawSingle(RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom) + static void WindowDrawSingle( + Drawing::RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom) { assert(rt.zoom_level == ZoomLevel{ 0 }); + // Copy render target so we can crop it - RenderTarget copy = rt; + Drawing::RenderTarget copy = rt; // Clamp left to 0 int32_t overflow = left - copy.x; @@ -726,7 +731,7 @@ static constexpr float kWindowScrollLocations[][2] = { gInputFlags.set(InputFlag::toolActive); gInputFlags.unset(InputFlag::leftMousePressed); - gInputFlags.unset(InputFlag::unk6); + gInputFlags.unset(InputFlag::allowRightMouseRemoval); gCurrentToolId = tool; gCurrentToolWidget.windowClassification = w.classification; gCurrentToolWidget.windowNumber = w.number; @@ -744,9 +749,6 @@ static constexpr float kWindowScrollLocations[][2] = { { gInputFlags.unset(InputFlag::toolActive); - MapInvalidateSelectionRect(); - MapInvalidateMapSelectionTiles(); - // Reset map selection gMapSelectFlags.clearAll(); @@ -903,7 +905,7 @@ static constexpr float kWindowScrollLocations[][2] = { * right (dx) * bottom (bp) */ - void WindowDrawAll(RenderTarget& rt, int32_t left, int32_t top, int32_t right, int32_t bottom) + void WindowDrawAll(Drawing::RenderTarget& rt, int32_t left, int32_t top, int32_t right, int32_t bottom) { auto windowRT = rt.Crop({ left, top }, { right - left, bottom - top }); WindowVisitEach([&windowRT, left, top, right, bottom](WindowBase* w) { diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index ae2570c79d47..d093542a5bcf 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -22,13 +22,17 @@ #include #include -struct RenderTarget; struct TrackDesignFileRef; struct ScenarioIndexEntry; enum class CursorID : uint8_t; enum class CloseWindowModifier : uint8_t; +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} + namespace OpenRCT2 { using WindowNumber = int16_t; @@ -319,8 +323,8 @@ namespace OpenRCT2 void WindowCheckAllValidZoom(); void WindowZoomSet(WindowBase& w, ZoomLevel zoomLevel, bool atCursor); - void WindowDrawAll(RenderTarget& rt, int32_t left, int32_t top, int32_t right, int32_t bottom); - void WindowDraw(RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom); + void WindowDrawAll(Drawing::RenderTarget& rt, int32_t left, int32_t top, int32_t right, int32_t bottom); + void WindowDraw(Drawing::RenderTarget& rt, WindowBase& w, int32_t left, int32_t top, int32_t right, int32_t bottom); bool isToolActive(WindowClass cls); bool isToolActive(WindowClass cls, WindowNumber number); diff --git a/src/openrct2/interface/WindowBase.cpp b/src/openrct2/interface/WindowBase.cpp index 473dfdbf4d4c..c7330714440d 100644 --- a/src/openrct2/interface/WindowBase.cpp +++ b/src/openrct2/interface/WindowBase.cpp @@ -1,6 +1,7 @@ #include "WindowBase.h" #include "../config/Config.h" +#include "../drawing/Drawing.h" #include "../entity/EntityList.h" #include "../entity/EntityRegistry.h" #include "Cursors.h" @@ -110,7 +111,7 @@ namespace OpenRCT2 // Figure out if we need to push the other widgets down to accommodate a resized title/caption auto preferredHeight = getTitleBarTargetHeight(); - auto currentHeight = titleWidget.height(); + auto currentHeight = titleWidget.height() - 1; auto heightDifference = preferredHeight - currentHeight; if (!hasTitleWidget || heightDifference == 0) @@ -151,8 +152,8 @@ namespace OpenRCT2 int16_t WindowBase::getTitleBarCurrentHeight() const { - if (!(flags.has(WindowFlag::noTitleBar)) && widgets.size() > 2) - return widgets[1].height(); + if (!flags.has(WindowFlag::noTitleBar) && widgets.size() > 2) + return widgets[1].height() - 1; else return 0; } diff --git a/src/openrct2/interface/WindowBase.h b/src/openrct2/interface/WindowBase.h index f7c55756bb60..ed284c7d14d1 100644 --- a/src/openrct2/interface/WindowBase.h +++ b/src/openrct2/interface/WindowBase.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -161,10 +161,10 @@ namespace OpenRCT2 virtual void onPrepareDraw() { } - virtual void onDraw(RenderTarget& rt) + virtual void onDraw(Drawing::RenderTarget& rt) { } - virtual void onDrawWidget(WidgetIndex widgetIndex, RenderTarget& rt) + virtual void onDrawWidget(WidgetIndex widgetIndex, Drawing::RenderTarget& rt) { } virtual OpenRCT2String onTooltip(WidgetIndex widgetIndex, StringId fallback) @@ -203,7 +203,7 @@ namespace OpenRCT2 virtual void onScrollMouseDown(int32_t scrollIndex, const ScreenCoordsXY& screenCoords) { } - virtual void onScrollDraw(int32_t scrollIndex, RenderTarget& rt) + virtual void onScrollDraw(int32_t scrollIndex, Drawing::RenderTarget& rt) { } virtual void onToolUpdate(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) diff --git a/src/openrct2/interface/WindowClasses.h b/src/openrct2/interface/WindowClasses.h index 2314a4070bd0..cc4af492a6e2 100644 --- a/src/openrct2/interface/WindowClasses.h +++ b/src/openrct2/interface/WindowClasses.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/interface/ZoomLevel.cpp b/src/openrct2/interface/ZoomLevel.cpp index e7f71acd6645..5133b0981591 100644 --- a/src/openrct2/interface/ZoomLevel.cpp +++ b/src/openrct2/interface/ZoomLevel.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,11 @@ #include "ZoomLevel.h" +ZoomLevel ZoomLevel::min() +{ + return ZoomLevel{ -2 }; +} + ZoomLevel ZoomLevel::operator++(int) { ZoomLevel tmp(*this); diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj index cdc55f28bd65..fa8c26e3d85a 100644 --- a/src/openrct2/libopenrct2.vcxproj +++ b/src/openrct2/libopenrct2.vcxproj @@ -245,7 +245,9 @@ + + @@ -254,7 +256,9 @@ + + @@ -356,6 +360,7 @@ + @@ -387,6 +392,7 @@ + @@ -836,9 +842,11 @@ + + @@ -1044,7 +1052,7 @@ - + diff --git a/src/openrct2/localisation/Currency.cpp b/src/openrct2/localisation/Currency.cpp index f569a7cc9e28..8cc490d97ebf 100644 --- a/src/openrct2/localisation/Currency.cpp +++ b/src/openrct2/localisation/Currency.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -39,6 +39,7 @@ namespace OpenRCT2 { "TWD", 1000, CurrencyAffix::prefix, u8"NT$", CurrencyAffix::prefix, "NT$", STR_NEW_TAIWAN_DOLLAR}, // New Taiwan Dollar { "CNY", 100, CurrencyAffix::prefix, u8"CN¥", CurrencyAffix::prefix, "CNY", STR_CHINESE_YUAN }, // Chinese Yuan { "HUF", 1000, CurrencyAffix::suffix, u8" Ft", CurrencyAffix::suffix, " Ft", STR_HUNGARIAN_FORINT}, // Hungarian Forint + { "PLN", 100, CurrencyAffix::suffix, u8" zł", CurrencyAffix::suffix, " zł", STR_POLISH_ZLOTY}, // Polish Złoty { "CTM", 10, CurrencyAffix::prefix, u8"Ctm", CurrencyAffix::prefix, "Ctm", STR_CUSTOM_CURRENCY }, // Customizable currency }; // clang-format on diff --git a/src/openrct2/localisation/Currency.h b/src/openrct2/localisation/Currency.h index a3b16cbd5a62..a3933504e498 100644 --- a/src/openrct2/localisation/Currency.h +++ b/src/openrct2/localisation/Currency.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/CurrencyTypes.h b/src/openrct2/localisation/CurrencyTypes.h index fdf5d9dccacb..5c70315c79cc 100644 --- a/src/openrct2/localisation/CurrencyTypes.h +++ b/src/openrct2/localisation/CurrencyTypes.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -33,6 +33,7 @@ namespace OpenRCT2 newTaiwanDollar, // New Taiwan Dollar yuan, // Chinese Yuan forint, // Hungarian Forint + zloty, // Polish Złoty custom, // Custom currency diff --git a/src/openrct2/localisation/FormatCodes.cpp b/src/openrct2/localisation/FormatCodes.cpp index 4c6efe1b7aca..9511c692397d 100644 --- a/src/openrct2/localisation/FormatCodes.cpp +++ b/src/openrct2/localisation/FormatCodes.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -140,16 +140,16 @@ namespace OpenRCT2 } } - TextColour FormatTokenToTextColour(FormatToken token) + Drawing::TextColour FormatTokenToTextColour(FormatToken token) { uint8_t value = EnumValue(token) - EnumValue(FormatToken::colourBlack); - if (value >= kNumTextColours) - return TextColour::black; + if (value >= Drawing::kNumTextColours) + return Drawing::TextColour::black; - return static_cast(value); + return static_cast(value); } - FormatToken FormatTokenFromTextColour(TextColour textColour) + FormatToken FormatTokenFromTextColour(Drawing::TextColour textColour) { static constexpr FormatToken tokens[] = { FormatToken::colourBlack, // TextColour::black diff --git a/src/openrct2/localisation/FormatCodes.h b/src/openrct2/localisation/FormatCodes.h index 1c6f8a5e53e9..5e3557d49434 100644 --- a/src/openrct2/localisation/FormatCodes.h +++ b/src/openrct2/localisation/FormatCodes.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -86,6 +86,6 @@ namespace OpenRCT2 std::string FormatTokenToStringWithBraces(FormatToken token); bool FormatTokenTakesArgument(FormatToken token); bool FormatTokenIsColour(FormatToken token); - TextColour FormatTokenToTextColour(FormatToken token); - FormatToken FormatTokenFromTextColour(TextColour textColour); + Drawing::TextColour FormatTokenToTextColour(FormatToken token); + FormatToken FormatTokenFromTextColour(Drawing::TextColour textColour); } // namespace OpenRCT2 diff --git a/src/openrct2/localisation/Formatter.cpp b/src/openrct2/localisation/Formatter.cpp index cd3ffea1e82f..17c645919a03 100644 --- a/src/openrct2/localisation/Formatter.cpp +++ b/src/openrct2/localisation/Formatter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/Formatter.h b/src/openrct2/localisation/Formatter.h index ac06bc3e9ed5..d9bb1befbf79 100644 --- a/src/openrct2/localisation/Formatter.h +++ b/src/openrct2/localisation/Formatter.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/Formatting.cpp b/src/openrct2/localisation/Formatting.cpp index 12b239b07559..42e71b747638 100644 --- a/src/openrct2/localisation/Formatting.cpp +++ b/src/openrct2/localisation/Formatting.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/Formatting.h b/src/openrct2/localisation/Formatting.h index eaa7dcb77512..7532584ed002 100644 --- a/src/openrct2/localisation/Formatting.h +++ b/src/openrct2/localisation/Formatting.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/Language.cpp b/src/openrct2/localisation/Language.cpp index 09ca3e7fd809..96d10a802ace 100644 --- a/src/openrct2/localisation/Language.cpp +++ b/src/openrct2/localisation/Language.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -7,8 +7,11 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ +#include "Language.h" + #include "../Context.h" #include "../core/String.hpp" +#include "../drawing/ScrollingText.h" #include "../interface/FontFamilies.h" #include "../interface/Window.h" #include "../object/ObjectManager.h" @@ -81,7 +84,7 @@ namespace OpenRCT2 localisationService.OpenLanguage(id); // Objects and their localised strings need to be refreshed objectManager.ResetObjects(); - ScrollingTextInvalidate(); + Drawing::ScrollingText::invalidate(); WindowNotifyLanguageChange(); return true; } diff --git a/src/openrct2/localisation/Language.h b/src/openrct2/localisation/Language.h index 6501c9c23652..3e5a0e09bd7f 100644 --- a/src/openrct2/localisation/Language.h +++ b/src/openrct2/localisation/Language.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/LanguagePack.cpp b/src/openrct2/localisation/LanguagePack.cpp index ea47dc0b4fcd..2211b5253db7 100644 --- a/src/openrct2/localisation/LanguagePack.cpp +++ b/src/openrct2/localisation/LanguagePack.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/LanguagePack.h b/src/openrct2/localisation/LanguagePack.h index 8225e52fee87..40e4b14c1307 100644 --- a/src/openrct2/localisation/LanguagePack.h +++ b/src/openrct2/localisation/LanguagePack.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/Localisation.Date.cpp b/src/openrct2/localisation/Localisation.Date.cpp index ba63f3d04ae4..903baba7e53f 100644 --- a/src/openrct2/localisation/Localisation.Date.cpp +++ b/src/openrct2/localisation/Localisation.Date.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/Localisation.Date.h b/src/openrct2/localisation/Localisation.Date.h index a9f4f210be44..d347af316c7c 100644 --- a/src/openrct2/localisation/Localisation.Date.h +++ b/src/openrct2/localisation/Localisation.Date.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/LocalisationService.cpp b/src/openrct2/localisation/LocalisationService.cpp index ee4e9c8983ca..1bfb957afd29 100644 --- a/src/openrct2/localisation/LocalisationService.cpp +++ b/src/openrct2/localisation/LocalisationService.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/LocalisationService.h b/src/openrct2/localisation/LocalisationService.h index 4a4a92e9fe82..c384f72ecc4a 100644 --- a/src/openrct2/localisation/LocalisationService.h +++ b/src/openrct2/localisation/LocalisationService.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/StringIdType.h b/src/openrct2/localisation/StringIdType.h index 522a962eeaeb..3d24438c5248 100644 --- a/src/openrct2/localisation/StringIdType.h +++ b/src/openrct2/localisation/StringIdType.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index a9276c20f39d..8c9ab7e0bf02 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1405,6 +1405,7 @@ enum : StringId STR_INVALID_RIDE_TYPE = 5764, STR_CANT_EDIT_INVALID_RIDE_TYPE = 5765, STR_HUNGARIAN_FORINT = 5766, + STR_POLISH_ZLOTY = 7012, STR_MULTIPLAYER_CONNECTED_CHAT_HINT = 5782, STR_CANT_RENAME_GROUP = 5785, STR_INVALID_GROUP_NAME = 5786, @@ -1575,6 +1576,7 @@ enum : StringId STR_UNKNOWN_RIDE = 6375, STR_MULTIPLAYER_RECEIVING_OBJECTS_LIST = 6378, + STR_MULTIPLAYER_RECEIVING_SCRIPTS = 7009, STR_MULTIPLAYER_RECEIVED_INVALID_DATA = 6379, @@ -1600,6 +1602,9 @@ enum : StringId STR_THIS_WILL_TAKE_A_FEW_MINUTES = 6407, STR_INSTALL_INNOEXTRACT = 6408, STR_NOT_THE_GOG_INSTALLER = 6409, + STR_OWN_ON_STEAM = 7014, + STR_PLEASE_CLOSE_STEAM = 7015, + STR_WAIT_FOR_STEAM_DOWNLOAD = 7016, STR_TILE_INSPECTOR_TOGGLE_INVISIBILITY_TIP = 6436, @@ -1757,6 +1762,11 @@ enum : StringId // Window: Error STR_AUDIO_FILE_TRUNCATED = 7003, + STR_REPLAY_FILE_NOT_FOUND = 7010, + STR_REPLAY_NOT_STARTED = 7011, + + STR_ACTION_PATH_DRAG_AREA = 7013, + // 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/management/Award.cpp b/src/openrct2/management/Award.cpp index 24f9f8804bd6..650f31354d2a 100644 --- a/src/openrct2/management/Award.cpp +++ b/src/openrct2/management/Award.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include "../config/Config.h" #include "../entity/EntityList.h" #include "../entity/Guest.h" +#include "../localisation/Formatter.h" #include "../profiling/Profiling.h" #include "../ride/Ride.h" #include "../ride/RideData.h" diff --git a/src/openrct2/management/Award.h b/src/openrct2/management/Award.h index 02950ff455e6..2e48c0f736cc 100644 --- a/src/openrct2/management/Award.h +++ b/src/openrct2/management/Award.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/management/Finance.cpp b/src/openrct2/management/Finance.cpp index aadca32ddfab..30acf618ff34 100644 --- a/src/openrct2/management/Finance.cpp +++ b/src/openrct2/management/Finance.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -28,6 +28,8 @@ #include using namespace OpenRCT2; +using OpenRCT2::GameActions::CommandFlag; +using OpenRCT2::GameActions::CommandFlags; // Monthly research funding costs const money64 kResearchCosts[RESEARCH_FUNDING_COUNT] = { @@ -58,15 +60,15 @@ static constexpr bool kCountTowardsCurrentExpenditure[EnumValue(ExpenditureType: * Checks the condition if the game is required to use money. * @param flags game command flags. */ -bool FinanceCheckMoneyRequired(uint32_t flags) +bool FinanceCheckMoneyRequired(CommandFlags flags) { if (getGameState().park.flags & PARK_FLAGS_NO_MONEY) return false; if (isInEditorMode()) return false; - if (flags & GAME_COMMAND_FLAG_NO_SPEND) + if (flags.has(CommandFlag::noSpend)) return false; - if (flags & GAME_COMMAND_FLAG_GHOST) + if (flags.has(CommandFlag::ghost)) return false; return true; } @@ -76,7 +78,7 @@ bool FinanceCheckMoneyRequired(uint32_t flags) * @param cost. * @param flags game command flags. */ -bool FinanceCheckAffordability(money64 cost, uint32_t flags) +bool FinanceCheckAffordability(money64 cost, CommandFlags flags) { return !FinanceCheckMoneyRequired(flags) || cost <= 0 || cost <= getGameState().park.cash; } @@ -89,9 +91,8 @@ bool FinanceCheckAffordability(money64 cost, uint32_t flags) */ void FinancePayment(money64 amount, ExpenditureType type) { - // overflow check auto& park = getGameState().park; - park.cash = AddClamp(park.cash, -amount); + park.cash = AddClamp(park.cash, -amount); park.expenditureTable[0][EnumValue(type)] -= amount; if (kCountTowardsCurrentExpenditure[EnumValue(type)]) @@ -184,7 +185,7 @@ void FinancePayRideUpkeep() if (upkeep != kMoney64Undefined) { ride.totalProfit = AddClamp(ride.totalProfit, -upkeep); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME; + ride.windowInvalidateFlags.set(RideInvalidateFlag::income); FinancePayment(upkeep, ExpenditureType::rideRunningCosts); } } diff --git a/src/openrct2/management/Finance.h b/src/openrct2/management/Finance.h index da3b683c5682..7e2411b35352 100644 --- a/src/openrct2/management/Finance.h +++ b/src/openrct2/management/Finance.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,7 @@ #pragma once +#include "../actions/CommandFlag.h" #include "../core/Money.hpp" #include "Research.h" @@ -38,8 +39,8 @@ constexpr uint8_t kMaxBankLoanInterestRate = 255; extern const money64 kResearchCosts[RESEARCH_FUNDING_COUNT]; -bool FinanceCheckMoneyRequired(uint32_t flags); -bool FinanceCheckAffordability(money64 cost, uint32_t flags); +bool FinanceCheckMoneyRequired(OpenRCT2::GameActions::CommandFlags flags); +bool FinanceCheckAffordability(money64 cost, OpenRCT2::GameActions::CommandFlags flags); void FinancePayment(money64 amount, ExpenditureType type); void FinancePayWages(); void FinancePayResearch(); diff --git a/src/openrct2/management/Marketing.cpp b/src/openrct2/management/Marketing.cpp index 7e2576ac1e46..76bb1ea3b024 100644 --- a/src/openrct2/management/Marketing.cpp +++ b/src/openrct2/management/Marketing.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/management/Marketing.h b/src/openrct2/management/Marketing.h index 3f1e4595ec3d..ce44d850ee7f 100644 --- a/src/openrct2/management/Marketing.h +++ b/src/openrct2/management/Marketing.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/management/NewsItem.cpp b/src/openrct2/management/NewsItem.cpp index 58743f503c35..cf9b0fb3050c 100644 --- a/src/openrct2/management/NewsItem.cpp +++ b/src/openrct2/management/NewsItem.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/management/NewsItem.h b/src/openrct2/management/NewsItem.h index 28721f8d3060..fd6acf7b23b2 100644 --- a/src/openrct2/management/NewsItem.h +++ b/src/openrct2/management/NewsItem.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index 45c194ff1d5f..c608ba27ce5d 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/management/Research.h b/src/openrct2/management/Research.h index d6403ee42e45..076d6e16ce06 100644 --- a/src/openrct2/management/Research.h +++ b/src/openrct2/management/Research.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/math/Trigonometry.hpp b/src/openrct2/math/Trigonometry.hpp index a2d32281dbc0..66301675f37f 100644 --- a/src/openrct2/math/Trigonometry.hpp +++ b/src/openrct2/math/Trigonometry.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/DiscordService.cpp b/src/openrct2/network/DiscordService.cpp index c8dbd518d91e..7904170bd478 100644 --- a/src/openrct2/network/DiscordService.cpp +++ b/src/openrct2/network/DiscordService.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/DiscordService.h b/src/openrct2/network/DiscordService.h index e946b2fc0933..c2229268f745 100644 --- a/src/openrct2/network/DiscordService.h +++ b/src/openrct2/network/DiscordService.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/Network.h b/src/openrct2/network/Network.h index 3f620669b0a2..68708eca7d4a 100644 --- a/src/openrct2/network/Network.h +++ b/src/openrct2/network/Network.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -53,7 +53,8 @@ namespace OpenRCT2::Network void SendTick(); bool GamestateSnapshotsEnabled(); void Update(); - void ProcessPending(); + void Tick(); + void PostTick(); void Flush(); [[nodiscard]] Auth GetAuthstatus(); diff --git a/src/openrct2/network/NetworkAction.cpp b/src/openrct2/network/NetworkAction.cpp index a9bb710edcef..0825870df3b5 100644 --- a/src/openrct2/network/NetworkAction.cpp +++ b/src/openrct2/network/NetworkAction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -266,6 +266,11 @@ namespace OpenRCT2::Network GameCommand::EditScenarioOptions, }, }, + NetworkAction{ + STR_ACTION_PATH_DRAG_AREA, + "PERMISSION_DRAG_PATH_AREA", + {}, + }, }; } // namespace OpenRCT2::Network diff --git a/src/openrct2/network/NetworkAction.h b/src/openrct2/network/NetworkAction.h index d82feac9be1a..bafa4880aa10 100644 --- a/src/openrct2/network/NetworkAction.h +++ b/src/openrct2/network/NetworkAction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -43,6 +43,7 @@ namespace OpenRCT2::Network passwordlessLogin, modifyTile, editScenarioOptions, + dragPathArea, count, }; diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 4b4b963c2de6..5517c7267ee4 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -23,7 +23,7 @@ #include "../core/File.h" #include "../core/Guard.hpp" #include "../core/Json.hpp" -#include "../entity/EntityList.h" +#include "../drawing/Drawing.h" #include "../entity/EntityRegistry.h" #include "../entity/EntityTweener.h" #include "../localisation/Formatter.h" @@ -47,7 +47,7 @@ // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -constexpr uint8_t kStreamVersion = 1; +constexpr uint8_t kStreamVersion = 0; const std::string kStreamID = std::string(kOpenRCT2Version) + "-" + std::to_string(kStreamVersion); @@ -62,7 +62,7 @@ static constexpr uint32_t kChunkSize = 1024 * 63; // If data is sent fast enough it would halt the entire server, process only a maximum amount. // This limit is per connection, the current value was determined by tests with fuzzing. -static constexpr uint32_t kMaxPacketsPerUpdate = 100; +static constexpr uint32_t kMaxPacketsPerTick = 100; #include "../Cheats.h" #include "../ParkImporter.h" @@ -119,6 +119,7 @@ namespace OpenRCT2::Network _actionId = 0; client_command_handlers[Command::auth] = &NetworkBase::Client_Handle_AUTH; + client_command_handlers[Command::beginMap] = &NetworkBase::Client_Handle_BEGINMAP; client_command_handlers[Command::map] = &NetworkBase::Client_Handle_MAP; client_command_handlers[Command::chat] = &NetworkBase::Client_Handle_CHAT; client_command_handlers[Command::gameAction] = &NetworkBase::Client_Handle_GAME_ACTION; @@ -134,7 +135,6 @@ namespace OpenRCT2::Network client_command_handlers[Command::gameInfo] = &NetworkBase::Client_Handle_GAMEINFO; client_command_handlers[Command::token] = &NetworkBase::Client_Handle_TOKEN; client_command_handlers[Command::objectsList] = &NetworkBase::Client_Handle_OBJECTS_LIST; - client_command_handlers[Command::scriptsHeader] = &NetworkBase::Client_Handle_SCRIPTS_HEADER; client_command_handlers[Command::scriptsData] = &NetworkBase::Client_Handle_SCRIPTS_DATA; client_command_handlers[Command::gameState] = &NetworkBase::Client_Handle_GAMESTATE; @@ -463,6 +463,21 @@ namespace OpenRCT2::Network } void NetworkBase::Update() + { + switch (GetMode()) + { + case Mode::server: + UpdateServer(); + break; + case Mode::client: + UpdateClient(); + break; + default: + break; + } + } + + void NetworkBase::Tick() { _closeLock = true; @@ -474,10 +489,10 @@ namespace OpenRCT2::Network switch (GetMode()) { case Mode::server: - UpdateServer(); + TickServer(); break; case Mode::client: - UpdateClient(); + TickClient(); break; default: break; @@ -511,6 +526,18 @@ namespace OpenRCT2::Network } void NetworkBase::UpdateServer() + { + for (auto& connection : client_connection_list) + { + // This can be called multiple times before the connection is removed. + if (!connection->IsValid()) + continue; + + connection->update(); + } + } + + void NetworkBase::TickServer() { for (auto& connection : client_connection_list) { @@ -520,6 +547,7 @@ namespace OpenRCT2::Network if (!ProcessConnection(*connection)) { + LOG_INFO("Disconnecting player %s", connection->player->Name.c_str()); connection->Disconnect(); } else @@ -548,6 +576,11 @@ namespace OpenRCT2::Network } void NetworkBase::UpdateClient() + { + _serverConnection->update(); + } + + void NetworkBase::TickClient() { assert(_serverConnection != nullptr); @@ -594,7 +627,6 @@ namespace OpenRCT2::Network case SocketStatus::connected: { status = Status::connected; - _serverConnection->ResetLastPacketTime(); Client_Send_TOKEN(); char str_authenticating[256]; FormatStringLegacy(str_authenticating, 256, STR_MULTIPLAYER_AUTHENTICATING, nullptr); @@ -1319,44 +1351,39 @@ namespace OpenRCT2::Network { LOG_VERBOSE("Server sends objects list with %u items", objects.size()); - if (objects.empty()) - { - Packet packet(Command::objectsList); - packet << static_cast(0) << static_cast(objects.size()); + Packet packet(Command::objectsList); - connection.QueuePacket(std::move(packet)); - } - else - { - for (size_t i = 0; i < objects.size(); ++i) - { - const auto* object = objects[i]; - - Packet packet(Command::objectsList); - packet << static_cast(i) << static_cast(objects.size()); + // Count. + packet << static_cast(objects.size()); - if (object->Identifier.empty()) - { - // DAT - LOG_VERBOSE("Object %.8s (checksum %x)", object->ObjectEntry.name, object->ObjectEntry.checksum); - packet << static_cast(0); - packet.Write(&object->ObjectEntry, sizeof(RCTObjectEntry)); - } - else - { - // JSON - LOG_VERBOSE("Object %s", object->Identifier.c_str()); - packet << static_cast(1); - packet.WriteString(object->Identifier); - } + // List + for (size_t i = 0; i < objects.size(); ++i) + { + const auto* object = objects[i]; - connection.QueuePacket(std::move(packet)); + if (object->Identifier.empty()) + { + // DAT + LOG_VERBOSE("Object %.8s (checksum %x)", object->ObjectEntry.name, object->ObjectEntry.checksum); + packet << static_cast(0); + packet.Write(&object->ObjectEntry, sizeof(RCTObjectEntry)); + } + else + { + // JSON + LOG_VERBOSE("Object %s", object->Identifier.c_str()); + packet << static_cast(1); + packet.WriteString(object->Identifier); } } + + connection.QueuePacket(std::move(packet)); } void NetworkBase::ServerSendScripts(Connection& connection) { + Packet packet(Command::scriptsData); + #ifdef ENABLE_SCRIPTING using namespace OpenRCT2::Scripting; @@ -1366,45 +1393,21 @@ namespace OpenRCT2::Network const auto remotePlugins = scriptEngine.GetRemotePlugins(); LOG_VERBOSE("Server sends %zu scripts", remotePlugins.size()); - // Build the data contents for each plugin. - MemoryStream pluginData; + packet << static_cast(remotePlugins.size()); + for (auto& plugin : remotePlugins) { const auto& code = plugin->GetCode(); - const auto codeSize = static_cast(code.size()); - pluginData.WriteValue(codeSize); - pluginData.WriteArray(code.c_str(), code.size()); - } - - // Send the header packet. - Packet packetScriptHeader(Command::scriptsHeader); - packetScriptHeader << static_cast(remotePlugins.size()); - packetScriptHeader << static_cast(pluginData.GetLength()); - connection.QueuePacket(std::move(packetScriptHeader)); - - // Segment the plugin data into chunks and send them. - const uint8_t* pluginDataBuffer = static_cast(pluginData.GetData()); - uint32_t dataOffset = 0; - while (dataOffset < pluginData.GetLength()) - { - const uint32_t chunkSize = std::min(pluginData.GetLength() - dataOffset, kChunkSize); - - Packet packet(Command::scriptsData); - packet << chunkSize; - packet.Write(pluginDataBuffer + dataOffset, chunkSize); - - connection.QueuePacket(std::move(packet)); - dataOffset += chunkSize; + packet << codeSize; + packet.Write(code.c_str(), code.size()); } - Guard::Assert(dataOffset == pluginData.GetLength()); - #else - Packet packetScriptHeader(Command::scriptsHeader); - packetScriptHeader << static_cast(0u); - packetScriptHeader << static_cast(0u); + packet << static_cast(0); #endif + + connection.QueuePacket(std::move(packet)); } void NetworkBase::Client_Send_HEARTBEAT(Connection& connection) const @@ -1472,8 +1475,8 @@ namespace OpenRCT2::Network objects = objManager.GetPackableObjects(); } - auto header = SaveForNetwork(objects); - if (header.empty()) + auto mapContent = SaveForNetwork(objects); + if (mapContent.empty()) { if (connection != nullptr) { @@ -1482,21 +1485,21 @@ namespace OpenRCT2::Network } return; } - size_t chunksize = kChunkSize; - for (size_t i = 0; i < header.size(); i += chunksize) + + Packet packetBeginMap(Command::beginMap); + + Packet packetMap(Command::map); + packetMap.Write(mapContent.data(), mapContent.size()); + + if (connection != nullptr) { - size_t datasize = std::min(chunksize, header.size() - i); - Packet packet(Command::map); - packet << static_cast(header.size()) << static_cast(i); - packet.Write(&header[i], datasize); - if (connection != nullptr) - { - connection->QueuePacket(std::move(packet)); - } - else - { - SendPacketToClients(packet); - } + connection->QueuePacket(std::move(packetBeginMap)); + connection->QueuePacket(std::move(packetMap)); + } + else + { + SendPacketToClients(packetBeginMap); + SendPacketToClients(packetMap); } } @@ -1740,6 +1743,56 @@ namespace OpenRCT2::Network SendPacketToClients(packet); } + bool NetworkBase::UpdateConnection(Connection& connection) + { + connection.update(); + + return connection.IsValid(); + } + + static void displayNetworkProgress(StringId captionStringId) + { + auto captionString = GetContext()->GetLocalisationService().GetString(captionStringId); + auto intent = Intent(INTENT_ACTION_PROGRESS_OPEN); + intent.PutExtra(INTENT_EXTRA_MESSAGE, captionString); + intent.PutExtra(INTENT_EXTRA_CALLBACK, []() -> void { + LOG_INFO("User aborted network operation"); + OpenRCT2::GetContext()->GetNetwork().Close(); + }); + ContextOpenIntent(&intent); + } + + static void reportPacketProgress(NetworkBase& network, Connection& connection) + { + if (network.GetMode() != Mode::client) + { + return; + } + + const auto nextPacketCommand = connection.getPendingPacketCommand(); + const auto bytesReceived = connection.getPendingPacketAvailable(); + const auto bytesTotal = connection.getPendingPacketSize(); + + switch (nextPacketCommand) + { + case Command::objectsList: + displayNetworkProgress(STR_MULTIPLAYER_RECEIVING_OBJECTS_LIST); + break; + case Command::map: + displayNetworkProgress(STR_MULTIPLAYER_DOWNLOADING_MAP); + break; + case Command::scriptsData: + displayNetworkProgress(STR_MULTIPLAYER_RECEIVING_SCRIPTS); + break; + default: + // Nothing to report. + return; + } + + network.GetContext().SetProgress( + static_cast(bytesReceived), static_cast(bytesTotal), STR_STRING_M_OF_N_KIB); + } + bool NetworkBase::ProcessConnection(Connection& connection) { ReadPacket packetStatus; @@ -1760,6 +1813,7 @@ namespace OpenRCT2::Network return false; case ReadPacket::success: // done reading in packet + reportPacketProgress(*this, connection); ProcessPacket(connection, connection.InboundPacket); if (!connection.IsValid()) { @@ -1768,15 +1822,20 @@ namespace OpenRCT2::Network break; case ReadPacket::moreData: // more data required to be read + reportPacketProgress(*this, connection); break; case ReadPacket::noData: // could not read anything from socket break; } - } while (packetStatus == ReadPacket::success && countProcessed < kMaxPacketsPerUpdate); + } while (packetStatus == ReadPacket::success && countProcessed < kMaxPacketsPerTick); - if (!connection.ReceivedPacketRecently()) + if (!connection.ReceivedDataRecently()) { + LOG_INFO( + "No data received recently from connection %s, disconnecting connection.", + connection.Socket->GetIpAddress().c_str()); + if (!connection.GetLastDisconnectReason()) { connection.SetLastDisconnectReason(STR_MULTIPLAYER_NO_DATA); @@ -1812,7 +1871,7 @@ namespace OpenRCT2::Network } // This is called at the end of each game tick, this where things should be processed that affects the game state. - void NetworkBase::ProcessPending() + void NetworkBase::PostTick() { if (GetMode() == Mode::server) { @@ -2302,8 +2361,7 @@ namespace OpenRCT2::Network void NetworkBase::ServerHandleHeartbeat(Connection& connection, Packet& packet) { - LOG_VERBOSE("Client %s heartbeat", connection.Socket->GetHostName()); - connection.ResetLastPacketTime(); + LOG_VERBOSE("Client %s heartbeat", connection.Socket->GetIpAddress().c_str()); } void NetworkBase::Client_Handle_AUTH(Connection& connection, Packet& packet) @@ -2392,34 +2450,17 @@ namespace OpenRCT2::Network ServerSendToken(connection); } - static void OpenNetworkProgress(StringId captionStringId) - { - auto captionString = GetContext()->GetLocalisationService().GetString(captionStringId); - auto intent = Intent(INTENT_ACTION_PROGRESS_OPEN); - intent.PutExtra(INTENT_EXTRA_MESSAGE, captionString); - intent.PutExtra(INTENT_EXTRA_CALLBACK, []() -> void { OpenRCT2::GetContext()->GetNetwork().Close(); }); - ContextOpenIntent(&intent); - } - void NetworkBase::Client_Handle_OBJECTS_LIST(Connection& connection, Packet& packet) { auto& repo = GetContext().GetObjectRepository(); - uint32_t index = 0; - uint32_t totalObjects = 0; - packet >> index >> totalObjects; + uint32_t objectCount{}; + packet >> objectCount; - static constexpr uint32_t kObjectStartIndex = 0; - if (index == kObjectStartIndex) - { - _missingObjects.clear(); - } + std::vector missingObjects; - if (totalObjects > 0) + for (uint32_t i = 0; i < objectCount; ++i) { - OpenNetworkProgress(STR_MULTIPLAYER_RECEIVING_OBJECTS_LIST); - GetContext().SetProgress(index + 1, totalObjects); - uint8_t objectType{}; packet >> objectType; @@ -2434,7 +2475,7 @@ namespace OpenRCT2::Network { auto objectName = std::string(entry->GetName()); LOG_VERBOSE("Requesting object %s with checksum %x from server", objectName.c_str(), entry->checksum); - _missingObjects.push_back(ObjectEntryDescriptor(*entry)); + missingObjects.push_back(ObjectEntryDescriptor(*entry)); } else if (object->ObjectEntry.checksum != entry->checksum || object->ObjectEntry.flags != entry->flags) { @@ -2456,69 +2497,35 @@ namespace OpenRCT2::Network { auto objectName = std::string(identifier); LOG_VERBOSE("Requesting object %s from server", objectName.c_str()); - _missingObjects.push_back(ObjectEntryDescriptor(objectName)); + missingObjects.push_back(ObjectEntryDescriptor(objectName)); } } } } - if (index + 1 >= totalObjects) - { - LOG_VERBOSE("client received object list, it has %u entries", totalObjects); - Client_Send_MAPREQUEST(_missingObjects); - _missingObjects.clear(); - } - } - - void NetworkBase::Client_Handle_SCRIPTS_HEADER(Connection& connection, Packet& packet) - { - uint32_t numScripts{}; - uint32_t dataSize{}; - packet >> numScripts >> dataSize; - - #ifdef ENABLE_SCRIPTING - _serverScriptsData.data.Clear(); - _serverScriptsData.pluginCount = numScripts; - _serverScriptsData.dataSize = dataSize; - #else - if (numScripts > 0) - { - connection.SetLastDisconnectReason("The client requires plugin support."); - Close(); - } - #endif + LOG_VERBOSE("client received object list, it has %u entries, %zu missing", objectCount, missingObjects.size()); + Client_Send_MAPREQUEST(missingObjects); } void NetworkBase::Client_Handle_SCRIPTS_DATA(Connection& connection, Packet& packet) { #ifdef ENABLE_SCRIPTING - uint32_t dataSize{}; - packet >> dataSize; - Guard::Assert(dataSize > 0); - - const auto* data = packet.Read(dataSize); - Guard::Assert(data != nullptr); + auto& scriptEngine = GetContext().GetScriptEngine(); - auto& scriptsData = _serverScriptsData.data; - scriptsData.Write(data, dataSize); + uint32_t count{}; + packet >> count; - if (scriptsData.GetLength() == _serverScriptsData.dataSize) + for (uint32_t i = 0; i < count; ++i) { - auto& scriptEngine = GetContext().GetScriptEngine(); + uint32_t codeSize{}; + packet >> codeSize; - scriptsData.SetPosition(0); - for (uint32_t i = 0; i < _serverScriptsData.pluginCount; ++i) - { - const auto codeSize = scriptsData.ReadValue(); - const auto scriptData = scriptsData.ReadArray(codeSize); + const uint8_t* scriptData = packet.Read(codeSize); - auto code = std::string_view(reinterpret_cast(scriptData.get()), codeSize); - scriptEngine.AddNetworkPlugin(code); - } - Guard::Assert(scriptsData.GetPosition() == scriptsData.GetLength()); + auto code = std::string_view(reinterpret_cast(scriptData), codeSize); + scriptEngine.AddNetworkPlugin(code); - // Empty the current buffer. - _serverScriptsData = {}; + LOG_VERBOSE("Received and loaded network script plugin %u/%u", i + 1, count); } #else connection.SetLastDisconnectReason("The client requires plugin support."); @@ -2768,84 +2775,59 @@ namespace OpenRCT2::Network } } + void NetworkBase::Client_Handle_BEGINMAP([[maybe_unused]] Connection& connection, Packet& packet) + { + // Start of a new map load, clear the queue now as we have to buffer them + // until the map is fully loaded. + GameActions::ClearQueue(); + GameActions::SuspendQueue(); + + displayNetworkProgress(STR_LOADING_SAVED_GAME); + } + void NetworkBase::Client_Handle_MAP([[maybe_unused]] Connection& connection, Packet& packet) { - uint32_t size, offset; - packet >> size >> offset; - int32_t chunksize = static_cast(packet.Header.Size - packet.BytesRead); - if (chunksize <= 0) - { - return; - } - if (offset == 0) - { - // Start of a new map load, clear the queue now as we have to buffer them - // until the map is fully loaded. - GameActions::ClearQueue(); - GameActions::SuspendQueue(); + // Allow queue processing of game actions again. + GameActions::ResumeQueue(); - _serverTickData.clear(); - _clientMapLoaded = false; + // This prevents invoking the callback for when the window closes which would close the connection. + GetContext().CloseProgress(); - OpenNetworkProgress(STR_MULTIPLAYER_DOWNLOADING_MAP); - } - if (size > chunk_buffer.size()) + GameUnloadScripts(); + GameNotifyMapChange(); + + auto ms = MemoryStream(packet.Data.data(), packet.Data.size()); + if (LoadMap(&ms)) { - chunk_buffer.resize(size); - } + GameLoadInit(); + GameLoadScripts(); + GameNotifyMapChanged(); - const auto currentProgressKiB = (offset + chunksize) / 1024; - const auto totalSizeKiB = size / 1024; + // This seems wrong, we want to catch up to that tick so we shouldn't mess with this. + //_serverState.tick = getGameState().currentTicks; - GetContext().SetProgress(currentProgressKiB, totalSizeKiB, STR_STRING_M_OF_N_KIB); + _serverState.state = ServerStatus::ok; + _clientMapLoaded = true; + gFirstTimeSaving = true; - std::memcpy(&chunk_buffer[offset], const_cast(static_cast(packet.Read(chunksize))), chunksize); - if (offset + chunksize == size) - { - // Allow queue processing of game actions again. - GameActions::ResumeQueue(); + // Notify user he is now online and which shortcut key enables chat + ChatShowConnectedMessage(); - ContextForceCloseWindowByClass(WindowClass::progressWindow); - GameUnloadScripts(); - GameNotifyMapChange(); + // Fix invalid vehicle sprite sizes, thus preventing visual corruption of sprites + FixInvalidVehicleSpriteSizes(); - bool has_to_free = false; - uint8_t* data = &chunk_buffer[0]; - size_t data_size = size; - auto ms = MemoryStream(data, data_size); - if (LoadMap(&ms)) - { - GameLoadInit(); - GameLoadScripts(); - GameNotifyMapChanged(); - _serverState.tick = getGameState().currentTicks; - // NetworkStatusOpen("Loaded new map from network"); - _serverState.state = ServerStatus::ok; - _clientMapLoaded = true; - gFirstTimeSaving = true; - - // Notify user he is now online and which shortcut key enables chat - ChatShowConnectedMessage(); - - // Fix invalid vehicle sprite sizes, thus preventing visual corruption of sprites - FixInvalidVehicleSpriteSizes(); - - // NOTE: Game actions are normally processed before processing the player list. - // Given that during map load game actions are buffered we have to process the - // player list first to have valid players for the queued game actions. - ProcessPlayerList(); - } - else - { - // Something went wrong, game is not loaded. Return to main screen. - auto loadOrQuitAction = GameActions::LoadOrQuitAction( - GameActions::LoadOrQuitModes::OpenSavePrompt, PromptMode::saveBeforeQuit); - GameActions::Execute(&loadOrQuitAction, getGameState()); - } - if (has_to_free) - { - free(data); - } + // NOTE: Game actions are normally processed before processing the player list. + // Given that during map load game actions are buffered we have to process the + // player list first to have valid players for the queued game actions. + ProcessPlayerList(); + } + else + { + // Something went wrong, game is not loaded. Return to main screen. + auto loadOrQuitAction = GameActions::LoadOrQuitAction( + GameActions::LoadOrQuitModes::OpenSavePrompt, PromptMode::saveBeforeQuit); + + loadOrQuitAction.Execute(getGameState()); } } @@ -2980,7 +2962,7 @@ namespace OpenRCT2::Network packet >> tick >> actionType; MemoryStream stream; - const size_t size = packet.Header.Size - packet.BytesRead; + const size_t size = packet.Header.size - packet.BytesRead; stream.WriteArray(packet.Read(size), size); stream.SetPosition(0); @@ -3070,7 +3052,7 @@ namespace OpenRCT2::Network } DataSerialiser stream(false); - const size_t size = packet.Header.Size - packet.BytesRead; + const size_t size = packet.Header.size - packet.BytesRead; stream.GetStream().WriteArray(packet.Read(size), size); stream.GetStream().SetPosition(0); @@ -3306,9 +3288,14 @@ namespace OpenRCT2::Network GetContext()->GetNetwork().Update(); } - void ProcessPending() + void Tick() { - GetContext()->GetNetwork().ProcessPending(); + GetContext()->GetNetwork().Tick(); + } + + void PostTick() + { + GetContext()->GetNetwork().PostTick(); } void Flush() @@ -3592,23 +3579,23 @@ namespace OpenRCT2::Network NetworkGroup* fromgroup = network.GetGroupByID(actionPlayerId); if (player == nullptr) { - return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_DO_THIS, kStringIdNone); + return GameActions::Result(GameActions::Status::invalidParameters, STR_CANT_DO_THIS, kStringIdNone); } if (network.GetGroupByID(groupId) == nullptr) { - return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_DO_THIS, kStringIdNone); + return GameActions::Result(GameActions::Status::invalidParameters, STR_CANT_DO_THIS, kStringIdNone); } if (player->Flags & PlayerFlags::kIsServer) { return GameActions::Result( - GameActions::Status::InvalidParameters, STR_CANT_CHANGE_GROUP_THAT_THE_HOST_BELONGS_TO, kStringIdNone); + GameActions::Status::invalidParameters, STR_CANT_CHANGE_GROUP_THAT_THE_HOST_BELONGS_TO, kStringIdNone); } if (groupId == 0 && fromgroup != nullptr && fromgroup->Id != 0) { - return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_SET_TO_THIS_GROUP, kStringIdNone); + return GameActions::Result(GameActions::Status::invalidParameters, STR_CANT_SET_TO_THIS_GROUP, kStringIdNone); } if (isExecuting) @@ -3657,7 +3644,7 @@ namespace OpenRCT2::Network NetworkGroup* newgroup = network.AddGroup(); if (newgroup == nullptr) { - return GameActions::Result(GameActions::Status::Unknown, STR_CANT_DO_THIS, kStringIdNone); + return GameActions::Result(GameActions::Status::unknown, STR_CANT_DO_THIS, kStringIdNone); } } } @@ -3667,14 +3654,14 @@ namespace OpenRCT2::Network if (groupId == 0) { return GameActions::Result( - GameActions::Status::Disallowed, STR_THIS_GROUP_CANNOT_BE_MODIFIED, kStringIdNone); + GameActions::Status::disallowed, STR_THIS_GROUP_CANNOT_BE_MODIFIED, kStringIdNone); } for (const auto& it : network.player_list) { if ((it.get())->Group == groupId) { return GameActions::Result( - GameActions::Status::Disallowed, STR_CANT_REMOVE_GROUP_THAT_PLAYERS_BELONG_TO, kStringIdNone); + GameActions::Status::disallowed, STR_CANT_REMOVE_GROUP_THAT_PLAYERS_BELONG_TO, kStringIdNone); } } if (isExecuting) @@ -3688,7 +3675,7 @@ namespace OpenRCT2::Network if (groupId == 0) { // can't change admin group permissions return GameActions::Result( - GameActions::Status::Disallowed, STR_THIS_GROUP_CANNOT_BE_MODIFIED, kStringIdNone); + GameActions::Status::disallowed, STR_THIS_GROUP_CANNOT_BE_MODIFIED, kStringIdNone); } NetworkGroup* mygroup = nullptr; Player* player = network.GetPlayerByID(actionPlayerId); @@ -3699,7 +3686,7 @@ namespace OpenRCT2::Network if (mygroup == nullptr || !mygroup->CanPerformAction(networkPermission)) { return GameActions::Result( - GameActions::Status::Disallowed, STR_CANT_MODIFY_PERMISSION_THAT_YOU_DO_NOT_HAVE_YOURSELF, + GameActions::Status::disallowed, STR_CANT_MODIFY_PERMISSION_THAT_YOU_DO_NOT_HAVE_YOURSELF, kStringIdNone); } } @@ -3735,7 +3722,7 @@ namespace OpenRCT2::Network NetworkGroup* group = network.GetGroupByID(groupId); if (group == nullptr) { - return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_RENAME_GROUP, kStringIdNone); + return GameActions::Result(GameActions::Status::invalidParameters, STR_CANT_RENAME_GROUP, kStringIdNone); } const char* oldName = group->GetName().c_str(); @@ -3748,7 +3735,7 @@ namespace OpenRCT2::Network if (name.empty()) { return GameActions::Result( - GameActions::Status::InvalidParameters, STR_CANT_RENAME_GROUP, STR_INVALID_GROUP_NAME); + GameActions::Status::invalidParameters, STR_CANT_RENAME_GROUP, STR_INVALID_GROUP_NAME); } if (isExecuting) @@ -3764,7 +3751,7 @@ namespace OpenRCT2::Network { if (groupId == 0) { - return GameActions::Result(GameActions::Status::Disallowed, STR_CANT_SET_TO_THIS_GROUP, kStringIdNone); + return GameActions::Result(GameActions::Status::disallowed, STR_CANT_SET_TO_THIS_GROUP, kStringIdNone); } if (isExecuting) { @@ -3775,7 +3762,7 @@ namespace OpenRCT2::Network default: LOG_ERROR("Invalid Modify Group Type: %u", static_cast(type)); return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_VALUE_OUT_OF_RANGE); } network.SaveGroups(); @@ -3792,12 +3779,12 @@ namespace OpenRCT2::Network // Player might be already removed by the PLAYERLIST command, need to refactor non-game commands executing too // early. return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PLAYER_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PLAYER_NOT_FOUND); } if (player->Flags & PlayerFlags::kIsServer) { - return GameActions::Result(GameActions::Status::Disallowed, STR_CANT_KICK_THE_HOST, kStringIdNone); + return GameActions::Result(GameActions::Status::disallowed, STR_CANT_KICK_THE_HOST, kStringIdNone); } if (isExecuting) @@ -4147,10 +4134,13 @@ namespace OpenRCT2::Network void SendGameAction(const GameActions::GameAction* action) { } + void Tick() + { + } void Update() { } - void ProcessPending() + void PostTick() { } int32_t BeginClient(const std::string& host, int32_t port) diff --git a/src/openrct2/network/NetworkBase.h b/src/openrct2/network/NetworkBase.h index fdf9b08f9a9f..039fb2fda70b 100644 --- a/src/openrct2/network/NetworkBase.h +++ b/src/openrct2/network/NetworkBase.h @@ -2,7 +2,6 @@ #include "../System.hpp" #include "../actions/GameAction.h" -#include "../object/Object.h" #include "../scenario/Scenario.h" #include "NetworkConnection.h" #include "NetworkGroup.h" @@ -11,6 +10,7 @@ #include "NetworkTypes.h" #include "NetworkUser.h" +#include #include #include #include @@ -20,7 +20,8 @@ namespace OpenRCT2 { struct IContext; -} + struct ObjectRepositoryItem; +} // namespace OpenRCT2 namespace OpenRCT2::Network { @@ -37,10 +38,10 @@ namespace OpenRCT2::Network bool Init(); void Close(); uint32_t GetServerTick() const noexcept; - // FIXME: This is currently the wrong function to override in System, will be refactored later. - void Update() override final; + void Update() final; + void Tick() final; void Flush(); - void ProcessPending(); + void PostTick() final; void ProcessPlayerList(); auto GetPlayerIteratorByID(uint8_t id) const; auto GetGroupIteratorByID(uint8_t id) const; @@ -61,6 +62,7 @@ namespace OpenRCT2::Network void CloseConnection(); Player* AddPlayer(const std::string& name, const std::string& keyhash); void ProcessPacket(Connection& connection, Packet& packet); + bool UpdateConnection(Connection& connection); public: // Server Connection* GetPlayerConnection(uint8_t id) const; @@ -81,6 +83,7 @@ namespace OpenRCT2::Network void SetupDefaultGroups(); void RemovePlayer(std::unique_ptr& connection); void UpdateServer(); + void TickServer(); void ServerClientDisconnected(std::unique_ptr& connection); bool SaveMap(IStream* stream, const std::vector& objects) const; std::vector SaveForNetwork(const std::vector& objects) const; @@ -136,6 +139,7 @@ namespace OpenRCT2::Network void ServerClientDisconnected(); bool LoadMap(IStream* stream); void UpdateClient(); + void TickClient(); // Packet dispatchers. void Client_Send_RequestGameState(uint32_t tick); @@ -152,6 +156,7 @@ namespace OpenRCT2::Network // Handlers. void Client_Handle_AUTH(Connection& connection, Packet& packet); + void Client_Handle_BEGINMAP([[maybe_unused]] Connection& connection, Packet& packet); void Client_Handle_MAP(Connection& connection, Packet& packet); void Client_Handle_CHAT(Connection& connection, Packet& packet); void Client_Handle_GAME_ACTION(Connection& connection, Packet& packet); @@ -167,10 +172,8 @@ namespace OpenRCT2::Network void Client_Handle_EVENT(Connection& connection, Packet& packet); void Client_Handle_TOKEN(Connection& connection, Packet& packet); void Client_Handle_OBJECTS_LIST(Connection& connection, Packet& packet); - void Client_Handle_SCRIPTS_HEADER(Connection& connection, Packet& packet); void Client_Handle_SCRIPTS_DATA(Connection& connection, Packet& packet); void Client_Handle_GAMESTATE(Connection& connection, Packet& packet); - std::vector _challenge; std::map _gameActionCallbacks; Key _key; @@ -190,7 +193,6 @@ namespace OpenRCT2::Network private: // Common Data using CommandHandler = void (NetworkBase::*)(Connection& connection, Packet& packet); - std::vector chunk_buffer; std::ofstream _chat_log_fs; uint32_t _lastUpdateTime = 0; uint32_t _currentDeltaTime = 0; @@ -223,19 +225,11 @@ namespace OpenRCT2::Network std::string spriteHash; }; - struct ServerScriptsData - { - uint32_t pluginCount{}; - uint32_t dataSize{}; - MemoryStream data; - }; - std::unordered_map client_command_handlers; std::unique_ptr _serverConnection; std::map _pendingPlayerLists; std::multimap _pendingPlayerInfo; std::map _serverTickData; - std::vector _missingObjects; std::string _host; std::string _chatLogPath; std::string _chatLogFilenameFormat = "%Y%m%d-%H%M%S.txt"; @@ -252,7 +246,6 @@ namespace OpenRCT2::Network SocketStatus _lastConnectStatus = SocketStatus::closed; bool _requireReconnect = false; bool _clientMapLoaded = false; - ServerScriptsData _serverScriptsData{}; }; } // namespace OpenRCT2::Network diff --git a/src/openrct2/network/NetworkConnection.cpp b/src/openrct2/network/NetworkConnection.cpp index 2e86d59a5cf0..e2ee68d17ce6 100644 --- a/src/openrct2/network/NetworkConnection.cpp +++ b/src/openrct2/network/NetworkConnection.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,9 @@ #include "NetworkConnection.h" + #include "../Diagnostic.h" + #include "../core/Diagnostics.hpp" + #include "../core/Guard.hpp" #include "../core/String.hpp" #include "../localisation/Formatting.h" #include "../platform/Platform.h" @@ -22,42 +25,80 @@ namespace OpenRCT2::Network { static constexpr size_t kDisconnectReasonBufSize = 256; - static constexpr size_t kBufferSize = (1024 * 64) - 1; // 64 KiB, maximum packet size. - #ifndef DEBUG - static constexpr size_t kNoDataTimeout = 20; // Seconds. - #endif - - static_assert(kBufferSize <= std::numeric_limits::max(), "kBufferSize too big, uint16_t is max."); + static constexpr size_t kBufferSize = 1024 * 128; // 128 KiB. + static constexpr size_t kNoDataTimeout = 40; // Seconds. Connection::Connection() noexcept { - ResetLastPacketTime(); + _lastReceiveTime = Platform::GetTicks(); } - ReadPacket Connection::readPacket() + void Connection::update() + { + if (!IsValid()) + { + return; + } + + receiveData(); + SendQueuedData(); + } + + void Connection::receiveData() { + uint8_t buffer[kBufferSize]; size_t bytesRead = 0; - // Read packet header. - auto& header = InboundPacket.Header; - if (InboundPacket.BytesTransferred < sizeof(InboundPacket.Header)) + ReadPacket status = Socket->ReceiveData(buffer, sizeof(buffer), &bytesRead); + if (status == ReadPacket::disconnected) { - const size_t missingLength = sizeof(header) - InboundPacket.BytesTransferred; + Disconnect(); + return; + } - uint8_t* buffer = reinterpret_cast(&InboundPacket.Header); + if (status == ReadPacket::success) + { + _lastReceiveTime = Platform::GetTicks(); + _inboundBuffer.insert(_inboundBuffer.end(), buffer, buffer + bytesRead); + } + } - ReadPacket status = Socket->ReceiveData(buffer, missingLength, &bytesRead); - if (status != ReadPacket::success) - { - return status; - } + ReadPacket Connection::readPacket() + { + uint32_t magic = 0; - InboundPacket.BytesTransferred += bytesRead; - if (InboundPacket.BytesTransferred < sizeof(InboundPacket.Header)) - { - // If still not enough data for header, keep waiting. - return ReadPacket::moreData; - } + // Check if we have enough data for the magic. + if (_inboundBuffer.size() < sizeof(magic)) + { + return ReadPacket::moreData; + } + + // Read magic. + std::memcpy(&magic, _inboundBuffer.data(), sizeof(magic)); + + size_t totalPacketLength = 0; + size_t headerSize = 0; + + magic = Convert::NetworkToHost(magic); + if (magic == PacketHeader::kMagic) + { + // New format. + auto& header = InboundPacket.Header; + std::memcpy(&header, _inboundBuffer.data(), sizeof(header)); + + header.magic = magic; + header.version = Convert::NetworkToHost(header.version); + header.size = Convert::NetworkToHost(header.size); + header.id = Convert::NetworkToHost(header.id); + + headerSize = sizeof(header); + totalPacketLength = sizeof(header) + header.size; + } + else + { + // Legacy format. + PacketLegacyHeader header{}; + std::memcpy(&header, _inboundBuffer.data(), sizeof(header)); // Normalise values. header.Size = Convert::NetworkToHost(header.Size); @@ -65,61 +106,81 @@ namespace OpenRCT2::Network // NOTE: For compatibility reasons for the master server we need to remove sizeof(Header.Id) from the size. // Previously the Id field was not part of the header rather part of the body. - header.Size -= std::min(header.Size, sizeof(header.Id)); - - // Fall-through: Read rest of packet. - } + // We correct the size to have only the length of the body. + if (header.Size < sizeof(header.Id)) + { + // This is a malformed packet, disconnect. + LOG_INFO( + "Received malformed packet (size: %u) from {%s}, disconnecting.", header.Size, + Socket->GetIpAddress().c_str()); - // Read packet body. - { - // NOTE: BytesTransfered includes the header length, this will not underflow. - const size_t missingLength = header.Size - (InboundPacket.BytesTransferred - sizeof(header)); + Disconnect(); + return ReadPacket::disconnected; + } - uint8_t buffer[kBufferSize]; + header.Size -= sizeof(header.Id); - if (missingLength > 0) - { - ReadPacket status = Socket->ReceiveData(buffer, std::min(missingLength, kBufferSize), &bytesRead); - if (status != ReadPacket::success) - { - return status; - } - - InboundPacket.BytesTransferred += bytesRead; - InboundPacket.Write(buffer, bytesRead); - } + // Fill in new header format. + InboundPacket.Header.magic = PacketHeader::kMagic; + InboundPacket.Header.size = header.Size; + InboundPacket.Header.id = header.Id; - if (InboundPacket.Data.size() == header.Size) - { - // Received complete packet. - _lastPacketTime = Platform::GetTicks(); + headerSize = sizeof(header); + totalPacketLength = sizeof(header) + header.Size; - RecordPacketStats(InboundPacket, false); + _isLegacyProtocol = true; + } - return ReadPacket::success; - } + if (_inboundBuffer.size() < totalPacketLength) + { + InboundPacket.BytesTransferred = _inboundBuffer.size(); + return ReadPacket::moreData; } - return ReadPacket::moreData; + // Read packet body. + InboundPacket.BytesTransferred = totalPacketLength; + InboundPacket.Write(_inboundBuffer.data() + headerSize, totalPacketLength - headerSize); + + // Remove read data from buffer. + _inboundBuffer.erase(_inboundBuffer.begin(), _inboundBuffer.begin() + totalPacketLength); + + RecordPacketStats(InboundPacket, false); + + return ReadPacket::success; } - static sfl::small_vector serializePacket(const Packet& packet) + static sfl::small_vector serializePacket(bool legacyProtocol, const Packet& packet) { - // NOTE: For compatibility reasons for the master server we need to add sizeof(Header.Id) to the size. - // Previously the Id field was not part of the header rather part of the body. - const auto bodyLength = packet.Data.size() + sizeof(packet.Header.Id); + sfl::small_vector buffer; - Guard::Assert(bodyLength <= std::numeric_limits::max(), "Packet size too large"); + if (legacyProtocol) + { + // NOTE: For compatibility reasons for the master server we need to add sizeof(Header.Id) to the size. + // Previously the Id field was not part of the header rather part of the body. + const auto bodyLength = packet.Data.size() + sizeof(PacketLegacyHeader::Id); - auto header = packet.Header; - header.Size = static_cast(bodyLength); - header.Size = Convert::HostToNetwork(header.Size); - header.Id = ByteSwapBE(header.Id); + Guard::Assert(bodyLength <= std::numeric_limits::max(), "Packet size too large"); - sfl::small_vector buffer; - buffer.reserve(sizeof(header) + packet.Data.size()); + PacketLegacyHeader header{}; + header.Size = static_cast(bodyLength); + header.Size = Convert::HostToNetwork(header.Size); + header.Id = ByteSwapBE(packet.Header.id); + + buffer.insert( + buffer.end(), reinterpret_cast(&header), reinterpret_cast(&header) + sizeof(header)); + } + else + { + PacketHeader header{}; + header.magic = Convert::HostToNetwork(PacketHeader::kMagic); + header.version = Convert::HostToNetwork(PacketHeader::kVersion); + header.size = Convert::HostToNetwork(static_cast(packet.Data.size())); + header.id = Convert::HostToNetwork(packet.Header.id); + + buffer.insert( + buffer.end(), reinterpret_cast(&header), reinterpret_cast(&header) + sizeof(header)); + } - buffer.insert(buffer.end(), reinterpret_cast(&header), reinterpret_cast(&header) + sizeof(header)); buffer.insert(buffer.end(), packet.Data.begin(), packet.Data.end()); return buffer; @@ -129,7 +190,7 @@ namespace OpenRCT2::Network { if (AuthStatus == Auth::ok || !packet.CommandRequiresAuth()) { - const auto payload = serializePacket(packet); + const auto payload = serializePacket(_isLegacyProtocol, packet); if (front) { _outboundBuffer.insert(_outboundBuffer.begin(), payload.begin(), payload.end()); @@ -168,20 +229,16 @@ namespace OpenRCT2::Network } } - void Connection::ResetLastPacketTime() noexcept - { - _lastPacketTime = Platform::GetTicks(); - } - - bool Connection::ReceivedPacketRecently() const noexcept + bool Connection::ReceivedDataRecently() const noexcept { - #ifndef DEBUG constexpr auto kTimeoutMs = kNoDataTimeout * 1000; - if (Platform::GetTicks() > _lastPacketTime + kTimeoutMs) + + const auto timeSinceLastRecv = Platform::GetTicks() - _lastReceiveTime; + if (timeSinceLastRecv > kTimeoutMs) { return false; } - #endif + return true; } @@ -231,6 +288,22 @@ namespace OpenRCT2::Network stats.bytesReceived[EnumValue(StatisticsGroup::Total)] += packetSize; } } + + Command Connection::getPendingPacketCommand() const noexcept + { + return InboundPacket.GetCommand(); + } + + size_t Connection::getPendingPacketSize() const noexcept + { + return InboundPacket.Header.size; + } + + size_t Connection::getPendingPacketAvailable() const noexcept + { + return InboundPacket.BytesTransferred; + } + } // namespace OpenRCT2::Network #endif diff --git a/src/openrct2/network/NetworkConnection.h b/src/openrct2/network/NetworkConnection.h index e06333a6fa93..8cde30e81d4d 100644 --- a/src/openrct2/network/NetworkConnection.h +++ b/src/openrct2/network/NetworkConnection.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -45,28 +45,35 @@ namespace OpenRCT2::Network Connection() noexcept; + void update(); ReadPacket readPacket(); void QueuePacket(const Packet& packet, bool front = false); + Command getPendingPacketCommand() const noexcept; + size_t getPendingPacketSize() const noexcept; + size_t getPendingPacketAvailable() const noexcept; + // This will not immediately disconnect the client. The disconnect // will happen post-tick. void Disconnect() noexcept; bool IsValid() const; void SendQueuedData(); - void ResetLastPacketTime() noexcept; - bool ReceivedPacketRecently() const noexcept; + bool ReceivedDataRecently() const noexcept; const utf8* GetLastDisconnectReason() const noexcept; void SetLastDisconnectReason(std::string_view src); void SetLastDisconnectReason(const StringId string_id, void* args = nullptr); private: + std::vector _inboundBuffer; std::vector _outboundBuffer; - uint32_t _lastPacketTime = 0; + uint32_t _lastReceiveTime = 0; std::string _lastDisconnectReason; + bool _isLegacyProtocol = false; void RecordPacketStats(const Packet& packet, bool sending); + void receiveData(); }; } // namespace OpenRCT2::Network diff --git a/src/openrct2/network/NetworkGroup.cpp b/src/openrct2/network/NetworkGroup.cpp index 0a96fe3ad4bd..14d78675285a 100644 --- a/src/openrct2/network/NetworkGroup.cpp +++ b/src/openrct2/network/NetworkGroup.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,7 +11,8 @@ #include "NetworkGroup.h" - #include "../openrct2/core/Json.hpp" + #include "../core/Guard.hpp" + #include "../core/Json.hpp" #include "NetworkAction.h" #include "NetworkTypes.h" diff --git a/src/openrct2/network/NetworkGroup.h b/src/openrct2/network/NetworkGroup.h index 140d8e7b9807..54a3641c0271 100644 --- a/src/openrct2/network/NetworkGroup.h +++ b/src/openrct2/network/NetworkGroup.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/NetworkKey.cpp b/src/openrct2/network/NetworkKey.cpp index 0cf1a66c30d3..a71e171270eb 100644 --- a/src/openrct2/network/NetworkKey.cpp +++ b/src/openrct2/network/NetworkKey.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/NetworkKey.h b/src/openrct2/network/NetworkKey.h index 3e329882c7cb..9ba5aee67524 100644 --- a/src/openrct2/network/NetworkKey.h +++ b/src/openrct2/network/NetworkKey.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,7 @@ #ifndef DISABLE_NETWORK + #include #include #include #include diff --git a/src/openrct2/network/NetworkPacket.cpp b/src/openrct2/network/NetworkPacket.cpp index 87ef06317cef..85028ef1f5d6 100644 --- a/src/openrct2/network/NetworkPacket.cpp +++ b/src/openrct2/network/NetworkPacket.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,7 +18,7 @@ namespace OpenRCT2::Network { Packet::Packet(Command id) noexcept - : Header{ 0, id } + : Header{ PacketHeader::kMagic, PacketHeader::kVersion, 0, id } { } @@ -34,7 +34,7 @@ namespace OpenRCT2::Network Command Packet::GetCommand() const noexcept { - return Header.Id; + return Header.id; } void Packet::Clear() noexcept diff --git a/src/openrct2/network/NetworkPacket.h b/src/openrct2/network/NetworkPacket.h index ce69859e3f48..7fbe8c6a0e81 100644 --- a/src/openrct2/network/NetworkPacket.h +++ b/src/openrct2/network/NetworkPacket.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,12 +19,23 @@ namespace OpenRCT2::Network { #pragma pack(push, 1) - struct PacketHeader + struct PacketLegacyHeader { uint16_t Size = 0; Command Id = Command::invalid; }; - static_assert(sizeof(PacketHeader) == 6); + static_assert(sizeof(PacketLegacyHeader) == 6); + + struct PacketHeader + { + static constexpr uint32_t kMagic = 0x3254524F; // 'ORT2' + static constexpr uint16_t kVersion = 2; + + uint32_t magic{}; + uint16_t version{}; + uint32_t size{}; + Command id{}; + }; #pragma pack(pop) struct Packet final @@ -49,7 +60,7 @@ namespace OpenRCT2::Network template Packet& operator>>(T& value) { - if (BytesRead + sizeof(value) > Header.Size) + if (BytesRead + sizeof(value) > Header.size) { value = T{}; } diff --git a/src/openrct2/network/NetworkPlayer.cpp b/src/openrct2/network/NetworkPlayer.cpp index e92799e6a08b..718ef1b0ec51 100644 --- a/src/openrct2/network/NetworkPlayer.cpp +++ b/src/openrct2/network/NetworkPlayer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/NetworkPlayer.h b/src/openrct2/network/NetworkPlayer.h index b1d94027cc29..6dfab45c3bb6 100644 --- a/src/openrct2/network/NetworkPlayer.h +++ b/src/openrct2/network/NetworkPlayer.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/NetworkServerAdvertiser.cpp b/src/openrct2/network/NetworkServerAdvertiser.cpp index 9547b52de246..039140c7b753 100644 --- a/src/openrct2/network/NetworkServerAdvertiser.cpp +++ b/src/openrct2/network/NetworkServerAdvertiser.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -47,7 +47,7 @@ namespace OpenRCT2::Network #ifndef DISABLE_HTTP using namespace std::chrono_literals; - constexpr int32_t kMasterServerRegisterTime = std::chrono::milliseconds(2min).count(); + constexpr int32_t kMasterServerRegisterTime = std::chrono::milliseconds(30s).count(); constexpr int32_t kMasterServerHeartbeatTime = std::chrono::milliseconds(1min).count(); #endif @@ -57,6 +57,7 @@ namespace OpenRCT2::Network uint16_t _port; std::unique_ptr _lanListener; + std::shared_future _currentRequest; uint32_t _lastListenTime{}; bool _lanDisabled = false; @@ -86,6 +87,17 @@ namespace OpenRCT2::Network #endif } + ~NetworkServerAdvertiser() final + { + _lanListener->Close(); + + auto currentRequest = _currentRequest; + if (currentRequest.valid()) + { + currentRequest.wait(); + } + } + AdvertiseStatus GetStatus() const override { return _status; @@ -167,13 +179,13 @@ namespace OpenRCT2::Network case AdvertiseStatus::unregistered: if (_lastAdvertiseTime == 0 || Platform::GetTicks() > _lastAdvertiseTime + kMasterServerRegisterTime) { - if (_lastAdvertiseTime == 0) - { - Console::WriteLine("Registering server on master server"); - } + Console::WriteLine("Registering server on master server..."); SendRegistration(_forceIPv4); } break; + case AdvertiseStatus::registering: + // Waiting for registration response. + break; case AdvertiseStatus::registered: if (Platform::GetTicks() > _lastHeartbeatTime + kMasterServerHeartbeatTime) { @@ -189,6 +201,7 @@ namespace OpenRCT2::Network void SendRegistration(bool forceIPv4) { _lastAdvertiseTime = Platform::GetTicks(); + _status = AdvertiseStatus::registering; // Send the registration request Http::Request request; @@ -209,17 +222,21 @@ namespace OpenRCT2::Network request.body = body.dump(); request.header["Content-Type"] = "application/json"; - Http::DoAsync(request, [&](Http::Response response) -> void { - if (response.status != Http::Status::Ok) - { - Console::Error::WriteLine("Unable to connect to master server"); - return; - } - - json_t root = Json::FromString(response.body); - root = Json::AsObject(root); - this->OnRegistrationResponse(root); - }); + _currentRequest = Http::DoAsync(request, [&](Http::Response response) -> void { + if (response.status != Http::Status::Ok) + { + Console::Error::WriteLine( + "Unable to connect to master server, retrying in %d seconds", + kMasterServerRegisterTime / 1000); + + _status = AdvertiseStatus::unregistered; + return; + } + + json_t root = Json::FromString(response.body); + root = Json::AsObject(root); + this->OnRegistrationResponse(root); + }).share(); } void SendHeartbeat() @@ -233,17 +250,24 @@ namespace OpenRCT2::Network request.header["Content-Type"] = "application/json"; _lastHeartbeatTime = Platform::GetTicks(); - Http::DoAsync(request, [&](Http::Response response) -> void { - if (response.status != Http::Status::Ok) - { - Console::Error::WriteLine("Unable to connect to master server"); - return; - } - json_t root = Json::FromString(response.body); - root = Json::AsObject(root); - this->OnHeartbeatResponse(root); - }); + _currentRequest = Http::DoAsync(request, [&](Http::Response response) -> void { + if (response.status != Http::Status::Ok) + { + Console::Error::WriteLine( + "Unable to connect to master server, retrying in %d seconds", + kMasterServerRegisterTime / 1000); + + _status = AdvertiseStatus::unregistered; + // Don't immediately retry advertising, wait for kMasterServerRegisterTime. + _lastAdvertiseTime = Platform::GetTicks(); + return; + } + + json_t root = Json::FromString(response.body); + root = Json::AsObject(root); + this->OnHeartbeatResponse(root); + }).share(); } /** diff --git a/src/openrct2/network/NetworkServerAdvertiser.h b/src/openrct2/network/NetworkServerAdvertiser.h index 7738df9b3419..d6afea18490e 100644 --- a/src/openrct2/network/NetworkServerAdvertiser.h +++ b/src/openrct2/network/NetworkServerAdvertiser.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,7 @@ #pragma once +#include #include namespace OpenRCT2::Network @@ -17,6 +18,7 @@ namespace OpenRCT2::Network { disabled, unregistered, + registering, registered, }; diff --git a/src/openrct2/network/NetworkTypes.h b/src/openrct2/network/NetworkTypes.h index 255d03eab048..f058e3a2edb4 100644 --- a/src/openrct2/network/NetworkTypes.h +++ b/src/openrct2/network/NetworkTypes.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -82,9 +82,10 @@ namespace OpenRCT2::Network playerInfo, requestGameState, gameState, - scriptsHeader, + scriptsHeader, // Deprecated. scriptsData, heartbeat, + beginMap, max, invalid = static_cast(-1), }; diff --git a/src/openrct2/network/NetworkUser.cpp b/src/openrct2/network/NetworkUser.cpp index 36cf045d26c8..23216e2c4323 100644 --- a/src/openrct2/network/NetworkUser.cpp +++ b/src/openrct2/network/NetworkUser.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/NetworkUser.h b/src/openrct2/network/NetworkUser.h index 3a0504a83dd2..acaa0c324a1a 100644 --- a/src/openrct2/network/NetworkUser.h +++ b/src/openrct2/network/NetworkUser.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/ServerList.cpp b/src/openrct2/network/ServerList.cpp index 11ab4dfb7374..4076eee578e5 100644 --- a/src/openrct2/network/ServerList.cpp +++ b/src/openrct2/network/ServerList.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/ServerList.h b/src/openrct2/network/ServerList.h index c57450b8d379..1aca5f3d0ee3 100644 --- a/src/openrct2/network/ServerList.h +++ b/src/openrct2/network/ServerList.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/network/Socket.cpp b/src/openrct2/network/Socket.cpp index 6cb67e57d142..33cf70c4d155 100644 --- a/src/openrct2/network/Socket.cpp +++ b/src/openrct2/network/Socket.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -26,6 +26,9 @@ #ifdef _WIN32 #pragma comment(lib, "Ws2_32.lib") + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif // winsock2 must be included before windows.h #include #include @@ -69,6 +72,10 @@ #define FLAG_NO_PIPE 0 #endif // defined(__linux__) #endif // _WIN32 + +#ifdef __HAIKU__ + #include +#endif // clang-format on #include "Socket.h" @@ -798,9 +805,7 @@ namespace OpenRCT2::Network { const char* bufferStart = static_cast(buffer) + totalSent; size_t remainingSize = size - totalSent; - int32_t sentBytes = sendto( - _socket, bufferStart, static_cast(remainingSize), FLAG_NO_PIPE, static_cast(ss), - ss_len); + int32_t sentBytes = sendto(_socket, bufferStart, static_cast(remainingSize), FLAG_NO_PIPE, ss, ss_len); if (sentBytes == SOCKET_ERROR) { return totalSent; @@ -1010,17 +1015,4 @@ namespace OpenRCT2::Network } // namespace OpenRCT2::Network -namespace OpenRCT2::Convert -{ - uint16_t HostToNetwork(uint16_t value) - { - return htons(value); - } - - uint16_t NetworkToHost(uint16_t value) - { - return ntohs(value); - } -} // namespace OpenRCT2::Convert - #endif diff --git a/src/openrct2/network/Socket.h b/src/openrct2/network/Socket.h index e5e9ac077126..f95db5b99ca0 100644 --- a/src/openrct2/network/Socket.h +++ b/src/openrct2/network/Socket.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,8 @@ #pragma once +#include "../core/Endianness.h" + #include #include #include @@ -106,6 +108,24 @@ namespace OpenRCT2::Network namespace OpenRCT2::Convert { - uint16_t HostToNetwork(uint16_t value); - uint16_t NetworkToHost(uint16_t value); + template + constexpr T HostToNetwork(T value) + { + if constexpr (std::endian::native == std::endian::big) + { + return value; // already network order + } + else + { + return ByteSwapBE(value); + } + } + + template + constexpr T NetworkToHost(T value) + { + // Conversion is symmetric + return HostToNetwork(value); + } + } // namespace OpenRCT2::Convert diff --git a/src/openrct2/object/AudioObject.cpp b/src/openrct2/object/AudioObject.cpp index 2ffda387252c..b1c1c3cb4bf3 100644 --- a/src/openrct2/object/AudioObject.cpp +++ b/src/openrct2/object/AudioObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/AudioObject.h b/src/openrct2/object/AudioObject.h index 64fd4f2d86a1..c204b672dbf2 100644 --- a/src/openrct2/object/AudioObject.h +++ b/src/openrct2/object/AudioObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/AudioSampleTable.cpp b/src/openrct2/object/AudioSampleTable.cpp index 9c7d5f42009b..4e07ea9997e4 100644 --- a/src/openrct2/object/AudioSampleTable.cpp +++ b/src/openrct2/object/AudioSampleTable.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/AudioSampleTable.h b/src/openrct2/object/AudioSampleTable.h index f91fb0778b1a..27f5e346e301 100644 --- a/src/openrct2/object/AudioSampleTable.h +++ b/src/openrct2/object/AudioSampleTable.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/BannerObject.cpp b/src/openrct2/object/BannerObject.cpp index 2b373461eb03..799435fef8f8 100644 --- a/src/openrct2/object/BannerObject.cpp +++ b/src/openrct2/object/BannerObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -68,7 +68,7 @@ namespace OpenRCT2 _legacyType.image = 0; } - void BannerObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void BannerObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2, height / 2 }; diff --git a/src/openrct2/object/BannerObject.h b/src/openrct2/object/BannerObject.h index 96c110d3d7c6..fc04e93d83fc 100644 --- a/src/openrct2/object/BannerObject.h +++ b/src/openrct2/object/BannerObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -33,6 +33,6 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; }; } // namespace OpenRCT2 diff --git a/src/openrct2/object/BannerSceneryEntry.h b/src/openrct2/object/BannerSceneryEntry.h index 8465c6a8fdac..520aed10975d 100644 --- a/src/openrct2/object/BannerSceneryEntry.h +++ b/src/openrct2/object/BannerSceneryEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ClimateObject.cpp b/src/openrct2/object/ClimateObject.cpp index 7e9ff423a5d5..1100f80a3917 100644 --- a/src/openrct2/object/ClimateObject.cpp +++ b/src/openrct2/object/ClimateObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,8 +13,10 @@ #include "../core/Guard.hpp" #include "../core/IStream.hpp" #include "../core/Json.hpp" +#include "../drawing/Drawing.h" #include "../localisation/Formatter.h" #include "../localisation/StringIds.h" +#include "../world/Location.hpp" #include @@ -52,7 +54,7 @@ namespace OpenRCT2 static RawClimate readWeatherTable(json_t& weather); static Climate convertRawClimate(const RawClimate& rawClimate); - void ClimateObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void ClimateObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { const auto dist = getYearlyDistribution(); const auto totalSize = kNumClimateMonths * kWeatherDistSize; diff --git a/src/openrct2/object/ClimateObject.h b/src/openrct2/object/ClimateObject.h index 3ca67858d6d3..0d754c203b9e 100644 --- a/src/openrct2/object/ClimateObject.h +++ b/src/openrct2/object/ClimateObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -31,7 +31,7 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; const TemperatureThresholds& getItemThresholds() const; const WeatherPattern& getPatternForMonth(uint8_t month) const; diff --git a/src/openrct2/object/DefaultObjects.cpp b/src/openrct2/object/DefaultObjects.cpp index c093b85c573d..b745b4db7e3b 100644 --- a/src/openrct2/object/DefaultObjects.cpp +++ b/src/openrct2/object/DefaultObjects.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/DefaultObjects.h b/src/openrct2/object/DefaultObjects.h index c28720c0ae28..93c5183232b0 100644 --- a/src/openrct2/object/DefaultObjects.h +++ b/src/openrct2/object/DefaultObjects.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/EntranceEntry.h b/src/openrct2/object/EntranceEntry.h index a3d8dd782fdf..32a373ff8abb 100644 --- a/src/openrct2/object/EntranceEntry.h +++ b/src/openrct2/object/EntranceEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/EntranceObject.cpp b/src/openrct2/object/EntranceObject.cpp index cb7ad7c51b16..59ecb7b0e935 100644 --- a/src/openrct2/object/EntranceObject.cpp +++ b/src/openrct2/object/EntranceObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -45,7 +45,7 @@ namespace OpenRCT2 _legacyType.image_id = 0; } - void EntranceObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void EntranceObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2, height / 2 }; GfxDrawSprite(rt, ImageId(_legacyType.image_id + 1), screenCoords + ScreenCoordsXY{ -32, 14 }); diff --git a/src/openrct2/object/EntranceObject.h b/src/openrct2/object/EntranceObject.h index c1cc6722dbbc..f98aa42410a0 100644 --- a/src/openrct2/object/EntranceObject.h +++ b/src/openrct2/object/EntranceObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -34,7 +34,7 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; ImageIndex GetImage(uint8_t sequence, Direction direction) const; uint8_t GetScrollingMode() const; diff --git a/src/openrct2/object/FootpathEntry.h b/src/openrct2/object/FootpathEntry.h index ae0fb0052c72..f6292201068f 100644 --- a/src/openrct2/object/FootpathEntry.h +++ b/src/openrct2/object/FootpathEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/FootpathObject.cpp b/src/openrct2/object/FootpathObject.cpp index 4c52b16207a8..f72e0978429f 100644 --- a/src/openrct2/object/FootpathObject.cpp +++ b/src/openrct2/object/FootpathObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -29,7 +29,7 @@ namespace OpenRCT2 GetImageTable().Read(context, stream); // Validate properties - if (_legacyType.support_type >= RailingEntrySupportType::Count) + if (_legacyType.support_type >= RailingEntrySupportType::count) { context->LogError(ObjectError::invalidProperty, "RailingEntrySupportType not supported."); } @@ -42,23 +42,23 @@ namespace OpenRCT2 _legacyType.image = LoadImages(); _legacyType.bridge_image = _legacyType.image + 109; - _pathSurfaceDescriptor.Name = _legacyType.string_idx; - _pathSurfaceDescriptor.Image = _legacyType.image; - _pathSurfaceDescriptor.PreviewImage = _legacyType.GetPreviewImage(); - _pathSurfaceDescriptor.Flags = _legacyType.flags; + _pathSurfaceDescriptor.name = _legacyType.string_idx; + _pathSurfaceDescriptor.image = _legacyType.image; + _pathSurfaceDescriptor.previewImage = _legacyType.GetPreviewImage(); + _pathSurfaceDescriptor.flags = _legacyType.flags; - _queueSurfaceDescriptor.Name = _legacyType.string_idx; - _queueSurfaceDescriptor.Image = _legacyType.GetQueueImage(); - _queueSurfaceDescriptor.PreviewImage = _legacyType.GetQueuePreviewImage(); - _queueSurfaceDescriptor.Flags = _legacyType.flags | FOOTPATH_ENTRY_FLAG_IS_QUEUE; + _queueSurfaceDescriptor.name = _legacyType.string_idx; + _queueSurfaceDescriptor.image = _legacyType.GetQueueImage(); + _queueSurfaceDescriptor.previewImage = _legacyType.GetQueuePreviewImage(); + _queueSurfaceDescriptor.flags = _legacyType.flags | FOOTPATH_ENTRY_FLAG_IS_QUEUE; - _pathRailingsDescriptor.Name = _legacyType.string_idx; - _pathRailingsDescriptor.BridgeImage = _legacyType.bridge_image; - _pathRailingsDescriptor.PreviewImage = _legacyType.GetPreviewImage(); - _pathRailingsDescriptor.Flags = _legacyType.flags; - _pathRailingsDescriptor.ScrollingMode = _legacyType.scrolling_mode; - _pathRailingsDescriptor.SupportType = _legacyType.support_type; - _pathRailingsDescriptor.RailingsImage = _legacyType.GetRailingsImage(); + _pathRailingsDescriptor.name = _legacyType.string_idx; + _pathRailingsDescriptor.bridgeImage = _legacyType.bridge_image; + _pathRailingsDescriptor.previewImage = _legacyType.GetPreviewImage(); + _pathRailingsDescriptor.flags = _legacyType.flags; + _pathRailingsDescriptor.scrollingMode = _legacyType.scrolling_mode; + _pathRailingsDescriptor.supportType = _legacyType.support_type; + _pathRailingsDescriptor.railingsImage = _legacyType.GetRailingsImage(); } void FootpathObject::Unload() @@ -70,11 +70,11 @@ namespace OpenRCT2 _legacyType.image = 0; } - void FootpathObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void FootpathObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2, height / 2 }; - GfxDrawSprite(rt, ImageId(_pathSurfaceDescriptor.PreviewImage), screenCoords - ScreenCoordsXY{ 49, 17 }); - GfxDrawSprite(rt, ImageId(_queueSurfaceDescriptor.PreviewImage), screenCoords + ScreenCoordsXY{ 4, -17 }); + GfxDrawSprite(rt, ImageId(_pathSurfaceDescriptor.previewImage), screenCoords - ScreenCoordsXY{ 49, 17 }); + GfxDrawSprite(rt, ImageId(_queueSurfaceDescriptor.previewImage), screenCoords + ScreenCoordsXY{ 4, -17 }); } void FootpathObject::ReadJson(IReadObjectContext* context, json_t& root) diff --git a/src/openrct2/object/FootpathObject.h b/src/openrct2/object/FootpathObject.h index fbfa96402465..3624b0e1ee3d 100644 --- a/src/openrct2/object/FootpathObject.h +++ b/src/openrct2/object/FootpathObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -56,6 +56,6 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; }; } // namespace OpenRCT2 diff --git a/src/openrct2/object/FootpathRailingsObject.cpp b/src/openrct2/object/FootpathRailingsObject.cpp index 9784fe917e4d..57975eade96b 100644 --- a/src/openrct2/object/FootpathRailingsObject.cpp +++ b/src/openrct2/object/FootpathRailingsObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../core/Guard.hpp" #include "../core/IStream.hpp" #include "../core/Json.hpp" +#include "../drawing/Drawing.h" namespace OpenRCT2 { @@ -28,14 +29,14 @@ namespace OpenRCT2 RailingsImageId = PreviewImageId + 1; } - _descriptor.Name = NameStringId; - _descriptor.BridgeImage = BridgeImageId; - _descriptor.PreviewImage = PreviewImageId; - _descriptor.Flags = Flags; - _descriptor.ScrollingMode = ScrollingMode; - _descriptor.SupportType = SupportType; - _descriptor.SupportColour = Colour; - _descriptor.RailingsImage = RailingsImageId; + _descriptor.name = NameStringId; + _descriptor.bridgeImage = BridgeImageId; + _descriptor.previewImage = PreviewImageId; + _descriptor.flags = Flags; + _descriptor.scrollingMode = ScrollingMode; + _descriptor.supportType = SupportType; + _descriptor.supportColour = Colour; + _descriptor.railingsImage = RailingsImageId; } void FootpathRailingsObject::Unload() @@ -49,7 +50,7 @@ namespace OpenRCT2 RailingsImageId = 0; } - void FootpathRailingsObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void FootpathRailingsObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto x = width / 2; auto y = height / 2; @@ -57,7 +58,7 @@ namespace OpenRCT2 if (Colour != COLOUR_NULL) helper = helper.WithPrimary(Colour); - if (SupportType == RailingEntrySupportType::Pole) + if (SupportType == RailingEntrySupportType::pole) { auto img = helper.WithIndex(BridgeImageId + 20 + 15); for (int i = 0; i < 2; i++) @@ -105,8 +106,8 @@ namespace OpenRCT2 RailingEntrySupportType FootpathRailingsObject::ParseSupportType(std::string_view s) { if (s == "pole") - return RailingEntrySupportType::Pole; + return RailingEntrySupportType::pole; else /* if (s == "box") */ - return RailingEntrySupportType::Box; + return RailingEntrySupportType::box; } } // namespace OpenRCT2 diff --git a/src/openrct2/object/FootpathRailingsObject.h b/src/openrct2/object/FootpathRailingsObject.h index 46e960ee08b7..977ddbbacff5 100644 --- a/src/openrct2/object/FootpathRailingsObject.h +++ b/src/openrct2/object/FootpathRailingsObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -34,7 +34,7 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; const PathRailingsDescriptor& GetDescriptor() const { diff --git a/src/openrct2/object/FootpathSurfaceObject.cpp b/src/openrct2/object/FootpathSurfaceObject.cpp index 5348c585b85a..e100f67f9ce0 100644 --- a/src/openrct2/object/FootpathSurfaceObject.cpp +++ b/src/openrct2/object/FootpathSurfaceObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../core/Guard.hpp" #include "../core/IStream.hpp" #include "../core/Json.hpp" +#include "../drawing/Drawing.h" #include "../drawing/Image.h" #include "FootpathEntry.h" #include "ObjectRepository.h" @@ -30,10 +31,10 @@ namespace OpenRCT2 BaseImageId = PreviewImageId + 1; } - _descriptor.Name = NameStringId; - _descriptor.Image = BaseImageId; - _descriptor.PreviewImage = PreviewImageId; - _descriptor.Flags = Flags; + _descriptor.name = NameStringId; + _descriptor.image = BaseImageId; + _descriptor.previewImage = PreviewImageId; + _descriptor.flags = Flags; } void FootpathSurfaceObject::Unload() @@ -46,7 +47,7 @@ namespace OpenRCT2 BaseImageId = 0; } - void FootpathSurfaceObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void FootpathSurfaceObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2 - 16, height / 2 }; GfxDrawSprite(rt, ImageId(BaseImageId + 3), screenCoords); diff --git a/src/openrct2/object/FootpathSurfaceObject.h b/src/openrct2/object/FootpathSurfaceObject.h index 73089ae4f8d8..1cbe4a69e071 100644 --- a/src/openrct2/object/FootpathSurfaceObject.h +++ b/src/openrct2/object/FootpathSurfaceObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,7 +30,7 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; void SetRepositoryItem(ObjectRepositoryItem* item) const override; diff --git a/src/openrct2/object/ImageTable.cpp b/src/openrct2/object/ImageTable.cpp index dd3a275816c6..6e69d73fd817 100644 --- a/src/openrct2/object/ImageTable.cpp +++ b/src/openrct2/object/ImageTable.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,6 +21,7 @@ #include "../core/Json.hpp" #include "../core/Path.hpp" #include "../core/String.hpp" +#include "../drawing/Drawing.h" #include "../drawing/ImageImporter.h" #include "Object.h" #include "ObjectFactory.h" @@ -51,7 +52,7 @@ namespace OpenRCT2 g1 = orig; g1.offset = new uint8_t[length]; std::memcpy(g1.offset, orig.offset, length); - g1.flags &= ~G1_FLAG_HAS_ZOOM_SPRITE; + g1.flags.unset(G1Flag::hasZoomSprite); } RequiredImage(uint32_t idx, std::function getter) @@ -63,14 +64,14 @@ namespace OpenRCT2 g1 = *orig; g1.offset = new uint8_t[length]; std::memcpy(g1.offset, orig->offset, length); - if ((g1.flags & G1_FLAG_HAS_ZOOM_SPRITE) && g1.zoomed_offset != 0) + if (g1.flags.has(G1Flag::hasZoomSprite) && g1.zoomedOffset != 0) { // Fetch image for next zoom level - next_zoom = std::make_unique(static_cast(idx - g1.zoomed_offset), getter); + next_zoom = std::make_unique(static_cast(idx - g1.zoomedOffset), getter); if (!next_zoom->HasData()) { next_zoom = nullptr; - g1.flags &= ~G1_FLAG_HAS_ZOOM_SPRITE; + g1.flags.unset(G1Flag::hasZoomSprite); } } } @@ -231,7 +232,7 @@ namespace OpenRCT2 if (gxData.has_value()) { // Fix entry data offsets - for (uint32_t i = 0; i < gxData->header.num_entries; i++) + for (uint32_t i = 0; i < gxData->header.numEntries; i++) { if (gxData->elements[i].offset == nullptr) { @@ -248,7 +249,7 @@ namespace OpenRCT2 size_t placeHoldersAdded = 0; for (auto i : range) { - if (i >= 0 && (i < static_cast(gxData->header.num_entries))) + if (i >= 0 && (i < static_cast(gxData->header.numEntries))) { result.push_back(std::make_unique(gxData->elements[i])); } @@ -268,7 +269,7 @@ namespace OpenRCT2 } else { - for (int i = 0; i < static_cast(gxData->header.num_entries); i++) + for (int i = 0; i < static_cast(gxData->header.numEntries); i++) result.push_back(std::make_unique(gxData->elements[i])); } } @@ -469,10 +470,10 @@ namespace OpenRCT2 g1Element.width = stream->ReadValue(); g1Element.height = stream->ReadValue(); - g1Element.x_offset = stream->ReadValue(); - g1Element.y_offset = stream->ReadValue(); - g1Element.flags = stream->ReadValue(); - g1Element.zoomed_offset = stream->ReadValue(); + g1Element.xOffset = stream->ReadValue(); + g1Element.yOffset = stream->ReadValue(); + g1Element.flags = stream->ReadValue(); + g1Element.zoomedOffset = stream->ReadValue(); newEntries.push_back(std::move(g1Element)); } @@ -568,9 +569,9 @@ namespace OpenRCT2 for (auto& image : images) { if (hasXOverride) - image->g1.x_offset = xOverride; + image->g1.xOffset = xOverride; if (hasYOverride) - image->g1.y_offset = yOverride; + image->g1.yOffset = yOverride; } } @@ -606,14 +607,14 @@ namespace OpenRCT2 // Set old image zoom offset to zoom image which we are about to add auto g1a = const_cast(&GetImages()[tableIndex]); - g1a->zoomed_offset = static_cast(tableIndex) - static_cast(GetCount()); + g1a->zoomedOffset = static_cast(tableIndex) - static_cast(GetCount()); while (img != nullptr) { auto g1b = img->g1; if (img->next_zoom != nullptr) { - g1b.zoomed_offset = -1; + g1b.zoomedOffset = -1; } AddImage(&g1b); img = img->next_zoom.get(); @@ -642,4 +643,11 @@ namespace OpenRCT2 } _entries.push_back(std::move(newg1)); } + + void ImageTable::addPalette(const G1Palette& g1) + { + Guard::Assert(g1.flags.has(G1Flag::isPalette)); + const auto base = reinterpret_cast(&g1); + AddImage(base); + } } // namespace OpenRCT2 diff --git a/src/openrct2/object/ImageTable.h b/src/openrct2/object/ImageTable.h index 1a4ff375355b..075c35e59b3d 100644 --- a/src/openrct2/object/ImageTable.h +++ b/src/openrct2/object/ImageTable.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,7 +10,7 @@ #pragma once #include "../core/JsonFwd.hpp" -#include "../drawing/Drawing.h" +#include "../drawing/G1Element.h" #include #include @@ -68,5 +68,6 @@ namespace OpenRCT2 return static_cast(_entries.size()); } void AddImage(const G1Element* g1); + void addPalette(const G1Palette& g1); }; } // namespace OpenRCT2 diff --git a/src/openrct2/object/LargeSceneryEntry.h b/src/openrct2/object/LargeSceneryEntry.h index a20408ae5339..95c0da1fdf8a 100644 --- a/src/openrct2/object/LargeSceneryEntry.h +++ b/src/openrct2/object/LargeSceneryEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/LargeSceneryObject.cpp b/src/openrct2/object/LargeSceneryObject.cpp index 8d6ad1fb0693..1d9e8cc56ffd 100644 --- a/src/openrct2/object/LargeSceneryObject.cpp +++ b/src/openrct2/object/LargeSceneryObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,9 +15,9 @@ #include "../core/Json.hpp" #include "../core/Memory.hpp" #include "../drawing/Drawing.h" +#include "../drawing/ScrollingText.h" #include "../interface/Cursors.h" #include "../localisation/Language.h" -#include "../world/Banner.h" #include "../world/Location.hpp" #include @@ -143,7 +143,7 @@ namespace OpenRCT2 _baseImageId = _legacyType.image = 0; } - void LargeSceneryObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void LargeSceneryObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2, (height / 2) - 39 }; diff --git a/src/openrct2/object/LargeSceneryObject.h b/src/openrct2/object/LargeSceneryObject.h index db3745fb027b..5fe8612883ab 100644 --- a/src/openrct2/object/LargeSceneryObject.h +++ b/src/openrct2/object/LargeSceneryObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -38,7 +38,7 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; private: [[nodiscard]] static std::vector ReadTiles(OpenRCT2::IStream* stream); diff --git a/src/openrct2/object/MusicObject.cpp b/src/openrct2/object/MusicObject.cpp index 5d90c86cbf95..33867b439182 100644 --- a/src/openrct2/object/MusicObject.cpp +++ b/src/openrct2/object/MusicObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,7 +18,9 @@ #include "../core/IStream.hpp" #include "../core/Json.hpp" #include "../core/Path.hpp" +#include "../drawing/Drawing.h" #include "../drawing/Image.h" +#include "../localisation/Formatter.h" #include "../localisation/StringIds.h" #include "../ride/Ride.h" #include "RideObject.h" @@ -86,7 +88,7 @@ namespace OpenRCT2 NameStringId = 0; } - void MusicObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void MusicObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { // Write (no image) int32_t x = width / 2; diff --git a/src/openrct2/object/MusicObject.h b/src/openrct2/object/MusicObject.h index a9f28fea9b09..d8aa09596f16 100644 --- a/src/openrct2/object/MusicObject.h +++ b/src/openrct2/object/MusicObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,7 @@ #pragma once +#include "../ride/RideTypes.h" #include "AudioSampleTable.h" #include "Object.h" @@ -63,7 +64,7 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; bool HasPreview() const; std::optional GetOriginalStyleId() const; diff --git a/src/openrct2/object/Object.cpp b/src/openrct2/object/Object.cpp index f70921c41db6..54a2825f8828 100644 --- a/src/openrct2/object/Object.cpp +++ b/src/openrct2/object/Object.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index 9f4ca2da5570..1e56a864893d 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,6 +14,7 @@ #include "../drawing/ImageIndexType.h" #include "ImageTable.h" #include "ObjectAsset.h" +#include "ObjectSourceGame.h" #include "ObjectTypes.h" #include "StringTable.h" @@ -22,8 +23,10 @@ #include #include -struct RenderTarget; -using ride_type_t = uint16_t; +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} namespace OpenRCT2 { @@ -43,18 +46,6 @@ namespace OpenRCT2 constexpr uint8_t AllFlags = 0xFF; }; // namespace ObjectSelectionFlags - enum class ObjectSourceGame : uint8_t - { - custom, - wackyWorlds, - timeTwister, - openRCT2Official, - rct1, - addedAttractions, - loopyLandscapes, - rct2 = 8, - }; - #pragma pack(push, 1) /** * Object entry structure. @@ -108,12 +99,6 @@ namespace OpenRCT2 #pragma pack(pop) - struct RideFilters - { - uint8_t category[2]; - ride_type_t ride_type; - }; - enum class ObjectGeneration : uint8_t { DAT, @@ -292,7 +277,7 @@ namespace OpenRCT2 virtual void Load() = 0; virtual void Unload() = 0; - virtual void DrawPreview(RenderTarget& /*rt*/, int32_t /*width*/, int32_t /*height*/) const + virtual void DrawPreview(Drawing::RenderTarget& /*rt*/, int32_t /*width*/, int32_t /*height*/) const { } diff --git a/src/openrct2/object/ObjectAsset.h b/src/openrct2/object/ObjectAsset.h index 5b0f9a764928..2bda3de11467 100644 --- a/src/openrct2/object/ObjectAsset.h +++ b/src/openrct2/object/ObjectAsset.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectEntryManager.cpp b/src/openrct2/object/ObjectEntryManager.cpp index dc3f8531909c..c589d6ffbcc2 100644 --- a/src/openrct2/object/ObjectEntryManager.cpp +++ b/src/openrct2/object/ObjectEntryManager.cpp @@ -1,6 +1,16 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + #include "ObjectEntryManager.h" #include "../Context.h" +#include "Object.h" #include "ObjectManager.h" namespace OpenRCT2::ObjectManager diff --git a/src/openrct2/object/ObjectEntryManager.h b/src/openrct2/object/ObjectEntryManager.h index 42de1d4949d2..50a4e946427b 100644 --- a/src/openrct2/object/ObjectEntryManager.h +++ b/src/openrct2/object/ObjectEntryManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectFactory.cpp b/src/openrct2/object/ObjectFactory.cpp index d40c33588600..e7abb80ecdf2 100644 --- a/src/openrct2/object/ObjectFactory.cpp +++ b/src/openrct2/object/ObjectFactory.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectFactory.h b/src/openrct2/object/ObjectFactory.h index 4b2be14cf26c..9401e0b451d8 100644 --- a/src/openrct2/object/ObjectFactory.h +++ b/src/openrct2/object/ObjectFactory.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectLimits.h b/src/openrct2/object/ObjectLimits.h index cd2af1fa2206..9126e4bba005 100644 --- a/src/openrct2/object/ObjectLimits.h +++ b/src/openrct2/object/ObjectLimits.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectList.cpp b/src/openrct2/object/ObjectList.cpp index 0c71b854e7c9..535e4eea447a 100644 --- a/src/openrct2/object/ObjectList.cpp +++ b/src/openrct2/object/ObjectList.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectList.h b/src/openrct2/object/ObjectList.h index e0413d715cbd..bf5bb234ced1 100644 --- a/src/openrct2/object/ObjectList.h +++ b/src/openrct2/object/ObjectList.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectManager.cpp b/src/openrct2/object/ObjectManager.cpp index d89f4ab9bfed..79ccd8f3de40 100644 --- a/src/openrct2/object/ObjectManager.cpp +++ b/src/openrct2/object/ObjectManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectManager.h b/src/openrct2/object/ObjectManager.h index 947f1b7d2635..557c81632f30 100644 --- a/src/openrct2/object/ObjectManager.h +++ b/src/openrct2/object/ObjectManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,9 +9,13 @@ #pragma once -#include "../object/Object.h" +#include "../localisation/StringIdType.h" +#include "../ride/RideTypes.h" +#include "ObjectSourceGame.h" +#include "ObjectTypes.h" #include +#include #include namespace OpenRCT2 @@ -19,7 +23,9 @@ namespace OpenRCT2 struct IObjectRepository; class Object; class ObjectList; + struct ObjectEntryDescriptor; struct ObjectRepositoryItem; + struct RCTObjectEntry; struct IObjectManager { diff --git a/src/openrct2/object/ObjectRepository.cpp b/src/openrct2/object/ObjectRepository.cpp index c81f4a3d07a0..9a096efcdf03 100644 --- a/src/openrct2/object/ObjectRepository.cpp +++ b/src/openrct2/object/ObjectRepository.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectRepository.h b/src/openrct2/object/ObjectRepository.h index a9b951f0cfd4..2d78c955df21 100644 --- a/src/openrct2/object/ObjectRepository.h +++ b/src/openrct2/object/ObjectRepository.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,13 +9,12 @@ #pragma once -#include "../object/Object.h" +#include "ObjectTypes.h" #include "RideObject.h" #include #include -struct RenderTarget; enum class RideCategory : uint8_t; namespace OpenRCT2::Localisation diff --git a/src/openrct2/object/ObjectSourceGame.h b/src/openrct2/object/ObjectSourceGame.h new file mode 100644 index 000000000000..675b70b8d9cf --- /dev/null +++ b/src/openrct2/object/ObjectSourceGame.h @@ -0,0 +1,27 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include + +namespace OpenRCT2 +{ + enum class ObjectSourceGame : uint8_t + { + custom, + wackyWorlds, + timeTwister, + openRCT2Official, + rct1, + addedAttractions, + loopyLandscapes, + rct2 = 8, + }; +} diff --git a/src/openrct2/object/ObjectTypes.cpp b/src/openrct2/object/ObjectTypes.cpp index 30f88aa31374..657805d33659 100644 --- a/src/openrct2/object/ObjectTypes.cpp +++ b/src/openrct2/object/ObjectTypes.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ObjectTypes.h b/src/openrct2/object/ObjectTypes.h index 89c6b9489a1f..0985920fa685 100644 --- a/src/openrct2/object/ObjectTypes.h +++ b/src/openrct2/object/ObjectTypes.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/PathAdditionEntry.h b/src/openrct2/object/PathAdditionEntry.h index f3a59d26a59f..0a8af8a5aa9a 100644 --- a/src/openrct2/object/PathAdditionEntry.h +++ b/src/openrct2/object/PathAdditionEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/PathAdditionObject.cpp b/src/openrct2/object/PathAdditionObject.cpp index 1403113e7f26..4f46a91c00ea 100644 --- a/src/openrct2/object/PathAdditionObject.cpp +++ b/src/openrct2/object/PathAdditionObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,9 +14,8 @@ #include "../core/Json.hpp" #include "../drawing/Drawing.h" #include "../interface/Cursors.h" -#include "../object/Object.h" -#include "../object/ObjectRepository.h" #include "ObjectList.h" +#include "ObjectRepository.h" #include @@ -73,7 +72,7 @@ namespace OpenRCT2 _legacyType.image = 0; } - void PathAdditionObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void PathAdditionObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2, height / 2 }; GfxDrawSprite(rt, ImageId(_legacyType.image), screenCoords - ScreenCoordsXY{ 22, 24 }); diff --git a/src/openrct2/object/PathAdditionObject.h b/src/openrct2/object/PathAdditionObject.h index f2d57737b692..763d64e43cb7 100644 --- a/src/openrct2/object/PathAdditionObject.h +++ b/src/openrct2/object/PathAdditionObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -32,6 +32,6 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; }; } // namespace OpenRCT2 diff --git a/src/openrct2/object/PeepAnimationsObject.cpp b/src/openrct2/object/PeepAnimationsObject.cpp index 4e25f3ea32bc..33fc76b09c54 100644 --- a/src/openrct2/object/PeepAnimationsObject.cpp +++ b/src/openrct2/object/PeepAnimationsObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,6 +14,7 @@ #include "../core/EnumMap.hpp" #include "../core/Guard.hpp" #include "../core/Json.hpp" +#include "../drawing/Drawing.h" #include "../peep/PeepAnimations.h" #include "../rct12/RCT12.h" #include "ObjectRepository.h" @@ -205,7 +206,7 @@ namespace OpenRCT2 return _animationGroups[EnumValue(animGroup)].isSlowWalking; } - void PeepAnimationsObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void PeepAnimationsObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto centre = ScreenCoordsXY{ width / 2, height / 2 }; diff --git a/src/openrct2/object/PeepAnimationsObject.h b/src/openrct2/object/PeepAnimationsObject.h index 0840e973f71d..9783924a4b96 100644 --- a/src/openrct2/object/PeepAnimationsObject.h +++ b/src/openrct2/object/PeepAnimationsObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -57,7 +57,7 @@ namespace OpenRCT2 return _noRandomPlacement; } - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; void SetRepositoryItem(ObjectRepositoryItem* item) const override; }; } // namespace OpenRCT2 diff --git a/src/openrct2/object/PeepNamesObject.cpp b/src/openrct2/object/PeepNamesObject.cpp index 41b367a15137..dc3345d0fd2f 100644 --- a/src/openrct2/object/PeepNamesObject.cpp +++ b/src/openrct2/object/PeepNamesObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/PeepNamesObject.h b/src/openrct2/object/PeepNamesObject.h index d2e2bd4e2b58..04a2700d70ba 100644 --- a/src/openrct2/object/PeepNamesObject.h +++ b/src/openrct2/object/PeepNamesObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ResourceTable.cpp b/src/openrct2/object/ResourceTable.cpp index 910ab0547d17..35e58eae1d7f 100644 --- a/src/openrct2/object/ResourceTable.cpp +++ b/src/openrct2/object/ResourceTable.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/ResourceTable.h b/src/openrct2/object/ResourceTable.h index d8fb67d1a0e2..fc91c6b0fe79 100644 --- a/src/openrct2/object/ResourceTable.h +++ b/src/openrct2/object/ResourceTable.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 5294198677bb..a1385ea6cf61 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -132,7 +132,7 @@ namespace OpenRCT2 } } - enum CarSpriteFlag : uint8_t + enum class CarSpriteFlag : uint8_t { flat, gentleSlopes, @@ -376,7 +376,8 @@ namespace OpenRCT2 _legacyType.images_offset = 0; } - void RideObject::DrawPreview(RenderTarget& rt, [[maybe_unused]] int32_t width, [[maybe_unused]] int32_t height) const + void RideObject::DrawPreview( + Drawing::RenderTarget& rt, [[maybe_unused]] int32_t width, [[maybe_unused]] int32_t height) const { uint32_t imageId = _legacyType.images_offset; diff --git a/src/openrct2/object/RideObject.h b/src/openrct2/object/RideObject.h index ea2833de289c..947f2e211ee6 100644 --- a/src/openrct2/object/RideObject.h +++ b/src/openrct2/object/RideObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -47,7 +47,7 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; std::string GetDescription() const; std::string GetCapacity() const; diff --git a/src/openrct2/object/ScenarioMetaObject.cpp b/src/openrct2/object/ScenarioMetaObject.cpp index b4573a20a30c..428d18bcf07d 100644 --- a/src/openrct2/object/ScenarioMetaObject.cpp +++ b/src/openrct2/object/ScenarioMetaObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include "../PlatformEnvironment.h" #include "../core/Guard.hpp" #include "../core/Json.hpp" +#include "../drawing/Drawing.h" namespace OpenRCT2 { @@ -63,7 +64,7 @@ namespace OpenRCT2 preview.width = g1->width; preview.height = g1->height; - std::copy_n(g1->offset, g1->width * g1->height, preview.pixels); + std::copy_n(g1->offset, g1->width * g1->height, reinterpret_cast(preview.pixels)); return preview; } @@ -80,7 +81,7 @@ namespace OpenRCT2 preview.width = g1->width; preview.height = g1->height; - std::copy_n(g1->offset, g1->width * g1->height, preview.pixels); + std::copy_n(g1->offset, g1->width * g1->height, reinterpret_cast(preview.pixels)); return preview; } diff --git a/src/openrct2/object/ScenarioMetaObject.h b/src/openrct2/object/ScenarioMetaObject.h index 4eb734f03b05..16879df4363a 100644 --- a/src/openrct2/object/ScenarioMetaObject.h +++ b/src/openrct2/object/ScenarioMetaObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/SceneryGroupEntry.h b/src/openrct2/object/SceneryGroupEntry.h index bbaef394d57a..5da2d5bbc853 100644 --- a/src/openrct2/object/SceneryGroupEntry.h +++ b/src/openrct2/object/SceneryGroupEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/SceneryGroupObject.cpp b/src/openrct2/object/SceneryGroupObject.cpp index 399c4518960c..bc5bbf229139 100644 --- a/src/openrct2/object/SceneryGroupObject.cpp +++ b/src/openrct2/object/SceneryGroupObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -70,7 +70,7 @@ namespace OpenRCT2 _legacyType.image = 0; } - void SceneryGroupObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void SceneryGroupObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2, height / 2 }; diff --git a/src/openrct2/object/SceneryGroupObject.h b/src/openrct2/object/SceneryGroupObject.h index b669f1d5601d..b0d9f4febfe0 100644 --- a/src/openrct2/object/SceneryGroupObject.h +++ b/src/openrct2/object/SceneryGroupObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -38,7 +38,7 @@ namespace OpenRCT2 void Unload() override; void UpdateEntryIndexes(); - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; void SetRepositoryItem(ObjectRepositoryItem* item) const override; diff --git a/src/openrct2/object/SceneryObject.h b/src/openrct2/object/SceneryObject.h index cea6c9cde64a..c44ffebe6207 100644 --- a/src/openrct2/object/SceneryObject.h +++ b/src/openrct2/object/SceneryObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/SmallSceneryEntry.h b/src/openrct2/object/SmallSceneryEntry.h index beedcd42da50..02250c555bcb 100644 --- a/src/openrct2/object/SmallSceneryEntry.h +++ b/src/openrct2/object/SmallSceneryEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/SmallSceneryObject.cpp b/src/openrct2/object/SmallSceneryObject.cpp index d305547404ff..4d8e6bad5f7a 100644 --- a/src/openrct2/object/SmallSceneryObject.cpp +++ b/src/openrct2/object/SmallSceneryObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -98,7 +98,7 @@ namespace OpenRCT2 _legacyType.image = 0; } - void SmallSceneryObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void SmallSceneryObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto imageId = ImageId(_legacyType.image); if (_legacyType.HasFlag(SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR)) diff --git a/src/openrct2/object/SmallSceneryObject.h b/src/openrct2/object/SmallSceneryObject.h index 6bb3325050df..cffb1001582e 100644 --- a/src/openrct2/object/SmallSceneryObject.h +++ b/src/openrct2/object/SmallSceneryObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -36,7 +36,7 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; private: static std::vector ReadFrameOffsets(IStream* stream); diff --git a/src/openrct2/object/StationObject.cpp b/src/openrct2/object/StationObject.cpp index 7bfbb30f7156..79100a7e9738 100644 --- a/src/openrct2/object/StationObject.cpp +++ b/src/openrct2/object/StationObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,7 +14,7 @@ #include "../core/Json.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" -#include "../world/Banner.h" +#include "../drawing/ScrollingText.h" namespace OpenRCT2 { @@ -46,7 +46,7 @@ namespace OpenRCT2 ShelterImageId = kImageIndexUndefined; } - void StationObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void StationObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2, (height / 2) + 16 }; diff --git a/src/openrct2/object/StationObject.h b/src/openrct2/object/StationObject.h index e506f02a6897..2e24e8d2887e 100644 --- a/src/openrct2/object/StationObject.h +++ b/src/openrct2/object/StationObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -39,6 +39,6 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; }; } // namespace OpenRCT2 diff --git a/src/openrct2/object/StringTable.cpp b/src/openrct2/object/StringTable.cpp index 9c6fe8c044b8..5fa2b68e0978 100644 --- a/src/openrct2/object/StringTable.cpp +++ b/src/openrct2/object/StringTable.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/StringTable.h b/src/openrct2/object/StringTable.h index f5f27b245f71..69326d2c5533 100644 --- a/src/openrct2/object/StringTable.h +++ b/src/openrct2/object/StringTable.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/TerrainEdgeObject.cpp b/src/openrct2/object/TerrainEdgeObject.cpp index 05bb847fa71e..bf82222b43a8 100644 --- a/src/openrct2/object/TerrainEdgeObject.cpp +++ b/src/openrct2/object/TerrainEdgeObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -39,7 +39,7 @@ namespace OpenRCT2 BaseImageId = 0; } - void TerrainEdgeObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void TerrainEdgeObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2, height / 2 }; diff --git a/src/openrct2/object/TerrainEdgeObject.h b/src/openrct2/object/TerrainEdgeObject.h index 53768dc8cb4c..5a5ffdfc14bc 100644 --- a/src/openrct2/object/TerrainEdgeObject.h +++ b/src/openrct2/object/TerrainEdgeObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,7 +30,7 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; static TerrainEdgeObject* GetById(ObjectEntryIndex entryIndex); }; diff --git a/src/openrct2/object/TerrainSurfaceObject.cpp b/src/openrct2/object/TerrainSurfaceObject.cpp index ed6b4beb0c8d..4942508eed45 100644 --- a/src/openrct2/object/TerrainSurfaceObject.cpp +++ b/src/openrct2/object/TerrainSurfaceObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -25,7 +25,7 @@ namespace OpenRCT2 GetStringTable().Sort(); NameStringId = LanguageAllocateObjectString(GetName()); IconImageId = LoadImages(); - if ((Flags & TerrainSurfaceFlags::smoothWithSelf) || (Flags & TerrainSurfaceFlags::smoothWithOther)) + if (Flags.hasAny(TerrainSurfaceFlag::smoothWithSelf, TerrainSurfaceFlag::smoothWithOther)) { PatternBaseImageId = IconImageId + 1; EntryBaseImageId = PatternBaseImageId + 6; @@ -49,7 +49,7 @@ namespace OpenRCT2 NumEntries = 0; } - void TerrainSurfaceObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void TerrainSurfaceObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto imageId = ImageId(GetImageId({}, 1, 0, 0, false, false)); if (Colour != kNoValue) @@ -87,11 +87,11 @@ namespace OpenRCT2 Colour = Colour::FromString(Json::GetString(properties["colour"]), kNoValue); Rotations = Json::GetNumber(properties["rotations"], 1); Price = Json::GetNumber(properties["price"]); - Flags = Json::GetFlags( + Flags = Json::GetFlagHolder( properties, - { { "smoothWithSelf", TerrainSurfaceFlags::smoothWithSelf }, - { "smoothWithOther", TerrainSurfaceFlags::smoothWithOther }, - { "canGrow", TerrainSurfaceFlags::canGrow } }); + { { "smoothWithSelf", TerrainSurfaceFlag::smoothWithSelf }, + { "smoothWithOther", TerrainSurfaceFlag::smoothWithOther }, + { "canGrow", TerrainSurfaceFlag::canGrow } }); const auto mapColours = properties["mapColours"]; const bool mapColoursAreValid = mapColours.is_array() && mapColours.size() == std::size(MapColours); @@ -100,7 +100,7 @@ namespace OpenRCT2 if (mapColoursAreValid) MapColours[i] = mapColours[i]; else - MapColours[i] = PaletteIndex::pi0; + MapColours[i] = OpenRCT2::Drawing::PaletteIndex::pi0; } for (auto& el : properties["special"]) diff --git a/src/openrct2/object/TerrainSurfaceObject.h b/src/openrct2/object/TerrainSurfaceObject.h index 9447706430f5..0aee565050f8 100644 --- a/src/openrct2/object/TerrainSurfaceObject.h +++ b/src/openrct2/object/TerrainSurfaceObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,18 +10,20 @@ #pragma once #include "../core/Money.hpp" +#include "../interface/Colour.h" #include "Object.h" struct CoordsXY; namespace OpenRCT2 { - enum TerrainSurfaceFlags + enum class TerrainSurfaceFlag : uint8_t { - smoothWithSelf = 1 << 0, - smoothWithOther = 1 << 1, - canGrow = 1 << 2, + smoothWithSelf, + smoothWithOther, + canGrow, }; + using TerrainSurfaceFlags = FlagHolder; class TerrainSurfaceObject final : public Object { @@ -57,13 +59,13 @@ namespace OpenRCT2 uint8_t Rotations{}; money64 Price{}; TerrainSurfaceFlags Flags{}; - PaletteIndex MapColours[2]{}; + OpenRCT2::Drawing::PaletteIndex MapColours[2]{}; void ReadJson(IReadObjectContext* context, json_t& root) override; void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; ImageId GetImageId( const CoordsXY& position, uint8_t length, uint8_t rotation, uint8_t offset, bool grid, bool underground) const; diff --git a/src/openrct2/object/WallObject.cpp b/src/openrct2/object/WallObject.cpp index 2482b41a323f..c03ce0c84884 100644 --- a/src/openrct2/object/WallObject.cpp +++ b/src/openrct2/object/WallObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,9 +14,9 @@ #include "../core/Json.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" +#include "../drawing/ScrollingText.h" #include "../interface/Cursors.h" #include "../localisation/Language.h" -#include "../world/Banner.h" namespace OpenRCT2 { @@ -70,7 +70,7 @@ namespace OpenRCT2 _legacyType.image = 0; } - void WallObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void WallObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { auto screenCoords = ScreenCoordsXY{ width / 2, height / 2 }; diff --git a/src/openrct2/object/WallObject.h b/src/openrct2/object/WallObject.h index 7dbb50f748b7..e8fd1b72b678 100644 --- a/src/openrct2/object/WallObject.h +++ b/src/openrct2/object/WallObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -32,6 +32,6 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; }; } // namespace OpenRCT2 diff --git a/src/openrct2/object/WallSceneryEntry.cpp b/src/openrct2/object/WallSceneryEntry.cpp index 56b20a411ef6..66ae8914f807 100644 --- a/src/openrct2/object/WallSceneryEntry.cpp +++ b/src/openrct2/object/WallSceneryEntry.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/WallSceneryEntry.h b/src/openrct2/object/WallSceneryEntry.h index 4eb7860b3f0e..7a8e6d7136bd 100644 --- a/src/openrct2/object/WallSceneryEntry.h +++ b/src/openrct2/object/WallSceneryEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/WaterEntry.h b/src/openrct2/object/WaterEntry.h index 8c226a364ca6..0bacaa098423 100644 --- a/src/openrct2/object/WaterEntry.h +++ b/src/openrct2/object/WaterEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/object/WaterObject.cpp b/src/openrct2/object/WaterObject.cpp index cd2cbcd4ee17..bce5be6c327e 100644 --- a/src/openrct2/object/WaterObject.cpp +++ b/src/openrct2/object/WaterObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,6 +14,7 @@ #include "../OpenRCT2.h" #include "../core/IStream.hpp" #include "../core/Json.hpp" +#include "../drawing/Drawing.h" #include "../localisation/Formatter.h" #include "../localisation/Language.h" #include "../localisation/StringIds.h" @@ -56,7 +57,7 @@ namespace OpenRCT2 _legacyType.palette_index_2 = 0; } - void WaterObject::DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const + void WaterObject::DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const { // Write (no image) auto screenCoords = ScreenCoordsXY{ width / 2, height / 2 }; @@ -106,32 +107,28 @@ namespace OpenRCT2 auto numColours = jColours.size(); // This pointer gets memcopied in ImageTable::AddImage so it's fine for the unique_ptr to go out of scope - auto data = std::make_unique(numColours * 3); + auto data = std::make_unique(numColours); size_t dataIndex = 0; for (auto& jColour : jColours) { if (jColour.is_string()) { - auto colour = ParseColour(Json::GetString(jColour)); - data[dataIndex + 0] = (colour >> 16) & 0xFF; - data[dataIndex + 1] = (colour >> 8) & 0xFF; - data[dataIndex + 2] = colour & 0xFF; + data[dataIndex] = ParseColour(Json::GetString(jColour)); } - dataIndex += 3; + dataIndex++; } - G1Element g1 = {}; - g1.offset = data.get(); - g1.width = static_cast(numColours); - g1.x_offset = Json::GetNumber(jPalette["index"]); - g1.flags = G1_FLAG_PALETTE; + G1Palette g1 = {}; + g1.palette = data.get(); + g1.numColours = static_cast(numColours); + g1.startIndex = Json::GetNumber(jPalette["index"]); auto& imageTable = GetImageTable(); - imageTable.AddImage(&g1); + imageTable.addPalette(g1); } - uint32_t WaterObject::ParseColour(const std::string& s) const + Drawing::BGRColour WaterObject::ParseColour(const std::string& s) const { uint8_t r = 0; uint8_t g = 0; @@ -143,6 +140,6 @@ namespace OpenRCT2 g = std::stoul(s.substr(3, 2), nullptr, 16) & 0xFF; b = std::stoul(s.substr(5, 2), nullptr, 16) & 0xFF; } - return (b << 16) | (g << 8) | r; + return { b, g, r }; } } // namespace OpenRCT2 diff --git a/src/openrct2/object/WaterObject.h b/src/openrct2/object/WaterObject.h index e2e4feb8e067..ae737c1fc7f5 100644 --- a/src/openrct2/object/WaterObject.h +++ b/src/openrct2/object/WaterObject.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -32,10 +32,10 @@ namespace OpenRCT2 void Load() override; void Unload() override; - void DrawPreview(RenderTarget& rt, int32_t width, int32_t height) const override; + void DrawPreview(Drawing::RenderTarget& rt, int32_t width, int32_t height) const override; private: void ReadJsonPalette(json_t& jPalette); - uint32_t ParseColour(const std::string& s) const; + Drawing::BGRColour ParseColour(const std::string& s) const; }; } // namespace OpenRCT2 diff --git a/src/openrct2/paint/Boundbox.h b/src/openrct2/paint/Boundbox.h index 313e630d39f4..f2607195e354 100644 --- a/src/openrct2/paint/Boundbox.h +++ b/src/openrct2/paint/Boundbox.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/Paint.Entity.cpp b/src/openrct2/paint/Paint.Entity.cpp index 0cec9296d545..74443ab21f32 100644 --- a/src/openrct2/paint/Paint.Entity.cpp +++ b/src/openrct2/paint/Paint.Entity.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -52,7 +52,7 @@ void EntityPaintSetup(PaintSession& session, const CoordsXY& pos) return; } - if (session.DPI.zoom_level > ZoomLevel{ 2 }) + if (session.rt.zoom_level > ZoomLevel{ 2 }) { return; } @@ -109,11 +109,11 @@ void EntityPaintSetup(PaintSession& session, const CoordsXY& pos) screenCoords - ScreenCoordsXY{ entity->SpriteData.Width, entity->SpriteData.HeightMin }, screenCoords + ScreenCoordsXY{ entity->SpriteData.Width, entity->SpriteData.HeightMax }); - const ZoomLevel zoom = session.DPI.zoom_level; - if (session.DPI.y + session.DPI.height <= zoom.ApplyInversedTo(spriteRect.GetTop()) - || zoom.ApplyInversedTo(spriteRect.GetBottom()) <= session.DPI.y - || session.DPI.x + session.DPI.width <= zoom.ApplyInversedTo(spriteRect.GetLeft()) - || zoom.ApplyInversedTo(spriteRect.GetRight()) <= session.DPI.x) + const ZoomLevel zoom = session.rt.zoom_level; + if (session.rt.y + session.rt.height <= zoom.ApplyInversedTo(spriteRect.GetTop()) + || zoom.ApplyInversedTo(spriteRect.GetBottom()) <= session.rt.y + || session.rt.x + session.rt.width <= zoom.ApplyInversedTo(spriteRect.GetLeft()) + || zoom.ApplyInversedTo(spriteRect.GetRight()) <= session.rt.x) { continue; } diff --git a/src/openrct2/paint/Paint.Entity.h b/src/openrct2/paint/Paint.Entity.h index 3f8117e1f5e9..b481242284e6 100644 --- a/src/openrct2/paint/Paint.Entity.h +++ b/src/openrct2/paint/Paint.Entity.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/Paint.SessionFlags.h b/src/openrct2/paint/Paint.SessionFlags.h index ea8789d24cf9..4827717e243f 100644 --- a/src/openrct2/paint/Paint.SessionFlags.h +++ b/src/openrct2/paint/Paint.SessionFlags.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/Paint.cpp b/src/openrct2/paint/Paint.cpp index 7301610af1df..5e27cb0f8d7a 100644 --- a/src/openrct2/paint/Paint.cpp +++ b/src/openrct2/paint/Paint.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,6 +19,7 @@ #include "../localisation/Currency.h" #include "../localisation/Formatting.h" #include "../localisation/LocalisationService.h" +#include "../localisation/StringIdType.h" #include "../paint/Painter.h" #include "../platform/Memory.h" #include "../profiling/Profiling.h" @@ -31,6 +32,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; using namespace OpenRCT2::Numerics; // Globals for paint clipping @@ -38,20 +40,20 @@ uint8_t gClipHeight = 128; // Default to middle value CoordsXY gClipSelectionA = { 0, 0 }; CoordsXY gClipSelectionB = { kMaximumTileStartXY, kMaximumTileStartXY }; -static constexpr uint8_t BoundBoxDebugColours[] = { - 0, // NONE - 102, // TERRAIN - 114, // SPRITE - 229, // RIDE - 126, // WATER - 138, // SCENERY - 150, // FOOTPATH - 162, // FOOTPATH_ITEM - 174, // PARK - 186, // WALL - 198, // LARGE_SCENERY - 210, // LABEL - 222, // BANNER +static constexpr PaletteIndex kBoundBoxDebugColours[] = { + PaletteIndex::pi0, // NONE + PaletteIndex::pi102, // TERRAIN + PaletteIndex::pi114, // SPRITE + PaletteIndex::pi229, // RIDE + PaletteIndex::pi126, // WATER + PaletteIndex::pi138, // SCENERY + PaletteIndex::pi150, // FOOTPATH + PaletteIndex::pi162, // FOOTPATH_ITEM + PaletteIndex::pi174, // PARK + PaletteIndex::pi186, // WALL + PaletteIndex::pi198, // LARGE_SCENERY + PaletteIndex::pi210, // LABEL + PaletteIndex::pi222, // BANNER }; bool gShowDirtyVisuals; @@ -103,10 +105,10 @@ static void PaintSessionAddPSToQuadrant(PaintSession& session, PaintStruct* ps) session.QuadrantFrontIndex = std::max(session.QuadrantFrontIndex, paintQuadrantIndex); } -static constexpr bool imageWithinDPI(const ScreenCoordsXY& imagePos, const G1Element& g1, const RenderTarget& rt) +static constexpr bool imageWithinRT(const ScreenCoordsXY& imagePos, const G1Element& g1, const RenderTarget& rt) { - const int32_t left = imagePos.x + g1.x_offset; - const int32_t bottom = imagePos.y + g1.y_offset; + const int32_t left = imagePos.x + g1.xOffset; + const int32_t bottom = imagePos.y + g1.yOffset; const int32_t right = left + g1.width; const int32_t top = bottom + g1.height; @@ -186,7 +188,7 @@ static PaintStruct* CreateNormalPaintStruct( const auto imagePos = Translate3DTo2DWithZ(session.CurrentRotation, swappedRotCoord); - if (!imageWithinDPI(imagePos, *g1, session.DPI)) + if (!imageWithinRT(imagePos, *g1, session.rt)) { return nullptr; } @@ -234,7 +236,7 @@ static PaintStruct* CreateNormalPaintStructHeight( const auto imagePos = Translate3DTo2DWithZ(session.CurrentRotation, swappedRotCoord); - if (!imageWithinDPI(imagePos, *g1, session.DPI)) + if (!imageWithinRT(imagePos, *g1, session.rt)) { return nullptr; } @@ -271,7 +273,7 @@ template void PaintSessionGenerateRotate(PaintSession& session) { // Optimised modified version of ViewportPosToMapPos - ScreenCoordsXY screenCoord = { floor2(session.DPI.WorldX(), 32), floor2((session.DPI.WorldY() - 16), 32) }; + ScreenCoordsXY screenCoord = { floor2(session.rt.WorldX(), 32), floor2((session.rt.WorldY() - 16), 32) }; CoordsXY mapTile = { screenCoord.y - screenCoord.x / 2, screenCoord.y + screenCoord.x / 2 }; mapTile = mapTile.Rotate(direction); @@ -281,7 +283,7 @@ void PaintSessionGenerateRotate(PaintSession& session) } mapTile = mapTile.ToTileStart(); - uint16_t numVerticalTiles = (session.DPI.WorldHeight() + 2128) >> 5; + uint16_t numVerticalTiles = (session.rt.WorldHeight() + 2128) >> 5; // Adjacent tiles to also check due to overlapping of sprites constexpr CoordsXY adjacentTiles[] = { @@ -707,11 +709,11 @@ static inline void PaintDrawStruct(PaintSession& session, PaintStruct* ps) auto screenPos = ps->ScreenPos; if (ps->InteractionItem == ViewportInteractionItem::entity) { - if (session.DPI.zoom_level >= ZoomLevel{ 1 }) + if (session.rt.zoom_level >= ZoomLevel{ 1 }) { screenPos.x = floor2(screenPos.x, 2); screenPos.y = floor2(screenPos.y, 2); - if (session.DPI.zoom_level >= ZoomLevel{ 2 }) + if (session.rt.zoom_level >= ZoomLevel{ 2 }) { screenPos.x = floor2(screenPos.x, 4); screenPos.y = floor2(screenPos.y, 4); @@ -725,7 +727,7 @@ static inline void PaintDrawStruct(PaintSession& session, PaintStruct* ps) } else { - GfxDrawSprite(session.DPI, imageId, screenPos); + GfxDrawSprite(session.rt, imageId, screenPos); } if (ps->Children != nullptr) @@ -734,7 +736,7 @@ static inline void PaintDrawStruct(PaintSession& session, PaintStruct* ps) } else { - PaintAttachedPS(session.DPI, ps, session.ViewFlags); + PaintAttachedPS(session.rt, ps, session.ViewFlags); } } @@ -754,9 +756,9 @@ void PaintDrawStructs(PaintSession& session) static void PaintPSImageWithBoundingBoxes(PaintSession& session, PaintStruct* ps, ImageId imageId, int32_t x, int32_t y) { - auto& rt = session.DPI; + auto& rt = session.rt; - const uint8_t colour = BoundBoxDebugColours[EnumValue(ps->InteractionItem)]; + const PaletteIndex colour = kBoundBoxDebugColours[EnumValue(ps->InteractionItem)]; const uint8_t rotation = session.CurrentRotation; const CoordsXYZ frontTop = { diff --git a/src/openrct2/paint/Paint.h b/src/openrct2/paint/Paint.h index 0b4756b731b7..c24bd8006b3c 100644 --- a/src/openrct2/paint/Paint.h +++ b/src/openrct2/paint/Paint.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,14 +10,18 @@ #pragma once #include "../core/Money.hpp" -#include "../drawing/Drawing.h" +#include "../drawing/FilterPaletteIds.h" +#include "../drawing/ImageId.hpp" +#include "../drawing/RenderTarget.h" #include "../interface/Colour.h" +#include "../localisation/StringIdType.h" #include "../world/Location.hpp" #include "../world/MapLimits.h" #include "Boundbox.h" #include "tile_element/Paint.Tunnel.h" #include +#include #include #include #include @@ -193,7 +197,7 @@ struct PaintNodeStorage struct PaintSession : public PaintSessionCore { - RenderTarget DPI; + OpenRCT2::Drawing::RenderTarget rt; PaintNodeStorage paintEntries; PaintStruct* AllocateNormalPaintEntry() noexcept @@ -229,18 +233,6 @@ struct PaintSession : public PaintSessionCore } }; -struct FootpathPaintInfo -{ - uint32_t SurfaceImageId{}; - uint32_t BridgeImageId{}; - uint32_t RailingsImageId{}; - uint32_t SurfaceFlags{}; - uint32_t RailingFlags{}; - uint8_t ScrollingMode{}; - RailingEntrySupportType SupportType{}; - colour_t SupportColour = 255; -}; - extern PaintSession gPaintSession; // Globals for paint clipping @@ -249,8 +241,8 @@ extern CoordsXY gClipSelectionA; extern CoordsXY gClipSelectionB; /** rct2: 0x00993CC4. The white ghost that indicates not-yet-built elements. */ -constexpr ImageId ConstructionMarker = ImageId(0).WithRemap(FilterPaletteID::paletteGhost); -constexpr ImageId HighlightMarker = ImageId(0).WithRemap(FilterPaletteID::paletteGhost); +constexpr ImageId ConstructionMarker = ImageId(0).WithRemap(OpenRCT2::Drawing::FilterPaletteID::paletteGhost); +constexpr ImageId HighlightMarker = ImageId(0).WithRemap(OpenRCT2::Drawing::FilterPaletteID::paletteGhost); constexpr ImageId TrackStationColour = ImageId(0, COLOUR_BLACK); constexpr ImageId ShopSupportColour = ImageId(0, COLOUR_DARK_BROWN); @@ -309,9 +301,9 @@ void PaintFloatingMoneyEffect( PaintSession& session, money64 amount, StringId string_id, int32_t y, int32_t z, int8_t y_offsets[], int32_t offset_x, uint32_t rotation); -PaintSession* PaintSessionAlloc(RenderTarget& rt, uint32_t viewFlags, uint8_t rotation); +PaintSession* PaintSessionAlloc(OpenRCT2::Drawing::RenderTarget& rt, uint32_t viewFlags, uint8_t rotation); void PaintSessionFree(PaintSession* session); void PaintSessionGenerate(PaintSession& session); void PaintSessionArrange(PaintSessionCore& session); void PaintDrawStructs(PaintSession& session); -void PaintDrawMoneyStructs(RenderTarget& rt, PaintStringStruct* ps); +void PaintDrawMoneyStructs(OpenRCT2::Drawing::RenderTarget& rt, PaintStringStruct* ps); diff --git a/src/openrct2/paint/PaintHelpers.cpp b/src/openrct2/paint/PaintHelpers.cpp index cdb929c9c0fd..d28b3c05868a 100644 --- a/src/openrct2/paint/PaintHelpers.cpp +++ b/src/openrct2/paint/PaintHelpers.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -7,6 +7,7 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ +#include "../drawing/Drawing.h" #include "../interface/Viewport.h" #include "../ride/TrackPaint.h" #include "Paint.h" diff --git a/src/openrct2/paint/Painter.cpp b/src/openrct2/paint/Painter.cpp index 89c102172ac0..fe8ed8a80883 100644 --- a/src/openrct2/paint/Painter.cpp +++ b/src/openrct2/paint/Painter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,6 +14,7 @@ #include "../ReplayManager.h" #include "../config/Config.h" #include "../core/Guard.hpp" +#include "../drawing/Drawing.h" #include "../drawing/IDrawingEngine.h" #include "../drawing/Text.h" #include "../interface/Viewport.h" @@ -24,6 +25,7 @@ #include "../scenes/intro/IntroScene.h" #include "../ui/UiContext.h" #include "../ui/WindowManager.h" +#include "../world/MapSelection.h" #include "../world/TileInspector.h" using namespace OpenRCT2; @@ -40,7 +42,7 @@ void Painter::Paint(IDrawingEngine& de) { PROFILED_FUNCTION(); - auto rt = de.GetDrawingPixelInfo(); + auto rt = de.getRT(); if (IntroIsPlaying()) { @@ -48,6 +50,7 @@ void Painter::Paint(IDrawingEngine& de) } else { + MapSelection::invalidate(); VirtualFloorInvalidate(false); de.PaintWindows(); @@ -103,7 +106,7 @@ static bool ShouldShowFPS() if (gLegacyScene == LegacyScene::titleSequence) return true; - auto* windowMgr = Ui::GetWindowManager(); + auto* windowMgr = GetWindowManager(); return windowMgr->FindByClass(WindowClass::topToolbar); } @@ -168,7 +171,7 @@ PaintSession* Painter::CreateSession(RenderTarget& rt, uint32_t viewFlags, uint8 session = &_paintSessionPool.emplace_back(); } - session->DPI = rt; + session->rt = rt; session->ViewFlags = viewFlags; session->QuadrantBackIndex = std::numeric_limits::max(); session->QuadrantFrontIndex = 0; @@ -185,7 +188,7 @@ PaintSession* Painter::CreateSession(RenderTarget& rt, uint32_t viewFlags, uint8 session->CurrentlyDrawnEntity = nullptr; session->CurrentlyDrawnTileElement = nullptr; session->Surface = nullptr; - session->SelectedElement = OpenRCT2::TileInspector::GetSelectedElement(); + session->SelectedElement = TileInspector::GetSelectedElement(); session->InteractionType = ViewportInteractionItem::none; session->PathElementOnSameHeight = nullptr; session->TrackElementOnSameHeight = nullptr; diff --git a/src/openrct2/paint/Painter.h b/src/openrct2/paint/Painter.h index 8721c91996f4..2d5dd8d7e843 100644 --- a/src/openrct2/paint/Painter.h +++ b/src/openrct2/paint/Painter.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,13 +16,12 @@ #include #include -struct RenderTarget; - namespace OpenRCT2 { namespace Drawing { struct IDrawingEngine; + struct RenderTarget; } // namespace Drawing namespace Ui @@ -46,13 +45,13 @@ namespace OpenRCT2 explicit Painter(Ui::IUiContext& uiContext); void Paint(Drawing::IDrawingEngine& de); - PaintSession* CreateSession(RenderTarget& rt, uint32_t viewFlags, uint8_t rotation); + PaintSession* CreateSession(Drawing::RenderTarget& rt, uint32_t viewFlags, uint8_t rotation); void ReleaseSession(PaintSession* session); ~Painter(); private: - void PaintReplayNotice(RenderTarget& rt, const char* text); - void PaintFPS(RenderTarget& rt); + void PaintReplayNotice(Drawing::RenderTarget& rt, const char* text); + void PaintFPS(Drawing::RenderTarget& rt); void MeasureFPS(); }; } // namespace Paint diff --git a/src/openrct2/paint/VirtualFloor.cpp b/src/openrct2/paint/VirtualFloor.cpp index 3df3fa28eda8..980ef992d0a1 100644 --- a/src/openrct2/paint/VirtualFloor.cpp +++ b/src/openrct2/paint/VirtualFloor.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,6 +30,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; static constexpr uint16_t kVirtualFloorBaseSize = 5 * kCoordsXYStep; static constexpr CoordsXY kVirtualFloorBaseSizeXY = { kVirtualFloorBaseSize, kVirtualFloorBaseSize }; @@ -107,7 +108,7 @@ void VirtualFloorInvalidate(const bool alwaysInvalidate) if (gMapSelectFlags.has(MapSelectFlag::enableConstruct)) { - for (const auto& tile : gMapSelectionTiles) + for (const auto& tile : MapSelection::getSelectedTiles()) { min_position.x = std::min(min_position.x, tile.x); min_position.y = std::min(min_position.y, tile.y); @@ -138,7 +139,8 @@ void VirtualFloorInvalidate(const bool alwaysInvalidate) } // Do not invalidate new region if floor hasn't moved. - if (min_position == _virtualFloorLastMinPos && _virtualFloorLastMinPos.z == _virtualFloorHeight) + if (min_position == _virtualFloorLastMinPos && max_position == _virtualFloorLastMaxPos + && _virtualFloorLastMinPos.z == _virtualFloorHeight) { return; } @@ -176,7 +178,7 @@ bool VirtualFloorTileIsFloor(const CoordsXY& loc) if (gMapSelectFlags.has(MapSelectFlag::enableConstruct)) { // Check if we are anywhere near the selection tiles (larger scenery / rides) - for (const auto& tile : gMapSelectionTiles) + for (const auto& tile : MapSelection::getSelectedTiles()) { if (loc.x >= tile.x - kVirtualFloorBaseSize && loc.y >= tile.y - kVirtualFloorBaseSize && loc.x <= tile.x + kVirtualFloorBaseSize && loc.y <= tile.y + kVirtualFloorBaseSize) @@ -201,7 +203,7 @@ static void VirtualFloorGetTileProperties( *tileOwned = false; // See if we are a selected tile - if ((gMapSelectFlags.has(MapSelectFlag::enable))) + if (gMapSelectFlags.has(MapSelectFlag::enable)) { if (loc >= gMapSelectPositionA && loc <= gMapSelectPositionB) { @@ -212,7 +214,7 @@ static void VirtualFloorGetTileProperties( // See if we are on top of the selection tiles if (gMapSelectFlags.has(MapSelectFlag::enableConstruct)) { - for (const auto& tile : gMapSelectionTiles) + for (const auto& tile : MapSelection::getSelectedTiles()) { if (tile == loc) { diff --git a/src/openrct2/paint/VirtualFloor.h b/src/openrct2/paint/VirtualFloor.h index 91b97934c679..2cd86c82a324 100644 --- a/src/openrct2/paint/VirtualFloor.h +++ b/src/openrct2/paint/VirtualFloor.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/support/MetalSupports.cpp b/src/openrct2/paint/support/MetalSupports.cpp index ae3a77daf103..0a57eb1a50ea 100644 --- a/src/openrct2/paint/support/MetalSupports.cpp +++ b/src/openrct2/paint/support/MetalSupports.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,10 +18,9 @@ #include "../Paint.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; using namespace OpenRCT2::Numerics; -constexpr auto kMetalSupportSkip = 9 * 4 * 2; - // There are 13 types of metal support graphics, including rotated versions. A graphic showing all of them is available here: // https://cloud.githubusercontent.com/assets/737603/19420485/7eaba28e-93ec-11e6-83cb-03190accc094.png enum class MetalSupportGraphic : uint8_t @@ -86,47 +85,119 @@ static constexpr CoordsXY kMetalSupportBoundBoxOffsets[] = { { 16, 28 }, }; +struct RepositionPair +{ + MetalSupportPlace place = MetalSupportPlace::centre; + uint8_t crossBeamIndex = 0xFF; + + constexpr bool isNull() const + { + return crossBeamIndex == 0xFF; + } +}; +struct RepositionRow +{ + std::array pairs; + + constexpr RepositionRow(const RepositionPair pair) + { + pairs = { pair, pair, pair, pair }; + } + + constexpr RepositionRow(const RepositionPair pair1, const RepositionPair pair2, const RepositionPair pair3, const RepositionPair pair4) + { + pairs = { pair1, pair2, pair3, pair4 }; + } + + constexpr RepositionPair operator[](const Direction direction) const noexcept + { + return pairs[direction]; + } +}; + +constexpr uint8_t kNumMetalSupportPlaces = 9; +using RepositionAttempt = std::array; + +static constexpr RepositionAttempt kMetalSupportSegmentOffsets0 = { + { + { { MetalSupportPlace::topLeftSide, 2 } }, /* topCorner */ + { { MetalSupportPlace::bottomLeftSide, 1 } }, /* leftCorner */ + { { MetalSupportPlace::topRightSide, 3 } }, /* rightCorner */ + { { MetalSupportPlace::bottomRightSide, 0 } }, /* bottomCorner */ + { + { MetalSupportPlace::topLeftSide, 3 }, /* centre, rotation 0 */ + { MetalSupportPlace::topRightSide, 0 }, /* centre, rotation 1 */ + { MetalSupportPlace::bottomRightSide, 1 }, /* centre, rotation 2 */ + { MetalSupportPlace::bottomLeftSide, 2 } /* centre, rotation 3 */ + }, + { { MetalSupportPlace::leftCorner, 2 } }, /* topLeftSide */ + { { MetalSupportPlace::topCorner, 3 } }, /* topRightSide */ + { { MetalSupportPlace::bottomCorner, 1 } }, /* bottomLeftSide */ + { { MetalSupportPlace::rightCorner, 0 } }, /* bottomRightSide */ + } +}; + +static constexpr RepositionAttempt kMetalSupportSegmentOffsets1 = { +{ + { { MetalSupportPlace::topRightSide, 1 } }, /* topCorner */ + { { MetalSupportPlace::topLeftSide, 0 } }, /* leftCorner */ + { { MetalSupportPlace::bottomRightSide, 2 } }, /* rightCorner */ + { { MetalSupportPlace::bottomLeftSide, 3 } }, /* bottomCorner */ + { + { MetalSupportPlace::topRightSide, 0 }, /* centre, rotation 0 */ + { MetalSupportPlace::bottomRightSide, 1}, /* centre, rotation 1 */ + { MetalSupportPlace::bottomLeftSide, 2}, /* centre, rotation 2 */ + { MetalSupportPlace::topLeftSide, 3 } /* centre, rotation 3 */ + }, + { { MetalSupportPlace::topCorner, 0 } }, /* topLeftSide */ + { { MetalSupportPlace::rightCorner, 1 } }, /* topRightSide */ + { { MetalSupportPlace::leftCorner, 3 } }, /* bottomLeftSide */ + { { MetalSupportPlace::bottomCorner, 2 } }, /* bottomRightSide */ + } +}; +static constexpr RepositionAttempt kMetalSupportSegmentOffsets2 = { + { + { { MetalSupportPlace::leftCorner, 6 } }, /* topCorner */ + { { MetalSupportPlace::bottomCorner, 5 } }, /* leftCorner */ + { { MetalSupportPlace::topCorner, 7 } }, /* rightCorner */ + { { MetalSupportPlace::rightCorner, 4 } }, /* bottomCorner */ + { + { MetalSupportPlace::bottomRightSide, 1 }, /* centre, rotation 0 */ + { MetalSupportPlace::bottomLeftSide, 2 }, /* centre, rotation 1 */ + { MetalSupportPlace::topLeftSide, 3 }, /* centre, rotation 2 */ + { MetalSupportPlace::topRightSide, 0 } /* centre, rotation 3 */ + }, + { { MetalSupportPlace::centre, 1 } }, /* topLeftSide */ + { { MetalSupportPlace::centre, 2 } }, /* topRightSide */ + { { MetalSupportPlace::centre, 0 } }, /* bottomLeftSide */ + { { MetalSupportPlace::centre, 3 } }, /* bottomRightSide */ + } +}; +static constexpr RepositionAttempt kMetalSupportSegmentOffsets3 = { + { + { { MetalSupportPlace::rightCorner, 5 } }, /* topCorner */ + { { MetalSupportPlace::topCorner, 4 } }, /* leftCorner */ + { { MetalSupportPlace::bottomCorner, 6 } }, /* rightCorner */ + { { MetalSupportPlace::leftCorner, 7 } }, /* bottomCorner */ + { + { MetalSupportPlace::bottomLeftSide, 2 }, /* centre, rotation 0 */ + { MetalSupportPlace::topLeftSide, 3 }, /* centre, rotation 1 */ + { MetalSupportPlace::topRightSide, 0 }, /* centre, rotation 2 */ + { MetalSupportPlace::bottomRightSide, 1 } /* centre, rotation 3 */ + }, + { { MetalSupportPlace::bottomRightSide, 5 } }, /* topLeftSide */ + { { MetalSupportPlace::bottomLeftSide, 6 } }, /* topRightSide */ + { { MetalSupportPlace::topRightSide, 4 } }, /* bottomLeftSide */ + { { MetalSupportPlace::topLeftSide, 7 } }, /* bottomRightSide */ + } +}; + /** rct2: 0x0097AF32 */ -static constexpr uint8_t kMetalSupportSegmentOffsets[] = { - 5, 2, 5, 2, 5, 2, 5, 2, - 7, 1, 7, 1, 7, 1, 7, 1, - 6, 3, 6, 3, 6, 3, 6, 3, - 8, 0, 8, 0, 8, 0, 8, 0, - 5, 3, 6, 0, 8, 1, 7, 2, - 1, 2, 1, 2, 1, 2, 1, 2, - 0, 3, 0, 3, 0, 3, 0, 3, - 3, 1, 3, 1, 3, 1, 3, 1, - 2, 0, 2, 0, 2, 0, 2, 0, - - 6, 1, 6, 1, 6, 1, 6, 1, - 5, 0, 5, 0, 5, 0, 5, 0, - 8, 2, 8, 2, 8, 2, 8, 2, - 7, 3, 7, 3, 7, 3, 7, 3, - 6, 0, 8, 1, 7, 2, 5, 3, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 1, 2, 1, 2, 1, 2, 1, - 1, 3, 1, 3, 1, 3, 1, 3, - 3, 2, 3, 2, 3, 2, 3, 2, - - 1, 6, 1, 6, 1, 6, 1, 6, - 3, 5, 3, 5, 3, 5, 3, 5, - 0, 7, 0, 7, 0, 7, 0, 7, - 2, 4, 2, 4, 2, 4, 2, 4, - 8, 1, 7, 2, 5, 3, 6, 0, - 4, 1, 4, 1, 4, 1, 4, 1, - 4, 2, 4, 2, 4, 2, 4, 2, - 4, 0, 4, 0, 4, 0, 4, 0, - 4, 3, 4, 3, 4, 3, 4, 3, - - 2, 5, 2, 5, 2, 5, 2, 5, - 0, 4, 0, 4, 0, 4, 0, 4, - 3, 6, 3, 6, 3, 6, 3, 6, - 1, 7, 1, 7, 1, 7, 1, 7, - 7, 2, 5, 3, 6, 0, 8, 1, - 8, 5, 8, 5, 8, 5, 8, 5, - 7, 6, 7, 6, 7, 6, 7, 6, - 6, 4, 6, 4, 6, 4, 6, 4, - 5, 7, 5, 7, 5, 7, 5, 7, +static constexpr std::array kMetalSupportSegmentOffsets = { + kMetalSupportSegmentOffsets0, + kMetalSupportSegmentOffsets1, + kMetalSupportSegmentOffsets2, + kMetalSupportSegmentOffsets3, }; /** rct2: 0x0097B052, 0x0097B053 */ @@ -323,29 +394,22 @@ static bool MetalSupportsPaintSetupCommon( if (currentHeight < 0) return false; - uint16_t baseIndex = session.CurrentRotation * 2; - uint8_t newSegment = kMetalSupportSegmentOffsets[baseIndex + segment * 8]; - if (currentHeight <= supportSegments[newSegment].height) + RepositionPair newPlacement = {}; + for (size_t attempt = 0; attempt < kMetalSupportSegmentOffsets.size(); attempt++) { - baseIndex += kMetalSupportSkip; - newSegment = kMetalSupportSegmentOffsets[baseIndex + segment * 8]; - if (currentHeight <= supportSegments[newSegment].height) + const auto& candidate = kMetalSupportSegmentOffsets[attempt][segment][session.CurrentRotation]; + if (currentHeight > supportSegments[EnumValue(candidate.place)].height) { - baseIndex += kMetalSupportSkip; - newSegment = kMetalSupportSegmentOffsets[baseIndex + segment * 8]; - if (currentHeight <= supportSegments[newSegment].height) - { - baseIndex += kMetalSupportSkip; - newSegment = kMetalSupportSegmentOffsets[baseIndex + segment * 8]; - if (currentHeight <= supportSegments[newSegment].height) - { - return false; - } - } + newPlacement = candidate; + break; } } + if (newPlacement.isNull()) + { + return false; + } - const uint8_t crossBeamIndex = kMetalSupportSegmentOffsets[baseIndex + segment * 8 + 1]; + const uint8_t crossBeamIndex = newPlacement.crossBeamIndex; if constexpr (typeB) { if (crossBeamIndex >= kMetalSupportCrossbeamTwoSegmentOffsetIndex) @@ -357,7 +421,7 @@ static bool MetalSupportsPaintSetupCommon( { kMetalSupportBoundBoxOffsets[segment] + kMetalSupportCrossBeamBoundBoxOffsets[crossBeamIndex], currentHeight }, { kMetalSupportCrossBeamBoundBoxLengths[crossBeamIndex], 1 }); - segment = newSegment; + segment = EnumValue(newPlacement.place); } const int16_t crossbeamHeight = currentHeight; @@ -512,7 +576,7 @@ void DrawSupportsSideBySide( */ bool PathPoleSupportsPaintSetup( PaintSession& session, const MetalSupportPlace supportPlace, const bool isSloped, const int32_t height, - ImageId imageTemplate, const FootpathPaintInfo& pathPaintInfo) + ImageId imageTemplate, const PathRailingsDescriptor& railings) { auto segment = EnumValue(supportPlace); @@ -540,7 +604,7 @@ bool PathPoleSupportsPaintSetup( uint16_t baseHeight; if ((supportSegments[segment].slope & kTileSlopeAboveTrackOrScenery) || (height - supportSegments[segment].height < 6) - || !(pathPaintInfo.RailingFlags & RAILING_ENTRY_FLAG_HAS_SUPPORT_BASE_SPRITE)) + || !(railings.flags & RAILING_ENTRY_FLAG_HAS_SUPPORT_BASE_SPRITE)) { baseHeight = supportSegments[segment].height; } @@ -550,7 +614,7 @@ bool PathPoleSupportsPaintSetup( baseHeight = supportSegments[segment].height; PaintAddImageAsParent( - session, imageTemplate.WithIndex(pathPaintInfo.BridgeImageId + 37 + imageOffset), + session, imageTemplate.WithIndex(railings.bridgeImage + 37 + imageOffset), { kMetalSupportBoundBoxOffsets[segment].x, kMetalSupportBoundBoxOffsets[segment].y, baseHeight }, { 0, 0, 5 }); baseHeight += 6; } @@ -569,7 +633,7 @@ bool PathPoleSupportsPaintSetup( if (heightDiff > 0) { PaintAddImageAsParent( - session, imageTemplate.WithIndex(pathPaintInfo.BridgeImageId + 20 + (heightDiff - 1)), + session, imageTemplate.WithIndex(railings.bridgeImage + 20 + (heightDiff - 1)), { kMetalSupportBoundBoxOffsets[segment], baseHeight }, { 0, 0, heightDiff - 1 }); } @@ -602,7 +666,7 @@ bool PathPoleSupportsPaintSetup( } PaintAddImageAsParent( - session, imageTemplate.WithIndex(pathPaintInfo.BridgeImageId + 20 + (z - 1)), + session, imageTemplate.WithIndex(railings.bridgeImage + 20 + (z - 1)), { kMetalSupportBoundBoxOffsets[segment], baseHeight }, { 0, 0, (z - 1) }); baseHeight += z; @@ -613,7 +677,7 @@ bool PathPoleSupportsPaintSetup( break; } - ImageIndex imageIndex = pathPaintInfo.BridgeImageId + 20 + (z - 1); + ImageIndex imageIndex = railings.bridgeImage + 20 + (z - 1); if (z == kMetalSupportMaxSectionHeight) { imageIndex += 1; @@ -648,7 +712,7 @@ bool PathPoleSupportsPaintSetup( break; } - ImageIndex imageIndex = pathPaintInfo.BridgeImageId + 20 + (z - 1); + ImageIndex imageIndex = railings.bridgeImage + 20 + (z - 1); PaintAddImageAsParent( session, imageTemplate.WithIndex(imageIndex), { kMetalSupportBoundBoxOffsets[segment], baseHeight }, { 0, 0, 0 }); diff --git a/src/openrct2/paint/support/MetalSupports.h b/src/openrct2/paint/support/MetalSupports.h index 37b446b19a44..8345a1d18523 100644 --- a/src/openrct2/paint/support/MetalSupports.h +++ b/src/openrct2/paint/support/MetalSupports.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -86,8 +86,8 @@ enum class MetalSupportPlace : uint8_t none = 255, }; -struct FootpathPaintInfo; struct PaintSession; +struct PathRailingsDescriptor; /** @deprecated */ bool MetalASupportsPaintSetup( @@ -108,4 +108,4 @@ void DrawSupportsSideBySide( int32_t heightExtra = 0); bool PathPoleSupportsPaintSetup( PaintSession& session, MetalSupportPlace supportPlace, bool isSloped, int32_t height, ImageId imageTemplate, - const FootpathPaintInfo& pathPaintInfo); + const PathRailingsDescriptor& railings); diff --git a/src/openrct2/paint/support/WoodenSupports.cpp b/src/openrct2/paint/support/WoodenSupports.cpp index 41e99b950691..48fa7aa0025c 100644 --- a/src/openrct2/paint/support/WoodenSupports.cpp +++ b/src/openrct2/paint/support/WoodenSupports.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../../SpriteIds.h" #include "../../interface/Viewport.h" #include "../../ride/TrackData.h" +#include "../../world/Footpath.h" #include "../../world/tile_element/Slope.h" #include "../Boundbox.h" #include "../Paint.SessionFlags.h" @@ -20,6 +21,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; using namespace OpenRCT2::Numerics; constexpr auto kNumWoodenSupportTypes = 2; @@ -624,17 +626,17 @@ bool WoodenBSupportsPaintSetupRotated( */ bool PathBoxSupportsPaintSetup( PaintSession& session, WoodenSupportSubType supportType, bool isSloped, Direction slopeRotation, int32_t height, - ImageId imageTemplate, const FootpathPaintInfo& pathPaintInfo) + ImageId imageTemplate, const PathRailingsDescriptor& railings) { auto supportOrientationOffset = (supportType == WoodenSupportSubType::nwSe) ? 24 : 0; uint16_t baseHeight = 0; bool hasSupports = false; SupportsIdDescriptor supportIds = { - .Full = pathPaintInfo.BridgeImageId + 22 + supportOrientationOffset, - .Half = pathPaintInfo.BridgeImageId + 23 + supportOrientationOffset, - .Flat = pathPaintInfo.BridgeImageId + 48, - .Slope = pathPaintInfo.BridgeImageId + supportOrientationOffset, + .Full = railings.bridgeImage + 22 + supportOrientationOffset, + .Half = railings.bridgeImage + 23 + supportOrientationOffset, + .Flat = railings.bridgeImage + 48, + .Slope = railings.bridgeImage + supportOrientationOffset, }; if (!WoodenSupportsPaintSetupCommon<11, false>(session, supportIds, height, imageTemplate, hasSupports, baseHeight)) @@ -644,7 +646,7 @@ bool PathBoxSupportsPaintSetup( if (isSloped) { - ImageIndex imageIndex = pathPaintInfo.BridgeImageId + 55 + slopeRotation; + ImageIndex imageIndex = railings.bridgeImage + 55 + slopeRotation; PaintSlopeTransitions(kSlopedPathSupportsDescriptor, imageIndex, session, imageTemplate, baseHeight); hasSupports = true; @@ -654,10 +656,10 @@ bool PathBoxSupportsPaintSetup( } bool DrawSupportForSequenceA( - PaintSession& session, const WoodenSupportType supportType, const OpenRCT2::TrackElemType trackType, const uint8_t sequence, + PaintSession& session, const WoodenSupportType supportType, const TrackElemType trackType, const uint8_t sequence, const Direction direction, const int32_t height, const ImageId imageTemplate) { - const auto& ted = OpenRCT2::TrackMetaData::GetTrackElementDescriptor(trackType); + const auto& ted = TrackMetaData::GetTrackElementDescriptor(trackType); const auto& sequenceDesc = ted.sequences[sequence]; const auto& desc = sequenceDesc.woodenSupports; @@ -671,10 +673,10 @@ bool DrawSupportForSequenceA( } bool DrawSupportForSequenceB( - PaintSession& session, const WoodenSupportType supportType, const OpenRCT2::TrackElemType trackType, const uint8_t sequence, + PaintSession& session, const WoodenSupportType supportType, const TrackElemType trackType, const uint8_t sequence, const Direction direction, const int32_t height, const ImageId imageTemplate) { - const auto& ted = OpenRCT2::TrackMetaData::GetTrackElementDescriptor(trackType); + const auto& ted = TrackMetaData::GetTrackElementDescriptor(trackType); const auto& sequenceDesc = ted.sequences[sequence]; const auto& desc = sequenceDesc.woodenSupports; diff --git a/src/openrct2/paint/support/WoodenSupports.h b/src/openrct2/paint/support/WoodenSupports.h index e3688d73f265..dee40b48fe2e 100644 --- a/src/openrct2/paint/support/WoodenSupports.h +++ b/src/openrct2/paint/support/WoodenSupports.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -64,8 +64,8 @@ enum class WoodenSupportTransitionType : uint8_t }; constexpr int32_t kWoodenSupportTransitionTypeCount = 21; -struct FootpathPaintInfo; struct PaintSession; +struct PathRailingsDescriptor; bool WoodenASupportsPaintSetup( PaintSession& session, WoodenSupportType supportType, WoodenSupportSubType subType, int32_t height, ImageId imageTemplate, @@ -81,7 +81,7 @@ bool WoodenBSupportsPaintSetupRotated( ImageId imageTemplate, WoodenSupportTransitionType transitionType = WoodenSupportTransitionType::none); bool PathBoxSupportsPaintSetup( PaintSession& session, WoodenSupportSubType supportType, bool isSloped, Direction slopeRotation, int32_t height, - ImageId imageTemplate, const FootpathPaintInfo& pathPaintInfo); + ImageId imageTemplate, const PathRailingsDescriptor& pathPaintInfo); bool DrawSupportForSequenceA( PaintSession& session, WoodenSupportType supportType, OpenRCT2::TrackElemType trackType, uint8_t sequence, Direction direction, int32_t height, ImageId imageTemplate); diff --git a/src/openrct2/paint/support/WoodenSupports.hpp b/src/openrct2/paint/support/WoodenSupports.hpp index e26198ced273..8e0fad764470 100644 --- a/src/openrct2/paint/support/WoodenSupports.hpp +++ b/src/openrct2/paint/support/WoodenSupports.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/tile_element/Paint.Banner.cpp b/src/openrct2/paint/tile_element/Paint.Banner.cpp index 91550fa518a9..75aeac615df8 100644 --- a/src/openrct2/paint/tile_element/Paint.Banner.cpp +++ b/src/openrct2/paint/tile_element/Paint.Banner.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../../Game.h" #include "../../GameState.h" #include "../../config/Config.h" +#include "../../drawing/Drawing.h" #include "../../interface/Viewport.h" #include "../../localisation/Formatter.h" #include "../../localisation/Formatting.h" @@ -27,6 +28,7 @@ #include "Paint.TileElement.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; // kBannerBoundBoxes[rotation][0] is for the pole in the back // kBannerBoundBoxes[rotation][1] is for the pole and the banner in the front @@ -49,7 +51,7 @@ static void PaintBannerScrollingText( return; auto scrollingMode = bannerEntry.scrolling_mode + (direction & 3); - if (scrollingMode >= kMaxScrollingTextModes) + if (scrollingMode >= ScrollingText::kMaxModes) { return; } @@ -64,12 +66,12 @@ static void PaintBannerScrollingText( } else { - OpenRCT2::FormatStringLegacy(text, sizeof(text), STR_BANNER_TEXT_FORMAT, ft.Data()); + FormatStringLegacy(text, sizeof(text), STR_BANNER_TEXT_FORMAT, ft.Data()); } auto stringWidth = GfxGetStringWidth(text, FontStyle::tiny); auto scroll = stringWidth > 0 ? (getGameState().currentTicks / 2) % stringWidth : 0; - auto imageId = ScrollingTextSetup(session, STR_BANNER_TEXT_FORMAT, ft, scroll, scrollingMode, COLOUR_BLACK); + auto imageId = ScrollingText::setup(session, STR_BANNER_TEXT_FORMAT, ft, scroll, scrollingMode, PaletteIndex::pi0); PaintAddImageAsChild(session, imageId, { 0, 0, height + 22 }, { bbOffset, { 1, 1, 21 } }); } @@ -77,7 +79,7 @@ void PaintBanner(PaintSession& session, uint8_t direction, int32_t height, const { PROFILED_FUNCTION(); - if (session.DPI.zoom_level > ZoomLevel{ 1 } || gTrackDesignSaveMode + if (session.rt.zoom_level > ZoomLevel{ 1 } || gTrackDesignSaveMode || (session.ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES)) return; diff --git a/src/openrct2/paint/tile_element/Paint.Entrance.cpp b/src/openrct2/paint/tile_element/Paint.Entrance.cpp index ca40e9621249..6615ccf6a39b 100644 --- a/src/openrct2/paint/tile_element/Paint.Entrance.cpp +++ b/src/openrct2/paint/tile_element/Paint.Entrance.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,7 +14,9 @@ #include "../../GameState.h" #include "../../SpriteIds.h" #include "../../config/Config.h" +#include "../../drawing/Drawing.h" #include "../../drawing/LightFX.h" +#include "../../drawing/ScrollingText.h" #include "../../interface/Viewport.h" #include "../../localisation/Formatter.h" #include "../../localisation/Formatting.h" @@ -24,7 +26,6 @@ #include "../../profiling/Profiling.h" #include "../../ride/RideData.h" #include "../../ride/TrackDesign.h" -#include "../../world/Banner.h" #include "../../world/Entrance.h" #include "../../world/Footpath.h" #include "../../world/Park.h" @@ -79,7 +80,7 @@ static void PaintRideEntranceExitScrollingText( auto scroll = stringWidth > 0 ? (getGameState().currentTicks / 2) % stringWidth : 0; PaintAddImageAsChild( - session, ScrollingTextSetup(session, STR_BANNER_TEXT_FORMAT, ft, scroll, stationObj.ScrollingMode, COLOUR_BLACK), + session, ScrollingText::setup(session, STR_BANNER_TEXT_FORMAT, ft, scroll, stationObj.ScrollingMode, PaletteIndex::pi0), { 0, 0, height + stationObj.Height }, { { 2, 2, height + stationObj.Height }, { 28, 28, 51 } }); } @@ -117,8 +118,8 @@ static void PaintRideEntranceExit(PaintSession& session, uint8_t direction, int3 PROFILED_FUNCTION(); auto rideIndex = entranceEl.GetRideIndex(); - if ((gTrackDesignSaveMode || (session.ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES)) - && (rideIndex != gTrackDesignSaveRideIndex)) + if ((session.ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES) + || (gTrackDesignSaveMode && rideIndex != gTrackDesignSaveRideIndex)) { return; } @@ -259,8 +260,8 @@ static void PaintParkEntranceScrollingText( auto stringWidth = GfxGetStringWidth(text, FontStyle::tiny); auto scroll = stringWidth > 0 ? (gameState.currentTicks / 2) % stringWidth : 0; - auto imageIndex = ScrollingTextSetup( - session, STR_BANNER_TEXT_FORMAT, ft, scroll, scrollingMode + direction / 2, COLOUR_BLACK); + auto imageIndex = ScrollingText::setup( + session, STR_BANNER_TEXT_FORMAT, ft, scroll, scrollingMode + direction / 2, PaletteIndex::pi0); auto textHeight = height + entrance.GetTextHeight(); PaintAddImageAsChild(session, imageIndex, { 0, 0, textHeight }, { { 2, 2, textHeight }, { 28, 28, 47 } }); } @@ -308,7 +309,7 @@ static void PaintParkEntrance(PaintSession& session, uint8_t direction, int32_t auto surfaceDescriptor = entranceEl.GetPathSurfaceDescriptor(); if (surfaceDescriptor != nullptr) { - auto imageIndex = (surfaceDescriptor->Image + 5 * (1 + (direction & 1))); + auto imageIndex = (surfaceDescriptor->image + 5 * (1 + (direction & 1))); PaintAddImageAsParent( session, imageTemplate.WithIndex(imageIndex), { 0, 0, height }, { { 0, 2, height }, { 32, 28, 0 } }); } diff --git a/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp b/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp index 42b535f6d5de..79d47d4b72cf 100644 --- a/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp +++ b/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,14 +16,16 @@ #include "../../core/EnumUtils.hpp" #include "../../core/Numerics.hpp" #include "../../core/UTF8.h" +#include "../../drawing/Drawing.h" +#include "../../drawing/ScrollingText.h" #include "../../interface/Viewport.h" +#include "../../localisation/Formatter.h" #include "../../localisation/Formatting.h" #include "../../localisation/StringIds.h" #include "../../object/LargeSceneryEntry.h" #include "../../profiling/Profiling.h" #include "../../ride/Ride.h" #include "../../ride/TrackDesign.h" -#include "../../world/Banner.h" #include "../../world/Scenery.h" #include "../../world/TileInspector.h" #include "../../world/tile_element/LargeSceneryElement.h" @@ -33,7 +35,7 @@ #include "Segment.h" using namespace OpenRCT2; -using namespace OpenRCT2::Numerics; +using namespace OpenRCT2::Drawing; // clang-format off static constexpr BoundBoxXY LargeSceneryBoundBoxes[] = { @@ -77,7 +79,7 @@ static void PaintLargeScenerySupports( WoodenBSupportsPaintSetupRotated( session, WoodenSupportType::truss, WoodenSupportSubType::neSw, direction, supportHeight, imageTemplate, transitionType); - int32_t clearanceHeight = ceil2(tileElement.GetClearanceZ() + 15, 16); + int32_t clearanceHeight = Numerics::ceil2(tileElement.GetClearanceZ() + 15, 16); if (tile.allowSupportsAbove) { PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, clearanceHeight, 0x20); @@ -201,7 +203,7 @@ static void PaintLargeScenery3DText( } } - if (session.DPI.zoom_level > ZoomLevel{ 1 }) + if (session.rt.zoom_level > ZoomLevel{ 1 }) return; auto banner = tileElement.GetBanner(); @@ -218,7 +220,7 @@ static void PaintLargeScenery3DText( char signString[256]; auto ft = Formatter(); banner->formatTextTo(ft); - OpenRCT2::FormatStringLegacy(signString, sizeof(signString), STR_STRINGID, ft.Data()); + FormatStringLegacy(signString, sizeof(signString), STR_STRINGID, ft.Data()); auto offsetY = text->offset[(direction & 1)].y * 2; if (text->flags & LARGE_SCENERY_TEXT_FLAG_VERTICAL) @@ -323,13 +325,13 @@ static void PaintLargeSceneryScrollingText( } else { - OpenRCT2::FormatStringLegacy(text, sizeof(text), STR_SCROLLING_SIGN_TEXT, ft.Data()); + FormatStringLegacy(text, sizeof(text), STR_SCROLLING_SIGN_TEXT, ft.Data()); } auto scrollMode = sceneryEntry.scrolling_mode + ((direction + 1) & 3); auto stringWidth = GfxGetStringWidth(text, FontStyle::tiny); auto scroll = stringWidth > 0 ? (getGameState().currentTicks / 2) % stringWidth : 0; - auto imageId = ScrollingTextSetup(session, STR_SCROLLING_SIGN_TEXT, ft, scroll, scrollMode, textPaletteIndex); + auto imageId = ScrollingText::setup(session, STR_SCROLLING_SIGN_TEXT, ft, scroll, scrollMode, textPaletteIndex); PaintAddImageAsChild(session, imageId, { 0, 0, height + 25 }, { bbOffset, { 1, 1, 21 } }); } @@ -410,7 +412,7 @@ void PaintLargeScenery(PaintSession& session, uint8_t direction, uint16_t height { PaintLargeScenery3DText(session, *sceneryEntry, tile, tileElement, direction, height, isGhost); } - else if (session.DPI.zoom_level <= ZoomLevel{ 0 }) + else if (session.rt.zoom_level <= ZoomLevel{ 0 }) { auto sequenceDirection2 = (tileElement.GetSequenceIndex() - 1) & 3; if (sequenceDirection2 == direction) diff --git a/src/openrct2/paint/tile_element/Paint.Path.cpp b/src/openrct2/paint/tile_element/Paint.Path.cpp index d217b9815355..c58366e2f537 100644 --- a/src/openrct2/paint/tile_element/Paint.Path.cpp +++ b/src/openrct2/paint/tile_element/Paint.Path.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -7,14 +7,12 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ -#include "../Paint.h" +#include "Paint.Path.h" #include "../../Context.h" -#include "../../Game.h" #include "../../GameState.h" #include "../../config/Config.h" -#include "../../core/Numerics.hpp" -#include "../../entity/PatrolArea.h" +#include "../../drawing/Drawing.h" #include "../../interface/Viewport.h" #include "../../localisation/Formatter.h" #include "../../localisation/Formatting.h" @@ -27,11 +25,8 @@ #include "../../ride/Ride.h" #include "../../ride/Track.h" #include "../../ride/TrackDesign.h" -#include "../../ride/TrackPaint.h" #include "../../world/Footpath.h" #include "../../world/Map.h" -#include "../../world/Scenery.h" -#include "../../world/TileInspector.h" #include "../../world/tile_element/PathElement.h" #include "../../world/tile_element/Slope.h" #include "../../world/tile_element/SurfaceElement.h" @@ -47,6 +42,13 @@ #include "Segment.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; + +struct FootpathPaintInfo +{ + PathSurfaceDescriptor surface{}; + PathRailingsDescriptor railings{}; +}; bool gPaintWidePathsAsGhost = false; @@ -108,18 +110,18 @@ static constexpr WoodenSupportSubType PathSupportOrientation[] = { }; // clang-format on -void PathPaintBoxSupport( +static void PathPaintBoxSupport( PaintSession& session, const PathElement& pathElement, int32_t height, const FootpathPaintInfo& pathPaintInfo, bool hasSupports, ImageId imageTemplate, ImageId sceneryImageTemplate); -void PathPaintPoleSupport( +static void PathPaintPoleSupport( PaintSession& session, const PathElement& pathElement, int16_t height, const FootpathPaintInfo& pathPaintInfo, bool hasSupports, ImageId imageTemplate, ImageId sceneryImageTemplate); static void PathPaintQueueBanner( - PaintSession& session, const PathElement& pathElement, uint16_t height, const FootpathPaintInfo& pathPaintInfo, + PaintSession& session, const PathElement& pathElement, uint16_t height, const PathRailingsDescriptor& railings, ImageId imageTemplate) { - auto imageId = imageTemplate.WithIndex(pathPaintInfo.RailingsImageId); + auto imageId = imageTemplate.WithIndex(railings.railingsImage); uint8_t direction = pathElement.GetQueueBannerDirection(); // Draw ride sign @@ -150,7 +152,7 @@ static void PathPaintQueueBanner( auto ride = GetRide(pathElement.GetRideIndex()); if (direction < 2 && ride != nullptr && !imageTemplate.IsRemap()) { - uint16_t scrollingMode = pathPaintInfo.ScrollingMode; + uint16_t scrollingMode = railings.scrollingMode; scrollingMode += direction; auto ft = Formatter(); @@ -179,7 +181,7 @@ static void PathPaintQueueBanner( uint16_t scroll = stringWidth > 0 ? (getGameState().currentTicks / 2) % stringWidth : 0; PaintAddImageAsChild( - session, ScrollingTextSetup(session, STR_BANNER_TEXT_FORMAT, ft, scroll, scrollingMode, COLOUR_BLACK), + session, ScrollingText::setup(session, STR_BANNER_TEXT_FORMAT, ft, scroll, scrollingMode, PaletteIndex::pi0), { 0, 0, height + 7 }, { boundBoxOffsets, { 1, 1, 21 } }); } @@ -225,9 +227,9 @@ static void PathPaintSlopedFences( static void PathPaintFencesAndQueueBannersQueue( PaintSession& session, const PathElement& pathElement, uint16_t height, uint32_t connectedEdges, bool hasSupports, - const FootpathPaintInfo& pathPaintInfo, ImageId imageTemplate) + const PathRailingsDescriptor& railings, ImageId imageTemplate) { - auto imageId = imageTemplate.WithIndex(pathPaintInfo.RailingsImageId); + auto imageId = imageTemplate.WithIndex(railings.railingsImage); if (pathElement.IsSloped()) { @@ -365,9 +367,9 @@ static void PathPaintFencesAndQueueBannersQueue( } } - if (pathElement.HasQueueBanner() && !(pathPaintInfo.RailingFlags & RAILING_ENTRY_FLAG_NO_QUEUE_BANNER)) + if (pathElement.HasQueueBanner() && !(railings.flags & RAILING_ENTRY_FLAG_NO_QUEUE_BANNER)) { - PathPaintQueueBanner(session, pathElement, height, pathPaintInfo, imageTemplate); + PathPaintQueueBanner(session, pathElement, height, railings, imageTemplate); } } @@ -375,17 +377,17 @@ static void PathPaintFencesAndQueueBannersNonQueue( PaintSession& session, const PathElement& pathElement, uint16_t height, uint32_t connectedEdges, bool hasSupports, const FootpathPaintInfo& pathPaintInfo, ImageId imageTemplate) { - auto imageId = imageTemplate.WithIndex(pathPaintInfo.RailingsImageId); + auto imageId = imageTemplate.WithIndex(pathPaintInfo.railings.railingsImage); uint32_t drawnCorners = 0; // If the path is not drawn over the supports, then no corner sprites will be drawn (making double-width paths // look like connected series of intersections). - if (pathPaintInfo.RailingFlags & RAILING_ENTRY_FLAG_DRAW_PATH_OVER_SUPPORTS) + if (pathPaintInfo.railings.flags & RAILING_ENTRY_FLAG_DRAW_PATH_OVER_SUPPORTS) { drawnCorners = (connectedEdges & FOOTPATH_PROPERTIES_EDGES_CORNERS_MASK) >> 4; } - auto slopeRailingsSupported = !(pathPaintInfo.SurfaceFlags & FOOTPATH_ENTRY_FLAG_NO_SLOPE_RAILINGS); + auto slopeRailingsSupported = !(pathPaintInfo.surface.flags & FOOTPATH_ENTRY_FLAG_NO_SLOPE_RAILINGS); if ((hasSupports || slopeRailingsSupported) && pathElement.IsSloped()) { PathPaintSlopedFences(session, pathElement, height, imageId, false); @@ -580,7 +582,7 @@ static void PathPaintFencesAndQueueBanners( if (pathElement.IsQueue()) { PathPaintFencesAndQueueBannersQueue( - session, pathElement, height, connectedEdges, hasSupports, pathPaintInfo, imageTemplate); + session, pathElement, height, connectedEdges, hasSupports, pathPaintInfo.railings, imageTemplate); } else { @@ -614,13 +616,13 @@ static void PathPaintFencesAdditionsTunnels( // Probably drawing benches etc. PROFILED_FUNCTION(); - if (session.DPI.zoom_level <= ZoomLevel{ 1 }) + if (session.rt.zoom_level <= ZoomLevel{ 1 }) { if (!gTrackDesignSaveMode) { if (pathElement.HasAddition()) { - Sub6A3F61PathAddition(session, pathElement, height, sceneryImageTemplate); + paintPathAddition(session, pathElement, height, sceneryImageTemplate); } } @@ -679,24 +681,8 @@ static void PathPaintFencesAdditionsTunnels( static FootpathPaintInfo GetFootpathPaintInfo(const PathElement& pathEl) { FootpathPaintInfo pathPaintInfo; - - const auto* surfaceDescriptor = pathEl.GetSurfaceDescriptor(); - if (surfaceDescriptor != nullptr) - { - pathPaintInfo.SurfaceImageId = surfaceDescriptor->Image; - pathPaintInfo.SurfaceFlags = surfaceDescriptor->Flags; - } - - const auto* railingsDescriptor = pathEl.GetRailingsDescriptor(); - if (railingsDescriptor != nullptr) - { - pathPaintInfo.BridgeImageId = railingsDescriptor->BridgeImage; - pathPaintInfo.RailingsImageId = railingsDescriptor->RailingsImage; - pathPaintInfo.RailingFlags = railingsDescriptor->Flags; - pathPaintInfo.ScrollingMode = railingsDescriptor->ScrollingMode; - pathPaintInfo.SupportType = railingsDescriptor->SupportType; - pathPaintInfo.SupportColour = railingsDescriptor->SupportColour; - } + pathPaintInfo.surface = pathEl.GetSurfaceDescriptor(); + pathPaintInfo.railings = pathEl.GetRailingsDescriptor(); return pathPaintInfo; } @@ -832,7 +818,7 @@ void PaintPath(PaintSession& session, uint16_t height, const PathElement& tileEl auto hasSupports = ShouldDrawSupports(session, tileElement, height); auto pathPaintInfo = GetFootpathPaintInfo(tileElement); - if (pathPaintInfo.SupportType == RailingEntrySupportType::Pole) + if (pathPaintInfo.railings.supportType == RailingEntrySupportType::pole) { PathPaintPoleSupport(session, tileElement, height, pathPaintInfo, hasSupports, imageTemplate, sceneryImageTemplate); } @@ -861,7 +847,7 @@ static ImageIndex PathPaintGetBaseImage( const PaintSession& session, const PathElement& pathElement, const FootpathPaintInfo& pathPaintInfo, const uint8_t rotatedEdgesAndCorners) { - ImageIndex surfaceBaseImageIndex = pathPaintInfo.SurfaceImageId; + ImageIndex surfaceBaseImageIndex = pathPaintInfo.surface.image; if (pathElement.IsSloped()) { auto directionOffset = (pathElement.GetSlopeDirection() + session.CurrentRotation) % kNumOrthogonalDirections; @@ -893,7 +879,7 @@ static BoundBoxXYZ PathPaintGetBoundbox(const PaintSession& session, int32_t hei // If we are on the same tile as a straight track, add the offset 2 so we // can clip above gravel part of the track sprite if (session.TrackElementOnSameHeight != nullptr - && session.TrackElementOnSameHeight->AsTrack()->GetTrackType() == TrackElemType::Flat) + && session.TrackElementOnSameHeight->AsTrack()->GetTrackType() == TrackElemType::flat) { boundingBoxZOffset = 2; } @@ -950,7 +936,7 @@ static void PathPaintSegmentSupportHeight( } } -void PathPaintBoxSupport( +static void PathPaintBoxSupport( PaintSession& session, const PathElement& pathElement, int32_t height, const FootpathPaintInfo& pathPaintInfo, bool hasSupports, ImageId imageTemplate, ImageId sceneryImageTemplate) { @@ -973,16 +959,16 @@ void PathPaintBoxSupport( if (pathElement.IsSloped()) { auto directionOffset = (pathElement.GetSlopeDirection() + session.CurrentRotation) % kNumOrthogonalDirections; - bridgeBaseImageIndex = pathPaintInfo.BridgeImageId + 51 + directionOffset; + bridgeBaseImageIndex = pathPaintInfo.railings.bridgeImage + 51 + directionOffset; } else { - bridgeBaseImageIndex = EnumValue(PathSupportOrientation[edges]) + pathPaintInfo.BridgeImageId + 49; + bridgeBaseImageIndex = EnumValue(PathSupportOrientation[edges]) + pathPaintInfo.railings.bridgeImage + 49; } PaintAddImageAsParent(session, imageTemplate.WithIndex(bridgeBaseImageIndex), { 0, 0, height }, boundbox); - if (pathElement.IsQueue() || (pathPaintInfo.RailingFlags & RAILING_ENTRY_FLAG_DRAW_PATH_OVER_SUPPORTS)) + if (pathElement.IsQueue() || (pathPaintInfo.railings.flags & RAILING_ENTRY_FLAG_DRAW_PATH_OVER_SUPPORTS)) { PaintAddImageAsChild(session, imageTemplate.WithIndex(surfaceBaseImageIndex), { 0, 0, height }, boundbox); } @@ -998,12 +984,13 @@ void PathPaintBoxSupport( } PathBoxSupportsPaintSetup( - session, PathSupportOrientation[edges], pathElement.IsSloped(), slopeDirection, height, imageTemplate, pathPaintInfo); + session, PathSupportOrientation[edges], pathElement.IsSloped(), slopeDirection, height, imageTemplate, + pathPaintInfo.railings); PathPaintSegmentSupportHeight(session, pathElement, height, edges, hasSupports); } -void PathPaintPoleSupport( +static void PathPaintPoleSupport( PaintSession& session, const PathElement& pathElement, int16_t height, const FootpathPaintInfo& pathPaintInfo, bool hasSupports, ImageId imageTemplate, ImageId sceneryImageTemplate) { @@ -1027,16 +1014,16 @@ void PathPaintPoleSupport( if (pathElement.IsSloped()) { bridgeBaseImageIndex = ((pathElement.GetSlopeDirection() + session.CurrentRotation) % kNumOrthogonalDirections) - + pathPaintInfo.BridgeImageId + 16; + + pathPaintInfo.railings.bridgeImage + 16; } else { - bridgeBaseImageIndex = edges + pathPaintInfo.BridgeImageId; + bridgeBaseImageIndex = edges + pathPaintInfo.railings.bridgeImage; } PaintAddImageAsParent(session, imageTemplate.WithIndex(bridgeBaseImageIndex), { 0, 0, height }, boundbox); - if (pathElement.IsQueue() || (pathPaintInfo.RailingFlags & RAILING_ENTRY_FLAG_DRAW_PATH_OVER_SUPPORTS)) + if (pathElement.IsQueue() || (pathPaintInfo.railings.flags & RAILING_ENTRY_FLAG_DRAW_PATH_OVER_SUPPORTS)) { PaintAddImageAsChild(session, imageTemplate.WithIndex(surfaceBaseImageIndex), { 0, 0, height }, boundbox); } @@ -1058,12 +1045,13 @@ void PathPaintPoleSupport( if (!(edges & (1 << i))) { // Only colour the supports if not already remapped (e.g. ghost remap) - auto supportColour = pathPaintInfo.SupportColour; + auto supportColour = pathPaintInfo.railings.supportColour; if (supportColour != COLOUR_NULL && !imageTemplate.IsRemap()) { imageTemplate = ImageId().WithPrimary(supportColour); } - PathPoleSupportsPaintSetup(session, supports[i], pathElement.IsSloped(), height, imageTemplate, pathPaintInfo); + PathPoleSupportsPaintSetup( + session, supports[i], pathElement.IsSloped(), height, imageTemplate, pathPaintInfo.railings); } } diff --git a/src/openrct2/paint/tile_element/Paint.Path.h b/src/openrct2/paint/tile_element/Paint.Path.h new file mode 100644 index 000000000000..a4dda09f4731 --- /dev/null +++ b/src/openrct2/paint/tile_element/Paint.Path.h @@ -0,0 +1,21 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include + +struct PaintSession; + +namespace OpenRCT2 +{ + struct PathElement; +} + +void PaintPath(PaintSession& session, uint16_t height, const OpenRCT2::PathElement& tileElement); diff --git a/src/openrct2/paint/tile_element/Paint.PathAddition.cpp b/src/openrct2/paint/tile_element/Paint.PathAddition.cpp index 12279a7218be..a380d70c6a6b 100644 --- a/src/openrct2/paint/tile_element/Paint.PathAddition.cpp +++ b/src/openrct2/paint/tile_element/Paint.PathAddition.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -224,7 +224,7 @@ inline bool PathAdditionIsVisible(uint32_t viewFlags, const PathAdditionEntry& p return false; } -void Sub6A3F61PathAddition(PaintSession& session, const PathElement& pathElement, uint16_t height, ImageId sceneryImageTemplate) +void paintPathAddition(PaintSession& session, const PathElement& pathElement, uint16_t height, ImageId sceneryImageTemplate) { // Path additions get drawn on edges that are not connected, so we need to flip them. const auto edges = pathElement.GetEdges() ^ 0b1111; @@ -255,7 +255,7 @@ void Sub6A3F61PathAddition(PaintSession& session, const PathElement& pathElement PathAdditionBenchesPaint(session, *pathAddEntry, pathElement, height, rotatedEdges, sceneryImageTemplate); break; case PathAdditionDrawType::jumpingFountain: - PathAdditionJumpingFountainsPaint(session, *pathAddEntry, height, sceneryImageTemplate, session.DPI); + PathAdditionJumpingFountainsPaint(session, *pathAddEntry, height, sceneryImageTemplate, session.rt); break; } diff --git a/src/openrct2/paint/tile_element/Paint.PathAddition.h b/src/openrct2/paint/tile_element/Paint.PathAddition.h index 6319a3ba3eb1..5f1f4672ea08 100644 --- a/src/openrct2/paint/tile_element/Paint.PathAddition.h +++ b/src/openrct2/paint/tile_element/Paint.PathAddition.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,6 +10,7 @@ #pragma once #include "../../drawing/ImageId.hpp" +#include "../../localisation/StringIdType.h" #include "../Paint.h" #include @@ -19,6 +20,6 @@ namespace OpenRCT2 struct PathElement; } -void Sub6A3F61PathAddition( +void paintPathAddition( PaintSession& session, const OpenRCT2::PathElement& pathElement, uint16_t height, ImageId sceneryImageTemplate); void PaintLampLightEffects(PaintSession& session, const OpenRCT2::PathElement& pathEl, uint16_t height); diff --git a/src/openrct2/paint/tile_element/Paint.SmallScenery.cpp b/src/openrct2/paint/tile_element/Paint.SmallScenery.cpp index fab527f1a180..b335d02feb97 100644 --- a/src/openrct2/paint/tile_element/Paint.SmallScenery.cpp +++ b/src/openrct2/paint/tile_element/Paint.SmallScenery.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -24,6 +24,7 @@ #include "Segment.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; using namespace OpenRCT2::Numerics; static constexpr CoordsXY kLengths[] = { @@ -219,7 +220,7 @@ static void PaintSmallSceneryBody( { const auto currentTicks = getGameState().currentTicks; - if (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_VISIBLE_WHEN_ZOOMED) || (session.DPI.zoom_level <= ZoomLevel{ 1 })) + if (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_VISIBLE_WHEN_ZOOMED) || (session.rt.zoom_level <= ZoomLevel{ 1 })) { if (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_FOUNTAIN_SPRAY_1)) { diff --git a/src/openrct2/paint/tile_element/Paint.Surface.cpp b/src/openrct2/paint/tile_element/Paint.Surface.cpp index 448f8b2090b8..8633e3693e52 100644 --- a/src/openrct2/paint/tile_element/Paint.Surface.cpp +++ b/src/openrct2/paint/tile_element/Paint.Surface.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,7 +15,6 @@ #include "../../SpriteIds.h" #include "../../config/Config.h" #include "../../core/Numerics.hpp" -#include "../../drawing/Drawing.h" #include "../../entity/EntityRegistry.h" #include "../../entity/PatrolArea.h" #include "../../entity/Peep.h" @@ -42,6 +41,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; // Needed to make the sign appear above footpaths. static constexpr int16_t ForSaleSignZOffset = 3; @@ -256,7 +256,7 @@ static bool SurfaceShouldSmoothSelf(const TerrainSurfaceObject* surfaceObject) if (surfaceObject == nullptr) return false; - return surfaceObject->Flags & TerrainSurfaceFlags::smoothWithSelf; + return surfaceObject->Flags.has(TerrainSurfaceFlag::smoothWithSelf); } static bool SurfaceShouldSmooth(const TerrainSurfaceObject* surfaceObject) @@ -264,7 +264,7 @@ static bool SurfaceShouldSmooth(const TerrainSurfaceObject* surfaceObject) if (surfaceObject == nullptr) return false; - return surfaceObject->Flags & TerrainSurfaceFlags::smoothWithOther; + return surfaceObject->Flags.has(TerrainSurfaceFlag::smoothWithOther); } static ImageId GetEdgeImageWithOffset(const TerrainEdgeObject* edgeObject, uint32_t offset) @@ -935,7 +935,7 @@ void PaintSurface(PaintSession& session, uint8_t direction, uint16_t height, con session.Flags |= PaintSessionFlags::PassedSurface; session.Surface = &tileElement; - const auto zoomLevel = session.DPI.zoom_level; + const auto zoomLevel = session.rt.zoom_level; const uint8_t rotation = session.CurrentRotation; const uint8_t surfaceShape = ViewportSurfacePaintSetupGetRelativeSlope(tileElement, rotation); const CoordsXY& base = session.SpritePosition; @@ -1136,7 +1136,7 @@ void PaintSurface(PaintSession& session, uint8_t direction, uint16_t height, con { auto [waterHeight, waterSurfaceShape] = SurfaceGetHeightAboveWater(tileElement, height, surfaceShape); - const auto fpId = FilterPaletteID::paletteGlassLightPurple; + const auto fpId = FilterPaletteID::paletteSceneryGroundMarker; const auto imageId1 = ImageId(SPR_TERRAIN_SELECTION_CORNER + Byte97B444[surfaceShape], fpId); PaintAttachToPreviousPS(session, imageId1, 0, 0); @@ -1168,7 +1168,7 @@ void PaintSurface(PaintSession& session, uint8_t direction, uint16_t height, con { const CoordsXY& pos = session.MapPosition; - for (const auto& tile : gMapSelectionTiles) + for (const auto& tile : MapSelection::getSelectedTiles()) { if (tile.x != pos.x || tile.y != pos.y) { diff --git a/src/openrct2/paint/tile_element/Paint.Surface.h b/src/openrct2/paint/tile_element/Paint.Surface.h index eeb36ffe5d22..beec163c60b4 100644 --- a/src/openrct2/paint/tile_element/Paint.Surface.h +++ b/src/openrct2/paint/tile_element/Paint.Surface.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/tile_element/Paint.TileElement.cpp b/src/openrct2/paint/tile_element/Paint.TileElement.cpp index f201a4b50247..a79af845b6b3 100644 --- a/src/openrct2/paint/tile_element/Paint.TileElement.cpp +++ b/src/openrct2/paint/tile_element/Paint.TileElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,13 +14,11 @@ #include "../../SpriteIds.h" #include "../../config/Config.h" #include "../../core/Numerics.hpp" -#include "../../drawing/Drawing.h" #include "../../interface/Viewport.h" #include "../../profiling/Profiling.h" #include "../../ride/RideData.h" #include "../../ride/TrackData.h" #include "../../ride/TrackPaint.h" -#include "../../world/Banner.h" #include "../../world/Entrance.h" #include "../../world/Footpath.h" #include "../../world/Map.h" @@ -32,10 +30,12 @@ #include "../Paint.SessionFlags.h" #include "../Paint.h" #include "../VirtualFloor.h" +#include "Paint.Path.h" #include "Paint.Surface.h" #include "Segment.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; static void BlankTilesPaint(PaintSession& session, int32_t x, int32_t y); static void PaintTileElementBase(PaintSession& session, const CoordsXY& origCoords); @@ -93,11 +93,11 @@ static void BlankTilesPaint(PaintSession& session, int32_t x, int32_t y) dx -= 16; int32_t bx = dx + 32; - if (bx <= session.DPI.WorldY()) + if (bx <= session.rt.WorldY()) return; dx -= 20; - dx -= session.DPI.WorldHeight(); - if (dx >= session.DPI.WorldY()) + dx -= session.rt.WorldHeight(); + if (dx >= session.rt.WorldY()) return; session.SpritePosition.x = x; @@ -163,7 +163,7 @@ static void PaintTileElementBase(PaintSession& session, const CoordsXY& origCoor int32_t screenMinY = Translate3DTo2DWithZ(rotation, { coords, 0 }).y; // Display little yellow arrow when building footpaths? - if ((gMapSelectFlags.has(MapSelectFlag::enableArrow)) && session.MapPosition.x == gMapSelectArrowPosition.x + if (gMapSelectFlags.has(MapSelectFlag::enableArrow) && session.MapPosition.x == gMapSelectArrowPosition.x && session.MapPosition.y == gMapSelectArrowPosition.y) { uint8_t arrowRotation = (rotation + (gMapSelectArrowDirection & 3)) & 3; @@ -179,7 +179,7 @@ static void PaintTileElementBase(PaintSession& session, const CoordsXY& origCoor PaintAddImageAsParent(session, imageId, { 0, 0, arrowZ }, { { 0, 0, arrowZ + 18 }, { 32, 32, -1 } }); } - if (screenMinY + 52 <= session.DPI.WorldY()) + if (screenMinY + 52 <= session.rt.WorldY()) return; const TileElement* element = tile_element; // push tile_element @@ -203,7 +203,7 @@ static void PaintTileElementBase(PaintSession& session, const CoordsXY& origCoor maxHeight = std::max(maxHeight, VirtualFloorGetHeight()); } - if (screenMinY - (maxHeight + 32) >= session.DPI.WorldY() + session.DPI.WorldHeight()) + if (screenMinY - (maxHeight + 32) >= session.rt.WorldY() + session.rt.WorldHeight()) return; session.SpritePosition.x = coords.x; @@ -391,6 +391,6 @@ uint16_t PaintUtilRotateSegments(uint16_t segments, uint8_t rotation) bool PaintShouldShowHeightMarkers(const PaintSession& session, const uint32_t viewportFlag) { - auto rt = &session.DPI; + auto rt = &session.rt; return (session.ViewFlags & viewportFlag) && (rt->zoom_level <= ZoomLevel{ 0 }); } diff --git a/src/openrct2/paint/tile_element/Paint.TileElement.h b/src/openrct2/paint/tile_element/Paint.TileElement.h index 2d174fa13432..5f2a28e808c0 100644 --- a/src/openrct2/paint/tile_element/Paint.TileElement.h +++ b/src/openrct2/paint/tile_element/Paint.TileElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -55,7 +55,6 @@ void TileElementPaintSetup(PaintSession& session, const CoordsXY& mapCoords, boo void PaintEntrance(PaintSession& session, uint8_t direction, int32_t height, const OpenRCT2::EntranceElement& entranceElement); void PaintBanner(PaintSession& session, uint8_t direction, int32_t height, const OpenRCT2::BannerElement& bannerElement); void PaintSurface(PaintSession& session, uint8_t direction, uint16_t height, const OpenRCT2::SurfaceElement& tileElement); -void PaintPath(PaintSession& session, uint16_t height, const OpenRCT2::PathElement& tileElement); void PaintSmallScenery( PaintSession& session, uint8_t direction, int32_t height, const OpenRCT2::SmallSceneryElement& sceneryElement); void PaintWall(PaintSession& session, uint8_t direction, int32_t height, const OpenRCT2::WallElement& tileElement); diff --git a/src/openrct2/paint/tile_element/Paint.Tunnel.h b/src/openrct2/paint/tile_element/Paint.Tunnel.h index 297fd7c43867..d378473cb0f5 100644 --- a/src/openrct2/paint/tile_element/Paint.Tunnel.h +++ b/src/openrct2/paint/tile_element/Paint.Tunnel.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/tile_element/Paint.Wall.cpp b/src/openrct2/paint/tile_element/Paint.Wall.cpp index c9d96ddaad05..67391eb5f9e3 100644 --- a/src/openrct2/paint/tile_element/Paint.Wall.cpp +++ b/src/openrct2/paint/tile_element/Paint.Wall.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,21 +13,23 @@ #include "../../GameState.h" #include "../../config/Config.h" #include "../../drawing/Drawing.h" +#include "../../drawing/ScrollingText.h" #include "../../interface/Colour.h" #include "../../interface/Viewport.h" +#include "../../localisation/Formatter.h" #include "../../localisation/Formatting.h" #include "../../localisation/StringIds.h" #include "../../object/WallSceneryEntry.h" #include "../../profiling/Profiling.h" #include "../../ride/Track.h" #include "../../ride/TrackDesign.h" -#include "../../world/Banner.h" #include "../../world/Scenery.h" #include "../../world/TileInspector.h" #include "../../world/tile_element/WallElement.h" #include "Paint.TileElement.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; static constexpr uint8_t DirectionToDoorImageOffset0[] = { 2, 2, 22, 26, 30, 34, 34, 34, 34, 34, 30, 26, 22, 2, 6, 2, 2, 2, 6, 10, 14, 18, 18, 18, 18, 18, 14, 10, 6, 2, 22, 2, @@ -162,7 +164,7 @@ static void PaintWallScrollingText( return; scrollingMode = wallEntry.scrolling_mode + ((direction + 1) & 3); - if (scrollingMode >= kMaxScrollingTextModes) + if (scrollingMode >= ScrollingText::kMaxModes) return; auto banner = wallElement.GetBanner(); @@ -181,12 +183,12 @@ static void PaintWallScrollingText( } else { - OpenRCT2::FormatStringLegacy(signString, sizeof(signString), STR_SCROLLING_SIGN_TEXT, ft.Data()); + FormatStringLegacy(signString, sizeof(signString), STR_SCROLLING_SIGN_TEXT, ft.Data()); } auto stringWidth = GfxGetStringWidth(signString, FontStyle::tiny); auto scroll = stringWidth > 0 ? (getGameState().currentTicks / 2) % stringWidth : 0; - auto imageId = ScrollingTextSetup(session, STR_SCROLLING_SIGN_TEXT, ft, scroll, scrollingMode, textPaletteIndex); + auto imageId = ScrollingText::setup(session, STR_SCROLLING_SIGN_TEXT, ft, scroll, scrollingMode, textPaletteIndex); PaintAddImageAsChild(session, imageId, { 0, 0, height + 8 }, { boundsOffset, { 1, 1, 13 } }); } diff --git a/src/openrct2/paint/tile_element/Segment.h b/src/openrct2/paint/tile_element/Segment.h index 999bb89a18bc..dea80c9caeac 100644 --- a/src/openrct2/paint/tile_element/Segment.h +++ b/src/openrct2/paint/tile_element/Segment.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/track/Segment.h b/src/openrct2/paint/track/Segment.h index 87a05b090794..043a88407938 100644 --- a/src/openrct2/paint/track/Segment.h +++ b/src/openrct2/paint/track/Segment.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/track/Support.h b/src/openrct2/paint/track/Support.h index ed1c9b2d152a..6edbf4461848 100644 --- a/src/openrct2/paint/track/Support.h +++ b/src/openrct2/paint/track/Support.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/track/coaster/AirPoweredVerticalCoaster.cpp b/src/openrct2/paint/track/coaster/AirPoweredVerticalCoaster.cpp index 45348d609a5d..6ff53caa71bb 100644 --- a/src/openrct2/paint/track/coaster/AirPoweredVerticalCoaster.cpp +++ b/src/openrct2/paint/track/coaster/AirPoweredVerticalCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -187,7 +187,7 @@ static void AirPoweredVerticalRCTrackFlat( auto imageId = session.TrackColours.WithIndex(imageIds[direction]); PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -210,7 +210,7 @@ static void AirPoweredVerticalRCTrackStation( session, direction, session.TrackColours.WithIndex(imageIds[direction]), { 0, 0, height }, { { 0, 6, height + 1 }, { 32, 20, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilDrawNarrowStationPlatform(session, ride, direction, height, 5, trackElement, StationBaseType::b, -2); @@ -257,7 +257,7 @@ static void AirPoweredVerticalRCTrackRightQuarterTurn5( }; TrackPaintUtilRightQuarterTurn5TilesPaint3(session, height, direction, trackSequence, session.TrackColours, imageIds); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilRightQuarterTurn5TilesTunnel(session, kTunnelGroup, TunnelSubType::Flat, height, direction, trackSequence); @@ -348,7 +348,7 @@ static void AirPoweredVerticalRCTrackFlatToLeftBank( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -378,7 +378,7 @@ static void AirPoweredVerticalRCTrackFlatToRightBank( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -452,7 +452,7 @@ static void AirPoweredVerticalRCTrackBankedRightQuarterTurn5( PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilRightQuarterTurn5TilesTunnel(session, kTunnelGroup, TunnelSubType::Flat, height, direction, trackSequence); @@ -544,7 +544,7 @@ static void AirPoweredVerticalRCTrackLeftBank( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -574,7 +574,7 @@ static void AirPoweredVerticalRCTrackBrakes( auto imageId = session.TrackColours.WithIndex(imageIds[direction]); PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -695,7 +695,7 @@ static void AirPoweredVerticalRCTrackVerticalSlopeUp( PaintAddImageAsChildRotated( session, direction, trackImageId, { 0, 0, height }, { { 0, 6, height }, { 20, 32, bbHeight } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -721,7 +721,7 @@ static void AirPoweredVerticalRCTrackVerticalSlopeUp( session, direction, trackImageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, bbHeight } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (trackSequence == 0) @@ -747,11 +747,11 @@ static void AirPoweredVerticalRCTrackVerticalSlopeUp( session, direction, supportsImageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, bbHeight } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); break; case 5: - if (DrawSupportForSequenceA( + if (DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours)) { ImageId floorImageId; @@ -788,7 +788,7 @@ static void AirPoweredVerticalRCTrackVerticalSlopeUp( PaintAddImageAsChildRotated( session, direction, supportsImageId, { 0, 0, height }, { { 27, 6, height }, { 1, 20, 126 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetVerticalTunnel(session, height + 240); @@ -981,7 +981,7 @@ static void AirPoweredVerticalRCTrackBooster( PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1001,57 +1001,57 @@ static void AirPoweredVerticalRCTrackOnridePhoto( auto imageId = session.TrackColours.WithIndex(imageIds[direction]); PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilOnridePhotoPaint2(session, direction, trackElement, height); } -TrackPaintFunction GetTrackPaintFunctionAirPoweredVerticalRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionAirPoweredVerticalRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return AirPoweredVerticalRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return AirPoweredVerticalRCTrackStation; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return AirPoweredVerticalRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return AirPoweredVerticalRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return AirPoweredVerticalRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return AirPoweredVerticalRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return AirPoweredVerticalRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return AirPoweredVerticalRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return AirPoweredVerticalRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return AirPoweredVerticalRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return AirPoweredVerticalRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return AirPoweredVerticalRCTrackRightBank; - case TrackElemType::Brakes: + case TrackElemType::brakes: return AirPoweredVerticalRCTrackBrakes; - case TrackElemType::ReverseFreefallSlope: + case TrackElemType::reverseFreefallSlope: return AirPoweredVerticalRCTrackVerticalSlopeUp; - case TrackElemType::ReverseFreefallVertical: + case TrackElemType::reverseFreefallVertical: return AirPoweredVerticalRCTrackVerticalUp; - case TrackElemType::AirThrustTopCap: + case TrackElemType::airThrustTopCap: return AirPoweredVerticalRCTrackVerticalTop; - case TrackElemType::AirThrustVerticalDown: + case TrackElemType::airThrustVerticalDown: return AirPoweredVerticalRCTrackVerticalDown; - case TrackElemType::AirThrustVerticalDownToLevel: + case TrackElemType::airThrustVerticalDownToLevel: return AirPoweredVerticalRCTrackVerticalSlopeDown; - case TrackElemType::Booster: + case TrackElemType::booster: return AirPoweredVerticalRCTrackBooster; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return AirPoweredVerticalRCTrackOnridePhoto; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/AlpineCoaster.cpp b/src/openrct2/paint/track/coaster/AlpineCoaster.cpp index 792cd9a99271..6d9effce24e4 100644 --- a/src/openrct2/paint/track/coaster/AlpineCoaster.cpp +++ b/src/openrct2/paint/track/coaster/AlpineCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,8 +20,6 @@ #include "../../track/Segment.h" #include "../../track/Support.h" -using namespace OpenRCT2; - static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Standard; namespace OpenRCT2::AlpineRC @@ -101,7 +99,7 @@ namespace OpenRCT2::AlpineRC { (SPR_TRACKS_ALPINE_TRACK_FLAT + 1), (SPR_TRACKS_ALPINE_TRACK_FLAT + 1), SPR_STATION_BASE_MEDIUM_NW_SE }, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(imageIds[direction][1]), { 0, 0, height }, @@ -7180,175 +7178,175 @@ namespace OpenRCT2::AlpineRC } } - TrackPaintFunction GetTrackPaintFunction(OpenRCT2::TrackElemType trackType) + TrackPaintFunction GetTrackPaintFunction(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return TrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return TrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return Track25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return TrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return Track25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return Track25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return TrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return Track25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return TrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return TrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return TrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return TrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return TrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return TrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return TrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return TrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return TrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return TrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return Track25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return Track25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return TrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return TrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return Track25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return Track25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return TrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return TrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return TrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return TrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return TrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return TrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return TrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return TrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return TrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return TrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return TrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return TrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return TrackLeftQuarterTurn3Tile25DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return TrackRightQuarterTurn3Tile25DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return TrackLeftQuarterTurn3Tile25DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return TrackRightQuarterTurn3Tile25DegDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return TrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return TrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return TrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return TrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return TrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return TrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return TrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return TrackRightHalfBankedHelixDownLarge; - case TrackElemType::Brakes: + case TrackElemType::brakes: return TrackBrakes; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return TrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return TrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return TrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return TrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return TrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return TrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return TrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return TrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return TrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return TrackDiag25DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return TrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return TrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return TrackDiag25DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return TrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return TrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return TrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return TrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return TrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return TrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return TrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return TrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return TrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return TrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return TrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return TrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return TrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return TrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return TrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return TrackDiagRightBank; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return TrackLeftBankToLeftQuarterTurn3Tile25DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return TrackRightBankToRightQuarterTurn3Tile25DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return TrackLeftQuarterTurn3Tile25DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return TrackRightQuarterTurn3Tile25DegDownToRightBank; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/BobsleighCoaster.cpp b/src/openrct2/paint/track/coaster/BobsleighCoaster.cpp index f8d4e3eb6fb5..3fa220fdbc6d 100644 --- a/src/openrct2/paint/track/coaster/BobsleighCoaster.cpp +++ b/src/openrct2/paint/track/coaster/BobsleighCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -4079,98 +4079,98 @@ static void BobsleighRCTrackOnRidePhoto( TrackPaintUtilOnridePhotoPaint2(session, direction, trackElement, height); } -TrackPaintFunction GetTrackPaintFunctionBobsleighRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionBobsleighRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return BobsleighRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return BobsleighRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return BobsleighRCTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return BobsleighRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return BobsleighRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return BobsleighRCTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return BobsleighRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return BobsleighRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return BobsleighRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return BobsleighRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return BobsleighRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return BobsleighRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return BobsleighRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return BobsleighRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return BobsleighRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return BobsleighRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return BobsleighRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return BobsleighRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return BobsleighRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return BobsleighRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return BobsleighRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return BobsleighRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return BobsleighRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return BobsleighRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return BobsleighRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return BobsleighRCTrackRightBank; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return BobsleighRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return BobsleighRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return BobsleighRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return BobsleighRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return BobsleighRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return BobsleighRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return BobsleighRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return BobsleighRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return BobsleighRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return BobsleighRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return BobsleighRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return BobsleighRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return BobsleighRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return BobsleighRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::Brakes: + case TrackElemType::brakes: return BobsleighRCTrackBrakes; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return BobsleighRCTrackBlockBrakes; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return BobsleighRCTrackOnRidePhoto; default: diff --git a/src/openrct2/paint/track/coaster/ClassicStandUpRollerCoaster.cpp b/src/openrct2/paint/track/coaster/ClassicStandUpRollerCoaster.cpp index eb22b2a4c93b..3a5d21d3a3f1 100644 --- a/src/openrct2/paint/track/coaster/ClassicStandUpRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/ClassicStandUpRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -8,6 +8,7 @@ *****************************************************************************/ #include "../../../SpriteIds.h" +#include "../../../drawing/Drawing.h" #include "../../../ride/Ride.h" #include "../../../ride/Track.h" #include "../../../ride/TrackPaint.h" @@ -1363,7 +1364,7 @@ static void classicStandUpRCTrackDiagRightBankTo25DegDown( classicStandUpRCTrackDiag25DegUpToLeftBank(session, ride, trackSequence, direction, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionClassicStandUpRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionClassicStandUpRC(TrackElemType trackType) { if (!IsCsgLoaded()) { @@ -1372,157 +1373,157 @@ TrackPaintFunction GetTrackPaintFunctionClassicStandUpRC(OpenRCT2::TrackElemType switch (trackType) { - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return classicStandUpRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return classicStandUpRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return classicStandUpRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return classicStandUpRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return classicStandUpRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return classicStandUpRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return classicStandUpRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return classicStandUpRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return classicStandUpRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return classicStandUpRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return classicStandUpRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return classicStandUpRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return classicStandUpRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return classicStandUpRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return classicStandUpRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return classicStandUpRCTrackRightBank; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return classicStandUpRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return classicStandUpRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return classicStandUpRCTrackLeftEighthDiagBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return classicStandUpRCTrackRightEighthDiagBankToOrthogonal; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return classicStandUpRCTrackLeftBankedQuarterTurn3; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return classicStandUpRCTrackRightBankedQuarterTurn3; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return classicStandUpRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return classicStandUpRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return classicStandUpRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return classicStandUpRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return classicStandUpRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return classicStandUpRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return classicStandUpRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return classicStandUpRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return classicStandUpRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return classicStandUpRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return classicStandUpRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return classicStandUpRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return classicStandUpRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return classicStandUpRCTrackDiagRightBank; - case TrackElemType::Up25ToLeftBankedUp25: - case TrackElemType::Up25ToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToUp25: - case TrackElemType::RightBankedUp25ToUp25: - case TrackElemType::Down25ToLeftBankedDown25: - case TrackElemType::Down25ToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToDown25: - case TrackElemType::RightBankedDown25ToDown25: - case TrackElemType::LeftBankedFlatToLeftBankedUp25: - case TrackElemType::RightBankedFlatToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: - case TrackElemType::RightBankedUp25ToRightBankedFlat: - case TrackElemType::LeftBankedFlatToLeftBankedDown25: - case TrackElemType::RightBankedFlatToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: - case TrackElemType::RightBankedDown25ToRightBankedFlat: - case TrackElemType::Down25LeftBanked: - case TrackElemType::Down25RightBanked: - case TrackElemType::FlatToLeftBankedUp25: - case TrackElemType::FlatToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToFlat: - case TrackElemType::RightBankedUp25ToFlat: - case TrackElemType::FlatToLeftBankedDown25: - case TrackElemType::FlatToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToFlat: - case TrackElemType::RightBankedDown25ToFlat: - case TrackElemType::Up25LeftBanked: - case TrackElemType::Up25RightBanked: - case TrackElemType::LeftBankedQuarterTurn3TileUp25: - case TrackElemType::RightBankedQuarterTurn3TileUp25: - case TrackElemType::LeftBankedQuarterTurn3TileDown25: - case TrackElemType::RightBankedQuarterTurn3TileDown25: - case TrackElemType::LeftBankedQuarterTurn5TileUp25: - case TrackElemType::RightBankedQuarterTurn5TileUp25: - case TrackElemType::LeftBankedQuarterTurn5TileDown25: - case TrackElemType::RightBankedQuarterTurn5TileDown25: - case TrackElemType::DiagUp25ToLeftBankedUp25: - case TrackElemType::DiagUp25ToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToUp25: - case TrackElemType::DiagRightBankedUp25ToUp25: - case TrackElemType::DiagDown25ToLeftBankedDown25: - case TrackElemType::DiagDown25ToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToDown25: - case TrackElemType::DiagRightBankedDown25ToDown25: - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: - case TrackElemType::DiagUp25LeftBanked: - case TrackElemType::DiagUp25RightBanked: - case TrackElemType::DiagDown25LeftBanked: - case TrackElemType::DiagDown25RightBanked: - case TrackElemType::DiagFlatToLeftBankedUp25: - case TrackElemType::DiagFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToFlat: - case TrackElemType::DiagRightBankedUp25ToFlat: - case TrackElemType::DiagFlatToLeftBankedDown25: - case TrackElemType::DiagFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToFlat: - case TrackElemType::DiagRightBankedDown25ToFlat: - case TrackElemType::LeftEighthBankToDiagUp25: - case TrackElemType::RightEighthBankToDiagUp25: - case TrackElemType::LeftEighthBankToDiagDown25: - case TrackElemType::RightEighthBankToDiagDown25: - case TrackElemType::LeftEighthBankToOrthogonalUp25: - case TrackElemType::RightEighthBankToOrthogonalUp25: - case TrackElemType::LeftEighthBankToOrthogonalDown25: - case TrackElemType::RightEighthBankToOrthogonalDown25: - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::up25ToLeftBankedUp25: + case TrackElemType::up25ToRightBankedUp25: + case TrackElemType::leftBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: + case TrackElemType::down25ToLeftBankedDown25: + case TrackElemType::down25ToRightBankedDown25: + case TrackElemType::leftBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: + case TrackElemType::leftBankedFlatToLeftBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: + case TrackElemType::down25LeftBanked: + case TrackElemType::down25RightBanked: + case TrackElemType::flatToLeftBankedUp25: + case TrackElemType::flatToRightBankedUp25: + case TrackElemType::leftBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: + case TrackElemType::flatToLeftBankedDown25: + case TrackElemType::flatToRightBankedDown25: + case TrackElemType::leftBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: + case TrackElemType::up25LeftBanked: + case TrackElemType::up25RightBanked: + case TrackElemType::leftBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: + case TrackElemType::diagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: + case TrackElemType::diagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagUp25LeftBanked: + case TrackElemType::diagUp25RightBanked: + case TrackElemType::diagDown25LeftBanked: + case TrackElemType::diagDown25RightBanked: + case TrackElemType::diagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: + case TrackElemType::diagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: + case TrackElemType::leftEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return TrackPaintFunctionDummy; default: diff --git a/src/openrct2/paint/track/coaster/ClassicWoodenRollerCoaster.cpp b/src/openrct2/paint/track/coaster/ClassicWoodenRollerCoaster.cpp index c1ee58fa8aba..1f32b3576d13 100644 --- a/src/openrct2/paint/track/coaster/ClassicWoodenRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/ClassicWoodenRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -920,7 +920,7 @@ static void ClassicWoodenRCTrackBankedRightQuarterTurn5( WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); TrackPaintUtilRightQuarterTurn5TilesTunnel(session, kTunnelGroup, TunnelSubType::Flat, height, direction, trackSequence); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments[trackSequence], direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1079,7 +1079,7 @@ static void ClassicWoodenRCTrackRightQuarterTurn3Bank( WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); TrackPaintUtilRightQuarterTurn3TilesTunnel(session, kTunnelGroup, TunnelSubType::Flat, height, direction, trackSequence); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments[trackSequence], direction), 0xFFFF, 0); @@ -1178,7 +1178,7 @@ static void ClassicWoodenRCTrackDiagRightBank( // Stylistically, this coaster is _very_ similar to the regular Wooden Roller Coaster. // The only difference is to which parts the colours are applied, and the degree of the banking. // As such, all non-banked pieces are simply drawn as regular wooden roller coaster pieces with a different paint scheme. -TrackPaintFunction GetTrackPaintFunctionClassicWoodenRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionClassicWoodenRC(TrackElemType trackType) { if (!IsCsgLoaded()) { @@ -1187,77 +1187,77 @@ TrackPaintFunction GetTrackPaintFunctionClassicWoodenRC(OpenRCT2::TrackElemType switch (trackType) { - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return WoodenRCTrackFlatToBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return WoodenRCTrackFlatToBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return ClassicWoodenRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return ClassicWoodenRCTrackRightBankToFlat; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return WoodenRCTrackFlatToBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return ClassicWoodenRCTrackRightBank; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return WoodenRCTrack25DegUpToBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return WoodenRCTrack25DegUpToBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return ClassicWoodenRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return ClassicWoodenRCTrackRightBankTo25DegDown; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return WoodenRCTrackBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return WoodenRCTrackBankTo25DegUp; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return ClassicWoodenRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return ClassicWoodenRCTrack25DegDownToRightBank; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return ClassicWoodenRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return ClassicWoodenRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return ClassicWoodenRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return ClassicWoodenRCTrackRightQuarterTurn3Bank; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return WoodenRCTrackDiagFlatToBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return WoodenRCTrackDiagFlatToBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return ClassicWoodenRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return ClassicWoodenRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return WoodenRCTrackDiagBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return WoodenRCTrackDiagBankTo25DegUp; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return ClassicWoodenRCTrackDiagDown25ToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return ClassicWoodenRCTrackDiagDown25ToRightBank; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return WoodenRCTrackDiagUp25ToBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return WoodenRCTrackDiagUp25ToBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return ClassicWoodenRCTrackDiagLeftBankToDown25; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return ClassicWoodenRCTrackDiagRightBankToDown25; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return WoodenRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return ClassicWoodenRCTrackDiagRightBank; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return WoodenRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return WoodenRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return ClassicWoodenRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return ClassicWoodenRCTrackRightEighthBankToOrthogonal; default: return GetTrackPaintFunctionClassicWoodenRCFallback(trackType); diff --git a/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp b/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp index b7d799279ebd..a5e29bca8f02 100644 --- a/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -8,6 +8,7 @@ *****************************************************************************/ #include "../../../SpriteIds.h" +#include "../../../drawing/Drawing.h" #include "../../../ride/Track.h" #include "../../../ride/TrackPaint.h" #include "../../tile_element/Paint.Tunnel.h" @@ -2085,7 +2086,7 @@ static void ClassicWoodenTwisterRCTrackRightEighthBankToOrthogonal( // Stylistically, this coaster is _very_ similar to the regular Wooden Roller Coaster. // The only difference is the degree of the banking. // As such, all non-banked pieces are simply drawn as regular wooden roller coaster pieces. -TrackPaintFunction GetTrackPaintFunctionClassicWoodenTwisterRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionClassicWoodenTwisterRC(TrackElemType trackType) { if (!IsCsgLoaded()) { @@ -2094,112 +2095,112 @@ TrackPaintFunction GetTrackPaintFunctionClassicWoodenTwisterRC(OpenRCT2::TrackEl switch (trackType) { - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return WoodenRCTrackFlatToBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return WoodenRCTrackFlatToBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return ClassicWoodenTwisterRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return ClassicWoodenTwisterRCTrackRightBankToFlat; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return WoodenRCTrackFlatToBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return ClassicWoodenTwisterRCTrackRightBank; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return WoodenRCTrack25DegUpToBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return WoodenRCTrack25DegUpToBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return ClassicWoodenTwisterRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return ClassicWoodenTwisterRCTrackRightBankTo25DegDown; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return WoodenRCTrackBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return WoodenRCTrackBankTo25DegUp; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return ClassicWoodenTwisterRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return ClassicWoodenTwisterRCTrack25DegDownToRightBank; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return WoodenRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return ClassicWoodenTwisterRCTrackRightQuarterTurn3Bank; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return ClassicWoodenTwisterRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return WoodenRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return WoodenRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return WoodenRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return ClassicWoodenTwisterRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return ClassicWoodenTwisterRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return WoodenRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return WoodenRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return ClassicWoodenTwisterRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return ClassicWoodenTwisterRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return WoodenRCTrackLeftBankToLeftQuarterTurn325DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return WoodenRCTrackRightBankToRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return ClassicWoodenTwisterRCTrackLeftQuarterTurn325DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return ClassicWoodenTwisterRCTrackRightQuarterTurn325DegDownToRightBank; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return WoodenRCTrackDiagFlatToBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return WoodenRCTrackDiagFlatToBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return ClassicWoodenTwisterRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return ClassicWoodenTwisterRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return WoodenRCTrackDiagBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return WoodenRCTrackDiagBankTo25DegUp; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return ClassicWoodenTwisterRCTrackDiagDown25ToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return ClassicWoodenTwisterRCTrackDiagDown25ToRightBank; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return WoodenRCTrackDiagUp25ToBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return WoodenRCTrackDiagUp25ToBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return ClassicWoodenTwisterRCTrackDiagLeftBankToDown25; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return ClassicWoodenTwisterRCTrackDiagRightBankToDown25; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return WoodenRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return ClassicWoodenTwisterRCTrackDiagRightBank; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return WoodenRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return WoodenRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return ClassicWoodenTwisterRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return ClassicWoodenTwisterRCTrackRightEighthBankToOrthogonal; default: diff --git a/src/openrct2/paint/track/coaster/CompactInvertedCoaster.cpp b/src/openrct2/paint/track/coaster/CompactInvertedCoaster.cpp index 2e1d973a48fe..081d152b3f39 100644 --- a/src/openrct2/paint/track/coaster/CompactInvertedCoaster.cpp +++ b/src/openrct2/paint/track/coaster/CompactInvertedCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9611,235 +9611,235 @@ static void CompactInvertedRCTrackBlockBrakes( PaintUtilSetGeneralSupportHeight(session, height + 48); } -TrackPaintFunction GetTrackPaintFunctionCompactInvertedRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionCompactInvertedRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return CompactInvertedRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return CompactInvertedRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return CompactInvertedRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return CompactInvertedRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return CompactInvertedRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return CompactInvertedRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return CompactInvertedRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return CompactInvertedRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return CompactInvertedRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return CompactInvertedRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return CompactInvertedRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return CompactInvertedRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return CompactInvertedRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return CompactInvertedRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return CompactInvertedRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return CompactInvertedRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return CompactInvertedRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return CompactInvertedRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return CompactInvertedRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return CompactInvertedRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return CompactInvertedRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return CompactInvertedRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return CompactInvertedRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return CompactInvertedRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return CompactInvertedRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return CompactInvertedRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return CompactInvertedRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return CompactInvertedRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return CompactInvertedRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return CompactInvertedRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return CompactInvertedRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return CompactInvertedRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return CompactInvertedRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return CompactInvertedRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return CompactInvertedRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return CompactInvertedRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return CompactInvertedRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return CompactInvertedRCTrackSBendRight; - case TrackElemType::LeftVerticalLoop: + case TrackElemType::leftVerticalLoop: return CompactInvertedRCTrackLeftVerticalLoop; - case TrackElemType::RightVerticalLoop: + case TrackElemType::rightVerticalLoop: return CompactInvertedRCTrackRightVerticalLoop; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return CompactInvertedRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return CompactInvertedRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return CompactInvertedRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return CompactInvertedRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return CompactInvertedRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return CompactInvertedRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return CompactInvertedRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return CompactInvertedRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftTwistDownToUp: + case TrackElemType::leftTwistDownToUp: return CompactInvertedRCTrackLeftTwistDownToUp; - case TrackElemType::RightTwistDownToUp: + case TrackElemType::rightTwistDownToUp: return CompactInvertedRCTrackRightTwistDownToUp; - case TrackElemType::LeftTwistUpToDown: + case TrackElemType::leftTwistUpToDown: return CompactInvertedRCTrackLeftTwistUpToDown; - case TrackElemType::RightTwistUpToDown: + case TrackElemType::rightTwistUpToDown: return CompactInvertedRCTrackRightTwistUpToDown; - case TrackElemType::HalfLoopUp: + case TrackElemType::halfLoopUp: return CompactInvertedRCTrackHalfLoopUp; - case TrackElemType::HalfLoopDown: + case TrackElemType::halfLoopDown: return CompactInvertedRCTrackHalfLoopDown; - case TrackElemType::LeftCorkscrewUp: + case TrackElemType::leftCorkscrewUp: return CompactInvertedRCTrackLeftCorkscrewUp; - case TrackElemType::RightCorkscrewUp: + case TrackElemType::rightCorkscrewUp: return CompactInvertedRCTrackRightCorkscrewUp; - case TrackElemType::LeftCorkscrewDown: + case TrackElemType::leftCorkscrewDown: return CompactInvertedRCTrackLeftCorkscrewDown; - case TrackElemType::RightCorkscrewDown: + case TrackElemType::rightCorkscrewDown: return CompactInvertedRCTrackRightCorkscrewDown; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return CompactInvertedRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return CompactInvertedRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return CompactInvertedRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return CompactInvertedRCTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return CompactInvertedRCTrackBrakes; - case TrackElemType::LeftQuarterBankedHelixLargeUp: + case TrackElemType::leftQuarterBankedHelixLargeUp: return CompactInvertedRCTrackLeftQuarterBankedHelixLargeUp; - case TrackElemType::RightQuarterBankedHelixLargeUp: + case TrackElemType::rightQuarterBankedHelixLargeUp: return CompactInvertedRCTrackRightQuarterBankedHelixLargeUp; - case TrackElemType::LeftQuarterBankedHelixLargeDown: + case TrackElemType::leftQuarterBankedHelixLargeDown: return CompactInvertedRCTrackLeftQuarterBankedHelixLargeDown; - case TrackElemType::RightQuarterBankedHelixLargeDown: + case TrackElemType::rightQuarterBankedHelixLargeDown: return CompactInvertedRCTrackRightQuarterBankedHelixLargeDown; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return CompactInvertedRCTrackOnRidePhoto; - case TrackElemType::Up90: + case TrackElemType::up90: return CompactInvertedRCTrack90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return CompactInvertedRCTrack90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return CompactInvertedRCTrack60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return CompactInvertedRCTrack90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return CompactInvertedRCTrack90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return CompactInvertedRCTrack60DegDownTo90DegDown; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return CompactInvertedRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return CompactInvertedRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return CompactInvertedRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return CompactInvertedRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return CompactInvertedRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return CompactInvertedRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return CompactInvertedRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return CompactInvertedRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return CompactInvertedRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return CompactInvertedRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return CompactInvertedRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return CompactInvertedRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return CompactInvertedRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return CompactInvertedRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return CompactInvertedRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return CompactInvertedRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return CompactInvertedRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return CompactInvertedRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return CompactInvertedRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return CompactInvertedRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return CompactInvertedRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return CompactInvertedRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return CompactInvertedRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return CompactInvertedRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return CompactInvertedRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return CompactInvertedRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return CompactInvertedRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return CompactInvertedRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return CompactInvertedRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return CompactInvertedRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return CompactInvertedRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return CompactInvertedRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return CompactInvertedRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return CompactInvertedRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return CompactInvertedRCTrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return CompactInvertedRCTrackBlockBrakes; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return CompactInvertedRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return CompactInvertedRCTrackDiagBlockBrakes; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/CorkscrewRollerCoaster.cpp b/src/openrct2/paint/track/coaster/CorkscrewRollerCoaster.cpp index b26a65204f85..cf772ea9191d 100644 --- a/src/openrct2/paint/track/coaster/CorkscrewRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/CorkscrewRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -135,7 +135,7 @@ static void CorkscrewRCTrackStation( 16237, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); PaintAddImageAsParentRotated( @@ -10788,7 +10788,7 @@ static void LayDownRCTrackHalfLoopUninvertedDown( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - auto function = GetTrackPaintFunctionLayDownRCInverted(TrackElemType::FlyerHalfLoopInvertedUp); + auto function = GetTrackPaintFunctionLayDownRCInverted(TrackElemType::flyerHalfLoopInvertedUp); function(session, ride, 3 - trackSequence, direction, height, trackElement, supportType); return; } @@ -20416,568 +20416,568 @@ static void CorkscrewRCTrackRightEighthDiveLoopToDownOrthogonal( session, ride, 5 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionCorkscrewRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionCorkscrewRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return CorkscrewRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return CorkscrewRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return CorkscrewRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return CorkscrewRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return CorkscrewRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return CorkscrewRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return CorkscrewRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return CorkscrewRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return CorkscrewRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return CorkscrewRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return CorkscrewRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return CorkscrewRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return CorkscrewRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return CorkscrewRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return CorkscrewRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return CorkscrewRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return CorkscrewRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return CorkscrewRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return CorkscrewRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return CorkscrewRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return CorkscrewRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return CorkscrewRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return CorkscrewRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return CorkscrewRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return CorkscrewRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return CorkscrewRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return CorkscrewRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return CorkscrewRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return CorkscrewRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return CorkscrewRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return CorkscrewRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return CorkscrewRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return CorkscrewRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return CorkscrewRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return CorkscrewRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return CorkscrewRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return CorkscrewRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return CorkscrewRCTrackSBendRight; - case TrackElemType::LeftVerticalLoop: + case TrackElemType::leftVerticalLoop: return CorkscrewRCTrackLeftVerticalLoop; - case TrackElemType::RightVerticalLoop: + case TrackElemType::rightVerticalLoop: return CorkscrewRCTrackRightVerticalLoop; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return CorkscrewRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return CorkscrewRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return CorkscrewRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return CorkscrewRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return CorkscrewRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return CorkscrewRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return CorkscrewRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return CorkscrewRCTrackRightQuarterTurn325DegDown; - case TrackElemType::HalfLoopUp: + case TrackElemType::halfLoopUp: return CorkscrewRCTrackHalfLoopUp; - case TrackElemType::HalfLoopDown: + case TrackElemType::halfLoopDown: return CorkscrewRCTrackHalfLoopDown; - case TrackElemType::LeftCorkscrewUp: + case TrackElemType::leftCorkscrewUp: return CorkscrewRCTrackLeftCorkscrewUp; - case TrackElemType::RightCorkscrewUp: + case TrackElemType::rightCorkscrewUp: return CorkscrewRCTrackRightCorkscrewUp; - case TrackElemType::LeftCorkscrewDown: + case TrackElemType::leftCorkscrewDown: return CorkscrewRCTrackLeftCorkscrewDown; - case TrackElemType::RightCorkscrewDown: + case TrackElemType::rightCorkscrewDown: return CorkscrewRCTrackRightCorkscrewDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return CorkscrewRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return CorkscrewRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return CorkscrewRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return CorkscrewRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return CorkscrewRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return CorkscrewRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return CorkscrewRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return CorkscrewRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return CorkscrewRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return CorkscrewRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return CorkscrewRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return CorkscrewRCTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return CorkscrewRCTrackBrakes; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return CorkscrewRCTrackOnRidePhoto; - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return CorkscrewRCTrackFlatTo60DegUpLongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return CorkscrewRCTrack60DegUpToFlatLongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return CorkscrewRCTrack60DegDownToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return CorkscrewRCTrackFlatTo60DegDownLongBase; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return CorkscrewRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return CorkscrewRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return CorkscrewRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return CorkscrewRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return CorkscrewRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return CorkscrewRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return CorkscrewRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return CorkscrewRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return CorkscrewRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return CorkscrewRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return CorkscrewRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return CorkscrewRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return CorkscrewRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return CorkscrewRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return CorkscrewRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return CorkscrewRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return CorkscrewRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return CorkscrewRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return CorkscrewRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return CorkscrewRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return CorkscrewRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return CorkscrewRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return CorkscrewRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return CorkscrewRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return CorkscrewRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return CorkscrewRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return CorkscrewRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return CorkscrewRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return CorkscrewRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return CorkscrewRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return CorkscrewRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return CorkscrewRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return CorkscrewRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return CorkscrewRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return CorkscrewRCTrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return CorkscrewRCTrackBlockBrakes; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return CorkscrewRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return CorkscrewRCTrackDiagBlockBrakes; - case TrackElemType::Booster: + case TrackElemType::booster: return CorkscrewRCTrackBooster; - case TrackElemType::LeftTwistDownToUp: + case TrackElemType::leftTwistDownToUp: return CorkscrewRCTrackLeftTwistDownToUp; - case TrackElemType::RightTwistDownToUp: + case TrackElemType::rightTwistDownToUp: return CorkscrewRCTrackRightTwistDownToUp; - case TrackElemType::LeftTwistUpToDown: + case TrackElemType::leftTwistUpToDown: return CorkscrewRCTrackLeftTwistUpToDown; - case TrackElemType::RightTwistUpToDown: + case TrackElemType::rightTwistUpToDown: return CorkscrewRCTrackRightTwistUpToDown; // From Lay-down - case TrackElemType::LeftFlyerTwistUp: + case TrackElemType::leftFlyerTwistUp: return LayDownRCTrackLeftFlyerTwistUp; - case TrackElemType::RightFlyerTwistUp: + case TrackElemType::rightFlyerTwistUp: return LayDownRCTrackRightFlyerTwistUp; - case TrackElemType::FlyerHalfLoopUninvertedUp: + case TrackElemType::flyerHalfLoopUninvertedUp: return LayDownRCTrackFlyerHalfLoopUp; - case TrackElemType::LeftFlyerCorkscrewUp: + case TrackElemType::leftFlyerCorkscrewUp: return LayDownRCTrackLeftFlyerCorkscrewUp; - case TrackElemType::RightFlyerCorkscrewUp: + case TrackElemType::rightFlyerCorkscrewUp: return LayDownRCTrackRightFlyerCorkscrewUp; - case TrackElemType::FlyerHalfLoopUninvertedDown: + case TrackElemType::flyerHalfLoopUninvertedDown: return LayDownRCTrackHalfLoopUninvertedDown; // Added by OpenRCT2 // Small flat to steep - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return CorkscrewRCTrackFlatTo60DegUp; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return CorkscrewRCTrack60DegUpToFlat; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return CorkscrewRCTrackFlatTo60DegDown; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return CorkscrewRCTrack60DegDownToFlat; - case TrackElemType::DiagFlatToUp60: + case TrackElemType::diagFlatToUp60: return CorkscrewRCTrackDiagFlatTo60DegUp; - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::diagUp60ToFlat: return CorkscrewRCTrackDiag60DegUpToFlat; - case TrackElemType::DiagFlatToDown60: + case TrackElemType::diagFlatToDown60: return CorkscrewRCTrackDiagFlatTo60DegDown; - case TrackElemType::DiagDown60ToFlat: + case TrackElemType::diagDown60ToFlat: return CorkscrewRCTrackDiag60DegDownToFlat; // Diagonal large flat to steep - case TrackElemType::DiagFlatToUp60LongBase: + case TrackElemType::diagFlatToUp60LongBase: return CorkscrewRCTrackDiagFlatTo60DegUpLongBase; - case TrackElemType::DiagUp60ToFlatLongBase: + case TrackElemType::diagUp60ToFlatLongBase: return CorkscrewRCTrackDiag60DegUpToFlatLongBase; - case TrackElemType::DiagFlatToDown60LongBase: + case TrackElemType::diagFlatToDown60LongBase: return CorkscrewRCTrackDiagFlatTo60DegDownLongBase; - case TrackElemType::DiagDown60ToFlatLongBase: + case TrackElemType::diagDown60ToFlatLongBase: return CorkscrewRCTrackDiag60DegDownToFlatLongBase; // Vertical slopes - case TrackElemType::Up90: + case TrackElemType::up90: return CorkscrewRCTrack90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return CorkscrewRCTrack90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return CorkscrewRCTrack60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return CorkscrewRCTrack90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return CorkscrewRCTrack90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return CorkscrewRCTrack60DegDownTo90DegDown; // Vertical turns - case TrackElemType::LeftQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileUp90: return CorkscrewRCTrackLeftQuarterTurn190DegUp; - case TrackElemType::RightQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: return CorkscrewRCTrackRightQuarterTurn190DegUp; - case TrackElemType::LeftQuarterTurn1TileDown90: + case TrackElemType::leftQuarterTurn1TileDown90: return CorkscrewRCTrackLeftQuarterTurn190DegDown; - case TrackElemType::RightQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: return CorkscrewRCTrackRightQuarterTurn190DegDown; // Banked slope transitions - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return CorkscrewRCTrack25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return CorkscrewRCTrack25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return CorkscrewRCTrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return CorkscrewRCTrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return CorkscrewRCTrack25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return CorkscrewRCTrack25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return CorkscrewRCTrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return CorkscrewRCTrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return CorkscrewRCTrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return CorkscrewRCTrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return CorkscrewRCTrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return CorkscrewRCTrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return CorkscrewRCTrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return CorkscrewRCTrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return CorkscrewRCTrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return CorkscrewRCTrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return CorkscrewRCTrack25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return CorkscrewRCTrack25DegDownRightBanked; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return CorkscrewRCTrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return CorkscrewRCTrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return CorkscrewRCTrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return CorkscrewRCTrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return CorkscrewRCTrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return CorkscrewRCTrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return CorkscrewRCTrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return CorkscrewRCTrackRightBanked25DegDownToFlat; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return CorkscrewRCTrack25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return CorkscrewRCTrack25DegUpRightBanked; // Small banked sloped curves - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return CorkscrewRCTrackLeftBankedQuarterTurn3Tile25DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return CorkscrewRCTrackRightBankedQuarterTurn3Tile25DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return CorkscrewRCTrackLeftBankedQuarterTurn3Tile25DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return CorkscrewRCTrackRightBankedQuarterTurn3Tile25DegDown; // Medium banked sloped curves - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return CorkscrewRCTrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return CorkscrewRCTrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return CorkscrewRCTrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return CorkscrewRCTrackRightBankedQuarterTurn525DegDown; // Large sloped curves - case TrackElemType::LeftEighthToDiagUp25: + case TrackElemType::leftEighthToDiagUp25: return CorkscrewRCTrackLeftEighthToDiagUp25; - case TrackElemType::RightEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: return CorkscrewRCTrackRightEighthToDiagUp25; - case TrackElemType::LeftEighthToDiagDown25: + case TrackElemType::leftEighthToDiagDown25: return CorkscrewRCTrackLeftEighthToDiagDown25; - case TrackElemType::RightEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: return CorkscrewRCTrackRightEighthToDiagDown25; - case TrackElemType::LeftEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalUp25: return CorkscrewRCTrackLeftEighthToOrthogonalUp25; - case TrackElemType::RightEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: return CorkscrewRCTrackRightEighthToOrthogonalUp25; - case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::leftEighthToOrthogonalDown25: return CorkscrewRCTrackLeftEighthToOrthogonalDown25; - case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: return CorkscrewRCTrackRightEighthToOrthogonalDown25; // Large banked sloped curves - case TrackElemType::DiagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToLeftBankedUp25: return CorkscrewRCTrackDiagUp25ToLeftBankedUp25; - case TrackElemType::DiagUp25ToRightBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: return CorkscrewRCTrackDiagUp25ToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: return CorkscrewRCTrackDiagLeftBankedUp25ToUp25; - case TrackElemType::DiagRightBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: return CorkscrewRCTrackDiagRightBankedUp25ToUp25; - case TrackElemType::DiagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToLeftBankedDown25: return CorkscrewRCTrackDiagDown25ToLeftBankedDown25; - case TrackElemType::DiagDown25ToRightBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: return CorkscrewRCTrackDiagDown25ToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: return CorkscrewRCTrackDiagLeftBankedDown25ToDown25; - case TrackElemType::DiagRightBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: return CorkscrewRCTrackDiagRightBankedDown25ToDown25; - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: return CorkscrewRCTrackDiagLeftBankedFlatToLeftBankedUp25; - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: return CorkscrewRCTrackDiagRightBankedFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: return CorkscrewRCTrackDiagLeftBankedUp25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: return CorkscrewRCTrackDiagRightBankedUp25ToRightBankedFlat; - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: return CorkscrewRCTrackDiagLeftBankedFlatToLeftBankedDown25; - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: return CorkscrewRCTrackDiagRightBankedFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: return CorkscrewRCTrackDiagLeftBankedDown25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: return CorkscrewRCTrackDiagRightBankedDown25ToRightBankedFlat; - case TrackElemType::DiagUp25LeftBanked: + case TrackElemType::diagUp25LeftBanked: return CorkscrewRCTrackDiagUp25LeftBanked; - case TrackElemType::DiagUp25RightBanked: + case TrackElemType::diagUp25RightBanked: return CorkscrewRCTrackDiagUp25RightBanked; - case TrackElemType::DiagDown25LeftBanked: + case TrackElemType::diagDown25LeftBanked: return CorkscrewRCTrackDiagDown25LeftBanked; - case TrackElemType::DiagDown25RightBanked: + case TrackElemType::diagDown25RightBanked: return CorkscrewRCTrackDiagDown25RightBanked; - case TrackElemType::DiagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToLeftBankedUp25: return CorkscrewRCTrackDiagFlatToLeftBankedUp25; - case TrackElemType::DiagFlatToRightBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: return CorkscrewRCTrackDiagFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToFlat: + case TrackElemType::diagLeftBankedUp25ToFlat: return CorkscrewRCTrackDiagLeftBankedUp25ToFlat; - case TrackElemType::DiagRightBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: return CorkscrewRCTrackDiagRightBankedUp25ToFlat; - case TrackElemType::DiagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToLeftBankedDown25: return CorkscrewRCTrackDiagFlatToLeftBankedDown25; - case TrackElemType::DiagFlatToRightBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: return CorkscrewRCTrackDiagFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToFlat: + case TrackElemType::diagLeftBankedDown25ToFlat: return CorkscrewRCTrackDiagLeftBankedDown25ToFlat; - case TrackElemType::DiagRightBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: return CorkscrewRCTrackDiagRightBankedDown25ToFlat; - case TrackElemType::LeftEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagUp25: return CorkscrewRCTrackLeftEighthBankToDiagUp25; - case TrackElemType::RightEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: return CorkscrewRCTrackRightEighthBankToDiagUp25; - case TrackElemType::LeftEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToDiagDown25: return CorkscrewRCTrackLeftEighthBankToDiagDown25; - case TrackElemType::RightEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: return CorkscrewRCTrackRightEighthBankToDiagDown25; - case TrackElemType::LeftEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalUp25: return CorkscrewRCTrackLeftEighthBankToOrthogonalUp25; - case TrackElemType::RightEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: return CorkscrewRCTrackRightEighthBankToOrthogonalUp25; - case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::leftEighthBankToOrthogonalDown25: return CorkscrewRCTrackLeftEighthBankToOrthogonalDown25; - case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: return CorkscrewRCTrackRightEighthBankToOrthogonalDown25; // Small banked to unbanked curves - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return CorkscrewRCTrackLeftBankToLeftQuarterTurn325DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return CorkscrewRCTrackRightBankToRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return CorkscrewRCTrackLeftQuarterTurn325DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return CorkscrewRCTrackRightQuarterTurn325DegDownToRightBank; // Large corkscrews - case TrackElemType::LeftLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewUp: return CorkscrewRCTrackLeftLargeCorkscrewUp; - case TrackElemType::RightLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: return CorkscrewRCTrackRightLargeCorkscrewUp; - case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::leftLargeCorkscrewDown: return CorkscrewRCTrackLeftLargeCorkscrewDown; - case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: return CorkscrewRCTrackRightLargeCorkscrewDown; // Quarter loops - case TrackElemType::Up90ToInvertedFlatQuarterLoop: + case TrackElemType::up90ToInvertedFlatQuarterLoop: return CorkscrewRCTrack90DegToInvertedFlatQuarterLoopUp; - case TrackElemType::InvertedFlatToDown90QuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: return CorkscrewRCTrackInvertedFlatTo90DegQuarterLoopDown; // Medium half loops - case TrackElemType::LeftMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopUp: return CorkscrewRCTrackLeftMediumHalfLoopUp; - case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: return CorkscrewRCTrackRightMediumHalfLoopUp; - case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::leftMediumHalfLoopDown: return CorkscrewRCTrackLeftMediumHalfLoopDown; - case TrackElemType::RightMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: return CorkscrewRCTrackRightMediumHalfLoopDown; // Large half loops - case TrackElemType::LeftLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopUp: return CorkscrewRCTrackLeftLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: return CorkscrewRCTrackRightLargeHalfLoopUp; - case TrackElemType::LeftLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: return CorkscrewRCTrackLeftLargeHalfLoopDown; - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return CorkscrewRCTrackRightLargeHalfLoopDown; // Barrel rolls - case TrackElemType::LeftBarrelRollUpToDown: + case TrackElemType::leftBarrelRollUpToDown: return CorkscrewRCTrackLeftBarrelRollUpToDown; - case TrackElemType::RightBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: return CorkscrewRCTrackRightBarrelRollUpToDown; - case TrackElemType::LeftBarrelRollDownToUp: + case TrackElemType::leftBarrelRollDownToUp: return CorkscrewRCTrackLeftBarrelRollDownToUp; - case TrackElemType::RightBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: return CorkscrewRCTrackRightBarrelRollDownToUp; // Zero g rolls - case TrackElemType::LeftZeroGRollUp: + case TrackElemType::leftZeroGRollUp: return CorkscrewRCTrackLeftZeroGRollUp; - case TrackElemType::RightZeroGRollUp: + case TrackElemType::rightZeroGRollUp: return CorkscrewRCTrackRightZeroGRollUp; - case TrackElemType::LeftZeroGRollDown: + case TrackElemType::leftZeroGRollDown: return CorkscrewRCTrackLeftZeroGRollDown; - case TrackElemType::RightZeroGRollDown: + case TrackElemType::rightZeroGRollDown: return CorkscrewRCTrackRightZeroGRollDown; // Large zero g rolls - case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollUp: return CorkscrewRCTrackLeftLargeZeroGRollUp; - case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: return CorkscrewRCTrackRightLargeZeroGRollUp; - case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::leftLargeZeroGRollDown: return CorkscrewRCTrackLeftLargeZeroGRollDown; - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return CorkscrewRCTrackRightLargeZeroGRollDown; // Dive loops - case TrackElemType::LeftEighthDiveLoopUpToOrthogonal: + case TrackElemType::leftEighthDiveLoopUpToOrthogonal: return CorkscrewRCTrackLeftEighthDiveLoopUpToOrthogonal; - case TrackElemType::RightEighthDiveLoopUpToOrthogonal: + case TrackElemType::rightEighthDiveLoopUpToOrthogonal: return CorkscrewRCTrackRightEighthDiveLoopUpToOrthogonal; - case TrackElemType::LeftEighthDiveLoopDownToDiag: + case TrackElemType::leftEighthDiveLoopDownToDiag: return CorkscrewRCTrackLeftEighthDiveLoopDownToDiag; - case TrackElemType::RightEighthDiveLoopDownToDiag: + case TrackElemType::rightEighthDiveLoopDownToDiag: return CorkscrewRCTrackRightEighthDiveLoopToDownOrthogonal; default: diff --git a/src/openrct2/paint/track/coaster/FlyingRollerCoaster.cpp b/src/openrct2/paint/track/coaster/FlyingRollerCoaster.cpp index 4c02e98cd189..4b7922cbced5 100644 --- a/src/openrct2/paint/track/coaster/FlyingRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/FlyingRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -38,7 +38,7 @@ static void FlyingRCTrackStation( { 17155, 17151 }, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(imageIds[direction][1]), { 0, 0, height }, @@ -847,39 +847,39 @@ static void FlyingRCTrackRightFlyingLargeHalfLoopUninvertedDown( session, ride, 6 - trackSequence, direction, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionFlyingRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionFlyingRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return FlyingRCTrackStation; // OpenRCT2-specific paint code - case TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop: + case TrackElemType::multiDimInvertedFlatToDown90QuarterLoop: return FlyingRCTrackInvertedFlatTo90DegQuarterLoopDown; - case TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop: + case TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop: return FlyingRCTrack90DegToInvertedFlatQuarterLoopUp; // OpenRCT2-specific track elements - case TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp: + case TrackElemType::leftFlyerLargeHalfLoopUninvertedUp: return TwisterRCTrackLeftLargeHalfLoopUp; - case TrackElemType::RightFlyerLargeHalfLoopUninvertedUp: + case TrackElemType::rightFlyerLargeHalfLoopUninvertedUp: return TwisterRCTrackRightLargeHalfLoopUp; - case TrackElemType::LeftFlyerLargeHalfLoopInvertedDown: + case TrackElemType::leftFlyerLargeHalfLoopInvertedDown: return TwisterRCTrackLeftLargeHalfLoopDown; - case TrackElemType::RightFlyerLargeHalfLoopInvertedDown: + case TrackElemType::rightFlyerLargeHalfLoopInvertedDown: return TwisterRCTrackRightLargeHalfLoopDown; - case TrackElemType::FlyerHalfLoopInvertedUp: + case TrackElemType::flyerHalfLoopInvertedUp: return FlyingRCTrackHalfLoopInvertedUp; - case TrackElemType::FlyerHalfLoopUninvertedDown: + case TrackElemType::flyerHalfLoopUninvertedDown: return FlyingRCTrackHalfLoopUninvertedDown; - case TrackElemType::LeftFlyerLargeHalfLoopInvertedUp: + case TrackElemType::leftFlyerLargeHalfLoopInvertedUp: return FlyingRCTrackLeftFlyingLargeHalfLoopInvertedUp; - case TrackElemType::RightFlyerLargeHalfLoopInvertedUp: + case TrackElemType::rightFlyerLargeHalfLoopInvertedUp: return FlyingRCTrackRightFlyingLargeHalfLoopInvertedUp; - case TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown: + case TrackElemType::leftFlyerLargeHalfLoopUninvertedDown: return FlyingRCTrackLeftFlyingLargeHalfLoopUninvertedDown; - case TrackElemType::RightFlyerLargeHalfLoopUninvertedDown: + case TrackElemType::rightFlyerLargeHalfLoopUninvertedDown: return FlyingRCTrackRightFlyingLargeHalfLoopUninvertedDown; default: return GetTrackPaintFunctionTwisterRC(trackType); diff --git a/src/openrct2/paint/track/coaster/FlyingRollerCoasterInverted.cpp b/src/openrct2/paint/track/coaster/FlyingRollerCoasterInverted.cpp index 72d9cf94e9d7..1638346b482c 100644 --- a/src/openrct2/paint/track/coaster/FlyingRollerCoasterInverted.cpp +++ b/src/openrct2/paint/track/coaster/FlyingRollerCoasterInverted.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -8912,285 +8912,285 @@ static void FlyingRCTrackFlyerHalfLoopDown( } } -TrackPaintFunction GetTrackPaintFunctionFlyingRCInverted(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionFlyingRCInverted(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return InvertedFlyingRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return InvertedFlyingRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return InvertedFlyingRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return InvertedFlyingRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return InvertedFlyingRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return InvertedFlyingRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return InvertedFlyingRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return InvertedFlyingRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return InvertedFlyingRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return InvertedFlyingRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return InvertedFlyingRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return InvertedFlyingRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return InvertedFlyingRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return InvertedFlyingRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return InvertedFlyingRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return InvertedFlyingRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return InvertedFlyingRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return InvertedFlyingRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return InvertedFlyingRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return InvertedFlyingRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return InvertedFlyingRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return InvertedFlyingRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return InvertedFlyingRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return InvertedFlyingRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return InvertedFlyingRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return InvertedFlyingRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return InvertedFlyingRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return InvertedFlyingRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return InvertedFlyingRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return InvertedFlyingRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return InvertedFlyingRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return InvertedFlyingRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return InvertedFlyingRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return InvertedFlyingRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return InvertedFlyingRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return InvertedFlyingRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return InvertedFlyingRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return InvertedFlyingRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return InvertedFlyingRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return InvertedFlyingRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return InvertedFlyingRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return InvertedFlyingRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return InvertedFlyingRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return InvertedFlyingRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return InvertedFlyingRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return InvertedFlyingRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return InvertedFlyingRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return InvertedFlyingRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return InvertedFlyingRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return InvertedFlyingRCTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return InvertedFlyingRCTrackBrakes; - case TrackElemType::LeftQuarterBankedHelixLargeUp: + case TrackElemType::leftQuarterBankedHelixLargeUp: return InvertedFlyingRCTrackLeftQuarterBankedHelixLargeUp; - case TrackElemType::RightQuarterBankedHelixLargeUp: + case TrackElemType::rightQuarterBankedHelixLargeUp: return InvertedFlyingRCTrackRightQuarterBankedHelixLargeUp; - case TrackElemType::LeftQuarterBankedHelixLargeDown: + case TrackElemType::leftQuarterBankedHelixLargeDown: return InvertedFlyingRCTrackLeftQuarterBankedHelixLargeDown; - case TrackElemType::RightQuarterBankedHelixLargeDown: + case TrackElemType::rightQuarterBankedHelixLargeDown: return InvertedFlyingRCTrackRightQuarterBankedHelixLargeDown; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return InvertedFlyingRCTrack25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return InvertedFlyingRCTrack25DegUpRightBanked; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return InvertedFlyingRCTrackOnRidePhoto; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return InvertedFlyingRCTrack25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return InvertedFlyingRCTrack25DegDownRightBanked; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return InvertedFlyingRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return InvertedFlyingRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return InvertedFlyingRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return InvertedFlyingRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return InvertedFlyingRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return InvertedFlyingRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return InvertedFlyingRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return InvertedFlyingRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return InvertedFlyingRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return InvertedFlyingRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return InvertedFlyingRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return InvertedFlyingRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return InvertedFlyingRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return InvertedFlyingRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return InvertedFlyingRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return InvertedFlyingRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return InvertedFlyingRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return InvertedFlyingRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return InvertedFlyingRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return InvertedFlyingRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return InvertedFlyingRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return InvertedFlyingRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return InvertedFlyingRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return InvertedFlyingRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return InvertedFlyingRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return InvertedFlyingRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return InvertedFlyingRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return InvertedFlyingRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return InvertedFlyingRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return InvertedFlyingRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return InvertedFlyingRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return InvertedFlyingRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return InvertedFlyingRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return InvertedFlyingRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return InvertedFlyingRCTrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return InvertedFlyingRCTrackBlockBrakes; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return InvertedFlyingRCTrackLeftBankedQuarterTurn325DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return InvertedFlyingRCTrackRightBankedQuarterTurn325DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return InvertedFlyingRCTrackLeftBankedQuarterTurn325DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return InvertedFlyingRCTrackRightBankedQuarterTurn325DegDown; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return InvertedFlyingRCTrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return InvertedFlyingRCTrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return InvertedFlyingRCTrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return InvertedFlyingRCTrackRightBankedQuarterTurn525DegDown; - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return InvertedFlyingRCTrack25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return InvertedFlyingRCTrack25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return InvertedFlyingRCTrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return InvertedFlyingRCTrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return InvertedFlyingRCTrack25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return InvertedFlyingRCTrack25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return InvertedFlyingRCTrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return InvertedFlyingRCTrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return InvertedFlyingRCTrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return InvertedFlyingRCTrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return InvertedFlyingRCTrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return InvertedFlyingRCTrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return InvertedFlyingRCTrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return InvertedFlyingRCTrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return InvertedFlyingRCTrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return InvertedFlyingRCTrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return InvertedFlyingRCTrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return InvertedFlyingRCTrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return InvertedFlyingRCTrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return InvertedFlyingRCTrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return InvertedFlyingRCTrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return InvertedFlyingRCTrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return InvertedFlyingRCTrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return InvertedFlyingRCTrackRightBanked25DegDownToFlat; - case TrackElemType::LeftFlyerTwistDown: + case TrackElemType::leftFlyerTwistDown: return InvertedFlyingRCTrackLeftFlyerTwistDown; - case TrackElemType::RightFlyerTwistDown: + case TrackElemType::rightFlyerTwistDown: return InvertedFlyingRCTrackRightFlyerTwistDown; - case TrackElemType::FlyerHalfLoopInvertedDown: + case TrackElemType::flyerHalfLoopInvertedDown: return FlyingRCTrackFlyerHalfLoopDown; // OpenRCT2-specific paint code - case TrackElemType::Booster: + case TrackElemType::booster: return InvertedFlyingRCTrackBooster; - case TrackElemType::Up90: + case TrackElemType::up90: return InvertedFlyingRCTrack90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return InvertedFlyingRCTrack90DegDown; // OpenRCT2-specific track elements - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return InvertedFlyingRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return InvertedFlyingRCTrackDiagBlockBrakes; default: diff --git a/src/openrct2/paint/track/coaster/HeartlineTwisterCoaster.cpp b/src/openrct2/paint/track/coaster/HeartlineTwisterCoaster.cpp index 96286a0e3d9a..bfac48f811ec 100644 --- a/src/openrct2/paint/track/coaster/HeartlineTwisterCoaster.cpp +++ b/src/openrct2/paint/track/coaster/HeartlineTwisterCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -94,7 +94,7 @@ static void HeartlineTwisterRCTrackFlat( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -124,7 +124,7 @@ static void HeartlineTwisterRCTrackStation( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(imageIds[direction][1]), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); } TrackPaintUtilDrawStationTunnel(session, direction, height); @@ -214,7 +214,7 @@ static void HeartlineTwisterRCTrack25DegUp( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -311,7 +311,7 @@ static void HeartlineTwisterRCTrack60DegUp( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -408,7 +408,7 @@ static void HeartlineTwisterRCTrackFlatTo25DegUp( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -505,7 +505,7 @@ static void HeartlineTwisterRCTrack25DegUpTo60DegUp( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -602,7 +602,7 @@ static void HeartlineTwisterRCTrack60DegUpTo25DegUp( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -699,7 +699,7 @@ static void HeartlineTwisterRCTrack25DegUpToFlat( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -808,7 +808,7 @@ static void HeartlineTwisterRCTrackHeartlineTransferUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -883,7 +883,7 @@ static void HeartlineTwisterRCTrackHeartlineTransferUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -926,7 +926,7 @@ static void HeartlineTwisterRCTrackHeartlineTransferUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1097,7 +1097,7 @@ static void HeartlineTwisterRCTrackHeartlineTransferDown( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1140,7 +1140,7 @@ static void HeartlineTwisterRCTrackHeartlineTransferDown( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1183,7 +1183,7 @@ static void HeartlineTwisterRCTrackHeartlineTransferDown( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -1431,7 +1431,7 @@ static void HeartlineTwisterRCTrackLeftHeartlineRoll( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -1670,7 +1670,7 @@ static void HeartlineTwisterRCTrackRightHeartlineRoll( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -1678,47 +1678,47 @@ static void HeartlineTwisterRCTrackRightHeartlineRoll( PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } -TrackPaintFunction GetTrackPaintFunctionHeartlineTwisterRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionHeartlineTwisterRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return HeartlineTwisterRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return HeartlineTwisterRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return HeartlineTwisterRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return HeartlineTwisterRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return HeartlineTwisterRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return HeartlineTwisterRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return HeartlineTwisterRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return HeartlineTwisterRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return HeartlineTwisterRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return HeartlineTwisterRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return HeartlineTwisterRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return HeartlineTwisterRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return HeartlineTwisterRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return HeartlineTwisterRCTrack25DegDownToFlat; - case TrackElemType::HeartLineTransferUp: + case TrackElemType::heartLineTransferUp: return HeartlineTwisterRCTrackHeartlineTransferUp; - case TrackElemType::HeartLineTransferDown: + case TrackElemType::heartLineTransferDown: return HeartlineTwisterRCTrackHeartlineTransferDown; - case TrackElemType::LeftHeartLineRoll: + case TrackElemType::leftHeartLineRoll: return HeartlineTwisterRCTrackLeftHeartlineRoll; - case TrackElemType::RightHeartLineRoll: + case TrackElemType::rightHeartLineRoll: return HeartlineTwisterRCTrackRightHeartlineRoll; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/HybridCoaster.cpp b/src/openrct2/paint/track/coaster/HybridCoaster.cpp index 1c3663141ad0..6c277a80be30 100644 --- a/src/openrct2/paint/track/coaster/HybridCoaster.cpp +++ b/src/openrct2/paint/track/coaster/HybridCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -67,7 +67,7 @@ namespace OpenRCT2::HybridRC { (SPR_TRACKS_HYBRID_TRACK_BRAKE + 1), (SPR_TRACKS_HYBRID_TRACK_BLOCK_BRAKE + 1) }, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { PaintAddImageAsParentRotated( session, direction, GetTrackColour(session).WithIndex(imageIds[direction][1]), { 0, 0, height }, @@ -1380,7 +1380,7 @@ namespace OpenRCT2::HybridRC session, 3, height, direction, trackSequence, images[trackElement.HasChain()], defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr, 0, GetTrackColour(session)); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -11105,8 +11105,7 @@ namespace OpenRCT2::HybridRC PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 }); + TrackPaintUtilOnridePhotoPlatformPaintBase(session, height); PaintAddImageAsParentRotated( session, direction, GetTrackColour(session).WithIndex(SPR_TRACKS_HYBRID_TRACK_FLAT + (direction & 1)), { 0, 0, height }, { { 0, 6, height + 3 }, { 32, 20, 0 } }); @@ -14546,441 +14545,441 @@ namespace OpenRCT2::HybridRC } } - TrackPaintFunction GetTrackPaintFunction(OpenRCT2::TrackElemType trackType) + TrackPaintFunction GetTrackPaintFunction(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return TrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return TrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return Track25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return Track60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return TrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return Track25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return Track60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return Track25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return Track25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return Track60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return TrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return Track25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return Track60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return Track25DegDownToFlat; - case TrackElemType::Up90: + case TrackElemType::up90: return Track90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return Track90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return Track60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return Track90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return Track90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return Track60DegDownTo90DegDown; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return TrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return TrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return TrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return TrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return TrackLeftBankToflat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return TrackRightBankToflat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return TrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return TrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return TrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return TrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return Track25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return Track25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return TrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return TrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return Track25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return Track25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return TrackLeftbank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return TrackRightbank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return TrackLeftQuarterTurn5Tile25DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return TrackRightQuarterTurn5Tile25DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return TrackLeftQuarterTurn5Tile25DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return TrackRightQuarterTurn5Tile25DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return TrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return TrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return TrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return TrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return TrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return TrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return TrackLeftQuarterTurn3Tile25DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return TrackRightQuarterTurn3Tile25DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return TrackLeftQuarterTurn3Tile25DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return TrackRightQuarterTurn3Tile25DegDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return TrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return TrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return TrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return TrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return TrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return TrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return TrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return TrackRightHalfBankedHelixDownLarge; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return TrackLeftQuarterTurn1Tile60DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return TrackRightQuarterTurn1Tile60DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return TrackLeftQuarterTurn1Tile60DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return TrackRightQuarterTurn1Tile60DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return Trackbrakes; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return Track25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return Track25DegUpRightBanked; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return TrackOnRidePhoto; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return Track25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return Track25DegDownRightBanked; - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return TrackFlatTo60DegUpLongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return Track60DegUpToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return TrackFlatTo60DegDownLongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return Track60DegDownToFlatLongBase; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return TrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return TrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return TrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return TrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return TrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return TrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return TrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return TrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return TrackDiagFlat; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return TrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return TrackDiagBlockBrakes; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return TrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return TrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return TrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return TrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return TrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return TrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return TrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return TrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return TrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return TrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return TrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return TrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return TrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return TrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return TrackDiagLeftBankToflat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return TrackDiagRightBankToflat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return TrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return TrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return TrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return TrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return TrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return TrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return TrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return TrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return TrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return TrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return TrackBlockBrakes; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return TrackLeftBankedQuarterTurn3Tile25DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return TrackRightBankedQuarterTurn3Tile25DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return TrackLeftBankedQuarterTurn3Tile25DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return TrackRightBankedQuarterTurn3Tile25DegDown; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return TrackLeftBankedQuarterTurn5Tile25DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return TrackRightBankedQuarterTurn5Tile25DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return TrackLeftBankedQuarterTurn5Tile25DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return TrackRightBankedQuarterTurn5Tile25DegDown; - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return Track25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return Track25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return TrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return TrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return Track25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return Track25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return TrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return TrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return TrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return TrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return TrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return TrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return TrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return TrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return TrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return TrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return TrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return TrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return TrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return TrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return TrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return TrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return TrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return TrackRightBanked25DegDownToFlat; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return TrackLeftBankToLeftQuarterTurn3Tile25DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return TrackRightBankToRightQuarterTurn3Tile25DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return TrackLeftQuarterTurn3Tile25DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return TrackRightQuarterTurn3Tile25DegDownToRightBank; - case TrackElemType::LeftQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileUp90: return TrackLeftQuarterTurn1Tile90DegUp; - case TrackElemType::RightQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: return TrackRightQuarterTurn1Tile90DegUp; - case TrackElemType::LeftQuarterTurn1TileDown90: + case TrackElemType::leftQuarterTurn1TileDown90: return TrackLeftQuarterTurn1Tile90DegDown; - case TrackElemType::RightQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: return TrackRightQuarterTurn1Tile90DegDown; - case TrackElemType::LeftBarrelRollUpToDown: + case TrackElemType::leftBarrelRollUpToDown: return TrackLeftBarrelRollUpToDown; - case TrackElemType::RightBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: return TrackRightBarrelRollUpToDown; - case TrackElemType::LeftBarrelRollDownToUp: + case TrackElemType::leftBarrelRollDownToUp: return TrackLeftBarrelRollDownToUp; - case TrackElemType::RightBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: return TrackRightBarrelRollDownToUp; - case TrackElemType::LeftZeroGRollUp: + case TrackElemType::leftZeroGRollUp: return TrackLeftZeroGRollUp; - case TrackElemType::RightZeroGRollUp: + case TrackElemType::rightZeroGRollUp: return TrackRightZeroGRollUp; - case TrackElemType::LeftZeroGRollDown: + case TrackElemType::leftZeroGRollDown: return TrackLeftZeroGRollDown; - case TrackElemType::RightZeroGRollDown: + case TrackElemType::rightZeroGRollDown: return TrackRightZeroGRollDown; - case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollUp: return TrackLeftLargeZeroGRollUp; - case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: return TrackRightLargeZeroGRollUp; - case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::leftLargeZeroGRollDown: return TrackLeftLargeZeroGRollDown; - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return TrackRightLargeZeroGRollDown; - case TrackElemType::Up90ToInvertedFlatQuarterLoop: + case TrackElemType::up90ToInvertedFlatQuarterLoop: return Track90DegToInvertedFlatQuarterLoopUp; - case TrackElemType::InvertedFlatToDown90QuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: return TrackInvertedFlatTo90DegQuarterLoopDown; - case TrackElemType::LeftEighthToDiagUp25: + case TrackElemType::leftEighthToDiagUp25: return TrackLeftEighthToDiagUp25; - case TrackElemType::RightEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: return TrackRightEighthToDiagUp25; - case TrackElemType::LeftEighthToDiagDown25: + case TrackElemType::leftEighthToDiagDown25: return TrackLeftEighthToDiagDown25; - case TrackElemType::RightEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: return TrackRightEighthToDiagDown25; - case TrackElemType::LeftEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalUp25: return TrackLeftEighthToOrthogonalUp25; - case TrackElemType::RightEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: return TrackRightEighthToOrthogonalUp25; - case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::leftEighthToOrthogonalDown25: return TrackLeftEighthToOrthogonalDown25; - case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: return TrackRightEighthToOrthogonalDown25; - case TrackElemType::DiagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToLeftBankedUp25: return TrackDiagUp25ToLeftBankedUp25; - case TrackElemType::DiagUp25ToRightBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: return TrackDiagUp25ToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: return TrackDiagLeftBankedUp25ToUp25; - case TrackElemType::DiagRightBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: return TrackDiagRightBankedUp25ToUp25; - case TrackElemType::DiagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToLeftBankedDown25: return TrackDiagDown25ToLeftBankedDown25; - case TrackElemType::DiagDown25ToRightBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: return TrackDiagDown25ToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: return TrackDiagLeftBankedDown25ToDown25; - case TrackElemType::DiagRightBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: return TrackDiagRightBankedDown25ToDown25; - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: return TrackDiagLeftBankedFlatToLeftBankedUp25; - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: return TrackDiagRightBankedFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: return TrackDiagLeftBankedUp25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: return TrackDiagRightBankedUp25ToRightBankedFlat; - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: return TrackDiagLeftBankedFlatToLeftBankedDown25; - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: return TrackDiagRightBankedFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: return TrackDiagLeftBankedDown25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: return TrackDiagRightBankedDown25ToRightBankedFlat; - case TrackElemType::DiagUp25LeftBanked: + case TrackElemType::diagUp25LeftBanked: return TrackDiagUp25LeftBanked; - case TrackElemType::DiagUp25RightBanked: + case TrackElemType::diagUp25RightBanked: return TrackDiagUp25RightBanked; - case TrackElemType::DiagDown25LeftBanked: + case TrackElemType::diagDown25LeftBanked: return TrackDiagDown25LeftBanked; - case TrackElemType::DiagDown25RightBanked: + case TrackElemType::diagDown25RightBanked: return TrackDiagDown25RightBanked; - case TrackElemType::DiagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToLeftBankedUp25: return TrackDiagFlatToLeftBankedUp25; - case TrackElemType::DiagFlatToRightBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: return TrackDiagFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToFlat: + case TrackElemType::diagLeftBankedUp25ToFlat: return TrackDiagLeftBankedUp25ToFlat; - case TrackElemType::DiagRightBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: return TrackDiagRightBankedUp25ToFlat; - case TrackElemType::DiagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToLeftBankedDown25: return TrackDiagFlatToLeftBankedDown25; - case TrackElemType::DiagFlatToRightBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: return TrackDiagFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToFlat: + case TrackElemType::diagLeftBankedDown25ToFlat: return TrackDiagLeftBankedDown25ToFlat; - case TrackElemType::DiagRightBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: return TrackDiagRightBankedDown25ToFlat; - case TrackElemType::LeftEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagUp25: return TrackLeftEighthBankToDiagUp25; - case TrackElemType::RightEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: return TrackRightEighthBankToDiagUp25; - case TrackElemType::LeftEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToDiagDown25: return TrackLeftEighthBankToDiagDown25; - case TrackElemType::RightEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: return TrackRightEighthBankToDiagDown25; - case TrackElemType::LeftEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalUp25: return TrackLeftEighthBankToOrthogonalUp25; - case TrackElemType::RightEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: return TrackRightEighthBankToOrthogonalUp25; - case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::leftEighthBankToOrthogonalDown25: return TrackLeftEighthBankToOrthogonalDown25; - case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: return TrackRightEighthBankToOrthogonalDown25; - case TrackElemType::PoweredLift: + case TrackElemType::poweredLift: return TrackpoweredLift; - case TrackElemType::Booster: + case TrackElemType::booster: return Trackbooster; - case TrackElemType::Down25Brakes: + case TrackElemType::down25Brakes: return Track25DegDownBrakes; - case TrackElemType::DiagDown25Brakes: + case TrackElemType::diagDown25Brakes: return TrackDiag25DegDownBrakes; default: diff --git a/src/openrct2/paint/track/coaster/InvertedHairpinCoaster.cpp b/src/openrct2/paint/track/coaster/InvertedHairpinCoaster.cpp index bc415ec3fce9..ad1fcb769993 100644 --- a/src/openrct2/paint/track/coaster/InvertedHairpinCoaster.cpp +++ b/src/openrct2/paint/track/coaster/InvertedHairpinCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1382,67 +1382,67 @@ static void InvertedHairpinRCTrackBlockBrakes( PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } -TrackPaintFunction GetTrackPaintFunctionInvertedHairpinRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionInvertedHairpinRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return InvertedHairpinRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return InvertedHairpinRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return InvertedHairpinRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return InvertedHairpinRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return InvertedHairpinRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return InvertedHairpinRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return InvertedHairpinRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return InvertedHairpinRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return InvertedHairpinRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return InvertedHairpinRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return InvertedHairpinRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return InvertedHairpinRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return InvertedHairpinRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return InvertedHairpinRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return InvertedHairpinRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return InvertedHairpinRCTrackRightQuarterTurn3; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return InvertedHairpinRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return InvertedHairpinRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return InvertedHairpinRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return InvertedHairpinRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return InvertedHairpinRCTrackLeftQuarterTurn1; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return InvertedHairpinRCTrackRightQuarterTurn1; - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return InvertedHairpinRCTrackFlatTo60DegUp; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return InvertedHairpinRCTrack60DegUpToFlat; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return InvertedHairpinRCTrackFlatTo60DegDown; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return InvertedHairpinRCTrack60DegDownToFlat; - case TrackElemType::Brakes: + case TrackElemType::brakes: return InvertedHairpinRCTrackBrakes; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return InvertedHairpinRCTrackBlockBrakes; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/InvertedImpulseCoaster.cpp b/src/openrct2/paint/track/coaster/InvertedImpulseCoaster.cpp index 80da907f1546..b77faf26097e 100644 --- a/src/openrct2/paint/track/coaster/InvertedImpulseCoaster.cpp +++ b/src/openrct2/paint/track/coaster/InvertedImpulseCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -758,59 +758,59 @@ static void InvertedImpulseRCTrackRightQuarterTurn190DegDown( session, ride, trackSequence, (direction - 1) & 3, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionInvertedImpulseRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionInvertedImpulseRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return InvertedImpulseRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return InvertedImpulseRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return InvertedImpulseRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return InvertedImpulseRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return InvertedImpulseRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return InvertedImpulseRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return InvertedImpulseRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return InvertedImpulseRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return InvertedImpulseRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return InvertedImpulseRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return InvertedImpulseRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return InvertedImpulseRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return InvertedImpulseRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return InvertedImpulseRCTrack25DegDownToFlat; - case TrackElemType::Up90: + case TrackElemType::up90: return InvertedImpulseRCTrack90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return InvertedImpulseRCTrack90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return InvertedImpulseRCTrack60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return InvertedImpulseRCTrack90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return InvertedImpulseRCTrack90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return InvertedImpulseRCTrack60DegDownTo90DegDown; - case TrackElemType::LeftQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileUp90: return InvertedImpulseRCTrackLeftQuarterTurn190DegUp; - case TrackElemType::RightQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: return InvertedImpulseRCTrackRightQuarterTurn190DegUp; - case TrackElemType::LeftQuarterTurn1TileDown90: + case TrackElemType::leftQuarterTurn1TileDown90: return InvertedImpulseRCTrackLeftQuarterTurn190DegDown; - case TrackElemType::RightQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: return InvertedImpulseRCTrackRightQuarterTurn190DegDown; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/InvertedRollerCoaster.cpp b/src/openrct2/paint/track/coaster/InvertedRollerCoaster.cpp index eb790d55193b..dedd4a78ff7d 100644 --- a/src/openrct2/paint/track/coaster/InvertedRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/InvertedRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11330,306 +11330,306 @@ static void InvertedRCTrackBooster( PaintUtilSetGeneralSupportHeight(session, height + 48); } -TrackPaintFunction GetTrackPaintFunctionInvertedRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionInvertedRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return InvertedRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return InvertedRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return InvertedRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return InvertedRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return InvertedRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return InvertedRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return InvertedRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return InvertedRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return InvertedRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return InvertedRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return InvertedRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return InvertedRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return InvertedRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return InvertedRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return InvertedRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return InvertedRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return InvertedRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return InvertedRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return InvertedRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return InvertedRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return InvertedRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return InvertedRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return InvertedRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return InvertedRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return InvertedRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return InvertedRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return InvertedRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return InvertedRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return InvertedRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return InvertedRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return InvertedRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return InvertedRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return InvertedRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return InvertedRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return InvertedRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return InvertedRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return InvertedRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return InvertedRCTrackSBendRight; - case TrackElemType::LeftVerticalLoop: + case TrackElemType::leftVerticalLoop: return InvertedRCTrackLeftVerticalLoop; - case TrackElemType::RightVerticalLoop: + case TrackElemType::rightVerticalLoop: return InvertedRCTrackRightVerticalLoop; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return InvertedRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return InvertedRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return InvertedRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return InvertedRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return InvertedRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return InvertedRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return InvertedRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return InvertedRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftTwistDownToUp: + case TrackElemType::leftTwistDownToUp: return InvertedRCTrackLeftTwistDownToUp; - case TrackElemType::RightTwistDownToUp: + case TrackElemType::rightTwistDownToUp: return InvertedRCTrackRightTwistDownToUp; - case TrackElemType::LeftTwistUpToDown: + case TrackElemType::leftTwistUpToDown: return InvertedRCTrackLeftTwistUpToDown; - case TrackElemType::RightTwistUpToDown: + case TrackElemType::rightTwistUpToDown: return InvertedRCTrackRightTwistUpToDown; - case TrackElemType::HalfLoopUp: + case TrackElemType::halfLoopUp: return InvertedRCTrackHalfLoopUp; - case TrackElemType::HalfLoopDown: + case TrackElemType::halfLoopDown: return InvertedRCTrackHalfLoopDown; - case TrackElemType::LeftCorkscrewUp: + case TrackElemType::leftCorkscrewUp: return InvertedRCTrackLeftCorkscrewUp; - case TrackElemType::RightCorkscrewUp: + case TrackElemType::rightCorkscrewUp: return InvertedRCTrackRightCorkscrewUp; - case TrackElemType::LeftCorkscrewDown: + case TrackElemType::leftCorkscrewDown: return InvertedRCTrackLeftCorkscrewDown; - case TrackElemType::RightCorkscrewDown: + case TrackElemType::rightCorkscrewDown: return InvertedRCTrackRightCorkscrewDown; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return InvertedRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return InvertedRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return InvertedRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return InvertedRCTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return InvertedRCTrackBrakes; - case TrackElemType::LeftQuarterBankedHelixLargeUp: + case TrackElemType::leftQuarterBankedHelixLargeUp: return InvertedRCTrackLeftQuarterBankedHelixLargeUp; - case TrackElemType::RightQuarterBankedHelixLargeUp: + case TrackElemType::rightQuarterBankedHelixLargeUp: return InvertedRCTrackRightQuarterBankedHelixLargeUp; - case TrackElemType::LeftQuarterBankedHelixLargeDown: + case TrackElemType::leftQuarterBankedHelixLargeDown: return InvertedRCTrackLeftQuarterBankedHelixLargeDown; - case TrackElemType::RightQuarterBankedHelixLargeDown: + case TrackElemType::rightQuarterBankedHelixLargeDown: return InvertedRCTrackRightQuarterBankedHelixLargeDown; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return InvertedRCTrack25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return InvertedRCTrack25DegUpRightBanked; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return InvertedRCTrackOnRidePhoto; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return InvertedRCTrack25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return InvertedRCTrack25DegDownRightBanked; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return InvertedRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return InvertedRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return InvertedRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return InvertedRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return InvertedRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return InvertedRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return InvertedRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return InvertedRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return InvertedRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return InvertedRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return InvertedRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return InvertedRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return InvertedRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return InvertedRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return InvertedRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return InvertedRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return InvertedRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return InvertedRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return InvertedRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return InvertedRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return InvertedRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return InvertedRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return InvertedRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return InvertedRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return InvertedRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return InvertedRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return InvertedRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return InvertedRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return InvertedRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return InvertedRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return InvertedRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return InvertedRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return InvertedRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return InvertedRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return InvertedRCTrackDiagRightBank; - case TrackElemType::LeftLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopUp: return InvertedRCTrackLeftLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: return InvertedRCTrackRightLargeHalfLoopUp; - case TrackElemType::LeftLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: return InvertedRCTrackLeftLargeHalfLoopDown; - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return InvertedRCTrackRightLargeHalfLoopDown; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return InvertedRCTrackBlockBrakes; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return InvertedRCTrackLeftBankedQuarterTurn325DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return InvertedRCTrackRightBankedQuarterTurn325DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return InvertedRCTrackLeftBankedQuarterTurn325DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return InvertedRCTrackRightBankedQuarterTurn325DegDown; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return InvertedRCTrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return InvertedRCTrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return InvertedRCTrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return InvertedRCTrackRightBankedQuarterTurn525DegDown; - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return InvertedRCTrack25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return InvertedRCTrack25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return InvertedRCTrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return InvertedRCTrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return InvertedRCTrack25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return InvertedRCTrack25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return InvertedRCTrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return InvertedRCTrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return InvertedRCTrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return InvertedRCTrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return InvertedRCTrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return InvertedRCTrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return InvertedRCTrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return InvertedRCTrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return InvertedRCTrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return InvertedRCTrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return InvertedRCTrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return InvertedRCTrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return InvertedRCTrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return InvertedRCTrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return InvertedRCTrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return InvertedRCTrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return InvertedRCTrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return InvertedRCTrackRightBanked25DegDownToFlat; - case TrackElemType::DiagBrakes: - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBrakes: + case TrackElemType::diagBlockBrakes: return InvertedRCTrackDiagBrakes; - case TrackElemType::Booster: + case TrackElemType::booster: return InvertedRCTrackBooster; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/JuniorRollerCoaster.cpp b/src/openrct2/paint/track/coaster/JuniorRollerCoaster.cpp index ef3ebab82e4e..c12865c87a1b 100644 --- a/src/openrct2/paint/track/coaster/JuniorRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/JuniorRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1892,7 +1892,7 @@ static void JuniorRCPaintStation( if (direction == 0 || direction == 2) { // height += 2 (height) - if (trackElement.GetTrackType() == TrackElemType::EndStation && TSubType == JuniorRCSubType::Junior) + if (trackElement.GetTrackType() == TrackElemType::endStation && TSubType == JuniorRCSubType::Junior) { imageId = session.TrackColours.WithIndex(junior_rc_track_pieces_block_brake[isBraked][direction]); } @@ -1905,7 +1905,7 @@ static void JuniorRCPaintStation( else if (direction == 1 || direction == 3) { // height += 2 (height) - if (trackElement.GetTrackType() == TrackElemType::EndStation && TSubType == JuniorRCSubType::Junior) + if (trackElement.GetTrackType() == TrackElemType::endStation && TSubType == JuniorRCSubType::Junior) { imageId = session.TrackColours.WithIndex(junior_rc_track_pieces_block_brake[isBraked][direction]); } @@ -5756,11 +5756,10 @@ static void JuniorRCTrackOnRidePhoto( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - auto imageId = session.TrackColours.WithIndex(junior_rc_track_pieces_flat[0][direction]); - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 }); + TrackPaintUtilOnridePhotoPlatformPaintBase(session, height); DrawSupportsSideBySide(session, direction, height, session.SupportColours, supportType.metal, 6); + auto imageId = session.TrackColours.WithIndex(junior_rc_track_pieces_flat[0][direction]); PaintAddImageAsParentRotated(session, direction, imageId, { 0, 6, height }, { { 0, 6, height + 3 }, { 32, 20, 1 } }); TrackPaintUtilOnridePhotoPaint2(session, direction, trackElement, height); @@ -5768,241 +5767,241 @@ static void JuniorRCTrackOnRidePhoto( /* 0x008AAA0C */ template -TrackPaintFunction GetTrackPaintFunctionJuniorRCTemplate(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionJuniorRCTemplate(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return JuniorRCPaintTrackFlat; - case TrackElemType::EndStation: + case TrackElemType::endStation: return JuniorRCPaintStation; - case TrackElemType::BeginStation: + case TrackElemType::beginStation: return JuniorRCPaintStation; - case TrackElemType::MiddleStation: + case TrackElemType::middleStation: return JuniorRCPaintStation; - case TrackElemType::Up25: + case TrackElemType::up25: return JuniorRCPaintTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return JuniorRCPaintTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return JuniorRCPaintTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return JuniorRCPaintTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return JuniorRCPaintTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return JuniorRCPaintTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return JuniorRC25DegDownPaintSetup; - case TrackElemType::Down60: + case TrackElemType::down60: return JuniorRC60DegDownPaintSetup; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return JuniorRCFlatTo25DegDownPaintSetup; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return JuniorRC25DegDownTo60DegDownPaintSetup; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return JuniorRC60DegDownTo25DegDownPaintSetup; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return JuniorRC25DegDownToFlatPaintSetup; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return JuniorRCLeftQuarterTurn5TilesPaintSetup; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return JuniorRCRightQuarterTurn5TilesPaintSetup; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return JuniorRCFlatToLeftBankPaintSetup; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return JuniorRCFlatToRightBankPaintSetup; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return JuniorRCLeftBankToFlatPaintSetup; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return JuniorRCRightBankToFlatPaintSetup; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return JuniorRCBankedLeftQuarterTurn5TilesPaintSetup; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return JuniorRCBankedRightQuarterTurn5TilesPaintSetup; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return JuniorRCLeftBankTo25DegUpPaintSetup; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return JuniorRCRightBankTo25DegUpPaintSetup; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return JuniorRC25DegUpToLeftBankPaintSetup; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return JuniorRC25DegUpToRightBankPaintSetup; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return JuniorRCLeftBankTo25DegDownPaintSetup; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return JuniorRCRightBankTo25DegDownPaintSetup; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return JuniorRC25DegDownToLeftBankPaintSetup; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return JuniorRC25DegDownToRightBankPaintSetup; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return JuniorRCLeftBankPaintSetup; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return JuniorRCRightBankPaintSetup; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return JuniorRCPaintTrackLeftQuarterTurn5Tiles25DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return JuniorRCPaintTrackRightQuarterTurn5Tiles25DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return JuniorRCLeftQuarterTurn5Tiles25DegDownPaintSetup; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return JuniorRCRightQuarterTurn5Tiles25DegDownPaintSetup; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return JuniorRCSBendLeftPaintSetup; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return JuniorRCSBendRightPaintSetup; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return JuniorRCLeftQuarterTurn3TilesPaintSetup; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return JuniorRCRightQuarterTurn3TilesPaintSetup; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return JuniorRCLeftQuarterTurn3TilesBankPaintSetup; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return JuniorRCRightQuarterTurn3TilesBankPaintSetup; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return JuniorRCLeftQuarterTurn3Tiles25DegUpPaintSetup; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return JuniorRCPaintTrackRightQuarterTurn3Tiles25DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return JuniorRCLeftQuarterTurn3Tiles25DegDownPaintSetup; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return JuniorRCPaintTrackRightQuarterTurn3Tiles25DegDown; - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return JuniorRCFlatTo60DegUpPaintSetup; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return JuniorRC60DegUpToFlatPaintSetup; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return JuniorRCFlatTo60DegDownPaintSetup; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return JuniorRC60DegDownToFlatPaintSetup; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return JuniorRCLeftHalfBankedHelixUpSmallPaintSetup; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return JuniorRCRightHalfBankedHelixUpSmallPaintSetup; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return JuniorRCLeftHalfBankedHelixDownSmallPaintSetup; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return JuniorRCRightHalfBankedHelixDownSmallPaintSetup; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return JuniorRCLeftHalfBankedHelixUpLargePaintSetup; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return JuniorRCRightHalfBankedHelixUpLargePaintSetup; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return JuniorRCLeftHalfBankedHelixDownLargePaintSetup; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return JuniorRCRightHalfBankedHelixDownLargePaintSetup; - case TrackElemType::Brakes: + case TrackElemType::brakes: return JuniorRCBrakePaintSetup; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return JuniorRCLeftEighthToDiagPaintSetup; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return JuniorRCRightEighthToDiagPaintSetup; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return JuniorRCLeftEighthToOrthogonalPaintSetup; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return JuniorRCRightEighthToOrthogonalPaintSetup; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return JuniorRCLeftEighthToDiagBankPaintSetup; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return JuniorRCRightEighthToDiagBankPaintSetup; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return JuniorRCLeftEighthToOrthogonalBankPaintSetup; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return JuniorRCRightEighthToOrthogonalBankPaintSetup; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return JuniorRCPaintTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return JuniorRCPaintTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return JuniorRCPaintTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return JuniorRCPaintTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return JuniorRCPaintTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return JuniorRCPaintTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return JuniorRCPaintTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return JuniorRCPaintTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return JuniorRCPaintTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return JuniorRCPaintTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return JuniorRCPaintTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return JuniorRCPaintTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return JuniorRCPaintTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return JuniorRCDiagFlatToLeftBankPaintSetup; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return JuniorRCDiagFlatToRightBankPaintSetup; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return JuniorRCDiagLeftBankToFlatPaintSetup; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return JuniorRCDiagRightBankToFlatPaintSetup; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return JuniorRCDiagLeftBankTo25DegUpPaintSetup; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return JuniorRCDiagRightBankTo25DegUpPaintSetup; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return JuniorRCDiag25DegUpToLeftBankPaintSetup; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return JuniorRCDiag25DegUpToRightBankPaintSetup; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return JuniorRCDiagLeftBankTo25DegDownPaintSetup; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return JuniorRCDiagRightBankTo25DegDownPaintSetup; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return JuniorRCDiag25DegDownToLeftBankPaintSetup; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return JuniorRCDiag25DegDownToRightBankPaintSetup; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return JuniorRCDiagLeftBankPaintSetup; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return JuniorRCDiagRightBankPaintSetup; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return JuniorRCBlockBrakePaintSetup; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return JuniorRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return JuniorRCTrackDiagBlockBrakes; - case TrackElemType::Booster: + case TrackElemType::booster: return JuniorRCBoosterPaintSetup; - case TrackElemType::DiagDown60ToFlat: + case TrackElemType::diagDown60ToFlat: return JuniorRCPaintTrackDiag60DegDownToFlat; - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::diagUp60ToFlat: return JuniorRCPaintTrackDiag60DegUpToFlat; - case TrackElemType::DiagFlatToUp60: + case TrackElemType::diagFlatToUp60: return JuniorRCPaintTrackDiagFlatTo60DegUp; - case TrackElemType::DiagFlatToDown60: + case TrackElemType::diagFlatToDown60: return JuniorRCPaintTrackDiagFlatTo60DegDown; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return JuniorRCTrackOnRidePhoto; default: return TrackPaintFunctionDummy; } } -TrackPaintFunction GetTrackPaintFunctionJuniorRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionJuniorRC(TrackElemType trackType) { return GetTrackPaintFunctionJuniorRCTemplate(trackType); } -TrackPaintFunction GetTrackPaintFunctionWaterRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionWaterRC(TrackElemType trackType) { return GetTrackPaintFunctionJuniorRCTemplate(trackType); } diff --git a/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp b/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp index 68026a54ffa7..c68385f1bf22 100644 --- a/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp +++ b/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -182,7 +182,7 @@ static void LatticeTriangleTrackStation( 18085, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); PaintAddImageAsParentRotated( @@ -19556,514 +19556,514 @@ static void LatticeTriangleTrackRightEighthDiveLoopToDownOrthogonal( session, ride, 5 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionLatticeTriangleTrack(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionLatticeTriangleTrack(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return LatticeTriangleTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return LatticeTriangleTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return LatticeTriangleTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return LatticeTriangleTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return LatticeTriangleTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return LatticeTriangleTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return LatticeTriangleTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return LatticeTriangleTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return LatticeTriangleTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return LatticeTriangleTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return LatticeTriangleTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return LatticeTriangleTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return LatticeTriangleTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return LatticeTriangleTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return LatticeTriangleTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return LatticeTriangleTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return LatticeTriangleTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return LatticeTriangleTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return LatticeTriangleTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return LatticeTriangleTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return LatticeTriangleTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return LatticeTriangleTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return LatticeTriangleTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return LatticeTriangleTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return LatticeTriangleTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return LatticeTriangleTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return LatticeTriangleTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return LatticeTriangleTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return LatticeTriangleTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return LatticeTriangleTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return LatticeTriangleTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return LatticeTriangleTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return LatticeTriangleTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return LatticeTriangleTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return LatticeTriangleTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return LatticeTriangleTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return LatticeTriangleTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return LatticeTriangleTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return LatticeTriangleTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return LatticeTriangleTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return LatticeTriangleTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return LatticeTriangleTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return LatticeTriangleTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return LatticeTriangleTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return LatticeTriangleTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return LatticeTriangleTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return LatticeTriangleTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return LatticeTriangleTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return LatticeTriangleTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return LatticeTriangleTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return LatticeTriangleTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return LatticeTriangleTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return LatticeTriangleTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return LatticeTriangleTrackRightHalfBankedHelixDownLarge; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return LatticeTriangleTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return LatticeTriangleTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return LatticeTriangleTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return LatticeTriangleTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return LatticeTriangleTrackBrakes; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return LatticeTriangleTrack25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return LatticeTriangleTrack25DegUpRightBanked; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return LatticeTriangleTrackOnRidePhoto; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return LatticeTriangleTrack25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return LatticeTriangleTrack25DegDownRightBanked; - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return LatticeTriangleTrackFlatTo60DegUpLongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return LatticeTriangleTrack60DegUpToFlatLongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return LatticeTriangleTrack60DegDownToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return LatticeTriangleTrackFlatTo60DegDownLongBase; - case TrackElemType::CableLiftHill: + case TrackElemType::cableLiftHill: return LatticeTriangleTrackCableLiftHill; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return LatticeTriangleTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return LatticeTriangleTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return LatticeTriangleTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return LatticeTriangleTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return LatticeTriangleTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return LatticeTriangleTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return LatticeTriangleTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return LatticeTriangleTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return LatticeTriangleTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return LatticeTriangleTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return LatticeTriangleTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return LatticeTriangleTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return LatticeTriangleTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return LatticeTriangleTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return LatticeTriangleTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return LatticeTriangleTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return LatticeTriangleTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return LatticeTriangleTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return LatticeTriangleTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return LatticeTriangleTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return LatticeTriangleTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return LatticeTriangleTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return LatticeTriangleTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return LatticeTriangleTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return LatticeTriangleTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return LatticeTriangleTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return LatticeTriangleTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return LatticeTriangleTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return LatticeTriangleTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return LatticeTriangleTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return LatticeTriangleTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return LatticeTriangleTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return LatticeTriangleTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return LatticeTriangleTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return LatticeTriangleTrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return LatticeTriangleTrackBlockBrakes; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return LatticeTriangleTrackLeftBankedQuarterTurn325DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return LatticeTriangleTrackRightBankedQuarterTurn325DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return LatticeTriangleTrackLeftBankedQuarterTurn325DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return LatticeTriangleTrackRightBankedQuarterTurn325DegDown; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return LatticeTriangleTrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return LatticeTriangleTrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return LatticeTriangleTrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return LatticeTriangleTrackRightBankedQuarterTurn525DegDown; - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return LatticeTriangleTrack25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return LatticeTriangleTrack25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return LatticeTriangleTrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return LatticeTriangleTrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return LatticeTriangleTrack25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return LatticeTriangleTrack25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return LatticeTriangleTrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return LatticeTriangleTrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return LatticeTriangleTrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return LatticeTriangleTrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return LatticeTriangleTrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return LatticeTriangleTrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return LatticeTriangleTrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return LatticeTriangleTrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return LatticeTriangleTrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return LatticeTriangleTrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return LatticeTriangleTrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return LatticeTriangleTrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return LatticeTriangleTrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return LatticeTriangleTrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return LatticeTriangleTrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return LatticeTriangleTrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return LatticeTriangleTrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return LatticeTriangleTrackRightBanked25DegDownToFlat; - case TrackElemType::Booster: + case TrackElemType::booster: return LatticeTriangleTrackBooster; - case TrackElemType::PoweredLift: + case TrackElemType::poweredLift: return LatticeTriangleTrackPoweredLift; - case TrackElemType::Up90: + case TrackElemType::up90: return LatticeTriangleTrack90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return LatticeTriangleTrack90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return LatticeTriangleTrack60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return LatticeTriangleTrack90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return LatticeTriangleTrack90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return LatticeTriangleTrack60DegDownTo90DegDown; - case TrackElemType::LeftQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileUp90: return LatticeTriangleTrackLeftQuarterTurn190DegUp; - case TrackElemType::RightQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: return LatticeTriangleTrackRightQuarterTurn190DegUp; - case TrackElemType::LeftQuarterTurn1TileDown90: + case TrackElemType::leftQuarterTurn1TileDown90: return LatticeTriangleTrackLeftQuarterTurn190DegDown; - case TrackElemType::RightQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: return LatticeTriangleTrackRightQuarterTurn190DegDown; - case TrackElemType::LeftBarrelRollUpToDown: + case TrackElemType::leftBarrelRollUpToDown: return LatticeTriangleTrackLeftBarrelRollUpToDown; - case TrackElemType::RightBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: return LatticeTriangleTrackRightBarrelRollUpToDown; - case TrackElemType::LeftBarrelRollDownToUp: + case TrackElemType::leftBarrelRollDownToUp: return LatticeTriangleTrackLeftBarrelRollDownToUp; - case TrackElemType::RightBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: return LatticeTriangleTrackRightBarrelRollDownToUp; - case TrackElemType::HalfLoopUp: + case TrackElemType::halfLoopUp: return LatticeTriangleTrackHalfLoopUp; - case TrackElemType::HalfLoopDown: + case TrackElemType::halfLoopDown: return LatticeTriangleTrackHalfLoopDown; - case TrackElemType::LeftVerticalLoop: + case TrackElemType::leftVerticalLoop: return LatticeTriangleTrackLeftVerticalLoop; - case TrackElemType::RightVerticalLoop: + case TrackElemType::rightVerticalLoop: return LatticeTriangleTrackRightVerticalLoop; - case TrackElemType::LeftCorkscrewUp: + case TrackElemType::leftCorkscrewUp: return LatticeTriangleTrackLeftCorkscrewUp; - case TrackElemType::RightCorkscrewUp: + case TrackElemType::rightCorkscrewUp: return LatticeTriangleTrackRightCorkscrewUp; - case TrackElemType::LeftCorkscrewDown: + case TrackElemType::leftCorkscrewDown: return LatticeTriangleTrackLeftCorkscrewDown; - case TrackElemType::RightCorkscrewDown: + case TrackElemType::rightCorkscrewDown: return LatticeTriangleTrackRightCorkscrewDown; - case TrackElemType::LeftLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewUp: return LatticeTriangleTrackLeftLargeCorkscrewUp; - case TrackElemType::RightLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: return LatticeTriangleTrackRightLargeCorkscrewUp; - case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::leftLargeCorkscrewDown: return LatticeTriangleTrackLeftLargeCorkscrewDown; - case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: return LatticeTriangleTrackRightLargeCorkscrewDown; - case TrackElemType::LeftZeroGRollUp: + case TrackElemType::leftZeroGRollUp: return LatticeTriangleTrackLeftZeroGRollUp; - case TrackElemType::RightZeroGRollUp: + case TrackElemType::rightZeroGRollUp: return LatticeTriangleTrackRightZeroGRollUp; - case TrackElemType::LeftZeroGRollDown: + case TrackElemType::leftZeroGRollDown: return LatticeTriangleTrackLeftZeroGRollDown; - case TrackElemType::RightZeroGRollDown: + case TrackElemType::rightZeroGRollDown: return LatticeTriangleTrackRightZeroGRollDown; - case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollUp: return LatticeTriangleTrackLeftLargeZeroGRollUp; - case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: return LatticeTriangleTrackRightLargeZeroGRollUp; - case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::leftLargeZeroGRollDown: return LatticeTriangleTrackLeftLargeZeroGRollDown; - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return LatticeTriangleTrackRightLargeZeroGRollDown; - case TrackElemType::LeftEighthDiveLoopUpToOrthogonal: + case TrackElemType::leftEighthDiveLoopUpToOrthogonal: return LatticeTriangleTrackLeftEighthDiveLoopUpToOrthogonal; - case TrackElemType::RightEighthDiveLoopUpToOrthogonal: + case TrackElemType::rightEighthDiveLoopUpToOrthogonal: return LatticeTriangleTrackRightEighthDiveLoopUpToOrthogonal; - case TrackElemType::LeftEighthDiveLoopDownToDiag: + case TrackElemType::leftEighthDiveLoopDownToDiag: return LatticeTriangleTrackLeftEighthDiveLoopDownToDiag; - case TrackElemType::RightEighthDiveLoopDownToDiag: + case TrackElemType::rightEighthDiveLoopDownToDiag: return LatticeTriangleTrackRightEighthDiveLoopToDownOrthogonal; - case TrackElemType::Up90ToInvertedFlatQuarterLoop: + case TrackElemType::up90ToInvertedFlatQuarterLoop: return LatticeTriangleTrack90DegToInvertedFlatQuarterLoopUp; - case TrackElemType::InvertedFlatToDown90QuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: return LatticeTriangleTrackInvertedFlatTo90DegQuarterLoopDown; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return LatticeTriangleTrackLeftBankToLeftQuarterTurn3Tile25DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return LatticeTriangleTrackRightBankToRightQuarterTurn3Tile25DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return LatticeTriangleTrackLeftQuarterTurn3Tile25DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return LatticeTriangleTrackRightQuarterTurn3Tile25DegDownToRightBank; - case TrackElemType::LeftMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopUp: return LatticeTriangleTrackLeftMediumHalfLoopUp; - case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: return LatticeTriangleTrackRightMediumHalfLoopUp; - case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::leftMediumHalfLoopDown: return LatticeTriangleTrackLeftMediumHalfLoopDown; - case TrackElemType::RightMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: return LatticeTriangleTrackRightMediumHalfLoopDown; - case TrackElemType::LeftLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopUp: return LatticeTriangleTrackLeftLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: return LatticeTriangleTrackRightLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return LatticeTriangleTrackRightLargeHalfLoopDown; - case TrackElemType::LeftLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: return LatticeTriangleTrackLeftLargeHalfLoopDown; - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return LatticeTriangleTrackFlatTo60DegUp; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return LatticeTriangleTrack60DegUpToFlat; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return LatticeTriangleTrackFlatTo60DegDown; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return LatticeTriangleTrack60DegDownToFlat; - case TrackElemType::DiagFlatToUp60: + case TrackElemType::diagFlatToUp60: return LatticeTriangleTrackDiagFlatTo60DegUp; - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::diagUp60ToFlat: return LatticeTriangleTrackDiag60DegUpToFlat; - case TrackElemType::DiagFlatToDown60: + case TrackElemType::diagFlatToDown60: return LatticeTriangleTrackDiagFlatTo60DegDown; - case TrackElemType::DiagDown60ToFlat: + case TrackElemType::diagDown60ToFlat: return LatticeTriangleTrackDiag60DegDownToFlat; - case TrackElemType::DiagFlatToUp60LongBase: + case TrackElemType::diagFlatToUp60LongBase: return LatticeTriangleTrackDiagFlatTo60DegUpLongBase; - case TrackElemType::DiagUp60ToFlatLongBase: + case TrackElemType::diagUp60ToFlatLongBase: return LatticeTriangleTrackDiag60DegUpToFlatLongBase; - case TrackElemType::DiagFlatToDown60LongBase: + case TrackElemType::diagFlatToDown60LongBase: return LatticeTriangleTrackDiagFlatTo60DegDownLongBase; - case TrackElemType::DiagDown60ToFlatLongBase: + case TrackElemType::diagDown60ToFlatLongBase: return LatticeTriangleTrackDiag60DegDownToFlatLongBase; - case TrackElemType::LeftEighthToDiagUp25: + case TrackElemType::leftEighthToDiagUp25: return LatticeTriangleTrackLeftEighthToDiagUp25; - case TrackElemType::RightEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: return LatticeTriangleTrackRightEighthToDiagUp25; - case TrackElemType::LeftEighthToDiagDown25: + case TrackElemType::leftEighthToDiagDown25: return LatticeTriangleTrackLeftEighthToDiagDown25; - case TrackElemType::RightEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: return LatticeTriangleTrackRightEighthToDiagDown25; - case TrackElemType::LeftEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalUp25: return LatticeTriangleTrackLeftEighthToOrthogonalUp25; - case TrackElemType::RightEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: return LatticeTriangleTrackRightEighthToOrthogonalUp25; - case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::leftEighthToOrthogonalDown25: return LatticeTriangleTrackLeftEighthToOrthogonalDown25; - case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: return LatticeTriangleTrackRightEighthToOrthogonalDown25; - case TrackElemType::DiagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToLeftBankedUp25: return LatticeTriangleTrackDiagUp25ToLeftBankedUp25; - case TrackElemType::DiagUp25ToRightBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: return LatticeTriangleTrackDiagUp25ToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: return LatticeTriangleTrackDiagLeftBankedUp25ToUp25; - case TrackElemType::DiagRightBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: return LatticeTriangleTrackDiagRightBankedUp25ToUp25; - case TrackElemType::DiagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToLeftBankedDown25: return LatticeTriangleTrackDiagDown25ToLeftBankedDown25; - case TrackElemType::DiagDown25ToRightBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: return LatticeTriangleTrackDiagDown25ToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: return LatticeTriangleTrackDiagLeftBankedDown25ToDown25; - case TrackElemType::DiagRightBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: return LatticeTriangleTrackDiagRightBankedDown25ToDown25; - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: return LatticeTriangleTrackDiagLeftBankedFlatToLeftBankedUp25; - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: return LatticeTriangleTrackDiagRightBankedFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: return LatticeTriangleTrackDiagLeftBankedUp25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: return LatticeTriangleTrackDiagRightBankedUp25ToRightBankedFlat; - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: return LatticeTriangleTrackDiagLeftBankedFlatToLeftBankedDown25; - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: return LatticeTriangleTrackDiagRightBankedFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: return LatticeTriangleTrackDiagLeftBankedDown25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: return LatticeTriangleTrackDiagRightBankedDown25ToRightBankedFlat; - case TrackElemType::DiagUp25LeftBanked: + case TrackElemType::diagUp25LeftBanked: return LatticeTriangleTrackDiagUp25LeftBanked; - case TrackElemType::DiagUp25RightBanked: + case TrackElemType::diagUp25RightBanked: return LatticeTriangleTrackDiagUp25RightBanked; - case TrackElemType::DiagDown25LeftBanked: + case TrackElemType::diagDown25LeftBanked: return LatticeTriangleTrackDiagDown25LeftBanked; - case TrackElemType::DiagDown25RightBanked: + case TrackElemType::diagDown25RightBanked: return LatticeTriangleTrackDiagDown25RightBanked; - case TrackElemType::DiagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToLeftBankedUp25: return LatticeTriangleTrackDiagFlatToLeftBankedUp25; - case TrackElemType::DiagFlatToRightBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: return LatticeTriangleTrackDiagFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToFlat: + case TrackElemType::diagLeftBankedUp25ToFlat: return LatticeTriangleTrackDiagLeftBankedUp25ToFlat; - case TrackElemType::DiagRightBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: return LatticeTriangleTrackDiagRightBankedUp25ToFlat; - case TrackElemType::DiagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToLeftBankedDown25: return LatticeTriangleTrackDiagFlatToLeftBankedDown25; - case TrackElemType::DiagFlatToRightBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: return LatticeTriangleTrackDiagFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToFlat: + case TrackElemType::diagLeftBankedDown25ToFlat: return LatticeTriangleTrackDiagLeftBankedDown25ToFlat; - case TrackElemType::DiagRightBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: return LatticeTriangleTrackDiagRightBankedDown25ToFlat; - case TrackElemType::LeftEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagUp25: return LatticeTriangleTrackLeftEighthBankToDiagUp25; - case TrackElemType::RightEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: return LatticeTriangleTrackRightEighthBankToDiagUp25; - case TrackElemType::LeftEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToDiagDown25: return LatticeTriangleTrackLeftEighthBankToDiagDown25; - case TrackElemType::RightEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: return LatticeTriangleTrackRightEighthBankToDiagDown25; - case TrackElemType::LeftEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalUp25: return LatticeTriangleTrackLeftEighthBankToOrthogonalUp25; - case TrackElemType::RightEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: return LatticeTriangleTrackRightEighthBankToOrthogonalUp25; - case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::leftEighthBankToOrthogonalDown25: return LatticeTriangleTrackLeftEighthBankToOrthogonalDown25; - case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: return LatticeTriangleTrackRightEighthBankToOrthogonalDown25; - case TrackElemType::DiagBlockBrakes: - case TrackElemType::DiagBrakes: + case TrackElemType::diagBlockBrakes: + case TrackElemType::diagBrakes: return LatticeTriangleTrackDiagBrakes; - case TrackElemType::DiagBooster: + case TrackElemType::diagBooster: return LatticeTriangleTrackDiagBooster; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp b/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp index 06a21d391495..422118876dfa 100644 --- a/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp +++ b/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -69,7 +69,7 @@ static void LatticeTriangleTrackAltStation( SPR_TRACKS_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_SW_NE, SPR_TRACKS_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_SE_NW, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); PaintAddImageAsParentRotated( @@ -258,23 +258,23 @@ TrackPaintFunction GetTrackPaintFunctionLatticeTriangleTrackAlt(TrackElemType tr { switch (trackType) { - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return LatticeTriangleTrackAltStation; - case TrackElemType::Brakes: + case TrackElemType::brakes: return LatticeTriangleTrackAltBrakes; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return LatticeTriangleTrackAltBlockBrakes; - case TrackElemType::Booster: + case TrackElemType::booster: return LatticeTriangleTrackAltBooster; - case TrackElemType::PoweredLift: + case TrackElemType::poweredLift: return LatticeTriangleTrackAltPoweredLift; - case TrackElemType::DiagBooster: + case TrackElemType::diagBooster: return LatticeTriangleTrackAltDiagBooster; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return LatticeTriangleTrackAltDiagBlockBrake; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return LatticeTriangleTrackAltDiagBrake; default: diff --git a/src/openrct2/paint/track/coaster/LayDownRollerCoasterInverted.cpp b/src/openrct2/paint/track/coaster/LayDownRollerCoasterInverted.cpp index eb8b2c8efad8..27a778b646dd 100644 --- a/src/openrct2/paint/track/coaster/LayDownRollerCoasterInverted.cpp +++ b/src/openrct2/paint/track/coaster/LayDownRollerCoasterInverted.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -7157,7 +7157,7 @@ static void LayDownRCTrackRightFlyerCorkscrewDown( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - auto function = GetTrackPaintFunctionCorkscrewRC(TrackElemType::LeftFlyerCorkscrewUp); + auto function = GetTrackPaintFunctionCorkscrewRC(TrackElemType::leftFlyerCorkscrewUp); function(session, ride, 2 - trackSequence, (direction + 3) % 4, height, trackElement, supportType); return; } @@ -8165,212 +8165,212 @@ static void LayDownRCTrackHalfLoopInvertedUp( } } -TrackPaintFunction GetTrackPaintFunctionLayDownRCInverted(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionLayDownRCInverted(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return LayDownRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return LayDownRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return LayDownRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return LayDownRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return LayDownRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return LayDownRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return LayDownRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return LayDownRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return LayDownRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return LayDownRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return LayDownRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return LayDownRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return LayDownRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return LayDownRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return LayDownRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return LayDownRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return LayDownRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return LayDownRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return LayDownRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return LayDownRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return LayDownRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return LayDownRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return LayDownRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return LayDownRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return LayDownRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return LayDownRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return LayDownRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return LayDownRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return LayDownRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return LayDownRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return LayDownRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return LayDownRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return LayDownRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return LayDownRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return LayDownRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return LayDownRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return LayDownRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return LayDownRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return LayDownRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return LayDownRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return LayDownRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return LayDownRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return LayDownRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return LayDownRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return LayDownRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return LayDownRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return LayDownRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return LayDownRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return LayDownRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return LayDownRCTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return LayDownRCTrackBrakes; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return LayDownRCTrackOnRidePhoto; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return LayDownRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return LayDownRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return LayDownRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return LayDownRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return LayDownRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return LayDownRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return LayDownRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return LayDownRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return LayDownRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return LayDownRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return LayDownRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return LayDownRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return LayDownRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return LayDownRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return LayDownRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return LayDownRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return LayDownRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return LayDownRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return LayDownRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return LayDownRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return LayDownRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return LayDownRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return LayDownRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return LayDownRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return LayDownRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return LayDownRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return LayDownRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return LayDownRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return LayDownRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return LayDownRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return LayDownRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return LayDownRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return LayDownRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return LayDownRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return LayDownRCTrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return LayDownRCTrackBlockBrakes; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return LayDownRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return LayDownRCTrackDiagBlockBrakes; - case TrackElemType::LeftFlyerTwistDown: + case TrackElemType::leftFlyerTwistDown: return LayDownRCTrackLeftFlyerTwistDown; - case TrackElemType::RightFlyerTwistDown: + case TrackElemType::rightFlyerTwistDown: return LayDownRCTrackRightFlyerTwistDown; - case TrackElemType::FlyerHalfLoopInvertedDown: + case TrackElemType::flyerHalfLoopInvertedDown: return LayDownRCTrackFlyerHalfLoopDown; - case TrackElemType::LeftFlyerCorkscrewDown: + case TrackElemType::leftFlyerCorkscrewDown: return LayDownRCTrackLeftFlyerCorkscrewDown; - case TrackElemType::RightFlyerCorkscrewDown: + case TrackElemType::rightFlyerCorkscrewDown: return LayDownRCTrackRightFlyerCorkscrewDown; - case TrackElemType::LeftQuarterBankedHelixLargeUp: + case TrackElemType::leftQuarterBankedHelixLargeUp: return LayDownRCTrackLeftQuarterBankedHelixLargeUp; - case TrackElemType::RightQuarterBankedHelixLargeUp: + case TrackElemType::rightQuarterBankedHelixLargeUp: return LayDownRCTrackRightQuarterBankedHelixLargeUp; - case TrackElemType::LeftQuarterBankedHelixLargeDown: + case TrackElemType::leftQuarterBankedHelixLargeDown: return LayDownRCTrackLeftQuarterBankedHelixLargeDown; - case TrackElemType::RightQuarterBankedHelixLargeDown: + case TrackElemType::rightQuarterBankedHelixLargeDown: return LayDownRCTrackRightQuarterBankedHelixLargeDown; - case TrackElemType::FlyerHalfLoopInvertedUp: + case TrackElemType::flyerHalfLoopInvertedUp: return LayDownRCTrackHalfLoopInvertedUp; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/LimLaunchedRollerCoaster.cpp b/src/openrct2/paint/track/coaster/LimLaunchedRollerCoaster.cpp index c5056053119d..03792a6de675 100644 --- a/src/openrct2/paint/track/coaster/LimLaunchedRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/LimLaunchedRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -49,7 +49,7 @@ static void LimLaunchedRCTrackStation( 15019, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); PaintAddImageAsParentRotated( @@ -5772,278 +5772,278 @@ static void LimLaunchedRCTrackBooster( PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } -TrackPaintFunction GetTrackPaintFunctionLimLaunchedRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionLimLaunchedRC(TrackElemType trackType) { switch (trackType) { // Use Looping Roller Coaster - case TrackElemType::Flat: - case TrackElemType::Up25: - case TrackElemType::Up60: - case TrackElemType::FlatToUp25: - case TrackElemType::Up25ToUp60: - case TrackElemType::Up60ToUp25: - case TrackElemType::Up25ToFlat: - case TrackElemType::Down25: - case TrackElemType::Down60: - case TrackElemType::FlatToDown25: - case TrackElemType::Down25ToDown60: - case TrackElemType::Down60ToDown25: - case TrackElemType::Down25ToFlat: - case TrackElemType::LeftQuarterTurn5Tiles: - case TrackElemType::RightQuarterTurn5Tiles: - case TrackElemType::FlatToLeftBank: - case TrackElemType::FlatToRightBank: - case TrackElemType::LeftBankToFlat: - case TrackElemType::RightBankToFlat: - case TrackElemType::BankedLeftQuarterTurn5Tiles: - case TrackElemType::BankedRightQuarterTurn5Tiles: - case TrackElemType::LeftBankToUp25: - case TrackElemType::RightBankToUp25: - case TrackElemType::Up25ToLeftBank: - case TrackElemType::Up25ToRightBank: - case TrackElemType::LeftBankToDown25: - case TrackElemType::RightBankToDown25: - case TrackElemType::Down25ToLeftBank: - case TrackElemType::Down25ToRightBank: - case TrackElemType::LeftBank: - case TrackElemType::RightBank: - case TrackElemType::LeftQuarterTurn5TilesUp25: - case TrackElemType::RightQuarterTurn5TilesUp25: - case TrackElemType::LeftQuarterTurn5TilesDown25: - case TrackElemType::RightQuarterTurn5TilesDown25: - case TrackElemType::SBendLeft: - case TrackElemType::SBendRight: - case TrackElemType::LeftQuarterTurn3Tiles: - case TrackElemType::RightQuarterTurn3Tiles: - case TrackElemType::LeftBankedQuarterTurn3Tiles: - case TrackElemType::RightBankedQuarterTurn3Tiles: - case TrackElemType::LeftQuarterTurn3TilesUp25: - case TrackElemType::RightQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25: - case TrackElemType::RightQuarterTurn3TilesDown25: - case TrackElemType::LeftHalfBankedHelixUpSmall: - case TrackElemType::RightHalfBankedHelixUpSmall: - case TrackElemType::LeftHalfBankedHelixDownSmall: - case TrackElemType::RightHalfBankedHelixDownSmall: - case TrackElemType::LeftHalfBankedHelixUpLarge: - case TrackElemType::RightHalfBankedHelixUpLarge: - case TrackElemType::LeftHalfBankedHelixDownLarge: - case TrackElemType::RightHalfBankedHelixDownLarge: - case TrackElemType::LeftQuarterTurn1TileUp60: - case TrackElemType::RightQuarterTurn1TileUp60: - case TrackElemType::LeftQuarterTurn1TileDown60: - case TrackElemType::RightQuarterTurn1TileDown60: - case TrackElemType::Up25LeftBanked: - case TrackElemType::Up25RightBanked: - case TrackElemType::OnRidePhoto: - case TrackElemType::Down25LeftBanked: - case TrackElemType::Down25RightBanked: - case TrackElemType::LeftEighthToDiag: - case TrackElemType::RightEighthToDiag: - case TrackElemType::LeftEighthToOrthogonal: - case TrackElemType::RightEighthToOrthogonal: - case TrackElemType::LeftEighthBankToDiag: - case TrackElemType::RightEighthBankToDiag: - case TrackElemType::LeftEighthBankToOrthogonal: - case TrackElemType::RightEighthBankToOrthogonal: - case TrackElemType::DiagFlat: - case TrackElemType::DiagUp25: - case TrackElemType::DiagUp60: - case TrackElemType::DiagFlatToUp25: - case TrackElemType::DiagUp25ToUp60: - case TrackElemType::DiagUp60ToUp25: - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagDown25: - case TrackElemType::DiagDown60: - case TrackElemType::DiagFlatToDown25: - case TrackElemType::DiagDown25ToDown60: - case TrackElemType::DiagDown60ToDown25: - case TrackElemType::DiagDown25ToFlat: - case TrackElemType::DiagFlatToLeftBank: - case TrackElemType::DiagFlatToRightBank: - case TrackElemType::DiagLeftBankToFlat: - case TrackElemType::DiagRightBankToFlat: - case TrackElemType::DiagLeftBankToUp25: - case TrackElemType::DiagRightBankToUp25: - case TrackElemType::DiagUp25ToLeftBank: - case TrackElemType::DiagUp25ToRightBank: - case TrackElemType::DiagLeftBankToDown25: - case TrackElemType::DiagRightBankToDown25: - case TrackElemType::DiagDown25ToLeftBank: - case TrackElemType::DiagDown25ToRightBank: - case TrackElemType::DiagLeftBank: - case TrackElemType::DiagRightBank: - case TrackElemType::LeftBankedQuarterTurn3TileUp25: - case TrackElemType::RightBankedQuarterTurn3TileUp25: - case TrackElemType::LeftBankedQuarterTurn3TileDown25: - case TrackElemType::RightBankedQuarterTurn3TileDown25: - case TrackElemType::LeftBankedQuarterTurn5TileUp25: - case TrackElemType::RightBankedQuarterTurn5TileUp25: - case TrackElemType::LeftBankedQuarterTurn5TileDown25: - case TrackElemType::RightBankedQuarterTurn5TileDown25: - case TrackElemType::Up25ToLeftBankedUp25: - case TrackElemType::Up25ToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToUp25: - case TrackElemType::RightBankedUp25ToUp25: - case TrackElemType::Down25ToLeftBankedDown25: - case TrackElemType::Down25ToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToDown25: - case TrackElemType::RightBankedDown25ToDown25: - case TrackElemType::LeftBankedFlatToLeftBankedUp25: - case TrackElemType::RightBankedFlatToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: - case TrackElemType::RightBankedUp25ToRightBankedFlat: - case TrackElemType::LeftBankedFlatToLeftBankedDown25: - case TrackElemType::RightBankedFlatToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: - case TrackElemType::RightBankedDown25ToRightBankedFlat: - case TrackElemType::FlatToLeftBankedUp25: - case TrackElemType::FlatToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToFlat: - case TrackElemType::RightBankedUp25ToFlat: - case TrackElemType::FlatToLeftBankedDown25: - case TrackElemType::FlatToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToFlat: - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::flat: + case TrackElemType::up25: + case TrackElemType::up60: + case TrackElemType::flatToUp25: + case TrackElemType::up25ToUp60: + case TrackElemType::up60ToUp25: + case TrackElemType::up25ToFlat: + case TrackElemType::down25: + case TrackElemType::down60: + case TrackElemType::flatToDown25: + case TrackElemType::down25ToDown60: + case TrackElemType::down60ToDown25: + case TrackElemType::down25ToFlat: + case TrackElemType::leftQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: + case TrackElemType::flatToLeftBank: + case TrackElemType::flatToRightBank: + case TrackElemType::leftBankToFlat: + case TrackElemType::rightBankToFlat: + case TrackElemType::bankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: + case TrackElemType::leftBankToUp25: + case TrackElemType::rightBankToUp25: + case TrackElemType::up25ToLeftBank: + case TrackElemType::up25ToRightBank: + case TrackElemType::leftBankToDown25: + case TrackElemType::rightBankToDown25: + case TrackElemType::down25ToLeftBank: + case TrackElemType::down25ToRightBank: + case TrackElemType::leftBank: + case TrackElemType::rightBank: + case TrackElemType::leftQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: + case TrackElemType::sBendLeft: + case TrackElemType::sBendRight: + case TrackElemType::leftQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: + case TrackElemType::leftHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: + case TrackElemType::leftQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: + case TrackElemType::up25LeftBanked: + case TrackElemType::up25RightBanked: + case TrackElemType::onRidePhoto: + case TrackElemType::down25LeftBanked: + case TrackElemType::down25RightBanked: + case TrackElemType::leftEighthToDiag: + case TrackElemType::rightEighthToDiag: + case TrackElemType::leftEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: + case TrackElemType::leftEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: + case TrackElemType::leftEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: + case TrackElemType::diagFlat: + case TrackElemType::diagUp25: + case TrackElemType::diagUp60: + case TrackElemType::diagFlatToUp25: + case TrackElemType::diagUp25ToUp60: + case TrackElemType::diagUp60ToUp25: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagDown25: + case TrackElemType::diagDown60: + case TrackElemType::diagFlatToDown25: + case TrackElemType::diagDown25ToDown60: + case TrackElemType::diagDown60ToDown25: + case TrackElemType::diagDown25ToFlat: + case TrackElemType::diagFlatToLeftBank: + case TrackElemType::diagFlatToRightBank: + case TrackElemType::diagLeftBankToFlat: + case TrackElemType::diagRightBankToFlat: + case TrackElemType::diagLeftBankToUp25: + case TrackElemType::diagRightBankToUp25: + case TrackElemType::diagUp25ToLeftBank: + case TrackElemType::diagUp25ToRightBank: + case TrackElemType::diagLeftBankToDown25: + case TrackElemType::diagRightBankToDown25: + case TrackElemType::diagDown25ToLeftBank: + case TrackElemType::diagDown25ToRightBank: + case TrackElemType::diagLeftBank: + case TrackElemType::diagRightBank: + case TrackElemType::leftBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: + case TrackElemType::up25ToLeftBankedUp25: + case TrackElemType::up25ToRightBankedUp25: + case TrackElemType::leftBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: + case TrackElemType::down25ToLeftBankedDown25: + case TrackElemType::down25ToRightBankedDown25: + case TrackElemType::leftBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: + case TrackElemType::leftBankedFlatToLeftBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: + case TrackElemType::flatToLeftBankedUp25: + case TrackElemType::flatToRightBankedUp25: + case TrackElemType::leftBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: + case TrackElemType::flatToLeftBankedDown25: + case TrackElemType::flatToRightBankedDown25: + case TrackElemType::leftBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return GetTrackPaintFunctionLoopingRC(trackType); - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return LimLaunchedRCTrackStation; - case TrackElemType::LeftVerticalLoop: + case TrackElemType::leftVerticalLoop: return LimLaunchedRCTrackLeftVerticalLoop; - case TrackElemType::RightVerticalLoop: + case TrackElemType::rightVerticalLoop: return LimLaunchedRCTrackRightVerticalLoop; - case TrackElemType::LeftTwistDownToUp: + case TrackElemType::leftTwistDownToUp: return LimLaunchedRCTrackLeftTwistDownToUp; - case TrackElemType::RightTwistDownToUp: + case TrackElemType::rightTwistDownToUp: return LimLaunchedRCTrackRightTwistDownToUp; - case TrackElemType::LeftTwistUpToDown: + case TrackElemType::leftTwistUpToDown: return LimLaunchedRCTrackLeftTwistUpToDown; - case TrackElemType::RightTwistUpToDown: + case TrackElemType::rightTwistUpToDown: return LimLaunchedRCTrackRightTwistUpToDown; - case TrackElemType::LeftCorkscrewUp: + case TrackElemType::leftCorkscrewUp: return LimLaunchedRCTrackLeftCorkscrewUp; - case TrackElemType::RightCorkscrewUp: + case TrackElemType::rightCorkscrewUp: return LimLaunchedRCTrackRightCorkscrewUp; - case TrackElemType::LeftCorkscrewDown: + case TrackElemType::leftCorkscrewDown: return LimLaunchedRCTrackLeftCorkscrewDown; - case TrackElemType::RightCorkscrewDown: + case TrackElemType::rightCorkscrewDown: return LimLaunchedRCTrackRightCorkscrewDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return LimLaunchedRCTrackBrakes; - case TrackElemType::Up90: + case TrackElemType::up90: return LimLaunchedRCTrack90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return LimLaunchedRCTrack90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return LimLaunchedRCTrack60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return LimLaunchedRCTrack90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return LimLaunchedRCTrack90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return LimLaunchedRCTrack60DegDownTo90DegDown; - case TrackElemType::Up90ToInvertedFlatQuarterLoop: + case TrackElemType::up90ToInvertedFlatQuarterLoop: return LimLaunchedRCTrack90DegToInvertedFlatQuarterLoopUp; - case TrackElemType::InvertedFlatToDown90QuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: return LimLaunchedRCTrackInvertedFlatTo90DegQuarterLoopDown; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return LimLaunchedRCTrackBlockBrakes; - case TrackElemType::LeftQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileUp90: return LimLaunchedRCTrackLeftQuarterTurn190DegUp; - case TrackElemType::RightQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: return LimLaunchedRCTrackRightQuarterTurn190DegUp; - case TrackElemType::LeftQuarterTurn1TileDown90: + case TrackElemType::leftQuarterTurn1TileDown90: return LimLaunchedRCTrackLeftQuarterTurn190DegDown; - case TrackElemType::RightQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: return LimLaunchedRCTrackRightQuarterTurn190DegDown; - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return LimLaunchedRCTrackFlatTo60DegUpLongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return LimLaunchedRCTrack60DegUpToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return LimLaunchedRCTrackFlatTo60DegDownLongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return LimLaunchedRCTrack60DegDownToFlatLongBase; - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return LimLaunchedRCTrackFlatTo60DegUp; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return LimLaunchedRCTrack60DegUpToFlat; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return LimLaunchedRCTrackFlatTo60DegDown; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return LimLaunchedRCTrack60DegDownToFlat; - case TrackElemType::DiagFlatToUp60: + case TrackElemType::diagFlatToUp60: return LimLaunchedRCTrackDiagFlatTo60DegUp; - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::diagUp60ToFlat: return LimLaunchedRCTrackDiag60DegUpToFlat; - case TrackElemType::DiagFlatToDown60: + case TrackElemType::diagFlatToDown60: return LimLaunchedRCTrackDiagFlatTo60DegDown; - case TrackElemType::DiagDown60ToFlat: + case TrackElemType::diagDown60ToFlat: return LimLaunchedRCTrackDiag60DegDownToFlat; - case TrackElemType::LeftBarrelRollUpToDown: + case TrackElemType::leftBarrelRollUpToDown: return LimLaunchedRCTrackLeftBarrelRollUpToDown; - case TrackElemType::RightBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: return LimLaunchedRCTrackRightBarrelRollUpToDown; - case TrackElemType::LeftBarrelRollDownToUp: + case TrackElemType::leftBarrelRollDownToUp: return LimLaunchedRCTrackLeftBarrelRollDownToUp; - case TrackElemType::RightBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: return LimLaunchedRCTrackRightBarrelRollDownToUp; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return LimLaunchedRCTrackLeftBankToLeftQuarterTurn325DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return LimLaunchedRCTrackRightBankToRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return LimLaunchedRCTrackLeftQuarterTurn325DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return LimLaunchedRCTrackRightQuarterTurn325DegDownToRightBank; - case TrackElemType::HalfLoopUp: + case TrackElemType::halfLoopUp: return LimLaunchedRCTrackHalfLoopUp; - case TrackElemType::HalfLoopDown: + case TrackElemType::halfLoopDown: return LimLaunchedRCTrackHalfLoopDown; - case TrackElemType::LeftMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopUp: return LimLaunchedRCTrackLeftMediumHalfLoopUp; - case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: return LimLaunchedRCTrackRightMediumHalfLoopUp; - case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::leftMediumHalfLoopDown: return LimLaunchedRCTrackLeftMediumHalfLoopDown; - case TrackElemType::RightMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: return LimLaunchedRCTrackRightMediumHalfLoopDown; - case TrackElemType::LeftLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopUp: return LimLaunchedRCTrackLeftLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: return LimLaunchedRCTrackRightLargeHalfLoopUp; - case TrackElemType::LeftLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: return LimLaunchedRCTrackLeftLargeHalfLoopDown; - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return LimLaunchedRCTrackRightLargeHalfLoopDown; - case TrackElemType::LeftLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewUp: return LimLaunchedRCTrackLeftLargeCorkscrewUp; - case TrackElemType::RightLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: return LimLaunchedRCTrackRightLargeCorkscrewUp; - case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::leftLargeCorkscrewDown: return LimLaunchedRCTrackLeftLargeCorkscrewDown; - case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: return LimLaunchedRCTrackRightLargeCorkscrewDown; - case TrackElemType::LeftZeroGRollUp: + case TrackElemType::leftZeroGRollUp: return LimLaunchedRCTrackLeftZeroGRollUp; - case TrackElemType::RightZeroGRollUp: + case TrackElemType::rightZeroGRollUp: return LimLaunchedRCTrackRightZeroGRollUp; - case TrackElemType::LeftZeroGRollDown: + case TrackElemType::leftZeroGRollDown: return LimLaunchedRCTrackLeftZeroGRollDown; - case TrackElemType::RightZeroGRollDown: + case TrackElemType::rightZeroGRollDown: return LimLaunchedRCTrackRightZeroGRollDown; - case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollUp: return LimLaunchedRCTrackLeftLargeZeroGRollUp; - case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: return LimLaunchedRCTrackRightLargeZeroGRollUp; - case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::leftLargeZeroGRollDown: return LimLaunchedRCTrackLeftLargeZeroGRollDown; - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return LimLaunchedRCTrackRightLargeZeroGRollDown; - case TrackElemType::Booster: + case TrackElemType::booster: return LimLaunchedRCTrackBooster; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/LoopingRollerCoaster.cpp b/src/openrct2/paint/track/coaster/LoopingRollerCoaster.cpp index d11b91e68506..37ea9ae90a59 100644 --- a/src/openrct2/paint/track/coaster/LoopingRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/LoopingRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10307,286 +10307,286 @@ static void LoopingRCTrackBooster( PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } -TrackPaintFunction GetTrackPaintFunctionLoopingRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionLoopingRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return LoopingRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return LoopingRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return LoopingRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return LoopingRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return LoopingRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return LoopingRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return LoopingRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return LoopingRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return LoopingRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return LoopingRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return LoopingRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return LoopingRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return LoopingRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return LoopingRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return LoopingRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return LoopingRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return LoopingRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return LoopingRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return LoopingRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return LoopingRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return LoopingRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return LoopingRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return LoopingRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return LoopingRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return LoopingRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return LoopingRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return LoopingRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return LoopingRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return LoopingRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return LoopingRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return LoopingRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return LoopingRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return LoopingRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return LoopingRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return LoopingRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return LoopingRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return LoopingRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return LoopingRCTrackSBendRight; - case TrackElemType::LeftVerticalLoop: + case TrackElemType::leftVerticalLoop: return LoopingRCTrackLeftVerticalLoop; - case TrackElemType::RightVerticalLoop: + case TrackElemType::rightVerticalLoop: return LoopingRCTrackRightVerticalLoop; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return LoopingRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return LoopingRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return LoopingRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return LoopingRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return LoopingRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return LoopingRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return LoopingRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return LoopingRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return LoopingRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return LoopingRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return LoopingRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return LoopingRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return LoopingRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return LoopingRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return LoopingRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return LoopingRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return LoopingRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return LoopingRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return LoopingRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return LoopingRCTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return LoopingRCTrackBrakes; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return LoopingRCTrack25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return LoopingRCTrack25DegUpRightBanked; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return LoopingRCTrackOnRidePhoto; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return LoopingRCTrack25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return LoopingRCTrack25DegDownRightBanked; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return LoopingRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return LoopingRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return LoopingRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return LoopingRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return LoopingRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return LoopingRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return LoopingRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return LoopingRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return LoopingRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return LoopingRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return LoopingRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return LoopingRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return LoopingRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return LoopingRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return LoopingRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return LoopingRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return LoopingRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return LoopingRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return LoopingRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return LoopingRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return LoopingRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return LoopingRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return LoopingRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return LoopingRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return LoopingRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return LoopingRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return LoopingRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return LoopingRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return LoopingRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return LoopingRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return LoopingRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return LoopingRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return LoopingRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return LoopingRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return LoopingRCTrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return LoopingRCTrackBlockBrakes; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return LoopingRCTrackLeftBankedQuarterTurn325DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return LoopingRCTrackRightBankedQuarterTurn325DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return LoopingRCTrackLeftBankedQuarterTurn325DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return LoopingRCTrackRightBankedQuarterTurn325DegDown; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return LoopingRCTrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return LoopingRCTrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return LoopingRCTrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return LoopingRCTrackRightBankedQuarterTurn525DegDown; - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return LoopingRCTrack25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return LoopingRCTrack25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return LoopingRCTrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return LoopingRCTrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return LoopingRCTrack25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return LoopingRCTrack25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return LoopingRCTrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return LoopingRCTrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return LoopingRCTrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return LoopingRCTrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return LoopingRCTrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return LoopingRCTrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return LoopingRCTrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return LoopingRCTrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return LoopingRCTrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return LoopingRCTrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return LoopingRCTrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return LoopingRCTrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return LoopingRCTrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return LoopingRCTrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return LoopingRCTrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return LoopingRCTrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return LoopingRCTrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return LoopingRCTrackRightBanked25DegDownToFlat; - case TrackElemType::Booster: + case TrackElemType::booster: return LoopingRCTrackBooster; - case TrackElemType::DiagBrakes: - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBrakes: + case TrackElemType::diagBlockBrakes: return LoopingRCTrackDiagBrakes; default: diff --git a/src/openrct2/paint/track/coaster/MineRide.cpp b/src/openrct2/paint/track/coaster/MineRide.cpp index 212523b58398..1186af06a1ca 100644 --- a/src/openrct2/paint/track/coaster/MineRide.cpp +++ b/src/openrct2/paint/track/coaster/MineRide.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -5423,151 +5423,151 @@ static void MineRideTrackDiagRightBank( } } -TrackPaintFunction GetTrackPaintFunctionMineRide(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMineRide(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return MineRideTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return MineRideTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return MineRideTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return MineRideTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return MineRideTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return MineRideTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return MineRideTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return MineRideTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return MineRideTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return MineRideTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return MineRideTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return MineRideTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return MineRideTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return MineRideTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return MineRideTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return MineRideTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return MineRideTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return MineRideTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return MineRideTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return MineRideTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return MineRideTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return MineRideTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return MineRideTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return MineRideTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return MineRideTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return MineRideTrackRightBank; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return MineRideTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return MineRideTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return MineRideTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return MineRideTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return MineRideTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return MineRideTrackRightQuarterTurn3Bank; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return MineRideTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return MineRideTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return MineRideTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return MineRideTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return MineRideTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return MineRideTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return MineRideTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return MineRideTrackRightHalfBankedHelixDownLarge; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return MineRideTrackOnRidePhoto; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return MineRideTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return MineRideTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return MineRideTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return MineRideTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return MineRideTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return MineRideTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return MineRideTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return MineRideTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return MineRideTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return MineRideTrackDiag25DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return MineRideTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return MineRideTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return MineRideTrackDiag25DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return MineRideTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return MineRideTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return MineRideTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return MineRideTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return MineRideTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return MineRideTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return MineRideTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return MineRideTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return MineRideTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return MineRideTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return MineRideTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return MineRideTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return MineRideTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return MineRideTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return MineRideTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return MineRideTrackDiagRightBank; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/MineTrainCoaster.cpp b/src/openrct2/paint/track/coaster/MineTrainCoaster.cpp index 6f5abf347b04..abfed0a2ca6c 100644 --- a/src/openrct2/paint/track/coaster/MineTrainCoaster.cpp +++ b/src/openrct2/paint/track/coaster/MineTrainCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -119,7 +119,7 @@ static void MineTrainRCTrackFlat( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -137,7 +137,7 @@ static void MineTrainRCTrackStation( 20064, 20065, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); PaintAddImageAsParentRotated( @@ -156,7 +156,7 @@ static void MineTrainRCTrackStation( } else { - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); } TrackPaintUtilDrawStationTunnel(session, direction, height); @@ -222,7 +222,7 @@ static void MineTrainRCTrack25DegUp( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -266,7 +266,7 @@ static void MineTrainRCTrack60DegUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -339,7 +339,7 @@ static void MineTrainRCTrackFlatTo25DegUp( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -389,7 +389,7 @@ static void MineTrainRCTrack25DegUpTo60DegUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -439,7 +439,7 @@ static void MineTrainRCTrack60DegUpTo25DegUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -512,7 +512,7 @@ static void MineTrainRCTrack25DegUpToFlat( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -606,7 +606,7 @@ static void MineTrainRCTrackLeftQuarterTurn5( { { 0, 6, height }, { 32, 20, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -645,7 +645,7 @@ static void MineTrainRCTrackLeftQuarterTurn5( { { 0, 16, height }, { 32, 16, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -680,7 +680,7 @@ static void MineTrainRCTrackLeftQuarterTurn5( session, direction, session.TrackColours.WithIndex(20148), { 0, 0, height }, { 16, 16, 1 }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -722,7 +722,7 @@ static void MineTrainRCTrackLeftQuarterTurn5( { { 16, 0, height }, { 16, 32, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -758,7 +758,7 @@ static void MineTrainRCTrackLeftQuarterTurn5( { { 6, 0, height }, { 20, 32, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -818,7 +818,7 @@ static void MineTrainRCTrackFlatToLeftBank( { { 0, 6, height }, { 32, 20, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -859,7 +859,7 @@ static void MineTrainRCTrackFlatToRightBank( { { 0, 27, height }, { 32, 1, 26 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -900,7 +900,7 @@ static void MineTrainRCTrackLeftBankToFlat( { { 0, 6, height }, { 32, 20, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -941,7 +941,7 @@ static void MineTrainRCTrackRightBankToFlat( { { 0, 27, height }, { 32, 1, 26 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -982,7 +982,7 @@ static void MineTrainRCTrackBankedLeftQuarterTurn5( { { 0, 6, height }, { 32, 20, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -1020,7 +1020,7 @@ static void MineTrainRCTrackBankedLeftQuarterTurn5( { { 0, 16, height }, { 32, 16, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -1055,7 +1055,7 @@ static void MineTrainRCTrackBankedLeftQuarterTurn5( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( @@ -1098,7 +1098,7 @@ static void MineTrainRCTrackBankedLeftQuarterTurn5( { { 16, 0, height }, { 16, 32, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -1136,7 +1136,7 @@ static void MineTrainRCTrackBankedLeftQuarterTurn5( { { 6, 0, height }, { 20, 32, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -1199,7 +1199,7 @@ static void MineTrainRCTrackLeftBankTo25DegUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -1249,7 +1249,7 @@ static void MineTrainRCTrackRightBankTo25DegUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -1299,7 +1299,7 @@ static void MineTrainRCTrack25DegUpToLeftBank( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -1349,7 +1349,7 @@ static void MineTrainRCTrack25DegUpToRightBank( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -1424,7 +1424,7 @@ static void MineTrainRCTrackLeftBank( { { 0, 6, height }, { 32, 20, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1471,7 +1471,7 @@ static void MineTrainRCTrackLeftQuarterTurn525DegUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -1513,7 +1513,7 @@ static void MineTrainRCTrackLeftQuarterTurn525DegUp( { { 0, 16, height }, { 32, 16, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -1549,7 +1549,7 @@ static void MineTrainRCTrackLeftQuarterTurn525DegUp( { { 0, 0, height }, { 16, 16, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -1593,7 +1593,7 @@ static void MineTrainRCTrackLeftQuarterTurn525DegUp( { { 16, 0, height }, { 16, 32, 1 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -5346,7 +5346,7 @@ static void MineTrainRCTrackDiag25DegUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56); @@ -7224,207 +7224,207 @@ static void MineTrainRCTrack60DegDownToFlatLongBase( session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionMineTrainRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMineTrainRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return MineTrainRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return MineTrainRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return MineTrainRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return MineTrainRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return MineTrainRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return MineTrainRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return MineTrainRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return MineTrainRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return MineTrainRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return MineTrainRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return MineTrainRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return MineTrainRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return MineTrainRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return MineTrainRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return MineTrainRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return MineTrainRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return MineTrainRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return MineTrainRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return MineTrainRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return MineTrainRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return MineTrainRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return MineTrainRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return MineTrainRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return MineTrainRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return MineTrainRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return MineTrainRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return MineTrainRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return MineTrainRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return MineTrainRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return MineTrainRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return MineTrainRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return MineTrainRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return MineTrainRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return MineTrainRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return MineTrainRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return MineTrainRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return MineTrainRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return MineTrainRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return MineTrainRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return MineTrainRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return MineTrainRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return MineTrainRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return MineTrainRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return MineTrainRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return MineTrainRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return MineTrainRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return MineTrainRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return MineTrainRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return MineTrainRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return MineTrainRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return MineTrainRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return MineTrainRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return MineTrainRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return MineTrainRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::Brakes: + case TrackElemType::brakes: return MineTrainRCTrackBrakes; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return MineTrainRCTrackOnRidePhoto; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return MineTrainRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return MineTrainRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return MineTrainRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return MineTrainRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return MineTrainRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return MineTrainRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return MineTrainRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return MineTrainRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return MineTrainRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return MineTrainRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return MineTrainRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return MineTrainRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return MineTrainRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return MineTrainRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return MineTrainRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return MineTrainRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return MineTrainRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return MineTrainRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return MineTrainRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return MineTrainRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return MineTrainRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return MineTrainRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return MineTrainRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return MineTrainRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return MineTrainRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return MineTrainRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return MineTrainRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return MineTrainRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return MineTrainRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return MineTrainRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return MineTrainRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return MineTrainRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return MineTrainRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return MineTrainRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return MineTrainRCTrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return MineTrainRCTrackBlockBrakes; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return MineTrainRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return MineTrainRCTrackDiagBlockBrakes; - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return MineTrainRCTrackFlatTo60DegUpLongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return MineTrainRCTrack60DegUpToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return MineTrainRCTrackFlatTo60DegDownLongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return MineTrainRCTrack60DegDownToFlatLongBase; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/MiniRollerCoaster.cpp b/src/openrct2/paint/track/coaster/MiniRollerCoaster.cpp index 49b7bdc796e2..a7b4c921f85b 100644 --- a/src/openrct2/paint/track/coaster/MiniRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/MiniRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -107,7 +107,7 @@ static void MiniRCTrackStation( 18747, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); PaintAddImageAsParentRotated( @@ -4267,8 +4267,7 @@ static void MiniRCTrackOnRidePhoto( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 }); + TrackPaintUtilOnridePhotoPlatformPaintBase(session, height); DrawSupportsSideBySide(session, direction, height, session.SupportColours, supportType.metal, 6); switch (direction) @@ -8986,281 +8985,281 @@ static void MiniRCTrackBooster( PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } -TrackPaintFunction GetTrackPaintFunctionMiniRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMiniRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return MiniRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return MiniRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return MiniRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return MiniRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return MiniRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return MiniRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return MiniRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return MiniRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return MiniRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return MiniRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return MiniRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return MiniRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return MiniRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return MiniRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return MiniRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return MiniRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return MiniRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return MiniRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return MiniRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return MiniRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return MiniRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return MiniRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return MiniRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return MiniRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return MiniRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return MiniRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return MiniRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return MiniRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return MiniRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return MiniRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return MiniRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return MiniRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return MiniRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return MiniRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return MiniRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return MiniRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return MiniRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return MiniRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return MiniRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return MiniRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return MiniRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return MiniRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return MiniRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return MiniRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return MiniRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return MiniRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return MiniRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return MiniRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return MiniRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return MiniRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return MiniRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return MiniRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return MiniRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return MiniRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return MiniRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return MiniRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return MiniRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return MiniRCTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return MiniRCTrackBrakes; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return MiniRCTrack25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return MiniRCTrack25DegUpRightBanked; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return MiniRCTrackOnRidePhoto; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return MiniRCTrack25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return MiniRCTrack25DegDownRightBanked; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return MiniRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return MiniRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return MiniRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return MiniRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return MiniRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return MiniRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return MiniRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return MiniRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return MiniRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return MiniRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return MiniRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return MiniRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return MiniRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return MiniRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return MiniRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return MiniRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return MiniRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return MiniRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return MiniRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return MiniRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return MiniRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return MiniRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return MiniRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return MiniRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return MiniRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return MiniRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return MiniRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return MiniRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return MiniRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return MiniRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return MiniRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return MiniRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return MiniRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return MiniRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return MiniRCTrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return MiniRCTrackBlockBrakes; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return MiniRCTrackLeftBankedQuarterTurn325DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return MiniRCTrackRightBankedQuarterTurn325DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return MiniRCTrackLeftBankedQuarterTurn325DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return MiniRCTrackRightBankedQuarterTurn325DegDown; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return MiniRCTrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return MiniRCTrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return MiniRCTrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return MiniRCTrackRightBankedQuarterTurn525DegDown; - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return MiniRCTrack25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return MiniRCTrack25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return MiniRCTrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return MiniRCTrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return MiniRCTrack25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return MiniRCTrack25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return MiniRCTrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return MiniRCTrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return MiniRCTrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return MiniRCTrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return MiniRCTrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return MiniRCTrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return MiniRCTrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return MiniRCTrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return MiniRCTrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return MiniRCTrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return MiniRCTrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return MiniRCTrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return MiniRCTrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return MiniRCTrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return MiniRCTrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return MiniRCTrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return MiniRCTrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return MiniRCTrackRightBanked25DegDownToFlat; - case TrackElemType::LeftCurvedLiftHill: + case TrackElemType::leftCurvedLiftHill: return MiniRCTrackLeftCurvedLiftHill; - case TrackElemType::RightCurvedLiftHill: + case TrackElemType::rightCurvedLiftHill: return MiniRCTrackRightCurvedLiftHill; - case TrackElemType::Booster: + case TrackElemType::booster: return MiniRCTrackBooster; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/MiniSuspendedCoaster.cpp b/src/openrct2/paint/track/coaster/MiniSuspendedCoaster.cpp index 0eecc1f8e0c8..4b8cb55fa7e5 100644 --- a/src/openrct2/paint/track/coaster/MiniSuspendedCoaster.cpp +++ b/src/openrct2/paint/track/coaster/MiniSuspendedCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -2189,61 +2189,61 @@ static void MiniSuspendedRCTrackDiag25DegDownToFlat( } } -TrackPaintFunction GetTrackPaintFunctionMiniSuspendedRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMiniSuspendedRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return MiniSuspendedRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return MiniSuspendedRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return MiniSuspendedRCTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return MiniSuspendedRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return MiniSuspendedRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return MiniSuspendedRCTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return MiniSuspendedRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return MiniSuspendedRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return MiniSuspendedRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return MiniSuspendedRCTrackRightQuarterTurn5; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return MiniSuspendedRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return MiniSuspendedRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return MiniSuspendedRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return MiniSuspendedRCTrackRightQuarterTurn3; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return MiniSuspendedRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return MiniSuspendedRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return MiniSuspendedRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return MiniSuspendedRCTrackRightEighthToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return MiniSuspendedRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return MiniSuspendedRCTrackDiag25DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return MiniSuspendedRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return MiniSuspendedRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return MiniSuspendedRCTrackDiag25DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return MiniSuspendedRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return MiniSuspendedRCTrackDiag25DegDownToFlat; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/MultiDimensionRollerCoaster.cpp b/src/openrct2/paint/track/coaster/MultiDimensionRollerCoaster.cpp index c9360013d69e..e15bc91fd16f 100644 --- a/src/openrct2/paint/track/coaster/MultiDimensionRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/MultiDimensionRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -198,7 +198,7 @@ static void MultiDimensionRCTrackStation( } }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); uint8_t offset = isClosed ? 2 : 1; @@ -5356,11 +5356,10 @@ static void MultiDimensionRCTrackOnRidePhoto( } else { + TrackPaintUtilOnridePhotoPlatformPaintBase(session, height); switch (direction) { case 0: - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::topLeftSide, 0, height, session.SupportColours); MetalASupportsPaintSetup( @@ -5370,8 +5369,6 @@ static void MultiDimensionRCTrackOnRidePhoto( { { 0, 6, height + 24 }, { 32, 20, 3 } }); break; case 1: - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::topRightSide, 0, height, session.SupportColours); MetalASupportsPaintSetup( @@ -5381,8 +5378,6 @@ static void MultiDimensionRCTrackOnRidePhoto( { { 0, 6, height + 24 }, { 32, 20, 3 } }); break; case 2: - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::topLeftSide, 0, height, session.SupportColours); MetalASupportsPaintSetup( @@ -5392,8 +5387,6 @@ static void MultiDimensionRCTrackOnRidePhoto( { { 0, 6, height + 24 }, { 32, 20, 3 } }); break; case 3: - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::topRightSide, 0, height, session.SupportColours); MetalASupportsPaintSetup( @@ -14523,212 +14516,212 @@ static void MultiDimensionRCTrackMultidimInverted90DegUpToFlatQuarterLoop( } } -TrackPaintFunction GetTrackPaintFunctionMultiDimensionRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMultiDimensionRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return MultiDimensionRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return MultiDimensionRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return MultiDimensionRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return MultiDimensionRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return MultiDimensionRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return MultiDimensionRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return MultiDimensionRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return MultiDimensionRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return MultiDimensionRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return MultiDimensionRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return MultiDimensionRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return MultiDimensionRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return MultiDimensionRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return MultiDimensionRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return MultiDimensionRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return MultiDimensionRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return MultiDimensionRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return MultiDimensionRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return MultiDimensionRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return MultiDimensionRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return MultiDimensionRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return MultiDimensionRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return MultiDimensionRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return MultiDimensionRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return MultiDimensionRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return MultiDimensionRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return MultiDimensionRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return MultiDimensionRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return MultiDimensionRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return MultiDimensionRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return MultiDimensionRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return MultiDimensionRCTrackRightBank; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return MultiDimensionRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return MultiDimensionRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return MultiDimensionRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return MultiDimensionRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return MultiDimensionRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return MultiDimensionRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return MultiDimensionRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return MultiDimensionRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return MultiDimensionRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return MultiDimensionRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return MultiDimensionRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return MultiDimensionRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return MultiDimensionRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return MultiDimensionRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::Brakes: + case TrackElemType::brakes: return MultiDimensionRCTrackBrakes; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return MultiDimensionRCTrackOnRidePhoto; - case TrackElemType::Up90: + case TrackElemType::up90: return MultiDimensionRCTrack90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return MultiDimensionRCTrack90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return MultiDimensionRCTrack60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return MultiDimensionRCTrack90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return MultiDimensionRCTrack90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return MultiDimensionRCTrack60DegDownTo90DegDown; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return MultiDimensionRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return MultiDimensionRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return MultiDimensionRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return MultiDimensionRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return MultiDimensionRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return MultiDimensionRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return MultiDimensionRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return MultiDimensionRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return MultiDimensionRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return MultiDimensionRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return MultiDimensionRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return MultiDimensionRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return MultiDimensionRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return MultiDimensionRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return MultiDimensionRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return MultiDimensionRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return MultiDimensionRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return MultiDimensionRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return MultiDimensionRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return MultiDimensionRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return MultiDimensionRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return MultiDimensionRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return MultiDimensionRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return MultiDimensionRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return MultiDimensionRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return MultiDimensionRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return MultiDimensionRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return MultiDimensionRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return MultiDimensionRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return MultiDimensionRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return MultiDimensionRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return MultiDimensionRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return MultiDimensionRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return MultiDimensionRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return MultiDimensionRCTrackDiagRightBank; - case TrackElemType::LeftFlyerTwistUp: + case TrackElemType::leftFlyerTwistUp: return MultiDimensionRCTrackLeftFlyerTwistUp; - case TrackElemType::RightFlyerTwistUp: + case TrackElemType::rightFlyerTwistUp: return MultiDimensionRCTrackRightFlyerTwistUp; - case TrackElemType::LeftFlyerTwistDown: + case TrackElemType::leftFlyerTwistDown: return MultiDimensionRCTrackLeftFlyerTwistDown; - case TrackElemType::RightFlyerTwistDown: + case TrackElemType::rightFlyerTwistDown: return MultiDimensionRCTrackRightFlyerTwistDown; - case TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop: + case TrackElemType::multiDimInvertedFlatToDown90QuarterLoop: return MultiDimensionRCTrackMultidimInvertedFlatTo90DegQuarterLoopDown; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return MultiDimensionRCTrackBlockBrakes; - case TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop: + case TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop: return MultiDimensionRCTrackMultidim90DegUpToInvertedFlatQuarterLoop; - case TrackElemType::MultiDimFlatToDown90QuarterLoop: + case TrackElemType::multiDimFlatToDown90QuarterLoop: return MultiDimensionRCTrackMultidimFlatTo90DegDownQuarterLoop; - case TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop: + case TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop: return MultiDimensionRCTrackMultidimInverted90DegUpToFlatQuarterLoop; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return MultiDimensionRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return MultiDimensionRCTrackDiagBlockBrakes; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/ReverseFreefallCoaster.cpp b/src/openrct2/paint/track/coaster/ReverseFreefallCoaster.cpp index 24c4cb09883e..781c22712300 100644 --- a/src/openrct2/paint/track/coaster/ReverseFreefallCoaster.cpp +++ b/src/openrct2/paint/track/coaster/ReverseFreefallCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -220,7 +220,7 @@ static void PaintReverseFreefallRCFlat( PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -242,7 +242,7 @@ static void PaintReverseFreefallRCStation( imageId = session.TrackColours.WithIndex(kPiecesStation[direction]); PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 6, 0, height + 1 }, { 20, 32, 1 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilDrawStationTunnel(session, direction, height); @@ -299,13 +299,13 @@ static void PaintReverseFreefallRCSlope( session, direction, supportsImageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, bbHeight } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + supportHeights[trackSequence]); break; case 5: - if (DrawSupportForSequenceA( + if (DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours)) { ImageId floorImageId; @@ -346,7 +346,7 @@ static void PaintReverseFreefallRCSlope( PaintAddImageAsChildRotated( session, direction, supportsImageId, { 0, 0, height }, { { 27, 6, height }, { 1, 20, 126 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + supportHeights[trackSequence]); @@ -395,27 +395,27 @@ static void PaintReverseFreefallRCOnridePhoto( session, direction, session.TrackColours.WithIndex(kPiecesStation[direction]), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilOnridePhotoPaint2(session, direction, trackElement, height); } -TrackPaintFunction GetTrackPaintFunctionReverseFreefallRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionReverseFreefallRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintReverseFreefallRCFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintReverseFreefallRCStation; - case TrackElemType::ReverseFreefallSlope: + case TrackElemType::reverseFreefallSlope: return PaintReverseFreefallRCSlope; - case TrackElemType::ReverseFreefallVertical: + case TrackElemType::reverseFreefallVertical: return PaintReverseFreefallRCVertical; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return PaintReverseFreefallRCOnridePhoto; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/ReverserRollerCoaster.cpp b/src/openrct2/paint/track/coaster/ReverserRollerCoaster.cpp index 45e5f9a06570..d2975c26bddc 100644 --- a/src/openrct2/paint/track/coaster/ReverserRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/ReverserRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -68,7 +68,7 @@ static void ReverserRCTrackFlat( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -88,7 +88,7 @@ static void ReverserRCTrackStation( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(imageIds[direction]), { 0, 0, height }, { { 0, 2, height + 1 }, { 32, 27, 2 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilDrawStation2(session, ride, direction, height, trackElement, StationBaseType::a, 0, 9, 11); TrackPaintUtilDrawStationTunnel(session, direction, height); @@ -153,7 +153,7 @@ static void ReverserRCTrack25DegUp( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -224,7 +224,7 @@ static void ReverserRCTrackFlatTo25DegUp( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -295,7 +295,7 @@ static void ReverserRCTrack25DegUpToFlat( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -360,7 +360,7 @@ static void ReverserRCTrackLeftQuarterTurn5( session, direction, session.TrackColours.WithIndex(21538), { 0, 2, height }, { 32, 32, 2 }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -397,7 +397,7 @@ static void ReverserRCTrackLeftQuarterTurn5( session, direction, session.TrackColours.WithIndex(21537), { 0, 16, height }, { 32, 16, 2 }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -429,7 +429,7 @@ static void ReverserRCTrackLeftQuarterTurn5( session, direction, session.TrackColours.WithIndex(21536), { 0, 0, height }, { 16, 16, 2 }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -469,7 +469,7 @@ static void ReverserRCTrackLeftQuarterTurn5( session, direction, session.TrackColours.WithIndex(21535), { 16, 0, height }, { 16, 32, 2 }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -501,7 +501,7 @@ static void ReverserRCTrackLeftQuarterTurn5( session, direction, session.TrackColours.WithIndex(21534), { 2, 0, height }, { 32, 32, 2 }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -558,7 +558,7 @@ static void ReverserRCTrackSBendLeft( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -591,7 +591,7 @@ static void ReverserRCTrackSBendLeft( { { 0, 6, height }, { 32, 26, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -627,7 +627,7 @@ static void ReverserRCTrackSBendLeft( { { 0, 0, height }, { 32, 26, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -663,7 +663,7 @@ static void ReverserRCTrackSBendLeft( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -711,7 +711,7 @@ static void ReverserRCTrackSBendRight( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -744,7 +744,7 @@ static void ReverserRCTrackSBendRight( { { 0, 0, height }, { 32, 26, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -780,7 +780,7 @@ static void ReverserRCTrackSBendRight( { { 0, 6, height }, { 32, 26, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -816,7 +816,7 @@ static void ReverserRCTrackSBendRight( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -864,7 +864,7 @@ static void ReverserRCTrackLeftQuarterTurn3( { { 0, 6, height }, { 32, 20, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -932,7 +932,7 @@ static void ReverserRCTrackLeftQuarterTurn3( { { 6, 0, height }, { 20, 32, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -978,7 +978,7 @@ static void ReverserRCTrackBrakes( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1016,7 +1016,7 @@ static void ReverserRCTrackLeftReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -1047,7 +1047,7 @@ static void ReverserRCTrackLeftReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); break; case 2: @@ -1074,7 +1074,7 @@ static void ReverserRCTrackLeftReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); break; case 3: @@ -1101,7 +1101,7 @@ static void ReverserRCTrackLeftReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); break; case 4: @@ -1128,7 +1128,7 @@ static void ReverserRCTrackLeftReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); break; case 5: @@ -1155,7 +1155,7 @@ static void ReverserRCTrackLeftReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -1204,7 +1204,7 @@ static void ReverserRCTrackRightReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -1237,7 +1237,7 @@ static void ReverserRCTrackRightReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1266,7 +1266,7 @@ static void ReverserRCTrackRightReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1295,7 +1295,7 @@ static void ReverserRCTrackRightReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1324,7 +1324,7 @@ static void ReverserRCTrackRightReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1353,7 +1353,7 @@ static void ReverserRCTrackRightReverser( { { 0, 2, height }, { 32, 27, 2 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -1370,45 +1370,45 @@ static void ReverserRCTrackRightReverser( } } -TrackPaintFunction GetTrackPaintFunctionReverserRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionReverserRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return ReverserRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return ReverserRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return ReverserRCTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return ReverserRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return ReverserRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return ReverserRCTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return ReverserRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return ReverserRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return ReverserRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return ReverserRCTrackRightQuarterTurn5; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return ReverserRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return ReverserRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return ReverserRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return ReverserRCTrackRightQuarterTurn3; - case TrackElemType::Brakes: + case TrackElemType::brakes: return ReverserRCTrackBrakes; - case TrackElemType::LeftReverser: + case TrackElemType::leftReverser: return ReverserRCTrackLeftReverser; - case TrackElemType::RightReverser: + case TrackElemType::rightReverser: return ReverserRCTrackRightReverser; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/SideFrictionRollerCoaster.cpp b/src/openrct2/paint/track/coaster/SideFrictionRollerCoaster.cpp index 65aa8c588b78..1ed4dc91476f 100644 --- a/src/openrct2/paint/track/coaster/SideFrictionRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/SideFrictionRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -140,7 +140,7 @@ static void SideFrictionRCTrackFlat( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -162,7 +162,7 @@ static void SideFrictionRCTrackStation( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(imageIds[direction][0]), { 0, 0, height }, { { 0, 2, height }, { 32, 27, 2 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (!TrackPaintUtilDrawStation2(session, ride, direction, height, trackElement, StationBaseType::none, 0, 9, 11)) { @@ -256,7 +256,7 @@ static void SideFrictionRCTrack25DegUp( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -351,7 +351,7 @@ static void SideFrictionRCTrackFlatTo25DegUp( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -446,7 +446,7 @@ static void SideFrictionRCTrack25DegUpToFlat( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -523,7 +523,7 @@ static void SideFrictionRCTrackLeftQuarterTurn5( { { 0, 2, height + 27 }, { 32, 32, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -572,7 +572,7 @@ static void SideFrictionRCTrackLeftQuarterTurn5( { { 0, 16, height + 27 }, { 32, 16, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -616,7 +616,7 @@ static void SideFrictionRCTrackLeftQuarterTurn5( { { 0, 0, height + 27 }, { 16, 16, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -668,7 +668,7 @@ static void SideFrictionRCTrackLeftQuarterTurn5( { { 16, 0, height + 27 }, { 16, 32, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -712,7 +712,7 @@ static void SideFrictionRCTrackLeftQuarterTurn5( { { 2, 0, height + 27 }, { 32, 32, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -781,7 +781,7 @@ static void SideFrictionRCTrackSBendLeft( { { 0, 2, height + 27 }, { 32, 27, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -826,7 +826,7 @@ static void SideFrictionRCTrackSBendLeft( { { 0, 6, height + 27 }, { 32, 26, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -874,7 +874,7 @@ static void SideFrictionRCTrackSBendLeft( { { 0, 0, height + 27 }, { 32, 26, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -922,7 +922,7 @@ static void SideFrictionRCTrackSBendLeft( { { 0, 2, height + 27 }, { 32, 27, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -982,7 +982,7 @@ static void SideFrictionRCTrackSBendRight( { { 0, 2, height + 27 }, { 32, 27, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -1027,7 +1027,7 @@ static void SideFrictionRCTrackSBendRight( { { 0, 0, height + 27 }, { 32, 26, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -1075,7 +1075,7 @@ static void SideFrictionRCTrackSBendRight( { { 0, 6, height + 27 }, { 32, 26, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( session, @@ -1123,7 +1123,7 @@ static void SideFrictionRCTrackSBendRight( { { 0, 2, height + 27 }, { 32, 27, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -1183,7 +1183,7 @@ static void SideFrictionRCTrackLeftQuarterTurn3( { { 0, 6, height + 27 }, { 32, 20, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -1275,7 +1275,7 @@ static void SideFrictionRCTrackLeftQuarterTurn3( { { 6, 0, height + 27 }, { 20, 32, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -1327,7 +1327,7 @@ static void SideFrictionRCTrackBrakes( { { 0, 2, height + 27 }, { 32, 27, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1377,7 +1377,7 @@ static void SideFrictionRCTrackLeftEighthToDiag( { { 0, 0, height + 27 }, { 32, 32, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -1422,7 +1422,7 @@ static void SideFrictionRCTrackLeftEighthToDiag( { { 0, 16, height + 27 }, { 32, 16, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1463,13 +1463,13 @@ static void SideFrictionRCTrackLeftEighthToDiag( { { 0, 0, height + 27 }, { 16, 16, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); break; case 3: - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1559,7 +1559,7 @@ static void SideFrictionRCTrackRightEighthToDiag( { { 0, 0, height + 27 }, { 32, 32, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) { @@ -1604,7 +1604,7 @@ static void SideFrictionRCTrackRightEighthToDiag( { { 0, 0, height + 27 }, { 32, 16, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1645,13 +1645,13 @@ static void SideFrictionRCTrackRightEighthToDiag( { { 0, 16, height + 27 }, { 16, 16, 0 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); break; case 3: - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -1753,7 +1753,7 @@ static void SideFrictionRCTrackDiagFlat( } break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1876,7 +1876,7 @@ static void SideFrictionRCTrackDiag25DegUp( } break; } - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1945,7 +1945,7 @@ static void SideFrictionRCTrackDiagFlatTo25DegUp( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48); @@ -1979,7 +1979,7 @@ static void SideFrictionRCTrackDiagFlatTo25DegUp( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48); @@ -2130,7 +2130,7 @@ static void SideFrictionRCTrackDiag25DegUpToFlat( break; } - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56); @@ -2253,7 +2253,7 @@ static void SideFrictionRCTrackDiag25DegDown( break; } - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56); @@ -2376,7 +2376,7 @@ static void SideFrictionRCTrackDiagFlatTo25DegDown( break; } - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56); @@ -2444,7 +2444,7 @@ static void SideFrictionRCTrackDiag25DegDownToFlat( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48); @@ -2478,7 +2478,7 @@ static void SideFrictionRCTrackDiag25DegDownToFlat( break; } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48); @@ -2552,7 +2552,7 @@ static void SideFrictionRCTrack60DegUp( { { 0, 26, height + 5 }, { 32, 1, 9 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -2613,7 +2613,7 @@ static void SideFrictionRCTrack25DegUpTo60DegUp( { 0, 0, height }, { { 0, 26, height + 5 }, { 32, 1, 9 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -2674,7 +2674,7 @@ static void SideFrictionRCTrack60DegUpTo25DegUp( { 0, 0, height }, { { 0, 26, height + 5 }, { 32, 1, 9 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -2750,7 +2750,7 @@ static void SideFrictionRCTrackDiag60DegUp( break; } - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 104); @@ -2823,7 +2823,7 @@ static void SideFrictionRCTrackDiag60DegUpTo25DegUp( break; } - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 72); @@ -2895,7 +2895,7 @@ static void SideFrictionRCTrackDiag25DegUpTo60DegUp( break; } - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 72); @@ -2909,90 +2909,90 @@ static void SideFrictionRCTrackDiag60DegDownTo25DegDown( session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); }; -TrackPaintFunction GetTrackPaintFunctionSideFrictionRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSideFrictionRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return SideFrictionRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return SideFrictionRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return SideFrictionRCTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return SideFrictionRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return SideFrictionRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return SideFrictionRCTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return SideFrictionRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return SideFrictionRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return SideFrictionRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return SideFrictionRCTrackRightQuarterTurn5; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return SideFrictionRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return SideFrictionRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return SideFrictionRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return SideFrictionRCTrackRightQuarterTurn3; - case TrackElemType::Brakes: + case TrackElemType::brakes: return SideFrictionRCTrackBrakes; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return SideFrictionRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return SideFrictionRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return SideFrictionRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return SideFrictionRCTrackRightEighthToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return SideFrictionRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return SideFrictionRCTrackDiag25DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return SideFrictionRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return SideFrictionRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return SideFrictionRCTrackDiag25DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return SideFrictionRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return SideFrictionRCTrackDiag25DegDownToFlat; // Added by OpenRCT2 - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return SideFrictionRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return SideFrictionRCTrack60DegDownTo25DegDown; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return SideFrictionRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return SideFrictionRCTrack60DegUpTo25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return SideFrictionRCTrack60DegUp; - case TrackElemType::Down60: + case TrackElemType::down60: return SideFrictionRCTrack60DegDown; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return SideFrictionRCTrackDiag60DegUp; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return SideFrictionRCTrackDiag60DegDown; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return SideFrictionRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return SideFrictionRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return SideFrictionRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return SideFrictionRCTrackDiag60DegDownTo25DegDown; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/SingleRailRollerCoaster.cpp b/src/openrct2/paint/track/coaster/SingleRailRollerCoaster.cpp index 09648e5e4992..8bacc35ce36e 100644 --- a/src/openrct2/paint/track/coaster/SingleRailRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/SingleRailRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,8 +20,6 @@ #include "../../track/Segment.h" #include "../../track/Support.h" -using namespace OpenRCT2; - static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Standard; namespace OpenRCT2::SingleRailRC @@ -113,7 +111,7 @@ namespace OpenRCT2::SingleRailRC }, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(imageIds[direction][1]), { 0, 0, height }, @@ -19883,506 +19881,506 @@ namespace OpenRCT2::SingleRailRC } } - TrackPaintFunction GetTrackPaintFunction(OpenRCT2::TrackElemType trackType) + TrackPaintFunction GetTrackPaintFunction(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return TrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return TrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return Track25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return Track60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return TrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return Track25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return Track60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return Track25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return Track25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return Track60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return TrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return Track25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return Track60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return Track25DegDownToFlat; - case TrackElemType::Up90: + case TrackElemType::up90: return Track90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return Track90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return Track60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return Track90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return Track90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return Track60DegDownTo90DegDown; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return TrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return TrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return TrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return TrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return TrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return TrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return TrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return TrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return TrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return TrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return Track25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return Track25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return TrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return TrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return Track25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return Track25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return TrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return TrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return TrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return TrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return TrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return TrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return TrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return TrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return TrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return TrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return TrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return TrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return TrackLeftQuarterTurn3Tile25DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return TrackRightQuarterTurn3Tile25DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return TrackLeftQuarterTurn3Tile25DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return TrackRightQuarterTurn3Tile25DegDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return TrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return TrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return TrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return TrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return TrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return TrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return TrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return TrackRightHalfBankedHelixDownLarge; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return TrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return TrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return TrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return TrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return TrackBrakes; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return Track25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return Track25DegUpRightBanked; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return TrackOnRidePhoto; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return Track25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return Track25DegDownRightBanked; - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return TrackFlatTo60DegUpLongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return Track60DegUpToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return TrackFlatTo60DegDownLongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return Track60DegDownToFlatLongBase; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return TrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return TrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return TrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return TrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return TrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return TrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return TrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return TrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return TrackDiagFlat; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return TrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return TrackDiagBlockBrakes; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return TrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return TrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return TrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return TrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return TrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return TrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return TrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return TrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return TrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return TrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return TrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return TrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return TrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return TrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return TrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return TrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return TrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return TrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return TrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return TrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return TrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return TrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return TrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return TrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return TrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return TrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return TrackBlockBrakes; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return TrackLeftBankedQuarterTurn3Tile25DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return TrackRightBankedQuarterTurn3Tile25DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return TrackLeftBankedQuarterTurn3Tile25DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return TrackRightBankedQuarterTurn3Tile25DegDown; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return TrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return TrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return TrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return TrackRightBankedQuarterTurn525DegDown; - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return Track25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return Track25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return TrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return TrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return Track25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return Track25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return TrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return TrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return TrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return TrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return TrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return TrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return TrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return TrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return TrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return TrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return TrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return TrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return TrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return TrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return TrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return TrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return TrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return TrackRightBanked25DegDownToFlat; - case TrackElemType::LeftQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileUp90: return TrackLeftQuarterTurn190DegUp; - case TrackElemType::RightQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: return TrackRightQuarterTurn190DegUp; - case TrackElemType::LeftQuarterTurn1TileDown90: + case TrackElemType::leftQuarterTurn1TileDown90: return TrackLeftQuarterTurn190DegDown; - case TrackElemType::RightQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: return TrackRightQuarterTurn190DegDown; - case TrackElemType::LeftBarrelRollUpToDown: + case TrackElemType::leftBarrelRollUpToDown: return TrackLeftBarrelRollUpToDown; - case TrackElemType::RightBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: return TrackRightBarrelRollUpToDown; - case TrackElemType::LeftBarrelRollDownToUp: + case TrackElemType::leftBarrelRollDownToUp: return TrackLeftBarrelRollDownToUp; - case TrackElemType::RightBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: return TrackRightBarrelRollDownToUp; - case TrackElemType::HalfLoopUp: + case TrackElemType::halfLoopUp: return TrackHalfLoopUp; - case TrackElemType::HalfLoopDown: + case TrackElemType::halfLoopDown: return TrackHalfLoopDown; - case TrackElemType::LeftCorkscrewUp: + case TrackElemType::leftCorkscrewUp: return TrackLeftCorkscrewUp; - case TrackElemType::RightCorkscrewUp: + case TrackElemType::rightCorkscrewUp: return TrackRightCorkscrewUp; - case TrackElemType::LeftCorkscrewDown: + case TrackElemType::leftCorkscrewDown: return TrackLeftCorkscrewDown; - case TrackElemType::RightCorkscrewDown: + case TrackElemType::rightCorkscrewDown: return TrackRightCorkscrewDown; - case TrackElemType::LeftLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewUp: return TrackLeftLargeCorkscrewUp; - case TrackElemType::RightLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: return TrackRightLargeCorkscrewUp; - case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::leftLargeCorkscrewDown: return TrackLeftLargeCorkscrewDown; - case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: return TrackRightLargeCorkscrewDown; - case TrackElemType::LeftZeroGRollUp: + case TrackElemType::leftZeroGRollUp: return TrackLeftZeroGRollUp; - case TrackElemType::RightZeroGRollUp: + case TrackElemType::rightZeroGRollUp: return TrackRightZeroGRollUp; - case TrackElemType::LeftZeroGRollDown: + case TrackElemType::leftZeroGRollDown: return TrackLeftZeroGRollDown; - case TrackElemType::RightZeroGRollDown: + case TrackElemType::rightZeroGRollDown: return TrackRightZeroGRollDown; - case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollUp: return TrackLeftLargeZeroGRollUp; - case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: return TrackRightLargeZeroGRollUp; - case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::leftLargeZeroGRollDown: return TrackLeftLargeZeroGRollDown; - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return TrackRightLargeZeroGRollDown; - case TrackElemType::LeftEighthDiveLoopUpToOrthogonal: + case TrackElemType::leftEighthDiveLoopUpToOrthogonal: return TrackLeftEighthDiveLoopUpToOrthogonal; - case TrackElemType::RightEighthDiveLoopUpToOrthogonal: + case TrackElemType::rightEighthDiveLoopUpToOrthogonal: return TrackRightEighthDiveLoopUpToOrthogonal; - case TrackElemType::LeftEighthDiveLoopDownToDiag: + case TrackElemType::leftEighthDiveLoopDownToDiag: return TrackLeftEighthDiveLoopDownToDiag; - case TrackElemType::RightEighthDiveLoopDownToDiag: + case TrackElemType::rightEighthDiveLoopDownToDiag: return TrackRightEighthDiveLoopToDownOrthogonal; - case TrackElemType::Up90ToInvertedFlatQuarterLoop: + case TrackElemType::up90ToInvertedFlatQuarterLoop: return Track90DegToInvertedFlatQuarterLoopUp; - case TrackElemType::InvertedFlatToDown90QuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: return TrackInvertedFlatTo90DegQuarterLoopDown; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return TrackLeftBankToLeftQuarterTurn3Tile25DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return TrackRightBankToRightQuarterTurn3Tile25DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return TrackLeftQuarterTurn3Tile25DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return TrackRightQuarterTurn3Tile25DegDownToRightBank; - case TrackElemType::LeftMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopUp: return TrackLeftMediumHalfLoopUp; - case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: return TrackRightMediumHalfLoopUp; - case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::leftMediumHalfLoopDown: return TrackLeftMediumHalfLoopDown; - case TrackElemType::RightMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: return TrackRightMediumHalfLoopDown; - case TrackElemType::LeftLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopUp: return TrackLeftLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: return TrackRightLargeHalfLoopUp; - case TrackElemType::LeftLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: return TrackLeftLargeHalfLoopDown; - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return TrackRightLargeHalfLoopDown; - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return TrackFlatTo60DegUp; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return Track60DegUpToFlat; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return TrackFlatTo60DegDown; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return Track60DegDownToFlat; - case TrackElemType::DiagFlatToUp60: + case TrackElemType::diagFlatToUp60: return TrackDiagFlatTo60DegUp; - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::diagUp60ToFlat: return TrackDiag60DegUpToFlat; - case TrackElemType::DiagFlatToDown60: + case TrackElemType::diagFlatToDown60: return TrackDiagFlatTo60DegDown; - case TrackElemType::DiagDown60ToFlat: + case TrackElemType::diagDown60ToFlat: return TrackDiag60DegDownToFlat; - case TrackElemType::DiagFlatToUp60LongBase: + case TrackElemType::diagFlatToUp60LongBase: return TrackDiagFlatTo60DegUpLongBase; - case TrackElemType::DiagUp60ToFlatLongBase: + case TrackElemType::diagUp60ToFlatLongBase: return TrackDiag60DegUpToFlatLongBase; - case TrackElemType::DiagFlatToDown60LongBase: + case TrackElemType::diagFlatToDown60LongBase: return TrackDiagFlatTo60DegDownLongBase; - case TrackElemType::DiagDown60ToFlatLongBase: + case TrackElemType::diagDown60ToFlatLongBase: return TrackDiag60DegDownToFlatLongBase; - case TrackElemType::LeftEighthToDiagUp25: + case TrackElemType::leftEighthToDiagUp25: return TrackLeftEighthToDiagUp25; - case TrackElemType::RightEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: return TrackRightEighthToDiagUp25; - case TrackElemType::LeftEighthToDiagDown25: + case TrackElemType::leftEighthToDiagDown25: return TrackLeftEighthToDiagDown25; - case TrackElemType::RightEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: return TrackRightEighthToDiagDown25; - case TrackElemType::LeftEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalUp25: return TrackLeftEighthToOrthogonalUp25; - case TrackElemType::RightEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: return TrackRightEighthToOrthogonalUp25; - case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::leftEighthToOrthogonalDown25: return TrackLeftEighthToOrthogonalDown25; - case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: return TrackRightEighthToOrthogonalDown25; - case TrackElemType::DiagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToLeftBankedUp25: return TrackDiagUp25ToLeftBankedUp25; - case TrackElemType::DiagUp25ToRightBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: return TrackDiagUp25ToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: return TrackDiagLeftBankedUp25ToUp25; - case TrackElemType::DiagRightBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: return TrackDiagRightBankedUp25ToUp25; - case TrackElemType::DiagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToLeftBankedDown25: return TrackDiagDown25ToLeftBankedDown25; - case TrackElemType::DiagDown25ToRightBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: return TrackDiagDown25ToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: return TrackDiagLeftBankedDown25ToDown25; - case TrackElemType::DiagRightBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: return TrackDiagRightBankedDown25ToDown25; - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: return TrackDiagLeftBankedFlatToLeftBankedUp25; - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: return TrackDiagRightBankedFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: return TrackDiagLeftBankedUp25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: return TrackDiagRightBankedUp25ToRightBankedFlat; - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: return TrackDiagLeftBankedFlatToLeftBankedDown25; - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: return TrackDiagRightBankedFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: return TrackDiagLeftBankedDown25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: return TrackDiagRightBankedDown25ToRightBankedFlat; - case TrackElemType::DiagUp25LeftBanked: + case TrackElemType::diagUp25LeftBanked: return TrackDiagUp25LeftBanked; - case TrackElemType::DiagUp25RightBanked: + case TrackElemType::diagUp25RightBanked: return TrackDiagUp25RightBanked; - case TrackElemType::DiagDown25LeftBanked: + case TrackElemType::diagDown25LeftBanked: return TrackDiagDown25LeftBanked; - case TrackElemType::DiagDown25RightBanked: + case TrackElemType::diagDown25RightBanked: return TrackDiagDown25RightBanked; - case TrackElemType::DiagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToLeftBankedUp25: return TrackDiagFlatToLeftBankedUp25; - case TrackElemType::DiagFlatToRightBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: return TrackDiagFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToFlat: + case TrackElemType::diagLeftBankedUp25ToFlat: return TrackDiagLeftBankedUp25ToFlat; - case TrackElemType::DiagRightBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: return TrackDiagRightBankedUp25ToFlat; - case TrackElemType::DiagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToLeftBankedDown25: return TrackDiagFlatToLeftBankedDown25; - case TrackElemType::DiagFlatToRightBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: return TrackDiagFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToFlat: + case TrackElemType::diagLeftBankedDown25ToFlat: return TrackDiagLeftBankedDown25ToFlat; - case TrackElemType::DiagRightBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: return TrackDiagRightBankedDown25ToFlat; - case TrackElemType::LeftEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagUp25: return TrackLeftEighthBankToDiagUp25; - case TrackElemType::RightEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: return TrackRightEighthBankToDiagUp25; - case TrackElemType::LeftEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToDiagDown25: return TrackLeftEighthBankToDiagDown25; - case TrackElemType::RightEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: return TrackRightEighthBankToDiagDown25; - case TrackElemType::LeftEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalUp25: return TrackLeftEighthBankToOrthogonalUp25; - case TrackElemType::RightEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: return TrackRightEighthBankToOrthogonalUp25; - case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::leftEighthBankToOrthogonalDown25: return TrackLeftEighthBankToOrthogonalDown25; - case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: return TrackRightEighthBankToOrthogonalDown25; - case TrackElemType::Down25Brakes: + case TrackElemType::down25Brakes: return Track25DegDownBrakes; - case TrackElemType::DiagDown25Brakes: + case TrackElemType::diagDown25Brakes: return TrackDiag25DegDownBrakes; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/StandUpRollerCoaster.cpp b/src/openrct2/paint/track/coaster/StandUpRollerCoaster.cpp index a0dfc817f96d..ce3d0db91dbc 100644 --- a/src/openrct2/paint/track/coaster/StandUpRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/StandUpRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -127,7 +127,7 @@ static void StandUpRCTrackStation( 25568, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); PaintAddImageAsParentRotated( @@ -18361,527 +18361,527 @@ static void StandUpRCTrackRightLargeZeroGRollDown( session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionStandUpRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionStandUpRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return StandUpRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return StandUpRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return StandUpRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return StandUpRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return StandUpRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return StandUpRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return StandUpRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return StandUpRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return StandUpRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return StandUpRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return StandUpRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return StandUpRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return StandUpRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return StandUpRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return StandUpRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return StandUpRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return StandUpRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return StandUpRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return StandUpRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return StandUpRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return StandUpRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return StandUpRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return StandUpRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return StandUpRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return StandUpRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return StandUpRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return StandUpRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return StandUpRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return StandUpRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return StandUpRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return StandUpRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return StandUpRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return StandUpRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return StandUpRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return StandUpRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return StandUpRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return StandUpRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return StandUpRCTrackSBendRight; - case TrackElemType::LeftVerticalLoop: + case TrackElemType::leftVerticalLoop: return StandUpRCTrackLeftVerticalLoop; - case TrackElemType::RightVerticalLoop: + case TrackElemType::rightVerticalLoop: return StandUpRCTrackRightVerticalLoop; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return StandUpRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return StandUpRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return StandUpRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return StandUpRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return StandUpRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return StandUpRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return StandUpRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return StandUpRCTrackRightQuarterTurn325DegDown; - case TrackElemType::HalfLoopUp: + case TrackElemType::halfLoopUp: return StandUpRCTrackHalfLoopUp; - case TrackElemType::HalfLoopDown: + case TrackElemType::halfLoopDown: return StandUpRCTrackHalfLoopDown; - case TrackElemType::LeftCorkscrewUp: + case TrackElemType::leftCorkscrewUp: return StandUpRCTrackLeftCorkscrewUp; - case TrackElemType::RightCorkscrewUp: + case TrackElemType::rightCorkscrewUp: return StandUpRCTrackRightCorkscrewUp; - case TrackElemType::LeftCorkscrewDown: + case TrackElemType::leftCorkscrewDown: return StandUpRCTrackLeftCorkscrewDown; - case TrackElemType::RightCorkscrewDown: + case TrackElemType::rightCorkscrewDown: return StandUpRCTrackRightCorkscrewDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return StandUpRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return StandUpRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return StandUpRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return StandUpRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return StandUpRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return StandUpRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return StandUpRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return StandUpRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::Brakes: + case TrackElemType::brakes: return StandUpRCTrackBrakes; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return StandUpRCTrackOnRidePhoto; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return StandUpRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return StandUpRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return StandUpRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return StandUpRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return StandUpRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return StandUpRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return StandUpRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return StandUpRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return StandUpRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return StandUpRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return StandUpRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return StandUpRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return StandUpRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return StandUpRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return StandUpRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return StandUpRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return StandUpRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return StandUpRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return StandUpRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return StandUpRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return StandUpRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return StandUpRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return StandUpRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return StandUpRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return StandUpRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return StandUpRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return StandUpRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return StandUpRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return StandUpRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return StandUpRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return StandUpRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return StandUpRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return StandUpRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return StandUpRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return StandUpRCTrackDiagRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return StandUpRCTrackBlockBrakes; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return StandUpRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return StandUpRCTrackDiagBlockBrakes; // Added by OpenRCT2 // Small flat to steep - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return StandUpRCTrackFlatTo60DegUp; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return StandUpRCTrack60DegUpToFlat; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return StandUpRCTrackFlatTo60DegDown; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return StandUpRCTrack60DegDownToFlat; - case TrackElemType::DiagFlatToUp60: + case TrackElemType::diagFlatToUp60: return StandUpRCTrackDiagFlatTo60DegUp; - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::diagUp60ToFlat: return StandUpRCTrackDiag60DegUpToFlat; - case TrackElemType::DiagFlatToDown60: + case TrackElemType::diagFlatToDown60: return StandUpRCTrackDiagFlatTo60DegDown; - case TrackElemType::DiagDown60ToFlat: + case TrackElemType::diagDown60ToFlat: return StandUpRCTrackDiag60DegDownToFlat; // Long flat to steep - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return StandUpRCTrackFlatTo60DegUpLongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return StandUpRCTrack60DegUpToFlatLongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return StandUpRCTrack60DegDownToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return StandUpRCTrackFlatTo60DegDownLongBase; // Vertical slopes - case TrackElemType::Up90: + case TrackElemType::up90: return StandUpRCTrack90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return StandUpRCTrack90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return StandUpRCTrack60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return StandUpRCTrack90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return StandUpRCTrack90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return StandUpRCTrack60DegDownTo90DegDown; // Steep turns - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return StandUpRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return StandUpRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return StandUpRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return StandUpRCTrackRightQuarterTurn160DegDown; // Vertical turns - case TrackElemType::LeftQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileUp90: return StandUpRCTrackLeftQuarterTurn190DegUp; - case TrackElemType::RightQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: return StandUpRCTrackRightQuarterTurn190DegUp; - case TrackElemType::LeftQuarterTurn1TileDown90: + case TrackElemType::leftQuarterTurn1TileDown90: return StandUpRCTrackLeftQuarterTurn190DegDown; - case TrackElemType::RightQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: return StandUpRCTrackRightQuarterTurn190DegDown; // Banked slope transitions - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return StandUpRCTrack25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return StandUpRCTrack25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return StandUpRCTrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return StandUpRCTrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return StandUpRCTrack25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return StandUpRCTrack25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return StandUpRCTrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return StandUpRCTrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return StandUpRCTrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return StandUpRCTrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return StandUpRCTrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return StandUpRCTrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return StandUpRCTrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return StandUpRCTrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return StandUpRCTrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return StandUpRCTrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return StandUpRCTrack25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return StandUpRCTrack25DegDownRightBanked; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return StandUpRCTrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return StandUpRCTrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return StandUpRCTrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return StandUpRCTrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return StandUpRCTrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return StandUpRCTrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return StandUpRCTrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return StandUpRCTrackRightBanked25DegDownToFlat; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return StandUpRCTrack25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return StandUpRCTrack25DegUpRightBanked; // Small banked sloped curves - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return StandUpRCTrackLeftBankedQuarterTurn3Tile25DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return StandUpRCTrackRightBankedQuarterTurn3Tile25DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return StandUpRCTrackLeftBankedQuarterTurn3Tile25DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return StandUpRCTrackRightBankedQuarterTurn3Tile25DegDown; // Medium banked sloped curves - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return StandUpRCTrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return StandUpRCTrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return StandUpRCTrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return StandUpRCTrackRightBankedQuarterTurn525DegDown; // Large curved slopes - case TrackElemType::LeftEighthToDiagUp25: + case TrackElemType::leftEighthToDiagUp25: return StandUpRCTrackLeftEighthToDiagUp25; - case TrackElemType::RightEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: return StandUpRCTrackRightEighthToDiagUp25; - case TrackElemType::LeftEighthToDiagDown25: + case TrackElemType::leftEighthToDiagDown25: return StandUpRCTrackLeftEighthToDiagDown25; - case TrackElemType::RightEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: return StandUpRCTrackRightEighthToDiagDown25; - case TrackElemType::LeftEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalUp25: return StandUpRCTrackLeftEighthToOrthogonalUp25; - case TrackElemType::RightEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: return StandUpRCTrackRightEighthToOrthogonalUp25; - case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::leftEighthToOrthogonalDown25: return StandUpRCTrackLeftEighthToOrthogonalDown25; - case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: return StandUpRCTrackRightEighthToOrthogonalDown25; // Diagonal unbanked to banked - case TrackElemType::DiagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToLeftBankedUp25: return StandUpRCTrackDiagUp25ToLeftBankedUp25; - case TrackElemType::DiagUp25ToRightBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: return StandUpRCTrackDiagUp25ToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: return StandUpRCTrackDiagLeftBankedUp25ToUp25; - case TrackElemType::DiagRightBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: return StandUpRCTrackDiagRightBankedUp25ToUp25; - case TrackElemType::DiagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToLeftBankedDown25: return StandUpRCTrackDiagDown25ToLeftBankedDown25; - case TrackElemType::DiagDown25ToRightBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: return StandUpRCTrackDiagDown25ToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: return StandUpRCTrackDiagLeftBankedDown25ToDown25; - case TrackElemType::DiagRightBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: return StandUpRCTrackDiagRightBankedDown25ToDown25; - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: return StandUpRCTrackDiagLeftBankedFlatToLeftBankedUp25; - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: return StandUpRCTrackDiagRightBankedFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: return StandUpRCTrackDiagLeftBankedUp25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: return StandUpRCTrackDiagRightBankedUp25ToRightBankedFlat; - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: return StandUpRCTrackDiagLeftBankedFlatToLeftBankedDown25; - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: return StandUpRCTrackDiagRightBankedFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: return StandUpRCTrackDiagLeftBankedDown25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: return StandUpRCTrackDiagRightBankedDown25ToRightBankedFlat; - case TrackElemType::DiagUp25LeftBanked: + case TrackElemType::diagUp25LeftBanked: return StandUpRCTrackDiagUp25LeftBanked; - case TrackElemType::DiagUp25RightBanked: + case TrackElemType::diagUp25RightBanked: return StandUpRCTrackDiagUp25RightBanked; - case TrackElemType::DiagDown25LeftBanked: + case TrackElemType::diagDown25LeftBanked: return StandUpRCTrackDiagDown25LeftBanked; - case TrackElemType::DiagDown25RightBanked: + case TrackElemType::diagDown25RightBanked: return StandUpRCTrackDiagDown25RightBanked; - case TrackElemType::DiagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToLeftBankedUp25: return StandUpRCTrackDiagFlatToLeftBankedUp25; - case TrackElemType::DiagFlatToRightBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: return StandUpRCTrackDiagFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToFlat: + case TrackElemType::diagLeftBankedUp25ToFlat: return StandUpRCTrackDiagLeftBankedUp25ToFlat; - case TrackElemType::DiagRightBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: return StandUpRCTrackDiagRightBankedUp25ToFlat; - case TrackElemType::DiagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToLeftBankedDown25: return StandUpRCTrackDiagFlatToLeftBankedDown25; - case TrackElemType::DiagFlatToRightBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: return StandUpRCTrackDiagFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToFlat: + case TrackElemType::diagLeftBankedDown25ToFlat: return StandUpRCTrackDiagLeftBankedDown25ToFlat; - case TrackElemType::DiagRightBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: return StandUpRCTrackDiagRightBankedDown25ToFlat; // Large banked curved slopes - case TrackElemType::LeftEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagUp25: return StandUpRCTrackLeftEighthBankToDiagUp25; - case TrackElemType::RightEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: return StandUpRCTrackRightEighthBankToDiagUp25; - case TrackElemType::LeftEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToDiagDown25: return StandUpRCTrackLeftEighthBankToDiagDown25; - case TrackElemType::RightEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: return StandUpRCTrackRightEighthBankToDiagDown25; - case TrackElemType::LeftEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalUp25: return StandUpRCTrackLeftEighthBankToOrthogonalUp25; - case TrackElemType::RightEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: return StandUpRCTrackRightEighthBankToOrthogonalUp25; - case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::leftEighthBankToOrthogonalDown25: return StandUpRCTrackLeftEighthBankToOrthogonalDown25; - case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: return StandUpRCTrackRightEighthBankToOrthogonalDown25; // Small banked to unbanked curved slopes - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return StandUpRCTrackLeftBankToLeftQuarterTurn325DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return StandUpRCTrackRightBankToRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return StandUpRCTrackLeftQuarterTurn325DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return StandUpRCTrackRightQuarterTurn325DegDownToRightBank; // Large corkscrews - case TrackElemType::LeftLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewUp: return StandUpRCTrackLeftLargeCorkscrewUp; - case TrackElemType::RightLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: return StandUpRCTrackRightLargeCorkscrewUp; - case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::leftLargeCorkscrewDown: return StandUpRCTrackLeftLargeCorkscrewDown; - case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: return StandUpRCTrackRightLargeCorkscrewDown; // Quarter loops - case TrackElemType::Up90ToInvertedFlatQuarterLoop: + case TrackElemType::up90ToInvertedFlatQuarterLoop: return StandUpRCTrack90DegToInvertedFlatQuarterLoopUp; - case TrackElemType::InvertedFlatToDown90QuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: return StandUpRCTrackInvertedFlatTo90DegQuarterLoopDown; // Medium half loops - case TrackElemType::LeftMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopUp: return StandUpRCTrackLeftMediumHalfLoopUp; - case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: return StandUpRCTrackRightMediumHalfLoopUp; - case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::leftMediumHalfLoopDown: return StandUpRCTrackLeftMediumHalfLoopDown; - case TrackElemType::RightMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: return StandUpRCTrackRightMediumHalfLoopDown; // Large half loops - case TrackElemType::LeftLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopUp: return StandUpRCTrackLeftLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: return StandUpRCTrackRightLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return StandUpRCTrackRightLargeHalfLoopDown; - case TrackElemType::LeftLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: return StandUpRCTrackLeftLargeHalfLoopDown; // Barrel rolls - case TrackElemType::LeftBarrelRollUpToDown: + case TrackElemType::leftBarrelRollUpToDown: return StandUpRCTrackLeftBarrelRollUpToDown; - case TrackElemType::RightBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: return StandUpRCTrackRightBarrelRollUpToDown; - case TrackElemType::LeftBarrelRollDownToUp: + case TrackElemType::leftBarrelRollDownToUp: return StandUpRCTrackLeftBarrelRollDownToUp; - case TrackElemType::RightBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: return StandUpRCTrackRightBarrelRollDownToUp; // Zero g rolls - case TrackElemType::LeftZeroGRollUp: + case TrackElemType::leftZeroGRollUp: return StandUpRCTrackLeftZeroGRollUp; - case TrackElemType::RightZeroGRollUp: + case TrackElemType::rightZeroGRollUp: return StandUpRCTrackRightZeroGRollUp; - case TrackElemType::LeftZeroGRollDown: + case TrackElemType::leftZeroGRollDown: return StandUpRCTrackLeftZeroGRollDown; - case TrackElemType::RightZeroGRollDown: + case TrackElemType::rightZeroGRollDown: return StandUpRCTrackRightZeroGRollDown; // Large zero g rolls - case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollUp: return StandUpRCTrackLeftLargeZeroGRollUp; - case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: return StandUpRCTrackRightLargeZeroGRollUp; - case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::leftLargeZeroGRollDown: return StandUpRCTrackLeftLargeZeroGRollDown; - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return StandUpRCTrackRightLargeZeroGRollDown; default: diff --git a/src/openrct2/paint/track/coaster/Steeplechase.cpp b/src/openrct2/paint/track/coaster/Steeplechase.cpp index 797783c16132..402b7f16c944 100644 --- a/src/openrct2/paint/track/coaster/Steeplechase.cpp +++ b/src/openrct2/paint/track/coaster/Steeplechase.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -2181,68 +2181,68 @@ static void SteeplechaseTrackBlockBrakes( PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } -TrackPaintFunction GetTrackPaintFunctionSteeplechase(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSteeplechase(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return SteeplechaseTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return SteeplechaseTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return SteeplechaseTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return SteeplechaseTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return SteeplechaseTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return SteeplechaseTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return SteeplechaseTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return SteeplechaseTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return SteeplechaseTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return SteeplechaseTrackRightQuarterTurn5; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return SteeplechaseTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return SteeplechaseTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return SteeplechaseTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return SteeplechaseTrackRightQuarterTurn3; - case TrackElemType::Brakes: + case TrackElemType::brakes: return SteeplechaseTrackBrakes; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return SteeplechaseTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return SteeplechaseTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return SteeplechaseTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return SteeplechaseTrackRightEighthToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return SteeplechaseTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return SteeplechaseTrackDiag25DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return SteeplechaseTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return SteeplechaseTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return SteeplechaseTrackDiag25DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return SteeplechaseTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return SteeplechaseTrackDiag25DegDownToFlat; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return SteeplechaseTrackBlockBrakes; - case TrackElemType::DiagBrakes: - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBrakes: + case TrackElemType::diagBlockBrakes: return SteeplechaseTrackDiagBrakes; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/SuspendedSwingingCoaster.cpp b/src/openrct2/paint/track/coaster/SuspendedSwingingCoaster.cpp index 5b2c120c2f7c..9ed1521a6dc1 100644 --- a/src/openrct2/paint/track/coaster/SuspendedSwingingCoaster.cpp +++ b/src/openrct2/paint/track/coaster/SuspendedSwingingCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -4689,113 +4689,113 @@ static void SuspendedSwingingRCTrackBlockBrakes( PaintUtilSetGeneralSupportHeight(session, height + 48); } -TrackPaintFunction GetTrackPaintFunctionSuspendedSwingingRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSuspendedSwingingRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return SuspendedSwingingRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return SuspendedSwingingRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return SuspendedSwingingRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return SuspendedSwingingRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return SuspendedSwingingRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return SuspendedSwingingRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return SuspendedSwingingRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return SuspendedSwingingRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return SuspendedSwingingRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return SuspendedSwingingRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return SuspendedSwingingRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return SuspendedSwingingRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return SuspendedSwingingRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return SuspendedSwingingRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return SuspendedSwingingRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return SuspendedSwingingRCTrackRightQuarterTurn5; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return SuspendedSwingingRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return SuspendedSwingingRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return SuspendedSwingingRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return SuspendedSwingingRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return SuspendedSwingingRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return SuspendedSwingingRCTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return SuspendedSwingingRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return SuspendedSwingingRCTrackRightQuarterTurn3; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return SuspendedSwingingRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return SuspendedSwingingRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return SuspendedSwingingRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return SuspendedSwingingRCTrackRightQuarterTurn325DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return SuspendedSwingingRCTrackBrakes; - case TrackElemType::LeftQuarterHelixLargeUp: + case TrackElemType::leftQuarterHelixLargeUp: return SuspendedSwingingRCTrackLeftQuarterHelixLargeUp; - case TrackElemType::RightQuarterHelixLargeUp: + case TrackElemType::rightQuarterHelixLargeUp: return SuspendedSwingingRCTrackRightQuarterHelixLargeUp; - case TrackElemType::LeftQuarterHelixLargeDown: + case TrackElemType::leftQuarterHelixLargeDown: return SuspendedSwingingRCTrackLeftQuarterHelixLargeDown; - case TrackElemType::RightQuarterHelixLargeDown: + case TrackElemType::rightQuarterHelixLargeDown: return SuspendedSwingingRCTrackRightQuarterHelixLargeDown; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return SuspendedSwingingRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return SuspendedSwingingRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return SuspendedSwingingRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return SuspendedSwingingRCTrackRightEighthToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return SuspendedSwingingRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return SuspendedSwingingRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return SuspendedSwingingRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return SuspendedSwingingRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return SuspendedSwingingRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return SuspendedSwingingRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return SuspendedSwingingRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return SuspendedSwingingRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return SuspendedSwingingRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return SuspendedSwingingRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return SuspendedSwingingRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return SuspendedSwingingRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return SuspendedSwingingRCTrackDiag25DegDownToFlat; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return SuspendedSwingingRCTrackBlockBrakes; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp b/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp index c6b71ef81ef3..812e177f4648 100644 --- a/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -116,7 +116,7 @@ static void TwisterRCTrackStation( 17155, }; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); PaintAddImageAsParentRotated( @@ -20051,545 +20051,545 @@ static void TwisterRCTrackRightEighthDiveLoopToDownOrthogonal( session, ride, 5 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionTwisterRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionTwisterRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return TwisterRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return TwisterRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return TwisterRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return TwisterRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return TwisterRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return TwisterRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return TwisterRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return TwisterRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return TwisterRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return TwisterRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return TwisterRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return TwisterRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return TwisterRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return TwisterRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return TwisterRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return TwisterRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return TwisterRCTrackFlatToLeftBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return TwisterRCTrackFlatToRightBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return TwisterRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return TwisterRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return TwisterRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return TwisterRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return TwisterRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return TwisterRCTrackRightBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return TwisterRCTrack25DegUpToLeftBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return TwisterRCTrack25DegUpToRightBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return TwisterRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return TwisterRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return TwisterRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return TwisterRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return TwisterRCTrackLeftBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return TwisterRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return TwisterRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return TwisterRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return TwisterRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return TwisterRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return TwisterRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return TwisterRCTrackSBendRight; - case TrackElemType::LeftVerticalLoop: + case TrackElemType::leftVerticalLoop: return TwisterRCTrackLeftVerticalLoop; - case TrackElemType::RightVerticalLoop: + case TrackElemType::rightVerticalLoop: return TwisterRCTrackRightVerticalLoop; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return TwisterRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return TwisterRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return TwisterRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return TwisterRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return TwisterRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return TwisterRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return TwisterRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return TwisterRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return TwisterRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return TwisterRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return TwisterRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return TwisterRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return TwisterRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return TwisterRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return TwisterRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return TwisterRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return TwisterRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return TwisterRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return TwisterRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return TwisterRCTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return TwisterRCTrackBrakes; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return TwisterRCTrack25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return TwisterRCTrack25DegUpRightBanked; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return TwisterRCTrackOnRidePhoto; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return TwisterRCTrack25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return TwisterRCTrack25DegDownRightBanked; - case TrackElemType::Up90: + case TrackElemType::up90: return TwisterRCTrack90DegUp; - case TrackElemType::Down90: + case TrackElemType::down90: return TwisterRCTrack90DegDown; - case TrackElemType::Up60ToUp90: + case TrackElemType::up60ToUp90: return TwisterRCTrack60DegUpTo90DegUp; - case TrackElemType::Down90ToDown60: + case TrackElemType::down90ToDown60: return TwisterRCTrack90DegDownTo60DegDown; - case TrackElemType::Up90ToUp60: + case TrackElemType::up90ToUp60: return TwisterRCTrack90DegUpTo60DegUp; - case TrackElemType::Down60ToDown90: + case TrackElemType::down60ToDown90: return TwisterRCTrack60DegDownTo90DegDown; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return TwisterRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return TwisterRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return TwisterRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return TwisterRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return TwisterRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return TwisterRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return TwisterRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return TwisterRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return TwisterRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return TwisterRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return TwisterRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return TwisterRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return TwisterRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return TwisterRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return TwisterRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return TwisterRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return TwisterRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return TwisterRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return TwisterRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return TwisterRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return TwisterRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return TwisterRCTrackDiagFlatToLeftBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return TwisterRCTrackDiagFlatToRightBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return TwisterRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return TwisterRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return TwisterRCTrackDiagLeftBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return TwisterRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return TwisterRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return TwisterRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return TwisterRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return TwisterRCTrackDiagRightBankTo25DegDown; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return TwisterRCTrackDiag25DegDownToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return TwisterRCTrackDiag25DegDownToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return TwisterRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return TwisterRCTrackDiagRightBank; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return TwisterRCTrackLeftBankToLeftQuarterTurn325DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return TwisterRCTrackRightBankToRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return TwisterRCTrackLeftQuarterTurn325DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return TwisterRCTrackRightQuarterTurn325DegDownToRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return TwisterRCTrackBlockBrakes; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return TwisterRCTrackLeftBankedQuarterTurn325DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return TwisterRCTrackRightBankedQuarterTurn325DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return TwisterRCTrackLeftBankedQuarterTurn325DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return TwisterRCTrackRightBankedQuarterTurn325DegDown; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return TwisterRCTrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return TwisterRCTrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return TwisterRCTrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return TwisterRCTrackRightBankedQuarterTurn525DegDown; - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return TwisterRCTrack25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return TwisterRCTrack25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return TwisterRCTrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return TwisterRCTrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return TwisterRCTrack25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return TwisterRCTrack25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return TwisterRCTrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return TwisterRCTrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return TwisterRCTrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return TwisterRCTrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return TwisterRCTrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return TwisterRCTrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return TwisterRCTrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return TwisterRCTrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return TwisterRCTrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return TwisterRCTrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return TwisterRCTrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return TwisterRCTrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return TwisterRCTrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return TwisterRCTrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return TwisterRCTrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return TwisterRCTrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return TwisterRCTrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return TwisterRCTrackRightBanked25DegDownToFlat; - case TrackElemType::LeftQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileUp90: return TwisterRCTrackLeftQuarterTurn190DegUp; - case TrackElemType::RightQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: return TwisterRCTrackRightQuarterTurn190DegUp; - case TrackElemType::LeftQuarterTurn1TileDown90: + case TrackElemType::leftQuarterTurn1TileDown90: return TwisterRCTrackLeftQuarterTurn190DegDown; - case TrackElemType::RightQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: return TwisterRCTrackRightQuarterTurn190DegDown; /* The following track elements used to be specific to the vertical RC */ - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return TwisterRCTrackFlatTo60DegUp; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return TwisterRCTrack60DegUpToFlat; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return TwisterRCTrackFlatTo60DegDown; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return TwisterRCTrack60DegDownToFlat; - case TrackElemType::BrakeForDrop: + case TrackElemType::brakeForDrop: return TwisterRCTrackBrakeForDrop; - case TrackElemType::DiagFlatToUp60: + case TrackElemType::diagFlatToUp60: return TwisterRCTrackDiagFlatTo60DegUp; - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::diagUp60ToFlat: return TwisterRCTrackDiag60DegUpToFlat; - case TrackElemType::DiagFlatToDown60: + case TrackElemType::diagFlatToDown60: return TwisterRCTrackDiagFlatTo60DegDown; - case TrackElemType::DiagDown60ToFlat: + case TrackElemType::diagDown60ToFlat: return TwisterRCTrackDiag60DegDownToFlat; /* The following track elements used to be specific to the Twister RC */ - case TrackElemType::HalfLoopUp: + case TrackElemType::halfLoopUp: return TwisterRCTrackHalfLoopUp; - case TrackElemType::HalfLoopDown: + case TrackElemType::halfLoopDown: return TwisterRCTrackHalfLoopDown; - case TrackElemType::LeftCorkscrewUp: + case TrackElemType::leftCorkscrewUp: return TwisterRCTrackLeftCorkscrewUp; - case TrackElemType::RightCorkscrewUp: + case TrackElemType::rightCorkscrewUp: return TwisterRCTrackRightCorkscrewUp; - case TrackElemType::LeftCorkscrewDown: + case TrackElemType::leftCorkscrewDown: return TwisterRCTrackLeftCorkscrewDown; - case TrackElemType::RightCorkscrewDown: + case TrackElemType::rightCorkscrewDown: return TwisterRCTrackRightCorkscrewDown; - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return TwisterRCTrackFlatTo60DegUpLongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return TwisterRCTrack60DegUpToFlatLongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return TwisterRCTrack60DegDownToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return TwisterRCTrackFlatTo60DegDownLongBase; - case TrackElemType::LeftBarrelRollUpToDown: + case TrackElemType::leftBarrelRollUpToDown: return TwisterRCTrackLeftBarrelRollUpToDown; - case TrackElemType::RightBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: return TwisterRCTrackRightBarrelRollUpToDown; - case TrackElemType::LeftBarrelRollDownToUp: + case TrackElemType::leftBarrelRollDownToUp: return TwisterRCTrackLeftBarrelRollDownToUp; - case TrackElemType::RightBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: return TwisterRCTrackRightBarrelRollDownToUp; - case TrackElemType::PoweredLift: + case TrackElemType::poweredLift: return TwisterRCTrackPoweredLift; - case TrackElemType::LeftLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopUp: return TwisterRCTrackLeftLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: return TwisterRCTrackRightLargeHalfLoopUp; - case TrackElemType::LeftLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: return TwisterRCTrackLeftLargeHalfLoopDown; - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return TwisterRCTrackRightLargeHalfLoopDown; - case TrackElemType::Up90ToInvertedFlatQuarterLoop: + case TrackElemType::up90ToInvertedFlatQuarterLoop: return TwisterRCTrack90DegToInvertedFlatQuarterLoopUp; - case TrackElemType::InvertedFlatToDown90QuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: return TwisterRCTrackInvertedFlatTo90DegQuarterLoopDown; - case TrackElemType::Booster: + case TrackElemType::booster: return TwisterRCTrackBooster; - case TrackElemType::LeftTwistDownToUp: + case TrackElemType::leftTwistDownToUp: return TwisterRCTrackLeftTwistDownToUp; - case TrackElemType::RightTwistDownToUp: + case TrackElemType::rightTwistDownToUp: return TwisterRCTrackRightTwistDownToUp; - case TrackElemType::LeftTwistUpToDown: + case TrackElemType::leftTwistUpToDown: return TwisterRCTrackLeftTwistUpToDown; - case TrackElemType::RightTwistUpToDown: + case TrackElemType::rightTwistUpToDown: return TwisterRCTrackRightTwistUpToDown; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return TwisterRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return TwisterRCTrackDiagBlockBrakes; - case TrackElemType::LeftFlyerTwistUp: + case TrackElemType::leftFlyerTwistUp: return TwisterRCTrackLeftFlyerTwistUp; - case TrackElemType::RightFlyerTwistUp: + case TrackElemType::rightFlyerTwistUp: return TwisterRCTrackRightFlyerTwistUp; - case TrackElemType::FlyerHalfLoopUninvertedUp: + case TrackElemType::flyerHalfLoopUninvertedUp: return TwisterRCTrackFlyerHalfLoopUp; // Large curved slopes - case TrackElemType::LeftEighthToDiagUp25: + case TrackElemType::leftEighthToDiagUp25: return TwisterRCTrackLeftEighthToDiagUp25; - case TrackElemType::RightEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: return TwisterRCTrackRightEighthToDiagUp25; - case TrackElemType::LeftEighthToDiagDown25: + case TrackElemType::leftEighthToDiagDown25: return TwisterRCTrackLeftEighthToDiagDown25; - case TrackElemType::RightEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: return TwisterRCTrackRightEighthToDiagDown25; - case TrackElemType::LeftEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalUp25: return TwisterRCTrackLeftEighthToOrthogonalUp25; - case TrackElemType::RightEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: return TwisterRCTrackRightEighthToOrthogonalUp25; - case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::leftEighthToOrthogonalDown25: return TwisterRCTrackLeftEighthToOrthogonalDown25; - case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: return TwisterRCTrackRightEighthToOrthogonalDown25; // Diagonal unbanked to banked - case TrackElemType::DiagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToLeftBankedUp25: return TwisterRCTrackDiagUp25ToLeftBankedUp25; - case TrackElemType::DiagUp25ToRightBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: return TwisterRCTrackDiagUp25ToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: return TwisterRCTrackDiagLeftBankedUp25ToUp25; - case TrackElemType::DiagRightBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: return TwisterRCTrackDiagRightBankedUp25ToUp25; - case TrackElemType::DiagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToLeftBankedDown25: return TwisterRCTrackDiagDown25ToLeftBankedDown25; - case TrackElemType::DiagDown25ToRightBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: return TwisterRCTrackDiagDown25ToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: return TwisterRCTrackDiagLeftBankedDown25ToDown25; - case TrackElemType::DiagRightBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: return TwisterRCTrackDiagRightBankedDown25ToDown25; - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: return TwisterRCTrackDiagLeftBankedFlatToLeftBankedUp25; - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: return TwisterRCTrackDiagRightBankedFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: return TwisterRCTrackDiagLeftBankedUp25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: return TwisterRCTrackDiagRightBankedUp25ToRightBankedFlat; - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: return TwisterRCTrackDiagLeftBankedFlatToLeftBankedDown25; - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: return TwisterRCTrackDiagRightBankedFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: return TwisterRCTrackDiagLeftBankedDown25ToLeftBankedFlat; - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: return TwisterRCTrackDiagRightBankedDown25ToRightBankedFlat; - case TrackElemType::DiagUp25LeftBanked: + case TrackElemType::diagUp25LeftBanked: return TwisterRCTrackDiagUp25LeftBanked; - case TrackElemType::DiagUp25RightBanked: + case TrackElemType::diagUp25RightBanked: return TwisterRCTrackDiagUp25RightBanked; - case TrackElemType::DiagDown25LeftBanked: + case TrackElemType::diagDown25LeftBanked: return TwisterRCTrackDiagDown25LeftBanked; - case TrackElemType::DiagDown25RightBanked: + case TrackElemType::diagDown25RightBanked: return TwisterRCTrackDiagDown25RightBanked; - case TrackElemType::DiagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToLeftBankedUp25: return TwisterRCTrackDiagFlatToLeftBankedUp25; - case TrackElemType::DiagFlatToRightBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: return TwisterRCTrackDiagFlatToRightBankedUp25; - case TrackElemType::DiagLeftBankedUp25ToFlat: + case TrackElemType::diagLeftBankedUp25ToFlat: return TwisterRCTrackDiagLeftBankedUp25ToFlat; - case TrackElemType::DiagRightBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: return TwisterRCTrackDiagRightBankedUp25ToFlat; - case TrackElemType::DiagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToLeftBankedDown25: return TwisterRCTrackDiagFlatToLeftBankedDown25; - case TrackElemType::DiagFlatToRightBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: return TwisterRCTrackDiagFlatToRightBankedDown25; - case TrackElemType::DiagLeftBankedDown25ToFlat: + case TrackElemType::diagLeftBankedDown25ToFlat: return TwisterRCTrackDiagLeftBankedDown25ToFlat; - case TrackElemType::DiagRightBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: return TwisterRCTrackDiagRightBankedDown25ToFlat; // Large banked curved slopes - case TrackElemType::LeftEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagUp25: return TwisterRCTrackLeftEighthBankToDiagUp25; - case TrackElemType::RightEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: return TwisterRCTrackRightEighthBankToDiagUp25; - case TrackElemType::LeftEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToDiagDown25: return TwisterRCTrackLeftEighthBankToDiagDown25; - case TrackElemType::RightEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: return TwisterRCTrackRightEighthBankToDiagDown25; - case TrackElemType::LeftEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalUp25: return TwisterRCTrackLeftEighthBankToOrthogonalUp25; - case TrackElemType::RightEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: return TwisterRCTrackRightEighthBankToOrthogonalUp25; - case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::leftEighthBankToOrthogonalDown25: return TwisterRCTrackLeftEighthBankToOrthogonalDown25; - case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: return TwisterRCTrackRightEighthBankToOrthogonalDown25; // Large corkscrews - case TrackElemType::LeftLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewUp: return TwisterRCTrackLeftLargeCorkscrewUp; - case TrackElemType::RightLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: return TwisterRCTrackRightLargeCorkscrewUp; - case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::leftLargeCorkscrewDown: return TwisterRCTrackLeftLargeCorkscrewDown; - case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: return TwisterRCTrackRightLargeCorkscrewDown; // Medium half loops - case TrackElemType::LeftMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopUp: return TwisterRCTrackLeftMediumHalfLoopUp; - case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: return TwisterRCTrackRightMediumHalfLoopUp; - case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::leftMediumHalfLoopDown: return TwisterRCTrackLeftMediumHalfLoopDown; - case TrackElemType::RightMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: return TwisterRCTrackRightMediumHalfLoopDown; // Zero g rolls - case TrackElemType::LeftZeroGRollUp: + case TrackElemType::leftZeroGRollUp: return TwisterRCTrackLeftZeroGRollUp; - case TrackElemType::RightZeroGRollUp: + case TrackElemType::rightZeroGRollUp: return TwisterRCTrackRightZeroGRollUp; - case TrackElemType::LeftZeroGRollDown: + case TrackElemType::leftZeroGRollDown: return TwisterRCTrackLeftZeroGRollDown; - case TrackElemType::RightZeroGRollDown: + case TrackElemType::rightZeroGRollDown: return TwisterRCTrackRightZeroGRollDown; // Large zero g rolls - case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollUp: return TwisterRCTrackLeftLargeZeroGRollUp; - case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: return TwisterRCTrackRightLargeZeroGRollUp; - case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::leftLargeZeroGRollDown: return TwisterRCTrackLeftLargeZeroGRollDown; - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return TwisterRCTrackRightLargeZeroGRollDown; // Diagonal flat to steep - case TrackElemType::DiagFlatToUp60LongBase: + case TrackElemType::diagFlatToUp60LongBase: return TwisterRCTrackDiagFlatTo60DegUpLongBase; - case TrackElemType::DiagUp60ToFlatLongBase: + case TrackElemType::diagUp60ToFlatLongBase: return TwisterRCTrackDiag60DegUpToFlatLongBase; - case TrackElemType::DiagFlatToDown60LongBase: + case TrackElemType::diagFlatToDown60LongBase: return TwisterRCTrackDiagFlatTo60DegDownLongBase; - case TrackElemType::DiagDown60ToFlatLongBase: + case TrackElemType::diagDown60ToFlatLongBase: return TwisterRCTrackDiag60DegDownToFlatLongBase; - case TrackElemType::LeftEighthDiveLoopUpToOrthogonal: + case TrackElemType::leftEighthDiveLoopUpToOrthogonal: return TwisterRCTrackLeftEighthDiveLoopUpToOrthogonal; // Dive loops - case TrackElemType::RightEighthDiveLoopUpToOrthogonal: + case TrackElemType::rightEighthDiveLoopUpToOrthogonal: return TwisterRCTrackRightEighthDiveLoopUpToOrthogonal; - case TrackElemType::LeftEighthDiveLoopDownToDiag: + case TrackElemType::leftEighthDiveLoopDownToDiag: return TwisterRCTrackLeftEighthDiveLoopDownToDiag; - case TrackElemType::RightEighthDiveLoopDownToDiag: + case TrackElemType::rightEighthDiveLoopDownToDiag: return TwisterRCTrackRightEighthDiveLoopToDownOrthogonal; default: diff --git a/src/openrct2/paint/track/coaster/TwisterRollerCoaster.h b/src/openrct2/paint/track/coaster/TwisterRollerCoaster.h index c490956e63e9..85e7b9852256 100644 --- a/src/openrct2/paint/track/coaster/TwisterRollerCoaster.h +++ b/src/openrct2/paint/track/coaster/TwisterRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/track/coaster/VirginiaReel.cpp b/src/openrct2/paint/track/coaster/VirginiaReel.cpp index 1fa84ba4a5cc..7c4844645808 100644 --- a/src/openrct2/paint/track/coaster/VirginiaReel.cpp +++ b/src/openrct2/paint/track/coaster/VirginiaReel.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -184,7 +184,7 @@ static void PaintVirginiaReelTrackFlat( PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -219,7 +219,7 @@ static void PaintVirginiaReelTrack25DegUp( session.WoodenSupportsPrependTo = ps; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -273,7 +273,7 @@ static void PaintVirginiaReelTrackFlatTo25DegUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -309,7 +309,7 @@ static void PaintVirginiaReelTrack25DegUpToFlat( session.WoodenSupportsPrependTo = ps; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -377,7 +377,7 @@ static void PaintVirginiaReelStation( PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilDrawStation(session, ride, direction, height, trackElement, StationBaseType::b, -2); @@ -406,7 +406,7 @@ static void PaintVirginiaReelTrackLeftQuarterTurn3Tiles( break; case 0: case 3: - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); break; @@ -440,7 +440,7 @@ static void PaintVirginiaReelTrackLeftQuarterTurn1Tile( TrackPaintUtilLeftQuarterTurn1TilePaint( session, 2, height, 0, direction, session.TrackColours, kPiecesFlatQuarterTurn1Tile); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) { @@ -472,40 +472,40 @@ static void PaintVirginiaReelTrackRightQuarterTurn1Tile( /** * rct2: 0x00811184 */ -TrackPaintFunction GetTrackPaintFunctionVirginiaReel(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionVirginiaReel(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintVirginiaReelTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintVirginiaReelStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintVirginiaReelTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintVirginiaReelTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintVirginiaReelTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintVirginiaReelTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintVirginiaReelTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintVirginiaReelTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return PaintVirginiaReelTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return PaintVirginiaReelTrackRightQuarterTurn3Tiles; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return PaintVirginiaReelTrackLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return PaintVirginiaReelTrackRightQuarterTurn1Tile; default: diff --git a/src/openrct2/paint/track/coaster/WildMouse.cpp b/src/openrct2/paint/track/coaster/WildMouse.cpp index 15e7632d4f24..eef8e980fece 100644 --- a/src/openrct2/paint/track/coaster/WildMouse.cpp +++ b/src/openrct2/paint/track/coaster/WildMouse.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -199,7 +199,7 @@ static void WildMouseTrackStation( const TrackElement& trackElement, SupportType supportType) { auto trackType = trackElement.GetTrackType(); - if (trackType == TrackElemType::EndStation) + if (trackType == TrackElemType::endStation) { bool isClosed = trackElement.IsBrakeClosed(); PaintAddImageAsParentRotated( @@ -941,69 +941,69 @@ static void WildMouseTrackBlockBrakes( PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } -TrackPaintFunction GetTrackPaintFunctionWildMouse(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionWildMouse(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return WildMouseTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return WildMouseTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return WildMouseTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return WildMouseTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return WildMouseTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return WildMouseTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return WildMouseTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return WildMouseTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return WildMouseTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return WildMouseTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return WildMouseTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return WildMouseTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return WildMouseTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return WildMouseTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return WildMouseTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return WildMouseTrackRightQuarterTurn3; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return WildMouseTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return WildMouseTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return WildMouseTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return WildMouseTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return WildMouseTrackLeftQuarterTurn1; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return WildMouseTrackRightQuarterTurn1; - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return WildMouseTrackFlatTo60DegUp; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return WildMouseTrack60DegUpToFlat; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return WildMouseTrackFlatTo60DegDown; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return WildMouseTrack60DegDownToFlat; - case TrackElemType::Brakes: + case TrackElemType::brakes: return WildMouseTrackBrakes; - case TrackElemType::RotationControlToggle: + case TrackElemType::rotationControlToggle: return WildMouseTrackRotationControlToggle; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return WildMouseTrackBlockBrakes; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.cpp b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.cpp index 154da4a2abde..05e26697bc20 100644 --- a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -27,6 +27,7 @@ #include "../../track/Support.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; // static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square; @@ -2064,7 +2065,7 @@ static void WoodenRCTrackStation( const bool drewStation = TrackPaintUtilDrawStation2( session, ride, direction, height, trackElement, StationBaseType::none, 0, 9, 11); const ImageId colours = isClassic ? session.TrackColours : session.SupportColours; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { const ImageIndex imageIndex = kStationBlockBrakesImageIds[drewStation][direction][trackElement.IsBrakeClosed()]; PaintAddImageAsParentRotated( @@ -13358,331 +13359,331 @@ static void WoodenRCTrackRightLargeHalfLoopDown( } template -TrackPaintFunction GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionWoodenAndClassicWoodenRC(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return WoodenRCTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return WoodenRCTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return WoodenRCTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return WoodenRCTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return WoodenRCTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return WoodenRCTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return WoodenRCTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return WoodenRCTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return WoodenRCTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return WoodenRCTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return WoodenRCTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return WoodenRCTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return WoodenRCTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return WoodenRCTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return WoodenRCTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return WoodenRCTrackRightQuarterTurn5; - case TrackElemType::FlatToLeftBank: + case TrackElemType::flatToLeftBank: return WoodenRCTrackFlatToBank; - case TrackElemType::FlatToRightBank: + case TrackElemType::flatToRightBank: return WoodenRCTrackFlatToBank; - case TrackElemType::LeftBankToFlat: + case TrackElemType::leftBankToFlat: return WoodenRCTrackLeftBankToFlat; - case TrackElemType::RightBankToFlat: + case TrackElemType::rightBankToFlat: return WoodenRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: return WoodenRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: return WoodenRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: + case TrackElemType::leftBankToUp25: return WoodenRCTrackBankTo25DegUp; - case TrackElemType::RightBankToUp25: + case TrackElemType::rightBankToUp25: return WoodenRCTrackBankTo25DegUp; - case TrackElemType::Up25ToLeftBank: + case TrackElemType::up25ToLeftBank: return WoodenRCTrack25DegUpToBank; - case TrackElemType::Up25ToRightBank: + case TrackElemType::up25ToRightBank: return WoodenRCTrack25DegUpToBank; - case TrackElemType::LeftBankToDown25: + case TrackElemType::leftBankToDown25: return WoodenRCTrackLeftBankTo25DegDown; - case TrackElemType::RightBankToDown25: + case TrackElemType::rightBankToDown25: return WoodenRCTrackRightBankTo25DegDown; - case TrackElemType::Down25ToLeftBank: + case TrackElemType::down25ToLeftBank: return WoodenRCTrack25DegDownToLeftBank; - case TrackElemType::Down25ToRightBank: + case TrackElemType::down25ToRightBank: return WoodenRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: + case TrackElemType::leftBank: return WoodenRCTrackFlatToBank; - case TrackElemType::RightBank: + case TrackElemType::rightBank: return WoodenRCTrackRightBank; - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return WoodenRCTrackLeftQuarterTurn525DegUp; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return WoodenRCTrackRightQuarterTurn525DegUp; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return WoodenRCTrackLeftQuarterTurn525DegDown; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return WoodenRCTrackRightQuarterTurn525DegDown; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return WoodenRCTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return WoodenRCTrackSBendRight; - case TrackElemType::LeftVerticalLoop: + case TrackElemType::leftVerticalLoop: return WoodenRCTrackLeftVerticalLoop; - case TrackElemType::RightVerticalLoop: + case TrackElemType::rightVerticalLoop: return WoodenRCTrackRightVerticalLoop; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return WoodenRCTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return WoodenRCTrackRightQuarterTurn3; - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: return WoodenRCTrackLeftQuarterTurn3Bank; - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: return WoodenRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return WoodenRCTrackLeftQuarterTurn325DegUp; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return WoodenRCTrackRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return WoodenRCTrackLeftQuarterTurn325DegDown; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return WoodenRCTrackRightQuarterTurn325DegDown; - case TrackElemType::LeftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixUpSmall: return WoodenRCTrackLeftHalfBankedHelixUpSmall; - case TrackElemType::RightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: return WoodenRCTrackRightHalfBankedHelixUpSmall; - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return WoodenRCTrackLeftHalfBankedHelixDownSmall; - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return WoodenRCTrackRightHalfBankedHelixDownSmall; - case TrackElemType::LeftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixUpLarge: return WoodenRCTrackLeftHalfBankedHelixUpLarge; - case TrackElemType::RightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: return WoodenRCTrackRightHalfBankedHelixUpLarge; - case TrackElemType::LeftHalfBankedHelixDownLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: return WoodenRCTrackLeftHalfBankedHelixDownLarge; - case TrackElemType::RightHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: return WoodenRCTrackRightHalfBankedHelixDownLarge; - case TrackElemType::LeftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileUp60: return WoodenRCTrackLeftQuarterTurn160DegUp; - case TrackElemType::RightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: return WoodenRCTrackRightQuarterTurn160DegUp; - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileDown60: return WoodenRCTrackLeftQuarterTurn160DegDown; - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: return WoodenRCTrackRightQuarterTurn160DegDown; - case TrackElemType::Brakes: + case TrackElemType::brakes: return WoodenRCTrackBrakes; - case TrackElemType::Up25LeftBanked: + case TrackElemType::up25LeftBanked: return WoodenRCTrack25DegUpLeftBanked; - case TrackElemType::Up25RightBanked: + case TrackElemType::up25RightBanked: return WoodenRCTrack25DegUpRightBanked; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return WoodenRCTrackOnRidePhoto; - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return WoodenRCTrackFlatTo60DegUpLongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return WoodenRCTrack60DegUpToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return WoodenRCTrackFlatTo60DegDownLongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return WoodenRCTrack60DegDownToFlatLongBase; - case TrackElemType::Down25LeftBanked: + case TrackElemType::down25LeftBanked: return WoodenRCTrack25DegDownLeftBanked; - case TrackElemType::Down25RightBanked: + case TrackElemType::down25RightBanked: return WoodenRCTrack25DegDownRightBanked; - case TrackElemType::Watersplash: + case TrackElemType::watersplash: return WoodenRCTrackWaterSplash; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return WoodenRCTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return WoodenRCTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return WoodenRCTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return WoodenRCTrackRightEighthToOrthogonal; - case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::leftEighthBankToDiag: return WoodenRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: + case TrackElemType::rightEighthBankToDiag: return WoodenRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToOrthogonal: return WoodenRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToOrthogonal: return WoodenRCTrackRightEighthBankToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return WoodenRCTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return WoodenRCTrackDiag25DegUp; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return WoodenRCTrackDiag60DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return WoodenRCTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return WoodenRCTrackDiag25DegUpTo60DegUp; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return WoodenRCTrackDiag60DegUpTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return WoodenRCTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return WoodenRCTrackDiag25DegDown; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return WoodenRCTrackDiag60DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return WoodenRCTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return WoodenRCTrackDiag25DegDownTo60DegDown; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return WoodenRCTrackDiag60DegDownTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return WoodenRCTrackDiag25DegDownToFlat; - case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::diagFlatToLeftBank: return WoodenRCTrackDiagFlatToBank; - case TrackElemType::DiagFlatToRightBank: + case TrackElemType::diagFlatToRightBank: return WoodenRCTrackDiagFlatToBank; - case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::diagLeftBankToFlat: return WoodenRCTrackDiagLeftBankToFlat; - case TrackElemType::DiagRightBankToFlat: + case TrackElemType::diagRightBankToFlat: return WoodenRCTrackDiagRightBankToFlat; - case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::diagLeftBankToUp25: return WoodenRCTrackDiagBankTo25DegUp; - case TrackElemType::DiagRightBankToUp25: + case TrackElemType::diagRightBankToUp25: return WoodenRCTrackDiagBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::diagUp25ToLeftBank: return WoodenRCTrackDiagUp25ToBank; - case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::diagUp25ToRightBank: return WoodenRCTrackDiagUp25ToBank; - case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::diagLeftBankToDown25: return WoodenRCTrackDiagLeftBankToDown25; - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagRightBankToDown25: return WoodenRCTrackDiagRightBankToDown25; - case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::diagDown25ToLeftBank: return WoodenRCTrackDiagDown25ToLeftBank; - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagDown25ToRightBank: return WoodenRCTrackDiagDown25ToRightBank; - case TrackElemType::DiagLeftBank: + case TrackElemType::diagLeftBank: return WoodenRCTrackDiagLeftBank; - case TrackElemType::DiagRightBank: + case TrackElemType::diagRightBank: return WoodenRCTrackDiagRightBank; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return WoodenRCTrackLeftBankToLeftQuarterTurn325DegUp; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return WoodenRCTrackRightBankToRightQuarterTurn325DegUp; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return WoodenRCTrackLeftQuarterTurn325DegDownToLeftBank; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return WoodenRCTrackRightQuarterTurn325DegDownToRightBank; - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: return WoodenRCTrackBlockBrakes; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: return WoodenRCTrackLeftBankedQuarterTurn325DegUp; - case TrackElemType::RightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: return WoodenRCTrackRightBankedQuarterTurn325DegUp; - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return WoodenRCTrackLeftBankedQuarterTurn325DegDown; - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return WoodenRCTrackRightBankedQuarterTurn325DegDown; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: return WoodenRCTrackLeftBankedQuarterTurn525DegUp; - case TrackElemType::RightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: return WoodenRCTrackRightBankedQuarterTurn525DegUp; - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return WoodenRCTrackLeftBankedQuarterTurn525DegDown; - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return WoodenRCTrackRightBankedQuarterTurn525DegDown; - case TrackElemType::Up25ToLeftBankedUp25: + case TrackElemType::up25ToLeftBankedUp25: return WoodenRCTrack25DegUpToLeftBanked25DegUp; - case TrackElemType::Up25ToRightBankedUp25: + case TrackElemType::up25ToRightBankedUp25: return WoodenRCTrack25DegUpToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToUp25: + case TrackElemType::leftBankedUp25ToUp25: return WoodenRCTrackLeftBanked25DegUpTo25DegUp; - case TrackElemType::RightBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: return WoodenRCTrackRightBanked25DegUpTo25DegUp; - case TrackElemType::Down25ToLeftBankedDown25: + case TrackElemType::down25ToLeftBankedDown25: return WoodenRCTrack25DegDownToLeftBanked25DegDown; - case TrackElemType::Down25ToRightBankedDown25: + case TrackElemType::down25ToRightBankedDown25: return WoodenRCTrack25DegDownToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToDown25: + case TrackElemType::leftBankedDown25ToDown25: return WoodenRCTrackLeftBanked25DegDownTo25DegDown; - case TrackElemType::RightBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: return WoodenRCTrackRightBanked25DegDownTo25DegDown; - case TrackElemType::LeftBankedFlatToLeftBankedUp25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: return WoodenRCTrackLeftBankedFlatToLeftBanked25DegUp; - case TrackElemType::RightBankedFlatToRightBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: return WoodenRCTrackRightBankedFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: return WoodenRCTrackLeftBanked25DegUpToLeftBankedFlat; - case TrackElemType::RightBankedUp25ToRightBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: return WoodenRCTrackRightBanked25DegUpToRightBankedFlat; - case TrackElemType::LeftBankedFlatToLeftBankedDown25: + case TrackElemType::leftBankedFlatToLeftBankedDown25: return WoodenRCTrackLeftBankedFlatToLeftBanked25DegDown; - case TrackElemType::RightBankedFlatToRightBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: return WoodenRCTrackRightBankedFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: return WoodenRCTrackLeftBanked25DegDownToLeftBankedFlat; - case TrackElemType::RightBankedDown25ToRightBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: return WoodenRCTrackRightBanked25DegDownToRightBankedFlat; - case TrackElemType::FlatToLeftBankedUp25: + case TrackElemType::flatToLeftBankedUp25: return WoodenRCTrackFlatToLeftBanked25DegUp; - case TrackElemType::FlatToRightBankedUp25: + case TrackElemType::flatToRightBankedUp25: return WoodenRCTrackFlatToRightBanked25DegUp; - case TrackElemType::LeftBankedUp25ToFlat: + case TrackElemType::leftBankedUp25ToFlat: return WoodenRCTrackLeftBanked25DegUpToFlat; - case TrackElemType::RightBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: return WoodenRCTrackRightBanked25DegUpToFlat; - case TrackElemType::FlatToLeftBankedDown25: + case TrackElemType::flatToLeftBankedDown25: return WoodenRCTrackFlatToLeftBanked25DegDown; - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::flatToRightBankedDown25: return WoodenRCTrackFlatToRightBanked25DegDown; - case TrackElemType::LeftBankedDown25ToFlat: + case TrackElemType::leftBankedDown25ToFlat: return WoodenRCTrackLeftBanked25DegDownToFlat; - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return WoodenRCTrackRightBanked25DegDownToFlat; - case TrackElemType::Booster: + case TrackElemType::booster: return WoodenRCTrackBooster; - case TrackElemType::DiagBrakes: + case TrackElemType::diagBrakes: return WoodenRCTrackDiagBrakes; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: return WoodenRCTrackDiagBlockBrakes; - case TrackElemType::LeftMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopUp: return WoodenRCTrackLeftMediumHalfLoopUp; - case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: return WoodenRCTrackRightMediumHalfLoopUp; - case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::leftMediumHalfLoopDown: return WoodenRCTrackLeftMediumHalfLoopDown; - case TrackElemType::RightMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: return WoodenRCTrackRightMediumHalfLoopDown; - case TrackElemType::LeftLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopUp: return WoodenRCTrackLeftLargeHalfLoopUp; - case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: return WoodenRCTrackRightLargeHalfLoopUp; - case TrackElemType::LeftLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: return WoodenRCTrackLeftLargeHalfLoopDown; - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return WoodenRCTrackRightLargeHalfLoopDown; default: return TrackPaintFunctionDummy; } } -TrackPaintFunction GetTrackPaintFunctionWoodenRC(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionWoodenRC(TrackElemType trackType) { return GetTrackPaintFunctionWoodenAndClassicWoodenRC(trackType); } -TrackPaintFunction GetTrackPaintFunctionClassicWoodenRCFallback(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionClassicWoodenRCFallback(TrackElemType trackType) { return GetTrackPaintFunctionWoodenAndClassicWoodenRC(trackType); } diff --git a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp index 60ed53fa2572..715b4ffc2fc5 100644 --- a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp +++ b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -303,7 +303,7 @@ static void WoodenRCTrackLeftQuarterTurn3Bank( kSegmentsAll, }; - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments[trackSequence], direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -521,7 +521,7 @@ static void WoodenRCTrackBankedRightQuarterTurn5( kSegmentsAll, }; - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments[trackSequence], direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -2964,7 +2964,7 @@ static void WoodenRCTrackDiagFlatToBank( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -3032,7 +3032,7 @@ static void WoodenRCTrackDiagBankTo25DegUp( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48); @@ -3100,7 +3100,7 @@ static void WoodenRCTrackDiagUp25ToBank( break; } - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56); @@ -3168,7 +3168,7 @@ static void WoodenRCTrackDiagLeftBank( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -3336,7 +3336,7 @@ static void WoodenRCTrackLeftEighthBankToDiag( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -3504,10 +3504,10 @@ static void WoodenRCTrackRightEighthBankToDiag( break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } -TrackPaintFunction GetTrackPaintFunctionClassicWoodenRCFallback(OpenRCT2::TrackElemType trackType); +TrackPaintFunction GetTrackPaintFunctionClassicWoodenRCFallback(TrackElemType trackType); diff --git a/src/openrct2/paint/track/coaster/WoodenWildMouse.cpp b/src/openrct2/paint/track/coaster/WoodenWildMouse.cpp index b4565ee46b58..c20904906b95 100644 --- a/src/openrct2/paint/track/coaster/WoodenWildMouse.cpp +++ b/src/openrct2/paint/track/coaster/WoodenWildMouse.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -141,7 +141,7 @@ static void WoodenWildMouseTrackFlat( auto imageId = session.TrackColours.WithIndex(imageIds[direction]); PaintAddImageAsParentRotated(session, direction, imageId, { 0, 6, height }, { 32, 20, 1 }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight( @@ -169,7 +169,7 @@ static void WoodenWildMouseTrackStation( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(imageIds[direction]), { 0, 6, height }, { { 0, 6, height + 1 }, { 32, 20, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilDrawStation(session, ride, direction, height, trackElement, StationBaseType::b, -2); TrackPaintUtilDrawStationTunnel(session, direction, height); @@ -201,7 +201,7 @@ static void WoodenWildMouseTrack25DegUp( auto imageId = session.TrackColours.WithIndex(imageIds[isChained][direction]); PaintAddImageAsParentRotated(session, direction, imageId, { 0, 2, height }, { { 0, 3, height }, { 32, 25, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -249,7 +249,7 @@ static void WoodenWildMouseTrack60DegUp( session, direction, imageId, { 0, 6, height }, { { 28, 4, height - 16 }, { 2, 24, 93 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -289,7 +289,7 @@ static void WoodenWildMouseTrackFlatTo25DegUp( auto imageId = session.TrackColours.WithIndex(imageIds[isChained][direction]); PaintAddImageAsParentRotated(session, direction, imageId, { 0, 2, height }, { { 0, 3, height }, { 32, 25, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -341,7 +341,7 @@ static void WoodenWildMouseTrack25DegUpTo60DegUp( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 6, height }, { { 0, 4, height }, { 32, 2, 43 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -392,7 +392,7 @@ static void WoodenWildMouseTrack60DegTo25DegUp( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 6, height }, { { 0, 4, height }, { 32, 2, 43 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -432,7 +432,7 @@ static void WoodenWildMouseTrack25DegUpToFlat( auto imageId = session.TrackColours.WithIndex(imageIds[isChained][direction]); PaintAddImageAsParentRotated(session, direction, imageId, { 0, 2, height }, { { 0, 3, height }, { 32, 25, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -526,7 +526,7 @@ static void WoodenWildMouseTrackRightQuarterTurn3( TrackPaintUtilRightQuarterTurn3TilesPaint4(session, height, direction, trackSequence, session.TrackColours, imageIds); TrackPaintUtilRightQuarterTurn3TilesTunnel(session, kTunnelGroup, TunnelSubType::Flat, height, direction, trackSequence); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); int32_t blockedSegments = 0; @@ -582,7 +582,7 @@ static void WoodenWildMouseTrackLeftQuarterTurn1( PaintAddImageAsParent(session, imageId, { 6, 6, height }, { 24, 24, 1 }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); TrackPaintUtilLeftQuarterTurn1TileTunnel( session, kTunnelGroup, direction, height, 0, TunnelSubType::Flat, 0, TunnelSubType::Flat); @@ -633,7 +633,7 @@ static void WoodenWildMouseTrackFlatTo60DegUp( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 6, height }, { { 0, 4, height }, { 32, 2, 43 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -684,7 +684,7 @@ static void WoodenWildMouseTrack60DegUpToFlat( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 6, height }, { { 0, 4, height }, { 32, 2, 43 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -716,55 +716,55 @@ static void WoodenWildMouseTrack60DegDownToFlat( WoodenWildMouseTrackFlatTo60DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionWoodenWildMouse(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionWoodenWildMouse(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return WoodenWildMouseTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return WoodenWildMouseTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return WoodenWildMouseTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return WoodenWildMouseTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return WoodenWildMouseTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return WoodenWildMouseTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return WoodenWildMouseTrack60DegTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return WoodenWildMouseTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return WoodenWildMouseTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return WoodenWildMouseTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return WoodenWildMouseTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return WoodenWildMouseTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return WoodenWildMouseTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return WoodenWildMouseTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return WoodenWildMouseTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return WoodenWildMouseTrackRightQuarterTurn3; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return WoodenWildMouseTrackLeftQuarterTurn1; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return WoodenWildMouseTrackRightQuarterTurn1; - case TrackElemType::FlatToUp60: + case TrackElemType::flatToUp60: return WoodenWildMouseTrackFlatTo60DegUp; - case TrackElemType::Up60ToFlat: + case TrackElemType::up60ToFlat: return WoodenWildMouseTrack60DegUpToFlat; - case TrackElemType::FlatToDown60: + case TrackElemType::flatToDown60: return WoodenWildMouseTrackFlatTo60DegDown; - case TrackElemType::Down60ToFlat: + case TrackElemType::down60ToFlat: return WoodenWildMouseTrack60DegDownToFlat; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/gentle/CarRide.cpp b/src/openrct2/paint/track/gentle/CarRide.cpp index bff64e1489f8..e0c5d6bc2696 100644 --- a/src/openrct2/paint/track/gentle/CarRide.cpp +++ b/src/openrct2/paint/track/gentle/CarRide.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -723,58 +723,58 @@ static void PaintCarRideTrackLogBumps( /** * rct2: 0x006F7000 */ -TrackPaintFunction GetTrackPaintFunctionCarRide(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionCarRide(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintCarRideTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintCarRideStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintCarRideTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return PaintCarRideTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintCarRideTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return PaintCarRideTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return PaintCarRideTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintCarRideTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintCarRideTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return PaintCarRideTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintCarRideTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return PaintCarRideTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return PaintCarRideTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintCarRideTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return PaintCarRideTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return PaintCarRideTrackRightQuarterTurn3Tiles; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return PaintCarRideTrackLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return PaintCarRideTrackRightQuarterTurn1Tile; - case TrackElemType::Rapids: + case TrackElemType::rapids: return PaintCarRideTrackLogBumps; - case TrackElemType::SpinningTunnel: + case TrackElemType::spinningTunnel: return PaintCarRideTrackSpinningTunnel; default: diff --git a/src/openrct2/paint/track/gentle/Circus.cpp b/src/openrct2/paint/track/gentle/Circus.cpp index 73caf4278759..ed016d2422e8 100644 --- a/src/openrct2/paint/track/gentle/Circus.cpp +++ b/src/openrct2/paint/track/gentle/Circus.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -121,9 +121,9 @@ static void PaintCircus( PaintUtilSetGeneralSupportHeight(session, height + 128); } -TrackPaintFunction GetTrackPaintFunctionCircus(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionCircus(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack3x3) + if (trackType != TrackElemType::flatTrack3x3) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/gentle/CrookedHouse.cpp b/src/openrct2/paint/track/gentle/CrookedHouse.cpp index 9182782c9139..81a159cfe0d4 100644 --- a/src/openrct2/paint/track/gentle/CrookedHouse.cpp +++ b/src/openrct2/paint/track/gentle/CrookedHouse.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -85,6 +85,7 @@ static void PaintCrookedHouseStructure( { { boundBox.offset, height + 3 }, { boundBox.length, 127 } }); session.CurrentlyDrawnEntity = nullptr; + session.InteractionType = ViewportInteractionItem::ride; } static void PaintCrookedHouse( @@ -146,9 +147,9 @@ static void PaintCrookedHouse( PaintUtilSetGeneralSupportHeight(session, height + 128); } -TrackPaintFunction GetTrackPaintFunctionCrookedHouse(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionCrookedHouse(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack3x3) + if (trackType != TrackElemType::flatTrack3x3) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/gentle/Dodgems.cpp b/src/openrct2/paint/track/gentle/Dodgems.cpp index 09b2d67ea28a..b0cf9c03cd6f 100644 --- a/src/openrct2/paint/track/gentle/Dodgems.cpp +++ b/src/openrct2/paint/track/gentle/Dodgems.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,6 +18,7 @@ #include "../../track/Segment.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; enum { @@ -108,9 +109,9 @@ static void PaintDodgems( /** * rct2: */ -TrackPaintFunction GetTrackPaintFunctionDodgems(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionDodgems(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack4x4) + if (trackType != TrackElemType::flatTrack4x4) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/gentle/FerrisWheel.cpp b/src/openrct2/paint/track/gentle/FerrisWheel.cpp index 08a1eefeb799..f35e504be988 100644 --- a/src/openrct2/paint/track/gentle/FerrisWheel.cpp +++ b/src/openrct2/paint/track/gentle/FerrisWheel.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -174,9 +174,9 @@ static void PaintFerrisWheel( PaintUtilSetGeneralSupportHeight(session, height + 176); } -TrackPaintFunction GetTrackPaintFunctionFerrisWheel(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionFerrisWheel(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack1x4C) + if (trackType != TrackElemType::flatTrack1x4C) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/gentle/FlyingSaucers.cpp b/src/openrct2/paint/track/gentle/FlyingSaucers.cpp index cc3c9c40dead..9e0e936a0a52 100644 --- a/src/openrct2/paint/track/gentle/FlyingSaucers.cpp +++ b/src/openrct2/paint/track/gentle/FlyingSaucers.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -69,9 +69,9 @@ static void PaintFlyingSaucers( /** * rct2: 0x00887208 */ -TrackPaintFunction GetTrackPaintFunctionFlyingSaucers(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionFlyingSaucers(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack4x4) + if (trackType != TrackElemType::flatTrack4x4) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/gentle/GhostTrain.cpp b/src/openrct2/paint/track/gentle/GhostTrain.cpp index 4e031da1a79c..151440324907 100644 --- a/src/openrct2/paint/track/gentle/GhostTrain.cpp +++ b/src/openrct2/paint/track/gentle/GhostTrain.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -262,7 +262,7 @@ static void PaintGhostTrainTrackFlatTo25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - bool isBackwards = trackElement.GetTrackType() == TrackElemType::Down25ToFlat; + bool isBackwards = trackElement.GetTrackType() == TrackElemType::down25ToFlat; TunnelType doorImage; if (!isBackwards) { @@ -428,7 +428,7 @@ static void PaintGhostTrainTrackRightQuarterTurn3Tiles( TrackPaintUtilRightQuarterTurn3TilesPaint( session, 3, height, direction, trackSequence, session.TrackColours, kGhostTrainTrackPiecesQuarterTurn3Tiles, nullptr, defaultRightQuarterTurn3TilesBoundLengths, defaultRightQuarterTurn3TilesBoundOffsets); - bool isBackwards = trackElement.GetTrackType() == TrackElemType::LeftQuarterTurn3Tiles; + bool isBackwards = trackElement.GetTrackType() == TrackElemType::leftQuarterTurn3Tiles; bool isDoorA = (!isBackwards && trackSequence == 0) || (isBackwards && trackSequence == 3); auto tunnelType = isDoorA ? kDoorOpeningInwardsToImage[trackElement.GetDoorAState()] : kDoorOpeningOutwardsToImage[trackElement.GetDoorBState()]; @@ -478,7 +478,7 @@ static void PaintGhostTrainTrackLeftQuarterTurn1Tile( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - bool isBackwards = trackElement.GetTrackType() == TrackElemType::RightQuarterTurn1Tile; + bool isBackwards = trackElement.GetTrackType() == TrackElemType::rightQuarterTurn1Tile; TunnelType tunnelStartImage, tunnelEndImage; if (!isBackwards) { @@ -559,46 +559,46 @@ static void PaintGhostTrainTrackBrakes( /** * rct2: 0x00770924 */ -TrackPaintFunction GetTrackPaintFunctionGhostTrain(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionGhostTrain(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintGhostTrainTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintGhostTrainStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintGhostTrainTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintGhostTrainTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintGhostTrainTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintGhostTrainTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintGhostTrainTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintGhostTrainTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return PaintGhostTrainTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return PaintGhostTrainTrackRightQuarterTurn3Tiles; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return PaintGhostTrainTrackLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return PaintGhostTrainTrackRightQuarterTurn1Tile; - case TrackElemType::Brakes: + case TrackElemType::brakes: return PaintGhostTrainTrackBrakes; - case TrackElemType::SpinningTunnel: + case TrackElemType::spinningTunnel: return PaintGhostTrainTrackSpinningTunnel; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/gentle/HauntedHouse.cpp b/src/openrct2/paint/track/gentle/HauntedHouse.cpp index 5cd3deaf7cb0..5e9b2abdff6f 100644 --- a/src/openrct2/paint/track/gentle/HauntedHouse.cpp +++ b/src/openrct2/paint/track/gentle/HauntedHouse.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -54,7 +54,7 @@ static void PaintHauntedHouseStructure( auto bb = BoundBoxXYZ{ { boundBox.offset, height }, { boundBox.length, 127 } }; PaintAddImageAsParent(session, stationColour.WithIndex(imageIndex), { xOffset, yOffset, height }, bb); - if (session.DPI.zoom_level <= ZoomLevel{ 0 } && frameNum != 0) + if (session.rt.zoom_level <= ZoomLevel{ 0 } && frameNum != 0) { imageIndex = baseImageIndex + 3 + ((direction & 3) * 18) + frameNum; PaintAddImageAsChild( @@ -74,7 +74,7 @@ static void PaintHauntedHouse( int32_t edges = kEdges3x3[trackSequence]; - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, GetStationColourScheme(session, trackElement)); const StationObject* stationObject = ride.getStationObject(); @@ -125,9 +125,9 @@ static void PaintHauntedHouse( PaintUtilSetGeneralSupportHeight(session, height + 128); } -TrackPaintFunction GetTrackPaintFunctionHauntedHouse(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionHauntedHouse(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack3x3) + if (trackType != TrackElemType::flatTrack3x3) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/gentle/Maze.cpp b/src/openrct2/paint/track/gentle/Maze.cpp index b04413a0aa39..6cc8386b140b 100644 --- a/src/openrct2/paint/track/gentle/Maze.cpp +++ b/src/openrct2/paint/track/gentle/Maze.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -187,9 +187,9 @@ static void MazePaintSetup( /** * rct2: 0x008A81E8 */ -TrackPaintFunction GetTrackPaintFunctionMaze(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMaze(TrackElemType trackType) { - if (trackType != TrackElemType::Maze) + if (trackType != TrackElemType::maze) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/gentle/MerryGoRound.cpp b/src/openrct2/paint/track/gentle/MerryGoRound.cpp index bfae0f618a7d..e8c8de8c366d 100644 --- a/src/openrct2/paint/track/gentle/MerryGoRound.cpp +++ b/src/openrct2/paint/track/gentle/MerryGoRound.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -34,7 +34,7 @@ static void PaintRiders( PaintSession& session, const Ride& ride, const RideObjectEntry& rideEntry, const Vehicle& vehicle, int32_t rotationOffset, const CoordsXYZ& offset, const BoundBoxXYZ& bb) { - if (session.DPI.zoom_level > ZoomLevel{ 0 }) + if (session.rt.zoom_level > ZoomLevel{ 0 }) return; if (!(ride.lifecycleFlags & RIDE_LIFECYCLE_ON_TRACK)) return; @@ -175,9 +175,9 @@ static void PaintMerryGoRound( PaintUtilSetGeneralSupportHeight(session, height + 64); } -TrackPaintFunction GetTrackPaintFunctionMerryGoRound(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMerryGoRound(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack3x3) + if (trackType != TrackElemType::flatTrack3x3) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/gentle/MiniGolf.cpp b/src/openrct2/paint/track/gentle/MiniGolf.cpp index 51fcdcccb399..f37f3ef33513 100644 --- a/src/openrct2/paint/track/gentle/MiniGolf.cpp +++ b/src/openrct2/paint/track/gentle/MiniGolf.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1086,46 +1086,46 @@ static void PaintMiniGolfHoleE( /** * rct2: 0x0087EDC4 */ -TrackPaintFunction GetTrackPaintFunctionMiniGolf(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMiniGolf(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintMiniGolfTrackFlat; - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: - case TrackElemType::EndStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: + case TrackElemType::endStation: return PaintMiniGolfStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintMiniGolfTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintMiniGolfTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintMiniGolfTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintMiniGolfTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintMiniGolfTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintMiniGolfTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return PaintMiniGolfTrackLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return PaintMiniGolfTrackRightQuarterTurn1Tile; - case TrackElemType::MinigolfHoleA: + case TrackElemType::minigolfHoleA: return PaintMiniGolfHoleA; - case TrackElemType::MinigolfHoleB: + case TrackElemType::minigolfHoleB: return PaintMiniGolfHoleB; - case TrackElemType::MinigolfHoleC: + case TrackElemType::minigolfHoleC: return PaintMiniGolfHoleC; - case TrackElemType::MinigolfHoleD: + case TrackElemType::minigolfHoleD: return PaintMiniGolfHoleD; - case TrackElemType::MinigolfHoleE: + case TrackElemType::minigolfHoleE: return PaintMiniGolfHoleE; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/gentle/MiniHelicopters.cpp b/src/openrct2/paint/track/gentle/MiniHelicopters.cpp index b7ba82cb0455..5ec5fdba7fd9 100644 --- a/src/openrct2/paint/track/gentle/MiniHelicopters.cpp +++ b/src/openrct2/paint/track/gentle/MiniHelicopters.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -365,43 +365,43 @@ static void PaintMiniHelicoptersTrackSpinningTunnel( /** * rct2: 0x0081F268 */ -TrackPaintFunction GetTrackPaintFunctionMiniHelicopters(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMiniHelicopters(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintMiniHelicoptersTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintMiniHelicoptersTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintMiniHelicoptersTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintMiniHelicoptersTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintMiniHelicoptersTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintMiniHelicoptersTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintMiniHelicoptersTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintMiniHelicoptersTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return PaintMiniHelicoptersTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return PaintMiniHelicoptersTrackRightQuarterTurn3Tiles; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return PaintMiniHelicoptersTrackLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return PaintMiniHelicoptersTrackRightQuarterTurn1Tile; - case TrackElemType::SpinningTunnel: + case TrackElemType::spinningTunnel: return PaintMiniHelicoptersTrackSpinningTunnel; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/gentle/MonorailCycles.cpp b/src/openrct2/paint/track/gentle/MonorailCycles.cpp index 4ba25f2a7376..44751a34c40c 100644 --- a/src/openrct2/paint/track/gentle/MonorailCycles.cpp +++ b/src/openrct2/paint/track/gentle/MonorailCycles.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -591,31 +591,31 @@ static void PaintMonorailCyclesTrackSBendRight( /** * rct2: 0x0088ac88 */ -TrackPaintFunction GetTrackPaintFunctionMonorailCycles(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMonorailCycles(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintMonorailCyclesTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintMonorailCyclesStation; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return PaintMonorailCyclesTrackLeftQuarterTurn5Tiles; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return PaintMonorailCyclesTrackRightQuarterTurn5Tiles; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return PaintMonorailCyclesTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return PaintMonorailCyclesTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return PaintMonorailCyclesTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return PaintMonorailCyclesTrackRightQuarterTurn3Tiles; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/gentle/ObservationTower.cpp b/src/openrct2/paint/track/gentle/ObservationTower.cpp index 4c851a6272e9..f4ebf2bf5f8c 100644 --- a/src/openrct2/paint/track/gentle/ObservationTower.cpp +++ b/src/openrct2/paint/track/gentle/ObservationTower.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -140,14 +140,14 @@ static void PaintObservationTowerSection( /** * rct2: 0x0070DC5C */ -TrackPaintFunction GetTrackPaintFunctionObservationTower(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionObservationTower(TrackElemType trackType) { switch (trackType) { - case TrackElemType::TowerBase: + case TrackElemType::towerBase: return PaintObservationTowerBase; - case TrackElemType::TowerSection: + case TrackElemType::towerSection: return PaintObservationTowerSection; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/gentle/SpaceRings.cpp b/src/openrct2/paint/track/gentle/SpaceRings.cpp index 9452a4079b87..6fae6af96c0f 100644 --- a/src/openrct2/paint/track/gentle/SpaceRings.cpp +++ b/src/openrct2/paint/track/gentle/SpaceRings.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -102,7 +102,7 @@ static void PaintSpaceRings( ImageId imageId; auto stationColour = GetStationColourScheme(session, trackElement); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, GetStationColourScheme(session, trackElement)); const StationObject* stationObject = ride.getStationObject(); @@ -190,9 +190,9 @@ static void PaintSpaceRings( /** * rct2: 0x0x00767A40 */ -TrackPaintFunction GetTrackPaintFunctionSpaceRings(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSpaceRings(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack3x3) + if (trackType != TrackElemType::flatTrack3x3) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/gentle/SpiralSlide.cpp b/src/openrct2/paint/track/gentle/SpiralSlide.cpp index ef2117f25184..a86359d9746f 100644 --- a/src/openrct2/paint/track/gentle/SpiralSlide.cpp +++ b/src/openrct2/paint/track/gentle/SpiralSlide.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -138,7 +138,7 @@ static void SpiralSlidePaintTileFront( PaintAddImageAsParent(session, imageId, { 16, 16, height }, { { 8, 0, height + 3 }, { 8, 16, 108 } }); } - if (session.DPI.zoom_level <= ZoomLevel{ 0 } && ride.slideInUse) + if (session.rt.zoom_level <= ZoomLevel{ 0 } && ride.slideInUse) { uint8_t slide_progress = ride.spiralSlideProgress; if (slide_progress != 0) @@ -253,9 +253,9 @@ static void PaintSpiralSlide( /** * rct2: 0x0074840C */ -TrackPaintFunction GetTrackPaintFunctionSpiralSlide(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSpiralSlide(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack2x2) + if (trackType != TrackElemType::flatTrack2x2) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/shops/Facility.cpp b/src/openrct2/paint/track/shops/Facility.cpp index f33f0ea04b9a..71117055adf2 100644 --- a/src/openrct2/paint/track/shops/Facility.cpp +++ b/src/openrct2/paint/track/shops/Facility.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,7 +30,7 @@ static void PaintFacility( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - bool hasSupports = DrawSupportForSequenceA( + bool hasSupports = DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, GetShopSupportColourScheme(session, trackElement)); auto rideEntry = ride.getRideEntry(); @@ -80,11 +80,11 @@ static void PaintFacility( } /* 0x00762D44 */ -TrackPaintFunction GetTrackPaintFunctionFacility(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionFacility(TrackElemType trackType) { switch (trackType) { - case TrackElemType::FlatTrack1x1A: + case TrackElemType::flatTrack1x1A: return PaintFacility; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/shops/Shop.cpp b/src/openrct2/paint/track/shops/Shop.cpp index acbaf335a1a0..584e34ea1be1 100644 --- a/src/openrct2/paint/track/shops/Shop.cpp +++ b/src/openrct2/paint/track/shops/Shop.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -29,7 +29,7 @@ static void PaintShop( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - bool hasSupports = DrawSupportForSequenceA( + bool hasSupports = DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, GetShopSupportColourScheme(session, trackElement)); auto rideEntry = ride.getRideEntry(); @@ -65,12 +65,12 @@ static void PaintShop( PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); } -TrackPaintFunction GetTrackPaintFunctionShop(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionShop(TrackElemType trackType) { switch (trackType) { - case TrackElemType::FlatTrack1x1A: - case TrackElemType::FlatTrack1x1B: + case TrackElemType::flatTrack1x1A: + case TrackElemType::flatTrack1x1B: return PaintShop; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/thrill/3dCinema.cpp b/src/openrct2/paint/track/thrill/3dCinema.cpp index 1f2ac60b0f2f..a1363f4ada17 100644 --- a/src/openrct2/paint/track/thrill/3dCinema.cpp +++ b/src/openrct2/paint/track/thrill/3dCinema.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -121,9 +121,9 @@ static void Paint3dCinema( PaintUtilSetGeneralSupportHeight(session, height + 128); } -TrackPaintFunction GetTrackPaintFunction3dCinema(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunction3dCinema(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack3x3) + if (trackType != TrackElemType::flatTrack3x3) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/thrill/Enterprise.cpp b/src/openrct2/paint/track/thrill/Enterprise.cpp index 6ca32d7ce587..191e8574b2fe 100644 --- a/src/openrct2/paint/track/thrill/Enterprise.cpp +++ b/src/openrct2/paint/track/thrill/Enterprise.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -29,7 +29,7 @@ static void PaintEnterpriseRiders( PaintSession& session, const RideObjectEntry& rideEntry, Vehicle& vehicle, uint32_t imageOffset, const CoordsXYZ& offset, const BoundBoxXYZ& bb) { - if (session.DPI.zoom_level > ZoomLevel{ 0 }) + if (session.rt.zoom_level > ZoomLevel{ 0 }) return; if (imageOffset >= 12) return; @@ -175,9 +175,9 @@ static void PaintEnterprise( PaintUtilSetGeneralSupportHeight(session, height + 160); } -TrackPaintFunction GetTrackPaintFunctionEnterprise(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionEnterprise(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack4x4) + if (trackType != TrackElemType::flatTrack4x4) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/thrill/GoKarts.cpp b/src/openrct2/paint/track/thrill/GoKarts.cpp index 23912c60d74d..7f85aaf5997a 100644 --- a/src/openrct2/paint/track/thrill/GoKarts.cpp +++ b/src/openrct2/paint/track/thrill/GoKarts.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1367,7 +1367,7 @@ static void PaintGoKartsTrackFlat( PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1404,7 +1404,7 @@ static void PaintGoKartsTrack25DegUp( session.WoodenSupportsPrependTo = ps; - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) @@ -1457,7 +1457,7 @@ static void PaintGoKartsTrackFlatTo25DegUp( session.WoodenSupportsPrependTo = ps; - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) @@ -1510,7 +1510,7 @@ static void PaintGoKartsTrack25DegUpToFlat( session.WoodenSupportsPrependTo = ps; - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (direction) @@ -1569,7 +1569,7 @@ static void PaintGoKartsStation( ImageId imageId; const uint32_t (*sprites)[2] = go_karts_track_pieces_starting_grid; - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { sprites = go_karts_track_pieces_starting_grid_end; } @@ -1621,7 +1621,7 @@ static void PaintGoKartsStation( TrackPaintUtilDrawStationCovers(session, EDGE_SW, hasFence, stationObj, height, stationColour); } - if (trackElement.GetTrackType() == TrackElemType::EndStation) + if (trackElement.GetTrackType() == TrackElemType::endStation) { const bool hasGreenLight = trackElement.HasGreenLight(); @@ -1662,7 +1662,7 @@ static void PaintGoKartsStation( } } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); @@ -1858,7 +1858,7 @@ static void TrackFlatToUp60LongBase( session, session.TrackColours.WithIndex(kGoKartsFlatToUp60LongBaseSprites[direction][trackSequence][1]), height, { 0, 0, 0 }, kGoKartsFlatToUp60LongBaseBoundBoxes[direction][trackSequence][1]); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (trackSequence == 0 && (direction == 0 || direction == 3)) { @@ -1884,7 +1884,7 @@ static void TrackUp60ToFlatLongBase( session, session.TrackColours.WithIndex(kGoKartsUp60ToFlatLongBaseSprites[direction][trackSequence][1]), height, { 0, 0, 0 }, kGoKartsUp60ToFlatLongBaseBoundBoxes[direction][trackSequence][1]); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (trackSequence == 0 && (direction == 0 || direction == 3)) { @@ -1892,7 +1892,7 @@ static void TrackUp60ToFlatLongBase( } else if (trackSequence == 3 && (direction == 1 || direction == 2)) { - PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::FlatTo25Deg); } PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); static constexpr std::array generalSupportHeights = { 80, 80, 56, 40 }; @@ -1971,7 +1971,7 @@ static void TrackLeftQuarterTurn5Tiles( session, session.TrackColours.WithIndex(kGoKartsLeftQuarterTurn5TilesSprites[direction][trackSequence][2]), height, { 0, 0, 0 }, kGoKartsLeftQuarterTurn5TilesBoundBoxes[direction][trackSequence][2]); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (trackSequence == 0 && (direction == 0 || direction == 3)) { @@ -2023,7 +2023,7 @@ static void TrackLeftEighthToDiag( session, session.TrackColours.WithIndex(kGoKartsLeftEighthToDiagSprites[direction][trackSequence][2]), height, { 0, 0, 0 }, kGoKartsLeftEighthToDiagBoundBoxes[direction][trackSequence][2]); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (trackSequence == 0 && (direction == 0 || direction == 3)) { @@ -2047,7 +2047,7 @@ static void TrackRightEighthToDiag( session, session.TrackColours.WithIndex(kGoKartsRightEighthToDiagSprites[direction][trackSequence][2]), height, { 0, 0, 0 }, kGoKartsRightEighthToDiagBoundBoxes[direction][trackSequence][2]); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (trackSequence == 0 && (direction == 0 || direction == 3)) { @@ -2086,7 +2086,7 @@ static void TrackDiagFlat( session, session.TrackColours.WithIndex(kGoKartsDiagFlatSprites[direction][trackSequence][1]), height, { 0, 0, 0 }, kGoKartsDiagFlatBoundBoxes[direction][trackSequence][1]); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -2103,7 +2103,7 @@ static void TrackDiagFlatToUp25( session, session.TrackColours.WithIndex(kGoKartsDiagFlatToUp25Sprites[direction][trackSequence][1]), height, { 0, 0, 0 }, kGoKartsDiagFlatToUp25BoundBoxes[direction][trackSequence][1]); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48); @@ -2120,7 +2120,7 @@ static void TrackDiagUp25ToFlat( session, session.TrackColours.WithIndex(kGoKartsDiagUp25ToFlatSprites[direction][trackSequence][1]), height, { 0, 0, 0 }, kGoKartsDiagUp25ToFlatBoundBoxes[direction][trackSequence][1]); - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56); @@ -2137,7 +2137,7 @@ static void TrackDiagUp25( session, session.TrackColours.WithIndex(kGoKartsDiagUp25Sprites[direction][trackSequence][1]), height, { 0, 0, 0 }, kGoKartsDiagUp25BoundBoxes[direction][trackSequence][1]); - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56); @@ -2181,7 +2181,7 @@ static void TrackDiagUp25ToUp60( session, session.TrackColours.WithIndex(kGoKartsDiagUp25ToUp60Sprites[direction][trackSequence][1]), height, { 0, 0, 0 }, kGoKartsDiagUp25ToUp60BoundBoxes[direction][trackSequence][1]); - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 72); @@ -2198,7 +2198,7 @@ static void TrackDiagUp60ToUp25( session, session.TrackColours.WithIndex(kGoKartsDiagUp60ToUp25Sprites[direction][trackSequence][1]), height, { 0, 0, 0 }, kGoKartsDiagUp60ToUp25BoundBoxes[direction][trackSequence][1]); - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 72); @@ -2215,7 +2215,7 @@ static void TrackDiagUp60( session, session.TrackColours.WithIndex(kGoKartsDiagUp60Sprites[direction][trackSequence][1]), height, { 0, 0, 0 }, kGoKartsDiagUp60BoundBoxes[direction][trackSequence][1]); - DrawSupportForSequenceB( + DrawSupportForSequenceB( session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 104); @@ -2708,7 +2708,7 @@ static void TrackSBendLeft( session, session.TrackColours.WithIndex(kGoKartsSBendLeftSprites[direction][trackSequence][2]), height, { 0, 0, 0 }, kGoKartsSBendLeftBoundBoxes[direction][trackSequence][2]); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if ((trackSequence == 0 && (direction == 0 || direction == 3)) || (trackSequence == 3 && (direction == 1 || direction == 2))) @@ -2743,7 +2743,7 @@ static void TrackSBendRight( session, session.TrackColours.WithIndex(kGoKartsSBendRightSprites[direction][trackSequence][2]), height, { 0, 0, 0 }, kGoKartsSBendRightBoundBoxes[direction][trackSequence][2]); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if ((trackSequence == 0 && (direction == 0 || direction == 3)) || (trackSequence == 3 && (direction == 1 || direction == 2))) @@ -2767,155 +2767,155 @@ static void TrackSBendRight( /** * rct2: 0x0074A668 */ -TrackPaintFunction GetTrackPaintFunctionGoKarts(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionGoKarts(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintGoKartsTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintGoKartsStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintGoKartsTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintGoKartsTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintGoKartsTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintGoKartsTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintGoKartsTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintGoKartsTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return PaintGoKartsTrackLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return PaintGoKartsTrackRightQuarterTurn1Tile; // Added by OpenRCT2 // Steep - case TrackElemType::Up60: + case TrackElemType::up60: return TrackUp60; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return TrackUp25ToUp60; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return TrackUp60ToUp25; - case TrackElemType::Down60: + case TrackElemType::down60: return TrackDown60; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return TrackDown25ToDown60; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return TrackDown60ToDown25; // Flat to steep - case TrackElemType::FlatToUp60LongBase: + case TrackElemType::flatToUp60LongBase: return TrackFlatToUp60LongBase; - case TrackElemType::Up60ToFlatLongBase: + case TrackElemType::up60ToFlatLongBase: return TrackUp60ToFlatLongBase; - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::flatToDown60LongBase: return TrackFlatToDown60LongBase; - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: return TrackDown60ToFlatLongBase; // Small turns - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return TrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return TrackRightQuarterTurn3Tiles; // Medium turns - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return TrackLeftQuarterTurn5Tiles; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return TrackRightQuarterTurn5Tiles; // Large turns - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return TrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return TrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return TrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return TrackRightEighthToOrthogonal; // Diagonal - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return TrackDiagFlat; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return TrackDiagFlatToUp25; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return TrackDiagUp25ToFlat; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return TrackDiagFlatToDown25; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return TrackDiagDown25ToFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return TrackDiagUp25; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return TrackDiagDown25; - case TrackElemType::DiagUp25ToUp60: + case TrackElemType::diagUp25ToUp60: return TrackDiagUp25ToUp60; - case TrackElemType::DiagUp60ToUp25: + case TrackElemType::diagUp60ToUp25: return TrackDiagUp60ToUp25; - case TrackElemType::DiagUp60: + case TrackElemType::diagUp60: return TrackDiagUp60; - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagDown25ToDown60: return TrackDiagDown25ToDown60; - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagDown60ToDown25: return TrackDiagDown60ToDown25; - case TrackElemType::DiagDown60: + case TrackElemType::diagDown60: return TrackDiagDown60; // Small gentle turns - case TrackElemType::LeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesUp25: return TrackLeftQuarterTurn3TilesUp25; - case TrackElemType::RightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: return TrackRightQuarterTurn3TilesUp25; - case TrackElemType::LeftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesDown25: return TrackLeftQuarterTurn3TilesDown25; - case TrackElemType::RightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: return TrackRightQuarterTurn3TilesDown25; // Medium gentle turns - case TrackElemType::LeftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesUp25: return TrackLeftQuarterTurn5TilesUp25; - case TrackElemType::RightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: return TrackRightQuarterTurn5TilesUp25; - case TrackElemType::LeftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesDown25: return TrackLeftQuarterTurn5TilesDown25; - case TrackElemType::RightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: return TrackRightQuarterTurn5TilesDown25; // Large gentle turns - case TrackElemType::LeftEighthToDiagUp25: + case TrackElemType::leftEighthToDiagUp25: return TrackLeftEighthToDiagUp25; - case TrackElemType::RightEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: return TrackRightEighthToDiagUp25; - case TrackElemType::LeftEighthToDiagDown25: + case TrackElemType::leftEighthToDiagDown25: return TrackLeftEighthToDiagDown25; - case TrackElemType::RightEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: return TrackRightEighthToDiagDown25; - case TrackElemType::LeftEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalUp25: return TrackLeftEighthToOrthogonalUp25; - case TrackElemType::RightEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: return TrackRightEighthToOrthogonalUp25; - case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::leftEighthToOrthogonalDown25: return TrackLeftEighthToOrthogonalDown25; - case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: return TrackRightEighthToOrthogonalDown25; // S bends - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return TrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return TrackSBendRight; default: diff --git a/src/openrct2/paint/track/thrill/LaunchedFreefall.cpp b/src/openrct2/paint/track/thrill/LaunchedFreefall.cpp index 820aa4bef931..5a652379578c 100644 --- a/src/openrct2/paint/track/thrill/LaunchedFreefall.cpp +++ b/src/openrct2/paint/track/thrill/LaunchedFreefall.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -141,14 +141,14 @@ static void PaintLaunchedFreefallTowerSection( /** * rct2: 0x006FD0E8 */ -TrackPaintFunction GetTrackPaintFunctionLaunchedFreefall(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionLaunchedFreefall(TrackElemType trackType) { switch (trackType) { - case TrackElemType::TowerBase: + case TrackElemType::towerBase: return PaintLaunchedFreefallBase; - case TrackElemType::TowerSection: + case TrackElemType::towerSection: return PaintLaunchedFreefallTowerSection; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/thrill/MagicCarpet.cpp b/src/openrct2/paint/track/thrill/MagicCarpet.cpp index 41e417a62ed1..c937e8383697 100644 --- a/src/openrct2/paint/track/thrill/MagicCarpet.cpp +++ b/src/openrct2/paint/track/thrill/MagicCarpet.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -105,7 +105,7 @@ static void PaintMagicCarpetRiders( PaintSession& session, const RideObjectEntry& rideEntry, const Vehicle& vehicle, Direction direction, const CoordsXYZ& offset, const BoundBoxXYZ& bb) { - if (session.DPI.zoom_level > ZoomLevel{ 1 }) + if (session.rt.zoom_level > ZoomLevel{ 1 }) return; auto baseImageIndex = rideEntry.Cars[0].base_image_id + 4 + direction; @@ -256,11 +256,11 @@ static void PaintMagicCarpet( PaintUtilSetGeneralSupportHeight(session, height + 176); } -TrackPaintFunction GetTrackPaintFunctionMagicCarpet(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMagicCarpet(TrackElemType trackType) { switch (trackType) { - case TrackElemType::FlatTrack1x4A: + case TrackElemType::flatTrack1x4A: return PaintMagicCarpet; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/thrill/MotionSimulator.cpp b/src/openrct2/paint/track/thrill/MotionSimulator.cpp index 39638b4fc53f..7540306dcfdd 100644 --- a/src/openrct2/paint/track/thrill/MotionSimulator.cpp +++ b/src/openrct2/paint/track/thrill/MotionSimulator.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -146,11 +146,11 @@ static void PaintMotionSimulator( * * rct2: 0x00763520 */ -TrackPaintFunction GetTrackPaintFunctionMotionsimulator(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMotionsimulator(TrackElemType trackType) { switch (trackType) { - case TrackElemType::FlatTrack2x2: + case TrackElemType::flatTrack2x2: return PaintMotionSimulator; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/thrill/RotoDrop.cpp b/src/openrct2/paint/track/thrill/RotoDrop.cpp index c73273549ece..a23f4f3e28c3 100644 --- a/src/openrct2/paint/track/thrill/RotoDrop.cpp +++ b/src/openrct2/paint/track/thrill/RotoDrop.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -154,14 +154,14 @@ static void PaintRotoDropTowerSection( /** * rct2: 0x00886074 */ -TrackPaintFunction GetTrackPaintFunctionRotoDrop(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionRotoDrop(TrackElemType trackType) { switch (trackType) { - case TrackElemType::TowerBase: + case TrackElemType::towerBase: return PaintRotoDropBase; - case TrackElemType::TowerSection: + case TrackElemType::towerSection: return PaintRotoDropTowerSection; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/thrill/SwingingInverterShip.cpp b/src/openrct2/paint/track/thrill/SwingingInverterShip.cpp index d20b7078c78b..6ef40fb6632a 100644 --- a/src/openrct2/paint/track/thrill/SwingingInverterShip.cpp +++ b/src/openrct2/paint/track/thrill/SwingingInverterShip.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -189,9 +189,9 @@ static void PaintSwingingInverterShip( PaintUtilSetGeneralSupportHeight(session, height + 176); } -TrackPaintFunction GetTrackPaintFunctionSwingingInverterShip(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSwingingInverterShip(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack1x4B) + if (trackType != TrackElemType::flatTrack1x4B) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/thrill/SwingingShip.cpp b/src/openrct2/paint/track/thrill/SwingingShip.cpp index 57e3a4fcd085..0df2182fddd3 100644 --- a/src/openrct2/paint/track/thrill/SwingingShip.cpp +++ b/src/openrct2/paint/track/thrill/SwingingShip.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -64,7 +64,7 @@ static void PaintSwingingShipRiders( PaintSession& session, const Ride& ride, const Vehicle& vehicle, ImageIndex baseImageIndex, Direction direction, const CoordsXYZ& offset, const BoundBoxXYZ& bb) { - if (session.DPI.zoom_level > ZoomLevel{ 1 }) + if (session.rt.zoom_level > ZoomLevel{ 1 }) return; if (!(ride.lifecycleFlags & RIDE_LIFECYCLE_ON_TRACK)) @@ -299,9 +299,9 @@ static void PaintSwingingShip( PaintUtilSetGeneralSupportHeight(session, height + 112); } -TrackPaintFunction GetTrackPaintFunctionSwingingShip(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSwingingShip(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack1x5) + if (trackType != TrackElemType::flatTrack1x5) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/thrill/TopSpin.cpp b/src/openrct2/paint/track/thrill/TopSpin.cpp index 58fa7d81d251..948f837b703e 100644 --- a/src/openrct2/paint/track/thrill/TopSpin.cpp +++ b/src/openrct2/paint/track/thrill/TopSpin.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -41,7 +41,7 @@ static void PaintTopSpinRiders( PaintSession& session, const Vehicle& vehicle, ImageIndex seatImageIndex, const CoordsXYZ& seatCoords, const BoundBoxXYZ& bb) { - if (session.DPI.zoom_level >= ZoomLevel{ 2 }) + if (session.rt.zoom_level >= ZoomLevel{ 2 }) return; for (int i = 0; i < 4; i++) @@ -249,9 +249,9 @@ static void PaintTopSpin( PaintUtilSetGeneralSupportHeight(session, height + 112); } -TrackPaintFunction GetTrackPaintFunctionTopspin(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionTopspin(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack3x3) + if (trackType != TrackElemType::flatTrack3x3) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/thrill/Twist.cpp b/src/openrct2/paint/track/thrill/Twist.cpp index 406ddaa469ba..78f2f9c50aa2 100644 --- a/src/openrct2/paint/track/thrill/Twist.cpp +++ b/src/openrct2/paint/track/thrill/Twist.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -69,7 +69,7 @@ static void PaintTwistStructure( }; PaintAddImageAsParent(session, imageId, { xOffset, yOffset, height }, bb); - if (session.DPI.zoom_level < ZoomLevel{ 1 } && ride.lifecycleFlags & RIDE_LIFECYCLE_ON_TRACK && vehicle != nullptr) + if (session.rt.zoom_level < ZoomLevel{ 1 } && ride.lifecycleFlags & RIDE_LIFECYCLE_ON_TRACK && vehicle != nullptr) { for (int32_t i = 0; i < vehicle->num_peeps; i += 2) { @@ -170,9 +170,9 @@ static void PaintTwist( /** * rct2: 0x0076D658 */ -TrackPaintFunction GetTrackPaintFunctionTwist(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionTwist(TrackElemType trackType) { - if (trackType != TrackElemType::FlatTrack3x3) + if (trackType != TrackElemType::flatTrack3x3) { return TrackPaintFunctionDummy; } diff --git a/src/openrct2/paint/track/transport/Chairlift.cpp b/src/openrct2/paint/track/transport/Chairlift.cpp index c79ba3da5e35..f51c102781e3 100644 --- a/src/openrct2/paint/track/transport/Chairlift.cpp +++ b/src/openrct2/paint/track/transport/Chairlift.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -150,9 +150,9 @@ static const TrackElement* ChairliftPaintUtilMapGetTrackElementAtFromRideFuzzy( }; static bool ChairliftPaintUtilIsFirstTrack( - const Ride& ride, const TrackElement& trackElement, const CoordsXY& pos, OpenRCT2::TrackElemType trackType) + const Ride& ride, const TrackElement& trackElement, const CoordsXY& pos, TrackElemType trackType) { - if (trackElement.GetTrackType() != TrackElemType::BeginStation) + if (trackElement.GetTrackType() != TrackElemType::beginStation) { return false; } @@ -170,9 +170,9 @@ static bool ChairliftPaintUtilIsFirstTrack( } static bool ChairliftPaintUtilIsLastTrack( - const Ride& ride, const TrackElement& trackElement, const CoordsXY& pos, OpenRCT2::TrackElemType trackType) + const Ride& ride, const TrackElement& trackElement, const CoordsXY& pos, TrackElemType trackType) { - if (trackElement.GetTrackType() != TrackElemType::EndStation) + if (trackElement.GetTrackType() != TrackElemType::endStation) { return false; } @@ -368,10 +368,9 @@ static void ChairliftPaintStationSeNw( imageId = session.TrackColours.WithIndex(SPR_CHAIRLIFT_STATION_COLUMN_SE_NW); PaintAddImageAsParent( session, imageId, { 16, 30, height + 2 }, { { 16, 1, height + 2 }, { 1, 1, 7 } }); // bound offset x is wrong? - - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); } + PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } @@ -663,35 +662,35 @@ static void ChairliftPaintRightQuarterTurn1Tile( } /* 0x008AAA0C */ -TrackPaintFunction GetTrackPaintFunctionChairlift(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionChairlift(TrackElemType trackType) { switch (trackType) { - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: - case TrackElemType::EndStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: + case TrackElemType::endStation: return ChairliftPaintStation; - case TrackElemType::Flat: + case TrackElemType::flat: return ChairliftPaintFlat; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return ChairliftPaintFlatTo25DegUp; - case TrackElemType::Up25: + case TrackElemType::up25: return ChairliftPaint25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return ChairliftPaint25DegUpToFlat; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return ChairliftPaintFlatTo25DegDown; - case TrackElemType::Down25: + case TrackElemType::down25: return ChairliftPaint25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return ChairliftPaint25DegDownToFlat; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return ChairliftPaintLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return ChairliftPaintRightQuarterTurn1Tile; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/transport/Lift.cpp b/src/openrct2/paint/track/transport/Lift.cpp index b8047e9c421d..92fe5bb74eb9 100644 --- a/src/openrct2/paint/track/transport/Lift.cpp +++ b/src/openrct2/paint/track/transport/Lift.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -141,14 +141,14 @@ static void PaintLiftTowerSection( /** * rct2: 0x0076C5BC */ -TrackPaintFunction GetTrackPaintFunctionLift(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionLift(TrackElemType trackType) { switch (trackType) { - case TrackElemType::TowerBase: + case TrackElemType::towerBase: return PaintLiftBase; - case TrackElemType::TowerSection: + case TrackElemType::towerSection: return PaintLiftTowerSection; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/transport/MiniatureRailway.cpp b/src/openrct2/paint/track/transport/MiniatureRailway.cpp index df10fd4b4ff9..e9d860ba349b 100644 --- a/src/openrct2/paint/track/transport/MiniatureRailway.cpp +++ b/src/openrct2/paint/track/transport/MiniatureRailway.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -22,6 +22,7 @@ #include "../../track/Support.h" using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square; @@ -1547,7 +1548,7 @@ static void PaintMiniatureRailwayTrackLeftEighthToDiag( }; bool isSupported = false; - bool isRightEighthToOrthog = trackElement.GetTrackType() == TrackElemType::RightEighthToOrthogonal; + bool isRightEighthToOrthog = trackElement.GetTrackType() == TrackElemType::rightEighthToOrthogonal; // Right eighth to orthogonal calls this function but we do not want to have a support call for it // for track sequence 4 if (trackSequence != 4 || !isRightEighthToOrthog) @@ -1715,7 +1716,7 @@ static void PaintMiniatureRailwayTrackRightEighthToDiag( }; bool isSupported = false; - bool isLeftEighthToOrthog = trackElement.GetTrackType() == TrackElemType::LeftEighthToOrthogonal; + bool isLeftEighthToOrthog = trackElement.GetTrackType() == TrackElemType::leftEighthToOrthogonal; // Right eighth to orthogonal calls this function but we do not want to have a support call for it // for track sequence 4 if (trackSequence != 4 || !isLeftEighthToOrthog) @@ -2305,69 +2306,69 @@ static void MiniatureRailwayTrackDiag25DegDownToFlat( /** * rct2: 0x008ACE48 */ -TrackPaintFunction GetTrackPaintFunctionMiniatureRailway(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMiniatureRailway(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintMiniatureRailwayTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintMiniatureRailwayStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintMiniatureRailwayTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintMiniatureRailwayTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintMiniatureRailwayTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintMiniatureRailwayTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintMiniatureRailwayTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintMiniatureRailwayTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return PaintMiniatureRailwayTrackLeftQuarterTurn5Tiles; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return PaintMiniatureRailwayTrackRightQuarterTurn5Tiles; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return PaintMiniatureRailwayTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return PaintMiniatureRailwayTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return PaintMiniatureRailwayTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return PaintMiniatureRailwayTrackRightQuarterTurn3Tiles; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return PaintMiniatureRailwayTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return PaintMiniatureRailwayTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return PaintMiniatureRailwayTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return PaintMiniatureRailwayTrackRightEighthToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return MiniatureRailwayTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return MiniatureRailwayTrackDiag25DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return MiniatureRailwayTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return MiniatureRailwayTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return MiniatureRailwayTrackDiag25DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return MiniatureRailwayTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return MiniatureRailwayTrackDiag25DegDownToFlat; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/transport/Monorail.cpp b/src/openrct2/paint/track/transport/Monorail.cpp index 7bebc08ac39d..268c523141f2 100644 --- a/src/openrct2/paint/track/transport/Monorail.cpp +++ b/src/openrct2/paint/track/transport/Monorail.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1212,71 +1212,71 @@ static void PaintMonorailTrackDiag25DegDownToFlat( /** * rct2: 0x008ADF34 */ -TrackPaintFunction GetTrackPaintFunctionMonorail(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionMonorail(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintMonorailTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintMonorailStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintMonorailTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintMonorailTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintMonorailTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintMonorailTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintMonorailTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintMonorailTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return PaintMonorailTrackLeftQuarterTurn5Tiles; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return PaintMonorailTrackRightQuarterTurn5Tiles; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return PaintMonorailTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return PaintMonorailTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return PaintMonorailTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return PaintMonorailTrackRightQuarterTurn3Tiles; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return PaintMonorailTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return PaintMonorailTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return PaintMonorailTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return PaintMonorailTrackRightEighthToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return PaintMonorailTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return PaintMonorailTrackDiag25DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return PaintMonorailTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return PaintMonorailTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return PaintMonorailTrackDiag25DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return PaintMonorailTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return PaintMonorailTrackDiag25DegDownToFlat; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/transport/SuspendedMonorail.cpp b/src/openrct2/paint/track/transport/SuspendedMonorail.cpp index 16b9779fd2e0..2b05126abe5a 100644 --- a/src/openrct2/paint/track/transport/SuspendedMonorail.cpp +++ b/src/openrct2/paint/track/transport/SuspendedMonorail.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1971,61 +1971,61 @@ static void SuspendedMonorailTrackDiag25DegDownToFlat( } } -TrackPaintFunction GetTrackPaintFunctionSuspendedMonorail(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSuspendedMonorail(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return SuspendedMonorailTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return SuspendedMonorailTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return SuspendedMonorailTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return SuspendedMonorailTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return SuspendedMonorailTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return SuspendedMonorailTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return SuspendedMonorailTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return SuspendedMonorailTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return SuspendedMonorailTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return SuspendedMonorailTrackRightQuarterTurn5; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return SuspendedMonorailTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return SuspendedMonorailTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return SuspendedMonorailTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return SuspendedMonorailTrackRightQuarterTurn3; - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return SuspendedMonorailTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return SuspendedMonorailTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return SuspendedMonorailTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return SuspendedMonorailTrackRightEighthToOrthogonal; - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return SuspendedMonorailTrackDiagFlat; - case TrackElemType::DiagUp25: + case TrackElemType::diagUp25: return SuspendedMonorailTrackDiag25DegUp; - case TrackElemType::DiagFlatToUp25: + case TrackElemType::diagFlatToUp25: return SuspendedMonorailTrackDiagFlatTo25DegUp; - case TrackElemType::DiagUp25ToFlat: + case TrackElemType::diagUp25ToFlat: return SuspendedMonorailTrackDiag25DegUpToFlat; - case TrackElemType::DiagDown25: + case TrackElemType::diagDown25: return SuspendedMonorailTrackDiag25DegDown; - case TrackElemType::DiagFlatToDown25: + case TrackElemType::diagFlatToDown25: return SuspendedMonorailTrackDiagFlatTo25DegDown; - case TrackElemType::DiagDown25ToFlat: + case TrackElemType::diagDown25ToFlat: return SuspendedMonorailTrackDiag25DegDownToFlat; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/water/BoatHire.cpp b/src/openrct2/paint/track/water/BoatHire.cpp index cfc23b7b7124..1b323dfae4d3 100644 --- a/src/openrct2/paint/track/water/BoatHire.cpp +++ b/src/openrct2/paint/track/water/BoatHire.cpp @@ -1,6 +1,6 @@ /***************************************************************************** /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1231,55 +1231,55 @@ static void PaintBoatHireTrackSBendRight( /** * rct2: 0x008B0D60 */ -TrackPaintFunction GetTrackPaintFunctionBoatHire(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionBoatHire(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintBoatHireTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintBoatHireStation; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return PaintBoatHireTrackLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return PaintBoatHireTrackRightQuarterTurn1Tile; // Added by OpenRCT2 // Small turns - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return PaintBoatHireTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return PaintBoatHireTrackRightQuarterTurn3Tiles; // Medium turns - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return PaintBoatHireTrackLeftQuarterTurn5Tiles; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return PaintBoatHireTrackRightQuarterTurn5Tiles; // Large turns - case TrackElemType::LeftEighthToDiag: + case TrackElemType::leftEighthToDiag: return PaintBoatHireTrackLeftEighthToDiag; - case TrackElemType::RightEighthToDiag: + case TrackElemType::rightEighthToDiag: return PaintBoatHireTrackRightEighthToDiag; - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToOrthogonal: return PaintBoatHireTrackLeftEighthToOrthogonal; - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: return PaintBoatHireTrackRightEighthToOrthogonal; // Diagonal - case TrackElemType::DiagFlat: + case TrackElemType::diagFlat: return PaintBoatHireTrackDiagFlat; // S bends - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return PaintBoatHireTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return PaintBoatHireTrackSBendRight; default: diff --git a/src/openrct2/paint/track/water/DinghySlide.cpp b/src/openrct2/paint/track/water/DinghySlide.cpp index b1bb091f361f..a476457c1336 100644 --- a/src/openrct2/paint/track/water/DinghySlide.cpp +++ b/src/openrct2/paint/track/water/DinghySlide.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1058,51 +1058,51 @@ static void DinghySlideTrackLeftQuarterTurn3( DinghySlideTrackRightQuarterTurn3(session, ride, trackSequence, (direction + 1) % 4, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionDinghySlide(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionDinghySlide(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return DinghySlideTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return DinghySlideTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return DinghySlideTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return DinghySlideTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return DinghySlideTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return DinghySlideTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return DinghySlideTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return DinghySlideTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return DinghySlideTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return DinghySlideTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return DinghySlideTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return DinghySlideTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return DinghySlideTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return DinghySlideTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return DinghySlideTrackLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return DinghySlideTrackRightQuarterTurn5; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return DinghySlideTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return DinghySlideTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return DinghySlideTrackLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return DinghySlideTrackRightQuarterTurn3; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/water/DinghySlideCovered.cpp b/src/openrct2/paint/track/water/DinghySlideCovered.cpp index 7bdd0c3e6891..79fc8f398e1b 100644 --- a/src/openrct2/paint/track/water/DinghySlideCovered.cpp +++ b/src/openrct2/paint/track/water/DinghySlideCovered.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -951,47 +951,47 @@ static void DinghySlideTrackCovered60DegDownTo25DegDown( session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); } -TrackPaintFunction GetTrackPaintFunctionDinghySlideCovered(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionDinghySlideCovered(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return DinghySlideTrackCoveredFlat; - case TrackElemType::Up25: + case TrackElemType::up25: return DinghySlideTrackCovered25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return DinghySlideTrackCovered60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return DinghySlideTrackCoveredFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return DinghySlideTrackCovered25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return DinghySlideTrackCovered60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return DinghySlideTrackCovered25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return DinghySlideTrackCovered25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return DinghySlideTrackCovered60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return DinghySlideTrackCoveredFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return DinghySlideTrackCovered25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return DinghySlideTrackCovered60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return DinghySlideTrackCovered25DegDownToFlat; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return DinghySlideTrackCoveredLeftQuarterTurn5; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return DinghySlideTrackCoveredRightQuarterTurn5; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return DinghySlideTrackCoveredSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return DinghySlideTrackCoveredSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return DinghySlideTrackCoveredLeftQuarterTurn3; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return DinghySlideTrackCoveredRightQuarterTurn3; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/water/LogFlume.cpp b/src/openrct2/paint/track/water/LogFlume.cpp index abe039ee73aa..6aa612d3e244 100644 --- a/src/openrct2/paint/track/water/LogFlume.cpp +++ b/src/openrct2/paint/track/water/LogFlume.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -985,48 +985,48 @@ static void LogFlumeTrack60Down25( PaintUtilSetGeneralSupportHeight(session, height + 72); } -TrackPaintFunction GetTrackPaintFunctionLogFlume(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionLogFlume(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintLogFlumeTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintLogFlumeTrackStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintLogFlumeTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintLogFlumeTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintLogFlumeTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintLogFlumeTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintLogFlumeTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintLogFlumeTrack25DegDownToFlat; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return PaintLogFlumeTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return PaintLogFlumeTrackSBendRight; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return PaintLogFlumeTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return PaintLogFlumeTrackRightQuarterTurn3Tiles; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return PaintLogFlumeTrackOnRidePhoto; - case TrackElemType::LogFlumeReverser: + case TrackElemType::logFlumeReverser: return PaintLogFlumeTrackReverser; // Added by OpenRCT2 - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return LogFlumeTrack25Down60; - case TrackElemType::Down60: + case TrackElemType::down60: return LogFlumeTrack60Down; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return LogFlumeTrack60Down25; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/water/RiverRapids.cpp b/src/openrct2/paint/track/water/RiverRapids.cpp index db2393b374cf..9552464d6053 100644 --- a/src/openrct2/paint/track/water/RiverRapids.cpp +++ b/src/openrct2/paint/track/water/RiverRapids.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -195,7 +195,7 @@ static void PaintRiverRapidsTrackFlat( PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 10, 10, height }, { 1, 2, 5 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction & 1) @@ -237,7 +237,7 @@ static void PaintRiverRapidsTrack25Deg( imageId = session.TrackColours.WithIndex(sprites[direction][1]); PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 27, height + 16 }, { 32, 1, 34 } }); - DrawSupportForSequenceA(session, supportType.wooden, 0, direction, height, session.SupportColours); + DrawSupportForSequenceA(session, supportType.wooden, 0, direction, height, session.SupportColours); int8_t tunnelHeightOffset = isStart ? -8 : 8; auto tunnelSubType = isStart ? TunnelSubType::SlopeStart : TunnelSubType::SlopeEnd; @@ -291,7 +291,7 @@ static void PaintRiverRapidsTrack25DegToFlatA( PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 27, 0, height + 16 }, { 1, 32, 18 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, 0, direction, height, session.SupportColours); int8_t heightOffset = isStart ? -8 : 8; @@ -344,7 +344,7 @@ static void PaintRiverRapidsTrack25DegToFlatB( PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 27, 0, height + 16 }, { 1, 32, 26 } }); break; } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, 0, direction, height, session.SupportColours); const auto tunnelType = direction == 0 || direction == 3 ? TunnelSubType::Flat : TunnelSubType::SlopeEnd; @@ -574,7 +574,7 @@ static void PaintRiverRapidsTrackWaterfall( PaintAddImageAsChild(session, imageId, { 0, 0, height }, bb); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction & 1) @@ -616,7 +616,7 @@ static void PaintRiverRapidsTrackRapids( PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 27, height + 17 }, { 32, 1, 11 } }); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction & 1) @@ -686,7 +686,7 @@ static void PaintRiverRapidsTrackWhirlpool( PaintAddImageAsParent(session, imageId, { 0, 0, height }, bb); } - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction & 1) @@ -705,47 +705,47 @@ static void PaintRiverRapidsTrackWhirlpool( /** * rct2: 0x0075745C **/ -TrackPaintFunction GetTrackPaintFunctionRiverRapids(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionRiverRapids(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Flat: + case TrackElemType::flat: return PaintRiverRapidsTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintRiverRapidsStation; - case TrackElemType::Up25: + case TrackElemType::up25: return PaintRiverRapidsTrack25DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintRiverRapidsTrackFlatTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintRiverRapidsTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintRiverRapidsTrack25DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintRiverRapidsTrackFlatTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintRiverRapidsTrack25DegDownToFlat; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return PaintRiverRapidsTrackLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return PaintRiverRapidsTrackRightQuarterTurn1Tile; - case TrackElemType::Waterfall: + case TrackElemType::waterfall: return PaintRiverRapidsTrackWaterfall; - case TrackElemType::Rapids: + case TrackElemType::rapids: return PaintRiverRapidsTrackRapids; - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return PaintRiverRapidsTrackOnRidePhoto; - case TrackElemType::Whirlpool: + case TrackElemType::whirlpool: return PaintRiverRapidsTrackWhirlpool; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/water/SplashBoats.cpp b/src/openrct2/paint/track/water/SplashBoats.cpp index 16da6f10c1f2..18fcde3b491a 100644 --- a/src/openrct2/paint/track/water/SplashBoats.cpp +++ b/src/openrct2/paint/track/water/SplashBoats.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -496,7 +496,7 @@ static void PaintSplashBoatsTrack25DegUp( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); PaintAddImageAsParentRotated(session, direction, frontImageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 50 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -522,7 +522,7 @@ static void PaintSplashBoatsTrack60DegUp( session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); PaintAddImageAsParentRotated(session, direction, frontImageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 98 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -547,7 +547,7 @@ static void PaintSplashBoatsTrackFlatTo25DegUp( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); PaintAddImageAsParentRotated(session, direction, frontImageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 42 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -572,7 +572,7 @@ static void PaintSplashBoatsTrack25DegUpToFlat( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); PaintAddImageAsParentRotated(session, direction, frontImageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 34 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -598,7 +598,7 @@ static void PaintSplashBoatsTrack25DegUpTo60DegUp( session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); PaintAddImageAsParentRotated(session, direction, frontImageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 66 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -624,7 +624,7 @@ static void PaintSplashBoatsTrack60DegUpTo25DegUp( session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); PaintAddImageAsParentRotated(session, direction, frontImageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 66 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -649,7 +649,7 @@ static void PaintSplashBoatsTrack25DegDown( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); PaintAddImageAsParentRotated(session, direction, frontImageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 50 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -681,7 +681,7 @@ static void PaintSplashBoatsTrackFlatTo25DegDown( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); PaintAddImageAsParentRotated(session, direction, frontImageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 34 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -720,7 +720,7 @@ static void PaintSplashBoatsTrack25DegDownToFlat( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); PaintAddImageAsParentRotated(session, direction, frontImageId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 42 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction == 0 || direction == 3) @@ -746,7 +746,7 @@ static void PaintSplashBoatsTrackFlat( const ImageId frontId = session.TrackColours.WithIndex(kSplashBoatsFlatImageIndexes[direction][1]); PaintAddImageAsParentRotated(session, direction, frontId, { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (direction & 1) @@ -770,7 +770,7 @@ static void PaintSplashBoatsStation( const ImageId trackId = session.TrackColours.WithIndex(kSplashBoatsFlatImageIndexes[direction][0]); PaintAddImageAsParentRotated(session, direction, trackId, { 0, 0, height }, { { 0, 6, height + 3 }, { 32, 20, 1 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); if (!TrackPaintUtilDrawNarrowStationPlatform(session, ride, direction, height, 7, trackElement, StationBaseType::b, 0)) @@ -795,7 +795,7 @@ static void PaintSplashBoatsTrackLeftQuarterTurn5Tiles( TrackPaintUtilRightQuarterTurn5TilesPaint2( session, height, direction, trackSequence, session.TrackColours, kSplashBoatsLeftQuarterTurn5_Side); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (trackSequence) @@ -881,7 +881,7 @@ static void PaintSplashBoatsTrackRightQuarterTurn5Tiles( TrackPaintUtilRightQuarterTurn5TilesPaint2( session, height, direction, trackSequence, session.TrackColours, kSplashBoatsRightQuarterTurn5_Side); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); switch (trackSequence) @@ -999,7 +999,7 @@ static void PaintSplashBoatsTrackSBendLeft( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 27, 2 } }); PaintAddImageAsParentRotated( session, direction, frontImageId, { 0, 0, height }, { { 0, 2, height + 27 }, { 32, 27, 0 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); break; @@ -1009,7 +1009,7 @@ static void PaintSplashBoatsTrackSBendLeft( PaintAddImageAsParentRotated( session, direction, frontImageId, { 0, 0, height }, { { 0, bboy, height + 27 }, { 32, 26, 0 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( @@ -1027,7 +1027,7 @@ static void PaintSplashBoatsTrackSBendLeft( PaintAddImageAsParentRotated( session, direction, frontImageId, { 0, 0, height }, { { 0, bboy, height + 27 }, { 32, 26, 0 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( @@ -1043,7 +1043,7 @@ static void PaintSplashBoatsTrackSBendLeft( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 27, 2 } }); PaintAddImageAsParentRotated( session, direction, frontImageId, { 0, 0, height }, { { 0, 2, height + 27 }, { 32, 27, 0 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); break; @@ -1109,7 +1109,7 @@ static void PaintSplashBoatsTrackSBendRight( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 27, 2 } }); PaintAddImageAsParentRotated( session, direction, frontImageId, { 0, 0, height }, { { 0, 2, height + 27 }, { 32, 27, 0 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); break; @@ -1119,7 +1119,7 @@ static void PaintSplashBoatsTrackSBendRight( PaintAddImageAsParentRotated( session, direction, frontImageId, { 0, 0, height }, { { 0, bboy, height + 27 }, { 32, 26, 0 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( @@ -1137,7 +1137,7 @@ static void PaintSplashBoatsTrackSBendRight( PaintAddImageAsParentRotated( session, direction, frontImageId, { 0, 0, height }, { { 0, bboy, height + 27 }, { 32, 26, 0 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight( @@ -1153,7 +1153,7 @@ static void PaintSplashBoatsTrackSBendRight( PaintAddImageAsParentRotated(session, direction, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 27, 2 } }); PaintAddImageAsParentRotated( session, direction, frontImageId, { 0, 0, height }, { { 0, 2, height + 27 }, { 32, 27, 0 } }); - DrawSupportForSequenceA( + DrawSupportForSequenceA( session, supportType.wooden, trackSequence, direction, height, session.SupportColours); PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); break; @@ -1181,78 +1181,60 @@ static void PaintSplashBoatsTrackOnRidePhoto( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 0, 1 }); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 0, 1 }); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 0, 1 }); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 0, 1 }); - break; - } + TrackPaintUtilOnridePhotoPlatformPaintBase(session, height); PaintSplashBoatsTrackFlat(session, ride, trackSequence, direction, height, trackElement, supportType); TrackPaintUtilOnridePhotoPaint2(session, direction, trackElement, height); } -TrackPaintFunction GetTrackPaintFunctionSplashBoats(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSplashBoats(TrackElemType trackType) { switch (trackType) { - case TrackElemType::Up25: + case TrackElemType::up25: return PaintSplashBoatsTrack25DegUp; - case TrackElemType::Up60: + case TrackElemType::up60: return PaintSplashBoatsTrack60DegUp; - case TrackElemType::FlatToUp25: + case TrackElemType::flatToUp25: return PaintSplashBoatsTrackFlatTo25DegUp; - case TrackElemType::Up25ToUp60: + case TrackElemType::up25ToUp60: return PaintSplashBoatsTrack25DegUpTo60DegUp; - case TrackElemType::Up60ToUp25: + case TrackElemType::up60ToUp25: return PaintSplashBoatsTrack60DegUpTo25DegUp; - case TrackElemType::Up25ToFlat: + case TrackElemType::up25ToFlat: return PaintSplashBoatsTrack25DegUpToFlat; - case TrackElemType::Down25: + case TrackElemType::down25: return PaintSplashBoatsTrack25DegDown; - case TrackElemType::Down60: + case TrackElemType::down60: return PaintSplashBoatsTrack60DegDown; - case TrackElemType::FlatToDown25: + case TrackElemType::flatToDown25: return PaintSplashBoatsTrackFlatTo25DegDown; - case TrackElemType::Down25ToDown60: + case TrackElemType::down25ToDown60: return PaintSplashBoatsTrack25DegDownTo60DegDown; - case TrackElemType::Down60ToDown25: + case TrackElemType::down60ToDown25: return PaintSplashBoatsTrack60DegDownTo25DegDown; - case TrackElemType::Down25ToFlat: + case TrackElemType::down25ToFlat: return PaintSplashBoatsTrack25DegDownToFlat; // Originally taken from River Rafts - case TrackElemType::Flat: + case TrackElemType::flat: return PaintSplashBoatsTrackFlat; - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return PaintSplashBoatsStation; - case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5Tiles: return PaintSplashBoatsTrackLeftQuarterTurn5Tiles; - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: return PaintSplashBoatsTrackRightQuarterTurn5Tiles; - case TrackElemType::SBendLeft: + case TrackElemType::sBendLeft: return PaintSplashBoatsTrackSBendLeft; - case TrackElemType::SBendRight: + case TrackElemType::sBendRight: return PaintSplashBoatsTrackSBendRight; // Added by OpenRCT2 - case TrackElemType::OnRidePhoto: + case TrackElemType::onRidePhoto: return PaintSplashBoatsTrackOnRidePhoto; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/water/SubmarineRide.cpp b/src/openrct2/paint/track/water/SubmarineRide.cpp index dac84f48b3d8..1f81bfdfb7f2 100644 --- a/src/openrct2/paint/track/water/SubmarineRide.cpp +++ b/src/openrct2/paint/track/water/SubmarineRide.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -172,26 +172,26 @@ static void SubmarineRidePaintTrackRightQuarterTurn1Tile( /** * rct2: 0x008995D4 */ -TrackPaintFunction GetTrackPaintFunctionSubmarineRide(OpenRCT2::TrackElemType trackType) +TrackPaintFunction GetTrackPaintFunctionSubmarineRide(TrackElemType trackType) { switch (trackType) { - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: - case TrackElemType::EndStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: + case TrackElemType::endStation: return SubmarineRidePaintTrackStation; - case TrackElemType::Flat: + case TrackElemType::flat: return SubmarineRidePaintTrackFlat; - case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: return SubmarineRidePaintTrackLeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: return SubmarineRidePaintTrackRightQuarterTurn3Tiles; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return SubmarineRidePaintTrackLeftQuarterTurn1Tile; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return SubmarineRidePaintTrackRightQuarterTurn1Tile; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/vehicle/Vehicle.LaunchedFreefall.cpp b/src/openrct2/paint/vehicle/Vehicle.LaunchedFreefall.cpp index bee22f00b820..c6cdb7d8100a 100644 --- a/src/openrct2/paint/vehicle/Vehicle.LaunchedFreefall.cpp +++ b/src/openrct2/paint/vehicle/Vehicle.LaunchedFreefall.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -41,14 +41,14 @@ namespace OpenRCT2 PaintAddImageAsParent(session, image_id, { 0, 0, z }, { { -5, -5, z + 1 }, { 16, 16, 41 } }); // Draw peeps: - if (session.DPI.zoom_level < ZoomLevel{ 2 } && vehicle->num_peeps > 0 && !vehicle->IsGhost()) + if (session.rt.zoom_level < ZoomLevel{ 2 } && vehicle->num_peeps > 0 && !vehicle->IsGhost()) { baseImage_id = carEntry->base_image_id + 9; if ((vehicle->restraints_position / 64) == 3) { baseImage_id += 2; // Draw peeps sitting without transparent area between them for restraints } - auto directionOffset = OpenRCT2::Entity::Yaw::YawTo4(imageDirection); + auto directionOffset = Entity::Yaw::YawTo4(imageDirection); image_id = ImageId( baseImage_id + (((directionOffset + 0) & 3) * 3), vehicle->peep_tshirt_colours[0], vehicle->peep_tshirt_colours[1]); diff --git a/src/openrct2/paint/vehicle/Vehicle.MiniGolf.cpp b/src/openrct2/paint/vehicle/Vehicle.MiniGolf.cpp index 3a6c0206b575..dc7d79adc9ca 100644 --- a/src/openrct2/paint/vehicle/Vehicle.MiniGolf.cpp +++ b/src/openrct2/paint/vehicle/Vehicle.MiniGolf.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -105,7 +105,7 @@ namespace OpenRCT2 return; } - if (session.DPI.zoom_level >= ZoomLevel{ 2 }) + if (session.rt.zoom_level >= ZoomLevel{ 2 }) { return; } @@ -123,7 +123,7 @@ namespace OpenRCT2 return; uint8_t frame = MiniGolfPeepAnimationFrames[EnumValue(vehicle->mini_golf_current_animation)][vehicle->animation_frame]; - uint32_t ebx = (frame << 2) + OpenRCT2::Entity::Yaw::YawTo4(imageDirection); + uint32_t ebx = (frame << 2) + Entity::Yaw::YawTo4(imageDirection); ImageIndex index = rideEntry->Cars[0].base_image_id + 1 + ebx; auto image = ImageId(index, peep->TshirtColour, peep->TrousersColour); @@ -141,7 +141,7 @@ namespace OpenRCT2 return; } - if (session.DPI.zoom_level >= ZoomLevel{ 1 }) + if (session.rt.zoom_level >= ZoomLevel{ 1 }) { return; } diff --git a/src/openrct2/paint/vehicle/Vehicle.MiniGolf.h b/src/openrct2/paint/vehicle/Vehicle.MiniGolf.h index affeca1e9771..4250706aa7c8 100644 --- a/src/openrct2/paint/vehicle/Vehicle.MiniGolf.h +++ b/src/openrct2/paint/vehicle/Vehicle.MiniGolf.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/vehicle/Vehicle.ObservationTower.cpp b/src/openrct2/paint/vehicle/Vehicle.ObservationTower.cpp index ee4e07e33353..9e944ae76a4b 100644 --- a/src/openrct2/paint/vehicle/Vehicle.ObservationTower.cpp +++ b/src/openrct2/paint/vehicle/Vehicle.ObservationTower.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -62,8 +62,8 @@ namespace OpenRCT2 auto imageId1 = ImageId(baseImageId + 1, vehicle->colours.Body, vehicle->colours.Trim, vehicle->colours.Tertiary); if (vehicle->IsGhost()) { - imageId0 = ImageId(baseImageId + 0).WithRemap(FilterPaletteID::paletteGhost); - imageId1 = ImageId(baseImageId + 1).WithRemap(FilterPaletteID::paletteGhost); + imageId0 = ImageId(baseImageId + 0).WithRemap(Drawing::FilterPaletteID::paletteGhost); + imageId1 = ImageId(baseImageId + 1).WithRemap(Drawing::FilterPaletteID::paletteGhost); } PaintAddImageAsParent(session, imageId0, { 0, 0, z }, { { -11, -11, z + 1 }, { 2, 2, 41 } }); diff --git a/src/openrct2/paint/vehicle/Vehicle.ReverserRollerCoaster.cpp b/src/openrct2/paint/vehicle/Vehicle.ReverserRollerCoaster.cpp index 30f6e29dfd57..531cd67acfd1 100644 --- a/src/openrct2/paint/vehicle/Vehicle.ReverserRollerCoaster.cpp +++ b/src/openrct2/paint/vehicle/Vehicle.ReverserRollerCoaster.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/paint/vehicle/Vehicle.RiverRapids.cpp b/src/openrct2/paint/vehicle/Vehicle.RiverRapids.cpp index f42d0c3880ea..c9af9997d9f8 100644 --- a/src/openrct2/paint/vehicle/Vehicle.RiverRapids.cpp +++ b/src/openrct2/paint/vehicle/Vehicle.RiverRapids.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -32,7 +32,7 @@ namespace OpenRCT2 PaintSession& session, int32_t x, int32_t imageDirection, int32_t y, int32_t z, const Vehicle* vehicle, const CarEntry* carEntry) { - imageDirection = OpenRCT2::Entity::Yaw::YawTo32(imageDirection); + imageDirection = Entity::Yaw::YawTo32(imageDirection); ImageId image_id; int32_t baseImage_id = imageDirection; @@ -84,7 +84,7 @@ namespace OpenRCT2 } PaintAddImageAsParent(session, image_id, { 0, 0, z }, bb); - if (session.DPI.zoom_level < ZoomLevel{ 2 } && vehicle->num_peeps > 0 && !vehicle->IsGhost()) + if (session.rt.zoom_level < ZoomLevel{ 2 } && vehicle->num_peeps > 0 && !vehicle->IsGhost()) { // Draw peeps: (this particular vehicle doesn't sort them back to front like others so the back ones sometimes clip, // but that's how the original does it...) diff --git a/src/openrct2/paint/vehicle/Vehicle.RotoDrop.cpp b/src/openrct2/paint/vehicle/Vehicle.RotoDrop.cpp index d433289be5a3..16d1bd313fec 100644 --- a/src/openrct2/paint/vehicle/Vehicle.RotoDrop.cpp +++ b/src/openrct2/paint/vehicle/Vehicle.RotoDrop.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -25,7 +25,7 @@ namespace OpenRCT2 PaintSession& session, int32_t x, int32_t imageDirection, int32_t y, int32_t z, const Vehicle* vehicle, const CarEntry* carEntry) { - imageDirection = OpenRCT2::Entity::Yaw::YawTo32(imageDirection); + imageDirection = Entity::Yaw::YawTo32(imageDirection); auto imageFlags = ImageId(0, vehicle->colours.Body, vehicle->colours.Trim); if (vehicle->IsGhost()) diff --git a/src/openrct2/paint/vehicle/Vehicle.SplashBoats.cpp b/src/openrct2/paint/vehicle/Vehicle.SplashBoats.cpp index 48df702b0dae..82056a9bc7ff 100644 --- a/src/openrct2/paint/vehicle/Vehicle.SplashBoats.cpp +++ b/src/openrct2/paint/vehicle/Vehicle.SplashBoats.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -38,8 +38,7 @@ namespace OpenRCT2 } session.CurrentlyDrawnEntity = vehicleToPaint; - imageDirection = OpenRCT2::Entity::Yaw::Add( - OpenRCT2::Entity::Yaw::YawFrom4(session.CurrentRotation), vehicleToPaint->Orientation); + imageDirection = Entity::Yaw::Add(Entity::Yaw::YawFrom4(session.CurrentRotation), vehicleToPaint->Orientation); session.SpritePosition.x = vehicleToPaint->x; session.SpritePosition.y = vehicleToPaint->y; vehicleToPaint->Paint(session, imageDirection); diff --git a/src/openrct2/paint/vehicle/Vehicle.Submarine.cpp b/src/openrct2/paint/vehicle/Vehicle.Submarine.cpp index 483a07862543..59a45726d8cd 100644 --- a/src/openrct2/paint/vehicle/Vehicle.Submarine.cpp +++ b/src/openrct2/paint/vehicle/Vehicle.Submarine.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -51,11 +51,11 @@ namespace OpenRCT2 auto imageId1 = ImageId(baseImageId + 1, vehicle->colours.Body, vehicle->colours.Trim, vehicle->colours.Tertiary); if (vehicle->IsGhost()) { - imageId0 = ImageId(baseImageId + 0).WithRemap(FilterPaletteID::paletteGhost); - imageId1 = ImageId(baseImageId + 1).WithRemap(FilterPaletteID::paletteGhost); + imageId0 = ImageId(baseImageId + 0).WithRemap(Drawing::FilterPaletteID::paletteGhost); + imageId1 = ImageId(baseImageId + 1).WithRemap(Drawing::FilterPaletteID::paletteGhost); } - const auto& bb = VehicleBoundboxes[carEntry->draw_order][OpenRCT2::Entity::Yaw::YawTo16(imageDirection)]; + const auto& bb = VehicleBoundboxes[carEntry->draw_order][Entity::Yaw::YawTo16(imageDirection)]; PaintAddImageAsParent( session, imageId0, { 0, 0, z }, { { bb.offset_x, bb.offset_y, bb.offset_z + z }, { bb.length_x, bb.length_y, bb.length_z } }); diff --git a/src/openrct2/paint/vehicle/Vehicle.VirginaReel.cpp b/src/openrct2/paint/vehicle/Vehicle.VirginiaReel.cpp similarity index 93% rename from src/openrct2/paint/vehicle/Vehicle.VirginaReel.cpp rename to src/openrct2/paint/vehicle/Vehicle.VirginiaReel.cpp index 776880f7d1c9..b31eb822f89b 100644 --- a/src/openrct2/paint/vehicle/Vehicle.VirginaReel.cpp +++ b/src/openrct2/paint/vehicle/Vehicle.VirginiaReel.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -32,7 +32,7 @@ namespace OpenRCT2 PaintSession& session, int32_t x, int32_t imageDirection, int32_t y, int32_t z, const Vehicle* vehicle, const CarEntry* carEntry) { - imageDirection = OpenRCT2::Entity::Yaw::YawTo32(imageDirection); + imageDirection = Entity::Yaw::YawTo32(imageDirection); const uint8_t rotation = session.CurrentRotation; int32_t ecx = ((vehicle->spin_sprite / 8) + (rotation * 8)) & 31; int32_t baseImage_id = [&] { @@ -63,7 +63,7 @@ namespace OpenRCT2 } PaintAddImageAsParent(session, image_id, { 0, 0, z }, bb); - if (session.DPI.zoom_level < ZoomLevel{ 2 } && vehicle->num_peeps > 0 && !vehicle->IsGhost()) + if (session.rt.zoom_level < ZoomLevel{ 2 } && vehicle->num_peeps > 0 && !vehicle->IsGhost()) { uint8_t riding_peep_sprites[4] = { 0xFF, 0xFF, 0xFF, 0xFF }; for (int32_t i = 0; i < vehicle->num_peeps; i++) diff --git a/src/openrct2/paint/vehicle/VehiclePaint.cpp b/src/openrct2/paint/vehicle/VehiclePaint.cpp index 3bd6dc3ab094..30985b7d2b44 100644 --- a/src/openrct2/paint/vehicle/VehiclePaint.cpp +++ b/src/openrct2/paint/vehicle/VehiclePaint.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -27,6 +27,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; using namespace OpenRCT2::Entity::Yaw; #pragma region VehicleBoundboxes @@ -1131,7 +1132,7 @@ static void vehicle_sprite_paint( session, imageId, { 0, 0, z }, { { bb.offset_x, bb.offset_y, bb.offset_z + z }, { bb.length_x, bb.length_y, bb.length_z } }); - auto& rt = session.DPI; + auto& rt = session.rt; if (rt.zoom_level < ZoomLevel{ 2 } && vehicle->num_peeps > 0 && carEntry->no_seating_rows > 0) { PaintVehicleRiders(session, vehicle, carEntry, baseImageId, z, bb); @@ -3396,8 +3397,8 @@ static void VehiclePitchDown75( { if (vehicle->HasFlag(VehicleFlags::CarIsInverted)) { - if (vehicle->GetTrackType() != TrackElemType::Down90ToDown60 - && (vehicle->GetTrackType()) != TrackElemType::Down60ToDown90) + if (vehicle->GetTrackType() != TrackElemType::down90ToDown60 + && (vehicle->GetTrackType()) != TrackElemType::down60ToDown90) { carEntry--; } @@ -3422,8 +3423,8 @@ static void VehiclePitchDown90( { if (vehicle->HasFlag(VehicleFlags::CarIsInverted)) { - if (vehicle->GetTrackType() != TrackElemType::Down90 && (vehicle->GetTrackType()) != TrackElemType::Down90ToDown60 - && (vehicle->GetTrackType()) != TrackElemType::Down60ToDown90) + if (vehicle->GetTrackType() != TrackElemType::down90 && (vehicle->GetTrackType()) != TrackElemType::down90ToDown60 + && (vehicle->GetTrackType()) != TrackElemType::down60ToDown90) { carEntry--; } @@ -4536,7 +4537,7 @@ static_assert(std::size(PaintFunctionsByPitch) == EnumValue(VehiclePitch::pitchC */ static void vehicle_visual_splash1_effect(PaintSession& session, const int32_t z, const Vehicle* vehicle) { - if (vehicle->GetTrackType() != TrackElemType::Watersplash) + if (vehicle->GetTrackType() != TrackElemType::watersplash) { return; } @@ -4699,8 +4700,7 @@ void VehicleVisualDefault( if (vehicle->HasFlag(VehicleFlags::CarIsReversed)) { auto imagePitch = PitchInvertTable[EnumValue(vehicle->pitch)]; - auto imageYaw = (imageDirection + (OpenRCT2::Entity::Yaw::kBaseRotation / 2)) - & (OpenRCT2::Entity::Yaw::kBaseRotation - 1); + auto imageYaw = (imageDirection + (kBaseRotation / 2)) & (kBaseRotation - 1); PaintFunctionsByPitch[EnumValue(imagePitch)](session, vehicle, imageYaw, z, carEntry, kBoundBoxIndexUndefined); } else diff --git a/src/openrct2/paint/vehicle/VehiclePaint.h b/src/openrct2/paint/vehicle/VehiclePaint.h index 556edaba4345..aee9142fab86 100644 --- a/src/openrct2/paint/vehicle/VehiclePaint.h +++ b/src/openrct2/paint/vehicle/VehiclePaint.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/park/Legacy.cpp b/src/openrct2/park/Legacy.cpp index 162020dda698..d3903496de6e 100644 --- a/src/openrct2/park/Legacy.cpp +++ b/src/openrct2/park/Legacy.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -2395,8 +2395,8 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType // to be. if (rideType == RIDE_TYPE_LOG_FLUME && parkFileVersion < kLogFlumeSteepSlopeVersion) { - if (trackType == TrackElemType::Down25ToDown60 || trackType == TrackElemType::Down60 - || trackType == TrackElemType::Down60ToDown25) + if (trackType == TrackElemType::down25ToDown60 || trackType == TrackElemType::down60 + || trackType == TrackElemType::down60ToDown25) { return true; } @@ -2405,106 +2405,106 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType { switch (trackType) { - case TrackElemType::Up90: - case TrackElemType::Down90: - case TrackElemType::Up60ToUp90: - case TrackElemType::Down90ToDown60: - case TrackElemType::Up90ToUp60: - case TrackElemType::Down60ToDown90: - case TrackElemType::LeftQuarterTurn1TileUp90: - case TrackElemType::RightQuarterTurn1TileUp90: - case TrackElemType::LeftQuarterTurn1TileDown90: - case TrackElemType::RightQuarterTurn1TileDown90: - case TrackElemType::LeftBarrelRollUpToDown: - case TrackElemType::RightBarrelRollUpToDown: - case TrackElemType::LeftBarrelRollDownToUp: - case TrackElemType::RightBarrelRollDownToUp: - case TrackElemType::HalfLoopUp: - case TrackElemType::HalfLoopDown: - case TrackElemType::LeftVerticalLoop: - case TrackElemType::RightVerticalLoop: - case TrackElemType::LeftCorkscrewUp: - case TrackElemType::RightCorkscrewUp: - case TrackElemType::LeftCorkscrewDown: - case TrackElemType::RightCorkscrewDown: - case TrackElemType::LeftLargeCorkscrewUp: - case TrackElemType::RightLargeCorkscrewUp: - case TrackElemType::LeftLargeCorkscrewDown: - case TrackElemType::RightLargeCorkscrewDown: - case TrackElemType::LeftZeroGRollUp: - case TrackElemType::RightZeroGRollUp: - case TrackElemType::LeftZeroGRollDown: - case TrackElemType::RightZeroGRollDown: - case TrackElemType::LeftLargeZeroGRollUp: - case TrackElemType::RightLargeZeroGRollUp: - case TrackElemType::LeftLargeZeroGRollDown: - case TrackElemType::RightLargeZeroGRollDown: - case TrackElemType::Up90ToInvertedFlatQuarterLoop: - case TrackElemType::InvertedFlatToDown90QuarterLoop: - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: - case TrackElemType::LeftMediumHalfLoopUp: - case TrackElemType::RightMediumHalfLoopUp: - case TrackElemType::LeftMediumHalfLoopDown: - case TrackElemType::RightMediumHalfLoopDown: - case TrackElemType::LeftLargeHalfLoopUp: - case TrackElemType::RightLargeHalfLoopUp: - case TrackElemType::RightLargeHalfLoopDown: - case TrackElemType::LeftLargeHalfLoopDown: - case TrackElemType::FlatToUp60: - case TrackElemType::Up60ToFlat: - case TrackElemType::FlatToDown60: - case TrackElemType::Down60ToFlat: - case TrackElemType::DiagFlatToUp60: - case TrackElemType::DiagUp60ToFlat: - case TrackElemType::DiagFlatToDown60: - case TrackElemType::DiagDown60ToFlat: - case TrackElemType::LeftEighthToDiagUp25: - case TrackElemType::RightEighthToDiagUp25: - case TrackElemType::LeftEighthToDiagDown25: - case TrackElemType::RightEighthToDiagDown25: - case TrackElemType::LeftEighthToOrthogonalUp25: - case TrackElemType::RightEighthToOrthogonalUp25: - case TrackElemType::LeftEighthToOrthogonalDown25: - case TrackElemType::RightEighthToOrthogonalDown25: - case TrackElemType::DiagUp25ToLeftBankedUp25: - case TrackElemType::DiagUp25ToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToUp25: - case TrackElemType::DiagRightBankedUp25ToUp25: - case TrackElemType::DiagDown25ToLeftBankedDown25: - case TrackElemType::DiagDown25ToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToDown25: - case TrackElemType::DiagRightBankedDown25ToDown25: - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: - case TrackElemType::DiagUp25LeftBanked: - case TrackElemType::DiagUp25RightBanked: - case TrackElemType::DiagDown25LeftBanked: - case TrackElemType::DiagDown25RightBanked: - case TrackElemType::DiagFlatToLeftBankedUp25: - case TrackElemType::DiagFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToFlat: - case TrackElemType::DiagRightBankedUp25ToFlat: - case TrackElemType::DiagFlatToLeftBankedDown25: - case TrackElemType::DiagFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToFlat: - case TrackElemType::DiagRightBankedDown25ToFlat: - case TrackElemType::LeftEighthBankToDiagUp25: - case TrackElemType::RightEighthBankToDiagUp25: - case TrackElemType::LeftEighthBankToDiagDown25: - case TrackElemType::RightEighthBankToDiagDown25: - case TrackElemType::LeftEighthBankToOrthogonalUp25: - case TrackElemType::RightEighthBankToOrthogonalUp25: - case TrackElemType::LeftEighthBankToOrthogonalDown25: - case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::up90: + case TrackElemType::down90: + case TrackElemType::up60ToUp90: + case TrackElemType::down90ToDown60: + case TrackElemType::up90ToUp60: + case TrackElemType::down60ToDown90: + case TrackElemType::leftQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: + case TrackElemType::leftBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: + case TrackElemType::leftBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: + case TrackElemType::halfLoopUp: + case TrackElemType::halfLoopDown: + case TrackElemType::leftVerticalLoop: + case TrackElemType::rightVerticalLoop: + case TrackElemType::leftCorkscrewUp: + case TrackElemType::rightCorkscrewUp: + case TrackElemType::leftCorkscrewDown: + case TrackElemType::rightCorkscrewDown: + case TrackElemType::leftLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: + case TrackElemType::leftZeroGRollUp: + case TrackElemType::rightZeroGRollUp: + case TrackElemType::leftZeroGRollDown: + case TrackElemType::rightZeroGRollDown: + case TrackElemType::leftLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: + case TrackElemType::up90ToInvertedFlatQuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::leftMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: + case TrackElemType::leftLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: + case TrackElemType::flatToUp60: + case TrackElemType::up60ToFlat: + case TrackElemType::flatToDown60: + case TrackElemType::down60ToFlat: + case TrackElemType::diagFlatToUp60: + case TrackElemType::diagUp60ToFlat: + case TrackElemType::diagFlatToDown60: + case TrackElemType::diagDown60ToFlat: + case TrackElemType::leftEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: + case TrackElemType::leftEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: + case TrackElemType::leftEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: + case TrackElemType::diagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: + case TrackElemType::diagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagUp25LeftBanked: + case TrackElemType::diagUp25RightBanked: + case TrackElemType::diagDown25LeftBanked: + case TrackElemType::diagDown25RightBanked: + case TrackElemType::diagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: + case TrackElemType::diagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: + case TrackElemType::leftEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: return true; default: break; @@ -2517,10 +2517,10 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType { switch (trackType) { - case TrackElemType::FlatToUp60LongBase: - case TrackElemType::Up60ToFlatLongBase: - case TrackElemType::FlatToDown60LongBase: - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::flatToUp60LongBase: + case TrackElemType::up60ToFlatLongBase: + case TrackElemType::flatToDown60LongBase: + case TrackElemType::down60ToFlatLongBase: return true; default: break; @@ -2532,14 +2532,14 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType { switch (trackType) { - case TrackElemType::LeftMediumHalfLoopUp: - case TrackElemType::RightMediumHalfLoopUp: - case TrackElemType::LeftMediumHalfLoopDown: - case TrackElemType::RightMediumHalfLoopDown: - case TrackElemType::LeftLargeHalfLoopUp: - case TrackElemType::RightLargeHalfLoopUp: - case TrackElemType::LeftLargeHalfLoopDown: - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::leftMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: + case TrackElemType::leftLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return true; default: break; @@ -2552,134 +2552,134 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType { switch (trackType) { - case TrackElemType::FlatToUp60: - case TrackElemType::Up60ToFlat: - case TrackElemType::FlatToDown60: - case TrackElemType::Down60ToFlat: - case TrackElemType::DiagFlatToUp60: - case TrackElemType::DiagUp60ToFlat: - case TrackElemType::DiagFlatToDown60: - case TrackElemType::DiagDown60ToFlat: - case TrackElemType::Up90: - case TrackElemType::Down90: - case TrackElemType::Up60ToUp90: - case TrackElemType::Down90ToDown60: - case TrackElemType::Up90ToUp60: - case TrackElemType::Down60ToDown90: - case TrackElemType::LeftQuarterTurn1TileUp90: - case TrackElemType::RightQuarterTurn1TileUp90: - case TrackElemType::LeftQuarterTurn1TileDown90: - case TrackElemType::RightQuarterTurn1TileDown90: - case TrackElemType::Up25ToLeftBankedUp25: - case TrackElemType::Up25ToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToUp25: - case TrackElemType::RightBankedUp25ToUp25: - case TrackElemType::Down25ToLeftBankedDown25: - case TrackElemType::Down25ToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToDown25: - case TrackElemType::RightBankedDown25ToDown25: - case TrackElemType::LeftBankedFlatToLeftBankedUp25: - case TrackElemType::RightBankedFlatToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: - case TrackElemType::RightBankedUp25ToRightBankedFlat: - case TrackElemType::LeftBankedFlatToLeftBankedDown25: - case TrackElemType::RightBankedFlatToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: - case TrackElemType::RightBankedDown25ToRightBankedFlat: - case TrackElemType::Down25LeftBanked: - case TrackElemType::Down25RightBanked: - case TrackElemType::FlatToLeftBankedUp25: - case TrackElemType::FlatToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToFlat: - case TrackElemType::RightBankedUp25ToFlat: - case TrackElemType::FlatToLeftBankedDown25: - case TrackElemType::FlatToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToFlat: - case TrackElemType::RightBankedDown25ToFlat: - case TrackElemType::Up25LeftBanked: - case TrackElemType::Up25RightBanked: - case TrackElemType::LeftBankedQuarterTurn3TileUp25: - case TrackElemType::RightBankedQuarterTurn3TileUp25: - case TrackElemType::LeftBankedQuarterTurn3TileDown25: - case TrackElemType::RightBankedQuarterTurn3TileDown25: - case TrackElemType::LeftBankedQuarterTurn5TileUp25: - case TrackElemType::RightBankedQuarterTurn5TileUp25: - case TrackElemType::LeftBankedQuarterTurn5TileDown25: - case TrackElemType::RightBankedQuarterTurn5TileDown25: - case TrackElemType::LeftEighthToDiagUp25: - case TrackElemType::RightEighthToDiagUp25: - case TrackElemType::LeftEighthToDiagDown25: - case TrackElemType::RightEighthToDiagDown25: - case TrackElemType::LeftEighthToOrthogonalUp25: - case TrackElemType::RightEighthToOrthogonalUp25: - case TrackElemType::LeftEighthToOrthogonalDown25: - case TrackElemType::RightEighthToOrthogonalDown25: - case TrackElemType::DiagUp25ToLeftBankedUp25: - case TrackElemType::DiagUp25ToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToUp25: - case TrackElemType::DiagRightBankedUp25ToUp25: - case TrackElemType::DiagDown25ToLeftBankedDown25: - case TrackElemType::DiagDown25ToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToDown25: - case TrackElemType::DiagRightBankedDown25ToDown25: - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: - case TrackElemType::DiagUp25LeftBanked: - case TrackElemType::DiagUp25RightBanked: - case TrackElemType::DiagDown25LeftBanked: - case TrackElemType::DiagDown25RightBanked: - case TrackElemType::DiagFlatToLeftBankedUp25: - case TrackElemType::DiagFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToFlat: - case TrackElemType::DiagRightBankedUp25ToFlat: - case TrackElemType::DiagFlatToLeftBankedDown25: - case TrackElemType::DiagFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToFlat: - case TrackElemType::DiagRightBankedDown25ToFlat: - case TrackElemType::LeftEighthBankToDiagUp25: - case TrackElemType::RightEighthBankToDiagUp25: - case TrackElemType::LeftEighthBankToDiagDown25: - case TrackElemType::RightEighthBankToDiagDown25: - case TrackElemType::LeftEighthBankToOrthogonalUp25: - case TrackElemType::RightEighthBankToOrthogonalUp25: - case TrackElemType::LeftEighthBankToOrthogonalDown25: - case TrackElemType::RightEighthBankToOrthogonalDown25: - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: - case TrackElemType::LeftLargeCorkscrewUp: - case TrackElemType::RightLargeCorkscrewUp: - case TrackElemType::LeftLargeCorkscrewDown: - case TrackElemType::RightLargeCorkscrewDown: - case TrackElemType::Up90ToInvertedFlatQuarterLoop: - case TrackElemType::InvertedFlatToDown90QuarterLoop: - case TrackElemType::LeftMediumHalfLoopUp: - case TrackElemType::RightMediumHalfLoopUp: - case TrackElemType::LeftMediumHalfLoopDown: - case TrackElemType::RightMediumHalfLoopDown: - case TrackElemType::LeftLargeHalfLoopUp: - case TrackElemType::RightLargeHalfLoopUp: - case TrackElemType::LeftLargeHalfLoopDown: - case TrackElemType::RightLargeHalfLoopDown: - case TrackElemType::LeftBarrelRollUpToDown: - case TrackElemType::RightBarrelRollUpToDown: - case TrackElemType::LeftBarrelRollDownToUp: - case TrackElemType::RightBarrelRollDownToUp: - case TrackElemType::LeftZeroGRollUp: - case TrackElemType::RightZeroGRollUp: - case TrackElemType::LeftZeroGRollDown: - case TrackElemType::RightZeroGRollDown: - case TrackElemType::LeftLargeZeroGRollUp: - case TrackElemType::RightLargeZeroGRollUp: - case TrackElemType::LeftLargeZeroGRollDown: - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::flatToUp60: + case TrackElemType::up60ToFlat: + case TrackElemType::flatToDown60: + case TrackElemType::down60ToFlat: + case TrackElemType::diagFlatToUp60: + case TrackElemType::diagUp60ToFlat: + case TrackElemType::diagFlatToDown60: + case TrackElemType::diagDown60ToFlat: + case TrackElemType::up90: + case TrackElemType::down90: + case TrackElemType::up60ToUp90: + case TrackElemType::down90ToDown60: + case TrackElemType::up90ToUp60: + case TrackElemType::down60ToDown90: + case TrackElemType::leftQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: + case TrackElemType::up25ToLeftBankedUp25: + case TrackElemType::up25ToRightBankedUp25: + case TrackElemType::leftBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: + case TrackElemType::down25ToLeftBankedDown25: + case TrackElemType::down25ToRightBankedDown25: + case TrackElemType::leftBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: + case TrackElemType::leftBankedFlatToLeftBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: + case TrackElemType::down25LeftBanked: + case TrackElemType::down25RightBanked: + case TrackElemType::flatToLeftBankedUp25: + case TrackElemType::flatToRightBankedUp25: + case TrackElemType::leftBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: + case TrackElemType::flatToLeftBankedDown25: + case TrackElemType::flatToRightBankedDown25: + case TrackElemType::leftBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: + case TrackElemType::up25LeftBanked: + case TrackElemType::up25RightBanked: + case TrackElemType::leftBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: + case TrackElemType::leftEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: + case TrackElemType::leftEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: + case TrackElemType::leftEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: + case TrackElemType::diagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: + case TrackElemType::diagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagUp25LeftBanked: + case TrackElemType::diagUp25RightBanked: + case TrackElemType::diagDown25LeftBanked: + case TrackElemType::diagDown25RightBanked: + case TrackElemType::diagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: + case TrackElemType::diagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: + case TrackElemType::leftEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::leftLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: + case TrackElemType::up90ToInvertedFlatQuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: + case TrackElemType::leftMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: + case TrackElemType::leftLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: + case TrackElemType::leftBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: + case TrackElemType::leftBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: + case TrackElemType::leftZeroGRollUp: + case TrackElemType::rightZeroGRollUp: + case TrackElemType::leftZeroGRollDown: + case TrackElemType::rightZeroGRollDown: + case TrackElemType::leftLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return true; default: break; @@ -2692,66 +2692,66 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType { switch (trackType) { - case TrackElemType::LeftEighthToDiagUp25: - case TrackElemType::RightEighthToDiagUp25: - case TrackElemType::LeftEighthToDiagDown25: - case TrackElemType::RightEighthToDiagDown25: - case TrackElemType::LeftEighthToOrthogonalUp25: - case TrackElemType::RightEighthToOrthogonalUp25: - case TrackElemType::LeftEighthToOrthogonalDown25: - case TrackElemType::RightEighthToOrthogonalDown25: - case TrackElemType::DiagUp25ToLeftBankedUp25: - case TrackElemType::DiagUp25ToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToUp25: - case TrackElemType::DiagRightBankedUp25ToUp25: - case TrackElemType::DiagDown25ToLeftBankedDown25: - case TrackElemType::DiagDown25ToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToDown25: - case TrackElemType::DiagRightBankedDown25ToDown25: - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: - case TrackElemType::DiagUp25LeftBanked: - case TrackElemType::DiagUp25RightBanked: - case TrackElemType::DiagDown25LeftBanked: - case TrackElemType::DiagDown25RightBanked: - case TrackElemType::DiagFlatToLeftBankedUp25: - case TrackElemType::DiagFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToFlat: - case TrackElemType::DiagRightBankedUp25ToFlat: - case TrackElemType::DiagFlatToLeftBankedDown25: - case TrackElemType::DiagFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToFlat: - case TrackElemType::DiagRightBankedDown25ToFlat: - case TrackElemType::LeftEighthBankToDiagUp25: - case TrackElemType::RightEighthBankToDiagUp25: - case TrackElemType::LeftEighthBankToDiagDown25: - case TrackElemType::RightEighthBankToDiagDown25: - case TrackElemType::LeftEighthBankToOrthogonalUp25: - case TrackElemType::RightEighthBankToOrthogonalUp25: - case TrackElemType::LeftEighthBankToOrthogonalDown25: - case TrackElemType::RightEighthBankToOrthogonalDown25: - case TrackElemType::LeftLargeCorkscrewUp: - case TrackElemType::RightLargeCorkscrewUp: - case TrackElemType::LeftLargeCorkscrewDown: - case TrackElemType::RightLargeCorkscrewDown: - case TrackElemType::LeftMediumHalfLoopUp: - case TrackElemType::RightMediumHalfLoopUp: - case TrackElemType::LeftMediumHalfLoopDown: - case TrackElemType::RightMediumHalfLoopDown: - case TrackElemType::LeftZeroGRollUp: - case TrackElemType::RightZeroGRollUp: - case TrackElemType::LeftZeroGRollDown: - case TrackElemType::RightZeroGRollDown: - case TrackElemType::LeftLargeZeroGRollUp: - case TrackElemType::RightLargeZeroGRollUp: - case TrackElemType::LeftLargeZeroGRollDown: - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::leftEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: + case TrackElemType::leftEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: + case TrackElemType::leftEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: + case TrackElemType::diagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: + case TrackElemType::diagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagUp25LeftBanked: + case TrackElemType::diagUp25RightBanked: + case TrackElemType::diagDown25LeftBanked: + case TrackElemType::diagDown25RightBanked: + case TrackElemType::diagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: + case TrackElemType::diagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: + case TrackElemType::leftEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: + case TrackElemType::leftLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: + case TrackElemType::leftMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: + case TrackElemType::leftZeroGRollUp: + case TrackElemType::rightZeroGRollUp: + case TrackElemType::leftZeroGRollDown: + case TrackElemType::rightZeroGRollDown: + case TrackElemType::leftLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return true; default: break; @@ -2761,17 +2761,17 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType { switch (trackType) { - case TrackElemType::LeftQuarterTurn3Tiles: - case TrackElemType::RightQuarterTurn3Tiles: - case TrackElemType::LeftQuarterTurn5Tiles: - case TrackElemType::RightQuarterTurn5Tiles: - case TrackElemType::LeftEighthToDiag: - case TrackElemType::RightEighthToDiag: - case TrackElemType::LeftEighthToOrthogonal: - case TrackElemType::RightEighthToOrthogonal: - case TrackElemType::DiagFlat: - case TrackElemType::SBendLeft: - case TrackElemType::SBendRight: + case TrackElemType::leftQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: + case TrackElemType::leftEighthToDiag: + case TrackElemType::rightEighthToDiag: + case TrackElemType::leftEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: + case TrackElemType::diagFlat: + case TrackElemType::sBendLeft: + case TrackElemType::sBendRight: return true; default: break; @@ -2783,142 +2783,142 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType { switch (trackType) { - case TrackElemType::FlatToUp60: - case TrackElemType::Up60ToFlat: - case TrackElemType::FlatToDown60: - case TrackElemType::Down60ToFlat: - case TrackElemType::DiagFlatToUp60: - case TrackElemType::DiagUp60ToFlat: - case TrackElemType::DiagFlatToDown60: - case TrackElemType::DiagDown60ToFlat: - case TrackElemType::FlatToUp60LongBase: - case TrackElemType::Up60ToFlatLongBase: - case TrackElemType::Down60ToFlatLongBase: - case TrackElemType::FlatToDown60LongBase: - case TrackElemType::Up90: - case TrackElemType::Down90: - case TrackElemType::Up60ToUp90: - case TrackElemType::Down90ToDown60: - case TrackElemType::Up90ToUp60: - case TrackElemType::Down60ToDown90: - case TrackElemType::LeftQuarterTurn1TileUp60: - case TrackElemType::RightQuarterTurn1TileUp60: - case TrackElemType::LeftQuarterTurn1TileDown60: - case TrackElemType::RightQuarterTurn1TileDown60: - case TrackElemType::LeftQuarterTurn1TileUp90: - case TrackElemType::RightQuarterTurn1TileUp90: - case TrackElemType::LeftQuarterTurn1TileDown90: - case TrackElemType::RightQuarterTurn1TileDown90: - case TrackElemType::Up25ToLeftBankedUp25: - case TrackElemType::Up25ToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToUp25: - case TrackElemType::RightBankedUp25ToUp25: - case TrackElemType::Down25ToLeftBankedDown25: - case TrackElemType::Down25ToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToDown25: - case TrackElemType::RightBankedDown25ToDown25: - case TrackElemType::LeftBankedFlatToLeftBankedUp25: - case TrackElemType::RightBankedFlatToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: - case TrackElemType::RightBankedUp25ToRightBankedFlat: - case TrackElemType::LeftBankedFlatToLeftBankedDown25: - case TrackElemType::RightBankedFlatToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: - case TrackElemType::RightBankedDown25ToRightBankedFlat: - case TrackElemType::Down25LeftBanked: - case TrackElemType::Down25RightBanked: - case TrackElemType::FlatToLeftBankedUp25: - case TrackElemType::FlatToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToFlat: - case TrackElemType::RightBankedUp25ToFlat: - case TrackElemType::FlatToLeftBankedDown25: - case TrackElemType::FlatToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToFlat: - case TrackElemType::RightBankedDown25ToFlat: - case TrackElemType::Up25LeftBanked: - case TrackElemType::Up25RightBanked: - case TrackElemType::LeftBankedQuarterTurn3TileUp25: - case TrackElemType::RightBankedQuarterTurn3TileUp25: - case TrackElemType::LeftBankedQuarterTurn3TileDown25: - case TrackElemType::RightBankedQuarterTurn3TileDown25: - case TrackElemType::LeftBankedQuarterTurn5TileUp25: - case TrackElemType::RightBankedQuarterTurn5TileUp25: - case TrackElemType::LeftBankedQuarterTurn5TileDown25: - case TrackElemType::RightBankedQuarterTurn5TileDown25: - case TrackElemType::LeftEighthToDiagUp25: - case TrackElemType::RightEighthToDiagUp25: - case TrackElemType::LeftEighthToDiagDown25: - case TrackElemType::RightEighthToDiagDown25: - case TrackElemType::LeftEighthToOrthogonalUp25: - case TrackElemType::RightEighthToOrthogonalUp25: - case TrackElemType::LeftEighthToOrthogonalDown25: - case TrackElemType::RightEighthToOrthogonalDown25: - case TrackElemType::DiagUp25ToLeftBankedUp25: - case TrackElemType::DiagUp25ToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToUp25: - case TrackElemType::DiagRightBankedUp25ToUp25: - case TrackElemType::DiagDown25ToLeftBankedDown25: - case TrackElemType::DiagDown25ToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToDown25: - case TrackElemType::DiagRightBankedDown25ToDown25: - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: - case TrackElemType::DiagUp25LeftBanked: - case TrackElemType::DiagUp25RightBanked: - case TrackElemType::DiagDown25LeftBanked: - case TrackElemType::DiagDown25RightBanked: - case TrackElemType::DiagFlatToLeftBankedUp25: - case TrackElemType::DiagFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToFlat: - case TrackElemType::DiagRightBankedUp25ToFlat: - case TrackElemType::DiagFlatToLeftBankedDown25: - case TrackElemType::DiagFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToFlat: - case TrackElemType::DiagRightBankedDown25ToFlat: - case TrackElemType::LeftEighthBankToDiagUp25: - case TrackElemType::RightEighthBankToDiagUp25: - case TrackElemType::LeftEighthBankToDiagDown25: - case TrackElemType::RightEighthBankToDiagDown25: - case TrackElemType::LeftEighthBankToOrthogonalUp25: - case TrackElemType::RightEighthBankToOrthogonalUp25: - case TrackElemType::LeftEighthBankToOrthogonalDown25: - case TrackElemType::RightEighthBankToOrthogonalDown25: - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: - case TrackElemType::LeftLargeCorkscrewUp: - case TrackElemType::RightLargeCorkscrewUp: - case TrackElemType::LeftLargeCorkscrewDown: - case TrackElemType::RightLargeCorkscrewDown: - case TrackElemType::Up90ToInvertedFlatQuarterLoop: - case TrackElemType::InvertedFlatToDown90QuarterLoop: - case TrackElemType::LeftMediumHalfLoopUp: - case TrackElemType::RightMediumHalfLoopUp: - case TrackElemType::LeftMediumHalfLoopDown: - case TrackElemType::RightMediumHalfLoopDown: - case TrackElemType::LeftLargeHalfLoopUp: - case TrackElemType::RightLargeHalfLoopUp: - case TrackElemType::RightLargeHalfLoopDown: - case TrackElemType::LeftLargeHalfLoopDown: - case TrackElemType::LeftBarrelRollUpToDown: - case TrackElemType::RightBarrelRollUpToDown: - case TrackElemType::LeftBarrelRollDownToUp: - case TrackElemType::RightBarrelRollDownToUp: - case TrackElemType::LeftZeroGRollUp: - case TrackElemType::RightZeroGRollUp: - case TrackElemType::LeftZeroGRollDown: - case TrackElemType::RightZeroGRollDown: - case TrackElemType::LeftLargeZeroGRollUp: - case TrackElemType::RightLargeZeroGRollUp: - case TrackElemType::LeftLargeZeroGRollDown: - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::flatToUp60: + case TrackElemType::up60ToFlat: + case TrackElemType::flatToDown60: + case TrackElemType::down60ToFlat: + case TrackElemType::diagFlatToUp60: + case TrackElemType::diagUp60ToFlat: + case TrackElemType::diagFlatToDown60: + case TrackElemType::diagDown60ToFlat: + case TrackElemType::flatToUp60LongBase: + case TrackElemType::up60ToFlatLongBase: + case TrackElemType::down60ToFlatLongBase: + case TrackElemType::flatToDown60LongBase: + case TrackElemType::up90: + case TrackElemType::down90: + case TrackElemType::up60ToUp90: + case TrackElemType::down90ToDown60: + case TrackElemType::up90ToUp60: + case TrackElemType::down60ToDown90: + case TrackElemType::leftQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: + case TrackElemType::up25ToLeftBankedUp25: + case TrackElemType::up25ToRightBankedUp25: + case TrackElemType::leftBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: + case TrackElemType::down25ToLeftBankedDown25: + case TrackElemType::down25ToRightBankedDown25: + case TrackElemType::leftBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: + case TrackElemType::leftBankedFlatToLeftBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: + case TrackElemType::leftBankedFlatToLeftBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: + case TrackElemType::down25LeftBanked: + case TrackElemType::down25RightBanked: + case TrackElemType::flatToLeftBankedUp25: + case TrackElemType::flatToRightBankedUp25: + case TrackElemType::leftBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: + case TrackElemType::flatToLeftBankedDown25: + case TrackElemType::flatToRightBankedDown25: + case TrackElemType::leftBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: + case TrackElemType::up25LeftBanked: + case TrackElemType::up25RightBanked: + case TrackElemType::leftBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: + case TrackElemType::leftEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: + case TrackElemType::leftEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: + case TrackElemType::leftEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: + case TrackElemType::diagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: + case TrackElemType::diagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagUp25LeftBanked: + case TrackElemType::diagUp25RightBanked: + case TrackElemType::diagDown25LeftBanked: + case TrackElemType::diagDown25RightBanked: + case TrackElemType::diagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: + case TrackElemType::diagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: + case TrackElemType::leftEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToOrthogonalDown25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::leftLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewDown: + case TrackElemType::up90ToInvertedFlatQuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: + case TrackElemType::leftMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: + case TrackElemType::leftLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: + case TrackElemType::leftBarrelRollUpToDown: + case TrackElemType::rightBarrelRollUpToDown: + case TrackElemType::leftBarrelRollDownToUp: + case TrackElemType::rightBarrelRollDownToUp: + case TrackElemType::leftZeroGRollUp: + case TrackElemType::rightZeroGRollUp: + case TrackElemType::leftZeroGRollDown: + case TrackElemType::rightZeroGRollDown: + case TrackElemType::leftLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return true; default: break; @@ -2928,55 +2928,55 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType { switch (trackType) { - case TrackElemType::Up60: - case TrackElemType::Up25ToUp60: - case TrackElemType::Up60ToUp25: - case TrackElemType::Down60: - case TrackElemType::Down25ToDown60: - case TrackElemType::Down60ToDown25: - case TrackElemType::FlatToUp60LongBase: - case TrackElemType::Up60ToFlatLongBase: - case TrackElemType::FlatToDown60LongBase: - case TrackElemType::Down60ToFlatLongBase: - case TrackElemType::LeftQuarterTurn3Tiles: - case TrackElemType::RightQuarterTurn3Tiles: - case TrackElemType::LeftQuarterTurn5Tiles: - case TrackElemType::RightQuarterTurn5Tiles: - case TrackElemType::LeftEighthToDiag: - case TrackElemType::RightEighthToDiag: - case TrackElemType::LeftEighthToOrthogonal: - case TrackElemType::RightEighthToOrthogonal: - case TrackElemType::DiagFlat: - case TrackElemType::DiagFlatToUp25: - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagFlatToDown25: - case TrackElemType::DiagDown25ToFlat: - case TrackElemType::DiagUp25: - case TrackElemType::DiagDown25: - case TrackElemType::DiagUp25ToUp60: - case TrackElemType::DiagUp60ToUp25: - case TrackElemType::DiagUp60: - case TrackElemType::DiagDown25ToDown60: - case TrackElemType::DiagDown60ToDown25: - case TrackElemType::DiagDown60: - case TrackElemType::LeftQuarterTurn3TilesUp25: - case TrackElemType::RightQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25: - case TrackElemType::RightQuarterTurn3TilesDown25: - case TrackElemType::LeftQuarterTurn5TilesUp25: - case TrackElemType::RightQuarterTurn5TilesUp25: - case TrackElemType::LeftQuarterTurn5TilesDown25: - case TrackElemType::RightQuarterTurn5TilesDown25: - case TrackElemType::LeftEighthToDiagUp25: - case TrackElemType::RightEighthToDiagUp25: - case TrackElemType::LeftEighthToDiagDown25: - case TrackElemType::RightEighthToDiagDown25: - case TrackElemType::LeftEighthToOrthogonalUp25: - case TrackElemType::RightEighthToOrthogonalUp25: - case TrackElemType::LeftEighthToOrthogonalDown25: - case TrackElemType::RightEighthToOrthogonalDown25: - case TrackElemType::SBendLeft: - case TrackElemType::SBendRight: + case TrackElemType::up60: + case TrackElemType::up25ToUp60: + case TrackElemType::up60ToUp25: + case TrackElemType::down60: + case TrackElemType::down25ToDown60: + case TrackElemType::down60ToDown25: + case TrackElemType::flatToUp60LongBase: + case TrackElemType::up60ToFlatLongBase: + case TrackElemType::flatToDown60LongBase: + case TrackElemType::down60ToFlatLongBase: + case TrackElemType::leftQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: + case TrackElemType::leftEighthToDiag: + case TrackElemType::rightEighthToDiag: + case TrackElemType::leftEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: + case TrackElemType::diagFlat: + case TrackElemType::diagFlatToUp25: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagFlatToDown25: + case TrackElemType::diagDown25ToFlat: + case TrackElemType::diagUp25: + case TrackElemType::diagDown25: + case TrackElemType::diagUp25ToUp60: + case TrackElemType::diagUp60ToUp25: + case TrackElemType::diagUp60: + case TrackElemType::diagDown25ToDown60: + case TrackElemType::diagDown60ToDown25: + case TrackElemType::diagDown60: + case TrackElemType::leftQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: + case TrackElemType::leftEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: + case TrackElemType::leftEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: + case TrackElemType::leftEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: + case TrackElemType::sBendLeft: + case TrackElemType::sBendRight: return true; default: break; diff --git a/src/openrct2/park/Legacy.h b/src/openrct2/park/Legacy.h index 2cd07ef7f500..feec732a2813 100644 --- a/src/openrct2/park/Legacy.h +++ b/src/openrct2/park/Legacy.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,7 +10,7 @@ #pragma once #include "../core/FlagHolder.hpp" -#include "../object/Object.h" +#include "../object/ObjectTypes.h" #include #include diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index d41e1119ebdc..b796d10c0345 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -37,10 +37,10 @@ #include "../entity/PatrolArea.h" #include "../entity/Staff.h" #include "../interface/Viewport.h" +#include "../localisation/Formatter.h" #include "../management/Award.h" #include "../management/Finance.h" #include "../management/NewsItem.h" -#include "../object/Object.h" #include "../object/ObjectLimits.h" #include "../object/ObjectManager.h" #include "../object/ObjectRepository.h" @@ -263,7 +263,7 @@ namespace OpenRCT2 cs.readWrite(image.type); cs.readWrite(image.width); cs.readWrite(image.height); - cs.readWriteArray(image.pixels, [&cs](uint8_t& pixel) { + cs.readWriteArray(image.pixels, [&cs](OpenRCT2::Drawing::PaletteIndex& pixel) { cs.readWrite(pixel); return true; }); @@ -547,7 +547,7 @@ namespace OpenRCT2 cs.readWrite(image.type); cs.readWrite(image.width); cs.readWrite(image.height); - cs.readWriteArray(image.pixels, [&cs](uint8_t& pixel) { + cs.readWriteArray(image.pixels, [&cs](OpenRCT2::Drawing::PaletteIndex& pixel) { cs.readWrite(pixel); return true; }); @@ -1236,9 +1236,9 @@ namespace OpenRCT2 } if (os.getHeader().targetVersion < kBlockBrakeImprovementsVersion) { - if (trackType == TrackElemType::Brakes) + if (trackType == TrackElemType::brakes) trackElement->SetBrakeClosed(true); - if (trackType == TrackElemType::BlockBrakes) + if (trackType == TrackElemType::blockBrakes) trackElement->SetBrakeBoosterSpeed(kRCT2DefaultBlockBrakeSpeed); } } @@ -1737,7 +1737,7 @@ namespace OpenRCT2 static void ReadWriteRideMeasurement(OrcaStream::ChunkStream& cs, RideMeasurement& measurement) { - cs.readWrite(measurement.flags); + cs.readWrite(measurement.flags.holder); cs.readWrite(measurement.last_use_tick); cs.readWrite(measurement.num_items); cs.readWrite(measurement.current_item); @@ -2280,7 +2280,7 @@ namespace OpenRCT2 { uint8_t brakeSpeed; cs.readWrite(brakeSpeed); - if (entity.GetTrackType() == TrackElemType::BlockBrakes) + if (entity.GetTrackType() == TrackElemType::blockBrakes) brakeSpeed = kRCT2DefaultBlockBrakeSpeed; entity.brake_speed = brakeSpeed; } diff --git a/src/openrct2/park/ParkFile.h b/src/openrct2/park/ParkFile.h index 9cd5c8399a90..99a64c1ee504 100644 --- a/src/openrct2/park/ParkFile.h +++ b/src/openrct2/park/ParkFile.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/park/ParkPreview.cpp b/src/openrct2/park/ParkPreview.cpp index cd7cbf6f6a67..86b403d2da57 100644 --- a/src/openrct2/park/ParkPreview.cpp +++ b/src/openrct2/park/ParkPreview.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -30,6 +30,8 @@ namespace OpenRCT2 static std::optional generatePreviewMap(); static std::optional generatePreviewScreenshot(); + using OpenRCT2::Drawing::PaletteIndex; + ParkPreview generatePreviewFromGameState(const GameState_t& gameState) { ParkPreview preview{ @@ -228,8 +230,8 @@ namespace OpenRCT2 drawingEngine->BeginDraw(); - RenderTarget rt{ - .bits = static_cast(image.pixels), + Drawing::RenderTarget rt{ + .bits = reinterpret_cast(image.pixels), .x = 0, .y = 0, .width = image.width, @@ -246,10 +248,10 @@ namespace OpenRCT2 return image; } - void drawPreviewImage(const PreviewImage& image, RenderTarget& rt, ScreenCoordsXY screenPos) + void drawPreviewImage(const PreviewImage& image, Drawing::RenderTarget& rt, ScreenCoordsXY screenPos) { G1Element g1temp = {}; - g1temp.offset = const_cast(image.pixels); + g1temp.offset = reinterpret_cast(const_cast(image.pixels)); g1temp.width = image.width; g1temp.height = image.height; diff --git a/src/openrct2/park/ParkPreview.h b/src/openrct2/park/ParkPreview.h index d53a3fecadba..e6481ea79301 100644 --- a/src/openrct2/park/ParkPreview.h +++ b/src/openrct2/park/ParkPreview.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,7 +16,11 @@ #include #include -struct RenderTarget; +namespace OpenRCT2::Drawing +{ + enum class PaletteIndex : uint8_t; + struct RenderTarget; +} // namespace OpenRCT2::Drawing namespace OpenRCT2 { @@ -34,7 +38,7 @@ namespace OpenRCT2 PreviewImageType type; uint8_t width; uint8_t height; - uint8_t pixels[kMaxPreviewImageSize * kMaxPreviewImageSize]{}; + OpenRCT2::Drawing::PaletteIndex pixels[kMaxPreviewImageSize * kMaxPreviewImageSize]{}; }; struct ParkPreview @@ -54,5 +58,5 @@ namespace OpenRCT2 struct GameState_t; ParkPreview generatePreviewFromGameState(const GameState_t& gameState); - void drawPreviewImage(const PreviewImage& image, RenderTarget& rt, ScreenCoordsXY screenPos); + void drawPreviewImage(const PreviewImage& image, Drawing::RenderTarget& rt, ScreenCoordsXY screenPos); } // namespace OpenRCT2 diff --git a/src/openrct2/peep/GuestPathfinding.cpp b/src/openrct2/peep/GuestPathfinding.cpp index 48bce8d6e48a..8bb7eced7da4 100644 --- a/src/openrct2/peep/GuestPathfinding.cpp +++ b/src/openrct2/peep/GuestPathfinding.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/peep/GuestPathfinding.h b/src/openrct2/peep/GuestPathfinding.h index 72a0fb97fbfa..6d1b0d3e469f 100644 --- a/src/openrct2/peep/GuestPathfinding.h +++ b/src/openrct2/peep/GuestPathfinding.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/peep/PeepAnimations.cpp b/src/openrct2/peep/PeepAnimations.cpp index dad585118302..df1d77e4374f 100644 --- a/src/openrct2/peep/PeepAnimations.cpp +++ b/src/openrct2/peep/PeepAnimations.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -289,7 +289,7 @@ namespace OpenRCT2 uint8_t bitmap[kHeight][kWidth] = { 0 }; - RenderTarget rt = { + Drawing::RenderTarget rt = { .bits = reinterpret_cast(bitmap), .x = -(kWidth / 2), .y = -(kHeight / 2), diff --git a/src/openrct2/peep/PeepAnimations.h b/src/openrct2/peep/PeepAnimations.h index 67c6d83ec98b..b04db02aa62e 100644 --- a/src/openrct2/peep/PeepAnimations.h +++ b/src/openrct2/peep/PeepAnimations.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/peep/PeepSpriteIds.h b/src/openrct2/peep/PeepSpriteIds.h index 3068bab27637..749227c188b8 100644 --- a/src/openrct2/peep/PeepSpriteIds.h +++ b/src/openrct2/peep/PeepSpriteIds.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/peep/PeepThoughts.cpp b/src/openrct2/peep/PeepThoughts.cpp index 3578abca7ab1..223e13b0de3e 100644 --- a/src/openrct2/peep/PeepThoughts.cpp +++ b/src/openrct2/peep/PeepThoughts.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/peep/PeepThoughts.h b/src/openrct2/peep/PeepThoughts.h index 82e4d1ded852..6fb530e3ae77 100644 --- a/src/openrct2/peep/PeepThoughts.h +++ b/src/openrct2/peep/PeepThoughts.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/peep/RideUseSystem.cpp b/src/openrct2/peep/RideUseSystem.cpp index 4334437f160e..8eadca2c161e 100644 --- a/src/openrct2/peep/RideUseSystem.cpp +++ b/src/openrct2/peep/RideUseSystem.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/peep/RideUseSystem.h b/src/openrct2/peep/RideUseSystem.h index 02b42a59c1f9..deb4f8533f9e 100644 --- a/src/openrct2/peep/RideUseSystem.h +++ b/src/openrct2/peep/RideUseSystem.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/platform/Crash.cpp b/src/openrct2/platform/Crash.cpp index 8291a76bb58f..9539b07b3040 100644 --- a/src/openrct2/platform/Crash.cpp +++ b/src/openrct2/platform/Crash.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -58,7 +58,7 @@ static const wchar_t* _wszArchitecture = WSZ(OPENRCT2_ARCHITECTURE); static std::map _uploadFiles; static std::mutex _uploadFilesMutex; - #define BACKTRACE_TOKEN "da613916de2ddb54c7bded715421516fd96e8072d42bd3d72412f7e083eb0e63" + #define BACKTRACE_TOKEN "97323bb36cc7c727b92d88a7f3554971fcd81166dfd427ecd671eeb4c369c64f" using namespace OpenRCT2; diff --git a/src/openrct2/platform/Crash.h b/src/openrct2/platform/Crash.h index fa57d97c5519..a12097e26237 100644 --- a/src/openrct2/platform/Crash.h +++ b/src/openrct2/platform/Crash.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/platform/Memory.h b/src/openrct2/platform/Memory.h index b215c000e23f..a17d09c9c34d 100644 --- a/src/openrct2/platform/Memory.h +++ b/src/openrct2/platform/Memory.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/platform/Platform.Android.cpp b/src/openrct2/platform/Platform.Android.cpp index 1ae2dbcaa4f1..0ebab9383b19 100644 --- a/src/openrct2/platform/Platform.Android.cpp +++ b/src/openrct2/platform/Platform.Android.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -148,22 +148,7 @@ namespace OpenRCT2::Platform return isImperial == JNI_TRUE ? MeasurementFormat::Imperial : MeasurementFormat::Metric; } - std::string GetSteamPath() - { - return {}; - } - - u8string GetRCT1SteamDir() - { - return {}; - } - - u8string GetRCT2SteamDir() - { - return {}; - } - - u8string GetRCTClassicSteamDir() + SteamPaths GetSteamPaths() { return {}; } diff --git a/src/openrct2/platform/Platform.Common.cpp b/src/openrct2/platform/Platform.Common.cpp index a64aed29429c..aa1f9687b2d8 100644 --- a/src/openrct2/platform/Platform.Common.cpp +++ b/src/openrct2/platform/Platform.Common.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -27,6 +27,7 @@ #include "../Context.h" #include "../Game.h" +#include "../core/CallingConventions.h" #include "../core/File.h" #include "../core/Path.hpp" #include "../core/String.hpp" @@ -212,4 +213,43 @@ namespace OpenRCT2::Platform return false; } + bool SteamPaths::isSteamPresent() const + { + return !roots.empty(); + } + + u8string SteamPaths::getDownloadDepotFolder(u8string_view steamroot, const SteamGameData& data) const + { + return Path::Combine( + steamroot, downloadDepotFolder, "app_" + std::to_string(data.appId), "depot_" + std::to_string(data.depotId)); + } + + bool triggerSteamDownload() + { + const auto steamPaths = GetSteamPaths(); + if (!steamPaths.isSteamPresent() || steamPaths.manifests.empty()) + return false; + + const auto manifestsDir = Path::Combine(steamPaths.roots[0], steamPaths.manifests); + const std::array gamesToTrigger = { kSteamRCT2Data, kSteamRCTCData, kSteamRCT1Data }; + for (const auto& game : gamesToTrigger) + { + auto fullFilename = Path::Combine(manifestsDir, "appmanifest_" + std::to_string(game.appId) + ".acf"); + // If the file exists, we assume a download has been triggered already. + if (File::Exists(fullFilename)) + continue; + + // clang-format off + auto buffer = u8string("\"AppState\"\r\n") + u8string("{\r\n") + + u8string(" \"AppID\" \"" + std::to_string(game.appId) + "\"\r\n") + + u8string(" \"Universe\" \"1\"\r\n") + + u8string(" \"installdir\" \"" + game.nativeFolder + "\"\r\n") + + u8string(" \"StateFlags\" \"1026\"\r\n") + u8string("}\r\n"); + // clang-format on + File::WriteAllBytes(fullFilename, buffer.data(), buffer.size()); + } + + return true; + } + } // namespace OpenRCT2::Platform diff --git a/src/openrct2/platform/Platform.Emscripten.cpp b/src/openrct2/platform/Platform.Emscripten.cpp index 5eb5453bddb1..4bf486b268db 100644 --- a/src/openrct2/platform/Platform.Emscripten.cpp +++ b/src/openrct2/platform/Platform.Emscripten.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -97,22 +97,7 @@ namespace OpenRCT2::Platform return isImperial == 1 ? MeasurementFormat::Imperial : MeasurementFormat::Metric; } - std::string GetSteamPath() - { - return {}; - } - - u8string GetRCT1SteamDir() - { - return {}; - } - - u8string GetRCT2SteamDir() - { - return {}; - } - - u8string GetRCTClassicSteamDir() + SteamPaths GetSteamPaths() { return {}; } diff --git a/src/openrct2/platform/Platform.Linux.cpp b/src/openrct2/platform/Platform.Linux.cpp index 28ab83344ff5..1c53ba864e8f 100644 --- a/src/openrct2/platform/Platform.Linux.cpp +++ b/src/openrct2/platform/Platform.Linux.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -7,7 +7,7 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ -#if defined(__unix__) && !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) +#if (defined(__unix__) || defined(__HAIKU__)) && !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) #include "../Diagnostic.h" @@ -38,6 +38,10 @@ #include "../localisation/Language.h" #include "Platform.h" + #ifdef __HAIKU__ + #include + #endif + namespace OpenRCT2::Platform { // EnvLangGuard allows us to temporarily set the user's locale @@ -154,6 +158,12 @@ namespace OpenRCT2::Platform "/usr/local/share/openrct2", "/var/lib/openrct2", "/usr/share/openrct2", + #ifdef __HAIKU__ + "/boot/system/data/openrct2", + "/boot/home/config/data/openrct2", + "/boot/system/non-packaged/data/openrct2", + "/boot/home/config/non-packaged/data/openrct2", + #endif }; // clang-format on for (const auto& prefix : prefixes) @@ -180,6 +190,18 @@ namespace OpenRCT2::Platform { LOG_FATAL("failed to read /proc/self/exe"); } + #elif defined(__HAIKU__) + image_info info; + int32 cookie = 0; + + while (get_next_image_info(B_CURRENT_TEAM, &cookie, &info) >= B_OK) + { + if (info.type == B_APP_IMAGE) + { + strlcpy(exePath, info.name, sizeof(exePath)); + break; + } + } #elif defined(__FreeBSD__) || defined(__NetBSD__) #if defined(__FreeBSD__) const int32_t mib[] = { @@ -320,65 +342,52 @@ namespace OpenRCT2::Platform return MeasurementFormat::Metric; } - std::string GetSteamPath() + SteamPaths GetSteamPaths() { + SteamPaths ret = {}; + ret.nativeFolder = "steamapps/common"; + ret.downloadDepotFolder = "ubuntu12_32/steamapps/content"; + ret.manifests = "steamapps"; + const char* steamRoot = getenv("STEAMROOT"); if (steamRoot != nullptr) { - return Path::Combine(steamRoot, u8"ubuntu12_32/steamapps/content"); + ret.roots.emplace_back(steamRoot); } const char* localSharePath = getenv("XDG_DATA_HOME"); if (localSharePath != nullptr) { - auto steamPath = Path::Combine(localSharePath, u8"Steam/ubuntu12_32/steamapps/content"); - if (Path::DirectoryExists(steamPath)) + auto xdgDataHomeSteamPath = Path::Combine(localSharePath, u8"Steam"); + if (Path::DirectoryExists(xdgDataHomeSteamPath)) { - return steamPath; + ret.roots.emplace_back(xdgDataHomeSteamPath); } } const char* homeDir = getpwuid(getuid())->pw_dir; - if (homeDir == nullptr) - { - return {}; - } - - // Prefer new path for Steam, which is the default when using with Proton - auto steamPath = Path::Combine(homeDir, u8".local/share/Steam/steamapps/common"); - if (Path::DirectoryExists(steamPath)) + if (homeDir != nullptr) { - return steamPath; - } + auto localShareSteamPath = Path::Combine(homeDir, u8".local/share/Steam"); + if (Path::DirectoryExists(localShareSteamPath)) + { + ret.roots.emplace_back(localShareSteamPath); + } - // Fallback paths - steamPath = Path::Combine(homeDir, u8".local/share/Steam/ubuntu12_32/steamapps/content"); - if (Path::DirectoryExists(steamPath)) - { - return steamPath; - } + auto oldSteamPath = Path::Combine(homeDir, u8".steam/steam"); + if (Path::DirectoryExists(oldSteamPath)) + { + ret.roots.emplace_back(oldSteamPath); + } - steamPath = Path::Combine(homeDir, u8".steam/steam/ubuntu12_32/steamapps/content"); - if (Path::DirectoryExists(steamPath)) - { - return steamPath; + auto snapLocalShareSteamPath = Path::Combine(homeDir, u8"snap/steam/common/.local/share/Steam"); + if (Path::DirectoryExists(snapLocalShareSteamPath)) + { + ret.roots.emplace_back(snapLocalShareSteamPath); + } } - return {}; - } - u8string GetRCT1SteamDir() - { - return u8"Rollercoaster Tycoon Deluxe"; - } - - u8string GetRCT2SteamDir() - { - return u8"Rollercoaster Tycoon 2"; - } - - u8string GetRCTClassicSteamDir() - { - return u8"RollerCoaster Tycoon Classic"; + return ret; } std::vector GetSearchablePathsRCT1() diff --git a/src/openrct2/platform/Platform.Posix.cpp b/src/openrct2/platform/Platform.Posix.cpp index 5329756f1905..98777973cdbd 100644 --- a/src/openrct2/platform/Platform.Posix.cpp +++ b/src/openrct2/platform/Platform.Posix.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -7,7 +7,8 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ -#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) || defined(__NetBSD__) +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) || defined(__NetBSD__) \ + || defined(__HAIKU__) #include "Platform.h" diff --git a/src/openrct2/platform/Platform.Win32.cpp b/src/openrct2/platform/Platform.Win32.cpp index 47e835a15fa5..75b9db30f512 100644 --- a/src/openrct2/platform/Platform.Win32.cpp +++ b/src/openrct2/platform/Platform.Win32.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,27 +13,27 @@ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif - #include "../Diagnostic.h" - - #include +// clang-format off #include - - // Then the rest - #include "../Version.h" - #include #include #include #include + // clang-format on #undef GetEnvironmentVariable + #undef small + + #include "Platform.h" #include "../Date.h" + #include "../Diagnostic.h" #include "../OpenRCT2.h" + #include "../Version.h" #include "../core/Path.hpp" #include "../core/String.hpp" #include "../localisation/Language.h" - #include "Platform.h" + #include #include #include #include @@ -737,7 +737,7 @@ namespace OpenRCT2::Platform return isElevated; } - std::string GetSteamPath() + SteamPaths GetSteamPaths() { wchar_t* wSteamPath; HKEY hKey; @@ -759,12 +759,18 @@ namespace OpenRCT2::Platform result = RegQueryValueExW(hKey, L"SteamPath", nullptr, &type, reinterpret_cast(wSteamPath), &size); if (result == ERROR_SUCCESS) { - auto utf8SteamPath = String::toUtf8(wSteamPath); - outPath = Path::Combine(utf8SteamPath, u8"steamapps", u8"common"); + outPath = String::toUtf8(wSteamPath); } free(wSteamPath); RegCloseKey(hKey); - return outPath; + + SteamPaths ret = {}; + ret.roots.emplace_back(outPath); + ret.nativeFolder = "steamapps/common"; + ret.downloadDepotFolder = "steamapps/content"; + ret.manifests = "steamapps"; + + return ret; } std::string GetFontPath(const TTFFontDescriptor& font) @@ -796,21 +802,6 @@ namespace OpenRCT2::Platform return GetLogicalDrives(); } - u8string GetRCT1SteamDir() - { - return u8"Rollercoaster Tycoon Deluxe"; - } - - u8string GetRCT2SteamDir() - { - return u8"Rollercoaster Tycoon 2"; - } - - u8string GetRCTClassicSteamDir() - { - return u8"RollerCoaster Tycoon Classic"; - } - time_t FileGetModifiedTime(u8string_view path) { WIN32_FILE_ATTRIBUTE_DATA data{}; diff --git a/src/openrct2/platform/Platform.h b/src/openrct2/platform/Platform.h index 00603ad07652..63ff5f0473f0 100644 --- a/src/openrct2/platform/Platform.h +++ b/src/openrct2/platform/Platform.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,6 +16,7 @@ #include #include #include +#include #include #ifdef _WIN32 @@ -60,6 +61,49 @@ struct TTFFontDescriptor; namespace OpenRCT2::Platform { + struct SteamGameData + { + u8string nativeFolder; + uint32_t appId; + uint32_t depotId; + }; + const SteamGameData kSteamRCT1Data = { + .nativeFolder = u8"Rollercoaster Tycoon Deluxe", + .appId = 285310, + .depotId = 285311, + }; + const SteamGameData kSteamRCT2Data = { + .nativeFolder = u8"Rollercoaster Tycoon 2", + .appId = 285330, + .depotId = 285331, + }; + const SteamGameData kSteamRCTCData = { + .nativeFolder = u8"RollerCoaster Tycoon Classic", + .appId = 683900, + .depotId = 683901, + }; + + struct SteamPaths + { + sfl::static_vector roots{}; + /** + * Used by native applications and applications installed through Steam Play. + */ + u8string nativeFolder{}; + /** + * Used by applications downloaded through download_depot. Most likely used on macOS and Linux, + * though technically possible on Windows too. + */ + u8string downloadDepotFolder{}; + /** + * Directory that contains the manifests to trigger a download. + */ + u8string manifests{}; + + bool isSteamPresent() const; + u8string getDownloadDepotFolder(u8string_view steamroot, const SteamGameData& data) const; + }; + constexpr u8string_view kRCTClassicWindowsDataFolder = u8"Assets"; // clang-format off constexpr u8string_view kRCTClassicMacOSDataFolder = @@ -101,8 +145,10 @@ namespace OpenRCT2::Platform std::string GetUsername(); - std::string GetSteamPath(); -#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) || defined(__NetBSD__) + SteamPaths GetSteamPaths(); + bool triggerSteamDownload(); +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) || defined(__NetBSD__) \ + || defined(__HAIKU__) std::string GetEnvironmentPath(const char* name); std::string GetHomePath(); #endif @@ -138,9 +184,6 @@ namespace OpenRCT2::Platform bool LockSingleInstance(); - u8string GetRCT1SteamDir(); - u8string GetRCT2SteamDir(); - u8string GetRCTClassicSteamDir(); datetime64 GetDatetimeNowUTC(); uint32_t GetTicks(); diff --git a/src/openrct2/platform/Platform.macOS.mm b/src/openrct2/platform/Platform.macOS.mm index e4d280cf1f06..ad465d05a243 100644 --- a/src/openrct2/platform/Platform.macOS.mm +++ b/src/openrct2/platform/Platform.macOS.mm @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -235,7 +235,7 @@ MeasurementFormat GetLocaleMeasurementFormat() } } - std::string GetSteamPath() + SteamPaths GetSteamPaths() { const char* homeDir = getpwuid(getuid())->pw_dir; if (homeDir == nullptr) @@ -244,27 +244,18 @@ MeasurementFormat GetLocaleMeasurementFormat() } auto steamPath = Path::Combine(homeDir, "Library/Application Support/Steam"); - if (Path::DirectoryExists(steamPath)) + if (!Path::DirectoryExists(steamPath)) { - return steamPath; + return {}; } - return {}; - } - - u8string GetRCT1SteamDir() - { - return u8"Steam.AppBundle/Steam/Contents/MacOS/steamapps/content/app_285310/depot_285311"; - } - - u8string GetRCT2SteamDir() - { - return u8"Steam.AppBundle/Steam/Contents/MacOS/steamapps/content/app_285330/depot_285331"; - } + SteamPaths ret = {}; + ret.roots.emplace_back(steamPath); + ret.nativeFolder = "steamapps/common"; + ret.downloadDepotFolder = "Steam.AppBundle/Steam/Contents/MacOS/steamapps/content"; + ret.manifests = "steamapps"; - u8string GetRCTClassicSteamDir() - { - return u8"steamapps/common/RollerCoaster Tycoon Classic"; + return ret; } std::string GetFontPath(const TTFFontDescriptor& font) diff --git a/src/openrct2/profiling/Profiling.cpp b/src/openrct2/profiling/Profiling.cpp index cafb70144632..6f8591a7a7d4 100644 --- a/src/openrct2/profiling/Profiling.cpp +++ b/src/openrct2/profiling/Profiling.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/profiling/Profiling.h b/src/openrct2/profiling/Profiling.h index 4d09fac4d773..ddc3718c15a7 100644 --- a/src/openrct2/profiling/Profiling.h +++ b/src/openrct2/profiling/Profiling.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/profiling/ProfilingMacros.hpp b/src/openrct2/profiling/ProfilingMacros.hpp index 5aab6e84687e..3474bb00e65b 100644 --- a/src/openrct2/profiling/ProfilingMacros.hpp +++ b/src/openrct2/profiling/ProfilingMacros.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct1/Csg.cpp b/src/openrct2/rct1/Csg.cpp index b82d735a47b1..12d14bcee517 100644 --- a/src/openrct2/rct1/Csg.cpp +++ b/src/openrct2/rct1/Csg.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,79 +14,80 @@ #include "../drawing/Drawing.h" #include "../rct1/Limits.h" -using namespace OpenRCT2; - -std::string FindCsg1datAtLocation(u8string_view path) +namespace OpenRCT2 { - auto checkPath1 = Path::Combine(path, u8"Data", u8"CSG1.DAT"); - auto checkPath2 = Path::Combine(path, u8"Data", u8"CSG1.1"); - - // Since Linux is case sensitive (and macOS sometimes too), make sure we handle case properly. - std::string path1result = Path::ResolveCasing(checkPath1); - if (!path1result.empty()) + std::string FindCsg1datAtLocation(u8string_view path) { - return path1result; - } + auto checkPath1 = Path::Combine(path, u8"Data", u8"CSG1.DAT"); + auto checkPath2 = Path::Combine(path, u8"Data", u8"CSG1.1"); - std::string path2result = Path::ResolveCasing(checkPath2); - return path2result; -} + // Since Linux is case sensitive (and macOS sometimes too), make sure we handle case properly. + std::string path1result = Path::ResolveCasing(checkPath1); + if (!path1result.empty()) + { + return path1result; + } -bool Csg1datPresentAtLocation(u8string_view path) -{ - auto location = FindCsg1datAtLocation(path); - return !location.empty(); -} + std::string path2result = Path::ResolveCasing(checkPath2); + return path2result; + } -u8string FindCsg1idatAtLocation(u8string_view path) -{ - auto result1 = Path::ResolveCasing(Path::Combine(path, u8"Data", u8"CSG1I.DAT")); - if (!result1.empty()) + bool Csg1datPresentAtLocation(u8string_view path) { - return result1; + auto location = FindCsg1datAtLocation(path); + return !location.empty(); } - auto result2 = Path::ResolveCasing(Path::Combine(path, u8"RCTdeluxe_install", u8"Data", u8"CSG1I.DAT")); - return result2; -} - -bool Csg1idatPresentAtLocation(u8string_view path) -{ - std::string location = FindCsg1idatAtLocation(path); - return !location.empty(); -} -bool RCT1DataPresentAtLocation(u8string_view path) -{ - return Csg1datPresentAtLocation(path) && Csg1idatPresentAtLocation(path) && CsgAtLocationIsUsable(path); -} + u8string FindCsg1idatAtLocation(u8string_view path) + { + auto result1 = Path::ResolveCasing(Path::Combine(path, u8"Data", u8"CSG1I.DAT")); + if (!result1.empty()) + { + return result1; + } + auto result2 = Path::ResolveCasing(Path::Combine(path, u8"RCTdeluxe_install", u8"Data", u8"CSG1I.DAT")); + return result2; + } -bool CsgIsUsable(const Gx& csg) -{ - return csg.header.total_size == RCT1::Limits::kLLCsg1DatFileSize - && csg.header.num_entries == RCT1::Limits::kNumLLCsgEntries; -} + bool Csg1idatPresentAtLocation(u8string_view path) + { + std::string location = FindCsg1idatAtLocation(path); + return !location.empty(); + } -bool CsgAtLocationIsUsable(u8string_view path) -{ - auto csg1HeaderPath = FindCsg1idatAtLocation(path); - if (csg1HeaderPath.empty()) + bool RCT1DataPresentAtLocation(u8string_view path) { - return false; + return Csg1datPresentAtLocation(path) && Csg1idatPresentAtLocation(path) && CsgAtLocationIsUsable(path); } - auto csg1DataPath = FindCsg1datAtLocation(path); - if (csg1DataPath.empty()) + bool CsgIsUsable(const Gx& csg) { - return false; + return csg.header.totalSize == RCT1::Limits::kLLCsg1DatFileSize + && csg.header.numEntries == RCT1::Limits::kNumLLCsgEntries; } - auto fileHeader = FileStream(csg1HeaderPath, FileMode::open); - auto fileData = FileStream(csg1DataPath, FileMode::open); - size_t fileHeaderSize = fileHeader.GetLength(); - size_t fileDataSize = fileData.GetLength(); + bool CsgAtLocationIsUsable(u8string_view path) + { + auto csg1HeaderPath = FindCsg1idatAtLocation(path); + if (csg1HeaderPath.empty()) + { + return false; + } + + auto csg1DataPath = FindCsg1datAtLocation(path); + if (csg1DataPath.empty()) + { + return false; + } - Gx csg = {}; - csg.header.num_entries = static_cast(fileHeaderSize / sizeof(RCTG1Element)); - csg.header.total_size = static_cast(fileDataSize); - return CsgIsUsable(csg); -} + auto fileHeader = FileStream(csg1HeaderPath, FileMode::open); + auto fileData = FileStream(csg1DataPath, FileMode::open); + size_t fileHeaderSize = fileHeader.GetLength(); + size_t fileDataSize = fileData.GetLength(); + + Gx csg = {}; + csg.header.numEntries = static_cast(fileHeaderSize / sizeof(StoredG1Element)); + csg.header.totalSize = static_cast(fileDataSize); + return CsgIsUsable(csg); + } +} // namespace OpenRCT2 diff --git a/src/openrct2/rct1/Csg.h b/src/openrct2/rct1/Csg.h index 3d47b5bafc62..d96ac8444eb4 100644 --- a/src/openrct2/rct1/Csg.h +++ b/src/openrct2/rct1/Csg.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,12 +11,15 @@ #include "../core/StringTypes.h" -struct Gx; +namespace OpenRCT2 +{ + struct Gx; -bool RCT1DataPresentAtLocation(u8string_view path); -std::string FindCsg1datAtLocation(u8string_view path); -bool Csg1datPresentAtLocation(u8string_view path); -std::string FindCsg1idatAtLocation(u8string_view path); -bool Csg1idatPresentAtLocation(u8string_view path); -bool CsgIsUsable(const Gx& csg); -bool CsgAtLocationIsUsable(u8string_view path); + bool RCT1DataPresentAtLocation(u8string_view path); + std::string FindCsg1datAtLocation(u8string_view path); + bool Csg1datPresentAtLocation(u8string_view path); + std::string FindCsg1idatAtLocation(u8string_view path); + bool Csg1idatPresentAtLocation(u8string_view path); + bool CsgIsUsable(const Gx& csg); + bool CsgAtLocationIsUsable(u8string_view path); +} // namespace OpenRCT2 diff --git a/src/openrct2/rct1/Limits.h b/src/openrct2/rct1/Limits.h index 244e927d9fb0..5afb75c6180a 100644 --- a/src/openrct2/rct1/Limits.h +++ b/src/openrct2/rct1/Limits.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct1/RCT1.h b/src/openrct2/rct1/RCT1.h index 68b705a316e4..62329f5ea3c4 100644 --- a/src/openrct2/rct1/RCT1.h +++ b/src/openrct2/rct1/RCT1.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,7 +9,6 @@ #pragma once -#include "../Diagnostic.h" #include "../core/FixedPoint.hpp" #include "../rct12/RCT12.h" #include "../ride/Angles.h" @@ -17,6 +16,7 @@ #include "../world/ParkData.h" #include "Limits.h" +enum class MechanicStatus : uint8_t; enum class VehicleColourSettings : uint8_t; namespace OpenRCT2::Scenario @@ -363,7 +363,7 @@ namespace OpenRCT2::RCT1 uint8_t unk134[2]; // 0x134 uint32_t musicPosition; // 0x138 uint8_t breakdownReasonPending; // 0x13C - uint8_t mechanicStatus; // 0x13D + MechanicStatus mechanicStatus; // 0x13D uint16_t mechanic; // 0x13E uint8_t inspectionStation; // 0x140 uint8_t brokenTrain; // 0x141 diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index c0cdf0e9b36f..b8efe49ab975 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -35,10 +35,8 @@ #include "../entity/Staff.h" #include "../localisation/Formatting.h" #include "../management/Award.h" -#include "../management/Finance.h" #include "../management/Marketing.h" #include "../management/NewsItem.h" -#include "../object/Object.h" #include "../object/ObjectLimits.h" #include "../object/ObjectList.h" #include "../object/ObjectManager.h" @@ -50,11 +48,10 @@ #include "../rct12/CSStringConverter.h" #include "../rct12/EntryList.h" #include "../rct12/ScenarioPatcher.h" +#include "../ride/Ride.h" #include "../ride/RideData.h" #include "../ride/RideManager.hpp" -#include "../ride/Station.h" #include "../ride/Track.h" -#include "../ride/TrainManager.h" #include "../ride/Vehicle.h" #include "../sawyer_coding/SawyerCoding.h" #include "../scenario/Scenario.h" @@ -62,8 +59,6 @@ #include "../scenario/ScenarioRepository.h" #include "../scenario/ScenarioSources.h" #include "../world/Climate.h" -#include "../world/Entrance.h" -#include "../world/Footpath.h" #include "../world/Map.h" #include "../world/MapAnimation.h" #include "../world/Park.h" @@ -591,7 +586,7 @@ namespace OpenRCT2::RCT1 RCT12::EntryList* entries = GetEntryList(objectType); // Check if there are spare entries available - size_t maxEntries = static_cast(getObjectEntryGroupCount(objectType)); + size_t maxEntries = getObjectEntryGroupCount(objectType); if (entries != nullptr && entries->GetCount() < maxEntries) { entries->GetOrAddEntry(objectName); @@ -1007,7 +1002,8 @@ namespace OpenRCT2::RCT1 // Maintenance dst->buildDate = static_cast(src->buildDate); - dst->inspectionInterval = src->inspectionInterval; + auto clampedInspectionInterval = std::clamp(src->inspectionInterval, 0, EnumValue(RideInspection::never)); + dst->inspectionInterval = static_cast(clampedInspectionInterval); dst->lastInspection = src->lastInspection; dst->reliability = src->reliability; dst->unreliabilityFactor = src->unreliabilityFactor; @@ -1226,7 +1222,7 @@ namespace OpenRCT2::RCT1 void ImportRideMeasurement(RideMeasurement& dst, const RCT12RideMeasurement& src) { - dst.flags = src.Flags; + dst.flags.holder = src.Flags; dst.last_use_tick = src.LastUseTick; dst.num_items = src.NumItems; dst.current_item = src.CurrentItem; @@ -1561,7 +1557,8 @@ namespace OpenRCT2::RCT1 AppendRequiredObjects(result, ObjectType::footpathSurface, _footpathSurfaceEntries); AppendRequiredObjects(result, ObjectType::footpathRailings, _footpathRailingsEntries); AppendRequiredObjects(result, ObjectType::peepNames, std::vector({ "rct2.peep_names.original" })); - RCT12AddDefaultObjects(result); + AppendRequiredObjects(result, ObjectType::station, kDefaultStationStyles); + RCT12AddDefaultMusic(result); // Normalise the name to make the scenario as recognisable as possible auto normalisedName = ScenarioSources::NormaliseName(_s4.ScenarioName); @@ -1752,18 +1749,18 @@ namespace OpenRCT2::RCT1 } else { - dst2->SetSeatRotation(DEFAULT_SEAT_ROTATION); + dst2->SetSeatRotation(kDefaultSeatRotation); } // Skipping IsHighlighted() auto trackType = dst2->GetTrackType(); // Brakes import as closed to preserve legacy behaviour - dst2->SetBrakeClosed(trackType == TrackElemType::Brakes); + dst2->SetBrakeClosed(trackType == TrackElemType::brakes); if (TrackTypeHasSpeedSetting(trackType)) { dst2->SetBrakeBoosterSpeed(src2->GetBrakeBoosterSpeed()); } - else if (trackType == TrackElemType::OnRidePhoto) + else if (trackType == TrackElemType::onRidePhoto) { dst2->SetPhotoTimeout(src2->GetPhotoTimeout()); } @@ -2676,10 +2673,10 @@ namespace OpenRCT2::RCT1 auto trackType = tileElement->AsTrack()->GetTrackType(); switch (trackType) { - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::up25ToFlat: + case TrackElemType::up60ToFlat: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagUp60ToFlat: break; default: continue; @@ -2857,8 +2854,8 @@ namespace OpenRCT2::RCT1 dst->roll = src->roll; // Seat rotation was not in RCT1 - dst->target_seat_rotation = DEFAULT_SEAT_ROTATION; - dst->seat_rotation = DEFAULT_SEAT_ROTATION; + dst->target_seat_rotation = kDefaultSeatRotation; + dst->seat_rotation = kDefaultSeatRotation; // Vehicle links (indexes converted later) dst->prev_vehicle_on_ride = EntityId::FromUnderlying(src->PrevVehicleOnRide); @@ -2876,8 +2873,8 @@ namespace OpenRCT2::RCT1 } } - ::Vehicle::Status statusSrc = ::Vehicle::Status::MovingToEndOfStation; - if (src->Status <= static_cast(::Vehicle::Status::StoppedByBlockBrakes)) + ::Vehicle::Status statusSrc = ::Vehicle::Status::movingToEndOfStation; + if (src->Status <= static_cast(::Vehicle::Status::stoppedByBlockBrakes)) { statusSrc = static_cast<::Vehicle::Status>(src->Status); } @@ -2885,7 +2882,7 @@ namespace OpenRCT2::RCT1 dst->TrackSubposition = VehicleTrackSubposition{ src->TrackSubposition }; dst->TrackLocation = { src->TrackX, src->TrackY, src->TrackZ }; dst->current_station = StationIndex::FromUnderlying(src->CurrentStation); - if (src->BoatLocation.IsNull() || ride->mode != RideMode::boatHire || statusSrc != ::Vehicle::Status::TravellingBoat) + if (src->BoatLocation.IsNull() || ride->mode != RideMode::boatHire || statusSrc != ::Vehicle::Status::travellingBoat) { dst->BoatLocation.SetNull(); dst->SetTrackDirection(src->GetTrackDirection()); @@ -2895,7 +2892,7 @@ namespace OpenRCT2::RCT1 { dst->BoatLocation = TileCoordsXY{ src->BoatLocation.x, src->BoatLocation.y }.ToCoordsXY(); dst->SetTrackDirection(0); - dst->SetTrackType(OpenRCT2::TrackElemType::Flat); + dst->SetTrackType(OpenRCT2::TrackElemType::flat); } dst->track_progress = src->TrackProgress; dst->vertical_drop_countdown = src->VerticalDropCountdown; diff --git a/src/openrct2/rct1/T4Importer.cpp b/src/openrct2/rct1/T4Importer.cpp index 12f6f0e90ebe..4c1a88e558ef 100644 --- a/src/openrct2/rct1/T4Importer.cpp +++ b/src/openrct2/rct1/T4Importer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct1/Tables.cpp b/src/openrct2/rct1/Tables.cpp index 1b702dcf72ce..b60b8a61329d 100644 --- a/src/openrct2/rct1/Tables.cpp +++ b/src/openrct2/rct1/Tables.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index 1b7b424104de..5123aec28d36 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct12/CSChar.h b/src/openrct2/rct12/CSChar.h index 1a9d69a4d95e..4cad7526a157 100644 --- a/src/openrct2/rct12/CSChar.h +++ b/src/openrct2/rct12/CSChar.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct12/CSStringConverter.cpp b/src/openrct2/rct12/CSStringConverter.cpp index 39b0644d1d28..8f967e4d8d34 100644 --- a/src/openrct2/rct12/CSStringConverter.cpp +++ b/src/openrct2/rct12/CSStringConverter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct12/CSStringConverter.h b/src/openrct2/rct12/CSStringConverter.h index f22ad32719f4..a9b007980a8d 100644 --- a/src/openrct2/rct12/CSStringConverter.h +++ b/src/openrct2/rct12/CSStringConverter.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct12/EntryList.h b/src/openrct2/rct12/EntryList.h index d69b4aef7e90..e38357217aa4 100644 --- a/src/openrct2/rct12/EntryList.h +++ b/src/openrct2/rct12/EntryList.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct12/Limits.h b/src/openrct2/rct12/Limits.h index 2d5e8d6c00a9..bbb1eebcccf4 100644 --- a/src/openrct2/rct12/Limits.h +++ b/src/openrct2/rct12/Limits.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct12/RCT12.cpp b/src/openrct2/rct12/RCT12.cpp index c69be1e1bda3..03f18e28ba23 100644 --- a/src/openrct2/rct12/RCT12.cpp +++ b/src/openrct2/rct12/RCT12.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,7 +18,6 @@ #include "../rct2/RCT2.h" #include "../ride/Ride.h" #include "../scenario/Scenario.h" -#include "../world/Banner.h" #include "../world/Footpath.h" #include "../world/Wall.h" #include "../world/tile_element/PathElement.h" @@ -666,25 +665,25 @@ OpenRCT2::TrackElemType RCT12FlatTrackTypeToOpenRCT2(OpenRCT2::RCT12::TrackElemT switch (origTrackType) { case OpenRCT2::RCT12::TrackElemType::flatTrack1x4A_Alias: - return TrackElemType::FlatTrack1x4A; + return TrackElemType::flatTrack1x4A; case OpenRCT2::RCT12::TrackElemType::flatTrack2x2_Alias: - return TrackElemType::FlatTrack2x2; + return TrackElemType::flatTrack2x2; case OpenRCT2::RCT12::TrackElemType::flatTrack4x4_Alias: - return TrackElemType::FlatTrack4x4; + return TrackElemType::flatTrack4x4; case OpenRCT2::RCT12::TrackElemType::flatTrack2x4_Alias: - return TrackElemType::FlatTrack2x4; + return TrackElemType::flatTrack2x4; case OpenRCT2::RCT12::TrackElemType::flatTrack1x5_Alias: - return TrackElemType::FlatTrack1x5; + return TrackElemType::flatTrack1x5; case OpenRCT2::RCT12::TrackElemType::flatTrack1x1A_Alias: - return TrackElemType::FlatTrack1x1A; + return TrackElemType::flatTrack1x1A; case OpenRCT2::RCT12::TrackElemType::flatTrack1x4B_Alias: - return TrackElemType::FlatTrack1x4B; + return TrackElemType::flatTrack1x4B; case OpenRCT2::RCT12::TrackElemType::flatTrack1x1B_Alias: - return TrackElemType::FlatTrack1x1B; + return TrackElemType::flatTrack1x1B; case OpenRCT2::RCT12::TrackElemType::flatTrack1x4C_Alias: - return TrackElemType::FlatTrack1x4C; + return TrackElemType::flatTrack1x4C; case OpenRCT2::RCT12::TrackElemType::flatTrack3x3_Alias: - return TrackElemType::FlatTrack3x3; + return TrackElemType::flatTrack3x3; default: return static_cast(origTrackType); } @@ -694,36 +693,45 @@ OpenRCT2::RCT12::TrackElemType OpenRCT2FlatTrackTypeToRCT12(OpenRCT2::TrackElemT { switch (origTrackType) { - case TrackElemType::FlatTrack1x4A: + case TrackElemType::flatTrack1x4A: return OpenRCT2::RCT12::TrackElemType::flatTrack1x4A_Alias; - case TrackElemType::FlatTrack2x2: + case TrackElemType::flatTrack2x2: return OpenRCT2::RCT12::TrackElemType::flatTrack2x2_Alias; - case TrackElemType::FlatTrack4x4: + case TrackElemType::flatTrack4x4: return OpenRCT2::RCT12::TrackElemType::flatTrack4x4_Alias; - case TrackElemType::FlatTrack2x4: + case TrackElemType::flatTrack2x4: return OpenRCT2::RCT12::TrackElemType::flatTrack2x4_Alias; - case TrackElemType::FlatTrack1x5: + case TrackElemType::flatTrack1x5: return OpenRCT2::RCT12::TrackElemType::flatTrack1x5_Alias; - case TrackElemType::FlatTrack1x1A: + case TrackElemType::flatTrack1x1A: return OpenRCT2::RCT12::TrackElemType::flatTrack1x1A_Alias; - case TrackElemType::FlatTrack1x4B: + case TrackElemType::flatTrack1x4B: return OpenRCT2::RCT12::TrackElemType::flatTrack1x4B_Alias; - case TrackElemType::FlatTrack1x1B: + case TrackElemType::flatTrack1x1B: return OpenRCT2::RCT12::TrackElemType::flatTrack1x1B_Alias; - case TrackElemType::FlatTrack1x4C: + case TrackElemType::flatTrack1x4C: return OpenRCT2::RCT12::TrackElemType::flatTrack1x4C_Alias; - case TrackElemType::FlatTrack3x3: + case TrackElemType::flatTrack3x3: return OpenRCT2::RCT12::TrackElemType::flatTrack3x3_Alias; default: return static_cast(origTrackType); } } -static constexpr std::string_view _stationStyles[] = { - "rct2.station.plain", "rct2.station.wooden", "rct2.station.canvas_tent", "rct2.station.castle_grey", - "rct2.station.castle_brown", "rct2.station.jungle", "rct2.station.log", "rct2.station.classical", - "rct2.station.abstract", "rct2.station.snow", "rct2.station.pagoda", "rct2.station.space", - "openrct2.station.noentrance", +static constexpr std::string_view _stationStyleMap[] = { + "rct2.station.plain", // RCT12_STATION_STYLE_PLAIN + "rct2.station.wooden", // RCT12_STATION_STYLE_WOODEN + "rct2.station.canvas_tent", // RCT12_STATION_STYLE_CANVAS_TENT + "rct2.station.castle_grey", // RCT12_STATION_STYLE_CASTLE_GREY + "rct2.station.castle_brown", // RCT12_STATION_STYLE_CASTLE_BROWN + "rct2.station.jungle", // RCT12_STATION_STYLE_JUNGLE + "rct2.station.log", // RCT12_STATION_STYLE_LOG_CABIN + "rct2.station.classical", // RCT12_STATION_STYLE_CLASSICAL + "rct2.station.abstract", // RCT12_STATION_STYLE_ABSTRACT + "rct2.station.snow", // RCT12_STATION_STYLE_SNOW + "rct2.station.pagoda", // RCT12_STATION_STYLE_PAGODA + "rct2.station.space", // RCT12_STATION_STYLE_SPACE + "openrct2.station.noentrance", // RCT12_STATION_STYLE_INVISIBLE }; static constexpr std::string_view _musicStyles[] = { @@ -764,22 +772,22 @@ static constexpr std::string_view _musicStyles[] = { std::string_view GetStationIdentifierFromStyle(uint8_t style) { - if (style < std::size(_stationStyles)) + if (style < std::size(_stationStyleMap)) { - return _stationStyles[style]; + return _stationStyleMap[style]; } - return _stationStyles[RCT12_STATION_STYLE_INVISIBLE]; + return _stationStyleMap[RCT12_STATION_STYLE_INVISIBLE]; } uint8_t GetStationStyleFromIdentifier(u8string_view identifier) { // Not supported in TD6, closest match. - if (identifier == "openrct2.station.noplatformnoentrance") + if (identifier == kNoEntranceNoPlatformIdentifier) return RCT12_STATION_STYLE_INVISIBLE; - for (uint8_t i = RCT12_STATION_STYLE_PLAIN; i < std::size(_stationStyles); i++) + for (uint8_t i = RCT12_STATION_STYLE_PLAIN; i < std::size(_stationStyleMap); i++) { - if (_stationStyles[i] == identifier) + if (_stationStyleMap[i] == identifier) { return i; } @@ -798,14 +806,8 @@ std::optional GetStyleFromMusicIdentifier(std::string_view identifier) return std::nullopt; } -void RCT12AddDefaultObjects(ObjectList& objectList) +void RCT12AddDefaultMusic(ObjectList& objectList) { - // Stations - for (size_t i = 0; i < std::size(_stationStyles); i++) - { - objectList.SetObject(ObjectType::station, static_cast(i), _stationStyles[i]); - } - // Music for (size_t i = 0; i < std::size(_musicStyles); i++) { diff --git a/src/openrct2/rct12/RCT12.h b/src/openrct2/rct12/RCT12.h index be5cd889ab60..05fc284e6665 100644 --- a/src/openrct2/rct12/RCT12.h +++ b/src/openrct2/rct12/RCT12.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -31,9 +31,13 @@ namespace OpenRCT2 { class ObjectList; enum class TrackElemType : uint16_t; - enum class TextColour : uint8_t; } // namespace OpenRCT2 +namespace OpenRCT2::Drawing +{ + enum class TextColour : uint8_t; +} + namespace OpenRCT2::RCT12 { enum class ClimateType : uint8_t @@ -474,6 +478,23 @@ enum : uint32_t TRACK_FLAGS2_SIX_FLAGS_RIDE_DEPRECATED = (1u << 31) // Not used anymore. }; +static constexpr std::string_view kNoEntranceNoPlatformIdentifier = "openrct2.station.noplatformnoentrance"; + +constexpr std::string_view kDefaultStationStyles[] = { + "rct2.station.plain", // RCT12_STATION_STYLE_PLAIN + "rct2.station.wooden", // RCT12_STATION_STYLE_WOODEN + "rct2.station.canvas_tent", // RCT12_STATION_STYLE_CANVAS_TENT + "rct2.station.castle_grey", // RCT12_STATION_STYLE_CASTLE_GREY + "rct2.station.castle_brown", // RCT12_STATION_STYLE_CASTLE_BROWN + "rct2.station.jungle", // RCT12_STATION_STYLE_JUNGLE + "rct2.station.log", // RCT12_STATION_STYLE_LOG_CABIN + "rct2.station.classical", // RCT12_STATION_STYLE_CLASSICAL + "rct2.station.abstract", // RCT12_STATION_STYLE_ABSTRACT + "rct2.station.snow", // RCT12_STATION_STYLE_SNOW + "rct2.station.pagoda", // RCT12_STATION_STYLE_PAGODA + "rct2.station.space", // RCT12_STATION_STYLE_SPACE +}; + #pragma pack(push, 1) struct RCT12xy8 @@ -618,12 +639,12 @@ struct RCT12TileElement : public RCT12TileElementBase template const TType* as() const { - return static_cast(GetType()) == TClass ? reinterpret_cast(this) : nullptr; + return GetType() == TClass ? reinterpret_cast(this) : nullptr; } template TType* as() { - return static_cast(GetType()) == TClass ? reinterpret_cast(this) : nullptr; + return GetType() == TClass ? reinterpret_cast(this) : nullptr; } const RCT12SurfaceElement* AsSurface() const @@ -1150,9 +1171,9 @@ struct RCT12Banner uint8_t Colour; // 0x04 uint8_t RideIndex; // 0x04 }; - OpenRCT2::TextColour textColour; // 0x05 - uint8_t x; // 0x06 - uint8_t y; // 0x07 + OpenRCT2::Drawing::TextColour textColour; // 0x05 + uint8_t x; // 0x06 + uint8_t y; // 0x07 }; static_assert(sizeof(RCT12Banner) == 8); @@ -1212,7 +1233,7 @@ OpenRCT2::RCT12::TrackElemType OpenRCT2FlatTrackTypeToRCT12(OpenRCT2::TrackElemT std::string_view GetStationIdentifierFromStyle(uint8_t style); uint8_t GetStationStyleFromIdentifier(u8string_view identifier); std::optional GetStyleFromMusicIdentifier(std::string_view identifier); -void RCT12AddDefaultObjects(OpenRCT2::ObjectList& objectList); +void RCT12AddDefaultMusic(OpenRCT2::ObjectList& objectList); void AppendRequiredObjects( OpenRCT2::ObjectList& objectList, OpenRCT2::ObjectType objectType, std::span objectNames); void AppendRequiredObjects( diff --git a/src/openrct2/rct12/ScenarioPatcher.cpp b/src/openrct2/rct12/ScenarioPatcher.cpp index 93ffe5787d62..5fece06eb135 100644 --- a/src/openrct2/rct12/ScenarioPatcher.cpp +++ b/src/openrct2/rct12/ScenarioPatcher.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -45,6 +45,7 @@ #include using namespace OpenRCT2; +using OpenRCT2::GameActions::CommandFlag; static bool _dryRun = false; @@ -284,13 +285,13 @@ static void ApplyWaterFixes(const json_t& scenarioPatch) static TrackElemType toTrackType(const u8string_view trackTypeString) { if (trackTypeString == "flat") - return TrackElemType::Flat; + return TrackElemType::flat; else if (trackTypeString == "flat_covered") - return TrackElemType::FlatCovered; + return TrackElemType::flatCovered; else { Guard::Assert(0, "Unsupported track type conversion"); - return TrackElemType::None; + return TrackElemType::none; } } @@ -531,7 +532,7 @@ static void SwapRideEntranceAndExit(RideId rideId) FootpathQueueChainReset(); FootpathConnectEdges( entranceCoords.ToCoordsXY(), reinterpret_cast(entranceElement), - GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + { CommandFlag::apply, CommandFlag::allowDuringPaused }); FootpathUpdateQueueChains(); } } @@ -662,7 +663,7 @@ static void ApplyPathFixes(const json_t& scenarioPatch) coordinate.ToCoordsXYZ(), slope, surfaceObjIndex, railingsObjIndex, direction, constructionFlags); auto& gameState = getGameState(); auto result = footpathPlaceAction.Execute(gameState); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { Guard::Assert(0, "Could not patch path"); } diff --git a/src/openrct2/rct12/ScenarioPatcher.h b/src/openrct2/rct12/ScenarioPatcher.h index a3df7c39a53c..b613824e3e4b 100644 --- a/src/openrct2/rct12/ScenarioPatcher.h +++ b/src/openrct2/rct12/ScenarioPatcher.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct12/TD46.cpp b/src/openrct2/rct12/TD46.cpp index d5d5ebd1d2e2..40296098ca82 100644 --- a/src/openrct2/rct12/TD46.cpp +++ b/src/openrct2/rct12/TD46.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -25,7 +25,7 @@ namespace OpenRCT2::RCT12 else { auto speedOrSeatRotation = flags & EnumValue(TD46Flags::speedOrSeatRotation); - if (::TrackTypeHasSpeedSetting(target.type) && target.type != OpenRCT2::TrackElemType::BlockBrakes) + if (::TrackTypeHasSpeedSetting(target.type) && target.type != OpenRCT2::TrackElemType::blockBrakes) { target.brakeBoosterSpeed = speedOrSeatRotation << 1; } @@ -49,7 +49,7 @@ namespace OpenRCT2::RCT12 { trackFlags = (source.stationIndex.ToUnderlying() & EnumValue(TD46Flags::stationId)); } - else if (::TrackTypeHasSpeedSetting(source.type) && source.type != OpenRCT2::TrackElemType::BlockBrakes) + else if (::TrackTypeHasSpeedSetting(source.type) && source.type != OpenRCT2::TrackElemType::blockBrakes) { trackFlags = (source.brakeBoosterSpeed >> 1); } diff --git a/src/openrct2/rct12/TD46.h b/src/openrct2/rct12/TD46.h index 477ae6b70c9b..0fefb6ba6b22 100644 --- a/src/openrct2/rct12/TD46.h +++ b/src/openrct2/rct12/TD46.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct2/DATLimits.h b/src/openrct2/rct2/DATLimits.h index 06c9dda639c0..b892546dc481 100644 --- a/src/openrct2/rct2/DATLimits.h +++ b/src/openrct2/rct2/DATLimits.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct2/Limits.h b/src/openrct2/rct2/Limits.h index 24497c06a1df..f49e32c33b9b 100644 --- a/src/openrct2/rct2/Limits.h +++ b/src/openrct2/rct2/Limits.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct2/RCT2.cpp b/src/openrct2/rct2/RCT2.cpp index 2dce7aab212b..647ea6cb9d04 100644 --- a/src/openrct2/rct2/RCT2.cpp +++ b/src/openrct2/rct2/RCT2.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,6 +18,7 @@ #include "../ride/Track.h" #include +#include namespace OpenRCT2::RCT2 { @@ -119,7 +120,7 @@ namespace OpenRCT2::RCT2 case OriginalRideClass::wildMouse: // Boosters share their ID with the Spinning Control track. if (origTrackType == OpenRCT2::RCT12::TrackElemType::rotationControlToggleAlias) - return OpenRCT2::TrackElemType::RotationControlToggle; + return OpenRCT2::TrackElemType::rotationControlToggle; return static_cast(origTrackType); case OriginalRideClass::regular: default: @@ -129,7 +130,7 @@ namespace OpenRCT2::RCT2 OpenRCT2::RCT12::TrackElemType OpenRCT2TrackTypeToRCT2(OpenRCT2::TrackElemType origTrackType) { - if (origTrackType == TrackElemType::RotationControlToggle) + if (origTrackType == TrackElemType::rotationControlToggle) return OpenRCT2::RCT12::TrackElemType::rotationControlToggleAlias; // This function is safe to run this way round. diff --git a/src/openrct2/rct2/RCT2.h b/src/openrct2/rct2/RCT2.h index 59c02fcf1e34..1be847398afa 100644 --- a/src/openrct2/rct2/RCT2.h +++ b/src/openrct2/rct2/RCT2.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -17,13 +17,18 @@ #include "../world/ParkData.h" #include "Limits.h" -#include #include struct RideObjectEntry; enum class EditorStep : uint8_t; +enum class MechanicStatus : uint8_t; +enum class RideInvalidateFlag : uint8_t; enum class VehicleColourSettings : uint8_t; +template +struct FlagHolder; +using RideInvalidateFlags = FlagHolder; + namespace OpenRCT2::Scenario { enum class Category : uint8_t; @@ -212,17 +217,16 @@ namespace OpenRCT2::RCT2 uint8_t satisfaction; // 0x14A uint8_t satisfactionTimeOut; // 0x14B uint8_t satisfactionNext; // 0x14C - // Various flags stating whether a window needs to be refreshed - uint8_t windowInvalidateFlags; // 0x14D - uint8_t pad14E[0x02]; // 0x14E - uint32_t totalCustomers; // 0x150 - money32 totalProfit; // 0x154 - uint8_t popularity; // 0x158 - uint8_t popularityTimeOut; // 0x159 Updated every purchase and ?possibly by time? - uint8_t popularityNext; // 0x15A When timeout reached this will be the next popularity - uint8_t numRiders; // 0x15B - uint8_t musicTuneId; // 0x15C - uint8_t slideInUse; // 0x15D + RideInvalidateFlags windowInvalidateFlags; // 0x14D + uint8_t pad14E[0x02]; // 0x14E + uint32_t totalCustomers; // 0x150 + money32 totalProfit; // 0x154 + uint8_t popularity; // 0x158 + uint8_t popularityTimeOut; // 0x159 Updated every purchase and ?possibly by time? + uint8_t popularityNext; // 0x15A When timeout reached this will be the next popularity + uint8_t numRiders; // 0x15B + uint8_t musicTuneId; // 0x15C + uint8_t slideInUse; // 0x15D union { uint16_t slidePeep; // 0x15E @@ -239,7 +243,7 @@ namespace OpenRCT2::RCT2 uint8_t pad186[0x02]; // 0x186 uint32_t musicPosition; // 0x188 uint8_t breakdownReasonPending; // 0x18C - uint8_t mechanicStatus; // 0x18D + MechanicStatus mechanicStatus; // 0x18D uint16_t mechanic; // 0x18E uint8_t inspectionStation; // 0x190 uint8_t brokenTrain; // 0x191 diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 6a9231ec8ee3..d1570a0dd326 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -25,7 +25,6 @@ #include "../entity/PatrolArea.h" #include "../entity/Staff.h" #include "../localisation/Formatting.h" -#include "../object/ObjectLimits.h" #include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/ObjectRepository.h" @@ -38,10 +37,10 @@ #include "../rct12/RCT12.h" #include "../rct12/ScenarioPatcher.h" #include "../rct2/RCT2.h" +#include "../ride/Ride.h" #include "../ride/RideData.h" #include "../ride/Vehicle.h" #include "../sawyer_coding/SawyerChunkReader.h" -#include "../sawyer_coding/SawyerCoding.h" #include "../scenario/Scenario.h" #include "../scenario/ScenarioRepository.h" #include "../scenario/ScenarioSources.h" @@ -90,6 +89,7 @@ namespace OpenRCT2::RCT2 ObjectEntryIndex _pathToRailingMap[16]; RCT12::EntryList _terrainSurfaceEntries; RCT12::EntryList _terrainEdgeEntries; + RCT12::EntryList _stationEntries; public: S6Importer(IObjectRepository& objectRepository) @@ -612,6 +612,8 @@ namespace OpenRCT2::RCT2 // Add default edges _terrainEdgeEntries.AddRange(DefaultTerrainEdges); + + _stationEntries.AddRange(kDefaultStationStyles); } void ConvertScenarioStringsToUTF8(GameState_t& gameState) @@ -929,7 +931,8 @@ namespace OpenRCT2::RCT2 dst->reliability = src->reliability; dst->unreliabilityFactor = src->unreliabilityFactor; dst->downtime = src->downtime; - dst->inspectionInterval = src->inspectionInterval; + auto clampedInspectionInterval = std::clamp(src->inspectionInterval, 0, EnumValue(RideInspection::never)); + dst->inspectionInterval = static_cast(clampedInspectionInterval); dst->lastInspection = src->lastInspection; for (uint8_t i = 0; i < Limits::kDowntimeHistorySize; i++) @@ -971,11 +974,11 @@ namespace OpenRCT2::RCT2 } dst->music = musicStyle; + auto entranceStyle = src->entranceStyle; // In SV7, "plain" entrances are invisible. - auto entranceStyle = kObjectEntryIndexNull; - if (!_isSV7 && GetRideTypeDescriptor(dst->type).HasFlag(RtdFlag::hasEntranceAndExit)) + if (_isSV7) { - entranceStyle = src->entranceStyle; + entranceStyle = _stationEntries.GetOrAddEntry(kNoEntranceNoPlatformIdentifier); } dst->entranceStyle = entranceStyle; @@ -1056,7 +1059,7 @@ namespace OpenRCT2::RCT2 } else { - dst.ProximityTrackType = TrackElemType::None; + dst.ProximityTrackType = TrackElemType::none; } dst.ProximityBaseHeight = src.ProximityBaseHeight; dst.ProximityTotal = src.ProximityTotal; @@ -1088,7 +1091,7 @@ namespace OpenRCT2::RCT2 void ImportRideMeasurement(RideMeasurement& dst, const RCT12RideMeasurement& src) { - dst.flags = src.Flags; + dst.flags.holder = src.Flags; dst.last_use_tick = src.LastUseTick; dst.num_items = src.NumItems; dst.current_item = src.CurrentItem; @@ -1134,7 +1137,7 @@ namespace OpenRCT2::RCT2 dst->type = RCTEntryIndexToOpenRCT2EntryIndex(src->Type); dst->flags = src->flags; - if (!(src->flags.has(BannerFlag::linkedToRide)) && IsUserStringID(src->StringID)) + if (!src->flags.has(BannerFlag::linkedToRide) && IsUserStringID(src->StringID)) { dst->text = GetUserString(src->StringID); } @@ -1391,12 +1394,12 @@ namespace OpenRCT2::RCT2 dst2->SetStationIndex(StationIndex::FromUnderlying(src2->GetStationIndex())); dst2->SetHasGreenLight(src2->HasGreenLight()); // Brakes import as closed to preserve legacy behaviour - dst2->SetBrakeClosed(src2->BlockBrakeClosed() || (trackType == TrackElemType::Brakes)); + dst2->SetBrakeClosed(src2->BlockBrakeClosed() || (trackType == TrackElemType::brakes)); dst2->SetIsIndestructible(src2->IsIndestructible()); // Skipping IsHighlighted() // Import block brakes to keep legacy behaviour - if (trackType == TrackElemType::BlockBrakes) + if (trackType == TrackElemType::blockBrakes) { dst2->SetBrakeBoosterSpeed(kRCT2DefaultBlockBrakeSpeed); } @@ -1404,7 +1407,7 @@ namespace OpenRCT2::RCT2 { dst2->SetBrakeBoosterSpeed(src2->GetBrakeBoosterSpeed()); } - else if (trackType == TrackElemType::OnRidePhoto) + else if (trackType == TrackElemType::onRidePhoto) { dst2->SetPhotoTimeout(src2->GetPhotoTimeout()); } @@ -1920,9 +1923,26 @@ namespace OpenRCT2::RCT2 AppendRequiredObjects(objectList, ObjectType::terrainSurface, _terrainSurfaceEntries); AppendRequiredObjects(objectList, ObjectType::terrainEdge, _terrainEdgeEntries); + + const bool hasInvisibleEntrance = std::any_of(std::begin(_s6.Rides), std::end(_s6.Rides), [](Ride& ride) { + if (ride.type == kRideTypeNull) + return false; + + return ride.entranceStyle == RCT12_STATION_STYLE_INVISIBLE; + }); + if (hasInvisibleEntrance) + { + _stationEntries.GetOrAddEntry(GetStationIdentifierFromStyle(RCT12_STATION_STYLE_INVISIBLE)); + } + if (_isSV7) + { + _stationEntries.GetOrAddEntry(kNoEntranceNoPlatformIdentifier); + } + AppendRequiredObjects(objectList, ObjectType::station, _stationEntries); + AppendRequiredObjects( objectList, ObjectType::peepNames, std::vector({ "rct2.peep_names.original" })); - RCT12AddDefaultObjects(objectList); + RCT12AddDefaultMusic(objectList); // Normalise the name to make the scenario as recognisable as possible auto normalisedName = ScenarioSources::NormaliseName(_s6.Info.Name); @@ -1965,7 +1985,7 @@ namespace OpenRCT2::RCT2 dst->track_progress = src->TrackProgress; dst->TrackLocation = { src->TrackX, src->TrackY, src->TrackZ }; if (src->BoatLocation.IsNull() || static_cast(ride.mode) != RideMode::boatHire - || src->Status != static_cast(::Vehicle::Status::TravellingBoat)) + || src->Status != static_cast(::Vehicle::Status::travellingBoat)) { dst->BoatLocation.SetNull(); dst->SetTrackDirection(src->GetTrackDirection()); @@ -1982,10 +2002,10 @@ namespace OpenRCT2::RCT2 // booster track but this is unlikely since only two rides have spinning control track - by default they load as // booster. TileElement* tileElement2 = MapGetTrackElementAtOfTypeSeq( - dst->TrackLocation, TrackElemType::RotationControlToggle, 0); + dst->TrackLocation, TrackElemType::rotationControlToggle, 0); if (tileElement2 != nullptr) - dst->SetTrackType(TrackElemType::RotationControlToggle); + dst->SetTrackType(TrackElemType::rotationControlToggle); } else if (src->GetTrackType() == OpenRCT2::RCT12::TrackElemType::blockBrakes) { @@ -1996,7 +2016,7 @@ namespace OpenRCT2::RCT2 { dst->BoatLocation = TileCoordsXY{ src->BoatLocation.x, src->BoatLocation.y }.ToCoordsXY(); dst->SetTrackDirection(0); - dst->SetTrackType(OpenRCT2::TrackElemType::Flat); + dst->SetTrackType(OpenRCT2::TrackElemType::flat); } dst->next_vehicle_on_train = EntityId::FromUnderlying(src->NextVehicleOnTrain); @@ -2010,8 +2030,8 @@ namespace OpenRCT2::RCT2 dst->current_time = src->CurrentTime; dst->crash_z = src->CrashZ; - ::Vehicle::Status statusSrc = ::Vehicle::Status::MovingToEndOfStation; - if (src->Status <= static_cast(::Vehicle::Status::StoppedByBlockBrakes)) + ::Vehicle::Status statusSrc = ::Vehicle::Status::movingToEndOfStation; + if (src->Status <= static_cast(::Vehicle::Status::stoppedByBlockBrakes)) { statusSrc = static_cast<::Vehicle::Status>(src->Status); } diff --git a/src/openrct2/rct2/SeaDecrypt.cpp b/src/openrct2/rct2/SeaDecrypt.cpp index 2fea66a60841..de63c5370c06 100644 --- a/src/openrct2/rct2/SeaDecrypt.cpp +++ b/src/openrct2/rct2/SeaDecrypt.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct2/T6Exporter.cpp b/src/openrct2/rct2/T6Exporter.cpp index c577e8ffe52a..3b63eee8573f 100644 --- a/src/openrct2/rct2/T6Exporter.cpp +++ b/src/openrct2/rct2/T6Exporter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -153,7 +153,7 @@ namespace OpenRCT2::RCT2 for (const auto& trackElement : _trackDesign.trackElements) { auto trackType = OpenRCT2TrackTypeToRCT2(trackElement.type); - if (trackElement.type == TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop) + if (trackElement.type == TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop) { trackType = OpenRCT2::RCT12::TrackElemType::invertedUp90ToFlatQuarterLoopAlias; } diff --git a/src/openrct2/rct2/T6Exporter.h b/src/openrct2/rct2/T6Exporter.h index b1af2315dacb..edc29697b47f 100644 --- a/src/openrct2/rct2/T6Exporter.h +++ b/src/openrct2/rct2/T6Exporter.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/rct2/T6Importer.cpp b/src/openrct2/rct2/T6Importer.cpp index 9b8ea4b284f3..178ffb4c0dd3 100644 --- a/src/openrct2/rct2/T6Importer.cpp +++ b/src/openrct2/rct2/T6Importer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -162,7 +162,7 @@ namespace OpenRCT2::RCT2 OpenRCT2::TrackElemType trackType; if (t6TrackElement.Type == OpenRCT2::RCT12::TrackElemType::invertedUp90ToFlatQuarterLoopAlias) { - trackType = TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop; + trackType = TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop; } else { diff --git a/src/openrct2/ride/Angles.h b/src/openrct2/ride/Angles.h index 5b7b7e813c1c..e46d53cce93f 100644 --- a/src/openrct2/ride/Angles.h +++ b/src/openrct2/ride/Angles.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/CableLift.cpp b/src/openrct2/ride/CableLift.cpp index 44818b225935..b9b779cbf2d5 100644 --- a/src/openrct2/ride/CableLift.cpp +++ b/src/openrct2/ride/CableLift.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -36,7 +36,7 @@ Vehicle* CableLiftSegmentCreate( { ride.cableLift = current->Id; } - current->SubType = head ? Vehicle::Type::Head : Vehicle::Type::Tail; + current->SubType = head ? Vehicle::Type::head : Vehicle::Type::tail; current->var_44 = var_44; current->remaining_distance = remaining_distance; current->SpriteData.Width = 10; @@ -75,11 +75,11 @@ Vehicle* CableLiftSegmentCreate( z += ride.getRideTypeDescriptor().Heights.VehicleZOffset; current->MoveTo({ 16, 16, z }); - current->SetTrackType(TrackElemType::CableLiftHill); + current->SetTrackType(TrackElemType::cableLiftHill); current->SetTrackDirection(current->Orientation >> 3); current->track_progress = 164; current->Flags = VehicleFlags::CollisionDisabled; - current->SetState(Vehicle::Status::MovingToEndOfStation, 0); + current->SetState(Vehicle::Status::movingToEndOfStation, 0); current->num_peeps = 0; current->next_free_seat = 0; current->BoatLocation.SetNull(); @@ -90,22 +90,22 @@ void Vehicle::CableLiftUpdate() { switch (status) { - case Vehicle::Status::MovingToEndOfStation: + case Vehicle::Status::movingToEndOfStation: CableLiftUpdateMovingToEndOfStation(); break; - case Vehicle::Status::WaitingForPassengers: + case Vehicle::Status::waitingForPassengers: // Stays in this state until a train puts it into next state break; - case Vehicle::Status::WaitingToDepart: + case Vehicle::Status::waitingToDepart: CableLiftUpdateWaitingToDepart(); break; - case Vehicle::Status::Departing: + case Vehicle::Status::departing: CableLiftUpdateDeparting(); break; - case Vehicle::Status::Travelling: + case Vehicle::Status::travelling: CableLiftUpdateTravelling(); break; - case Vehicle::Status::Arriving: + case Vehicle::Status::arriving: CableLiftUpdateArriving(); break; default: @@ -135,7 +135,7 @@ void Vehicle::CableLiftUpdateMovingToEndOfStation() velocity = 0; acceleration = 0; - SetState(Vehicle::Status::WaitingForPassengers, sub_state); + SetState(Vehicle::Status::waitingForPassengers, sub_state); } /** @@ -175,7 +175,7 @@ void Vehicle::CableLiftUpdateWaitingToDepart() velocity = 0; acceleration = 0; - SetState(Vehicle::Status::Departing, 0); + SetState(Vehicle::Status::departing, 0); } /** @@ -193,8 +193,8 @@ void Vehicle::CableLiftUpdateDeparting() { return; } - SetState(Vehicle::Status::Travelling, sub_state); - passengerVehicle->SetState(Vehicle::Status::TravellingCableLift, passengerVehicle->sub_state); + SetState(Vehicle::Status::travelling, sub_state); + passengerVehicle->SetState(Vehicle::Status::travellingCableLift, passengerVehicle->sub_state); } /** @@ -219,7 +219,7 @@ void Vehicle::CableLiftUpdateTravelling() velocity = 0; acceleration = 0; - SetState(Vehicle::Status::Arriving, 0); + SetState(Vehicle::Status::arriving, 0); } /** @@ -230,7 +230,7 @@ void Vehicle::CableLiftUpdateArriving() { sub_state++; if (sub_state >= 64) - SetState(Vehicle::Status::MovingToEndOfStation, sub_state); + SetState(Vehicle::Status::movingToEndOfStation, sub_state); } bool Vehicle::CableLiftUpdateTrackMotionForwards() @@ -242,7 +242,7 @@ bool Vehicle::CableLiftUpdateTrackMotionForwards() for (; remaining_distance >= 13962; _vehicleUnkF64E10++) { auto trackType = GetTrackType(); - if (trackType == TrackElemType::CableLiftHill && track_progress == 160) + if (trackType == TrackElemType::cableLiftHill && track_progress == 160) { _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_1; } @@ -281,7 +281,7 @@ bool Vehicle::CableLiftUpdateTrackMotionForwards() remaining_distance -= Geometry::getTranslationDistance(nextVehiclePosition - _vehicleCurPosition, false); _vehicleCurPosition = nextVehiclePosition; - Orientation = moveInfo->direction; + Orientation = moveInfo->yaw; roll = moveInfo->roll; pitch = moveInfo->pitch; @@ -323,8 +323,8 @@ bool Vehicle::CableLiftUpdateTrackMotionBackwards() // Doesn't check for diagonal block brakes because there is no diagonal cable lift piece, // no way for a cable lift to start from a diagonal brake. - if (output.begin_element->AsTrack()->GetTrackType() == TrackElemType::EndStation - || output.begin_element->AsTrack()->GetTrackType() == TrackElemType::BlockBrakes) + if (output.begin_element->AsTrack()->GetTrackType() == TrackElemType::endStation + || output.begin_element->AsTrack()->GetTrackType() == TrackElemType::blockBrakes) { _vehicleMotionTrackFlags = VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_AT_STATION; } @@ -341,7 +341,7 @@ bool Vehicle::CableLiftUpdateTrackMotionBackwards() remaining_distance += Geometry::getTranslationDistance(nextVehiclePosition - _vehicleCurPosition, false); _vehicleCurPosition = nextVehiclePosition; - Orientation = moveInfo->direction; + Orientation = moveInfo->yaw; roll = moveInfo->roll; pitch = moveInfo->pitch; diff --git a/src/openrct2/ride/CableLift.h b/src/openrct2/ride/CableLift.h index 1050b3406b60..798ad0265a12 100644 --- a/src/openrct2/ride/CableLift.h +++ b/src/openrct2/ride/CableLift.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/CarEntry.cpp b/src/openrct2/ride/CarEntry.cpp index 028978beb857..99f84f611c84 100644 --- a/src/openrct2/ride/CarEntry.cpp +++ b/src/openrct2/ride/CarEntry.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -53,7 +53,7 @@ void CarEntrySetImageMaxSizes(CarEntry& carEntry, int32_t numImages) uint8_t bitmap[kHeight][kWidth] = { 0 }; - RenderTarget rt = { + OpenRCT2::Drawing::RenderTarget rt = { .bits = reinterpret_cast(bitmap), .x = -(kWidth / 2), .y = -(kHeight / 2), diff --git a/src/openrct2/ride/CarEntry.h b/src/openrct2/ride/CarEntry.h index 1e65ca613f26..9e7c62179616 100644 --- a/src/openrct2/ride/CarEntry.h +++ b/src/openrct2/ride/CarEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/MazeCost.cpp b/src/openrct2/ride/MazeCost.cpp index 73dbb2f9a6cf..7266bcd3473e 100644 --- a/src/openrct2/ride/MazeCost.cpp +++ b/src/openrct2/ride/MazeCost.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -23,7 +23,7 @@ namespace OpenRCT2 { money64 MazeCalculateCost(money64 constructionCost, const Ride& ride, const CoordsXYZ& loc) { - const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); + const auto& ted = GetTrackElementDescriptor(TrackElemType::maze); money64 price = (ride.getRideTypeDescriptor().BuildCosts.TrackPrice * ted.priceModifier) >> 16; auto surfaceElement = MapGetSurfaceElementAt(loc); diff --git a/src/openrct2/ride/MazeCost.h b/src/openrct2/ride/MazeCost.h index 9d0a6562da59..f8a0db1deb7b 100644 --- a/src/openrct2/ride/MazeCost.h +++ b/src/openrct2/ride/MazeCost.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index d344c755b7c0..0707beba3dde 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,7 +13,6 @@ #include "../Context.h" #include "../Diagnostic.h" #include "../Editor.h" -#include "../Game.h" #include "../GameState.h" #include "../Input.h" #include "../OpenRCT2.h" @@ -22,12 +21,12 @@ #include "../actions/RideSetStatusAction.h" #include "../actions/RideSetVehicleAction.h" #include "../audio/Audio.h" -#include "../audio/AudioMixer.h" #include "../config/Config.h" #include "../core/BitSet.hpp" #include "../core/EnumUtils.hpp" #include "../core/Guard.hpp" #include "../core/Numerics.hpp" +#include "../drawing/Drawing.h" #include "../entity/EntityList.h" #include "../entity/EntityRegistry.h" #include "../entity/Peep.h" @@ -36,10 +35,7 @@ #include "../interface/WindowBase.h" #include "../localisation/Formatter.h" #include "../localisation/Formatting.h" -#include "../management/Finance.h" -#include "../management/Marketing.h" #include "../management/NewsItem.h" -#include "../network/Network.h" #include "../object/MusicObject.h" #include "../object/ObjectList.h" #include "../object/ObjectManager.h" @@ -51,14 +47,12 @@ #include "../ui/WindowManager.h" #include "../util/Util.h" #include "../windows/Intent.h" -#include "../world/Banner.h" #include "../world/Climate.h" #include "../world/Entrance.h" #include "../world/Footpath.h" #include "../world/Location.hpp" #include "../world/Map.h" #include "../world/Park.h" -#include "../world/Scenery.h" #include "../world/TileElementsView.h" #include "../world/tile_element/EntranceElement.h" #include "../world/tile_element/PathElement.h" @@ -74,16 +68,12 @@ #include "Track.h" #include "TrackData.h" #include "TrackDesign.h" -#include "TrainManager.h" #include "Vehicle.h" #include -#include -#include #include #include #include -#include using namespace OpenRCT2; using namespace OpenRCT2::TrackMetaData; @@ -169,7 +159,7 @@ static void RideCallMechanic(Ride& ride, Peep* mechanic, int32_t forInspection); static void RideEntranceExitConnected(Ride& ride); static int32_t RideGetNewBreakdownProblem(const Ride& ride); static void RideInspectionUpdate(Ride& ride); -static void RideMechanicStatusUpdate(Ride& ride, int32_t mechanicStatus); +static void RideMechanicStatusUpdate(Ride& ride, MechanicStatus mechanicStatus); static void RideMusicUpdate(Ride& ride); static void RideShopConnected(const Ride& ride); @@ -419,7 +409,7 @@ void RideUpdateFavouritedStat() if (ride != nullptr) { ride->guestsFavourite = AddClamp(ride->guestsFavourite, 1u); - ride->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + ride->windowInvalidateFlags.set(RideInvalidateFlag::customers); } } } @@ -505,9 +495,9 @@ bool RideTryGetOriginElement(const Ride& ride, CoordsXYE* output) // Check if it's not the station or ??? (but allow end piece of station) const auto& ted = GetTrackElementDescriptor(it.element->AsTrack()->GetTrackType()); bool specialTrackPiece - = (it.element->AsTrack()->GetTrackType() != TrackElemType::BeginStation - && it.element->AsTrack()->GetTrackType() != TrackElemType::MiddleStation - && (ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN)); + = (it.element->AsTrack()->GetTrackType() != TrackElemType::beginStation + && it.element->AsTrack()->GetTrackType() != TrackElemType::middleStation + && ted.sequences[0].flags.has(SequenceFlag::trackOrigin)); // Set result tile to this track piece if first found track or a ??? if (resultTileElement == nullptr || specialTrackPiece) @@ -925,7 +915,7 @@ int32_t Ride::getTotalTime() const bool Ride::canHaveMultipleCircuits() const { - if (!(getRideTypeDescriptor().HasFlag(RtdFlag::allowMultipleCircuits))) + if (!getRideTypeDescriptor().HasFlag(RtdFlag::allowMultipleCircuits)) return false; // Only allow circuit or launch modes @@ -1143,10 +1133,10 @@ void Ride::update() numCustomers[0] = curNumCustomers; curNumCustomers = 0; - windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + windowInvalidateFlags.set(RideInvalidateFlag::customers); incomePerHour = calculateIncomePerHour(); - windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME; + windowInvalidateFlags.set(RideInvalidateFlag::income); if (upkeepCost != kMoney64Undefined) profit = incomePerHour - (upkeepCost * 16); @@ -1219,7 +1209,7 @@ void Ride::updateSatisfaction(const uint8_t happiness) satisfaction = satisfactionNext >> 2; satisfactionNext = 0; satisfactionTimeout = 0; - windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + windowInvalidateFlags.set(RideInvalidateFlag::customers); } } @@ -1241,7 +1231,7 @@ void Ride::updatePopularity(const uint8_t pop_amount) popularity = popularityNext; popularityNext = 0; popularityTimeout = 0; - windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + windowInvalidateFlags.set(RideInvalidateFlag::customers); } /** rct2: 0x0098DDB8, 0x0098DDBA */ @@ -1343,9 +1333,9 @@ static void RideInspectionUpdate(Ride& ride) return; ride.lastInspection = AddClamp(ride.lastInspection, 1); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance); - int32_t inspectionIntervalMinutes = RideInspectionInterval[ride.inspectionInterval]; + int32_t inspectionIntervalMinutes = RideInspectionInterval[EnumValue(ride.inspectionInterval)]; // An inspection interval of 0 minutes means the ride is set to never be inspected. if (inspectionIntervalMinutes == 0) { @@ -1366,7 +1356,7 @@ static void RideInspectionUpdate(Ride& ride) // Inspect the first station that has an exit ride.lifecycleFlags |= RIDE_LIFECYCLE_DUE_INSPECTION; - ride.mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; + ride.mechanicStatus = MechanicStatus::calling; auto stationIndex = RideGetFirstValidStationExit(ride); ride.inspectionStation = (!stationIndex.IsNull()) ? stationIndex : StationIndex::FromUnderlying(0); @@ -1429,7 +1419,7 @@ static void RideBreakdownUpdate(Ride& ride) } ride.downtimeHistory[0] = 0; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance); } if (ride.lifecycleFlags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN | RIDE_LIFECYCLE_CRASHED)) @@ -1446,7 +1436,7 @@ static void RideBreakdownUpdate(Ride& ride) // Calculate breakdown probability? int32_t unreliabilityAccumulator = ride.unreliabilityFactor + getAgePenalty(ride); ride.reliability = static_cast(std::max(0, (ride.reliability - unreliabilityAccumulator))); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance); // Random probability of a breakdown. Roughly this is 1 in // @@ -1658,8 +1648,8 @@ static void RideBreakdownStatusUpdate(Ride& ride) if (ride.notFixedTimeout == 0) ride.notFixedTimeout -= 16; - if (!(ride.notFixedTimeout & 15) && ride.mechanicStatus != RIDE_MECHANIC_STATUS_FIXING - && ride.mechanicStatus != RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES) + if (!(ride.notFixedTimeout & 15) && ride.mechanicStatus != MechanicStatus::fixing + && ride.mechanicStatus != MechanicStatus::hasFixedStationBrakes) { if (Config::Get().notifications.rideWarnings) { @@ -1677,11 +1667,11 @@ static void RideBreakdownStatusUpdate(Ride& ride) * * rct2: 0x006B762F */ -static void RideMechanicStatusUpdate(Ride& ride, int32_t mechanicStatus) +static void RideMechanicStatusUpdate(Ride& ride, MechanicStatus mechanicStatus) { // Turn a pending breakdown into a breakdown. - if ((mechanicStatus == RIDE_MECHANIC_STATUS_UNDEFINED || mechanicStatus == RIDE_MECHANIC_STATUS_CALLING - || mechanicStatus == RIDE_MECHANIC_STATUS_HEADING) + if ((mechanicStatus == MechanicStatus::undefined || mechanicStatus == MechanicStatus::calling + || mechanicStatus == MechanicStatus::heading) && (ride.lifecycleFlags & RIDE_LIFECYCLE_BREAKDOWN_PENDING) && !(ride.lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN)) { auto breakdownReason = ride.breakdownReasonPending; @@ -1689,21 +1679,20 @@ static void RideMechanicStatusUpdate(Ride& ride, int32_t mechanicStatus) || breakdownReason == BREAKDOWN_CONTROL_FAILURE) { ride.lifecycleFlags |= RIDE_LIFECYCLE_BROKEN_DOWN; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE | RIDE_INVALIDATE_RIDE_LIST - | RIDE_INVALIDATE_RIDE_MAIN; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance, RideInvalidateFlag::list, RideInvalidateFlag::main); ride.breakdownReason = breakdownReason; RideBreakdownAddNewsItem(ride); } } switch (mechanicStatus) { - case RIDE_MECHANIC_STATUS_UNDEFINED: + case MechanicStatus::undefined: if (ride.lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN) { - ride.mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; + ride.mechanicStatus = MechanicStatus::calling; } break; - case RIDE_MECHANIC_STATUS_CALLING: + case MechanicStatus::calling: if (ride.getRideTypeDescriptor().AvailableBreakdowns == 0) { ride.lifecycleFlags &= ~( @@ -1713,7 +1702,7 @@ static void RideMechanicStatusUpdate(Ride& ride, int32_t mechanicStatus) RideCallClosestMechanic(ride); break; - case RIDE_MECHANIC_STATUS_HEADING: + case MechanicStatus::heading: { auto mechanic = RideGetMechanic(ride); bool rideNeedsRepair = (ride.lifecycleFlags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN)); @@ -1721,9 +1710,9 @@ static void RideMechanicStatusUpdate(Ride& ride, int32_t mechanicStatus) || (mechanic->State != PeepState::headingToInspection && mechanic->State != PeepState::answering) || mechanic->CurrentRide != ride.id) { - ride.mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; - RideMechanicStatusUpdate(ride, RIDE_MECHANIC_STATUS_CALLING); + ride.mechanicStatus = MechanicStatus::calling; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance); + RideMechanicStatusUpdate(ride, MechanicStatus::calling); } // if the ride is broken down, but a mechanic was heading for an inspection, update orders to fix else if (rideNeedsRepair && mechanic->State == PeepState::headingToInspection) @@ -1734,19 +1723,21 @@ static void RideMechanicStatusUpdate(Ride& ride, int32_t mechanicStatus) } break; } - case RIDE_MECHANIC_STATUS_FIXING: + case MechanicStatus::fixing: { auto mechanic = RideGetMechanic(ride); if (mechanic == nullptr || (mechanic->State != PeepState::headingToInspection && mechanic->State != PeepState::fixing && mechanic->State != PeepState::inspecting && mechanic->State != PeepState::answering)) { - ride.mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; - RideMechanicStatusUpdate(ride, RIDE_MECHANIC_STATUS_CALLING); + ride.mechanicStatus = MechanicStatus::calling; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance); + RideMechanicStatusUpdate(ride, MechanicStatus::calling); } break; } + default: + break; } } @@ -1758,8 +1749,8 @@ static void RideCallMechanic(Ride& ride, Peep* mechanic, int32_t forInspection) { mechanic->SetState(forInspection ? PeepState::headingToInspection : PeepState::answering); mechanic->SubState = 0; - ride.mechanicStatus = RIDE_MECHANIC_STATUS_HEADING; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAINTENANCE; + ride.mechanicStatus = MechanicStatus::heading; + ride.windowInvalidateFlags.set(RideInvalidateFlag::maintenance); ride.mechanic = mechanic->Id; mechanic->CurrentRide = ride.id; mechanic->CurrentRideStation = ride.inspectionStation; @@ -1869,8 +1860,8 @@ Staff* RideGetAssignedMechanic(const Ride& ride) { if (ride.lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN) { - if (ride.mechanicStatus == RIDE_MECHANIC_STATUS_HEADING || ride.mechanicStatus == RIDE_MECHANIC_STATUS_FIXING - || ride.mechanicStatus == RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES) + if (ride.mechanicStatus == MechanicStatus::heading || ride.mechanicStatus == MechanicStatus::fixing + || ride.mechanicStatus == MechanicStatus::hasFixedStationBrakes) { return RideGetMechanic(ride); } @@ -1944,7 +1935,7 @@ static bool RideMusicBreakdownEffect(Ride& ride) void CircusMusicUpdate(Ride& ride) { Vehicle* vehicle = getGameState().entities.GetEntity(ride.vehicles[0]); - if (vehicle == nullptr || vehicle->status != Vehicle::Status::DoingCircusShow) + if (vehicle == nullptr || vehicle->status != Vehicle::Status::doingCircusShow) { ride.musicPosition = 0; ride.musicTuneId = kTuneIDNull; @@ -2027,27 +2018,27 @@ static void RideMeasurementUpdate(Ride& ride, RideMeasurement& measurement) if (vehicle == nullptr) return; - if (measurement.flags & RIDE_MEASUREMENT_FLAG_UNLOADING) + if (measurement.flags.has(RideMeasurementFlag::unloading)) { - if (vehicle->status != Vehicle::Status::Departing && vehicle->status != Vehicle::Status::TravellingCableLift) + if (vehicle->status != Vehicle::Status::departing && vehicle->status != Vehicle::Status::travellingCableLift) return; - measurement.flags &= ~RIDE_MEASUREMENT_FLAG_UNLOADING; + measurement.flags.unset(RideMeasurementFlag::unloading); if (measurement.current_station == vehicle->current_station) measurement.current_item = 0; } - if (vehicle->status == Vehicle::Status::UnloadingPassengers) + if (vehicle->status == Vehicle::Status::unloadingPassengers) { - measurement.flags |= RIDE_MEASUREMENT_FLAG_UNLOADING; + measurement.flags.set(RideMeasurementFlag::unloading); return; } auto trackType = vehicle->GetTrackType(); - if (trackType == TrackElemType::BlockBrakes || trackType == TrackElemType::CableLiftHill - || trackType == TrackElemType::Up25ToFlat || trackType == TrackElemType::Up60ToFlat - || trackType == TrackElemType::DiagUp25ToFlat || trackType == TrackElemType::DiagUp60ToFlat - || trackType == TrackElemType::DiagBlockBrakes) + if (trackType == TrackElemType::blockBrakes || trackType == TrackElemType::cableLiftHill + || trackType == TrackElemType::up25ToFlat || trackType == TrackElemType::up60ToFlat + || trackType == TrackElemType::diagUp25ToFlat || trackType == TrackElemType::diagUp60ToFlat + || trackType == TrackElemType::diagBlockBrakes) if (vehicle->velocity == 0) return; @@ -2056,20 +2047,20 @@ static void RideMeasurementUpdate(Ride& ride, RideMeasurement& measurement) const auto currentTicks = getGameState().currentTicks; - if (measurement.flags & RIDE_MEASUREMENT_FLAG_G_FORCES) + if (measurement.flags.has(RideMeasurementFlag::gForces)) { auto gForces = vehicle->GetGForces(); - gForces.VerticalG = std::clamp(gForces.VerticalG / 8, -127, 127); - gForces.LateralG = std::clamp(gForces.LateralG / 8, -127, 127); + gForces.verticalG = std::clamp(gForces.verticalG / 8, -127, 127); + gForces.lateralG = std::clamp(gForces.lateralG / 8, -127, 127); if (currentTicks & 1) { - gForces.VerticalG = (gForces.VerticalG + measurement.vertical[measurement.current_item]) / 2; - gForces.LateralG = (gForces.LateralG + measurement.lateral[measurement.current_item]) / 2; + gForces.verticalG = (gForces.verticalG + measurement.vertical[measurement.current_item]) / 2; + gForces.lateralG = (gForces.lateralG + measurement.lateral[measurement.current_item]) / 2; } - measurement.vertical[measurement.current_item] = gForces.VerticalG & 0xFF; - measurement.lateral[measurement.current_item] = gForces.LateralG & 0xFF; + measurement.vertical[measurement.current_item] = gForces.verticalG & 0xFF; + measurement.lateral[measurement.current_item] = gForces.lateralG & 0xFF; } auto velocity = std::min(std::abs((vehicle->velocity * 5) >> 16), 255); @@ -2110,7 +2101,7 @@ void RideMeasurementsUpdate() auto measurement = ride.measurement.get(); if (measurement != nullptr && (ride.lifecycleFlags & RIDE_LIFECYCLE_ON_TRACK) && ride.status != RideStatus::simulating) { - if (measurement->flags & RIDE_MEASUREMENT_FLAG_RUNNING) + if (measurement->flags.has(RideMeasurementFlag::running)) { RideMeasurementUpdate(ride, *measurement); } @@ -2123,13 +2114,13 @@ void RideMeasurementsUpdate() auto vehicle = gameState.entities.GetEntity(vehicleSpriteIdx); if (vehicle != nullptr) { - if (vehicle->status == Vehicle::Status::Departing - || vehicle->status == Vehicle::Status::TravellingCableLift) + if (vehicle->status == Vehicle::Status::departing + || vehicle->status == Vehicle::Status::travellingCableLift) { measurement->vehicle_index = j; measurement->current_station = vehicle->current_station; - measurement->flags |= RIDE_MEASUREMENT_FLAG_RUNNING; - measurement->flags &= ~RIDE_MEASUREMENT_FLAG_UNLOADING; + measurement->flags.set(RideMeasurementFlag::running); + measurement->flags.unset(RideMeasurementFlag::unloading); RideMeasurementUpdate(ride, *measurement); break; } @@ -2187,14 +2178,14 @@ std::pair Ride::getMeasurement() measurement = std::make_unique(); if (rtd.HasFlag(RtdFlag::hasGForces)) { - measurement->flags |= RIDE_MEASUREMENT_FLAG_G_FORCES; + measurement->flags.set(RideMeasurementFlag::gForces); } RideFreeOldMeasurements(); assert(measurement != nullptr); } measurement->last_use_tick = getGameState().currentTicks; - if (measurement->flags & 1) + if (measurement->flags.has(RideMeasurementFlag::running)) { return { measurement.get(), { kStringIdEmpty, {} } }; } @@ -2397,22 +2388,22 @@ static void RideShopConnected(const Ride& ride) return; const auto& ted = GetTrackElementDescriptor(track_type); - uint8_t entrance_directions = ted.sequences[0].flags & 0xF; + uint8_t connectionSides = ted.sequences[0].getEntranceConnectionSides(); uint8_t tile_direction = trackElement->GetDirection(); - entrance_directions = Numerics::rol4(entrance_directions, tile_direction); + connectionSides = Numerics::rol4(connectionSides, tile_direction); - // Now each bit in entrance_directions stands for an entrance direction to check - if (entrance_directions == 0) + // Now each bit in connectionSides stands for an entrance direction to check + if (connectionSides == 0) return; - for (auto count = 0; entrance_directions != 0; count++) + for (auto count = 0; connectionSides != 0; count++) { - if (!(entrance_directions & 1)) + if (!(connectionSides & 1)) { - entrance_directions >>= 1; + connectionSides >>= 1; continue; } - entrance_directions >>= 1; + connectionSides >>= 1; // Flip direction north<->south, east<->west uint8_t face_direction = DirectionReverse(count); @@ -2755,7 +2746,7 @@ static ResultWithMessage RideCheckBlockBrakes(const CoordsXYE& input, CoordsXYE* if (TrackTypeIsBlockBrakes(it.current.element->AsTrack()->GetTrackType())) { auto type = it.last.element->AsTrack()->GetTrackType(); - if (type == TrackElemType::EndStation) + if (type == TrackElemType::endStation) { *output = it.current; return { false, STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_STATION }; @@ -2765,8 +2756,8 @@ static ResultWithMessage RideCheckBlockBrakes(const CoordsXYE& input, CoordsXYE* *output = it.current; return { false, STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_EACH_OTHER }; } - if (it.last.element->AsTrack()->HasChain() && type != TrackElemType::LeftCurvedLiftHill - && type != TrackElemType::RightCurvedLiftHill) + if (it.last.element->AsTrack()->HasChain() && type != TrackElemType::leftCurvedLiftHill + && type != TrackElemType::rightCurvedLiftHill) { *output = it.current; return { false, STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_THE_TOP_OF_THIS_LIFT_HILL }; @@ -2824,7 +2815,7 @@ static bool RideCheckTrackContainsInversions(const CoordsXYE& input, CoordsXYE* { auto trackType = it.current.element->AsTrack()->GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (ted.flags & TRACK_ELEM_FLAG_INVERSION_TO_NORMAL) + if (ted.flags.has(TrackElementFlag::inversionToNormal)) { *output = it.current; return true; @@ -2885,7 +2876,7 @@ static bool RideCheckTrackContainsBanked(const CoordsXYE& input, CoordsXYE* outp { auto trackType = it.current.element->AsTrack()->GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (ted.flags & TRACK_ELEM_FLAG_BANKED) + if (ted.flags.has(TrackElementFlag::banked)) { *output = it.current; return true; @@ -2936,7 +2927,7 @@ static int32_t RideCheckStationLength(const CoordsXYE& input, CoordsXYE* output) do { const auto& ted = GetTrackElementDescriptor(output->element->AsTrack()->GetTrackType()); - if (ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN) + if (ted.sequences[0].flags.has(SequenceFlag::trackOrigin)) { num_station_elements++; last_good_station = *output; @@ -2985,7 +2976,7 @@ static bool RideCheckStartAndEndIsStation(const CoordsXYE& input) TrackGetBack(input, &trackBack); auto trackType = trackBack.element->AsTrack()->GetTrackType(); const auto* ted = &GetTrackElementDescriptor(trackType); - if (!(ted->sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!ted->sequences[0].flags.has(SequenceFlag::trackOrigin)) { return false; } @@ -2995,7 +2986,7 @@ static bool RideCheckStartAndEndIsStation(const CoordsXYE& input) TrackGetFront(input, &trackFront); trackType = trackFront.element->AsTrack()->GetTrackType(); ted = &GetTrackElementDescriptor(trackType); - if (!(ted->sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!ted->sequences[0].flags.has(SequenceFlag::trackOrigin)) { return false; } @@ -3011,7 +3002,7 @@ static bool RideCheckStartAndEndIsStation(const CoordsXYE& input) */ static void RideSetBoatHireReturnPoint(Ride& ride, const CoordsXYE& startElement) { - auto trackType = TrackElemType::None; + auto trackType = TrackElemType::none; auto returnPos = startElement; int32_t startX = returnPos.x; int32_t startY = returnPos.y; @@ -3019,7 +3010,7 @@ static void RideSetBoatHireReturnPoint(Ride& ride, const CoordsXYE& startElement while (TrackBlockGetPrevious(returnPos, &trackBeginEnd)) { // If previous track is back to the starting x, y, then break loop (otherwise possible infinite loop) - if (trackType != TrackElemType::None && startX == trackBeginEnd.begin_x && startY == trackBeginEnd.begin_y) + if (trackType != TrackElemType::none && startX == trackBeginEnd.begin_x && startY == trackBeginEnd.begin_y) break; auto trackCoords = CoordsXYZ{ trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_z }; @@ -3091,11 +3082,11 @@ void SetBrakeClosedMultiTile(TrackElement& trackElement, const CoordsXY& trackLo { switch (trackElement.GetTrackType()) { - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: - case TrackElemType::CableLiftHill: - case TrackElemType::DiagBrakes: - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagUp60ToFlat: + case TrackElemType::cableLiftHill: + case TrackElemType::diagBrakes: + case TrackElemType::diagBlockBrakes: GetTrackElementOriginAndApplyChanges( { trackLocation, trackElement.GetBaseZ(), trackElement.GetDirection() }, trackElement.GetTrackType(), isClosed, nullptr, { TrackElementSetFlag::brakeClosed }); @@ -3117,18 +3108,18 @@ static void RideOpenBlockBrakes(const CoordsXYE& startElement) auto trackType = currentElement.element->AsTrack()->GetTrackType(); switch (trackType) { - case TrackElemType::BlockBrakes: - case TrackElemType::DiagBlockBrakes: + case TrackElemType::blockBrakes: + case TrackElemType::diagBlockBrakes: BlockBrakeSetLinkedBrakesClosed( CoordsXYZ(currentElement.x, currentElement.y, currentElement.element->GetBaseZ()), *currentElement.element->AsTrack(), false); [[fallthrough]]; - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: - case TrackElemType::CableLiftHill: - case TrackElemType::EndStation: - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagUp60ToFlat: + case TrackElemType::cableLiftHill: + case TrackElemType::endStation: + case TrackElemType::up25ToFlat: + case TrackElemType::up60ToFlat: SetBrakeClosedMultiTile(*currentElement.element->AsTrack(), { currentElement.x, currentElement.y }, false); break; default: @@ -3273,7 +3264,7 @@ static Vehicle* VehicleCreateCar( vehicle->ride_subtype = ride.subtype; vehicle->vehicle_type = carEntryIndex; - vehicle->SubType = carIndex == 0 ? Vehicle::Type::Head : Vehicle::Type::Tail; + vehicle->SubType = carIndex == 0 ? Vehicle::Type::head : Vehicle::Type::tail; vehicle->var_44 = Numerics::ror32(carEntry.spacing, 10) & 0xFFFF; const auto halfSpacing = carEntry.spacing >> 1; @@ -3333,7 +3324,7 @@ static Vehicle* VehicleCreateCar( vehicle->SetTrackDirection(0); vehicle->SetTrackType(trackElement->GetTrackType()); vehicle->track_progress = 0; - vehicle->SetState(Vehicle::Status::MovingToEndOfStation); + vehicle->SetState(Vehicle::Status::movingToEndOfStation); vehicle->Flags = 0; CoordsXY chosenLoc; @@ -3404,9 +3395,9 @@ static Vehicle* VehicleCreateCar( { if (rtd.HasFlag(RtdFlag::vehicleIsIntegral)) { - if (rtd.StartTrackPiece != TrackElemType::FlatTrack1x4B) + if (rtd.StartTrackPiece != TrackElemType::flatTrack1x4B) { - if (rtd.StartTrackPiece != TrackElemType::FlatTrack1x4A) + if (rtd.StartTrackPiece != TrackElemType::flatTrack1x4A) { if (ride.getRideTypeDescriptor().specialType == RtdSpecialType::enterprise) { @@ -3441,11 +3432,11 @@ static Vehicle* VehicleCreateCar( vehicle->SetFlag(VehicleFlags::CarIsInverted); } } - vehicle->SetState(Vehicle::Status::MovingToEndOfStation); + vehicle->SetState(Vehicle::Status::movingToEndOfStation); if (ride.hasLifecycleFlag(RIDE_LIFECYCLE_REVERSED_TRAINS)) { - vehicle->SubType = carIndex == (ride.numCarsPerTrain - 1) ? Vehicle::Type::Head : Vehicle::Type::Tail; + vehicle->SubType = carIndex == (ride.numCarsPerTrain - 1) ? Vehicle::Type::head : Vehicle::Type::tail; vehicle->SetFlag(VehicleFlags::CarIsReversed); } } @@ -3574,14 +3565,14 @@ static void RidecreateVehiclesFindFirstBlock(const Ride& ride, CoordsXYE* outXYE auto trackType = trackElement->GetTrackType(); switch (trackType) { - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagUp60ToFlat: if (!trackElement->HasChain()) { break; } [[fallthrough]]; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: { TileElement* tileElement = MapGetTrackElementAtOfTypeSeq( { trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_z }, trackType, 0); @@ -3595,15 +3586,15 @@ static void RidecreateVehiclesFindFirstBlock(const Ride& ride, CoordsXYE* outXYE } break; } - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: + case TrackElemType::up25ToFlat: + case TrackElemType::up60ToFlat: if (!trackElement->HasChain()) { break; } [[fallthrough]]; - case TrackElemType::EndStation: - case TrackElemType::BlockBrakes: + case TrackElemType::endStation: + case TrackElemType::blockBrakes: *outXYElement = { trackPos, reinterpret_cast(trackElement) }; return; default: @@ -3790,10 +3781,10 @@ void Ride::moveTrainsToBlockBrakes(const CoordsXYZ& firstBlockPosition, TrackEle for (Vehicle* car = train; car != nullptr; car = getGameState().entities.GetEntity(car->next_vehicle_on_train)) { car->ClearFlag(VehicleFlags::CollisionDisabled); - car->SetState(Vehicle::Status::Travelling, car->sub_state); - if ((car->GetTrackType()) == TrackElemType::EndStation) + car->SetState(Vehicle::Status::travelling, car->sub_state); + if ((car->GetTrackType()) == TrackElemType::endStation) { - car->SetState(Vehicle::Status::MovingToEndOfStation, car->sub_state); + car->SetState(Vehicle::Status::movingToEndOfStation, car->sub_state); } } } @@ -3813,7 +3804,7 @@ static bool RideGetStationTile(const Ride& ride, CoordsXYE* output) if (trackStart.IsNull()) continue; - TileElement* tileElement = MapGetTrackElementAtOfType(trackStart, TrackElemType::EndStation); + TileElement* tileElement = MapGetTrackElementAtOfType(trackStart, TrackElemType::endStation); if (tileElement == nullptr) continue; @@ -3866,14 +3857,14 @@ static ResultWithMessage RideInitialiseCableLiftTrack(const Ride& ride, bool isA auto trackType = tileElement->AsTrack()->GetTrackType(); switch (trackType) { - case TrackElemType::Up25: - case TrackElemType::Up60: - case TrackElemType::FlatToUp25: - case TrackElemType::Up25ToFlat: - case TrackElemType::Up25ToUp60: - case TrackElemType::Up60ToUp25: - case TrackElemType::FlatToUp60LongBase: - case TrackElemType::Flat: + case TrackElemType::up25: + case TrackElemType::up60: + case TrackElemType::flatToUp25: + case TrackElemType::up25ToFlat: + case TrackElemType::up25ToUp60: + case TrackElemType::up60ToUp25: + case TrackElemType::flatToUp60LongBase: + case TrackElemType::flat: if (isApplying) { GetTrackElementOriginAndApplyChanges( @@ -3881,8 +3872,8 @@ static ResultWithMessage RideInitialiseCableLiftTrack(const Ride& ride, bool isA { TrackElementSetFlag::cableLiftOn }); } break; - case TrackElemType::EndStation: - case TrackElemType::BlockBrakes: + case TrackElemType::endStation: + case TrackElemType::blockBrakes: return { true }; default: return { false, STR_CABLE_LIFT_HILL_MUST_START_IMMEDIATELY_AFTER_STATION_OR_BLOCK_BRAKE }; @@ -4060,7 +4051,7 @@ TrackElement* Ride::getOriginElement(StationIndex stationIndex) const auto* trackElement = tileElement->AsTrack(); const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); - if (!(ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!ted.sequences[0].flags.has(SequenceFlag::trackOrigin)) continue; if (trackElement->GetRideIndex() == id) @@ -4347,7 +4338,7 @@ int32_t RideGetRandomColourPresetIndex(ride_type_t rideType) * * Based on rct2: 0x006B4776 */ -void Ride::setColourPreset(uint8_t index) +void Ride::setColourPreset(uint8_t trackColourPreset, uint8_t vehicleColourPreset) { const TrackColourPresetList* colourPresets = &getRideTypeDescriptor().ColourPresets; TrackColour colours = { COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK }; @@ -4357,13 +4348,16 @@ void Ride::setColourPreset(uint8_t index) const auto* rideEntry = GetRideEntryByIndex(subtype); if (rideEntry != nullptr && rideEntry->vehicle_preset_list->count > 0) { - auto list = rideEntry->vehicle_preset_list->list[0]; - colours = { list.Body, list.Trim, list.Tertiary }; + if (vehicleColourPreset < rideEntry->vehicle_preset_list->count) + { + auto list = rideEntry->vehicle_preset_list->list[vehicleColourPreset]; + colours = { list.Body, list.Trim, list.Tertiary }; + } } } - else if (index < colourPresets->count) + else if (trackColourPreset < colourPresets->count) { - colours = colourPresets->list[index]; + colours = colourPresets->list[trackColourPreset]; } for (size_t i = 0; i < std::size(trackColours); i++) { @@ -4711,7 +4705,7 @@ void RideFixBreakdown(Ride& ride, int32_t reliabilityIncreaseFactor) ride.lifecycleFlags &= ~RIDE_LIFECYCLE_BREAKDOWN_PENDING; ride.lifecycleFlags &= ~RIDE_LIFECYCLE_BROKEN_DOWN; ride.lifecycleFlags &= ~RIDE_LIFECYCLE_DUE_INSPECTION; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST | RIDE_INVALIDATE_RIDE_MAINTENANCE; + ride.windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list, RideInvalidateFlag::maintenance); if (ride.lifecycleFlags & RIDE_LIFECYCLE_ON_TRACK) { @@ -4720,7 +4714,7 @@ void RideFixBreakdown(Ride& ride, int32_t reliabilityIncreaseFactor) for (Vehicle* vehicle = getGameState().entities.GetEntity(ride.vehicles[i]); vehicle != nullptr; vehicle = getGameState().entities.GetEntity(vehicle->next_vehicle_on_train)) { - vehicle->ClearFlag(VehicleFlags::StoppedOnLift); + vehicle->ClearFlag(VehicleFlags::StoppedBySafetyCutOut); vehicle->ClearFlag(VehicleFlags::CarIsBroken); vehicle->ClearFlag(VehicleFlags::TrainIsBroken); } @@ -5052,7 +5046,7 @@ static int32_t RideGetTrackLength(const Ride& ride) trackType = tileElement->AsTrack()->GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!ted.sequences[0].flags.has(SequenceFlag::trackOrigin)) continue; if (tileElement->GetBaseZ() != trackStart.z) @@ -5196,7 +5190,7 @@ void Ride::updateMaxVehicles() } while (totalLength <= stationLength); if ((mode != RideMode::stationToStation && mode != RideMode::continuousCircuit) - || !(rtd.HasFlag(RtdFlag::allowMoreVehiclesThanStationFits))) + || !rtd.HasFlag(RtdFlag::allowMoreVehiclesThanStationFits)) { maxNumTrains = std::min(maxNumTrains, int32_t(OpenRCT2::Limits::kMaxTrainsPerRide)); } @@ -5297,18 +5291,6 @@ void Ride::setReversedTrains(bool reverseTrains) GameActions::Execute(&rideSetVehicleAction, getGameState()); } -void Ride::setToDefaultInspectionInterval() -{ - uint8_t defaultInspectionInterval = Config::Get().general.defaultInspectionInterval; - if (inspectionInterval != defaultInspectionInterval) - { - if (defaultInspectionInterval <= RIDE_INSPECTION_NEVER) - { - SetOperatingSetting(id, GameActions::RideSetSetting::InspectionInterval, defaultInspectionInterval); - } - } -} - /** * * rct2: 0x006B752C @@ -5383,6 +5365,8 @@ void Ride::renew() // Set build date to current date (so the ride is brand new) buildDate = GetDate().GetMonthsElapsed(); reliability = kRideInitialReliability; + std::fill(std::begin(downtimeHistory), std::end(downtimeHistory), 0); + downtime = 0; } RideClassification Ride::getClassification() const @@ -5646,7 +5630,7 @@ void DetermineRideEntranceAndExitLocations() } else { - station.Entrance.direction = static_cast(entranceElement->GetDirection()); + station.Entrance.direction = entranceElement->GetDirection(); } } @@ -5661,7 +5645,7 @@ void DetermineRideEntranceAndExitLocations() } else { - station.Exit.direction = static_cast(entranceElement->GetDirection()); + station.Exit.direction = entranceElement->GetDirection(); } } @@ -5712,8 +5696,7 @@ void DetermineRideEntranceAndExitLocations() } // Found our entrance - station.Entrance = { x, y, entranceElement->BaseHeight, - static_cast(entranceElement->GetDirection()) }; + station.Entrance = { x, y, entranceElement->BaseHeight, entranceElement->GetDirection() }; alreadyFoundEntrance = true; LOG_VERBOSE( @@ -5731,8 +5714,7 @@ void DetermineRideEntranceAndExitLocations() } // Found our exit - station.Exit = { x, y, entranceElement->BaseHeight, - static_cast(entranceElement->GetDirection()) }; + station.Exit = { x, y, entranceElement->BaseHeight, entranceElement->GetDirection() }; alreadyFoundExit = true; LOG_VERBOSE( diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 3bcef56b5e00..6773e881a9b5 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,13 +10,9 @@ #pragma once #include "../Limits.h" -#include "../actions/ResultWithMessage.h" #include "../core/BitSet.hpp" #include "../core/FixedPoint.hpp" #include "../core/FlagHolder.hpp" -#include "../localisation/Formatter.h" -#include "../object/MusicObject.h" -#include "../rct2/DATLimits.h" #include "../rct2/Limits.h" #include "RideColour.h" #include "RideEntry.h" @@ -35,6 +31,7 @@ struct IObjectManager; struct Ride; struct RideTypeDescriptor; struct Guest; +struct OpenRCT2String; struct Staff; struct Vehicle; struct RideObjectEntry; @@ -43,6 +40,7 @@ struct ResultWithMessage; namespace OpenRCT2 { class Formatter; + class MusicObject; class StationObject; struct TileElement; @@ -62,6 +60,39 @@ constexpr money64 kRideMaxPrice = 20.00_GBP; extern const StringId kRideInspectionIntervalNames[]; +enum class RideInspection : uint8_t +{ + every10Minutes, + every20Minutes, + every30Minutes, + every45Minutes, + everyHour, + every2Hours, + never, +}; + +// Flags used by ride->windowInvalidateFlags +enum class RideInvalidateFlag : uint8_t +{ + customers, + income, + main, + list, + operatingSettings, + maintenance, + music, + ratings, +}; +using RideInvalidateFlags = FlagHolder; + +enum class RideMeasurementFlag : uint8_t +{ + running, + unloading, + gForces +}; +using RideMeasurementFlags = FlagHolder; + enum class RideTestingFlag : uint8_t { sheltered, @@ -101,7 +132,7 @@ struct RideMeasurement { static constexpr size_t kMaxItems = 4800; - uint8_t flags{}; + RideMeasurementFlags flags{}; uint32_t last_use_tick{}; uint16_t num_items{}; uint16_t current_item{}; @@ -120,6 +151,15 @@ enum class RideClassification kioskOrFacility }; +enum class MechanicStatus : uint8_t +{ + undefined, + calling, + heading, + fixing, + hasFixedStationBrakes +}; + namespace OpenRCT2::ShelteredSectionsBits { constexpr uint8_t kNumShelteredSectionsMask = 0b00011111; @@ -231,8 +271,8 @@ struct Ride uint8_t satisfaction{}; uint8_t satisfactionTimeout{}; uint8_t satisfactionNext{}; - // Various flags stating whether a window needs to be refreshed - uint8_t windowInvalidateFlags{}; + // Various flags stating whether a ride window needs to be refreshed + RideInvalidateFlags windowInvalidateFlags{}; uint32_t totalCustomers{}; money64 totalProfit{}; uint8_t popularity{}; @@ -253,7 +293,7 @@ struct Ride EntityId raceWinner{}; uint32_t musicPosition{}; uint8_t breakdownReasonPending{}; - uint8_t mechanicStatus{}; + MechanicStatus mechanicStatus{}; EntityId mechanic{ EntityId::GetNull() }; StationIndex inspectionStation{ StationIndex::GetNull() }; uint8_t brokenTrain{}; @@ -273,7 +313,7 @@ struct Ride uint8_t unreliabilityFactor{}; // Range from [0, 100] uint8_t downtime{}; - uint8_t inspectionInterval{}; + RideInspection inspectionInterval{}; uint8_t lastInspection{}; uint8_t downtimeHistory[OpenRCT2::Limits::kDowntimeHistorySize]{}; uint32_t numPrimaryItemsSold{}; @@ -327,13 +367,14 @@ struct Ride // in the station array. e.g. if only slot 0 and 2 are in use, index 2 returns 2 instead of 3. StationIndex::UnderlyingType getStationNumber(StationIndex in) const; + void chainQueues() const; + private: void update(); void updateQueueLength(StationIndex stationIndex); ResultWithMessage createVehicles(const CoordsXYE& element, bool isApplying, bool isSimulating); void moveTrainsToBlockBrakes(const CoordsXYZ& firstBlockPosition, OpenRCT2::TrackElement& firstBlock); money64 calculateIncomePerHour() const; - void chainQueues() const; void constructMissingEntranceOrExit() const; ResultWithMessage changeStatusDoStationChecks(StationIndex& stationIndex); @@ -349,7 +390,6 @@ struct Ride void renew(); void remove(); void crash(uint8_t vehicleIndex); - void setToDefaultInspectionInterval(); void setRideEntry(OpenRCT2::ObjectEntryIndex entryIndex); void setNumTrains(int32_t newNumTrains); @@ -379,7 +419,7 @@ struct Ride RideMode getDefaultMode() const; - void setColourPreset(uint8_t index); + void setColourPreset(uint8_t trackColourPreset, uint8_t vehicleColourPreset); const RideObjectEntry* getRideEntry() const; @@ -749,15 +789,6 @@ enum BREAKDOWN_COUNT }; -enum -{ - RIDE_MECHANIC_STATUS_UNDEFINED, - RIDE_MECHANIC_STATUS_CALLING, - RIDE_MECHANIC_STATUS_HEADING, - RIDE_MECHANIC_STATUS_FIXING, - RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES -}; - enum { RIDE_DEPART_WAIT_FOR_LOAD_MASK = 7, @@ -779,37 +810,6 @@ enum WAIT_FOR_LOAD_COUNT, }; -enum -{ - RIDE_INSPECTION_EVERY_10_MINUTES, - RIDE_INSPECTION_EVERY_20_MINUTES, - RIDE_INSPECTION_EVERY_30_MINUTES, - RIDE_INSPECTION_EVERY_45_MINUTES, - RIDE_INSPECTION_EVERY_HOUR, - RIDE_INSPECTION_EVERY_2_HOURS, - RIDE_INSPECTION_NEVER -}; - -// Flags used by ride->windowInvalidateFlags -enum -{ - RIDE_INVALIDATE_RIDE_CUSTOMER = 1, - RIDE_INVALIDATE_RIDE_INCOME = 1 << 1, - RIDE_INVALIDATE_RIDE_MAIN = 1 << 2, - RIDE_INVALIDATE_RIDE_LIST = 1 << 3, - RIDE_INVALIDATE_RIDE_OPERATING = 1 << 4, - RIDE_INVALIDATE_RIDE_MAINTENANCE = 1 << 5, - RIDE_INVALIDATE_RIDE_MUSIC = 1 << 6, - RIDE_INVALIDATE_RIDE_RATINGS = 1 << 7, -}; - -enum -{ - RIDE_MEASUREMENT_FLAG_RUNNING = 1 << 0, - RIDE_MEASUREMENT_FLAG_UNLOADING = 1 << 1, - RIDE_MEASUREMENT_FLAG_G_FORCES = 1 << 2 -}; - enum { RIDE_CRASH_TYPE_NONE = 0, diff --git a/src/openrct2/ride/RideAudio.cpp b/src/openrct2/ride/RideAudio.cpp index b43e53e5283d..12f054a8de4c 100644 --- a/src/openrct2/ride/RideAudio.cpp +++ b/src/openrct2/ride/RideAudio.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/RideAudio.h b/src/openrct2/ride/RideAudio.h index 45d170fe150a..a4bf8d11639d 100644 --- a/src/openrct2/ride/RideAudio.h +++ b/src/openrct2/ride/RideAudio.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/RideColour.h b/src/openrct2/ride/RideColour.h index 5f0164d889b6..e4b2b9c47c15 100644 --- a/src/openrct2/ride/RideColour.h +++ b/src/openrct2/ride/RideColour.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 589a0899d3fe..ddef55b1feb5 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../Context.h" #include "../GameState.h" #include "../Input.h" +#include "../actions/ResultWithMessage.h" #include "../actions/RideEntranceExitRemoveAction.h" #include "../actions/RideSetSettingAction.h" #include "../actions/RideSetStatusAction.h" @@ -24,7 +25,6 @@ #include "../network/Network.h" #include "../ui/WindowManager.h" #include "../windows/Intent.h" -#include "../world/Banner.h" #include "../world/Climate.h" #include "../world/Entrance.h" #include "../world/Footpath.h" @@ -50,6 +50,8 @@ using namespace OpenRCT2; using namespace OpenRCT2::TrackMetaData; +using OpenRCT2::GameActions::CommandFlag; +using OpenRCT2::GameActions::CommandFlags; money64 _currentTrackPrice; @@ -222,7 +224,7 @@ void RideClearForConstruction(Ride& ride) ride.measurement = {}; ride.lifecycleFlags &= ~(RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride.windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); // Open circuit rides will go directly into building mode (creating ghosts) where it would normally clear the stats, // however this causes desyncs since it's directly run from the window and other clients would not get it. @@ -342,7 +344,7 @@ void Ride::removePeeps() } numRiders = 0; slideInUse = 0; - windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN; + windowInvalidateFlags.set(RideInvalidateFlag::main); } void RideClearBlockedTiles(const Ride& ride) @@ -533,7 +535,6 @@ void RideConstructionInvalidateCurrentTrack() { _currentTrackSelectionFlags.unset(TrackSelectionFlag::arrow); gMapSelectFlags.unset(MapSelectFlag::enableArrow); - MapInvalidateTileFull(_currentTrackBegin); } RideConstructionRemoveGhosts(); break; @@ -555,20 +556,20 @@ static void ride_construction_reset_current_piece() if (rtd.HasFlag(RtdFlag::hasTrack) || ride->numStations == 0) { _currentlySelectedTrack = rtd.StartTrackPiece; - _currentTrackPitchEnd = TrackPitch::None; - _currentTrackRollEnd = TrackRoll::None; + _currentTrackPitchEnd = TrackPitch::none; + _currentTrackRollEnd = TrackRoll::none; _currentTrackHasLiftHill = false; _currentTrackAlternative.clearAll(); if (rtd.HasFlag(RtdFlag::startConstructionInverted)) { _currentTrackAlternative.set(AlternativeTrackFlag::inverted); } - _previousTrackPitchEnd = TrackPitch::None; - _previousTrackRollEnd = TrackRoll::None; + _previousTrackPitchEnd = TrackPitch::none; + _previousTrackRollEnd = TrackRoll::none; } else { - _currentlySelectedTrack = TrackElemType::None; + _currentlySelectedTrack = TrackElemType::none; _rideConstructionState = RideConstructionState::State0; } } @@ -633,9 +634,9 @@ void RideConstructionSetDefaultNextPiece() // Set track banking if (rtd.HasFlag(RtdFlag::hasInvertedVariant)) { - if (bank == TrackRoll::UpsideDown) + if (bank == TrackRoll::upsideDown) { - bank = TrackRoll::None; + bank = TrackRoll::none; _currentTrackAlternative.flip(AlternativeTrackFlag::inverted); } } @@ -648,7 +649,7 @@ void RideConstructionSetDefaultNextPiece() _currentTrackPitchEnd = slope; _previousTrackPitchEnd = slope; _currentTrackHasLiftHill = trackElement->HasChain() - && ((slope != TrackPitch::Down25 && slope != TrackPitch::Down60) + && ((slope != TrackPitch::down25 && slope != TrackPitch::down60) || getGameState().cheats.enableChainLiftOnAllTrack); if (TrackTypeHasSpeedSetting(trackElement->GetTrackType())) @@ -692,9 +693,9 @@ void RideConstructionSetDefaultNextPiece() // Set track banking if (rtd.HasFlag(RtdFlag::hasInvertedVariant)) { - if (bank == TrackRoll::UpsideDown) + if (bank == TrackRoll::upsideDown) { - bank = TrackRoll::None; + bank = TrackRoll::none; _currentTrackAlternative.flip(AlternativeTrackFlag::inverted); } } @@ -888,7 +889,7 @@ static bool ride_modify_entrance_or_exit(const CoordsXYE& tileElement) gRideEntranceExitPlaceType = entranceType; gRideEntranceExitPlaceRideIndex = rideIndex; gRideEntranceExitPlaceStationIndex = stationIndex; - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); if (_rideConstructionState != RideConstructionState::EntranceExit) { gRideEntranceExitPlacePreviousRideConstructionState = _rideConstructionState; @@ -1079,19 +1080,19 @@ int32_t RideInitialiseConstructionWindow(Ride& ride) w = ride_create_or_find_construction_window(ride.id); ToolSet(*w, WC_RIDE_CONSTRUCTION__WIDX_CONSTRUCT, Tool::crosshair); - gInputFlags.set(InputFlag::unk6); + gInputFlags.set(InputFlag::allowRightMouseRemoval); _currentlySelectedTrack = ride.getRideTypeDescriptor().StartTrackPiece; - _currentTrackPitchEnd = TrackPitch::None; - _currentTrackRollEnd = TrackRoll::None; + _currentTrackPitchEnd = TrackPitch::none; + _currentTrackRollEnd = TrackRoll::none; _currentTrackHasLiftHill = false; _currentTrackAlternative.clearAll(); if (ride.getRideTypeDescriptor().HasFlag(RtdFlag::startConstructionInverted)) _currentTrackAlternative.set(AlternativeTrackFlag::inverted); - _previousTrackRollEnd = TrackRoll::None; - _previousTrackPitchEnd = TrackPitch::None; + _previousTrackRollEnd = TrackRoll::none; + _previousTrackPitchEnd = TrackPitch::none; _currentTrackPieceDirection = 0; _rideConstructionState = RideConstructionState::Place; @@ -1132,11 +1133,11 @@ money64 RideGetRefundPrice(const Ride& ride) auto trackRemoveAction = GameActions::TrackRemoveAction( trackElement.element->AsTrack()->GetTrackType(), trackElement.element->AsTrack()->GetSequenceIndex(), { trackElement.x, trackElement.y, trackElement.element->GetBaseZ(), direction }); - trackRemoveAction.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + trackRemoveAction.SetFlags(CommandFlag::allowDuringPaused); auto res = GameActions::Query(&trackRemoveAction, getGameState()); - cost += res.Cost; + cost += res.cost; if (!TrackBlockGetNext(&trackElement, &trackElement, nullptr, nullptr)) { @@ -1163,18 +1164,18 @@ money64 SetOperatingSetting(RideId rideId, GameActions::RideSetSetting setting, { auto rideSetSetting = GameActions::RideSetSettingAction(rideId, setting, value); auto res = GameActions::Execute(&rideSetSetting, getGameState()); - return res.Error == GameActions::Status::Ok ? 0 : kMoney64Undefined; + return res.error == GameActions::Status::ok ? 0 : kMoney64Undefined; } -money64 SetOperatingSettingNested(RideId rideId, GameActions::RideSetSetting setting, uint8_t value, uint8_t flags) +money64 SetOperatingSettingNested(RideId rideId, GameActions::RideSetSetting setting, uint8_t value, CommandFlags flags) { auto rideSetSetting = GameActions::RideSetSettingAction(rideId, setting, value); rideSetSetting.SetFlags(flags); auto& gameState = getGameState(); - auto res = flags & GAME_COMMAND_FLAG_APPLY ? GameActions::ExecuteNested(&rideSetSetting, gameState) - : GameActions::QueryNested(&rideSetSetting, gameState); - return res.Error == GameActions::Status::Ok ? 0 : kMoney64Undefined; + auto res = flags.has(CommandFlag::apply) ? GameActions::ExecuteNested(&rideSetSetting, gameState) + : GameActions::QueryNested(&rideSetSetting, gameState); + return res.error == GameActions::Status::ok ? 0 : kMoney64Undefined; } /** @@ -1224,7 +1225,7 @@ void Ride::validateStations() const auto& ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); // keep searching for a station piece (coaster station, tower ride base, shops, and flat ride base) - if (!(ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!ted.sequences[0].flags.has(SequenceFlag::trackOrigin)) continue; trackFound = true; @@ -1274,7 +1275,7 @@ void Ride::validateStations() continue; const auto& ted2 = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (!(ted2.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!ted2.sequences[0].flags.has(SequenceFlag::trackOrigin)) continue; trackFound = true; @@ -1372,7 +1373,7 @@ void Ride::validateStations() // get the StationIndex for the station StationIndex stationId = StationIndex::FromUnderlying(0); - if (trackType != TrackElemType::Maze) + if (trackType != TrackElemType::maze) { uint8_t trackSequence = trackElement->AsTrack()->GetSequenceIndex(); @@ -1381,7 +1382,8 @@ void Ride::validateStations() // if the ride entrance is not on a valid side, remove it const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.sequences[trackSequence].flags & (1 << direction))) + auto connectionSides = ted.sequences[trackSequence].getEntranceConnectionSides(); + if (!(connectionSides & (1 << direction))) { continue; } @@ -1538,5 +1540,5 @@ OpenRCT2::TrackElemType GetTrackTypeFromCurve( return trackDescriptor->trackElement; } - return TrackElemType::None; + return TrackElemType::none; } diff --git a/src/openrct2/ride/RideConstruction.h b/src/openrct2/ride/RideConstruction.h index 57541a6c682a..ba42cf52174f 100644 --- a/src/openrct2/ride/RideConstruction.h +++ b/src/openrct2/ride/RideConstruction.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,6 +10,7 @@ #pragma once #include "../Identifiers.h" +#include "../actions/CommandFlag.h" #include "../core/FlagHolder.hpp" #include "../core/Money.hpp" #include "../world/Location.hpp" @@ -138,7 +139,8 @@ void RideSelectPreviousSection(); bool RideModify(const CoordsXYE& input); money64 SetOperatingSetting(RideId rideId, OpenRCT2::GameActions::RideSetSetting setting, uint8_t value); -money64 SetOperatingSettingNested(RideId rideId, OpenRCT2::GameActions::RideSetSetting setting, uint8_t value, uint8_t flags); +money64 SetOperatingSettingNested( + RideId rideId, OpenRCT2::GameActions::RideSetSetting setting, uint8_t value, OpenRCT2::GameActions::CommandFlags flags); bool RideSelectBackwardsFromFront(); bool RideSelectForwardsFromBack(); diff --git a/src/openrct2/ride/RideData.cpp b/src/openrct2/ride/RideData.cpp index 8be9c9abbb19..2bbd082993f5 100644 --- a/src/openrct2/ride/RideData.cpp +++ b/src/openrct2/ride/RideData.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index d76afc8bfd51..1e28b33f0a3a 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -296,7 +296,7 @@ struct TrackDrawerEntry // or because they are not realistic for the ride type (e.g. LIM boosters in Mini Roller Coasters). RideTrackGroups extraTrackGroups{}; - ImageIndex icon = kSpriteIdNull; + ImageIndex icon = kImageIndexUndefined; StringId tooltip = kStringIdNone; void GetAvailableTrackGroups(RideTrackGroups& res) const; @@ -618,7 +618,7 @@ extern const StringId kRideModeNames[EnumValue(RideMode::count)]; constexpr RideTypeDescriptor kDummyRTD = { .Category = RideCategory::none, - .StartTrackPiece = OpenRCT2::TrackElemType::EndStation, + .StartTrackPiece = OpenRCT2::TrackElemType::endStation, .TrackPaintFunctions = {}, .InvertedTrackPaintFunctions = {}, .Flags = 0, @@ -642,7 +642,7 @@ constexpr RideTypeDescriptor kDummyRTD = .PhotoItem = ShopItem::photo, .BonusValue = 0, .ColourPresets = kDefaultFlatRideColourPreset, - .ColourPreview = { kSpriteIdNull, kSpriteIdNull }, + .ColourPreview = { kImageIndexUndefined, kImageIndexUndefined }, .ColourKey = RideColourKey::Ride, .Name = "invalid", .RatingsData = diff --git a/src/openrct2/ride/RideEntry.h b/src/openrct2/ride/RideEntry.h index f2ce9ddea0c2..980cafb76dc9 100644 --- a/src/openrct2/ride/RideEntry.h +++ b/src/openrct2/ride/RideEntry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/RideManager.cpp b/src/openrct2/ride/RideManager.cpp index 55ed3e0237ff..5105b571bf46 100644 --- a/src/openrct2/ride/RideManager.cpp +++ b/src/openrct2/ride/RideManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/RideManager.hpp b/src/openrct2/ride/RideManager.hpp index cd6b1756eb58..fd680c9d2c16 100644 --- a/src/openrct2/ride/RideManager.hpp +++ b/src/openrct2/ride/RideManager.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index 23714254c87f..158b210de518 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include "../Context.h" #include "../GameState.h" #include "../OpenRCT2.h" +#include "../core/Guard.hpp" #include "../core/Money.hpp" #include "../core/UnitConversion.h" #include "../profiling/Profiling.h" @@ -385,10 +386,10 @@ static void ride_ratings_update_state_2(RideRating::UpdateState& state) continue; } - if (trackType == TrackElemType::None + if (trackType == TrackElemType::none || (tileElement->AsTrack()->GetSequenceIndex() == 0 && trackType == tileElement->AsTrack()->GetTrackType())) { - if (trackType == TrackElemType::EndStation) + if (trackType == TrackElemType::endStation) { auto entranceIndex = tileElement->AsTrack()->GetStationIndex(); state.StationFlags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; @@ -490,7 +491,7 @@ static void ride_ratings_update_state_5(RideRating::UpdateState& state) continue; } - if (trackType == TrackElemType::None || trackType == tileElement->AsTrack()->GetTrackType()) + if (trackType == TrackElemType::none || trackType == tileElement->AsTrack()->GetTrackType()) { ride_ratings_score_close_proximity(state, tileElement); @@ -550,7 +551,7 @@ static void ride_ratings_begin_proximity_loop(RideRating::UpdateState& state) auto location = station.GetStart(); state.Proximity = location; - state.ProximityTrackType = TrackElemType::None; + state.ProximityTrackType = TrackElemType::none; state.ProximityStart = location; return; } @@ -659,8 +660,8 @@ static void ride_ratings_score_close_proximity_loops_helper(RideRating::UpdateSt if (zDiff >= 0 && zDiff <= 16) { proximity_score_increment(state, PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP); - if (tileElement->AsTrack()->GetTrackType() == TrackElemType::LeftVerticalLoop - || tileElement->AsTrack()->GetTrackType() == TrackElemType::RightVerticalLoop) + if (tileElement->AsTrack()->GetTrackType() == TrackElemType::leftVerticalLoop + || tileElement->AsTrack()->GetTrackType() == TrackElemType::rightVerticalLoop) { proximity_score_increment(state, PROXIMITY_INTERSECTING_VERTICAL_LOOP); } @@ -677,7 +678,7 @@ static void ride_ratings_score_close_proximity_loops_helper(RideRating::UpdateSt static void ride_ratings_score_close_proximity_loops(RideRating::UpdateState& state, TileElement* inputTileElement) { auto trackType = inputTileElement->AsTrack()->GetTrackType(); - if (trackType == TrackElemType::LeftVerticalLoop || trackType == TrackElemType::RightVerticalLoop) + if (trackType == TrackElemType::leftVerticalLoop || trackType == TrackElemType::rightVerticalLoop) { ride_ratings_score_close_proximity_loops_helper(state, { state.Proximity, inputTileElement }); @@ -771,7 +772,7 @@ static void ride_ratings_score_close_proximity(RideRating::UpdateState& state, T case TileElementType::Track: { auto trackType = tileElement->AsTrack()->GetTrackType(); - if (trackType == TrackElemType::LeftVerticalLoop || trackType == TrackElemType::RightVerticalLoop) + if (trackType == TrackElemType::leftVerticalLoop || trackType == TrackElemType::rightVerticalLoop) { int32_t sequence = tileElement->AsTrack()->GetSequenceIndex(); if (sequence == 3 || sequence == 6) @@ -865,11 +866,11 @@ static void ride_ratings_score_close_proximity(RideRating::UpdateState& state, T switch (state.ProximityTrackType) { - case TrackElemType::Brakes: + case TrackElemType::brakes: state.AmountOfBrakes++; break; - case TrackElemType::LeftReverser: - case TrackElemType::RightReverser: + case TrackElemType::leftReverser: + case TrackElemType::rightReverser: state.AmountOfReversers++; break; default: @@ -893,7 +894,7 @@ static void RideRatingsCalculate(RideRating::UpdateState& state, Ride& ride) break; case RatingsCalculationType::Stall: ride.upkeepCost = RideComputeUpkeep(state, ride); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME; + ride.windowInvalidateFlags.set(RideInvalidateFlag::income); // Exit ratings return; } @@ -1056,11 +1057,11 @@ static void RideRatingsCalculate(RideRating::UpdateState& state, Ride& ride) if (ride.ratings != ratings) { ride.ratings = ratings; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_RATINGS; + ride.windowInvalidateFlags.set(RideInvalidateFlag::ratings); } ride.upkeepCost = RideComputeUpkeep(state, ride); - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME; + ride.windowInvalidateFlags.set(RideInvalidateFlag::income); #ifdef ORIGINAL_RATINGS if (!ride.ratings.isNull()) diff --git a/src/openrct2/ride/RideRatings.h b/src/openrct2/ride/RideRatings.h index 51046cec9c79..c25e3b0676ea 100644 --- a/src/openrct2/ride/RideRatings.h +++ b/src/openrct2/ride/RideRatings.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/RideStringIds.h b/src/openrct2/ride/RideStringIds.h index 13bcb7f2ea49..8921b37d13ac 100644 --- a/src/openrct2/ride/RideStringIds.h +++ b/src/openrct2/ride/RideStringIds.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/RideTypes.h b/src/openrct2/ride/RideTypes.h index 241f3d81e75e..48bfd78045b7 100644 --- a/src/openrct2/ride/RideTypes.h +++ b/src/openrct2/ride/RideTypes.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,6 +21,12 @@ struct Ride; using ride_type_t = uint16_t; static ride_type_t constexpr kRideTypeNull = 0xFF; +struct RideFilters +{ + uint8_t category[2]; + ride_type_t ride_type; +}; + /** * Couples a ride type and subtype together. */ diff --git a/src/openrct2/ride/ShopItem.cpp b/src/openrct2/ride/ShopItem.cpp index e7d64ed010c3..53499ce110d7 100644 --- a/src/openrct2/ride/ShopItem.cpp +++ b/src/openrct2/ride/ShopItem.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/ShopItem.h b/src/openrct2/ride/ShopItem.h index 84b9581b4db4..d9744579a6e7 100644 --- a/src/openrct2/ride/ShopItem.h +++ b/src/openrct2/ride/ShopItem.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/Station.cpp b/src/openrct2/ride/Station.cpp index 512ca6a13be8..23f3f8861f1b 100644 --- a/src/openrct2/ride/Station.cpp +++ b/src/openrct2/ride/Station.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -135,7 +135,7 @@ static void RideUpdateStationDodgems(Ride& ride, StationIndex stationIndex) if (vehicle == nullptr) continue; - if (vehicle->status != Vehicle::Status::WaitingToDepart) + if (vehicle->status != Vehicle::Status::waitingToDepart) { station.Depart &= ~kStationDepartFlag; return; @@ -145,7 +145,7 @@ static void RideUpdateStationDodgems(Ride& ride, StationIndex stationIndex) // Begin the match ride.lifecycleFlags |= RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING; station.Depart |= kStationDepartFlag; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride.windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); } } @@ -212,7 +212,7 @@ static void RideUpdateStationRace(Ride& ride, StationIndex stationIndex) if (vehicle == nullptr) continue; - if (vehicle->status != Vehicle::Status::WaitingToDepart && vehicle->NumLaps >= numLaps) + if (vehicle->status != Vehicle::Status::waitingToDepart && vehicle->NumLaps >= numLaps) { // Found a winner if (vehicle->num_peeps != 0) @@ -221,7 +221,7 @@ static void RideUpdateStationRace(Ride& ride, StationIndex stationIndex) if (peep != nullptr) { ride.raceWinner = peep->Id; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride.windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); } } @@ -248,7 +248,7 @@ static void RideUpdateStationRace(Ride& ride, StationIndex stationIndex) if (vehicle == nullptr) continue; - if (vehicle->status != Vehicle::Status::WaitingToDepart && vehicle->status != Vehicle::Status::Departing) + if (vehicle->status != Vehicle::Status::waitingToDepart && vehicle->status != Vehicle::Status::departing) { if (station.Depart & kStationDepartFlag) { @@ -267,7 +267,7 @@ static void RideUpdateStationRace(Ride& ride, StationIndex stationIndex) station.Depart |= kStationDepartFlag; RideInvalidateStationStart(ride, stationIndex, true); } - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + ride.windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); } } diff --git a/src/openrct2/ride/Station.h b/src/openrct2/ride/Station.h index 03beed4b68ee..a36b1d0d76b1 100644 --- a/src/openrct2/ride/Station.h +++ b/src/openrct2/ride/Station.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/Track.cpp b/src/openrct2/ride/Track.cpp index e3e8aa1b56e2..f0539ee29d1f 100644 --- a/src/openrct2/ride/Track.cpp +++ b/src/openrct2/ride/Track.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include "../Diagnostic.h" #include "../Game.h" #include "../GameState.h" +#include "../actions/ResultWithMessage.h" #include "../audio/Audio.h" #include "../config/Config.h" #include "../interface/Viewport.h" @@ -40,6 +41,8 @@ using namespace OpenRCT2; using namespace OpenRCT2::TrackMetaData; +using OpenRCT2::GameActions::CommandFlag; +using OpenRCT2::GameActions::CommandFlags; PitchAndRoll TrackPitchAndRollStart(OpenRCT2::TrackElemType trackType) { @@ -114,7 +117,7 @@ static void ride_remove_station(Ride& ride, const CoordsXYZ& location) * * rct2: 0x006C4D89 */ -ResultWithMessage TrackAddStationElement(CoordsXYZD loc, RideId rideIndex, int32_t flags, bool fromTrackDesign) +ResultWithMessage TrackAddStationElement(CoordsXYZD loc, RideId rideIndex, CommandFlags flags, bool fromTrackDesign) { auto ride = GetRide(rideIndex); if (ride == nullptr) @@ -130,7 +133,7 @@ ResultWithMessage TrackAddStationElement(CoordsXYZD loc, RideId rideIndex, int32 { return { false, STR_NO_MORE_STATIONS_ALLOWED_ON_THIS_RIDE }; } - if (flags & GAME_COMMAND_FLAG_APPLY) + if (flags.has(CommandFlag::apply)) { auto stationIndex = RideGetFirstEmptyStationStart(*ride); assert(!stationIndex.IsNull()); @@ -157,9 +160,9 @@ ResultWithMessage TrackAddStationElement(CoordsXYZD loc, RideId rideIndex, int32 stationElement = find_station_element(loc, rideIndex); if (stationElement != nullptr) { - if (stationElement->AsTrack()->GetTrackType() == TrackElemType::EndStation) + if (stationElement->AsTrack()->GetTrackType() == TrackElemType::endStation) { - if (flags & GAME_COMMAND_FLAG_APPLY) + if (flags.has(CommandFlag::apply)) { ride_remove_station(*ride, loc); } @@ -179,9 +182,9 @@ ResultWithMessage TrackAddStationElement(CoordsXYZD loc, RideId rideIndex, int32 stationElement = find_station_element(loc, rideIndex); if (stationElement != nullptr) { - if (stationElement->AsTrack()->GetTrackType() == TrackElemType::EndStation) + if (stationElement->AsTrack()->GetTrackType() == TrackElemType::endStation) { - if (flags & GAME_COMMAND_FLAG_APPLY) + if (flags.has(CommandFlag::apply)) { ride_remove_station(*ride, loc); } @@ -205,7 +208,7 @@ ResultWithMessage TrackAddStationElement(CoordsXYZD loc, RideId rideIndex, int32 return { false, STR_STATION_PLATFORM_TOO_LONG }; } - if (flags & GAME_COMMAND_FLAG_APPLY) + if (flags.has(CommandFlag::apply)) { loc = { stationFrontLoc, loc.z, loc.direction }; @@ -235,15 +238,15 @@ ResultWithMessage TrackAddStationElement(CoordsXYZD loc, RideId rideIndex, int32 ride->numStations++; } - targetTrackType = TrackElemType::EndStation; + targetTrackType = TrackElemType::endStation; } else if (stationBackLoc == loc) { - targetTrackType = TrackElemType::BeginStation; + targetTrackType = TrackElemType::beginStation; } else { - targetTrackType = TrackElemType::MiddleStation; + targetTrackType = TrackElemType::middleStation; } stationElement->AsTrack()->SetTrackType(targetTrackType); @@ -264,7 +267,7 @@ ResultWithMessage TrackAddStationElement(CoordsXYZD loc, RideId rideIndex, int32 * * rct2: 0x006C494B */ -ResultWithMessage TrackRemoveStationElement(const CoordsXYZD& loc, RideId rideIndex, int32_t flags) +ResultWithMessage TrackRemoveStationElement(const CoordsXYZD& loc, RideId rideIndex, CommandFlags flags) { auto ride = GetRide(rideIndex); if (ride == nullptr) @@ -281,7 +284,7 @@ ResultWithMessage TrackRemoveStationElement(const CoordsXYZD& loc, RideId rideIn TileElement* tileElement = MapGetTrackElementAtWithDirectionFromRide(loc, rideIndex); if (tileElement != nullptr) { - if (flags & GAME_COMMAND_FLAG_APPLY) + if (flags.has(CommandFlag::apply)) { ride_remove_station(*ride, loc); } @@ -295,9 +298,9 @@ ResultWithMessage TrackRemoveStationElement(const CoordsXYZD& loc, RideId rideIn CoordsXYZD currentLoc = stationBackLoc; while ((stationElement = find_station_element(currentLoc, rideIndex)) != nullptr) { - if (stationElement->AsTrack()->GetTrackType() == TrackElemType::EndStation) + if (stationElement->AsTrack()->GetTrackType() == TrackElemType::endStation) { - if (flags & GAME_COMMAND_FLAG_APPLY) + if (flags.has(CommandFlag::apply)) { ride_remove_station(*ride, currentLoc); } @@ -318,9 +321,9 @@ ResultWithMessage TrackRemoveStationElement(const CoordsXYZD& loc, RideId rideIn stationElement = find_station_element(currentLoc, rideIndex); if (stationElement != nullptr) { - if (stationElement->AsTrack()->GetTrackType() == TrackElemType::EndStation) + if (stationElement->AsTrack()->GetTrackType() == TrackElemType::endStation) { - if (flags & GAME_COMMAND_FLAG_APPLY) + if (flags.has(CommandFlag::apply)) { ride_remove_station(*ride, currentLoc); } @@ -330,7 +333,7 @@ ResultWithMessage TrackRemoveStationElement(const CoordsXYZD& loc, RideId rideIn } } while (stationElement != nullptr); - if (!(flags & GAME_COMMAND_FLAG_APPLY)) + if (!flags.has(CommandFlag::apply)) { if ((removeLoc != stationBackLoc) && (removeLoc != stationFrontLoc) && ride->numStations >= Limits::kMaxStationsPerRide) { @@ -370,23 +373,23 @@ ResultWithMessage TrackRemoveStationElement(const CoordsXYZD& loc, RideId rideIn } stationLength = 0; - targetTrackType = TrackElemType::EndStation; + targetTrackType = TrackElemType::endStation; } else { if (currentLoc - CoordsDirectionDelta[currentLoc.direction] == removeLoc) { - targetTrackType = TrackElemType::BeginStation; + targetTrackType = TrackElemType::beginStation; } else { if (currentLoc == stationBackLoc) { - targetTrackType = TrackElemType::BeginStation; + targetTrackType = TrackElemType::beginStation; } else { - targetTrackType = TrackElemType::MiddleStation; + targetTrackType = TrackElemType::middleStation; } } } @@ -591,13 +594,13 @@ TrackRoll TrackGetActualBank2(ride_type_t rideType, bool isInverted, TrackRoll b { if (isInverted) { - if (bank == TrackRoll::None) + if (bank == TrackRoll::none) { - bank = TrackRoll::UpsideDown; + bank = TrackRoll::upsideDown; } - else if (bank == TrackRoll::UpsideDown) + else if (bank == TrackRoll::upsideDown) { - bank = TrackRoll::None; + bank = TrackRoll::none; } } } @@ -621,9 +624,9 @@ bool TrackTypeIsStation(OpenRCT2::TrackElemType trackType) { switch (trackType) { - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: return true; default: return false; @@ -634,10 +637,10 @@ bool TrackTypeIsBrakes(OpenRCT2::TrackElemType trackType) { switch (trackType) { - case TrackElemType::Brakes: - case TrackElemType::DiagBrakes: - case TrackElemType::Down25Brakes: - case TrackElemType::DiagDown25Brakes: + case TrackElemType::brakes: + case TrackElemType::diagBrakes: + case TrackElemType::down25Brakes: + case TrackElemType::diagDown25Brakes: return true; default: return false; @@ -646,15 +649,15 @@ bool TrackTypeIsBrakes(OpenRCT2::TrackElemType trackType) bool TrackTypeIsBlockBrakes(OpenRCT2::TrackElemType trackType) { - return (trackType == TrackElemType::BlockBrakes) || (trackType == TrackElemType::DiagBlockBrakes); + return (trackType == TrackElemType::blockBrakes) || (trackType == TrackElemType::diagBlockBrakes); } bool TrackTypeIsBooster(OpenRCT2::TrackElemType trackType) { switch (trackType) { - case TrackElemType::Booster: - case TrackElemType::DiagBooster: + case TrackElemType::booster: + case TrackElemType::diagBooster: return true; default: return false; @@ -665,25 +668,25 @@ bool TrackElementIsCovered(OpenRCT2::TrackElemType trackElementType) { switch (trackElementType) { - case TrackElemType::FlatCovered: - case TrackElemType::Up25Covered: - case TrackElemType::Up60Covered: - case TrackElemType::FlatToUp25Covered: - case TrackElemType::Up25ToUp60Covered: - case TrackElemType::Up60ToUp25Covered: - case TrackElemType::Up25ToFlatCovered: - case TrackElemType::Down25Covered: - case TrackElemType::Down60Covered: - case TrackElemType::FlatToDown25Covered: - case TrackElemType::Down25ToDown60Covered: - case TrackElemType::Down60ToDown25Covered: - case TrackElemType::Down25ToFlatCovered: - case TrackElemType::LeftQuarterTurn5TilesCovered: - case TrackElemType::RightQuarterTurn5TilesCovered: - case TrackElemType::SBendLeftCovered: - case TrackElemType::SBendRightCovered: - case TrackElemType::LeftQuarterTurn3TilesCovered: - case TrackElemType::RightQuarterTurn3TilesCovered: + case TrackElemType::flatCovered: + case TrackElemType::up25Covered: + case TrackElemType::up60Covered: + case TrackElemType::flatToUp25Covered: + case TrackElemType::up25ToUp60Covered: + case TrackElemType::up60ToUp25Covered: + case TrackElemType::up25ToFlatCovered: + case TrackElemType::down25Covered: + case TrackElemType::down60Covered: + case TrackElemType::flatToDown25Covered: + case TrackElemType::down25ToDown60Covered: + case TrackElemType::down60ToDown25Covered: + case TrackElemType::down25ToFlatCovered: + case TrackElemType::leftQuarterTurn5TilesCovered: + case TrackElemType::rightQuarterTurn5TilesCovered: + case TrackElemType::sBendLeftCovered: + case TrackElemType::sBendRightCovered: + case TrackElemType::leftQuarterTurn3TilesCovered: + case TrackElemType::rightQuarterTurn3TilesCovered: return true; default: return false; @@ -694,44 +697,44 @@ OpenRCT2::TrackElemType UncoverTrackElement(OpenRCT2::TrackElemType trackElement { switch (trackElementType) { - case TrackElemType::FlatCovered: - return TrackElemType::Flat; - case TrackElemType::Up25Covered: - return TrackElemType::Up25; - case TrackElemType::Up60Covered: - return TrackElemType::Up60; - case TrackElemType::FlatToUp25Covered: - return TrackElemType::FlatToUp25; - case TrackElemType::Up25ToUp60Covered: - return TrackElemType::Up25ToUp60; - case TrackElemType::Up60ToUp25Covered: - return TrackElemType::Up60ToUp25; - case TrackElemType::Up25ToFlatCovered: - return TrackElemType::Up25ToFlat; - case TrackElemType::Down25Covered: - return TrackElemType::Down25; - case TrackElemType::Down60Covered: - return TrackElemType::Down60; - case TrackElemType::FlatToDown25Covered: - return TrackElemType::FlatToDown25; - case TrackElemType::Down25ToDown60Covered: - return TrackElemType::Down25ToDown60; - case TrackElemType::Down60ToDown25Covered: - return TrackElemType::Down60ToDown25; - case TrackElemType::Down25ToFlatCovered: - return TrackElemType::Down25ToFlat; - case TrackElemType::LeftQuarterTurn5TilesCovered: - return TrackElemType::LeftQuarterTurn5Tiles; - case TrackElemType::RightQuarterTurn5TilesCovered: - return TrackElemType::RightQuarterTurn5Tiles; - case TrackElemType::SBendLeftCovered: - return TrackElemType::SBendLeft; - case TrackElemType::SBendRightCovered: - return TrackElemType::SBendRight; - case TrackElemType::LeftQuarterTurn3TilesCovered: - return TrackElemType::LeftQuarterTurn3Tiles; - case TrackElemType::RightQuarterTurn3TilesCovered: - return TrackElemType::RightQuarterTurn3Tiles; + case TrackElemType::flatCovered: + return TrackElemType::flat; + case TrackElemType::up25Covered: + return TrackElemType::up25; + case TrackElemType::up60Covered: + return TrackElemType::up60; + case TrackElemType::flatToUp25Covered: + return TrackElemType::flatToUp25; + case TrackElemType::up25ToUp60Covered: + return TrackElemType::up25ToUp60; + case TrackElemType::up60ToUp25Covered: + return TrackElemType::up60ToUp25; + case TrackElemType::up25ToFlatCovered: + return TrackElemType::up25ToFlat; + case TrackElemType::down25Covered: + return TrackElemType::down25; + case TrackElemType::down60Covered: + return TrackElemType::down60; + case TrackElemType::flatToDown25Covered: + return TrackElemType::flatToDown25; + case TrackElemType::down25ToDown60Covered: + return TrackElemType::down25ToDown60; + case TrackElemType::down60ToDown25Covered: + return TrackElemType::down60ToDown25; + case TrackElemType::down25ToFlatCovered: + return TrackElemType::down25ToFlat; + case TrackElemType::leftQuarterTurn5TilesCovered: + return TrackElemType::leftQuarterTurn5Tiles; + case TrackElemType::rightQuarterTurn5TilesCovered: + return TrackElemType::rightQuarterTurn5Tiles; + case TrackElemType::sBendLeftCovered: + return TrackElemType::sBendLeft; + case TrackElemType::sBendRightCovered: + return TrackElemType::sBendRight; + case TrackElemType::leftQuarterTurn3TilesCovered: + return TrackElemType::leftQuarterTurn3Tiles; + case TrackElemType::rightQuarterTurn3TilesCovered: + return TrackElemType::rightQuarterTurn3Tiles; default: return trackElementType; } @@ -744,10 +747,10 @@ bool TrackTypeHasSpeedSetting(OpenRCT2::TrackElemType trackType) bool TrackTypeIsHelix(OpenRCT2::TrackElemType trackType) { - if (trackType >= TrackElemType::LeftHalfBankedHelixUpSmall && trackType <= TrackElemType::RightHalfBankedHelixDownLarge) + if (trackType >= TrackElemType::leftHalfBankedHelixUpSmall && trackType <= TrackElemType::rightHalfBankedHelixDownLarge) return true; - if (trackType >= TrackElemType::LeftQuarterBankedHelixLargeUp && trackType <= TrackElemType::RightQuarterHelixLargeDown) + if (trackType >= TrackElemType::leftQuarterBankedHelixLargeUp && trackType <= TrackElemType::rightQuarterHelixLargeDown) return true; return false; diff --git a/src/openrct2/ride/Track.h b/src/openrct2/ride/Track.h index 76ef9c13eb57..9f94f47d8f94 100644 --- a/src/openrct2/ride/Track.h +++ b/src/openrct2/ride/Track.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,9 +10,10 @@ #pragma once #include "../Identifiers.h" -#include "../object/Object.h" +#include "../actions/CommandFlag.h" #include "../world/Location.hpp" #include "../world/QuarterTile.h" +#include "RideTypes.h" #include @@ -23,6 +24,10 @@ constexpr auto kTrackDirectionDiagonalMask = 0b0100; constexpr uint8_t kMaximumTrackSpeed = 30; +constexpr int8_t kMaxStationPlatformLength = 32; +constexpr uint16_t kMaximumTrackHeight = 254 * kCoordsZStep; +constexpr uint8_t kDefaultSeatRotation = 4; + namespace OpenRCT2 { enum class TrackElemType : uint16_t; @@ -35,24 +40,24 @@ struct ResultWithMessage; enum class TrackRoll : uint8_t { - None = 0, - Left = 2, - Right = 4, - UpsideDown = 15, + none = 0, + left = 2, + right = 4, + upsideDown = 15, }; enum class TrackPitch : uint8_t { - None = 0, - Up25 = 2, - Up60 = 4, - Down25 = 6, - Down60 = 8, - Up90 = 10, - Down90 = 18, - - Tower = 10, - ReverseFreefall = 10 + none = 0, + up25 = 2, + up60 = 4, + down25 = 6, + down60 = 8, + up90 = 10, + down90 = 18, + + tower = 10, + reverseFreefall = 10 }; // Vehicle sprite groups required by track groups are defined in ride_entry_get_supported_track_pieces @@ -195,7 +200,15 @@ struct SequenceClearance uint8_t flags{}; }; -/* size 0x0A */ +/** TrackCoordinates + * rotationBegin: Start direction of the track piece; 0 (cardinal) or 4 (45 degrees clockwise) + * rotationEnd: End direction of the track peice, measured clockwise + * zBegin: how high above the base level of the lowest track block the spline starts + * zEnd: how high above the base level of the lowest track block the spline ends + * x: tile offset to the end track block; negative is along the original direction of travel + * Next track piece is found by moving one tile after end of the track piece, so vertical track has an x value of 32 + * y: tile offset to the end track block; negative is to the left of the original direction of travel + */ struct TrackCoordinates { int8_t rotationBegin; // 0x00 @@ -213,439 +226,433 @@ enum RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL = (1 << 2), }; -constexpr int8_t kMaxStationPlatformLength = 32; -constexpr uint16_t const MAX_TRACK_HEIGHT = 254 * kCoordsZStep; -constexpr uint8_t const DEFAULT_SEAT_ROTATION = 4; - enum class TrackCurve : uint8_t { - LeftVerySmall = 5, - LeftSmall = 3, - Left = 1, - LeftLarge = 7, - None = 0, - RightLarge = 8, - Right = 2, - RightSmall = 4, - RightVerySmall = 6 + leftVerySmall = 5, + leftSmall = 3, + left = 1, + leftLarge = 7, + none = 0, + rightLarge = 8, + right = 2, + rightSmall = 4, + rightVerySmall = 6 }; constexpr const uint8_t kHighestCurveValue = 8; -enum +enum class TrackElementFlag : uint8_t { - TRACK_ELEM_FLAG_ONLY_UNDERWATER = (1 << 0), - TRACK_ELEM_FLAG_TURN_LEFT = (1 << 1), - TRACK_ELEM_FLAG_TURN_RIGHT = (1 << 2), - TRACK_ELEM_FLAG_TURN_BANKED = (1 << 3), - TRACK_ELEM_FLAG_TURN_SLOPED = (1 << 4), - TRACK_ELEM_FLAG_DOWN = (1 << 5), - TRACK_ELEM_FLAG_UP = (1 << 6), - TRACK_ELEM_FLAG_NORMAL_TO_INVERSION = (1 << 7), - TRACK_ELEM_FLAG_IS_GOLF_HOLE = (1 << 7), - TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT = (1 << 8), - TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND = (1 << 9), - TRACK_ELEM_FLAG_IS_STEEP_UP = (1 << 10), // Used to allow steep backwards lifts on roller coasters that do not allow steep - // forward lift hills - TRACK_ELEM_FLAG_HELIX = (1 << 11), - TRACK_ELEM_FLAG_ALLOW_LIFT_HILL = (1 << 12), - TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT = (1 << 13), - TRACK_ELEM_FLAG_INVERSION_TO_NORMAL = (1 << 14), - TRACK_ELEM_FLAG_BANKED = (1 << 15), // Also set on Spinning Tunnel and Log Flume reverser, probably to save a flag. - TRACK_ELEM_FLAG_CAN_BE_PARTLY_UNDERGROUND = (1 << 16), + onlyUnderwater, + turnLeft, + turnRight, + turnBanked, + turnSloped, + down, + up, + normalToInversion, + isGolfHole = normalToInversion, + startsAtHalfHeight, + onlyAboveGround, + + // Used to allow steep backwards lifts on roller coasters that do not allow steep + // forward lift hills + isSteepUp, + helix, + allowLiftHill, + curveAllowsLift, + inversionToNormal, + + // Also set on Spinning Tunnel and Log Flume reverser, probably to save a flag. + banked, + canBePartlyUnderground, }; namespace OpenRCT2 { enum class TrackElemType : uint16_t { - Flat = 0, - EndStation = 1, - BeginStation = 2, - MiddleStation = 3, - Up25 = 4, - Up60 = 5, - FlatToUp25 = 6, - Up25ToUp60 = 7, - Up60ToUp25 = 8, - Up25ToFlat = 9, - Down25 = 10, - Down60 = 11, - FlatToDown25 = 12, - Down25ToDown60 = 13, - Down60ToDown25 = 14, - Down25ToFlat = 15, - LeftQuarterTurn5Tiles = 16, - RightQuarterTurn5Tiles = 17, - FlatToLeftBank = 18, - FlatToRightBank = 19, - LeftBankToFlat = 20, - RightBankToFlat = 21, - BankedLeftQuarterTurn5Tiles = 22, - BankedRightQuarterTurn5Tiles = 23, - LeftBankToUp25 = 24, - RightBankToUp25 = 25, - Up25ToLeftBank = 26, - Up25ToRightBank = 27, - LeftBankToDown25 = 28, - RightBankToDown25 = 29, - Down25ToLeftBank = 30, - Down25ToRightBank = 31, - LeftBank = 32, - RightBank = 33, - LeftQuarterTurn5TilesUp25 = 34, - RightQuarterTurn5TilesUp25 = 35, - LeftQuarterTurn5TilesDown25 = 36, - RightQuarterTurn5TilesDown25 = 37, - SBendLeft = 38, - SBendRight = 39, - LeftVerticalLoop = 40, - RightVerticalLoop = 41, - LeftQuarterTurn3Tiles = 42, - RightQuarterTurn3Tiles = 43, - LeftBankedQuarterTurn3Tiles = 44, - RightBankedQuarterTurn3Tiles = 45, - LeftQuarterTurn3TilesUp25 = 46, - RightQuarterTurn3TilesUp25 = 47, - LeftQuarterTurn3TilesDown25 = 48, - RightQuarterTurn3TilesDown25 = 49, - LeftQuarterTurn1Tile = 50, - RightQuarterTurn1Tile = 51, - LeftTwistDownToUp = 52, - RightTwistDownToUp = 53, - LeftTwistUpToDown = 54, - RightTwistUpToDown = 55, - HalfLoopUp = 56, - HalfLoopDown = 57, - LeftCorkscrewUp = 58, - RightCorkscrewUp = 59, - LeftCorkscrewDown = 60, - RightCorkscrewDown = 61, - FlatToUp60 = 62, - Up60ToFlat = 63, - FlatToDown60 = 64, - Down60ToFlat = 65, - TowerBase = 66, - TowerSection = 67, - FlatCovered = 68, - Up25Covered = 69, - Up60Covered = 70, - FlatToUp25Covered = 71, - Up25ToUp60Covered = 72, - Up60ToUp25Covered = 73, - Up25ToFlatCovered = 74, - Down25Covered = 75, - Down60Covered = 76, - FlatToDown25Covered = 77, - Down25ToDown60Covered = 78, - Down60ToDown25Covered = 79, - Down25ToFlatCovered = 80, - LeftQuarterTurn5TilesCovered = 81, - RightQuarterTurn5TilesCovered = 82, - SBendLeftCovered = 83, - SBendRightCovered = 84, - LeftQuarterTurn3TilesCovered = 85, - RightQuarterTurn3TilesCovered = 86, - LeftHalfBankedHelixUpSmall = 87, - RightHalfBankedHelixUpSmall = 88, - LeftHalfBankedHelixDownSmall = 89, - RightHalfBankedHelixDownSmall = 90, - LeftHalfBankedHelixUpLarge = 91, - RightHalfBankedHelixUpLarge = 92, - LeftHalfBankedHelixDownLarge = 93, - RightHalfBankedHelixDownLarge = 94, - LeftQuarterTurn1TileUp60 = 95, - RightQuarterTurn1TileUp60 = 96, - LeftQuarterTurn1TileDown60 = 97, - RightQuarterTurn1TileDown60 = 98, - Brakes = 99, - Booster = 100, - Maze = 101, - LeftQuarterBankedHelixLargeUp = 102, - RightQuarterBankedHelixLargeUp = 103, - LeftQuarterBankedHelixLargeDown = 104, - RightQuarterBankedHelixLargeDown = 105, - LeftQuarterHelixLargeUp = 106, - RightQuarterHelixLargeUp = 107, - LeftQuarterHelixLargeDown = 108, - RightQuarterHelixLargeDown = 109, - Up25LeftBanked = 110, - Up25RightBanked = 111, - Waterfall = 112, - Rapids = 113, - OnRidePhoto = 114, - Down25LeftBanked = 115, - Down25RightBanked = 116, - Watersplash = 117, - FlatToUp60LongBase = 118, - Up60ToFlatLongBase = 119, - Whirlpool = 120, - Down60ToFlatLongBase = 121, - FlatToDown60LongBase = 122, - CableLiftHill = 123, - ReverseFreefallSlope = 124, - ReverseFreefallVertical = 125, - Up90 = 126, - Down90 = 127, - Up60ToUp90 = 128, - Down90ToDown60 = 129, - Up90ToUp60 = 130, - Down60ToDown90 = 131, - BrakeForDrop = 132, - LeftEighthToDiag = 133, - RightEighthToDiag = 134, - LeftEighthToOrthogonal = 135, - RightEighthToOrthogonal = 136, - LeftEighthBankToDiag = 137, - RightEighthBankToDiag = 138, - LeftEighthBankToOrthogonal = 139, - RightEighthBankToOrthogonal = 140, - DiagFlat = 141, - DiagUp25 = 142, - DiagUp60 = 143, - DiagFlatToUp25 = 144, - DiagUp25ToUp60 = 145, - DiagUp60ToUp25 = 146, - DiagUp25ToFlat = 147, - DiagDown25 = 148, - DiagDown60 = 149, - DiagFlatToDown25 = 150, - DiagDown25ToDown60 = 151, - DiagDown60ToDown25 = 152, - DiagDown25ToFlat = 153, - DiagFlatToUp60 = 154, - DiagUp60ToFlat = 155, - DiagFlatToDown60 = 156, - DiagDown60ToFlat = 157, - DiagFlatToLeftBank = 158, - DiagFlatToRightBank = 159, - DiagLeftBankToFlat = 160, - DiagRightBankToFlat = 161, - DiagLeftBankToUp25 = 162, - DiagRightBankToUp25 = 163, - DiagUp25ToLeftBank = 164, - DiagUp25ToRightBank = 165, - DiagLeftBankToDown25 = 166, - DiagRightBankToDown25 = 167, - DiagDown25ToLeftBank = 168, - DiagDown25ToRightBank = 169, - DiagLeftBank = 170, - DiagRightBank = 171, - LogFlumeReverser = 172, - SpinningTunnel = 173, - LeftBarrelRollUpToDown = 174, - RightBarrelRollUpToDown = 175, - LeftBarrelRollDownToUp = 176, - RightBarrelRollDownToUp = 177, - LeftBankToLeftQuarterTurn3TilesUp25 = 178, - RightBankToRightQuarterTurn3TilesUp25 = 179, - LeftQuarterTurn3TilesDown25ToLeftBank = 180, - RightQuarterTurn3TilesDown25ToRightBank = 181, - PoweredLift = 182, - LeftLargeHalfLoopUp = 183, - RightLargeHalfLoopUp = 184, - LeftLargeHalfLoopDown = 185, - RightLargeHalfLoopDown = 186, - LeftFlyerTwistUp = 187, - RightFlyerTwistUp = 188, - LeftFlyerTwistDown = 189, - RightFlyerTwistDown = 190, - FlyerHalfLoopUninvertedUp = 191, - FlyerHalfLoopInvertedDown = 192, - LeftFlyerCorkscrewUp = 193, - RightFlyerCorkscrewUp = 194, - LeftFlyerCorkscrewDown = 195, - RightFlyerCorkscrewDown = 196, - HeartLineTransferUp = 197, - HeartLineTransferDown = 198, - LeftHeartLineRoll = 199, - RightHeartLineRoll = 200, - MinigolfHoleA = 201, - MinigolfHoleB = 202, - MinigolfHoleC = 203, - MinigolfHoleD = 204, - MinigolfHoleE = 205, - MultiDimInvertedFlatToDown90QuarterLoop = 206, - Up90ToInvertedFlatQuarterLoop = 207, - InvertedFlatToDown90QuarterLoop = 208, - LeftCurvedLiftHill = 209, - RightCurvedLiftHill = 210, - LeftReverser = 211, - RightReverser = 212, - AirThrustTopCap = 213, - AirThrustVerticalDown = 214, - AirThrustVerticalDownToLevel = 215, - BlockBrakes = 216, - LeftBankedQuarterTurn3TileUp25 = 217, - RightBankedQuarterTurn3TileUp25 = 218, - LeftBankedQuarterTurn3TileDown25 = 219, - RightBankedQuarterTurn3TileDown25 = 220, - LeftBankedQuarterTurn5TileUp25 = 221, - RightBankedQuarterTurn5TileUp25 = 222, - LeftBankedQuarterTurn5TileDown25 = 223, - RightBankedQuarterTurn5TileDown25 = 224, - Up25ToLeftBankedUp25 = 225, - Up25ToRightBankedUp25 = 226, - LeftBankedUp25ToUp25 = 227, - RightBankedUp25ToUp25 = 228, - Down25ToLeftBankedDown25 = 229, - Down25ToRightBankedDown25 = 230, - LeftBankedDown25ToDown25 = 231, - RightBankedDown25ToDown25 = 232, - LeftBankedFlatToLeftBankedUp25 = 233, - RightBankedFlatToRightBankedUp25 = 234, - LeftBankedUp25ToLeftBankedFlat = 235, - RightBankedUp25ToRightBankedFlat = 236, - LeftBankedFlatToLeftBankedDown25 = 237, - RightBankedFlatToRightBankedDown25 = 238, - LeftBankedDown25ToLeftBankedFlat = 239, - RightBankedDown25ToRightBankedFlat = 240, - FlatToLeftBankedUp25 = 241, - FlatToRightBankedUp25 = 242, - LeftBankedUp25ToFlat = 243, - RightBankedUp25ToFlat = 244, - FlatToLeftBankedDown25 = 245, - FlatToRightBankedDown25 = 246, - LeftBankedDown25ToFlat = 247, - RightBankedDown25ToFlat = 248, - LeftQuarterTurn1TileUp90 = 249, - RightQuarterTurn1TileUp90 = 250, - LeftQuarterTurn1TileDown90 = 251, - RightQuarterTurn1TileDown90 = 252, - MultiDimUp90ToInvertedFlatQuarterLoop = 253, - MultiDimFlatToDown90QuarterLoop = 254, - MultiDimInvertedUp90ToFlatQuarterLoop = 255, + flat = 0, + endStation = 1, + beginStation = 2, + middleStation = 3, + up25 = 4, + up60 = 5, + flatToUp25 = 6, + up25ToUp60 = 7, + up60ToUp25 = 8, + up25ToFlat = 9, + down25 = 10, + down60 = 11, + flatToDown25 = 12, + down25ToDown60 = 13, + down60ToDown25 = 14, + down25ToFlat = 15, + leftQuarterTurn5Tiles = 16, + rightQuarterTurn5Tiles = 17, + flatToLeftBank = 18, + flatToRightBank = 19, + leftBankToFlat = 20, + rightBankToFlat = 21, + bankedLeftQuarterTurn5Tiles = 22, + bankedRightQuarterTurn5Tiles = 23, + leftBankToUp25 = 24, + rightBankToUp25 = 25, + up25ToLeftBank = 26, + up25ToRightBank = 27, + leftBankToDown25 = 28, + rightBankToDown25 = 29, + down25ToLeftBank = 30, + down25ToRightBank = 31, + leftBank = 32, + rightBank = 33, + leftQuarterTurn5TilesUp25 = 34, + rightQuarterTurn5TilesUp25 = 35, + leftQuarterTurn5TilesDown25 = 36, + rightQuarterTurn5TilesDown25 = 37, + sBendLeft = 38, + sBendRight = 39, + leftVerticalLoop = 40, + rightVerticalLoop = 41, + leftQuarterTurn3Tiles = 42, + rightQuarterTurn3Tiles = 43, + leftBankedQuarterTurn3Tiles = 44, + rightBankedQuarterTurn3Tiles = 45, + leftQuarterTurn3TilesUp25 = 46, + rightQuarterTurn3TilesUp25 = 47, + leftQuarterTurn3TilesDown25 = 48, + rightQuarterTurn3TilesDown25 = 49, + leftQuarterTurn1Tile = 50, + rightQuarterTurn1Tile = 51, + leftTwistDownToUp = 52, + rightTwistDownToUp = 53, + leftTwistUpToDown = 54, + rightTwistUpToDown = 55, + halfLoopUp = 56, + halfLoopDown = 57, + leftCorkscrewUp = 58, + rightCorkscrewUp = 59, + leftCorkscrewDown = 60, + rightCorkscrewDown = 61, + flatToUp60 = 62, + up60ToFlat = 63, + flatToDown60 = 64, + down60ToFlat = 65, + towerBase = 66, + towerSection = 67, + flatCovered = 68, + up25Covered = 69, + up60Covered = 70, + flatToUp25Covered = 71, + up25ToUp60Covered = 72, + up60ToUp25Covered = 73, + up25ToFlatCovered = 74, + down25Covered = 75, + down60Covered = 76, + flatToDown25Covered = 77, + down25ToDown60Covered = 78, + down60ToDown25Covered = 79, + down25ToFlatCovered = 80, + leftQuarterTurn5TilesCovered = 81, + rightQuarterTurn5TilesCovered = 82, + sBendLeftCovered = 83, + sBendRightCovered = 84, + leftQuarterTurn3TilesCovered = 85, + rightQuarterTurn3TilesCovered = 86, + leftHalfBankedHelixUpSmall = 87, + rightHalfBankedHelixUpSmall = 88, + leftHalfBankedHelixDownSmall = 89, + rightHalfBankedHelixDownSmall = 90, + leftHalfBankedHelixUpLarge = 91, + rightHalfBankedHelixUpLarge = 92, + leftHalfBankedHelixDownLarge = 93, + rightHalfBankedHelixDownLarge = 94, + leftQuarterTurn1TileUp60 = 95, + rightQuarterTurn1TileUp60 = 96, + leftQuarterTurn1TileDown60 = 97, + rightQuarterTurn1TileDown60 = 98, + brakes = 99, + booster = 100, + maze = 101, + leftQuarterBankedHelixLargeUp = 102, + rightQuarterBankedHelixLargeUp = 103, + leftQuarterBankedHelixLargeDown = 104, + rightQuarterBankedHelixLargeDown = 105, + leftQuarterHelixLargeUp = 106, + rightQuarterHelixLargeUp = 107, + leftQuarterHelixLargeDown = 108, + rightQuarterHelixLargeDown = 109, + up25LeftBanked = 110, + up25RightBanked = 111, + waterfall = 112, + rapids = 113, + onRidePhoto = 114, + down25LeftBanked = 115, + down25RightBanked = 116, + watersplash = 117, + flatToUp60LongBase = 118, + up60ToFlatLongBase = 119, + whirlpool = 120, + down60ToFlatLongBase = 121, + flatToDown60LongBase = 122, + cableLiftHill = 123, + reverseFreefallSlope = 124, + reverseFreefallVertical = 125, + up90 = 126, + down90 = 127, + up60ToUp90 = 128, + down90ToDown60 = 129, + up90ToUp60 = 130, + down60ToDown90 = 131, + brakeForDrop = 132, + leftEighthToDiag = 133, + rightEighthToDiag = 134, + leftEighthToOrthogonal = 135, + rightEighthToOrthogonal = 136, + leftEighthBankToDiag = 137, + rightEighthBankToDiag = 138, + leftEighthBankToOrthogonal = 139, + rightEighthBankToOrthogonal = 140, + diagFlat = 141, + diagUp25 = 142, + diagUp60 = 143, + diagFlatToUp25 = 144, + diagUp25ToUp60 = 145, + diagUp60ToUp25 = 146, + diagUp25ToFlat = 147, + diagDown25 = 148, + diagDown60 = 149, + diagFlatToDown25 = 150, + diagDown25ToDown60 = 151, + diagDown60ToDown25 = 152, + diagDown25ToFlat = 153, + diagFlatToUp60 = 154, + diagUp60ToFlat = 155, + diagFlatToDown60 = 156, + diagDown60ToFlat = 157, + diagFlatToLeftBank = 158, + diagFlatToRightBank = 159, + diagLeftBankToFlat = 160, + diagRightBankToFlat = 161, + diagLeftBankToUp25 = 162, + diagRightBankToUp25 = 163, + diagUp25ToLeftBank = 164, + diagUp25ToRightBank = 165, + diagLeftBankToDown25 = 166, + diagRightBankToDown25 = 167, + diagDown25ToLeftBank = 168, + diagDown25ToRightBank = 169, + diagLeftBank = 170, + diagRightBank = 171, + logFlumeReverser = 172, + spinningTunnel = 173, + leftBarrelRollUpToDown = 174, + rightBarrelRollUpToDown = 175, + leftBarrelRollDownToUp = 176, + rightBarrelRollDownToUp = 177, + leftBankToLeftQuarterTurn3TilesUp25 = 178, + rightBankToRightQuarterTurn3TilesUp25 = 179, + leftQuarterTurn3TilesDown25ToLeftBank = 180, + rightQuarterTurn3TilesDown25ToRightBank = 181, + poweredLift = 182, + leftLargeHalfLoopUp = 183, + rightLargeHalfLoopUp = 184, + leftLargeHalfLoopDown = 185, + rightLargeHalfLoopDown = 186, + leftFlyerTwistUp = 187, + rightFlyerTwistUp = 188, + leftFlyerTwistDown = 189, + rightFlyerTwistDown = 190, + flyerHalfLoopUninvertedUp = 191, + flyerHalfLoopInvertedDown = 192, + leftFlyerCorkscrewUp = 193, + rightFlyerCorkscrewUp = 194, + leftFlyerCorkscrewDown = 195, + rightFlyerCorkscrewDown = 196, + heartLineTransferUp = 197, + heartLineTransferDown = 198, + leftHeartLineRoll = 199, + rightHeartLineRoll = 200, + minigolfHoleA = 201, + minigolfHoleB = 202, + minigolfHoleC = 203, + minigolfHoleD = 204, + minigolfHoleE = 205, + multiDimInvertedFlatToDown90QuarterLoop = 206, + up90ToInvertedFlatQuarterLoop = 207, + invertedFlatToDown90QuarterLoop = 208, + leftCurvedLiftHill = 209, + rightCurvedLiftHill = 210, + leftReverser = 211, + rightReverser = 212, + airThrustTopCap = 213, + airThrustVerticalDown = 214, + airThrustVerticalDownToLevel = 215, + blockBrakes = 216, + leftBankedQuarterTurn3TileUp25 = 217, + rightBankedQuarterTurn3TileUp25 = 218, + leftBankedQuarterTurn3TileDown25 = 219, + rightBankedQuarterTurn3TileDown25 = 220, + leftBankedQuarterTurn5TileUp25 = 221, + rightBankedQuarterTurn5TileUp25 = 222, + leftBankedQuarterTurn5TileDown25 = 223, + rightBankedQuarterTurn5TileDown25 = 224, + up25ToLeftBankedUp25 = 225, + up25ToRightBankedUp25 = 226, + leftBankedUp25ToUp25 = 227, + rightBankedUp25ToUp25 = 228, + down25ToLeftBankedDown25 = 229, + down25ToRightBankedDown25 = 230, + leftBankedDown25ToDown25 = 231, + rightBankedDown25ToDown25 = 232, + leftBankedFlatToLeftBankedUp25 = 233, + rightBankedFlatToRightBankedUp25 = 234, + leftBankedUp25ToLeftBankedFlat = 235, + rightBankedUp25ToRightBankedFlat = 236, + leftBankedFlatToLeftBankedDown25 = 237, + rightBankedFlatToRightBankedDown25 = 238, + leftBankedDown25ToLeftBankedFlat = 239, + rightBankedDown25ToRightBankedFlat = 240, + flatToLeftBankedUp25 = 241, + flatToRightBankedUp25 = 242, + leftBankedUp25ToFlat = 243, + rightBankedUp25ToFlat = 244, + flatToLeftBankedDown25 = 245, + flatToRightBankedDown25 = 246, + leftBankedDown25ToFlat = 247, + rightBankedDown25ToFlat = 248, + leftQuarterTurn1TileUp90 = 249, + rightQuarterTurn1TileUp90 = 250, + leftQuarterTurn1TileDown90 = 251, + rightQuarterTurn1TileDown90 = 252, + multiDimUp90ToInvertedFlatQuarterLoop = 253, + multiDimFlatToDown90QuarterLoop = 254, + multiDimInvertedUp90ToFlatQuarterLoop = 255, // Elements that shared an ID with another piece in RCT1/2. - RotationControlToggle = 256, - FlatTrack1x4A = 257, - FlatTrack2x2 = 258, - FlatTrack4x4 = 259, - FlatTrack2x4 = 260, - FlatTrack1x5 = 261, - FlatTrack1x1A = 262, - FlatTrack1x4B = 263, - FlatTrack1x1B = 264, - FlatTrack1x4C = 265, - FlatTrack3x3 = 266, + rotationControlToggle = 256, + flatTrack1x4A = 257, + flatTrack2x2 = 258, + flatTrack4x4 = 259, + flatTrack2x4 = 260, + flatTrack1x5 = 261, + flatTrack1x1A = 262, + flatTrack1x4B = 263, + flatTrack1x1B = 264, + flatTrack1x4C = 265, + flatTrack3x3 = 266, // Highest track element ID that has a TD6 alias - HighestAlias = 266, + highestAlias = 266, // Track Elements specific to OpenRCT2 - LeftLargeCorkscrewUp = 267, - RightLargeCorkscrewUp = 268, - LeftLargeCorkscrewDown = 269, - RightLargeCorkscrewDown = 270, - LeftMediumHalfLoopUp = 271, - RightMediumHalfLoopUp = 272, - LeftMediumHalfLoopDown = 273, - RightMediumHalfLoopDown = 274, - LeftZeroGRollUp = 275, - RightZeroGRollUp = 276, - LeftZeroGRollDown = 277, - RightZeroGRollDown = 278, - LeftLargeZeroGRollUp = 279, - RightLargeZeroGRollUp = 280, - LeftLargeZeroGRollDown = 281, - RightLargeZeroGRollDown = 282, - - LeftFlyerLargeHalfLoopUninvertedUp = 283, - RightFlyerLargeHalfLoopUninvertedUp = 284, - LeftFlyerLargeHalfLoopInvertedDown = 285, - RightFlyerLargeHalfLoopInvertedDown = 286, - LeftFlyerLargeHalfLoopInvertedUp = 287, - RightFlyerLargeHalfLoopInvertedUp = 288, - LeftFlyerLargeHalfLoopUninvertedDown = 289, - RightFlyerLargeHalfLoopUninvertedDown = 290, - - FlyerHalfLoopInvertedUp = 291, - FlyerHalfLoopUninvertedDown = 292, - - LeftEighthToDiagUp25 = 293, - RightEighthToDiagUp25 = 294, - LeftEighthToDiagDown25 = 295, - RightEighthToDiagDown25 = 296, - LeftEighthToOrthogonalUp25 = 297, - RightEighthToOrthogonalUp25 = 298, - LeftEighthToOrthogonalDown25 = 299, - RightEighthToOrthogonalDown25 = 300, - - DiagUp25ToLeftBankedUp25 = 301, - DiagUp25ToRightBankedUp25 = 302, - DiagLeftBankedUp25ToUp25 = 303, - DiagRightBankedUp25ToUp25 = 304, - DiagDown25ToLeftBankedDown25 = 305, - DiagDown25ToRightBankedDown25 = 306, - DiagLeftBankedDown25ToDown25 = 307, - DiagRightBankedDown25ToDown25 = 308, - DiagLeftBankedFlatToLeftBankedUp25 = 309, - DiagRightBankedFlatToRightBankedUp25 = 310, - DiagLeftBankedUp25ToLeftBankedFlat = 311, - DiagRightBankedUp25ToRightBankedFlat = 312, - DiagLeftBankedFlatToLeftBankedDown25 = 313, - DiagRightBankedFlatToRightBankedDown25 = 314, - DiagLeftBankedDown25ToLeftBankedFlat = 315, - DiagRightBankedDown25ToRightBankedFlat = 316, - DiagFlatToLeftBankedUp25 = 317, - DiagFlatToRightBankedUp25 = 318, - DiagLeftBankedUp25ToFlat = 319, - DiagRightBankedUp25ToFlat = 320, - DiagFlatToLeftBankedDown25 = 321, - DiagFlatToRightBankedDown25 = 322, - DiagLeftBankedDown25ToFlat = 323, - DiagRightBankedDown25ToFlat = 324, - DiagUp25LeftBanked = 325, - DiagUp25RightBanked = 326, - DiagDown25LeftBanked = 327, - DiagDown25RightBanked = 328, - - LeftEighthBankToDiagUp25 = 329, - RightEighthBankToDiagUp25 = 330, - LeftEighthBankToDiagDown25 = 331, - RightEighthBankToDiagDown25 = 332, - LeftEighthBankToOrthogonalUp25 = 333, - RightEighthBankToOrthogonalUp25 = 334, - LeftEighthBankToOrthogonalDown25 = 335, - RightEighthBankToOrthogonalDown25 = 336, - - DiagBrakes = 337, - DiagBlockBrakes = 338, - Down25Brakes = 339, - DiagBooster = 340, - - DiagFlatToUp60LongBase = 341, - DiagUp60ToFlatLongBase = 342, - DiagFlatToDown60LongBase = 343, - DiagDown60ToFlatLongBase = 344, - LeftEighthDiveLoopUpToOrthogonal = 345, - RightEighthDiveLoopUpToOrthogonal = 346, - LeftEighthDiveLoopDownToDiag = 347, - RightEighthDiveLoopDownToDiag = 348, - - DiagDown25Brakes = 349, - - Count = 350, - - None = 65535, + leftLargeCorkscrewUp = 267, + rightLargeCorkscrewUp = 268, + leftLargeCorkscrewDown = 269, + rightLargeCorkscrewDown = 270, + leftMediumHalfLoopUp = 271, + rightMediumHalfLoopUp = 272, + leftMediumHalfLoopDown = 273, + rightMediumHalfLoopDown = 274, + leftZeroGRollUp = 275, + rightZeroGRollUp = 276, + leftZeroGRollDown = 277, + rightZeroGRollDown = 278, + leftLargeZeroGRollUp = 279, + rightLargeZeroGRollUp = 280, + leftLargeZeroGRollDown = 281, + rightLargeZeroGRollDown = 282, + + leftFlyerLargeHalfLoopUninvertedUp = 283, + rightFlyerLargeHalfLoopUninvertedUp = 284, + leftFlyerLargeHalfLoopInvertedDown = 285, + rightFlyerLargeHalfLoopInvertedDown = 286, + leftFlyerLargeHalfLoopInvertedUp = 287, + rightFlyerLargeHalfLoopInvertedUp = 288, + leftFlyerLargeHalfLoopUninvertedDown = 289, + rightFlyerLargeHalfLoopUninvertedDown = 290, + + flyerHalfLoopInvertedUp = 291, + flyerHalfLoopUninvertedDown = 292, + + leftEighthToDiagUp25 = 293, + rightEighthToDiagUp25 = 294, + leftEighthToDiagDown25 = 295, + rightEighthToDiagDown25 = 296, + leftEighthToOrthogonalUp25 = 297, + rightEighthToOrthogonalUp25 = 298, + leftEighthToOrthogonalDown25 = 299, + rightEighthToOrthogonalDown25 = 300, + + diagUp25ToLeftBankedUp25 = 301, + diagUp25ToRightBankedUp25 = 302, + diagLeftBankedUp25ToUp25 = 303, + diagRightBankedUp25ToUp25 = 304, + diagDown25ToLeftBankedDown25 = 305, + diagDown25ToRightBankedDown25 = 306, + diagLeftBankedDown25ToDown25 = 307, + diagRightBankedDown25ToDown25 = 308, + diagLeftBankedFlatToLeftBankedUp25 = 309, + diagRightBankedFlatToRightBankedUp25 = 310, + diagLeftBankedUp25ToLeftBankedFlat = 311, + diagRightBankedUp25ToRightBankedFlat = 312, + diagLeftBankedFlatToLeftBankedDown25 = 313, + diagRightBankedFlatToRightBankedDown25 = 314, + diagLeftBankedDown25ToLeftBankedFlat = 315, + diagRightBankedDown25ToRightBankedFlat = 316, + diagFlatToLeftBankedUp25 = 317, + diagFlatToRightBankedUp25 = 318, + diagLeftBankedUp25ToFlat = 319, + diagRightBankedUp25ToFlat = 320, + diagFlatToLeftBankedDown25 = 321, + diagFlatToRightBankedDown25 = 322, + diagLeftBankedDown25ToFlat = 323, + diagRightBankedDown25ToFlat = 324, + diagUp25LeftBanked = 325, + diagUp25RightBanked = 326, + diagDown25LeftBanked = 327, + diagDown25RightBanked = 328, + + leftEighthBankToDiagUp25 = 329, + rightEighthBankToDiagUp25 = 330, + leftEighthBankToDiagDown25 = 331, + rightEighthBankToDiagDown25 = 332, + leftEighthBankToOrthogonalUp25 = 333, + rightEighthBankToOrthogonalUp25 = 334, + leftEighthBankToOrthogonalDown25 = 335, + rightEighthBankToOrthogonalDown25 = 336, + + diagBrakes = 337, + diagBlockBrakes = 338, + down25Brakes = 339, + diagBooster = 340, + + diagFlatToUp60LongBase = 341, + diagUp60ToFlatLongBase = 342, + diagFlatToDown60LongBase = 343, + diagDown60ToFlatLongBase = 344, + leftEighthDiveLoopUpToOrthogonal = 345, + rightEighthDiveLoopUpToOrthogonal = 346, + leftEighthDiveLoopDownToDiag = 347, + rightEighthDiveLoopDownToDiag = 348, + + diagDown25Brakes = 349, + + count = 350, + + none = 65535, }; } -enum -{ - TRACK_SEQUENCE_FLAG_DIRECTION_0 = (1 << 0), // Ride Entrances and path connect to front - TRACK_SEQUENCE_FLAG_DIRECTION_1 = (1 << 1), // connect to right - TRACK_SEQUENCE_FLAG_DIRECTION_2 = (1 << 2), // connect to back - TRACK_SEQUENCE_FLAG_DIRECTION_3 = (1 << 3), // connect to left - TRACK_SEQUENCE_FLAG_ORIGIN = (1 << 4), // 0x10 - TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH = (1 << 5), // 0x20 - TRACK_SEQUENCE_FLAG_DISALLOW_DOORS = (1 << 6), // 0x40 -}; - -enum +enum class SequenceFlag : uint8_t { - GC_SET_MAZE_TRACK_BUILD = 0, - GC_SET_MAZE_TRACK_MOVE = 1, - GC_SET_MAZE_TRACK_FILL = 2, + entranceConnectionNE, // Ride Entrances and path connect to front + entranceConnectionSE, // connect to right + entranceConnectionSW, // connect to back + entranceConnectionNW, // connect to left + trackOrigin, + connectsToPath, // The sides of this sequence block flagged with entrance connections can connect directly to paths + disallowDoors, // Doors cannot be built on any side of this track element (only valid on first sequence of track element) + hasHeightMarker, // Displays a height marker on this sequence block }; struct TrackCircuitIterator @@ -664,14 +671,14 @@ struct TypeOrCurve bool isTrackType = true; // true if a OpenRCT2::TrackElemType is selected, false if a TrackCurve is selected; union { - OpenRCT2::TrackElemType trackType = OpenRCT2::TrackElemType::None; + OpenRCT2::TrackElemType trackType = OpenRCT2::TrackElemType::none; TrackCurve curve; }; constexpr TypeOrCurve() noexcept { isTrackType = false; - curve = TrackCurve::None; + curve = TrackCurve::none; } constexpr bool operator==(OpenRCT2::TrackElemType rhs) @@ -737,8 +744,9 @@ TrackRoll TrackGetActualBank(OpenRCT2::TileElement* tileElement, TrackRoll bank) TrackRoll TrackGetActualBank2(ride_type_t rideType, bool isInverted, TrackRoll bank); TrackRoll TrackGetActualBank3(bool useInvertedSprites, OpenRCT2::TileElement* tileElement); -ResultWithMessage TrackAddStationElement(CoordsXYZD loc, RideId rideIndex, int32_t flags, bool fromTrackDesign); -ResultWithMessage TrackRemoveStationElement(const CoordsXYZD& loc, RideId rideIndex, int32_t flags); +ResultWithMessage TrackAddStationElement( + CoordsXYZD loc, RideId rideIndex, OpenRCT2::GameActions::CommandFlags flags, bool fromTrackDesign); +ResultWithMessage TrackRemoveStationElement(const CoordsXYZD& loc, RideId rideIndex, OpenRCT2::GameActions::CommandFlags flags); bool TrackTypeHasSpeedSetting(OpenRCT2::TrackElemType trackType); bool TrackTypeIsHelix(OpenRCT2::TrackElemType trackType); diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 16fc891c0c6e..7161b4481ae9 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -286,2778 +286,2420 @@ namespace OpenRCT2::TrackMetaData { 0, 2, 0, -128, -96, 0 }, { 0, 2, 0, 128, 64, 0 }, { 0, 0, 0, 0, 0, 0 }, - { 0, 2, 0, 0, 0, 32 }, // TrackElemType::FlatTrack1x4A - { 0, 2, 0, 0, 0, 32 }, // TrackElemType::FlatTrack2x2 - { 0, 2, 0, 0, 0, 32 }, // TrackElemType::FlatTrack4x4 - { 0, 2, 0, 0, 0, 32 }, // TrackElemType::FlatTrack2x4 - { 0, 2, 0, 0, 0, 32 }, // TrackElemType::FlatTrack1x5 - { 0, 2, 0, 0, 0, 32 }, // TrackElemType::FlatTrack1x1A - { 0, 2, 0, 0, 0, 32 }, // TrackElemType::FlatTrack1x4B - { 0, 2, 0, 0, 0, 32 }, // TrackElemType::FlatTrack1x1B - { 0, 2, 0, 0, 0, 32 }, // TrackElemType::FlatTrack1x4C - { 0, 0, 0, 96, 32, 0 }, // TrackElemType::FlatTrack3x3 - { 0, 3, 0, 112, -64, -64 }, // TrackElemType::LeftCorkscrewUp - { 0, 1, 0, 112, -64, 64 }, // TrackElemType::RightCorkscrewUp - { 0, 3, 0, -112, -64, -64 }, // TrackElemType::LeftCorkscrewDown - { 0, 1, 0, -112, -64, 64 }, // TrackElemType::RightCorkscrewDown - { 0, 2, 0, 216, -32, -32 }, // TrackElemType::LeftMediumHalfLoopUp - { 0, 2, 0, 216, -32, 32 }, // TrackElemType::RightMediumHalfLoopUp - { 0, 2, 0, -216, 32, -32 }, // TrackElemType::LeftMediumHalfLoopDown - { 0, 2, 0, -216, 32, 32 }, // TrackElemType::RightMediumHalfLoopDown - { 0, 0, 0, 56, -64, 0 }, // TrackElemType::LeftZeroGRollUp - { 0, 0, 0, 56, -64, 0 }, // TrackElemType::RightZeroGRollUp - { 0, 0, 0, -56,-64, 0 }, // TrackElemType::LeftZeroGRollDown - { 0, 0, 0, -56,-64, 0 }, // TrackElemType::RightZeroGRollDown - { 0, 0, 0, 152, -96, 0 }, // TrackElemType::LeftLargeZeroGRollUp - { 0, 0, 0, 152, -96, 0 }, // TrackElemType::RightLargeZeroGRollUp - { 0, 0, 0, -152,-96, 0 }, // TrackElemType::LeftLargeZeroGRollDown - { 0, 0, 0, -152,-96, 0 }, // TrackElemType::RightLargeZeroGRollDown - { 0, 2, 0, 248, -64, -32 }, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp - { 0, 2, 0, 248, -64, 32 }, // TrackElemType::RightFlyerLargeHalfLoopUninvertedUp - { 0, 2, 0, -248, 64, -32 }, // TrackElemType::LeftFlyerLargeHalfLoopInvertedDown - { 0, 2, 0, -248, 64, 32 }, // TrackElemType::RightFlyerLargeHalfLoopInvertedDown - { 0, 2, 0, 280, -64, -32 }, // TrackElemType::LeftFlyerLargeHalfLoopInvertedUp - { 0, 2, 0, 280, -64, 32 }, // TrackElemType::RightFlyerLargeHalfLoopInvertedUp - { 0, 2, 0, -280, 64, -32 }, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown - { 0, 2, 0, -280, 64, 32 }, // TrackElemType::RightFlyerLargeHalfLoopUninvertedDown - { 0, 2, 0, 152, -32, 0 }, // TrackElemType::FlyerHalfLoopInvertedUp - { 0, 2, 0, -152, 32, 0 }, // TrackElemType::FlyerHalfLoopUninvertedDown - { 0, 7, 0, 48, -64, -32 }, // TrackElemType::LeftEighthToDiagUp25 - { 0, 4, 0, 48, -64, 32 }, // TrackElemType::RightEighthToDiagUp25 - { 0, 7, 0,-48, -64, -32 }, // TrackElemType::LeftEighthToDiagDown25 - { 0, 4, 0,-48, -64, 32 }, // TrackElemType::RightEighthToDiagDown25 - { 4, 0, 0, 48, -64, 32 }, // TrackElemType::LeftEighthToOrthogonalUp25 - { 4, 1, 0, 48, -32, 64 }, // TrackElemType::RightEighthToOrthogonalUp25 - { 4, 0, 0,-48, -64, 32 }, // TrackElemType::LeftEighthToOrthogonalDown25 - { 4, 1, 0,-48, -32, 64 }, // TrackElemType::RightEighthToOrthogonalDown25 - { 4, 4, 0, 16, -32, 32 }, // TrackElemType::DiagUp25ToLeftBankedUp25 - { 4, 4, 0, 16, -32, 32 }, // TrackElemType::DiagUp25ToRightBankedUp25 - { 4, 4, 0, 16, -32, 32 }, // TrackElemType::DiagLeftBankedUp25ToUp25 - { 4, 4, 0, 16, -32, 32 }, // TrackElemType::DiagRightBankedUp25ToUp25 - { 4, 4, 16, 0, -32, 32 }, // TrackElemType::DiagDown25ToLeftBankedDown25 - { 4, 4, 16, 0, -32, 32 }, // TrackElemType::DiagDown25ToRightBankedDown25 - { 4, 4, 16, 0, -32, 32 }, // TrackElemType::DiagLeftBankedDown25ToDown25 - { 4, 4, 16, 0, -32, 32 }, // TrackElemType::DiagRightBankedDown25ToDown25 - { 4, 4, 0, 8, -32, 32 }, // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - { 4, 4, 0, 8, -32, 32 }, // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - { 4, 4, 0, 8, -32, 32 }, // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - { 4, 4, 0, 8, -32, 32 }, // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - { 4, 4, 8, 0, -32, 32 }, // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - { 4, 4, 8, 0, -32, 32 }, // TrackElemType::DiagRightBankedFlatToRightBankedDown25 - { 4, 4, 8, 0, -32, 32 }, // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - { 4, 4, 8, 0, -32, 32 }, // TrackElemType::DiagRightBankedDown25ToRightBankedFlat - { 4, 4, 0, 8, -32, 32 }, // TrackElemType::DiagFlatToLeftBankedUp25 - { 4, 4, 0, 8, -32, 32 }, // TrackElemType::DiagFlatToRightBankedUp25 - { 4, 4, 0, 8, -32, 32 }, // TrackElemType::DiagLeftBankedUp25ToFlat - { 4, 4, 0, 8, -32, 32 }, // TrackElemType::DiagRightBankedUp25ToFlat - { 4, 4, 8, 0, -32, 32 }, // TrackElemType::DiagFlatToLeftBankedDown25 - { 4, 4, 8, 0, -32, 32 }, // TrackElemType::DiagFlatToRightBankedDown25 - { 4, 4, 8, 0, -32, 32 }, // TrackElemType::DiagLeftBankedDown25ToFlat - { 4, 4, 8, 0, -32, 32 }, // TrackElemType::DiagRightBankedDown25ToFlat - { 4, 4, 0, 16, -32, 32 }, // TrackElemType::DiagUp25LeftBanked - { 4, 4, 0, 16, -32, 32 }, // TrackElemType::DiagUp25RightBanked - { 4, 4, 16, 0, -32, 32 }, // TrackElemType::DiagDown25LeftBanked - { 4, 4, 16, 0, -32, 32 }, // TrackElemType::DiagDown25RightBanked - { 0, 7, 0, 48, -64, -32 }, // TrackElemType::LeftEighthBankToDiagUp25 - { 0, 4, 0, 48, -64, 32 }, // TrackElemType::RightEighthBankToDiagUp25 - { 0, 7, 0,-48, -64, -32 }, // TrackElemType::LeftEighthBankToDiagDown25 - { 0, 4, 0,-48, -64, 32 }, // TrackElemType::RightEighthBankToDiagDown25 - { 4, 0, 0, 48, -64, 32 }, // TrackElemType::LeftEighthBankToOrthogonalUp25 - { 4, 1, 0, 48, -32, 64 }, // TrackElemType::RightEighthBankToOrthogonalUp25 - { 4, 0, 0,-48, -64, 32 }, // TrackElemType::LeftEighthBankToOrthogonalDown25 - { 4, 1, 0,-48, -32, 64 }, // TrackElemType::RightEighthBankToOrthogonalDown25 - { 4, 4, 0, 0, -32, 32 }, // TrackElemType::DiagBrakes - { 4, 4, 0, 0, -32, 32 }, // TrackElemType::DiagBlockBrakes - { 0, 0, 16, 0, 0, 0 }, // TrackElemType::Down25Brakes - { 4, 4, 0, 0, -32, 32 }, // TrackElemType::DiagBooster - { 4, 4, 0, 88, -96, 96 }, // TrackElemType::DiagFlatToUp60LongBase, - { 4, 4, 0, 88, -96, 96 }, // TrackElemType::DiagUp60ToFlatLongBase, - { 4, 4, 88, 0, -96, 96 }, // TrackElemType::DiagFlatToDown60LongBase, - { 4, 4, 88, 0, -96, 96 }, // TrackElemType::DiagDown60ToFlatLongBase, - { 4, 0, 0,152, -96, 32 }, // TrackElemType::LeftEighthDiveLoopUpToOrthogonal - { 4, 1, 0,152, -32, 96 }, // TrackElemType::RightEighthDiveLoopUpToOrthogonal - { 0, 7,152, 0, -96, -32 }, // TrackElemType::LeftEighthDiveLoopDownToDiag - { 0, 4,152, 0, -96, 32 }, // TrackElemType::RightEighthDiveLoopDownToDiag - { 4, 4, 16, 0, -32, 32 } // TrackElemType::DiagDown25Brakes - }; - static_assert(std::size(kTrackCoordinates) == EnumValue(TrackElemType::Count)); - + { 0, 2, 0, 0, 0, 32 }, // TrackElemType::flatTrack1x4A + { 0, 2, 0, 0, 0, 32 }, // TrackElemType::flatTrack2x2 + { 0, 2, 0, 0, 0, 32 }, // TrackElemType::flatTrack4x4 + { 0, 2, 0, 0, 0, 32 }, // TrackElemType::flatTrack2x4 + { 0, 2, 0, 0, 0, 32 }, // TrackElemType::flatTrack1x5 + { 0, 2, 0, 0, 0, 32 }, // TrackElemType::flatTrack1x1A + { 0, 2, 0, 0, 0, 32 }, // TrackElemType::flatTrack1x4B + { 0, 2, 0, 0, 0, 32 }, // TrackElemType::flatTrack1x1B + { 0, 2, 0, 0, 0, 32 }, // TrackElemType::flatTrack1x4C + { 0, 0, 0, 96, 32, 0 }, // TrackElemType::flatTrack3x3 + { 0, 3, 0, 112, -64, -64 }, // TrackElemType::leftCorkscrewUp + { 0, 1, 0, 112, -64, 64 }, // TrackElemType::rightCorkscrewUp + { 0, 3, 0, -112, -64, -64 }, // TrackElemType::leftCorkscrewDown + { 0, 1, 0, -112, -64, 64 }, // TrackElemType::rightCorkscrewDown + { 0, 2, 0, 216, -32, -32 }, // TrackElemType::leftMediumHalfLoopUp + { 0, 2, 0, 216, -32, 32 }, // TrackElemType::rightMediumHalfLoopUp + { 0, 2, 0, -216, 32, -32 }, // TrackElemType::leftMediumHalfLoopDown + { 0, 2, 0, -216, 32, 32 }, // TrackElemType::rightMediumHalfLoopDown + { 0, 0, 0, 56, -64, 0 }, // TrackElemType::leftZeroGRollUp + { 0, 0, 0, 56, -64, 0 }, // TrackElemType::rightZeroGRollUp + { 0, 0, 0, -56,-64, 0 }, // TrackElemType::leftZeroGRollDown + { 0, 0, 0, -56,-64, 0 }, // TrackElemType::rightZeroGRollDown + { 0, 0, 0, 152, -96, 0 }, // TrackElemType::leftLargeZeroGRollUp + { 0, 0, 0, 152, -96, 0 }, // TrackElemType::rightLargeZeroGRollUp + { 0, 0, 0, -152,-96, 0 }, // TrackElemType::leftLargeZeroGRollDown + { 0, 0, 0, -152,-96, 0 }, // TrackElemType::rightLargeZeroGRollDown + { 0, 2, 0, 248, -64, -32 }, // TrackElemType::leftFlyerLargeHalfLoopUninvertedUp + { 0, 2, 0, 248, -64, 32 }, // TrackElemType::rightFlyerLargeHalfLoopUninvertedUp + { 0, 2, 0, -248, 64, -32 }, // TrackElemType::leftFlyerLargeHalfLoopInvertedDown + { 0, 2, 0, -248, 64, 32 }, // TrackElemType::rightFlyerLargeHalfLoopInvertedDown + { 0, 2, 0, 280, -64, -32 }, // TrackElemType::leftFlyerLargeHalfLoopInvertedUp + { 0, 2, 0, 280, -64, 32 }, // TrackElemType::rightFlyerLargeHalfLoopInvertedUp + { 0, 2, 0, -280, 64, -32 }, // TrackElemType::leftFlyerLargeHalfLoopUninvertedDown + { 0, 2, 0, -280, 64, 32 }, // TrackElemType::rightFlyerLargeHalfLoopUninvertedDown + { 0, 2, 0, 152, -32, 0 }, // TrackElemType::flyerHalfLoopInvertedUp + { 0, 2, 0, -152, 32, 0 }, // TrackElemType::flyerHalfLoopUninvertedDown + { 0, 7, 0, 48, -64, -32 }, // TrackElemType::leftEighthToDiagUp25 + { 0, 4, 0, 48, -64, 32 }, // TrackElemType::rightEighthToDiagUp25 + { 0, 7, 0,-48, -64, -32 }, // TrackElemType::leftEighthToDiagDown25 + { 0, 4, 0,-48, -64, 32 }, // TrackElemType::rightEighthToDiagDown25 + { 4, 0, 0, 48, -64, 32 }, // TrackElemType::leftEighthToOrthogonalUp25 + { 4, 1, 0, 48, -32, 64 }, // TrackElemType::rightEighthToOrthogonalUp25 + { 4, 0, 0,-48, -64, 32 }, // TrackElemType::leftEighthToOrthogonalDown25 + { 4, 1, 0,-48, -32, 64 }, // TrackElemType::rightEighthToOrthogonalDown25 + { 4, 4, 0, 16, -32, 32 }, // TrackElemType::diagUp25ToLeftBankedUp25 + { 4, 4, 0, 16, -32, 32 }, // TrackElemType::diagUp25ToRightBankedUp25 + { 4, 4, 0, 16, -32, 32 }, // TrackElemType::diagLeftBankedUp25ToUp25 + { 4, 4, 0, 16, -32, 32 }, // TrackElemType::diagRightBankedUp25ToUp25 + { 4, 4, 16, 0, -32, 32 }, // TrackElemType::diagDown25ToLeftBankedDown25 + { 4, 4, 16, 0, -32, 32 }, // TrackElemType::diagDown25ToRightBankedDown25 + { 4, 4, 16, 0, -32, 32 }, // TrackElemType::diagLeftBankedDown25ToDown25 + { 4, 4, 16, 0, -32, 32 }, // TrackElemType::diagRightBankedDown25ToDown25 + { 4, 4, 0, 8, -32, 32 }, // TrackElemType::diagLeftBankedFlatToLeftBankedUp25 + { 4, 4, 0, 8, -32, 32 }, // TrackElemType::diagRightBankedFlatToRightBankedUp25 + { 4, 4, 0, 8, -32, 32 }, // TrackElemType::diagLeftBankedUp25ToLeftBankedFlat + { 4, 4, 0, 8, -32, 32 }, // TrackElemType::diagRightBankedUp25ToRightBankedFlat + { 4, 4, 8, 0, -32, 32 }, // TrackElemType::diagLeftBankedFlatToLeftBankedDown25 + { 4, 4, 8, 0, -32, 32 }, // TrackElemType::diagRightBankedFlatToRightBankedDown25 + { 4, 4, 8, 0, -32, 32 }, // TrackElemType::diagLeftBankedDown25ToLeftBankedFlat + { 4, 4, 8, 0, -32, 32 }, // TrackElemType::diagRightBankedDown25ToRightBankedFlat + { 4, 4, 0, 8, -32, 32 }, // TrackElemType::diagFlatToLeftBankedUp25 + { 4, 4, 0, 8, -32, 32 }, // TrackElemType::diagFlatToRightBankedUp25 + { 4, 4, 0, 8, -32, 32 }, // TrackElemType::diagLeftBankedUp25ToFlat + { 4, 4, 0, 8, -32, 32 }, // TrackElemType::diagRightBankedUp25ToFlat + { 4, 4, 8, 0, -32, 32 }, // TrackElemType::diagFlatToLeftBankedDown25 + { 4, 4, 8, 0, -32, 32 }, // TrackElemType::diagFlatToRightBankedDown25 + { 4, 4, 8, 0, -32, 32 }, // TrackElemType::diagLeftBankedDown25ToFlat + { 4, 4, 8, 0, -32, 32 }, // TrackElemType::diagRightBankedDown25ToFlat + { 4, 4, 0, 16, -32, 32 }, // TrackElemType::diagUp25LeftBanked + { 4, 4, 0, 16, -32, 32 }, // TrackElemType::diagUp25RightBanked + { 4, 4, 16, 0, -32, 32 }, // TrackElemType::diagDown25LeftBanked + { 4, 4, 16, 0, -32, 32 }, // TrackElemType::diagDown25RightBanked + { 0, 7, 0, 48, -64, -32 }, // TrackElemType::leftEighthBankToDiagUp25 + { 0, 4, 0, 48, -64, 32 }, // TrackElemType::rightEighthBankToDiagUp25 + { 0, 7, 0,-48, -64, -32 }, // TrackElemType::leftEighthBankToDiagDown25 + { 0, 4, 0,-48, -64, 32 }, // TrackElemType::rightEighthBankToDiagDown25 + { 4, 0, 0, 48, -64, 32 }, // TrackElemType::leftEighthBankToOrthogonalUp25 + { 4, 1, 0, 48, -32, 64 }, // TrackElemType::rightEighthBankToOrthogonalUp25 + { 4, 0, 0,-48, -64, 32 }, // TrackElemType::leftEighthBankToOrthogonalDown25 + { 4, 1, 0,-48, -32, 64 }, // TrackElemType::rightEighthBankToOrthogonalDown25 + { 4, 4, 0, 0, -32, 32 }, // TrackElemType::diagBrakes + { 4, 4, 0, 0, -32, 32 }, // TrackElemType::diagBlockBrakes + { 0, 0, 16, 0, 0, 0 }, // TrackElemType::down25Brakes + { 4, 4, 0, 0, -32, 32 }, // TrackElemType::diagBooster + { 4, 4, 0, 88, -96, 96 }, // TrackElemType::diagFlatToUp60LongBase, + { 4, 4, 0, 88, -96, 96 }, // TrackElemType::diagUp60ToFlatLongBase, + { 4, 4, 88, 0, -96, 96 }, // TrackElemType::diagFlatToDown60LongBase, + { 4, 4, 88, 0, -96, 96 }, // TrackElemType::diagDown60ToFlatLongBase, + { 4, 0, 0,152, -96, 32 }, // TrackElemType::leftEighthDiveLoopUpToOrthogonal + { 4, 1, 0,152, -32, 96 }, // TrackElemType::rightEighthDiveLoopUpToOrthogonal + { 0, 7,152, 0, -96, -32 }, // TrackElemType::leftEighthDiveLoopDownToDiag + { 0, 4,152, 0, -96, 32 }, // TrackElemType::rightEighthDiveLoopDownToDiag + { 4, 4, 16, 0, -32, 32 } // TrackElemType::diagDown25Brakes + }; + static_assert(std::size(kTrackCoordinates) == EnumValue(TrackElemType::count)); + static constexpr uint8_t kTrackPieceLengths[] = { - 32, // TrackElemType::Flat - 32, // TrackElemType::EndStation - 32, // TrackElemType::BeginStation - 32, // TrackElemType::MiddleStation - 33, // TrackElemType::Up25 - 40, // TrackElemType::Up60 - 32, // TrackElemType::FlatToUp25 - 34, // TrackElemType::Up25ToUp60 - 34, // TrackElemType::Up60ToUp25 - 32, // TrackElemType::Up25ToFlat - 33, // TrackElemType::Down25 - 40, // TrackElemType::Down60 - 32, // TrackElemType::FlatToDown25 - 34, // TrackElemType::Down25ToDown60 - 34, // TrackElemType::Down60ToDown25 - 32, // TrackElemType::Down25ToFlat - 124, // TrackElemType::LeftQuarterTurn5Tiles - 124, // TrackElemType::RightQuarterTurn5Tiles - 32, // TrackElemType::FlatToLeftBank - 32, // TrackElemType::FlatToRightBank - 32, // TrackElemType::LeftBankToFlat - 32, // TrackElemType::RightBankToFlat - 124, // TrackElemType::BankedLeftQuarterTurn5Tiles - 124, // TrackElemType::BankedRightQuarterTurn5Tiles - 32, // TrackElemType::LeftBankToUp25 - 32, // TrackElemType::RightBankToUp25 - 32, // TrackElemType::Up25ToLeftBank - 32, // TrackElemType::Up25ToRightBank - 32, // TrackElemType::LeftBankToDown25 - 32, // TrackElemType::RightBankToDown25 - 32, // TrackElemType::Down25ToLeftBank - 32, // TrackElemType::Down25ToRightBank - 32, // TrackElemType::LeftBank - 32, // TrackElemType::RightBank - 130, // TrackElemType::LeftQuarterTurn5TilesUp25 - 130, // TrackElemType::RightQuarterTurn5TilesUp25 - 130, // TrackElemType::LeftQuarterTurn5TilesDown25 - 130, // TrackElemType::RightQuarterTurn5TilesDown25 - 96, // TrackElemType::SBendLeft - 96, // TrackElemType::SBendRight - 120, // TrackElemType::LeftVerticalLoop - 120, // TrackElemType::RightVerticalLoop - 75, // TrackElemType::LeftQuarterTurn3Tiles - 75, // TrackElemType::RightQuarterTurn3Tiles - 75, // TrackElemType::LeftBankedQuarterTurn3Tiles - 75, // TrackElemType::RightBankedQuarterTurn3Tiles - 77, // TrackElemType::LeftQuarterTurn3TilesUp25 - 77, // TrackElemType::RightQuarterTurn3TilesUp25 - 77, // TrackElemType::LeftQuarterTurn3TilesDown25 - 77, // TrackElemType::RightQuarterTurn3TilesDown25 - 24, // TrackElemType::LeftQuarterTurn1Tile - 24, // TrackElemType::RightQuarterTurn1Tile - 96, // TrackElemType::LeftTwistDownToUp - 96, // TrackElemType::RightTwistDownToUp - 96, // TrackElemType::LeftTwistUpToDown - 96, // TrackElemType::RightTwistUpToDown - 60, // TrackElemType::HalfLoopUp - 60, // TrackElemType::HalfLoopDown - 55, // TrackElemType::LeftCorkscrewUp - 55, // TrackElemType::RightCorkscrewUp - 55, // TrackElemType::LeftCorkscrewDown - 55, // TrackElemType::RightCorkscrewDown - 36, // TrackElemType::FlatToUp60 - 36, // TrackElemType::Up60ToFlat - 36, // TrackElemType::FlatToDown60 - 36, // TrackElemType::Down60ToFlat - 32, // TrackElemType::TowerBase - 32, // TrackElemType::TowerSection - 32, // TrackElemType::FlatCovered - 33, // TrackElemType::Up25Covered - 40, // TrackElemType::Up60Covered - 32, // TrackElemType::FlatToUp25Covered - 34, // TrackElemType::Up25ToUp60Covered - 34, // TrackElemType::Up60ToUp25Covered - 32, // TrackElemType::Up25ToFlatCovered - 33, // TrackElemType::Down25Covered - 40, // TrackElemType::Down60Covered - 32, // TrackElemType::FlatToDown25Covered - 34, // TrackElemType::Down25ToDown60Covered - 34, // TrackElemType::Down60ToDown25Covered - 32, // TrackElemType::Down25ToFlatCovered - 124, // TrackElemType::LeftQuarterTurn5TilesCovered - 124, // TrackElemType::RightQuarterTurn5TilesCovered - 96, // TrackElemType::SBendLeftCovered - 96, // TrackElemType::SBendRightCovered - 75, // TrackElemType::LeftQuarterTurn3TilesCovered - 75, // TrackElemType::RightQuarterTurn3TilesCovered - 150, // TrackElemType::LeftHalfBankedHelixUpSmall - 150, // TrackElemType::RightHalfBankedHelixUpSmall - 150, // TrackElemType::LeftHalfBankedHelixDownSmall - 150, // TrackElemType::RightHalfBankedHelixDownSmall - 248, // TrackElemType::LeftHalfBankedHelixUpLarge - 248, // TrackElemType::RightHalfBankedHelixUpLarge - 248, // TrackElemType::LeftHalfBankedHelixDownLarge - 248, // TrackElemType::RightHalfBankedHelixDownLarge - 64, // TrackElemType::LeftQuarterTurn1TileUp60 - 64, // TrackElemType::RightQuarterTurn1TileUp60 - 64, // TrackElemType::LeftQuarterTurn1TileDown60 - 64, // TrackElemType::RightQuarterTurn1TileDown60 - 32, // TrackElemType::Brakes - 32, // TrackElemType::Booster - 32, // TrackElemType::InvertedUp90ToFlatQuarterLoopAlias / Maze - 124, // TrackElemType::LeftQuarterBankedHelixLargeUp - 124, // TrackElemType::RightQuarterBankedHelixLargeUp - 124, // TrackElemType::LeftQuarterBankedHelixLargeDown - 124, // TrackElemType::RightQuarterBankedHelixLargeDown - 124, // TrackElemType::LeftQuarterHelixLargeUp - 124, // TrackElemType::RightQuarterHelixLargeUp - 124, // TrackElemType::LeftQuarterHelixLargeDown - 124, // TrackElemType::RightQuarterHelixLargeDown - 33, // TrackElemType::Up25LeftBanked - 33, // TrackElemType::Up25RightBanked - 32, // TrackElemType::Waterfall - 32, // TrackElemType::Rapids - 32, // TrackElemType::OnRidePhoto - 33, // TrackElemType::Down25LeftBanked - 33, // TrackElemType::Down25RightBanked - 128, // TrackElemType::Watersplash - 165, // TrackElemType::FlatToUp60LongBase - 165, // TrackElemType::Up60ToFlatLongBase - 32, // TrackElemType::Whirlpool - 165, // TrackElemType::Down60ToFlatLongBase - 165, // TrackElemType::FlatToDown60LongBase - 138, // TrackElemType::CableLiftHill - 32, // TrackElemType::ReverseFreefallSlope - 32, // TrackElemType::ReverseFreefallVertical - 32, // TrackElemType::Up90 - 32, // TrackElemType::Down90 - 32, // TrackElemType::Up60ToUp90 - 32, // TrackElemType::Down90ToDown60 - 32, // TrackElemType::Up90ToUp60 - 32, // TrackElemType::Down60ToDown90 - 32, // TrackElemType::BrakeForDrop - 87, // TrackElemType::LeftEighthToDiag - 87, // TrackElemType::RightEighthToDiag - 87, // TrackElemType::LeftEighthToOrthogonal - 87, // TrackElemType::RightEighthToOrthogonal - 87, // TrackElemType::LeftEighthBankToDiag - 87, // TrackElemType::RightEighthBankToDiag - 87, // TrackElemType::LeftEighthBankToOrthogonal - 87, // TrackElemType::RightEighthBankToOrthogonal - 45, // TrackElemType::DiagFlat - 45, // TrackElemType::DiagUp25 - 45, // TrackElemType::DiagUp60 - 45, // TrackElemType::DiagFlatToUp25 - 45, // TrackElemType::DiagUp25ToUp60 - 45, // TrackElemType::DiagUp60ToUp25 - 45, // TrackElemType::DiagUp25ToFlat - 45, // TrackElemType::DiagDown25 - 45, // TrackElemType::DiagDown60 - 45, // TrackElemType::DiagFlatToDown25 - 45, // TrackElemType::DiagDown25ToDown60 - 45, // TrackElemType::DiagDown60ToDown25 - 45, // TrackElemType::DiagDown25ToFlat - 45, // TrackElemType::DiagFlatToUp60 - 45, // TrackElemType::DiagUp60ToFlat - 45, // TrackElemType::DiagFlatToDown60 - 45, // TrackElemType::DiagDown60ToFlat - 45, // TrackElemType::DiagFlatToLeftBank - 45, // TrackElemType::DiagFlatToRightBank - 45, // TrackElemType::DiagLeftBankToFlat - 45, // TrackElemType::DiagRightBankToFlat - 45, // TrackElemType::DiagLeftBankToUp25 - 45, // TrackElemType::DiagRightBankToUp25 - 45, // TrackElemType::DiagUp25ToLeftBank - 45, // TrackElemType::DiagUp25ToRightBank - 45, // TrackElemType::DiagLeftBankToDown25 - 45, // TrackElemType::DiagRightBankToDown25 - 45, // TrackElemType::DiagDown25ToLeftBank - 45, // TrackElemType::DiagDown25ToRightBank - 45, // TrackElemType::DiagLeftBank - 45, // TrackElemType::DiagRightBank - 16, // TrackElemType::LogFlumeReverser - 32, // TrackElemType::SpinningTunnel - 96, // TrackElemType::LeftBarrelRollUpToDown - 96, // TrackElemType::RightBarrelRollUpToDown - 96, // TrackElemType::LeftBarrelRollDownToUp - 96, // TrackElemType::RightBarrelRollDownToUp - 64, // TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25 - 64, // TrackElemType::RightBankToRightQuarterTurn3TilesUp25 - 64, // TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank - 64, // TrackElemType::RightQuarterTurn3TilesDown25ToRightBank - 32, // TrackElemType::PoweredLift - 100, // TrackElemType::LeftLargeHalfLoopUp - 100, // TrackElemType::RightLargeHalfLoopUp - 100, // TrackElemType::LeftLargeHalfLoopDown - 100, // TrackElemType::RightLargeHalfLoopDown - 96, // TrackElemType::LeftFlyerTwistUp - 96, // TrackElemType::RightFlyerTwistUp - 96, // TrackElemType::LeftFlyerTwistDown - 96, // TrackElemType::RightFlyerTwistDown - 64, // TrackElemType::FlyerHalfLoopUninvertedUp - 64, // TrackElemType::FlyerHalfLoopInvertedDown - 64, // TrackElemType::LeftFlyerCorkscrewUp - 64, // TrackElemType::RightFlyerCorkscrewUp - 64, // TrackElemType::LeftFlyerCorkscrewDown - 64, // TrackElemType::RightFlyerCorkscrewDown - 16, // TrackElemType::HeartLineTransferUp - 16, // TrackElemType::HeartLineTransferDown - 64, // TrackElemType::LeftHeartLineRoll - 64, // TrackElemType::RightHeartLineRoll - 32, // TrackElemType::MinigolfHoleA - 32, // TrackElemType::MinigolfHoleB - 32, // TrackElemType::MinigolfHoleC - 32, // TrackElemType::MinigolfHoleD - 32, // TrackElemType::MinigolfHoleE - 80, // TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop - 80, // TrackElemType::Up90ToInvertedFlatQuarterLoop - 80, // TrackElemType::InvertedFlatToDown90QuarterLoop - 64, // TrackElemType::LeftCurvedLiftHill - 64, // TrackElemType::RightCurvedLiftHill - 32, // TrackElemType::LeftReverser - 32, // TrackElemType::RightReverser - 32, // TrackElemType::AirThrustTopCap - 32, // TrackElemType::AirThrustVerticalDown - 32, // TrackElemType::AirThrustVerticalDownToLevel - 32, // TrackElemType::BlockBrakes - 32, // TrackElemType::LeftBankedQuarterTurn3TileUp25 - 32, // TrackElemType::RightBankedQuarterTurn3TileUp25 - 32, // TrackElemType::LeftBankedQuarterTurn3TileDown25 - 32, // TrackElemType::RightBankedQuarterTurn3TileDown25 - 32, // TrackElemType::LeftBankedQuarterTurn5TileUp25 - 32, // TrackElemType::RightBankedQuarterTurn5TileUp25 - 32, // TrackElemType::LeftBankedQuarterTurn5TileDown25 - 32, // TrackElemType::RightBankedQuarterTurn5TileDown25 - 32, // TrackElemType::Up25ToLeftBankedUp25 - 32, // TrackElemType::Up25ToRightBankedUp25 - 32, // TrackElemType::LeftBankedUp25ToUp25 - 32, // TrackElemType::RightBankedUp25ToUp25 - 32, // TrackElemType::Down25ToLeftBankedDown25 - 32, // TrackElemType::Down25ToRightBankedDown25 - 32, // TrackElemType::LeftBankedDown25ToDown25 - 32, // TrackElemType::RightBankedDown25ToDown25 - 32, // TrackElemType::LeftBankedFlatToLeftBankedUp25 - 32, // TrackElemType::RightBankedFlatToRightBankedUp25 - 32, // TrackElemType::LeftBankedUp25ToLeftBankedFlat - 32, // TrackElemType::RightBankedUp25ToRightBankedFlat - 32, // TrackElemType::LeftBankedFlatToLeftBankedDown25 - 32, // TrackElemType::RightBankedFlatToRightBankedDown25 - 32, // TrackElemType::LeftBankedDown25ToLeftBankedFlat - 32, // TrackElemType::RightBankedDown25ToRightBankedFlat - 32, // TrackElemType::FlatToLeftBankedUp25 - 32, // TrackElemType::FlatToRightBankedUp25 - 32, // TrackElemType::LeftBankedUp25ToFlat - 32, // TrackElemType::RightBankedUp25ToFlat - 32, // TrackElemType::FlatToLeftBankedDown25 - 32, // TrackElemType::FlatToRightBankedDown25 - 32, // TrackElemType::LeftBankedDown25ToFlat - 32, // TrackElemType::RightBankedDown25ToFlat - 32, // TrackElemType::LeftQuarterTurn1TileUp90 - 32, // TrackElemType::RightQuarterTurn1TileUp90 - 32, // TrackElemType::LeftQuarterTurn1TileDown90 - 32, // TrackElemType::RightQuarterTurn1TileDown90 - 80, // TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop - 80, // TrackElemType::MultiDimFlatToDown90QuarterLoop - 80, // TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop - 32, // TrackElemType::RotationControlToggle - 0, // TrackElemType::FlatTrack1x4A - 0, // TrackElemType::FlatTrack2x2 - 0, // TrackElemType::FlatTrack4x4 - 0, // TrackElemType::FlatTrack2x4 - 0, // TrackElemType::FlatTrack1x5 - 0, // TrackElemType::FlatTrack1x1A - 0, // TrackElemType::FlatTrack1x4B - 0, // TrackElemType::FlatTrack1x1B - 0, // TrackElemType::FlatTrack1x4C - 0, // TrackElemType::FlatTrack3x3 - 96, // TrackElemType::LeftCorkscrewUp - 96, // TrackElemType::RightCorkscrewUp - 96, // TrackElemType::LeftCorkscrewDown - 96, // TrackElemType::RightCorkscrewDown - 80, // TrackElemType::LeftMediumHalfLoopUp - 80, // TrackElemType::RightMediumHalfLoopUp - 80, // TrackElemType::LeftMediumHalfLoopDown - 80, // TrackElemType::RightMediumHalfLoopDown - 96, // TrackElemType::LeftZeroGRollUp - 96, // TrackElemType::RightZeroGRollUp - 96, // TrackElemType::LeftZeroGRollDown - 96, // TrackElemType::RightZeroGRollDown - 165, // TrackElemType::LeftLargeZeroGRollUp - 165, // TrackElemType::RightLargeZeroGRollUp - 165, // TrackElemType::LeftLargeZeroGRollDown - 165, // TrackElemType::RightLargeZeroGRollDown - 100, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp - 100, // TrackElemType::RightFlyerLargeHalfLoopUninvertedUp - 100, // TrackElemType::LeftFlyerLargeHalfLoopInvertedDown - 100, // TrackElemType::RightFlyerLargeHalfLoopInvertedDown - 100, // TrackElemType::LeftFlyerLargeHalfLoopInvertedUp - 100, // TrackElemType::RightFlyerLargeHalfLoopInvertedUp - 100, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown - 100, // TrackElemType::RightFlyerLargeHalfLoopUninvertedDown - 64, // TrackElemType::FlyerHalfLoopInvertedUp - 64, // TrackElemType::FlyerHalfLoopUninvertedDown - 92, // TrackElemType::LeftEighthToDiagUp25 - 92, // TrackElemType::RightEighthToDiagUp25 - 92, // TrackElemType::LeftEighthToDiagDown25 - 92, // TrackElemType::RightEighthToDiagDown25 - 92, // TrackElemType::LeftEighthToOrthogonalUp25 - 92, // TrackElemType::RightEighthToOrthogonalUp25 - 92, // TrackElemType::LeftEighthToOrthogonalDown25 - 92, // TrackElemType::RightEighthToOrthogonalDown25 - 45, // TrackElemType::DiagUp25ToLeftBankedUp25 - 45, // TrackElemType::DiagUp25ToRightBankedUp25 - 45, // TrackElemType::DiagLeftBankedUp25ToUp25 - 45, // TrackElemType::DiagRightBankedUp25ToUp25 - 45, // TrackElemType::DiagDown25ToLeftBankedDown25 - 45, // TrackElemType::DiagDown25ToRightBankedDown25 - 45, // TrackElemType::DiagLeftBankedDown25ToDown25 - 45, // TrackElemType::DiagRightBankedDown25ToDown25 - 45, // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - 45, // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - 45, // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - 45, // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - 45, // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - 45, // TrackElemType::DiagRightBankedFlatToRightBankedDown25 - 45, // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - 45, // TrackElemType::DiagRightBankedDown25ToRightBankedFlat - 45, // TrackElemType::DiagFlatToLeftBankedUp25 - 45, // TrackElemType::DiagFlatToRightBankedUp25 - 45, // TrackElemType::DiagLeftBankedUp25ToFlat - 45, // TrackElemType::DiagRightBankedUp25ToFlat - 45, // TrackElemType::DiagFlatToLeftBankedDown25 - 45, // TrackElemType::DiagFlatToRightBankedDown25 - 45, // TrackElemType::DiagLeftBankedDown25ToFlat - 45, // TrackElemType::DiagRightBankedDown25ToFlat - 45, // TrackElemType::DiagUp25LeftBanked - 45, // TrackElemType::DiagUp25RightBanked - 45, // TrackElemType::DiagDown25LeftBanked - 45, // TrackElemType::DiagDown25RightBanked - 92, // TrackElemType::LeftEighthBankToDiagUp25 - 92, // TrackElemType::RightEighthBankToDiagUp25 - 92, // TrackElemType::LeftEighthBankToDiagDown25 - 92, // TrackElemType::RightEighthBankToDiagDown25 - 92, // TrackElemType::LeftEighthBankToOrthogonalUp25 - 92, // TrackElemType::RightEighthBankToOrthogonalUp25 - 92, // TrackElemType::LeftEighthBankToOrthogonalDown25 - 92, // TrackElemType::RightEighthBankToOrthogonalDown25 - 45, // TrackElemType::DiagBrakes - 45, // TrackElemType::DiagBlockBrakes - 33, // TrackElemType::Down25Brakes - 45, // TrackElemType::DiagBooster - 165, // TrackElemType::DiagFlatToUp60LongBase, - 165, // TrackElemType::DiagUp60ToFlatLongBase, - 165, // TrackElemType::DiagFlatToDown60LongBase, - 165, // TrackElemType::DiagDown60ToFlatLongBase, - 165, // TrackElemType::LeftEighthDiveLoopUpToOrthogonal - 165, // TrackElemType::RightEighthDiveLoopUpToOrthogonal - 165, // TrackElemType::LeftEighthDiveLoopDownToDiag - 165, // TrackElemType::RightEighthDiveLoopDownToDiag - 45, // TrackElemType::DiagDown25Brakes - }; - - static_assert(std::size(kTrackPieceLengths) == EnumValue(TrackElemType::Count)); - + 32, // TrackElemType::flat + 32, // TrackElemType::endStation + 32, // TrackElemType::beginStation + 32, // TrackElemType::middleStation + 33, // TrackElemType::up25 + 40, // TrackElemType::up60 + 32, // TrackElemType::flatToUp25 + 34, // TrackElemType::up25ToUp60 + 34, // TrackElemType::up60ToUp25 + 32, // TrackElemType::up25ToFlat + 33, // TrackElemType::down25 + 40, // TrackElemType::down60 + 32, // TrackElemType::flatToDown25 + 34, // TrackElemType::down25ToDown60 + 34, // TrackElemType::down60ToDown25 + 32, // TrackElemType::down25ToFlat + 124, // TrackElemType::leftQuarterTurn5Tiles + 124, // TrackElemType::rightQuarterTurn5Tiles + 32, // TrackElemType::flatToLeftBank + 32, // TrackElemType::flatToRightBank + 32, // TrackElemType::leftBankToFlat + 32, // TrackElemType::rightBankToFlat + 124, // TrackElemType::bankedLeftQuarterTurn5Tiles + 124, // TrackElemType::bankedRightQuarterTurn5Tiles + 32, // TrackElemType::leftBankToUp25 + 32, // TrackElemType::rightBankToUp25 + 32, // TrackElemType::up25ToLeftBank + 32, // TrackElemType::up25ToRightBank + 32, // TrackElemType::leftBankToDown25 + 32, // TrackElemType::rightBankToDown25 + 32, // TrackElemType::down25ToLeftBank + 32, // TrackElemType::down25ToRightBank + 32, // TrackElemType::leftBank + 32, // TrackElemType::rightBank + 130, // TrackElemType::leftQuarterTurn5TilesUp25 + 130, // TrackElemType::rightQuarterTurn5TilesUp25 + 130, // TrackElemType::leftQuarterTurn5TilesDown25 + 130, // TrackElemType::rightQuarterTurn5TilesDown25 + 96, // TrackElemType::sBendLeft + 96, // TrackElemType::sBendRight + 120, // TrackElemType::leftVerticalLoop + 120, // TrackElemType::rightVerticalLoop + 75, // TrackElemType::leftQuarterTurn3Tiles + 75, // TrackElemType::rightQuarterTurn3Tiles + 75, // TrackElemType::leftBankedQuarterTurn3Tiles + 75, // TrackElemType::rightBankedQuarterTurn3Tiles + 77, // TrackElemType::leftQuarterTurn3TilesUp25 + 77, // TrackElemType::rightQuarterTurn3TilesUp25 + 77, // TrackElemType::leftQuarterTurn3TilesDown25 + 77, // TrackElemType::rightQuarterTurn3TilesDown25 + 24, // TrackElemType::leftQuarterTurn1Tile + 24, // TrackElemType::rightQuarterTurn1Tile + 96, // TrackElemType::leftTwistDownToUp + 96, // TrackElemType::rightTwistDownToUp + 96, // TrackElemType::leftTwistUpToDown + 96, // TrackElemType::rightTwistUpToDown + 60, // TrackElemType::halfLoopUp + 60, // TrackElemType::halfLoopDown + 55, // TrackElemType::leftCorkscrewUp + 55, // TrackElemType::rightCorkscrewUp + 55, // TrackElemType::leftCorkscrewDown + 55, // TrackElemType::rightCorkscrewDown + 36, // TrackElemType::flatToUp60 + 36, // TrackElemType::up60ToFlat + 36, // TrackElemType::flatToDown60 + 36, // TrackElemType::down60ToFlat + 32, // TrackElemType::towerBase + 32, // TrackElemType::towerSection + 32, // TrackElemType::flatCovered + 33, // TrackElemType::up25Covered + 40, // TrackElemType::up60Covered + 32, // TrackElemType::flatToUp25Covered + 34, // TrackElemType::up25ToUp60Covered + 34, // TrackElemType::up60ToUp25Covered + 32, // TrackElemType::up25ToFlatCovered + 33, // TrackElemType::down25Covered + 40, // TrackElemType::down60Covered + 32, // TrackElemType::flatToDown25Covered + 34, // TrackElemType::down25ToDown60Covered + 34, // TrackElemType::down60ToDown25Covered + 32, // TrackElemType::down25ToFlatCovered + 124, // TrackElemType::leftQuarterTurn5TilesCovered + 124, // TrackElemType::rightQuarterTurn5TilesCovered + 96, // TrackElemType::sBendLeftCovered + 96, // TrackElemType::sBendRightCovered + 75, // TrackElemType::leftQuarterTurn3TilesCovered + 75, // TrackElemType::rightQuarterTurn3TilesCovered + 150, // TrackElemType::leftHalfBankedHelixUpSmall + 150, // TrackElemType::rightHalfBankedHelixUpSmall + 150, // TrackElemType::leftHalfBankedHelixDownSmall + 150, // TrackElemType::rightHalfBankedHelixDownSmall + 248, // TrackElemType::leftHalfBankedHelixUpLarge + 248, // TrackElemType::rightHalfBankedHelixUpLarge + 248, // TrackElemType::leftHalfBankedHelixDownLarge + 248, // TrackElemType::rightHalfBankedHelixDownLarge + 64, // TrackElemType::leftQuarterTurn1TileUp60 + 64, // TrackElemType::rightQuarterTurn1TileUp60 + 64, // TrackElemType::leftQuarterTurn1TileDown60 + 64, // TrackElemType::rightQuarterTurn1TileDown60 + 32, // TrackElemType::brakes + 32, // TrackElemType::booster + 32, // TrackElemType::invertedUp90ToFlatQuarterLoopAlias / Maze + 124, // TrackElemType::leftQuarterBankedHelixLargeUp + 124, // TrackElemType::rightQuarterBankedHelixLargeUp + 124, // TrackElemType::leftQuarterBankedHelixLargeDown + 124, // TrackElemType::rightQuarterBankedHelixLargeDown + 124, // TrackElemType::leftQuarterHelixLargeUp + 124, // TrackElemType::rightQuarterHelixLargeUp + 124, // TrackElemType::leftQuarterHelixLargeDown + 124, // TrackElemType::rightQuarterHelixLargeDown + 33, // TrackElemType::up25LeftBanked + 33, // TrackElemType::up25RightBanked + 32, // TrackElemType::waterfall + 32, // TrackElemType::rapids + 32, // TrackElemType::onRidePhoto + 33, // TrackElemType::down25LeftBanked + 33, // TrackElemType::down25RightBanked + 128, // TrackElemType::watersplash + 165, // TrackElemType::flatToUp60LongBase + 165, // TrackElemType::up60ToFlatLongBase + 32, // TrackElemType::whirlpool + 165, // TrackElemType::down60ToFlatLongBase + 165, // TrackElemType::flatToDown60LongBase + 138, // TrackElemType::cableLiftHill + 32, // TrackElemType::reverseFreefallSlope + 32, // TrackElemType::reverseFreefallVertical + 32, // TrackElemType::up90 + 32, // TrackElemType::down90 + 32, // TrackElemType::up60ToUp90 + 32, // TrackElemType::down90ToDown60 + 32, // TrackElemType::up90ToUp60 + 32, // TrackElemType::down60ToDown90 + 32, // TrackElemType::brakeForDrop + 87, // TrackElemType::leftEighthToDiag + 87, // TrackElemType::rightEighthToDiag + 87, // TrackElemType::leftEighthToOrthogonal + 87, // TrackElemType::rightEighthToOrthogonal + 87, // TrackElemType::leftEighthBankToDiag + 87, // TrackElemType::rightEighthBankToDiag + 87, // TrackElemType::leftEighthBankToOrthogonal + 87, // TrackElemType::rightEighthBankToOrthogonal + 45, // TrackElemType::diagFlat + 45, // TrackElemType::diagUp25 + 45, // TrackElemType::diagUp60 + 45, // TrackElemType::diagFlatToUp25 + 45, // TrackElemType::diagUp25ToUp60 + 45, // TrackElemType::diagUp60ToUp25 + 45, // TrackElemType::diagUp25ToFlat + 45, // TrackElemType::diagDown25 + 45, // TrackElemType::diagDown60 + 45, // TrackElemType::diagFlatToDown25 + 45, // TrackElemType::diagDown25ToDown60 + 45, // TrackElemType::diagDown60ToDown25 + 45, // TrackElemType::diagDown25ToFlat + 45, // TrackElemType::diagFlatToUp60 + 45, // TrackElemType::diagUp60ToFlat + 45, // TrackElemType::diagFlatToDown60 + 45, // TrackElemType::diagDown60ToFlat + 45, // TrackElemType::diagFlatToLeftBank + 45, // TrackElemType::diagFlatToRightBank + 45, // TrackElemType::diagLeftBankToFlat + 45, // TrackElemType::diagRightBankToFlat + 45, // TrackElemType::diagLeftBankToUp25 + 45, // TrackElemType::diagRightBankToUp25 + 45, // TrackElemType::diagUp25ToLeftBank + 45, // TrackElemType::diagUp25ToRightBank + 45, // TrackElemType::diagLeftBankToDown25 + 45, // TrackElemType::diagRightBankToDown25 + 45, // TrackElemType::diagDown25ToLeftBank + 45, // TrackElemType::diagDown25ToRightBank + 45, // TrackElemType::diagLeftBank + 45, // TrackElemType::diagRightBank + 16, // TrackElemType::logFlumeReverser + 32, // TrackElemType::spinningTunnel + 96, // TrackElemType::leftBarrelRollUpToDown + 96, // TrackElemType::rightBarrelRollUpToDown + 96, // TrackElemType::leftBarrelRollDownToUp + 96, // TrackElemType::rightBarrelRollDownToUp + 64, // TrackElemType::leftBankToLeftQuarterTurn3TilesUp25 + 64, // TrackElemType::rightBankToRightQuarterTurn3TilesUp25 + 64, // TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank + 64, // TrackElemType::rightQuarterTurn3TilesDown25ToRightBank + 32, // TrackElemType::poweredLift + 100, // TrackElemType::leftLargeHalfLoopUp + 100, // TrackElemType::rightLargeHalfLoopUp + 100, // TrackElemType::leftLargeHalfLoopDown + 100, // TrackElemType::rightLargeHalfLoopDown + 96, // TrackElemType::leftFlyerTwistUp + 96, // TrackElemType::rightFlyerTwistUp + 96, // TrackElemType::leftFlyerTwistDown + 96, // TrackElemType::rightFlyerTwistDown + 64, // TrackElemType::flyerHalfLoopUninvertedUp + 64, // TrackElemType::flyerHalfLoopInvertedDown + 64, // TrackElemType::leftFlyerCorkscrewUp + 64, // TrackElemType::rightFlyerCorkscrewUp + 64, // TrackElemType::leftFlyerCorkscrewDown + 64, // TrackElemType::rightFlyerCorkscrewDown + 16, // TrackElemType::heartLineTransferUp + 16, // TrackElemType::heartLineTransferDown + 64, // TrackElemType::leftHeartLineRoll + 64, // TrackElemType::rightHeartLineRoll + 32, // TrackElemType::minigolfHoleA + 32, // TrackElemType::minigolfHoleB + 32, // TrackElemType::minigolfHoleC + 32, // TrackElemType::minigolfHoleD + 32, // TrackElemType::minigolfHoleE + 80, // TrackElemType::multiDimInvertedFlatToDown90QuarterLoop + 80, // TrackElemType::up90ToInvertedFlatQuarterLoop + 80, // TrackElemType::invertedFlatToDown90QuarterLoop + 64, // TrackElemType::leftCurvedLiftHill + 64, // TrackElemType::rightCurvedLiftHill + 32, // TrackElemType::leftReverser + 32, // TrackElemType::rightReverser + 32, // TrackElemType::airThrustTopCap + 32, // TrackElemType::airThrustVerticalDown + 32, // TrackElemType::airThrustVerticalDownToLevel + 32, // TrackElemType::blockBrakes + 32, // TrackElemType::leftBankedQuarterTurn3TileUp25 + 32, // TrackElemType::rightBankedQuarterTurn3TileUp25 + 32, // TrackElemType::leftBankedQuarterTurn3TileDown25 + 32, // TrackElemType::rightBankedQuarterTurn3TileDown25 + 32, // TrackElemType::leftBankedQuarterTurn5TileUp25 + 32, // TrackElemType::rightBankedQuarterTurn5TileUp25 + 32, // TrackElemType::leftBankedQuarterTurn5TileDown25 + 32, // TrackElemType::rightBankedQuarterTurn5TileDown25 + 32, // TrackElemType::up25ToLeftBankedUp25 + 32, // TrackElemType::up25ToRightBankedUp25 + 32, // TrackElemType::leftBankedUp25ToUp25 + 32, // TrackElemType::rightBankedUp25ToUp25 + 32, // TrackElemType::down25ToLeftBankedDown25 + 32, // TrackElemType::down25ToRightBankedDown25 + 32, // TrackElemType::leftBankedDown25ToDown25 + 32, // TrackElemType::rightBankedDown25ToDown25 + 32, // TrackElemType::leftBankedFlatToLeftBankedUp25 + 32, // TrackElemType::rightBankedFlatToRightBankedUp25 + 32, // TrackElemType::leftBankedUp25ToLeftBankedFlat + 32, // TrackElemType::rightBankedUp25ToRightBankedFlat + 32, // TrackElemType::leftBankedFlatToLeftBankedDown25 + 32, // TrackElemType::rightBankedFlatToRightBankedDown25 + 32, // TrackElemType::leftBankedDown25ToLeftBankedFlat + 32, // TrackElemType::rightBankedDown25ToRightBankedFlat + 32, // TrackElemType::flatToLeftBankedUp25 + 32, // TrackElemType::flatToRightBankedUp25 + 32, // TrackElemType::leftBankedUp25ToFlat + 32, // TrackElemType::rightBankedUp25ToFlat + 32, // TrackElemType::flatToLeftBankedDown25 + 32, // TrackElemType::flatToRightBankedDown25 + 32, // TrackElemType::leftBankedDown25ToFlat + 32, // TrackElemType::rightBankedDown25ToFlat + 32, // TrackElemType::leftQuarterTurn1TileUp90 + 32, // TrackElemType::rightQuarterTurn1TileUp90 + 32, // TrackElemType::leftQuarterTurn1TileDown90 + 32, // TrackElemType::rightQuarterTurn1TileDown90 + 80, // TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop + 80, // TrackElemType::multiDimFlatToDown90QuarterLoop + 80, // TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop + 32, // TrackElemType::rotationControlToggle + 0, // TrackElemType::flatTrack1x4A + 0, // TrackElemType::flatTrack2x2 + 0, // TrackElemType::flatTrack4x4 + 0, // TrackElemType::flatTrack2x4 + 0, // TrackElemType::flatTrack1x5 + 0, // TrackElemType::flatTrack1x1A + 0, // TrackElemType::flatTrack1x4B + 0, // TrackElemType::flatTrack1x1B + 0, // TrackElemType::flatTrack1x4C + 0, // TrackElemType::flatTrack3x3 + 96, // TrackElemType::leftCorkscrewUp + 96, // TrackElemType::rightCorkscrewUp + 96, // TrackElemType::leftCorkscrewDown + 96, // TrackElemType::rightCorkscrewDown + 80, // TrackElemType::leftMediumHalfLoopUp + 80, // TrackElemType::rightMediumHalfLoopUp + 80, // TrackElemType::leftMediumHalfLoopDown + 80, // TrackElemType::rightMediumHalfLoopDown + 96, // TrackElemType::leftZeroGRollUp + 96, // TrackElemType::rightZeroGRollUp + 96, // TrackElemType::leftZeroGRollDown + 96, // TrackElemType::rightZeroGRollDown + 165, // TrackElemType::leftLargeZeroGRollUp + 165, // TrackElemType::rightLargeZeroGRollUp + 165, // TrackElemType::leftLargeZeroGRollDown + 165, // TrackElemType::rightLargeZeroGRollDown + 100, // TrackElemType::leftFlyerLargeHalfLoopUninvertedUp + 100, // TrackElemType::rightFlyerLargeHalfLoopUninvertedUp + 100, // TrackElemType::leftFlyerLargeHalfLoopInvertedDown + 100, // TrackElemType::rightFlyerLargeHalfLoopInvertedDown + 100, // TrackElemType::leftFlyerLargeHalfLoopInvertedUp + 100, // TrackElemType::rightFlyerLargeHalfLoopInvertedUp + 100, // TrackElemType::leftFlyerLargeHalfLoopUninvertedDown + 100, // TrackElemType::rightFlyerLargeHalfLoopUninvertedDown + 64, // TrackElemType::flyerHalfLoopInvertedUp + 64, // TrackElemType::flyerHalfLoopUninvertedDown + 92, // TrackElemType::leftEighthToDiagUp25 + 92, // TrackElemType::rightEighthToDiagUp25 + 92, // TrackElemType::leftEighthToDiagDown25 + 92, // TrackElemType::rightEighthToDiagDown25 + 92, // TrackElemType::leftEighthToOrthogonalUp25 + 92, // TrackElemType::rightEighthToOrthogonalUp25 + 92, // TrackElemType::leftEighthToOrthogonalDown25 + 92, // TrackElemType::rightEighthToOrthogonalDown25 + 45, // TrackElemType::diagUp25ToLeftBankedUp25 + 45, // TrackElemType::diagUp25ToRightBankedUp25 + 45, // TrackElemType::diagLeftBankedUp25ToUp25 + 45, // TrackElemType::diagRightBankedUp25ToUp25 + 45, // TrackElemType::diagDown25ToLeftBankedDown25 + 45, // TrackElemType::diagDown25ToRightBankedDown25 + 45, // TrackElemType::diagLeftBankedDown25ToDown25 + 45, // TrackElemType::diagRightBankedDown25ToDown25 + 45, // TrackElemType::diagLeftBankedFlatToLeftBankedUp25 + 45, // TrackElemType::diagRightBankedFlatToRightBankedUp25 + 45, // TrackElemType::diagLeftBankedUp25ToLeftBankedFlat + 45, // TrackElemType::diagRightBankedUp25ToRightBankedFlat + 45, // TrackElemType::diagLeftBankedFlatToLeftBankedDown25 + 45, // TrackElemType::diagRightBankedFlatToRightBankedDown25 + 45, // TrackElemType::diagLeftBankedDown25ToLeftBankedFlat + 45, // TrackElemType::diagRightBankedDown25ToRightBankedFlat + 45, // TrackElemType::diagFlatToLeftBankedUp25 + 45, // TrackElemType::diagFlatToRightBankedUp25 + 45, // TrackElemType::diagLeftBankedUp25ToFlat + 45, // TrackElemType::diagRightBankedUp25ToFlat + 45, // TrackElemType::diagFlatToLeftBankedDown25 + 45, // TrackElemType::diagFlatToRightBankedDown25 + 45, // TrackElemType::diagLeftBankedDown25ToFlat + 45, // TrackElemType::diagRightBankedDown25ToFlat + 45, // TrackElemType::diagUp25LeftBanked + 45, // TrackElemType::diagUp25RightBanked + 45, // TrackElemType::diagDown25LeftBanked + 45, // TrackElemType::diagDown25RightBanked + 92, // TrackElemType::leftEighthBankToDiagUp25 + 92, // TrackElemType::rightEighthBankToDiagUp25 + 92, // TrackElemType::leftEighthBankToDiagDown25 + 92, // TrackElemType::rightEighthBankToDiagDown25 + 92, // TrackElemType::leftEighthBankToOrthogonalUp25 + 92, // TrackElemType::rightEighthBankToOrthogonalUp25 + 92, // TrackElemType::leftEighthBankToOrthogonalDown25 + 92, // TrackElemType::rightEighthBankToOrthogonalDown25 + 45, // TrackElemType::diagBrakes + 45, // TrackElemType::diagBlockBrakes + 33, // TrackElemType::down25Brakes + 45, // TrackElemType::diagBooster + 165, // TrackElemType::diagFlatToUp60LongBase, + 165, // TrackElemType::diagUp60ToFlatLongBase, + 165, // TrackElemType::diagFlatToDown60LongBase, + 165, // TrackElemType::diagDown60ToFlatLongBase, + 165, // TrackElemType::leftEighthDiveLoopUpToOrthogonal + 165, // TrackElemType::rightEighthDiveLoopUpToOrthogonal + 165, // TrackElemType::leftEighthDiveLoopDownToDiag + 165, // TrackElemType::rightEighthDiveLoopDownToDiag + 45, // TrackElemType::diagDown25Brakes + }; + + static_assert(std::size(kTrackPieceLengths) == EnumValue(TrackElemType::count)); + // rct2: 0x00998C95 static constexpr TrackCurveChain kTrackCurveChain[] = { - { TrackCurve::None, TrackCurve::None }, - { TrackElemType::EndStation, TrackElemType::EndStation }, - { TrackElemType::EndStation, TrackElemType::EndStation }, - { TrackElemType::EndStation, TrackElemType::EndStation }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::None }, - { TrackCurve::Right, TrackCurve::None }, - { TrackCurve::None, TrackCurve::Left }, - { TrackCurve::None, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::None, TrackCurve::Left }, - { TrackCurve::None, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::None }, - { TrackCurve::Right, TrackCurve::None }, - { TrackCurve::None, TrackCurve::Left }, - { TrackCurve::None, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::None }, - { TrackCurve::Right, TrackCurve::None }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::LeftVerySmall, TrackCurve::LeftVerySmall }, - { TrackCurve::RightVerySmall, TrackCurve::RightVerySmall }, - { TrackElemType::LeftTwistUpToDown, TrackCurve::None }, - { TrackElemType::RightTwistUpToDown, TrackCurve::None }, - { TrackCurve::None, TrackElemType::LeftTwistDownToUp }, - { TrackCurve::None, TrackElemType::RightTwistDownToUp }, - { TrackElemType::HalfLoopDown, TrackCurve::None }, - { TrackCurve::None, TrackElemType::HalfLoopUp }, - { TrackElemType::RightCorkscrewDown, TrackCurve::None }, - { TrackElemType::LeftCorkscrewDown, TrackCurve::None }, - { TrackCurve::None, TrackElemType::RightCorkscrewUp }, - { TrackCurve::None, TrackElemType::LeftCorkscrewUp }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackElemType::TowerSection, TrackCurve::None }, - { TrackElemType::TowerSection, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackElemType::LeftHalfBankedHelixUpSmall, TrackElemType::LeftHalfBankedHelixUpSmall }, - { TrackElemType::RightHalfBankedHelixUpSmall, TrackElemType::RightHalfBankedHelixUpSmall }, - { TrackElemType::LeftHalfBankedHelixDownSmall, TrackElemType::LeftHalfBankedHelixDownSmall }, - { TrackElemType::RightHalfBankedHelixDownSmall, TrackElemType::RightHalfBankedHelixDownSmall }, - { TrackElemType::LeftHalfBankedHelixUpLarge, TrackElemType::LeftHalfBankedHelixUpLarge }, - { TrackElemType::RightHalfBankedHelixUpLarge, TrackElemType::RightHalfBankedHelixUpLarge }, - { TrackElemType::LeftHalfBankedHelixDownLarge, TrackElemType::LeftHalfBankedHelixDownLarge }, - { TrackElemType::RightHalfBankedHelixDownLarge, TrackElemType::RightHalfBankedHelixDownLarge }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackElemType::Brakes, TrackElemType::Brakes }, - { TrackElemType::Booster, TrackElemType::Booster }, - { TrackCurve::None, TrackCurve::None }, - { TrackElemType::LeftQuarterBankedHelixLargeUp, TrackElemType::LeftQuarterBankedHelixLargeUp }, - { TrackElemType::RightQuarterBankedHelixLargeUp, TrackElemType::RightQuarterBankedHelixLargeUp }, - { TrackElemType::LeftQuarterBankedHelixLargeDown, TrackElemType::LeftQuarterBankedHelixLargeDown }, - { TrackElemType::RightQuarterBankedHelixLargeDown, TrackElemType::RightQuarterBankedHelixLargeDown }, - { TrackElemType::LeftQuarterHelixLargeUp, TrackElemType::LeftQuarterHelixLargeUp }, - { TrackElemType::RightQuarterHelixLargeUp, TrackElemType::RightQuarterHelixLargeUp }, - { TrackElemType::LeftQuarterHelixLargeDown, TrackElemType::LeftQuarterHelixLargeDown }, - { TrackElemType::RightQuarterHelixLargeDown, TrackElemType::RightQuarterHelixLargeDown }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackElemType::Waterfall, TrackElemType::Waterfall }, - { TrackElemType::Rapids, TrackElemType::Rapids }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackElemType::ReverseFreefallVertical, TrackCurve::None }, - { TrackElemType::ReverseFreefallVertical, TrackElemType::ReverseFreefallVertical }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, - { TrackCurve::RightLarge, TrackCurve::RightLarge }, - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, - { TrackCurve::RightLarge, TrackCurve::RightLarge }, - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, - { TrackCurve::RightLarge, TrackCurve::RightLarge }, - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, - { TrackCurve::RightLarge, TrackCurve::RightLarge }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::LeftLarge, TrackCurve::None }, - { TrackCurve::RightLarge, TrackCurve::None }, - { TrackCurve::None, TrackCurve::LeftLarge }, - { TrackCurve::None, TrackCurve::RightLarge }, - { TrackCurve::None, TrackCurve::LeftLarge }, - { TrackCurve::None, TrackCurve::RightLarge }, - { TrackCurve::LeftLarge, TrackCurve::None }, - { TrackCurve::RightLarge, TrackCurve::None }, - { TrackCurve::None, TrackCurve::LeftLarge }, - { TrackCurve::None, TrackCurve::RightLarge }, - { TrackCurve::LeftLarge, TrackCurve::None }, - { TrackCurve::RightLarge, TrackCurve::None }, - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, - { TrackCurve::RightLarge, TrackCurve::RightLarge }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackElemType::LeftBarrelRollDownToUp, TrackCurve::None }, - { TrackElemType::RightBarrelRollDownToUp, TrackCurve::None }, - { TrackCurve::None, TrackElemType::LeftBarrelRollUpToDown }, - { TrackCurve::None, TrackElemType::RightBarrelRollUpToDown }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackElemType::PoweredLift, TrackElemType::PoweredLift }, - { TrackElemType::RightLargeHalfLoopDown, TrackCurve::None }, - { TrackElemType::LeftLargeHalfLoopDown, TrackCurve::None }, - { TrackCurve::None, TrackElemType::RightLargeHalfLoopUp }, - { TrackCurve::None, TrackElemType::LeftLargeHalfLoopUp }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackElemType::InvertedFlatToDown90QuarterLoop, TrackCurve::None }, - { TrackCurve::None, TrackElemType::Up90ToInvertedFlatQuarterLoop }, - { TrackElemType::LeftCurvedLiftHill, TrackElemType::LeftCurvedLiftHill }, - { TrackElemType::RightCurvedLiftHill, TrackElemType::RightCurvedLiftHill }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackElemType::AirThrustVerticalDown, TrackElemType::ReverseFreefallVertical }, - { TrackElemType::AirThrustVerticalDown, TrackElemType::AirThrustVerticalDown }, - { TrackCurve::None, TrackElemType::AirThrustVerticalDown }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::None }, - { TrackCurve::Right, TrackCurve::None }, - { TrackCurve::None, TrackCurve::Left }, - { TrackCurve::None, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::None }, - { TrackCurve::Right, TrackCurve::None }, - { TrackCurve::None, TrackCurve::Left }, - { TrackCurve::None, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::Left }, - { TrackCurve::Right, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::None }, - { TrackCurve::Right, TrackCurve::None }, - { TrackCurve::None, TrackCurve::Left }, - { TrackCurve::None, TrackCurve::Right }, - { TrackCurve::Left, TrackCurve::None }, - { TrackCurve::Right, TrackCurve::None }, - { TrackCurve::None, TrackCurve::Left }, - { TrackCurve::None, TrackCurve::Right }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::LeftSmall, TrackCurve::LeftSmall }, - { TrackCurve::RightSmall, TrackCurve::RightSmall }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackCurve::None, TrackCurve::None }, - { TrackElemType::None, TrackElemType::None }, // TrackElemType::FlatTrack1x4A - { TrackCurve::None, TrackCurve::None }, // TrackElemType::FlatTrack2x2 - { TrackCurve::None, TrackCurve::None }, // TrackElemType::FlatTrack4x4 - { TrackElemType::None, TrackElemType::None }, // TrackElemType::FlatTrack2x4 - { TrackElemType::None, TrackElemType::None }, // TrackElemType::FlatTrack1x5 - { TrackElemType::None, TrackElemType::None }, // TrackElemType::FlatTrack1x1A - { TrackElemType::None, TrackElemType::None }, // TrackElemType::FlatTrack1x4B - { TrackElemType::None, TrackElemType::None }, // TrackElemType::FlatTrack1x1B - { TrackElemType::None, TrackElemType::None }, // TrackElemType::FlatTrack1x4C - { TrackElemType::None, TrackElemType::None }, // TrackElemType::FlatTrack3x3 - { TrackElemType::RightLargeCorkscrewDown, TrackCurve::None }, // TrackElemType::LeftLargeCorkscrewUp - { TrackElemType::LeftLargeCorkscrewDown, TrackCurve::None }, // TrackElemType::RightLargeCorkscrewUp - { TrackCurve::None, TrackElemType::RightLargeCorkscrewUp }, // TrackElemType::LeftLargeCorkscrewDown - { TrackCurve::None, TrackElemType::LeftLargeCorkscrewUp }, // TrackElemType::RightCorkscrewDown - { TrackElemType::RightMediumHalfLoopDown, TrackCurve::None }, // TrackElemType::LeftMediumHalfLoopUp - { TrackElemType::LeftMediumHalfLoopDown, TrackCurve::None }, // TrackElemType::RightMediumHalfLoopUp - { TrackCurve::None, TrackElemType::RightMediumHalfLoopUp }, // TrackElemType::LeftMediumHalfLoopDown - { TrackCurve::None, TrackElemType::LeftMediumHalfLoopUp }, // TrackElemType::RightMediumHalfLoopDown - { TrackElemType::LeftZeroGRollDown, TrackCurve::None }, // TrackElemType::LeftZeroGRollUp - { TrackElemType::RightZeroGRollDown, TrackCurve::None }, // TrackElemType::RightZeroGRollUp - { TrackCurve::None, TrackElemType::LeftZeroGRollUp }, // TrackElemType::LeftZeroGRollDown - { TrackCurve::None, TrackElemType::RightZeroGRollUp }, // TrackElemType::RightZeroGRollDown - { TrackElemType::LeftLargeZeroGRollDown, TrackCurve::None }, // TrackElemType::LeftLargeZeroGRollUp - { TrackElemType::RightLargeZeroGRollDown, TrackCurve::None }, // TrackElemType::RightLargeZeroGRollUp - { TrackCurve::None, TrackElemType::LeftLargeZeroGRollUp }, // TrackElemType::LeftLargeZeroGRollDown - { TrackCurve::None, TrackElemType::RightLargeZeroGRollUp }, // TrackElemType::RightLargeZeroGRollDown - { TrackElemType::RightFlyerLargeHalfLoopInvertedDown, TrackCurve::None }, // LeftFlyerLargeHalfLoopUninvertedUp - { TrackElemType::LeftFlyerLargeHalfLoopInvertedDown, TrackCurve::None }, // RightFlyerLargeHalfLoopUninvertedUp - { TrackCurve::None, TrackElemType::RightFlyerLargeHalfLoopUninvertedUp }, // LeftFlyerLargeHalfLoopInvertedDown - { TrackCurve::None, TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp }, // RightFlyerLargeHalfLoopInvertedDown - { TrackElemType::RightFlyerLargeHalfLoopUninvertedDown, TrackCurve::None }, // LeftFlyerLargeHalfLoopInvertedUp - { TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown, TrackCurve::None }, // RightFlyerLargeHalfLoopInvertedUp - { TrackCurve::None, TrackElemType::RightFlyerLargeHalfLoopInvertedUp }, // LeftFlyerLargeHalfLoopUninvertedDown - { TrackCurve::None, TrackElemType::LeftFlyerLargeHalfLoopInvertedUp }, // RightFlyerLargeHalfLoopUninvertedDown - { TrackCurve::None, TrackCurve::None }, // FlyerHalfLoopInvertedUp - { TrackCurve::None, TrackCurve::None }, // FlyerHalfLoopUninvertedUp - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::LeftEighthToDiagUp25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::RightEighthToDiagUp25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::LeftEighthToDiagDown25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::RightEighthToDiagDown25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::LeftEighthToOrthogonalUp25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::RightEighthToOrthogonalUp25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::LeftEighthToOrthogonalDown25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::RightEighthToOrthogonalDown25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagUp25ToLeftBankedUp25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagUp25ToRightBankedUp25 - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagLeftBankedUp25ToUp25 - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagRightBankedUp25ToUp25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagDown25ToLeftBankedDown25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagDown25ToRightBankedDown25 - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagLeftBankedDown25ToDown25 - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagRightBankedDown25ToDown25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagRightBankedFlatToRightBankedDown25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagRightBankedDown25ToRightBankedFlat - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagFlatToLeftBankedUp25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagFlatToRightBankedUp25 - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagLeftBankedUp25ToFlat - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagRightBankedUp25ToFlat - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagFlatToLeftBankedDown25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagFlatToRightBankedDown25 - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagLeftBankedDown25ToFlat - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagRightBankedDown25ToFlat - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagUp25LeftBanked - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagUp25RightBanked - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::DiagDown25LeftBanked - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::DiagDown25RightBanked - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::LeftEighthBankToDiagUp25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::RightEighthBankToDiagUp25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::LeftEighthBankToDiagDown25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::RightEighthBankToDiagDown25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::LeftEighthBankToOrthogonalUp25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::RightEighthBankToOrthogonalUp25 - { TrackCurve::LeftLarge, TrackCurve::LeftLarge }, // TrackElemType::LeftEighthBankToOrthogonalDown25 - { TrackCurve::RightLarge, TrackCurve::RightLarge }, // TrackElemType::RightEighthBankToOrthogonalDown25 - { TrackElemType::DiagBrakes, TrackElemType::DiagBrakes }, // TrackElemType::DiagBrakes - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagBlockBrakes - { TrackElemType::Down25Brakes, TrackElemType::Down25Brakes }, // TrackElemType::Down25Brakes - { TrackElemType::DiagBooster, TrackElemType::DiagBooster }, // TrackElemType::DiagBooster - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagFlatToUp60LongBase, - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagUp60ToFlatLongBase, - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagFlatToDown60LongBase, - { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagDown60ToFlatLongBase, - { TrackElemType::RightEighthDiveLoopDownToDiag , TrackCurve::None }, // TrackElemType::LeftEighthDiveLoopUpToOrthogonal - { TrackElemType::LeftEighthDiveLoopDownToDiag, TrackCurve::None }, // TrackElemType::RightEighthDiveLoopUpToOrthogonal - { TrackCurve::None, TrackElemType::RightEighthDiveLoopUpToOrthogonal }, // TrackElemType::LeftEighthDiveLoopDownToDiag - { TrackCurve::None, TrackElemType::LeftEighthDiveLoopUpToOrthogonal }, // TrackElemType::RightEighthDiveLoopDownToDiag - { TrackElemType::DiagDown25Brakes, TrackElemType::DiagDown25Brakes }, // TrackElemType::DiagDown25Brakes - }; - static_assert(std::size(kTrackCurveChain) == EnumValue(TrackElemType::Count)); - + { TrackCurve::none, TrackCurve::none }, + { TrackElemType::endStation, TrackElemType::endStation }, + { TrackElemType::endStation, TrackElemType::endStation }, + { TrackElemType::endStation, TrackElemType::endStation }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::left, TrackCurve::none }, + { TrackCurve::right, TrackCurve::none }, + { TrackCurve::none, TrackCurve::left }, + { TrackCurve::none, TrackCurve::right }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::none, TrackCurve::left }, + { TrackCurve::none, TrackCurve::right }, + { TrackCurve::left, TrackCurve::none }, + { TrackCurve::right, TrackCurve::none }, + { TrackCurve::none, TrackCurve::left }, + { TrackCurve::none, TrackCurve::right }, + { TrackCurve::left, TrackCurve::none }, + { TrackCurve::right, TrackCurve::none }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::leftVerySmall, TrackCurve::leftVerySmall }, + { TrackCurve::rightVerySmall, TrackCurve::rightVerySmall }, + { TrackElemType::leftTwistUpToDown, TrackCurve::none }, + { TrackElemType::rightTwistUpToDown, TrackCurve::none }, + { TrackCurve::none, TrackElemType::leftTwistDownToUp }, + { TrackCurve::none, TrackElemType::rightTwistDownToUp }, + { TrackElemType::halfLoopDown, TrackCurve::none }, + { TrackCurve::none, TrackElemType::halfLoopUp }, + { TrackElemType::rightCorkscrewDown, TrackCurve::none }, + { TrackElemType::leftCorkscrewDown, TrackCurve::none }, + { TrackCurve::none, TrackElemType::rightCorkscrewUp }, + { TrackCurve::none, TrackElemType::leftCorkscrewUp }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackElemType::towerSection, TrackCurve::none }, + { TrackElemType::towerSection, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackElemType::leftHalfBankedHelixUpSmall, TrackElemType::leftHalfBankedHelixUpSmall }, + { TrackElemType::rightHalfBankedHelixUpSmall, TrackElemType::rightHalfBankedHelixUpSmall }, + { TrackElemType::leftHalfBankedHelixDownSmall, TrackElemType::leftHalfBankedHelixDownSmall }, + { TrackElemType::rightHalfBankedHelixDownSmall, TrackElemType::rightHalfBankedHelixDownSmall }, + { TrackElemType::leftHalfBankedHelixUpLarge, TrackElemType::leftHalfBankedHelixUpLarge }, + { TrackElemType::rightHalfBankedHelixUpLarge, TrackElemType::rightHalfBankedHelixUpLarge }, + { TrackElemType::leftHalfBankedHelixDownLarge, TrackElemType::leftHalfBankedHelixDownLarge }, + { TrackElemType::rightHalfBankedHelixDownLarge, TrackElemType::rightHalfBankedHelixDownLarge }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackElemType::brakes, TrackElemType::brakes }, + { TrackElemType::booster, TrackElemType::booster }, + { TrackCurve::none, TrackCurve::none }, + { TrackElemType::leftQuarterBankedHelixLargeUp, TrackElemType::leftQuarterBankedHelixLargeUp }, + { TrackElemType::rightQuarterBankedHelixLargeUp, TrackElemType::rightQuarterBankedHelixLargeUp }, + { TrackElemType::leftQuarterBankedHelixLargeDown, TrackElemType::leftQuarterBankedHelixLargeDown }, + { TrackElemType::rightQuarterBankedHelixLargeDown, TrackElemType::rightQuarterBankedHelixLargeDown }, + { TrackElemType::leftQuarterHelixLargeUp, TrackElemType::leftQuarterHelixLargeUp }, + { TrackElemType::rightQuarterHelixLargeUp, TrackElemType::rightQuarterHelixLargeUp }, + { TrackElemType::leftQuarterHelixLargeDown, TrackElemType::leftQuarterHelixLargeDown }, + { TrackElemType::rightQuarterHelixLargeDown, TrackElemType::rightQuarterHelixLargeDown }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackElemType::waterfall, TrackElemType::waterfall }, + { TrackElemType::rapids, TrackElemType::rapids }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackElemType::reverseFreefallVertical, TrackCurve::none }, + { TrackElemType::reverseFreefallVertical, TrackElemType::reverseFreefallVertical }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::leftLarge, TrackCurve::leftLarge }, + { TrackCurve::rightLarge, TrackCurve::rightLarge }, + { TrackCurve::leftLarge, TrackCurve::leftLarge }, + { TrackCurve::rightLarge, TrackCurve::rightLarge }, + { TrackCurve::leftLarge, TrackCurve::leftLarge }, + { TrackCurve::rightLarge, TrackCurve::rightLarge }, + { TrackCurve::leftLarge, TrackCurve::leftLarge }, + { TrackCurve::rightLarge, TrackCurve::rightLarge }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::leftLarge, TrackCurve::none }, + { TrackCurve::rightLarge, TrackCurve::none }, + { TrackCurve::none, TrackCurve::leftLarge }, + { TrackCurve::none, TrackCurve::rightLarge }, + { TrackCurve::none, TrackCurve::leftLarge }, + { TrackCurve::none, TrackCurve::rightLarge }, + { TrackCurve::leftLarge, TrackCurve::none }, + { TrackCurve::rightLarge, TrackCurve::none }, + { TrackCurve::none, TrackCurve::leftLarge }, + { TrackCurve::none, TrackCurve::rightLarge }, + { TrackCurve::leftLarge, TrackCurve::none }, + { TrackCurve::rightLarge, TrackCurve::none }, + { TrackCurve::leftLarge, TrackCurve::leftLarge }, + { TrackCurve::rightLarge, TrackCurve::rightLarge }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackElemType::leftBarrelRollDownToUp, TrackCurve::none }, + { TrackElemType::rightBarrelRollDownToUp, TrackCurve::none }, + { TrackCurve::none, TrackElemType::leftBarrelRollUpToDown }, + { TrackCurve::none, TrackElemType::rightBarrelRollUpToDown }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackElemType::poweredLift, TrackElemType::poweredLift }, + { TrackElemType::rightLargeHalfLoopDown, TrackCurve::none }, + { TrackElemType::leftLargeHalfLoopDown, TrackCurve::none }, + { TrackCurve::none, TrackElemType::rightLargeHalfLoopUp }, + { TrackCurve::none, TrackElemType::leftLargeHalfLoopUp }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackElemType::invertedFlatToDown90QuarterLoop, TrackCurve::none }, + { TrackCurve::none, TrackElemType::up90ToInvertedFlatQuarterLoop }, + { TrackElemType::leftCurvedLiftHill, TrackElemType::leftCurvedLiftHill }, + { TrackElemType::rightCurvedLiftHill, TrackElemType::rightCurvedLiftHill }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackElemType::airThrustVerticalDown, TrackElemType::reverseFreefallVertical }, + { TrackElemType::airThrustVerticalDown, TrackElemType::airThrustVerticalDown }, + { TrackCurve::none, TrackElemType::airThrustVerticalDown }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::left, TrackCurve::none }, + { TrackCurve::right, TrackCurve::none }, + { TrackCurve::none, TrackCurve::left }, + { TrackCurve::none, TrackCurve::right }, + { TrackCurve::left, TrackCurve::none }, + { TrackCurve::right, TrackCurve::none }, + { TrackCurve::none, TrackCurve::left }, + { TrackCurve::none, TrackCurve::right }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::left, TrackCurve::left }, + { TrackCurve::right, TrackCurve::right }, + { TrackCurve::left, TrackCurve::none }, + { TrackCurve::right, TrackCurve::none }, + { TrackCurve::none, TrackCurve::left }, + { TrackCurve::none, TrackCurve::right }, + { TrackCurve::left, TrackCurve::none }, + { TrackCurve::right, TrackCurve::none }, + { TrackCurve::none, TrackCurve::left }, + { TrackCurve::none, TrackCurve::right }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::leftSmall, TrackCurve::leftSmall }, + { TrackCurve::rightSmall, TrackCurve::rightSmall }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackCurve::none, TrackCurve::none }, + { TrackElemType::none, TrackElemType::none }, // TrackElemType::flatTrack1x4A + { TrackCurve::none, TrackCurve::none }, // TrackElemType::flatTrack2x2 + { TrackCurve::none, TrackCurve::none }, // TrackElemType::flatTrack4x4 + { TrackElemType::none, TrackElemType::none }, // TrackElemType::flatTrack2x4 + { TrackElemType::none, TrackElemType::none }, // TrackElemType::flatTrack1x5 + { TrackElemType::none, TrackElemType::none }, // TrackElemType::flatTrack1x1A + { TrackElemType::none, TrackElemType::none }, // TrackElemType::flatTrack1x4B + { TrackElemType::none, TrackElemType::none }, // TrackElemType::flatTrack1x1B + { TrackElemType::none, TrackElemType::none }, // TrackElemType::flatTrack1x4C + { TrackElemType::none, TrackElemType::none }, // TrackElemType::flatTrack3x3 + { TrackElemType::rightLargeCorkscrewDown, TrackCurve::none }, // TrackElemType::leftLargeCorkscrewUp + { TrackElemType::leftLargeCorkscrewDown, TrackCurve::none }, // TrackElemType::rightLargeCorkscrewUp + { TrackCurve::none, TrackElemType::rightLargeCorkscrewUp }, // TrackElemType::leftLargeCorkscrewDown + { TrackCurve::none, TrackElemType::leftLargeCorkscrewUp }, // TrackElemType::rightCorkscrewDown + { TrackElemType::rightMediumHalfLoopDown, TrackCurve::none }, // TrackElemType::leftMediumHalfLoopUp + { TrackElemType::leftMediumHalfLoopDown, TrackCurve::none }, // TrackElemType::rightMediumHalfLoopUp + { TrackCurve::none, TrackElemType::rightMediumHalfLoopUp }, // TrackElemType::leftMediumHalfLoopDown + { TrackCurve::none, TrackElemType::leftMediumHalfLoopUp }, // TrackElemType::rightMediumHalfLoopDown + { TrackElemType::leftZeroGRollDown, TrackCurve::none }, // TrackElemType::leftZeroGRollUp + { TrackElemType::rightZeroGRollDown, TrackCurve::none }, // TrackElemType::rightZeroGRollUp + { TrackCurve::none, TrackElemType::leftZeroGRollUp }, // TrackElemType::leftZeroGRollDown + { TrackCurve::none, TrackElemType::rightZeroGRollUp }, // TrackElemType::rightZeroGRollDown + { TrackElemType::leftLargeZeroGRollDown, TrackCurve::none }, // TrackElemType::leftLargeZeroGRollUp + { TrackElemType::rightLargeZeroGRollDown, TrackCurve::none }, // TrackElemType::rightLargeZeroGRollUp + { TrackCurve::none, TrackElemType::leftLargeZeroGRollUp }, // TrackElemType::leftLargeZeroGRollDown + { TrackCurve::none, TrackElemType::rightLargeZeroGRollUp }, // TrackElemType::rightLargeZeroGRollDown + { TrackElemType::rightFlyerLargeHalfLoopInvertedDown, TrackCurve::none }, // LeftFlyerLargeHalfLoopUninvertedUp + { TrackElemType::leftFlyerLargeHalfLoopInvertedDown, TrackCurve::none }, // RightFlyerLargeHalfLoopUninvertedUp + { TrackCurve::none, TrackElemType::rightFlyerLargeHalfLoopUninvertedUp }, // LeftFlyerLargeHalfLoopInvertedDown + { TrackCurve::none, TrackElemType::leftFlyerLargeHalfLoopUninvertedUp }, // RightFlyerLargeHalfLoopInvertedDown + { TrackElemType::rightFlyerLargeHalfLoopUninvertedDown, TrackCurve::none }, // LeftFlyerLargeHalfLoopInvertedUp + { TrackElemType::leftFlyerLargeHalfLoopUninvertedDown, TrackCurve::none }, // RightFlyerLargeHalfLoopInvertedUp + { TrackCurve::none, TrackElemType::rightFlyerLargeHalfLoopInvertedUp }, // LeftFlyerLargeHalfLoopUninvertedDown + { TrackCurve::none, TrackElemType::leftFlyerLargeHalfLoopInvertedUp }, // RightFlyerLargeHalfLoopUninvertedDown + { TrackCurve::none, TrackCurve::none }, // FlyerHalfLoopInvertedUp + { TrackCurve::none, TrackCurve::none }, // FlyerHalfLoopUninvertedUp + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::leftEighthToDiagUp25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::rightEighthToDiagUp25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::leftEighthToDiagDown25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::rightEighthToDiagDown25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::leftEighthToOrthogonalUp25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::rightEighthToOrthogonalUp25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::leftEighthToOrthogonalDown25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::rightEighthToOrthogonalDown25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagUp25ToLeftBankedUp25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagUp25ToRightBankedUp25 + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagLeftBankedUp25ToUp25 + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagRightBankedUp25ToUp25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagDown25ToLeftBankedDown25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagDown25ToRightBankedDown25 + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagLeftBankedDown25ToDown25 + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagRightBankedDown25ToDown25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagLeftBankedFlatToLeftBankedUp25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagRightBankedFlatToRightBankedUp25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagLeftBankedUp25ToLeftBankedFlat + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagRightBankedUp25ToRightBankedFlat + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagLeftBankedFlatToLeftBankedDown25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagRightBankedFlatToRightBankedDown25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagLeftBankedDown25ToLeftBankedFlat + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagRightBankedDown25ToRightBankedFlat + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagFlatToLeftBankedUp25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagFlatToRightBankedUp25 + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagLeftBankedUp25ToFlat + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagRightBankedUp25ToFlat + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagFlatToLeftBankedDown25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagFlatToRightBankedDown25 + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagLeftBankedDown25ToFlat + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagRightBankedDown25ToFlat + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagUp25LeftBanked + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagUp25RightBanked + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::diagDown25LeftBanked + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::diagDown25RightBanked + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::leftEighthBankToDiagUp25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::rightEighthBankToDiagUp25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::leftEighthBankToDiagDown25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::rightEighthBankToDiagDown25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::leftEighthBankToOrthogonalUp25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::rightEighthBankToOrthogonalUp25 + { TrackCurve::leftLarge, TrackCurve::leftLarge }, // TrackElemType::leftEighthBankToOrthogonalDown25 + { TrackCurve::rightLarge, TrackCurve::rightLarge }, // TrackElemType::rightEighthBankToOrthogonalDown25 + { TrackElemType::diagBrakes, TrackElemType::diagBrakes }, // TrackElemType::diagBrakes + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagBlockBrakes + { TrackElemType::down25Brakes, TrackElemType::down25Brakes }, // TrackElemType::down25Brakes + { TrackElemType::diagBooster, TrackElemType::diagBooster }, // TrackElemType::diagBooster + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagFlatToUp60LongBase, + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagUp60ToFlatLongBase, + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagFlatToDown60LongBase, + { TrackCurve::none, TrackCurve::none }, // TrackElemType::diagDown60ToFlatLongBase, + { TrackElemType::rightEighthDiveLoopDownToDiag , TrackCurve::none }, // TrackElemType::leftEighthDiveLoopUpToOrthogonal + { TrackElemType::leftEighthDiveLoopDownToDiag, TrackCurve::none }, // TrackElemType::rightEighthDiveLoopUpToOrthogonal + { TrackCurve::none, TrackElemType::rightEighthDiveLoopUpToOrthogonal }, // TrackElemType::leftEighthDiveLoopDownToDiag + { TrackCurve::none, TrackElemType::leftEighthDiveLoopUpToOrthogonal }, // TrackElemType::rightEighthDiveLoopDownToDiag + { TrackElemType::diagDown25Brakes, TrackElemType::diagDown25Brakes }, // TrackElemType::diagDown25Brakes + }; + static_assert(std::size(kTrackCurveChain) == EnumValue(TrackElemType::count)); + const TrackDescriptor gTrackDescriptors[186] = { - { true, TrackPitch::Down60, TrackRoll::None, TrackCurve::None, TrackPitch::Down60, TrackRoll::None, TrackElemType::DiagDown60 }, - { true, TrackPitch::Down60, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::DiagDown60ToDown25 }, - { true, TrackPitch::Down60, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagDown60ToFlat }, - { true, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::Down60, TrackRoll::None, TrackElemType::DiagDown25ToDown60 }, - { true, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::DiagDown25 }, - { true, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::DiagDown25ToLeftBank }, - { true, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagDown25ToFlat }, - { true, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::DiagDown25ToRightBank }, - { true, TrackPitch::None, TrackRoll::Left, TrackCurve::LeftLarge, TrackPitch::None, TrackRoll::Left, TrackElemType::LeftEighthBankToOrthogonal }, - { true, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::DiagLeftBankToDown25 }, - { true, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::DiagLeftBank }, - { true, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagLeftBankToFlat }, - { true, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::DiagLeftBankToUp25 }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::LeftLarge, TrackPitch::None, TrackRoll::None, TrackElemType::LeftEighthToOrthogonal }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Down60, TrackRoll::None, TrackElemType::DiagFlatToDown60 }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::DiagFlatToDown25 }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::DiagFlatToLeftBank }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagFlat }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::DiagFlatToRightBank }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::DiagFlatToUp25 }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Up60, TrackRoll::None, TrackElemType::DiagFlatToUp60 }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::RightLarge, TrackPitch::None, TrackRoll::None, TrackElemType::RightEighthToOrthogonal }, - { true, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::DiagRightBankToDown25 }, - { true, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagRightBankToFlat }, - { true, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::DiagRightBank }, - { true, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::DiagRightBankToUp25 }, - { true, TrackPitch::None, TrackRoll::Right, TrackCurve::RightLarge, TrackPitch::None, TrackRoll::Right, TrackElemType::RightEighthBankToOrthogonal }, - { true, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::DiagUp25ToLeftBank }, - { true, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagUp25ToFlat }, - { true, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::DiagUp25ToRightBank }, - { true, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::DiagUp25 }, - { true, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::Up60, TrackRoll::None, TrackElemType::DiagUp25ToUp60 }, - { true, TrackPitch::Up60, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagUp60ToFlat }, - { true, TrackPitch::Up60, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::DiagUp60ToUp25 }, - { true, TrackPitch::Up60, TrackRoll::None, TrackCurve::None, TrackPitch::Up60, TrackRoll::None, TrackElemType::DiagUp60 }, - { false, TrackPitch::Down90, TrackRoll::None, TrackCurve::LeftSmall, TrackPitch::Down90, TrackRoll::None, TrackElemType::LeftQuarterTurn1TileDown90 }, - { false, TrackPitch::Down90, TrackRoll::None, TrackCurve::None, TrackPitch::Down90, TrackRoll::None, TrackElemType::Down90 }, - { false, TrackPitch::Down90, TrackRoll::None, TrackCurve::None, TrackPitch::Down60, TrackRoll::None, TrackElemType::Down90ToDown60 }, - { false, TrackPitch::Down90, TrackRoll::None, TrackCurve::RightSmall, TrackPitch::Down90, TrackRoll::None, TrackElemType::RightQuarterTurn1TileDown90 }, - { false, TrackPitch::Down60, TrackRoll::None, TrackCurve::LeftSmall, TrackPitch::Down60, TrackRoll::None, TrackElemType::LeftQuarterTurn1TileDown60 }, - { false, TrackPitch::Down60, TrackRoll::None, TrackCurve::None, TrackPitch::Down90, TrackRoll::None, TrackElemType::Down60ToDown90 }, - { false, TrackPitch::Down60, TrackRoll::None, TrackCurve::None, TrackPitch::Down60, TrackRoll::None, TrackElemType::Down60 }, - { false, TrackPitch::Down60, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::Down60ToDown25 }, - { false, TrackPitch::Down60, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::Down60ToFlat }, - { false, TrackPitch::Down60, TrackRoll::None, TrackCurve::RightSmall, TrackPitch::Down60, TrackRoll::None, TrackElemType::RightQuarterTurn1TileDown60 }, - { false, TrackPitch::Down25, TrackRoll::Left, TrackCurve::LeftSmall, TrackPitch::Down25, TrackRoll::Left, TrackElemType::LeftBankedQuarterTurn3TileDown25 }, - { false, TrackPitch::Down25, TrackRoll::Left, TrackCurve::Left, TrackPitch::Down25, TrackRoll::Left, TrackElemType::LeftBankedQuarterTurn5TileDown25 }, - { false, TrackPitch::Down25, TrackRoll::Left, TrackCurve::None, TrackPitch::Down25, TrackRoll::Left, TrackElemType::Down25LeftBanked }, - { false, TrackPitch::Down25, TrackRoll::Left, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::LeftBankedDown25ToDown25 }, - { false, TrackPitch::Down25, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::LeftBankedDown25ToLeftBankedFlat }, - { false, TrackPitch::Down25, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::LeftBankedDown25ToFlat }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::LeftSmall, TrackPitch::Down25, TrackRoll::None, TrackElemType::LeftQuarterTurn3TilesDown25 }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::LeftSmall, TrackPitch::None, TrackRoll::Left, TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::Left, TrackPitch::Down25, TrackRoll::None, TrackElemType::LeftQuarterTurn5TilesDown25 }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::Down60, TrackRoll::None, TrackElemType::Down25ToDown60 }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::Left, TrackElemType::Down25ToLeftBankedDown25 }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::Down25 }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::Right, TrackElemType::Down25ToRightBankedDown25 }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::Down25ToLeftBank }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::Down25ToFlat }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::Down25ToRightBank }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::Right, TrackPitch::Down25, TrackRoll::None, TrackElemType::RightQuarterTurn5TilesDown25 }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::RightSmall, TrackPitch::None, TrackRoll::Right, TrackElemType::RightQuarterTurn3TilesDown25ToRightBank }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::RightSmall, TrackPitch::Down25, TrackRoll::None, TrackElemType::RightQuarterTurn3TilesDown25 }, - { false, TrackPitch::Down25, TrackRoll::Right, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::RightBankedDown25ToDown25 }, - { false, TrackPitch::Down25, TrackRoll::Right, TrackCurve::None, TrackPitch::Down25, TrackRoll::Right, TrackElemType::Down25RightBanked }, - { false, TrackPitch::Down25, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::RightBankedDown25ToFlat }, - { false, TrackPitch::Down25, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::RightBankedDown25ToRightBankedFlat }, - { false, TrackPitch::Down25, TrackRoll::Right, TrackCurve::Right, TrackPitch::Down25, TrackRoll::Right, TrackElemType::RightBankedQuarterTurn5TileDown25 }, - { false, TrackPitch::Down25, TrackRoll::Right, TrackCurve::RightSmall, TrackPitch::Down25, TrackRoll::Right, TrackElemType::RightBankedQuarterTurn3TileDown25 }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::LeftSmall, TrackPitch::None, TrackRoll::Left, TrackElemType::LeftBankedQuarterTurn3Tiles }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::LeftSmall, TrackPitch::Up25, TrackRoll::None, TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25 }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::Left, TrackPitch::None, TrackRoll::Left, TrackElemType::BankedLeftQuarterTurn5Tiles }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::LeftLarge, TrackPitch::None, TrackRoll::Left, TrackElemType::LeftEighthBankToDiag }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::Down25, TrackRoll::Left, TrackElemType::LeftBankedFlatToLeftBankedDown25 }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::LeftBankToDown25 }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::LeftBank }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::LeftBankToFlat }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::Up25, TrackRoll::Left, TrackElemType::LeftBankedFlatToLeftBankedUp25 }, - { false, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::LeftBankToUp25 }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::LeftSmall, TrackPitch::None, TrackRoll::None, TrackElemType::LeftQuarterTurn3Tiles }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::Left, TrackPitch::None, TrackRoll::None, TrackElemType::LeftQuarterTurn5Tiles }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::LeftLarge, TrackPitch::None, TrackRoll::None, TrackElemType::LeftEighthToDiag }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Down60, TrackRoll::None, TrackElemType::FlatToDown60 }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::Left, TrackElemType::FlatToLeftBankedDown25 }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::FlatToDown25 }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::Right, TrackElemType::FlatToRightBankedDown25 }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::FlatToLeftBank }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::Flat }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::LeftVerySmall, TrackPitch::None, TrackRoll::None, TrackElemType::LeftQuarterTurn1Tile }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::RightVerySmall, TrackPitch::None, TrackRoll::None, TrackElemType::RightQuarterTurn1Tile }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::FlatToRightBank }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::Left, TrackElemType::FlatToLeftBankedUp25 }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::FlatToUp25 }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::Right, TrackElemType::FlatToRightBankedUp25 }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Up60, TrackRoll::None, TrackElemType::FlatToUp60 }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::RightLarge, TrackPitch::None, TrackRoll::None, TrackElemType::RightEighthToDiag }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::Right, TrackPitch::None, TrackRoll::None, TrackElemType::RightQuarterTurn5Tiles }, - { false, TrackPitch::None, TrackRoll::None, TrackCurve::RightSmall, TrackPitch::None, TrackRoll::None, TrackElemType::RightQuarterTurn3Tiles }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::RightBankToDown25 }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::Down25, TrackRoll::Right, TrackElemType::RightBankedFlatToRightBankedDown25 }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::RightBankToFlat }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::RightBank }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::RightBankToUp25 }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::Up25, TrackRoll::Right, TrackElemType::RightBankedFlatToRightBankedUp25 }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::RightLarge, TrackPitch::None, TrackRoll::Right, TrackElemType::RightEighthBankToDiag }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::Right, TrackPitch::None, TrackRoll::Right, TrackElemType::BankedRightQuarterTurn5Tiles }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::RightSmall, TrackPitch::None, TrackRoll::Right, TrackElemType::RightBankedQuarterTurn3Tiles }, - { false, TrackPitch::None, TrackRoll::Right, TrackCurve::RightSmall, TrackPitch::Up25, TrackRoll::None, TrackElemType::RightBankToRightQuarterTurn3TilesUp25 }, - { false, TrackPitch::Up25, TrackRoll::Left, TrackCurve::LeftSmall, TrackPitch::Up25, TrackRoll::Left, TrackElemType::LeftBankedQuarterTurn3TileUp25 }, - { false, TrackPitch::Up25, TrackRoll::Left, TrackCurve::Left, TrackPitch::Up25, TrackRoll::Left, TrackElemType::LeftBankedQuarterTurn5TileUp25 }, - { false, TrackPitch::Up25, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::LeftBankedUp25ToLeftBankedFlat }, - { false, TrackPitch::Up25, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::LeftBankedUp25ToFlat }, - { false, TrackPitch::Up25, TrackRoll::Left, TrackCurve::None, TrackPitch::Up25, TrackRoll::Left, TrackElemType::Up25LeftBanked }, - { false, TrackPitch::Up25, TrackRoll::Left, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::LeftBankedUp25ToUp25 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::LeftSmall, TrackPitch::Up25, TrackRoll::None, TrackElemType::LeftQuarterTurn3TilesUp25 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::Left, TrackPitch::Up25, TrackRoll::None, TrackElemType::LeftQuarterTurn5TilesUp25 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::Up25ToLeftBank }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::Up25ToFlat }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::Up25ToRightBank }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::Left, TrackElemType::Up25ToLeftBankedUp25 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::Up25 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::Right, TrackElemType::Up25ToRightBankedUp25 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::Up60, TrackRoll::None, TrackElemType::Up25ToUp60 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::Right, TrackPitch::Up25, TrackRoll::None, TrackElemType::RightQuarterTurn5TilesUp25 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::RightSmall, TrackPitch::Up25, TrackRoll::None, TrackElemType::RightQuarterTurn3TilesUp25 }, - { false, TrackPitch::Up25, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::RightBankedUp25ToFlat }, - { false, TrackPitch::Up25, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::RightBankedUp25ToRightBankedFlat }, - { false, TrackPitch::Up25, TrackRoll::Right, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::RightBankedUp25ToUp25 }, - { false, TrackPitch::Up25, TrackRoll::Right, TrackCurve::None, TrackPitch::Up25, TrackRoll::Right, TrackElemType::Up25RightBanked }, - { false, TrackPitch::Up25, TrackRoll::Right, TrackCurve::Right, TrackPitch::Up25, TrackRoll::Right, TrackElemType::RightBankedQuarterTurn5TileUp25 }, - { false, TrackPitch::Up25, TrackRoll::Right, TrackCurve::RightSmall, TrackPitch::Up25, TrackRoll::Right, TrackElemType::RightBankedQuarterTurn3TileUp25 }, - { false, TrackPitch::Up60, TrackRoll::None, TrackCurve::LeftSmall, TrackPitch::Up60, TrackRoll::None, TrackElemType::LeftQuarterTurn1TileUp60 }, - { false, TrackPitch::Up60, TrackRoll::None, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::Up60ToFlat }, - { false, TrackPitch::Up60, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::Up60ToUp25 }, - { false, TrackPitch::Up60, TrackRoll::None, TrackCurve::None, TrackPitch::Up60, TrackRoll::None, TrackElemType::Up60 }, - { false, TrackPitch::Up60, TrackRoll::None, TrackCurve::None, TrackPitch::Up90, TrackRoll::None, TrackElemType::Up60ToUp90 }, - { false, TrackPitch::Up60, TrackRoll::None, TrackCurve::RightSmall, TrackPitch::Up60, TrackRoll::None, TrackElemType::RightQuarterTurn1TileUp60 }, - { false, TrackPitch::Up90, TrackRoll::None, TrackCurve::LeftSmall, TrackPitch::Up90, TrackRoll::None, TrackElemType::LeftQuarterTurn1TileUp90 }, - { false, TrackPitch::Up90, TrackRoll::None, TrackCurve::None, TrackPitch::Up60, TrackRoll::None, TrackElemType::Up90ToUp60 }, - { false, TrackPitch::Up90, TrackRoll::None, TrackCurve::None, TrackPitch::Up90, TrackRoll::None, TrackElemType::Up90 }, - { false, TrackPitch::Up90, TrackRoll::None, TrackCurve::RightSmall, TrackPitch::Up90, TrackRoll::None, TrackElemType::RightQuarterTurn1TileUp90 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::LeftLarge, TrackPitch::Up25, TrackRoll::None, TrackElemType::LeftEighthToDiagUp25 }, - { false, TrackPitch::Up25, TrackRoll::None, TrackCurve::RightLarge, TrackPitch::Up25, TrackRoll::None, TrackElemType::RightEighthToDiagUp25 }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::LeftLarge, TrackPitch::Down25, TrackRoll::None, TrackElemType::LeftEighthToDiagDown25 }, - { false, TrackPitch::Down25, TrackRoll::None, TrackCurve::RightLarge, TrackPitch::Down25, TrackRoll::None, TrackElemType::RightEighthToDiagDown25 }, - { true, TrackPitch::Up25, TrackRoll::None, TrackCurve::LeftLarge, TrackPitch::Up25, TrackRoll::None, TrackElemType::LeftEighthToOrthogonalUp25 }, - { true, TrackPitch::Up25, TrackRoll::None, TrackCurve::RightLarge, TrackPitch::Up25, TrackRoll::None, TrackElemType::RightEighthToOrthogonalUp25 }, - { true, TrackPitch::Down25, TrackRoll::None, TrackCurve::LeftLarge, TrackPitch::Down25, TrackRoll::None, TrackElemType::LeftEighthToOrthogonalDown25 }, - { true, TrackPitch::Down25, TrackRoll::None, TrackCurve::RightLarge, TrackPitch::Down25, TrackRoll::None, TrackElemType::RightEighthToOrthogonalDown25 }, - { true, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::Left, TrackElemType::DiagUp25ToLeftBankedUp25 }, - { true, TrackPitch::Up25, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::Right, TrackElemType::DiagUp25ToRightBankedUp25 }, - { true, TrackPitch::Up25, TrackRoll::Left, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::DiagLeftBankedUp25ToUp25 }, - { true, TrackPitch::Up25, TrackRoll::Right, TrackCurve::None, TrackPitch::Up25, TrackRoll::None, TrackElemType::DiagRightBankedUp25ToUp25 }, - { true, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::Left, TrackElemType::DiagDown25ToLeftBankedDown25 }, - { true, TrackPitch::Down25, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::Right, TrackElemType::DiagDown25ToRightBankedDown25 }, - { true, TrackPitch::Down25, TrackRoll::Left, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::DiagLeftBankedDown25ToDown25 }, - { true, TrackPitch::Down25, TrackRoll::Right, TrackCurve::None, TrackPitch::Down25, TrackRoll::None, TrackElemType::DiagRightBankedDown25ToDown25 }, - { true, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::Up25, TrackRoll::Left, TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 }, - { true, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::Up25, TrackRoll::Right, TrackElemType::DiagRightBankedFlatToRightBankedUp25 }, - { true, TrackPitch::Up25, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat }, - { true, TrackPitch::Up25, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::DiagRightBankedUp25ToRightBankedFlat }, - { true, TrackPitch::None, TrackRoll::Left, TrackCurve::None, TrackPitch::Down25, TrackRoll::Left, TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 }, - { true, TrackPitch::None, TrackRoll::Right, TrackCurve::None, TrackPitch::Down25, TrackRoll::Right, TrackElemType::DiagRightBankedFlatToRightBankedDown25 }, - { true, TrackPitch::Down25, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::Left, TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat }, - { true, TrackPitch::Down25, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::Right, TrackElemType::DiagRightBankedDown25ToRightBankedFlat }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::Left, TrackElemType::DiagFlatToLeftBankedUp25 }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Up25, TrackRoll::Right, TrackElemType::DiagFlatToRightBankedUp25 }, - { true, TrackPitch::Up25, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagLeftBankedUp25ToFlat }, - { true, TrackPitch::Up25, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagRightBankedUp25ToFlat }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::Left, TrackElemType::DiagFlatToLeftBankedDown25 }, - { true, TrackPitch::None, TrackRoll::None, TrackCurve::None, TrackPitch::Down25, TrackRoll::Right, TrackElemType::DiagFlatToRightBankedDown25 }, - { true, TrackPitch::Down25, TrackRoll::Left, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagLeftBankedDown25ToFlat }, - { true, TrackPitch::Down25, TrackRoll::Right, TrackCurve::None, TrackPitch::None, TrackRoll::None, TrackElemType::DiagRightBankedDown25ToFlat }, - { true, TrackPitch::Up25, TrackRoll::Left, TrackCurve::None, TrackPitch::Up25, TrackRoll::Left, TrackElemType::DiagUp25LeftBanked }, - { true, TrackPitch::Up25, TrackRoll::Right, TrackCurve::None, TrackPitch::Up25, TrackRoll::Right, TrackElemType::DiagUp25RightBanked }, - { true, TrackPitch::Down25, TrackRoll::Left, TrackCurve::None, TrackPitch::Down25, TrackRoll::Left, TrackElemType::DiagDown25LeftBanked }, - { true, TrackPitch::Down25, TrackRoll::Right, TrackCurve::None, TrackPitch::Down25, TrackRoll::Right, TrackElemType::DiagDown25RightBanked }, - { false, TrackPitch::Up25, TrackRoll::Left, TrackCurve::LeftLarge, TrackPitch::Up25, TrackRoll::Left, TrackElemType::LeftEighthBankToDiagUp25 }, - { false, TrackPitch::Up25, TrackRoll::Right, TrackCurve::RightLarge, TrackPitch::Up25, TrackRoll::Right, TrackElemType::RightEighthBankToDiagUp25 }, - { false, TrackPitch::Down25, TrackRoll::Left, TrackCurve::LeftLarge, TrackPitch::Down25, TrackRoll::Left, TrackElemType::LeftEighthBankToDiagDown25 }, - { false, TrackPitch::Down25, TrackRoll::Right, TrackCurve::RightLarge, TrackPitch::Down25, TrackRoll::Right, TrackElemType::RightEighthBankToDiagDown25 }, - { true, TrackPitch::Up25, TrackRoll::Left, TrackCurve::LeftLarge, TrackPitch::Up25, TrackRoll::Left, TrackElemType::LeftEighthBankToOrthogonalUp25 }, - { true, TrackPitch::Up25, TrackRoll::Right, TrackCurve::RightLarge, TrackPitch::Up25, TrackRoll::Right, TrackElemType::RightEighthBankToOrthogonalUp25 }, - { true, TrackPitch::Down25, TrackRoll::Left, TrackCurve::LeftLarge, TrackPitch::Down25, TrackRoll::Left, TrackElemType::LeftEighthBankToOrthogonalDown25 }, - { true, TrackPitch::Down25, TrackRoll::Right, TrackCurve::RightLarge, TrackPitch::Down25, TrackRoll::Right, TrackElemType::RightEighthBankToOrthogonalDown25 }, - }; - + { true, TrackPitch::down60, TrackRoll::none, TrackCurve::none, TrackPitch::down60, TrackRoll::none, TrackElemType::diagDown60 }, + { true, TrackPitch::down60, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::diagDown60ToDown25 }, + { true, TrackPitch::down60, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagDown60ToFlat }, + { true, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::down60, TrackRoll::none, TrackElemType::diagDown25ToDown60 }, + { true, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::diagDown25 }, + { true, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::diagDown25ToLeftBank }, + { true, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagDown25ToFlat }, + { true, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::diagDown25ToRightBank }, + { true, TrackPitch::none, TrackRoll::left, TrackCurve::leftLarge, TrackPitch::none, TrackRoll::left, TrackElemType::leftEighthBankToOrthogonal }, + { true, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::diagLeftBankToDown25 }, + { true, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::diagLeftBank }, + { true, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagLeftBankToFlat }, + { true, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::diagLeftBankToUp25 }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::leftLarge, TrackPitch::none, TrackRoll::none, TrackElemType::leftEighthToOrthogonal }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::down60, TrackRoll::none, TrackElemType::diagFlatToDown60 }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::diagFlatToDown25 }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::diagFlatToLeftBank }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagFlat }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::diagFlatToRightBank }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::diagFlatToUp25 }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::up60, TrackRoll::none, TrackElemType::diagFlatToUp60 }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::rightLarge, TrackPitch::none, TrackRoll::none, TrackElemType::rightEighthToOrthogonal }, + { true, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::diagRightBankToDown25 }, + { true, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagRightBankToFlat }, + { true, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::diagRightBank }, + { true, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::diagRightBankToUp25 }, + { true, TrackPitch::none, TrackRoll::right, TrackCurve::rightLarge, TrackPitch::none, TrackRoll::right, TrackElemType::rightEighthBankToOrthogonal }, + { true, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::diagUp25ToLeftBank }, + { true, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagUp25ToFlat }, + { true, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::diagUp25ToRightBank }, + { true, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::diagUp25 }, + { true, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::up60, TrackRoll::none, TrackElemType::diagUp25ToUp60 }, + { true, TrackPitch::up60, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagUp60ToFlat }, + { true, TrackPitch::up60, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::diagUp60ToUp25 }, + { true, TrackPitch::up60, TrackRoll::none, TrackCurve::none, TrackPitch::up60, TrackRoll::none, TrackElemType::diagUp60 }, + { false, TrackPitch::down90, TrackRoll::none, TrackCurve::leftSmall, TrackPitch::down90, TrackRoll::none, TrackElemType::leftQuarterTurn1TileDown90 }, + { false, TrackPitch::down90, TrackRoll::none, TrackCurve::none, TrackPitch::down90, TrackRoll::none, TrackElemType::down90 }, + { false, TrackPitch::down90, TrackRoll::none, TrackCurve::none, TrackPitch::down60, TrackRoll::none, TrackElemType::down90ToDown60 }, + { false, TrackPitch::down90, TrackRoll::none, TrackCurve::rightSmall, TrackPitch::down90, TrackRoll::none, TrackElemType::rightQuarterTurn1TileDown90 }, + { false, TrackPitch::down60, TrackRoll::none, TrackCurve::leftSmall, TrackPitch::down60, TrackRoll::none, TrackElemType::leftQuarterTurn1TileDown60 }, + { false, TrackPitch::down60, TrackRoll::none, TrackCurve::none, TrackPitch::down90, TrackRoll::none, TrackElemType::down60ToDown90 }, + { false, TrackPitch::down60, TrackRoll::none, TrackCurve::none, TrackPitch::down60, TrackRoll::none, TrackElemType::down60 }, + { false, TrackPitch::down60, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::down60ToDown25 }, + { false, TrackPitch::down60, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::down60ToFlat }, + { false, TrackPitch::down60, TrackRoll::none, TrackCurve::rightSmall, TrackPitch::down60, TrackRoll::none, TrackElemType::rightQuarterTurn1TileDown60 }, + { false, TrackPitch::down25, TrackRoll::left, TrackCurve::leftSmall, TrackPitch::down25, TrackRoll::left, TrackElemType::leftBankedQuarterTurn3TileDown25 }, + { false, TrackPitch::down25, TrackRoll::left, TrackCurve::left, TrackPitch::down25, TrackRoll::left, TrackElemType::leftBankedQuarterTurn5TileDown25 }, + { false, TrackPitch::down25, TrackRoll::left, TrackCurve::none, TrackPitch::down25, TrackRoll::left, TrackElemType::down25LeftBanked }, + { false, TrackPitch::down25, TrackRoll::left, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::leftBankedDown25ToDown25 }, + { false, TrackPitch::down25, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::leftBankedDown25ToLeftBankedFlat }, + { false, TrackPitch::down25, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::leftBankedDown25ToFlat }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::leftSmall, TrackPitch::down25, TrackRoll::none, TrackElemType::leftQuarterTurn3TilesDown25 }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::leftSmall, TrackPitch::none, TrackRoll::left, TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::left, TrackPitch::down25, TrackRoll::none, TrackElemType::leftQuarterTurn5TilesDown25 }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::down60, TrackRoll::none, TrackElemType::down25ToDown60 }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::left, TrackElemType::down25ToLeftBankedDown25 }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::down25 }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::right, TrackElemType::down25ToRightBankedDown25 }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::down25ToLeftBank }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::down25ToFlat }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::down25ToRightBank }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::right, TrackPitch::down25, TrackRoll::none, TrackElemType::rightQuarterTurn5TilesDown25 }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::rightSmall, TrackPitch::none, TrackRoll::right, TrackElemType::rightQuarterTurn3TilesDown25ToRightBank }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::rightSmall, TrackPitch::down25, TrackRoll::none, TrackElemType::rightQuarterTurn3TilesDown25 }, + { false, TrackPitch::down25, TrackRoll::right, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::rightBankedDown25ToDown25 }, + { false, TrackPitch::down25, TrackRoll::right, TrackCurve::none, TrackPitch::down25, TrackRoll::right, TrackElemType::down25RightBanked }, + { false, TrackPitch::down25, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::rightBankedDown25ToFlat }, + { false, TrackPitch::down25, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::rightBankedDown25ToRightBankedFlat }, + { false, TrackPitch::down25, TrackRoll::right, TrackCurve::right, TrackPitch::down25, TrackRoll::right, TrackElemType::rightBankedQuarterTurn5TileDown25 }, + { false, TrackPitch::down25, TrackRoll::right, TrackCurve::rightSmall, TrackPitch::down25, TrackRoll::right, TrackElemType::rightBankedQuarterTurn3TileDown25 }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::leftSmall, TrackPitch::none, TrackRoll::left, TrackElemType::leftBankedQuarterTurn3Tiles }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::leftSmall, TrackPitch::up25, TrackRoll::none, TrackElemType::leftBankToLeftQuarterTurn3TilesUp25 }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::left, TrackPitch::none, TrackRoll::left, TrackElemType::bankedLeftQuarterTurn5Tiles }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::leftLarge, TrackPitch::none, TrackRoll::left, TrackElemType::leftEighthBankToDiag }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::down25, TrackRoll::left, TrackElemType::leftBankedFlatToLeftBankedDown25 }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::leftBankToDown25 }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::leftBank }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::leftBankToFlat }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::up25, TrackRoll::left, TrackElemType::leftBankedFlatToLeftBankedUp25 }, + { false, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::leftBankToUp25 }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::leftSmall, TrackPitch::none, TrackRoll::none, TrackElemType::leftQuarterTurn3Tiles }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::left, TrackPitch::none, TrackRoll::none, TrackElemType::leftQuarterTurn5Tiles }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::leftLarge, TrackPitch::none, TrackRoll::none, TrackElemType::leftEighthToDiag }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::down60, TrackRoll::none, TrackElemType::flatToDown60 }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::left, TrackElemType::flatToLeftBankedDown25 }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::flatToDown25 }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::right, TrackElemType::flatToRightBankedDown25 }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::flatToLeftBank }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::flat }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::leftVerySmall, TrackPitch::none, TrackRoll::none, TrackElemType::leftQuarterTurn1Tile }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::rightVerySmall, TrackPitch::none, TrackRoll::none, TrackElemType::rightQuarterTurn1Tile }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::flatToRightBank }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::left, TrackElemType::flatToLeftBankedUp25 }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::flatToUp25 }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::right, TrackElemType::flatToRightBankedUp25 }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::up60, TrackRoll::none, TrackElemType::flatToUp60 }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::rightLarge, TrackPitch::none, TrackRoll::none, TrackElemType::rightEighthToDiag }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::right, TrackPitch::none, TrackRoll::none, TrackElemType::rightQuarterTurn5Tiles }, + { false, TrackPitch::none, TrackRoll::none, TrackCurve::rightSmall, TrackPitch::none, TrackRoll::none, TrackElemType::rightQuarterTurn3Tiles }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::rightBankToDown25 }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::down25, TrackRoll::right, TrackElemType::rightBankedFlatToRightBankedDown25 }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::rightBankToFlat }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::rightBank }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::rightBankToUp25 }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::up25, TrackRoll::right, TrackElemType::rightBankedFlatToRightBankedUp25 }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::rightLarge, TrackPitch::none, TrackRoll::right, TrackElemType::rightEighthBankToDiag }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::right, TrackPitch::none, TrackRoll::right, TrackElemType::bankedRightQuarterTurn5Tiles }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::rightSmall, TrackPitch::none, TrackRoll::right, TrackElemType::rightBankedQuarterTurn3Tiles }, + { false, TrackPitch::none, TrackRoll::right, TrackCurve::rightSmall, TrackPitch::up25, TrackRoll::none, TrackElemType::rightBankToRightQuarterTurn3TilesUp25 }, + { false, TrackPitch::up25, TrackRoll::left, TrackCurve::leftSmall, TrackPitch::up25, TrackRoll::left, TrackElemType::leftBankedQuarterTurn3TileUp25 }, + { false, TrackPitch::up25, TrackRoll::left, TrackCurve::left, TrackPitch::up25, TrackRoll::left, TrackElemType::leftBankedQuarterTurn5TileUp25 }, + { false, TrackPitch::up25, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::leftBankedUp25ToLeftBankedFlat }, + { false, TrackPitch::up25, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::leftBankedUp25ToFlat }, + { false, TrackPitch::up25, TrackRoll::left, TrackCurve::none, TrackPitch::up25, TrackRoll::left, TrackElemType::up25LeftBanked }, + { false, TrackPitch::up25, TrackRoll::left, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::leftBankedUp25ToUp25 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::leftSmall, TrackPitch::up25, TrackRoll::none, TrackElemType::leftQuarterTurn3TilesUp25 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::left, TrackPitch::up25, TrackRoll::none, TrackElemType::leftQuarterTurn5TilesUp25 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::up25ToLeftBank }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::up25ToFlat }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::up25ToRightBank }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::left, TrackElemType::up25ToLeftBankedUp25 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::up25 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::right, TrackElemType::up25ToRightBankedUp25 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::up60, TrackRoll::none, TrackElemType::up25ToUp60 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::right, TrackPitch::up25, TrackRoll::none, TrackElemType::rightQuarterTurn5TilesUp25 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::rightSmall, TrackPitch::up25, TrackRoll::none, TrackElemType::rightQuarterTurn3TilesUp25 }, + { false, TrackPitch::up25, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::rightBankedUp25ToFlat }, + { false, TrackPitch::up25, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::rightBankedUp25ToRightBankedFlat }, + { false, TrackPitch::up25, TrackRoll::right, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::rightBankedUp25ToUp25 }, + { false, TrackPitch::up25, TrackRoll::right, TrackCurve::none, TrackPitch::up25, TrackRoll::right, TrackElemType::up25RightBanked }, + { false, TrackPitch::up25, TrackRoll::right, TrackCurve::right, TrackPitch::up25, TrackRoll::right, TrackElemType::rightBankedQuarterTurn5TileUp25 }, + { false, TrackPitch::up25, TrackRoll::right, TrackCurve::rightSmall, TrackPitch::up25, TrackRoll::right, TrackElemType::rightBankedQuarterTurn3TileUp25 }, + { false, TrackPitch::up60, TrackRoll::none, TrackCurve::leftSmall, TrackPitch::up60, TrackRoll::none, TrackElemType::leftQuarterTurn1TileUp60 }, + { false, TrackPitch::up60, TrackRoll::none, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::up60ToFlat }, + { false, TrackPitch::up60, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::up60ToUp25 }, + { false, TrackPitch::up60, TrackRoll::none, TrackCurve::none, TrackPitch::up60, TrackRoll::none, TrackElemType::up60 }, + { false, TrackPitch::up60, TrackRoll::none, TrackCurve::none, TrackPitch::up90, TrackRoll::none, TrackElemType::up60ToUp90 }, + { false, TrackPitch::up60, TrackRoll::none, TrackCurve::rightSmall, TrackPitch::up60, TrackRoll::none, TrackElemType::rightQuarterTurn1TileUp60 }, + { false, TrackPitch::up90, TrackRoll::none, TrackCurve::leftSmall, TrackPitch::up90, TrackRoll::none, TrackElemType::leftQuarterTurn1TileUp90 }, + { false, TrackPitch::up90, TrackRoll::none, TrackCurve::none, TrackPitch::up60, TrackRoll::none, TrackElemType::up90ToUp60 }, + { false, TrackPitch::up90, TrackRoll::none, TrackCurve::none, TrackPitch::up90, TrackRoll::none, TrackElemType::up90 }, + { false, TrackPitch::up90, TrackRoll::none, TrackCurve::rightSmall, TrackPitch::up90, TrackRoll::none, TrackElemType::rightQuarterTurn1TileUp90 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::leftLarge, TrackPitch::up25, TrackRoll::none, TrackElemType::leftEighthToDiagUp25 }, + { false, TrackPitch::up25, TrackRoll::none, TrackCurve::rightLarge, TrackPitch::up25, TrackRoll::none, TrackElemType::rightEighthToDiagUp25 }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::leftLarge, TrackPitch::down25, TrackRoll::none, TrackElemType::leftEighthToDiagDown25 }, + { false, TrackPitch::down25, TrackRoll::none, TrackCurve::rightLarge, TrackPitch::down25, TrackRoll::none, TrackElemType::rightEighthToDiagDown25 }, + { true, TrackPitch::up25, TrackRoll::none, TrackCurve::leftLarge, TrackPitch::up25, TrackRoll::none, TrackElemType::leftEighthToOrthogonalUp25 }, + { true, TrackPitch::up25, TrackRoll::none, TrackCurve::rightLarge, TrackPitch::up25, TrackRoll::none, TrackElemType::rightEighthToOrthogonalUp25 }, + { true, TrackPitch::down25, TrackRoll::none, TrackCurve::leftLarge, TrackPitch::down25, TrackRoll::none, TrackElemType::leftEighthToOrthogonalDown25 }, + { true, TrackPitch::down25, TrackRoll::none, TrackCurve::rightLarge, TrackPitch::down25, TrackRoll::none, TrackElemType::rightEighthToOrthogonalDown25 }, + { true, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::left, TrackElemType::diagUp25ToLeftBankedUp25 }, + { true, TrackPitch::up25, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::right, TrackElemType::diagUp25ToRightBankedUp25 }, + { true, TrackPitch::up25, TrackRoll::left, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::diagLeftBankedUp25ToUp25 }, + { true, TrackPitch::up25, TrackRoll::right, TrackCurve::none, TrackPitch::up25, TrackRoll::none, TrackElemType::diagRightBankedUp25ToUp25 }, + { true, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::left, TrackElemType::diagDown25ToLeftBankedDown25 }, + { true, TrackPitch::down25, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::right, TrackElemType::diagDown25ToRightBankedDown25 }, + { true, TrackPitch::down25, TrackRoll::left, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::diagLeftBankedDown25ToDown25 }, + { true, TrackPitch::down25, TrackRoll::right, TrackCurve::none, TrackPitch::down25, TrackRoll::none, TrackElemType::diagRightBankedDown25ToDown25 }, + { true, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::up25, TrackRoll::left, TrackElemType::diagLeftBankedFlatToLeftBankedUp25 }, + { true, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::up25, TrackRoll::right, TrackElemType::diagRightBankedFlatToRightBankedUp25 }, + { true, TrackPitch::up25, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::diagLeftBankedUp25ToLeftBankedFlat }, + { true, TrackPitch::up25, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::diagRightBankedUp25ToRightBankedFlat }, + { true, TrackPitch::none, TrackRoll::left, TrackCurve::none, TrackPitch::down25, TrackRoll::left, TrackElemType::diagLeftBankedFlatToLeftBankedDown25 }, + { true, TrackPitch::none, TrackRoll::right, TrackCurve::none, TrackPitch::down25, TrackRoll::right, TrackElemType::diagRightBankedFlatToRightBankedDown25 }, + { true, TrackPitch::down25, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::left, TrackElemType::diagLeftBankedDown25ToLeftBankedFlat }, + { true, TrackPitch::down25, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::right, TrackElemType::diagRightBankedDown25ToRightBankedFlat }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::left, TrackElemType::diagFlatToLeftBankedUp25 }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::up25, TrackRoll::right, TrackElemType::diagFlatToRightBankedUp25 }, + { true, TrackPitch::up25, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagLeftBankedUp25ToFlat }, + { true, TrackPitch::up25, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagRightBankedUp25ToFlat }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::left, TrackElemType::diagFlatToLeftBankedDown25 }, + { true, TrackPitch::none, TrackRoll::none, TrackCurve::none, TrackPitch::down25, TrackRoll::right, TrackElemType::diagFlatToRightBankedDown25 }, + { true, TrackPitch::down25, TrackRoll::left, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagLeftBankedDown25ToFlat }, + { true, TrackPitch::down25, TrackRoll::right, TrackCurve::none, TrackPitch::none, TrackRoll::none, TrackElemType::diagRightBankedDown25ToFlat }, + { true, TrackPitch::up25, TrackRoll::left, TrackCurve::none, TrackPitch::up25, TrackRoll::left, TrackElemType::diagUp25LeftBanked }, + { true, TrackPitch::up25, TrackRoll::right, TrackCurve::none, TrackPitch::up25, TrackRoll::right, TrackElemType::diagUp25RightBanked }, + { true, TrackPitch::down25, TrackRoll::left, TrackCurve::none, TrackPitch::down25, TrackRoll::left, TrackElemType::diagDown25LeftBanked }, + { true, TrackPitch::down25, TrackRoll::right, TrackCurve::none, TrackPitch::down25, TrackRoll::right, TrackElemType::diagDown25RightBanked }, + { false, TrackPitch::up25, TrackRoll::left, TrackCurve::leftLarge, TrackPitch::up25, TrackRoll::left, TrackElemType::leftEighthBankToDiagUp25 }, + { false, TrackPitch::up25, TrackRoll::right, TrackCurve::rightLarge, TrackPitch::up25, TrackRoll::right, TrackElemType::rightEighthBankToDiagUp25 }, + { false, TrackPitch::down25, TrackRoll::left, TrackCurve::leftLarge, TrackPitch::down25, TrackRoll::left, TrackElemType::leftEighthBankToDiagDown25 }, + { false, TrackPitch::down25, TrackRoll::right, TrackCurve::rightLarge, TrackPitch::down25, TrackRoll::right, TrackElemType::rightEighthBankToDiagDown25 }, + { true, TrackPitch::up25, TrackRoll::left, TrackCurve::leftLarge, TrackPitch::up25, TrackRoll::left, TrackElemType::leftEighthBankToOrthogonalUp25 }, + { true, TrackPitch::up25, TrackRoll::right, TrackCurve::rightLarge, TrackPitch::up25, TrackRoll::right, TrackElemType::rightEighthBankToOrthogonalUp25 }, + { true, TrackPitch::down25, TrackRoll::left, TrackCurve::leftLarge, TrackPitch::down25, TrackRoll::left, TrackElemType::leftEighthBankToOrthogonalDown25 }, + { true, TrackPitch::down25, TrackRoll::right, TrackCurve::rightLarge, TrackPitch::down25, TrackRoll::right, TrackElemType::rightEighthBankToOrthogonalDown25 }, + }; + /** rct2: 0x00993D1C */ static constexpr OpenRCT2::TrackElemType kAlternativeTrackTypes[] = { - TrackElemType::FlatCovered, // TrackElemType::Flat - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::Up25Covered, // TrackElemType::Up25 - TrackElemType::Up60Covered, // TrackElemType::Up60 - TrackElemType::FlatToUp25Covered, // TrackElemType::FlatToUp25 - TrackElemType::Up25ToUp60Covered, // TrackElemType::Up25ToUp60 - TrackElemType::Up60ToUp25Covered, // TrackElemType::Up60ToUp25 - TrackElemType::Up25ToFlatCovered, // TrackElemType::Up25ToFlat - TrackElemType::Down25Covered, // TrackElemType::Down25 - TrackElemType::Down60Covered, // TrackElemType::Down60 - TrackElemType::FlatToDown25Covered, // TrackElemType::FlatToDown25 - TrackElemType::Down25ToDown60Covered, // TrackElemType::Down25ToDown60 - TrackElemType::Down60ToDown25Covered, // TrackElemType::Down60ToDown25 - TrackElemType::Down25ToFlatCovered, // TrackElemType::Down25ToFlat - TrackElemType::LeftQuarterTurn5TilesCovered, // TrackElemType::LeftQuarterTurn5Tiles - TrackElemType::RightQuarterTurn5TilesCovered, // TrackElemType::RightQuarterTurn5Tiles - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::SBendLeftCovered, // TrackElemType::SBendLeft - TrackElemType::SBendRightCovered, // TrackElemType::SBendRight - TrackElemType::None, - TrackElemType::None, - TrackElemType::LeftQuarterTurn3TilesCovered, // TrackElemType::LeftQuarterTurn3Tiles - TrackElemType::RightQuarterTurn3TilesCovered, // TrackElemType::RightQuarterTurn3Tiles - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, - TrackElemType::None, // TrackElemType::FlatTrack1x4A - TrackElemType::None, // TrackElemType::FlatTrack2x2 - TrackElemType::None, // TrackElemType::FlatTrack4x4 - TrackElemType::None, // TrackElemType::FlatTrack2x4 - TrackElemType::None, // TrackElemType::FlatTrack1x5 - TrackElemType::None, // TrackElemType::FlatTrack1x1A - TrackElemType::None, // TrackElemType::FlatTrack1x4B - TrackElemType::None, // TrackElemType::FlatTrack1x1B - TrackElemType::None, // TrackElemType::FlatTrack1x4C - TrackElemType::None, // TrackElemType::FlatTrack3x3 - TrackElemType::None, // TrackElemType::LeftLargeCorkscrewUp - TrackElemType::None, // TrackElemType::RightLargeCorkscrewUp - TrackElemType::None, // TrackElemType::LeftLargeCorkscrewDown - TrackElemType::None, // TrackElemType::RightCorkscrewDown - TrackElemType::None, // TrackElemType::LeftMediumHalfLoopUp - TrackElemType::None, // TrackElemType::RightMediumHalfLoopUp - TrackElemType::None, // TrackElemType::LeftMediumHalfLoopDown - TrackElemType::None, // TrackElemType::RightMediumHalfLoopDown - TrackElemType::None, // TrackElemType::LeftZeroGRollUp - TrackElemType::None, // TrackElemType::RightZeroGRollUp - TrackElemType::None, // TrackElemType::LeftZeroGRollDown - TrackElemType::None, // TrackElemType::RightZeroGRollDown - TrackElemType::None, // TrackElemType::LeftLargeZeroGRollUp - TrackElemType::None, // TrackElemType::RightLargeZeroGRollUp - TrackElemType::None, // TrackElemType::LeftLargeZeroGRollDown - TrackElemType::None, // TrackElemType::RightLargeZeroGRollDown - TrackElemType::None, // LeftFlyerLargeHalfLoopUninvertedUp - TrackElemType::None, // RightFlyerLargeHalfLoopUninvertedUp - TrackElemType::None, // LeftFlyerLargeHalfLoopInvertedDown - TrackElemType::None, // RightFlyerLargeHalfLoopInvertedDown - TrackElemType::None, // FlyerHalfLoopInvertedUp - TrackElemType::None, // FlyerHalfLoopUninvertedDown - TrackElemType::None, // TrackElemType::LeftEighthToDiagUp25 - TrackElemType::None, // TrackElemType::RightEighthToDiagUp25 - TrackElemType::None, // TrackElemType::LeftEighthToDiagDown25 - TrackElemType::None, // TrackElemType::RightEighthToDiagDown25 - TrackElemType::None, // TrackElemType::LeftEighthToOrthogonalUp25 - TrackElemType::None, // TrackElemType::RightEighthToOrthogonalUp25 - TrackElemType::None, // TrackElemType::LeftEighthToOrthogonalDown25 - TrackElemType::None, // TrackElemType::RightEighthToOrthogonalDown25 - TrackElemType::None, // TrackElemType::DiagUp25ToLeftBankedUp25 - TrackElemType::None, // TrackElemType::DiagUp25ToRightBankedUp25 - TrackElemType::None, // TrackElemType::DiagLeftBankedUp25ToUp25 - TrackElemType::None, // TrackElemType::DiagRightBankedUp25ToUp25 - TrackElemType::None, // TrackElemType::DiagDown25ToLeftBankedDown25 - TrackElemType::None, // TrackElemType::DiagDown25ToRightBankedDown25 - TrackElemType::None, // TrackElemType::DiagLeftBankedDown25ToDown25 - TrackElemType::None, // TrackElemType::DiagRightBankedDown25ToDown25 - TrackElemType::None, // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - TrackElemType::None, // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - TrackElemType::None, // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - TrackElemType::None, // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - TrackElemType::None, // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - TrackElemType::None, // TrackElemType::DiagRightBankedFlatToRightBankedDown25 - TrackElemType::None, // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - TrackElemType::None, // TrackElemType::DiagRightBankedDown25ToRightBankedFlat - TrackElemType::None, // TrackElemType::DiagFlatToLeftBankedUp25 - TrackElemType::None, // TrackElemType::DiagFlatToRightBankedUp25 - TrackElemType::None, // TrackElemType::DiagLeftBankedUp25ToFlat - TrackElemType::None, // TrackElemType::DiagRightBankedUp25ToFlat - TrackElemType::None, // TrackElemType::DiagFlatToLeftBankedDown25 - TrackElemType::None, // TrackElemType::DiagFlatToRightBankedDown25 - TrackElemType::None, // TrackElemType::DiagLeftBankedDown25ToFlat - TrackElemType::None, // TrackElemType::DiagRightBankedDown25ToFlat - TrackElemType::None, // TrackElemType::DiagUp25LeftBanked - TrackElemType::None, // TrackElemType::DiagUp25RightBanked - TrackElemType::None, // TrackElemType::DiagDown25LeftBanked - TrackElemType::None, // TrackElemType::DiagDown25RightBanked - TrackElemType::None, // TrackElemType::LeftEighthBankToDiagUp25 - TrackElemType::None, // TrackElemType::RightEighthBankToDiagUp25 - TrackElemType::None, // TrackElemType::LeftEighthBankToDiagDown25 - TrackElemType::None, // TrackElemType::RightEighthBankToDiagDown25 - TrackElemType::None, // TrackElemType::LeftEighthBankToOrthogonalUp25 - TrackElemType::None, // TrackElemType::RightEighthBankToOrthogonalUp25 - TrackElemType::None, // TrackElemType::LeftEighthBankToOrthogonalDown25 - TrackElemType::None, // TrackElemType::RightEighthBankToOrthogonalDown25 - TrackElemType::None, // TrackElemType::DiagBrakes - TrackElemType::None, // TrackElemType::DiagBlockBrakes - TrackElemType::None, // TrackElemType::Down25Brakes - TrackElemType::None, // TrackElemType::DiagBooster - TrackElemType::None, // TrackElemType::DiagFlatToUp60LongBase, - TrackElemType::None, // TrackElemType::DiagUp60ToFlatLongBase, - TrackElemType::None, // TrackElemType::DiagFlatToDown60LongBase, - TrackElemType::None, // TrackElemType::DiagDown60ToFlatLongBase, - TrackElemType::None, // TrackElemType::LeftEighthDiveLoopUpToOrthogonal - TrackElemType::None, // TrackElemType::RightEighthDiveLoopUpToOrthogonal - TrackElemType::None, // TrackElemType::LeftEighthDiveLoopDownToDiag - TrackElemType::None, // TrackElemType::RightEighthDiveLoopDownToDiag - TrackElemType::None, // TrackElemType::DiagDown25Brakes - }; - static_assert(std::size(kAlternativeTrackTypes) == EnumValue(TrackElemType::Count)); - + TrackElemType::flatCovered, // TrackElemType::flat + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::up25Covered, // TrackElemType::up25 + TrackElemType::up60Covered, // TrackElemType::up60 + TrackElemType::flatToUp25Covered, // TrackElemType::flatToUp25 + TrackElemType::up25ToUp60Covered, // TrackElemType::up25ToUp60 + TrackElemType::up60ToUp25Covered, // TrackElemType::up60ToUp25 + TrackElemType::up25ToFlatCovered, // TrackElemType::up25ToFlat + TrackElemType::down25Covered, // TrackElemType::down25 + TrackElemType::down60Covered, // TrackElemType::down60 + TrackElemType::flatToDown25Covered, // TrackElemType::flatToDown25 + TrackElemType::down25ToDown60Covered, // TrackElemType::down25ToDown60 + TrackElemType::down60ToDown25Covered, // TrackElemType::down60ToDown25 + TrackElemType::down25ToFlatCovered, // TrackElemType::down25ToFlat + TrackElemType::leftQuarterTurn5TilesCovered, // TrackElemType::leftQuarterTurn5Tiles + TrackElemType::rightQuarterTurn5TilesCovered, // TrackElemType::rightQuarterTurn5Tiles + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::sBendLeftCovered, // TrackElemType::sBendLeft + TrackElemType::sBendRightCovered, // TrackElemType::sBendRight + TrackElemType::none, + TrackElemType::none, + TrackElemType::leftQuarterTurn3TilesCovered, // TrackElemType::leftQuarterTurn3Tiles + TrackElemType::rightQuarterTurn3TilesCovered, // TrackElemType::rightQuarterTurn3Tiles + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, + TrackElemType::none, // TrackElemType::flatTrack1x4A + TrackElemType::none, // TrackElemType::flatTrack2x2 + TrackElemType::none, // TrackElemType::flatTrack4x4 + TrackElemType::none, // TrackElemType::flatTrack2x4 + TrackElemType::none, // TrackElemType::flatTrack1x5 + TrackElemType::none, // TrackElemType::flatTrack1x1A + TrackElemType::none, // TrackElemType::flatTrack1x4B + TrackElemType::none, // TrackElemType::flatTrack1x1B + TrackElemType::none, // TrackElemType::flatTrack1x4C + TrackElemType::none, // TrackElemType::flatTrack3x3 + TrackElemType::none, // TrackElemType::leftLargeCorkscrewUp + TrackElemType::none, // TrackElemType::rightLargeCorkscrewUp + TrackElemType::none, // TrackElemType::leftLargeCorkscrewDown + TrackElemType::none, // TrackElemType::rightCorkscrewDown + TrackElemType::none, // TrackElemType::leftMediumHalfLoopUp + TrackElemType::none, // TrackElemType::rightMediumHalfLoopUp + TrackElemType::none, // TrackElemType::leftMediumHalfLoopDown + TrackElemType::none, // TrackElemType::rightMediumHalfLoopDown + TrackElemType::none, // TrackElemType::leftZeroGRollUp + TrackElemType::none, // TrackElemType::rightZeroGRollUp + TrackElemType::none, // TrackElemType::leftZeroGRollDown + TrackElemType::none, // TrackElemType::rightZeroGRollDown + TrackElemType::none, // TrackElemType::leftLargeZeroGRollUp + TrackElemType::none, // TrackElemType::rightLargeZeroGRollUp + TrackElemType::none, // TrackElemType::leftLargeZeroGRollDown + TrackElemType::none, // TrackElemType::rightLargeZeroGRollDown + TrackElemType::none, // LeftFlyerLargeHalfLoopUninvertedUp + TrackElemType::none, // RightFlyerLargeHalfLoopUninvertedUp + TrackElemType::none, // LeftFlyerLargeHalfLoopInvertedDown + TrackElemType::none, // RightFlyerLargeHalfLoopInvertedDown + TrackElemType::none, // FlyerHalfLoopInvertedUp + TrackElemType::none, // FlyerHalfLoopUninvertedDown + TrackElemType::none, // TrackElemType::leftEighthToDiagUp25 + TrackElemType::none, // TrackElemType::rightEighthToDiagUp25 + TrackElemType::none, // TrackElemType::leftEighthToDiagDown25 + TrackElemType::none, // TrackElemType::rightEighthToDiagDown25 + TrackElemType::none, // TrackElemType::leftEighthToOrthogonalUp25 + TrackElemType::none, // TrackElemType::rightEighthToOrthogonalUp25 + TrackElemType::none, // TrackElemType::leftEighthToOrthogonalDown25 + TrackElemType::none, // TrackElemType::rightEighthToOrthogonalDown25 + TrackElemType::none, // TrackElemType::diagUp25ToLeftBankedUp25 + TrackElemType::none, // TrackElemType::diagUp25ToRightBankedUp25 + TrackElemType::none, // TrackElemType::diagLeftBankedUp25ToUp25 + TrackElemType::none, // TrackElemType::diagRightBankedUp25ToUp25 + TrackElemType::none, // TrackElemType::diagDown25ToLeftBankedDown25 + TrackElemType::none, // TrackElemType::diagDown25ToRightBankedDown25 + TrackElemType::none, // TrackElemType::diagLeftBankedDown25ToDown25 + TrackElemType::none, // TrackElemType::diagRightBankedDown25ToDown25 + TrackElemType::none, // TrackElemType::diagLeftBankedFlatToLeftBankedUp25 + TrackElemType::none, // TrackElemType::diagRightBankedFlatToRightBankedUp25 + TrackElemType::none, // TrackElemType::diagLeftBankedUp25ToLeftBankedFlat + TrackElemType::none, // TrackElemType::diagRightBankedUp25ToRightBankedFlat + TrackElemType::none, // TrackElemType::diagLeftBankedFlatToLeftBankedDown25 + TrackElemType::none, // TrackElemType::diagRightBankedFlatToRightBankedDown25 + TrackElemType::none, // TrackElemType::diagLeftBankedDown25ToLeftBankedFlat + TrackElemType::none, // TrackElemType::diagRightBankedDown25ToRightBankedFlat + TrackElemType::none, // TrackElemType::diagFlatToLeftBankedUp25 + TrackElemType::none, // TrackElemType::diagFlatToRightBankedUp25 + TrackElemType::none, // TrackElemType::diagLeftBankedUp25ToFlat + TrackElemType::none, // TrackElemType::diagRightBankedUp25ToFlat + TrackElemType::none, // TrackElemType::diagFlatToLeftBankedDown25 + TrackElemType::none, // TrackElemType::diagFlatToRightBankedDown25 + TrackElemType::none, // TrackElemType::diagLeftBankedDown25ToFlat + TrackElemType::none, // TrackElemType::diagRightBankedDown25ToFlat + TrackElemType::none, // TrackElemType::diagUp25LeftBanked + TrackElemType::none, // TrackElemType::diagUp25RightBanked + TrackElemType::none, // TrackElemType::diagDown25LeftBanked + TrackElemType::none, // TrackElemType::diagDown25RightBanked + TrackElemType::none, // TrackElemType::leftEighthBankToDiagUp25 + TrackElemType::none, // TrackElemType::rightEighthBankToDiagUp25 + TrackElemType::none, // TrackElemType::leftEighthBankToDiagDown25 + TrackElemType::none, // TrackElemType::rightEighthBankToDiagDown25 + TrackElemType::none, // TrackElemType::leftEighthBankToOrthogonalUp25 + TrackElemType::none, // TrackElemType::rightEighthBankToOrthogonalUp25 + TrackElemType::none, // TrackElemType::leftEighthBankToOrthogonalDown25 + TrackElemType::none, // TrackElemType::rightEighthBankToOrthogonalDown25 + TrackElemType::none, // TrackElemType::diagBrakes + TrackElemType::none, // TrackElemType::diagBlockBrakes + TrackElemType::none, // TrackElemType::down25Brakes + TrackElemType::none, // TrackElemType::diagBooster + TrackElemType::none, // TrackElemType::diagFlatToUp60LongBase, + TrackElemType::none, // TrackElemType::diagUp60ToFlatLongBase, + TrackElemType::none, // TrackElemType::diagFlatToDown60LongBase, + TrackElemType::none, // TrackElemType::diagDown60ToFlatLongBase, + TrackElemType::none, // TrackElemType::leftEighthDiveLoopUpToOrthogonal + TrackElemType::none, // TrackElemType::rightEighthDiveLoopUpToOrthogonal + TrackElemType::none, // TrackElemType::leftEighthDiveLoopDownToDiag + TrackElemType::none, // TrackElemType::rightEighthDiveLoopDownToDiag + TrackElemType::none, // TrackElemType::diagDown25Brakes + }; + static_assert(std::size(kAlternativeTrackTypes) == EnumValue(TrackElemType::count)); + /** rct2: 0x0099DA34 */ static constexpr money64 kTrackPricing[] = { - 65536, // TrackElemType::Flat - 98304, // TrackElemType::EndStation - 98304, // TrackElemType::BeginStation - 98304, // TrackElemType::MiddleStation - 79872, // TrackElemType::Up25 - 114688, // TrackElemType::Up60 - 73728, // TrackElemType::FlatToUp25 - 96256, // TrackElemType::Up25ToUp60 - 96256, // TrackElemType::Up60ToUp25 - 73728, // TrackElemType::Up25ToFlat - 79872, // TrackElemType::Down25 - 114688, // TrackElemType::Down60 - 73728, // TrackElemType::FlatToDown25 - 96256, // TrackElemType::Down25ToDown60 - 96256, // TrackElemType::Down60ToDown25 - 73728, // TrackElemType::Down25ToFlat - 257359, // TrackElemType::LeftQuarterTurn5Tiles - 257359, // TrackElemType::RightQuarterTurn5Tiles - 69632, // TrackElemType::FlatToLeftBank - 69632, // TrackElemType::FlatToRightBank - 69632, // TrackElemType::LeftBankToFlat - 69632, // TrackElemType::RightBankToFlat - 273443, // TrackElemType::BankedLeftQuarterTurn5Tiles - 273443, // TrackElemType::BankedRightQuarterTurn5Tiles - 78336, // TrackElemType::LeftBankToUp25 - 78336, // TrackElemType::RightBankToUp25 - 78336, // TrackElemType::Up25ToLeftBank - 78336, // TrackElemType::Up25ToRightBank - 78336, // TrackElemType::LeftBankToDown25 - 78336, // TrackElemType::RightBankToDown25 - 78336, // TrackElemType::Down25ToLeftBank - 78336, // TrackElemType::Down25ToRightBank - 69632, // TrackElemType::LeftBank - 69632, // TrackElemType::RightBank - 313656, // TrackElemType::LeftQuarterTurn5TilesUp25 - 313656, // TrackElemType::RightQuarterTurn5TilesUp25 - 313656, // TrackElemType::LeftQuarterTurn5TilesDown25 - 313656, // TrackElemType::RightQuarterTurn5TilesDown25 - 229376, // TrackElemType::SBendLeft - 229376, // TrackElemType::SBendRight - 491520, // TrackElemType::LeftVerticalLoop - 491520, // TrackElemType::RightVerticalLoop - 154415, // TrackElemType::LeftQuarterTurn3Tiles - 154415, // TrackElemType::RightQuarterTurn3Tiles - 164065, // TrackElemType::LeftBankedQuarterTurn3Tiles - 164065, // TrackElemType::RightBankedQuarterTurn3Tiles - 270226, // TrackElemType::LeftQuarterTurn3TilesUp25 - 270226, // TrackElemType::RightQuarterTurn3TilesUp25 - 270226, // TrackElemType::LeftQuarterTurn3TilesDown25 - 270226, // TrackElemType::RightQuarterTurn3TilesDown25 - 51471, // TrackElemType::LeftQuarterTurn1Tile - 51471, // TrackElemType::RightQuarterTurn1Tile - 212992, // TrackElemType::LeftTwistDownToUp - 212992, // TrackElemType::RightTwistDownToUp - 212992, // TrackElemType::LeftTwistUpToDown - 212992, // TrackElemType::RightTwistUpToDown - 294912, // TrackElemType::HalfLoopUp - 294912, // TrackElemType::HalfLoopDown - 229376, // TrackElemType::LeftCorkscrewUp - 229376, // TrackElemType::RightCorkscrewUp - 229376, // TrackElemType::LeftCorkscrewDown - 229376, // TrackElemType::RightCorkscrewDown - 98304, // TrackElemType::FlatToUp60 - 98304, // TrackElemType::Up60ToFlat - 98304, // TrackElemType::FlatToDown60 - 98304, // TrackElemType::Down60ToFlat - 524288, // TrackElemType::TowerBase - 65536, // TrackElemType::TowerSection - 69632, // TrackElemType::FlatCovered - 83968, // TrackElemType::Up25Covered - 118784, // TrackElemType::Up60Covered - 77824, // TrackElemType::FlatToUp25Covered - 100352, // TrackElemType::Up25ToUp60Covered - 100352, // TrackElemType::Up60ToUp25Covered - 77824, // TrackElemType::Up25ToFlatCovered - 83968, // TrackElemType::Down25Covered - 118784, // TrackElemType::Down60Covered - 77824, // TrackElemType::FlatToDown25Covered - 100352, // TrackElemType::Down25ToDown60Covered - 100352, // TrackElemType::Down60ToDown25Covered - 77824, // TrackElemType::Down25ToFlatCovered - 261455, // TrackElemType::LeftQuarterTurn5TilesCovered - 261455, // TrackElemType::RightQuarterTurn5TilesCovered - 233472, // TrackElemType::SBendLeftCovered - 233472, // TrackElemType::SBendRightCovered - 158511, // TrackElemType::LeftQuarterTurn3TilesCovered - 158511, // TrackElemType::RightQuarterTurn3TilesCovered - 328192, // TrackElemType::LeftHalfBankedHelixUpSmall - 328192, // TrackElemType::RightHalfBankedHelixUpSmall - 328192, // TrackElemType::LeftHalfBankedHelixDownSmall - 328192, // TrackElemType::RightHalfBankedHelixDownSmall - 547072, // TrackElemType::LeftHalfBankedHelixUpLarge - 547072, // TrackElemType::RightHalfBankedHelixUpLarge - 547072, // TrackElemType::LeftHalfBankedHelixDownLarge - 547072, // TrackElemType::RightHalfBankedHelixDownLarge - 126976, // TrackElemType::LeftQuarterTurn1TileUp60 - 126976, // TrackElemType::RightQuarterTurn1TileUp60 - 126976, // TrackElemType::LeftQuarterTurn1TileDown60 - 126976, // TrackElemType::RightQuarterTurn1TileDown60 - 90112, // TrackElemType::Brakes - 77824, // TrackElemType::Booster - 65536, // TrackElemType::Maze - 273539, // TrackElemType::LeftQuarterBankedHelixLargeUp - 273539, // TrackElemType::RightQuarterBankedHelixLargeUp - 273539, // TrackElemType::LeftQuarterBankedHelixLargeDown - 273539, // TrackElemType::RightQuarterBankedHelixLargeDown - 273539, // TrackElemType::LeftQuarterHelixLargeUp - 273539, // TrackElemType::RightQuarterHelixLargeUp - 273539, // TrackElemType::LeftQuarterHelixLargeDown - 273539, // TrackElemType::RightQuarterHelixLargeDown - 83968, // TrackElemType::Up25LeftBanked - 83968, // TrackElemType::Up25RightBanked - 143360, // TrackElemType::Waterfall - 118784, // TrackElemType::Rapids - 196608, // TrackElemType::OnRidePhoto - 83968, // TrackElemType::Down25LeftBanked - 83968, // TrackElemType::Down25RightBanked - 393216, // TrackElemType::Watersplash - 376832, // TrackElemType::FlatToUp60LongBase - 376832, // TrackElemType::Up60ToFlatLongBase - 126976, // TrackElemType::Whirlpool - 376832, // TrackElemType::Down60ToFlatLongBase - 376832, // TrackElemType::FlatToDown60LongBase - 643072, // TrackElemType::CableLiftHill - 491520, // TrackElemType::ReverseFreefallSlope - 65536, // TrackElemType::ReverseFreefallVertical - 69632, // TrackElemType::Up90 - 69632, // TrackElemType::Down90 - 114688, // TrackElemType::Up60ToUp90 - 114688, // TrackElemType::Down90ToDown60 - 114688, // TrackElemType::Up90ToUp60 - 114688, // TrackElemType::Down60ToDown90 - 147456, // TrackElemType::BrakeForDrop - 180151, // TrackElemType::LeftEighthToDiag - 180151, // TrackElemType::RightEighthToDiag - 180151, // TrackElemType::LeftEighthToOrthogonal - 180151, // TrackElemType::RightEighthToOrthogonal - 190960, // TrackElemType::LeftEighthBankToDiag - 190960, // TrackElemType::RightEighthBankToDiag - 190960, // TrackElemType::LeftEighthBankToOrthogonal - 190960, // TrackElemType::RightEighthBankToOrthogonal - 92681, // TrackElemType::DiagFlat - 111820, // TrackElemType::DiagUp25 - 147456, // TrackElemType::DiagUp60 - 102400, // TrackElemType::DiagFlatToUp25 - 129024, // TrackElemType::DiagUp25ToUp60 - 129024, // TrackElemType::DiagUp60ToUp25 - 102400, // TrackElemType::DiagUp25ToFlat - 111820, // TrackElemType::DiagDown25 - 147456, // TrackElemType::DiagDown60 - 102400, // TrackElemType::DiagFlatToDown25 - 129024, // TrackElemType::DiagDown25ToDown60 - 129024, // TrackElemType::DiagDown60ToDown25 - 102400, // TrackElemType::DiagDown25ToFlat - 107008, // TrackElemType::DiagFlatToUp60 - 107008, // TrackElemType::DiagUp60ToFlat - 107008, // TrackElemType::DiagFlatToDown60 - 107008, // TrackElemType::DiagDown60ToFlat - 96777, // TrackElemType::DiagFlatToLeftBank - 96777, // TrackElemType::DiagFlatToRightBank - 96777, // TrackElemType::DiagLeftBankToFlat - 96777, // TrackElemType::DiagRightBankToFlat - 106496, // TrackElemType::DiagLeftBankToUp25 - 106496, // TrackElemType::DiagRightBankToUp25 - 106496, // TrackElemType::DiagUp25ToLeftBank - 106496, // TrackElemType::DiagUp25ToRightBank - 106496, // TrackElemType::DiagLeftBankToDown25 - 106496, // TrackElemType::DiagRightBankToDown25 - 106496, // TrackElemType::DiagDown25ToLeftBank - 106496, // TrackElemType::DiagDown25ToRightBank - 96777, // TrackElemType::DiagLeftBank - 96777, // TrackElemType::DiagRightBank - 282624, // TrackElemType::LogFlumeReverser - 217088, // TrackElemType::SpinningTunnel - 221184, // TrackElemType::LeftBarrelRollUpToDown - 221184, // TrackElemType::RightBarrelRollUpToDown - 221184, // TrackElemType::LeftBarrelRollDownToUp - 221184, // TrackElemType::RightBarrelRollDownToUp - 270226, // TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25 - 270226, // TrackElemType::RightBankToRightQuarterTurn3TilesUp25 - 270226, // TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank - 270226, // TrackElemType::RightQuarterTurn3TilesDown25ToRightBank - 96384, // TrackElemType::PoweredLift - 884736, // TrackElemType::LeftLargeHalfLoopUp - 884736, // TrackElemType::RightLargeHalfLoopUp - 884736, // TrackElemType::LeftLargeHalfLoopDown - 884736, // TrackElemType::RightLargeHalfLoopDown - 221184, // TrackElemType::LeftFlyerTwistUp - 221184, // TrackElemType::RightFlyerTwistUp - 221184, // TrackElemType::LeftFlyerTwistDown - 221184, // TrackElemType::RightFlyerTwistDown - 294912, // TrackElemType::FlyerHalfLoopUninvertedUp - 294912, // TrackElemType::FlyerHalfLoopInvertedDown - 229376, // TrackElemType::LeftFlyerCorkscrewUp - 229376, // TrackElemType::RightFlyerCorkscrewUp - 229376, // TrackElemType::LeftFlyerCorkscrewDown - 229376, // TrackElemType::RightFlyerCorkscrewDown - 294912, // TrackElemType::HeartLineTransferUp - 294912, // TrackElemType::HeartLineTransferDown - 417792, // TrackElemType::LeftHeartLineRoll - 417792, // TrackElemType::RightHeartLineRoll - 159744, // TrackElemType::MinigolfHoleA - 167936, // TrackElemType::MinigolfHoleB - 172032, // TrackElemType::MinigolfHoleC - 184320, // TrackElemType::MinigolfHoleD - 184320, // TrackElemType::MinigolfHoleE - 360448, // TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop - 360448, // TrackElemType::Up90ToInvertedFlatQuarterLoop - 360448, // TrackElemType::InvertedFlatToDown90QuarterLoop - 270226, // TrackElemType::LeftCurvedLiftHill - 270226, // TrackElemType::RightCurvedLiftHill - 393216, // TrackElemType::LeftReverser - 393216, // TrackElemType::RightReverser - 65536, // TrackElemType::AirThrustTopCap - 65536, // TrackElemType::AirThrustVerticalDown - 491520, // TrackElemType::AirThrustVerticalDownToLevel - 94208, // TrackElemType::BlockBrakes - 287115, // TrackElemType::LeftBankedQuarterTurn3TileUp25 - 287115, // TrackElemType::RightBankedQuarterTurn3TileUp25 - 287115, // TrackElemType::LeftBankedQuarterTurn3TileDown25 - 287115, // TrackElemType::RightBankedQuarterTurn3TileDown25 - 333259, // TrackElemType::LeftBankedQuarterTurn5TileUp25 - 333259, // TrackElemType::RightBankedQuarterTurn5TileUp25 - 333259, // TrackElemType::LeftBankedQuarterTurn5TileDown25 - 333259, // TrackElemType::RightBankedQuarterTurn5TileDown25 - 83968, // TrackElemType::Up25ToLeftBankedUp25 - 83968, // TrackElemType::Up25ToRightBankedUp25 - 83968, // TrackElemType::LeftBankedUp25ToUp25 - 83968, // TrackElemType::RightBankedUp25ToUp25 - 83968, // TrackElemType::Down25ToLeftBankedDown25 - 83968, // TrackElemType::Down25ToRightBankedDown25 - 83968, // TrackElemType::LeftBankedDown25ToDown25 - 83968, // TrackElemType::RightBankedDown25ToDown25 - 77824, // TrackElemType::LeftBankedFlatToLeftBankedUp25 - 77824, // TrackElemType::RightBankedFlatToRightBankedUp25 - 77824, // TrackElemType::LeftBankedUp25ToLeftBankedFlat - 77824, // TrackElemType::RightBankedUp25ToRightBankedFlat - 77824, // TrackElemType::LeftBankedFlatToLeftBankedDown25 - 77824, // TrackElemType::RightBankedFlatToRightBankedDown25 - 77824, // TrackElemType::LeftBankedDown25ToLeftBankedFlat - 77824, // TrackElemType::RightBankedDown25ToRightBankedFlat - 77824, // TrackElemType::FlatToLeftBankedUp25 - 77824, // TrackElemType::FlatToRightBankedUp25 - 77824, // TrackElemType::LeftBankedUp25ToFlat - 77824, // TrackElemType::RightBankedUp25ToFlat - 77824, // TrackElemType::FlatToLeftBankedDown25 - 77824, // TrackElemType::FlatToRightBankedDown25 - 77824, // TrackElemType::LeftBankedDown25ToFlat - 77824, // TrackElemType::RightBankedDown25ToFlat - 151552, // TrackElemType::LeftQuarterTurn1TileUp90 - 151552, // TrackElemType::RightQuarterTurn1TileUp90 - 151552, // TrackElemType::LeftQuarterTurn1TileDown90 - 151552, // TrackElemType::RightQuarterTurn1TileDown90 - 360448, // TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop - 360448, // TrackElemType::MultiDimFlatToDown90QuarterLoop - 360448, // TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop - 77824, // TrackElemType::RotationControlToggle - 262144, // TrackElemType::FlatTrack1x4A - 262144, // TrackElemType::FlatTrack2x2 - 1048576,// TrackElemType::FlatTrack4x4 - 524288, // TrackElemType::FlatTrack2x4 - 327680, // TrackElemType::FlatTrack1x5 - 65536, // TrackElemType::FlatTrack1x1A - 262144, // TrackElemType::FlatTrack1x4B - 65536, // TrackElemType::FlatTrack1x1B - 262144, // TrackElemType::FlatTrack1x4C - 524288, // TrackElemType::FlatTrack3x3 - 360448, // TrackElemType::LeftLargeCorkscrewUp - 360448, // TrackElemType::RightLargeCorkscrewUp - 360448, // TrackElemType::LeftLargeCorkscrewDown - 360448, // TrackElemType::RightCorkscrewDown - 589824, // TrackElemType::LeftMediumHalfLoopUp - 589824, // TrackElemType::RightMediumHalfLoopUp - 589824, // TrackElemType::LeftMediumHalfLoopDown - 589824, // TrackElemType::RightMediumHalfLoopDown - 229376, // TrackElemType::LeftZeroGRollUp - 229376, // TrackElemType::RightZeroGRollUp - 229376, // TrackElemType::LeftZeroGRollDown - 229376, // TrackElemType::RightZeroGRollDown - 425984, // TrackElemType::LeftLargeZeroGRollUp - 425984, // TrackElemType::RightLargeZeroGRollUp - 425984, // TrackElemType::LeftLargeZeroGRollDown - 425984, // TrackElemType::RightLargeZeroGRollDown - 884736, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp - 884736, // TrackElemType::RightFlyerLargeHalfLoopUninvertedUp - 884736, // TrackElemType::LeftFlyerLargeHalfLoopInvertedDown - 884736, // TrackElemType::RightFlyerLargeHalfLoopInvertedDown - 884736, // TrackElemType::LeftFlyerLargeHalfLoopInvertedUp - 884736, // TrackElemType::RightFlyerLargeHalfLoopInvertedUp - 884736, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown - 884736, // TrackElemType::RightFlyerLargeHalfLoopUninvertedDown - 294912, // TrackElemType::FlyerHalfLoopInvertedUp - 294912, // TrackElemType::FlyerHalfLoopUninvertedDown - 219559, // TrackElemType::LeftEighthToDiagUp25 - 219559, // TrackElemType::RightEighthToDiagUp25 - 219559, // TrackElemType::LeftEighthToDiagDown25 - 219559, // TrackElemType::RightEighthToDiagDown25 - 219559, // TrackElemType::LeftEighthToOrthogonalUp25 - 219559, // TrackElemType::RightEighthToOrthogonalUp25 - 219559, // TrackElemType::LeftEighthToOrthogonalDown25 - 219559, // TrackElemType::RightEighthToOrthogonalDown25 - 118809, // TrackElemType::DiagUp25ToLeftBankedUp25 - 118809, // TrackElemType::DiagUp25ToRightBankedUp25 - 118809, // TrackElemType::DiagLeftBankedUp25ToUp25 - 118809, // TrackElemType::DiagRightBankedUp25ToUp25 - 118809, // TrackElemType::DiagDown25ToLeftBankedDown25 - 118809, // TrackElemType::DiagDown25ToRightBankedDown25 - 118809, // TrackElemType::DiagLeftBankedDown25ToDown25 - 118809, // TrackElemType::DiagRightBankedDown25ToDown25 - 108800, // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - 108800, // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - 108800, // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - 108800, // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - 108800, // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - 108800, // TrackElemType::DiagRightBankedFlatToRightBankedDown25 - 108800, // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - 108800, // TrackElemType::DiagRightBankedDown25ToRightBankedFlat - 108800, // TrackElemType::DiagFlatToLeftBankedUp25 - 108800, // TrackElemType::DiagFlatToRightBankedUp25 - 108800, // TrackElemType::DiagLeftBankedUp25ToFlat - 108800, // TrackElemType::DiagRightBankedUp25ToFlat - 108800, // TrackElemType::DiagFlatToLeftBankedDown25 - 108800, // TrackElemType::DiagFlatToRightBankedDown25 - 108800, // TrackElemType::DiagLeftBankedDown25ToFlat - 108800, // TrackElemType::DiagRightBankedDown25ToFlat - 118809, // TrackElemType::DiagUp25LeftBanked - 118809, // TrackElemType::DiagUp25RightBanked - 118809, // TrackElemType::DiagDown25LeftBanked - 118809, // TrackElemType::DiagDown25RightBanked - 233281, // TrackElemType::LeftEighthBankToDiagUp25 - 233281, // TrackElemType::RightEighthBankToDiagUp25 - 233281, // TrackElemType::LeftEighthBankToDiagDown25 - 233281, // TrackElemType::RightEighthBankToDiagDown25 - 233281, // TrackElemType::LeftEighthBankToOrthogonalUp25 - 233281, // TrackElemType::RightEighthBankToOrthogonalUp25 - 233281, // TrackElemType::LeftEighthBankToOrthogonalDown25 - 233281, // TrackElemType::RightEighthBankToOrthogonalDown25 - 123456, // TrackElemType::DiagBrakes - 123456, // TrackElemType::DiagBlockBrakes - 109824, // TrackElemType::Down25Brakes - 123456, // TrackElemType::DiagBooster - 399690 , // TrackElemType::DiagFlatToUp60LongBase, - 399690, // TrackElemType::DiagUp60ToFlatLongBase, - 399690, // TrackElemType::DiagFlatToDown60LongBase, - 399690, // TrackElemType::DiagDown60ToFlatLongBase, - 458752, // TrackElemType::LeftEighthDiveLoopUpToOrthogonal - 458752, // TrackElemType::RightEighthDiveLoopUpToOrthogonal - 458752, // TrackElemType::LeftEighthDiveLoopDownToDiag - 458752, // TrackElemType::RightEighthDiveLoopDownToDiag - 109824, // TrackElemType::DiagDown25Brakes - }; - static_assert(std::size(kTrackPricing) == EnumValue(TrackElemType::Count)); - + 65536, // TrackElemType::flat + 98304, // TrackElemType::endStation + 98304, // TrackElemType::beginStation + 98304, // TrackElemType::middleStation + 79872, // TrackElemType::up25 + 114688, // TrackElemType::up60 + 73728, // TrackElemType::flatToUp25 + 96256, // TrackElemType::up25ToUp60 + 96256, // TrackElemType::up60ToUp25 + 73728, // TrackElemType::up25ToFlat + 79872, // TrackElemType::down25 + 114688, // TrackElemType::down60 + 73728, // TrackElemType::flatToDown25 + 96256, // TrackElemType::down25ToDown60 + 96256, // TrackElemType::down60ToDown25 + 73728, // TrackElemType::down25ToFlat + 257359, // TrackElemType::leftQuarterTurn5Tiles + 257359, // TrackElemType::rightQuarterTurn5Tiles + 69632, // TrackElemType::flatToLeftBank + 69632, // TrackElemType::flatToRightBank + 69632, // TrackElemType::leftBankToFlat + 69632, // TrackElemType::rightBankToFlat + 273443, // TrackElemType::bankedLeftQuarterTurn5Tiles + 273443, // TrackElemType::bankedRightQuarterTurn5Tiles + 78336, // TrackElemType::leftBankToUp25 + 78336, // TrackElemType::rightBankToUp25 + 78336, // TrackElemType::up25ToLeftBank + 78336, // TrackElemType::up25ToRightBank + 78336, // TrackElemType::leftBankToDown25 + 78336, // TrackElemType::rightBankToDown25 + 78336, // TrackElemType::down25ToLeftBank + 78336, // TrackElemType::down25ToRightBank + 69632, // TrackElemType::leftBank + 69632, // TrackElemType::rightBank + 313656, // TrackElemType::leftQuarterTurn5TilesUp25 + 313656, // TrackElemType::rightQuarterTurn5TilesUp25 + 313656, // TrackElemType::leftQuarterTurn5TilesDown25 + 313656, // TrackElemType::rightQuarterTurn5TilesDown25 + 229376, // TrackElemType::sBendLeft + 229376, // TrackElemType::sBendRight + 491520, // TrackElemType::leftVerticalLoop + 491520, // TrackElemType::rightVerticalLoop + 154415, // TrackElemType::leftQuarterTurn3Tiles + 154415, // TrackElemType::rightQuarterTurn3Tiles + 164065, // TrackElemType::leftBankedQuarterTurn3Tiles + 164065, // TrackElemType::rightBankedQuarterTurn3Tiles + 270226, // TrackElemType::leftQuarterTurn3TilesUp25 + 270226, // TrackElemType::rightQuarterTurn3TilesUp25 + 270226, // TrackElemType::leftQuarterTurn3TilesDown25 + 270226, // TrackElemType::rightQuarterTurn3TilesDown25 + 51471, // TrackElemType::leftQuarterTurn1Tile + 51471, // TrackElemType::rightQuarterTurn1Tile + 212992, // TrackElemType::leftTwistDownToUp + 212992, // TrackElemType::rightTwistDownToUp + 212992, // TrackElemType::leftTwistUpToDown + 212992, // TrackElemType::rightTwistUpToDown + 294912, // TrackElemType::halfLoopUp + 294912, // TrackElemType::halfLoopDown + 229376, // TrackElemType::leftCorkscrewUp + 229376, // TrackElemType::rightCorkscrewUp + 229376, // TrackElemType::leftCorkscrewDown + 229376, // TrackElemType::rightCorkscrewDown + 98304, // TrackElemType::flatToUp60 + 98304, // TrackElemType::up60ToFlat + 98304, // TrackElemType::flatToDown60 + 98304, // TrackElemType::down60ToFlat + 524288, // TrackElemType::towerBase + 65536, // TrackElemType::towerSection + 69632, // TrackElemType::flatCovered + 83968, // TrackElemType::up25Covered + 118784, // TrackElemType::up60Covered + 77824, // TrackElemType::flatToUp25Covered + 100352, // TrackElemType::up25ToUp60Covered + 100352, // TrackElemType::up60ToUp25Covered + 77824, // TrackElemType::up25ToFlatCovered + 83968, // TrackElemType::down25Covered + 118784, // TrackElemType::down60Covered + 77824, // TrackElemType::flatToDown25Covered + 100352, // TrackElemType::down25ToDown60Covered + 100352, // TrackElemType::down60ToDown25Covered + 77824, // TrackElemType::down25ToFlatCovered + 261455, // TrackElemType::leftQuarterTurn5TilesCovered + 261455, // TrackElemType::rightQuarterTurn5TilesCovered + 233472, // TrackElemType::sBendLeftCovered + 233472, // TrackElemType::sBendRightCovered + 158511, // TrackElemType::leftQuarterTurn3TilesCovered + 158511, // TrackElemType::rightQuarterTurn3TilesCovered + 328192, // TrackElemType::leftHalfBankedHelixUpSmall + 328192, // TrackElemType::rightHalfBankedHelixUpSmall + 328192, // TrackElemType::leftHalfBankedHelixDownSmall + 328192, // TrackElemType::rightHalfBankedHelixDownSmall + 547072, // TrackElemType::leftHalfBankedHelixUpLarge + 547072, // TrackElemType::rightHalfBankedHelixUpLarge + 547072, // TrackElemType::leftHalfBankedHelixDownLarge + 547072, // TrackElemType::rightHalfBankedHelixDownLarge + 126976, // TrackElemType::leftQuarterTurn1TileUp60 + 126976, // TrackElemType::rightQuarterTurn1TileUp60 + 126976, // TrackElemType::leftQuarterTurn1TileDown60 + 126976, // TrackElemType::rightQuarterTurn1TileDown60 + 90112, // TrackElemType::brakes + 77824, // TrackElemType::booster + 65536, // TrackElemType::maze + 273539, // TrackElemType::leftQuarterBankedHelixLargeUp + 273539, // TrackElemType::rightQuarterBankedHelixLargeUp + 273539, // TrackElemType::leftQuarterBankedHelixLargeDown + 273539, // TrackElemType::rightQuarterBankedHelixLargeDown + 273539, // TrackElemType::leftQuarterHelixLargeUp + 273539, // TrackElemType::rightQuarterHelixLargeUp + 273539, // TrackElemType::leftQuarterHelixLargeDown + 273539, // TrackElemType::rightQuarterHelixLargeDown + 83968, // TrackElemType::up25LeftBanked + 83968, // TrackElemType::up25RightBanked + 143360, // TrackElemType::waterfall + 118784, // TrackElemType::rapids + 196608, // TrackElemType::onRidePhoto + 83968, // TrackElemType::down25LeftBanked + 83968, // TrackElemType::down25RightBanked + 393216, // TrackElemType::watersplash + 376832, // TrackElemType::flatToUp60LongBase + 376832, // TrackElemType::up60ToFlatLongBase + 126976, // TrackElemType::whirlpool + 376832, // TrackElemType::down60ToFlatLongBase + 376832, // TrackElemType::flatToDown60LongBase + 643072, // TrackElemType::cableLiftHill + 491520, // TrackElemType::reverseFreefallSlope + 65536, // TrackElemType::reverseFreefallVertical + 69632, // TrackElemType::up90 + 69632, // TrackElemType::down90 + 114688, // TrackElemType::up60ToUp90 + 114688, // TrackElemType::down90ToDown60 + 114688, // TrackElemType::up90ToUp60 + 114688, // TrackElemType::down60ToDown90 + 147456, // TrackElemType::brakeForDrop + 180151, // TrackElemType::leftEighthToDiag + 180151, // TrackElemType::rightEighthToDiag + 180151, // TrackElemType::leftEighthToOrthogonal + 180151, // TrackElemType::rightEighthToOrthogonal + 190960, // TrackElemType::leftEighthBankToDiag + 190960, // TrackElemType::rightEighthBankToDiag + 190960, // TrackElemType::leftEighthBankToOrthogonal + 190960, // TrackElemType::rightEighthBankToOrthogonal + 92681, // TrackElemType::diagFlat + 111820, // TrackElemType::diagUp25 + 147456, // TrackElemType::diagUp60 + 102400, // TrackElemType::diagFlatToUp25 + 129024, // TrackElemType::diagUp25ToUp60 + 129024, // TrackElemType::diagUp60ToUp25 + 102400, // TrackElemType::diagUp25ToFlat + 111820, // TrackElemType::diagDown25 + 147456, // TrackElemType::diagDown60 + 102400, // TrackElemType::diagFlatToDown25 + 129024, // TrackElemType::diagDown25ToDown60 + 129024, // TrackElemType::diagDown60ToDown25 + 102400, // TrackElemType::diagDown25ToFlat + 107008, // TrackElemType::diagFlatToUp60 + 107008, // TrackElemType::diagUp60ToFlat + 107008, // TrackElemType::diagFlatToDown60 + 107008, // TrackElemType::diagDown60ToFlat + 96777, // TrackElemType::diagFlatToLeftBank + 96777, // TrackElemType::diagFlatToRightBank + 96777, // TrackElemType::diagLeftBankToFlat + 96777, // TrackElemType::diagRightBankToFlat + 106496, // TrackElemType::diagLeftBankToUp25 + 106496, // TrackElemType::diagRightBankToUp25 + 106496, // TrackElemType::diagUp25ToLeftBank + 106496, // TrackElemType::diagUp25ToRightBank + 106496, // TrackElemType::diagLeftBankToDown25 + 106496, // TrackElemType::diagRightBankToDown25 + 106496, // TrackElemType::diagDown25ToLeftBank + 106496, // TrackElemType::diagDown25ToRightBank + 96777, // TrackElemType::diagLeftBank + 96777, // TrackElemType::diagRightBank + 282624, // TrackElemType::logFlumeReverser + 217088, // TrackElemType::spinningTunnel + 221184, // TrackElemType::leftBarrelRollUpToDown + 221184, // TrackElemType::rightBarrelRollUpToDown + 221184, // TrackElemType::leftBarrelRollDownToUp + 221184, // TrackElemType::rightBarrelRollDownToUp + 270226, // TrackElemType::leftBankToLeftQuarterTurn3TilesUp25 + 270226, // TrackElemType::rightBankToRightQuarterTurn3TilesUp25 + 270226, // TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank + 270226, // TrackElemType::rightQuarterTurn3TilesDown25ToRightBank + 96384, // TrackElemType::poweredLift + 884736, // TrackElemType::leftLargeHalfLoopUp + 884736, // TrackElemType::rightLargeHalfLoopUp + 884736, // TrackElemType::leftLargeHalfLoopDown + 884736, // TrackElemType::rightLargeHalfLoopDown + 221184, // TrackElemType::leftFlyerTwistUp + 221184, // TrackElemType::rightFlyerTwistUp + 221184, // TrackElemType::leftFlyerTwistDown + 221184, // TrackElemType::rightFlyerTwistDown + 294912, // TrackElemType::flyerHalfLoopUninvertedUp + 294912, // TrackElemType::flyerHalfLoopInvertedDown + 229376, // TrackElemType::leftFlyerCorkscrewUp + 229376, // TrackElemType::rightFlyerCorkscrewUp + 229376, // TrackElemType::leftFlyerCorkscrewDown + 229376, // TrackElemType::rightFlyerCorkscrewDown + 294912, // TrackElemType::heartLineTransferUp + 294912, // TrackElemType::heartLineTransferDown + 417792, // TrackElemType::leftHeartLineRoll + 417792, // TrackElemType::rightHeartLineRoll + 159744, // TrackElemType::minigolfHoleA + 167936, // TrackElemType::minigolfHoleB + 172032, // TrackElemType::minigolfHoleC + 184320, // TrackElemType::minigolfHoleD + 184320, // TrackElemType::minigolfHoleE + 360448, // TrackElemType::multiDimInvertedFlatToDown90QuarterLoop + 360448, // TrackElemType::up90ToInvertedFlatQuarterLoop + 360448, // TrackElemType::invertedFlatToDown90QuarterLoop + 270226, // TrackElemType::leftCurvedLiftHill + 270226, // TrackElemType::rightCurvedLiftHill + 393216, // TrackElemType::leftReverser + 393216, // TrackElemType::rightReverser + 65536, // TrackElemType::airThrustTopCap + 65536, // TrackElemType::airThrustVerticalDown + 491520, // TrackElemType::airThrustVerticalDownToLevel + 94208, // TrackElemType::blockBrakes + 287115, // TrackElemType::leftBankedQuarterTurn3TileUp25 + 287115, // TrackElemType::rightBankedQuarterTurn3TileUp25 + 287115, // TrackElemType::leftBankedQuarterTurn3TileDown25 + 287115, // TrackElemType::rightBankedQuarterTurn3TileDown25 + 333259, // TrackElemType::leftBankedQuarterTurn5TileUp25 + 333259, // TrackElemType::rightBankedQuarterTurn5TileUp25 + 333259, // TrackElemType::leftBankedQuarterTurn5TileDown25 + 333259, // TrackElemType::rightBankedQuarterTurn5TileDown25 + 83968, // TrackElemType::up25ToLeftBankedUp25 + 83968, // TrackElemType::up25ToRightBankedUp25 + 83968, // TrackElemType::leftBankedUp25ToUp25 + 83968, // TrackElemType::rightBankedUp25ToUp25 + 83968, // TrackElemType::down25ToLeftBankedDown25 + 83968, // TrackElemType::down25ToRightBankedDown25 + 83968, // TrackElemType::leftBankedDown25ToDown25 + 83968, // TrackElemType::rightBankedDown25ToDown25 + 77824, // TrackElemType::leftBankedFlatToLeftBankedUp25 + 77824, // TrackElemType::rightBankedFlatToRightBankedUp25 + 77824, // TrackElemType::leftBankedUp25ToLeftBankedFlat + 77824, // TrackElemType::rightBankedUp25ToRightBankedFlat + 77824, // TrackElemType::leftBankedFlatToLeftBankedDown25 + 77824, // TrackElemType::rightBankedFlatToRightBankedDown25 + 77824, // TrackElemType::leftBankedDown25ToLeftBankedFlat + 77824, // TrackElemType::rightBankedDown25ToRightBankedFlat + 77824, // TrackElemType::flatToLeftBankedUp25 + 77824, // TrackElemType::flatToRightBankedUp25 + 77824, // TrackElemType::leftBankedUp25ToFlat + 77824, // TrackElemType::rightBankedUp25ToFlat + 77824, // TrackElemType::flatToLeftBankedDown25 + 77824, // TrackElemType::flatToRightBankedDown25 + 77824, // TrackElemType::leftBankedDown25ToFlat + 77824, // TrackElemType::rightBankedDown25ToFlat + 151552, // TrackElemType::leftQuarterTurn1TileUp90 + 151552, // TrackElemType::rightQuarterTurn1TileUp90 + 151552, // TrackElemType::leftQuarterTurn1TileDown90 + 151552, // TrackElemType::rightQuarterTurn1TileDown90 + 360448, // TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop + 360448, // TrackElemType::multiDimFlatToDown90QuarterLoop + 360448, // TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop + 77824, // TrackElemType::rotationControlToggle + 262144, // TrackElemType::flatTrack1x4A + 262144, // TrackElemType::flatTrack2x2 + 1048576,// TrackElemType::flatTrack4x4 + 524288, // TrackElemType::flatTrack2x4 + 327680, // TrackElemType::flatTrack1x5 + 65536, // TrackElemType::flatTrack1x1A + 262144, // TrackElemType::flatTrack1x4B + 65536, // TrackElemType::flatTrack1x1B + 262144, // TrackElemType::flatTrack1x4C + 524288, // TrackElemType::flatTrack3x3 + 360448, // TrackElemType::leftLargeCorkscrewUp + 360448, // TrackElemType::rightLargeCorkscrewUp + 360448, // TrackElemType::leftLargeCorkscrewDown + 360448, // TrackElemType::rightCorkscrewDown + 589824, // TrackElemType::leftMediumHalfLoopUp + 589824, // TrackElemType::rightMediumHalfLoopUp + 589824, // TrackElemType::leftMediumHalfLoopDown + 589824, // TrackElemType::rightMediumHalfLoopDown + 229376, // TrackElemType::leftZeroGRollUp + 229376, // TrackElemType::rightZeroGRollUp + 229376, // TrackElemType::leftZeroGRollDown + 229376, // TrackElemType::rightZeroGRollDown + 425984, // TrackElemType::leftLargeZeroGRollUp + 425984, // TrackElemType::rightLargeZeroGRollUp + 425984, // TrackElemType::leftLargeZeroGRollDown + 425984, // TrackElemType::rightLargeZeroGRollDown + 884736, // TrackElemType::leftFlyerLargeHalfLoopUninvertedUp + 884736, // TrackElemType::rightFlyerLargeHalfLoopUninvertedUp + 884736, // TrackElemType::leftFlyerLargeHalfLoopInvertedDown + 884736, // TrackElemType::rightFlyerLargeHalfLoopInvertedDown + 884736, // TrackElemType::leftFlyerLargeHalfLoopInvertedUp + 884736, // TrackElemType::rightFlyerLargeHalfLoopInvertedUp + 884736, // TrackElemType::leftFlyerLargeHalfLoopUninvertedDown + 884736, // TrackElemType::rightFlyerLargeHalfLoopUninvertedDown + 294912, // TrackElemType::flyerHalfLoopInvertedUp + 294912, // TrackElemType::flyerHalfLoopUninvertedDown + 219559, // TrackElemType::leftEighthToDiagUp25 + 219559, // TrackElemType::rightEighthToDiagUp25 + 219559, // TrackElemType::leftEighthToDiagDown25 + 219559, // TrackElemType::rightEighthToDiagDown25 + 219559, // TrackElemType::leftEighthToOrthogonalUp25 + 219559, // TrackElemType::rightEighthToOrthogonalUp25 + 219559, // TrackElemType::leftEighthToOrthogonalDown25 + 219559, // TrackElemType::rightEighthToOrthogonalDown25 + 118809, // TrackElemType::diagUp25ToLeftBankedUp25 + 118809, // TrackElemType::diagUp25ToRightBankedUp25 + 118809, // TrackElemType::diagLeftBankedUp25ToUp25 + 118809, // TrackElemType::diagRightBankedUp25ToUp25 + 118809, // TrackElemType::diagDown25ToLeftBankedDown25 + 118809, // TrackElemType::diagDown25ToRightBankedDown25 + 118809, // TrackElemType::diagLeftBankedDown25ToDown25 + 118809, // TrackElemType::diagRightBankedDown25ToDown25 + 108800, // TrackElemType::diagLeftBankedFlatToLeftBankedUp25 + 108800, // TrackElemType::diagRightBankedFlatToRightBankedUp25 + 108800, // TrackElemType::diagLeftBankedUp25ToLeftBankedFlat + 108800, // TrackElemType::diagRightBankedUp25ToRightBankedFlat + 108800, // TrackElemType::diagLeftBankedFlatToLeftBankedDown25 + 108800, // TrackElemType::diagRightBankedFlatToRightBankedDown25 + 108800, // TrackElemType::diagLeftBankedDown25ToLeftBankedFlat + 108800, // TrackElemType::diagRightBankedDown25ToRightBankedFlat + 108800, // TrackElemType::diagFlatToLeftBankedUp25 + 108800, // TrackElemType::diagFlatToRightBankedUp25 + 108800, // TrackElemType::diagLeftBankedUp25ToFlat + 108800, // TrackElemType::diagRightBankedUp25ToFlat + 108800, // TrackElemType::diagFlatToLeftBankedDown25 + 108800, // TrackElemType::diagFlatToRightBankedDown25 + 108800, // TrackElemType::diagLeftBankedDown25ToFlat + 108800, // TrackElemType::diagRightBankedDown25ToFlat + 118809, // TrackElemType::diagUp25LeftBanked + 118809, // TrackElemType::diagUp25RightBanked + 118809, // TrackElemType::diagDown25LeftBanked + 118809, // TrackElemType::diagDown25RightBanked + 233281, // TrackElemType::leftEighthBankToDiagUp25 + 233281, // TrackElemType::rightEighthBankToDiagUp25 + 233281, // TrackElemType::leftEighthBankToDiagDown25 + 233281, // TrackElemType::rightEighthBankToDiagDown25 + 233281, // TrackElemType::leftEighthBankToOrthogonalUp25 + 233281, // TrackElemType::rightEighthBankToOrthogonalUp25 + 233281, // TrackElemType::leftEighthBankToOrthogonalDown25 + 233281, // TrackElemType::rightEighthBankToOrthogonalDown25 + 123456, // TrackElemType::diagBrakes + 123456, // TrackElemType::diagBlockBrakes + 109824, // TrackElemType::down25Brakes + 123456, // TrackElemType::diagBooster + 399690 , // TrackElemType::diagFlatToUp60LongBase, + 399690, // TrackElemType::diagUp60ToFlatLongBase, + 399690, // TrackElemType::diagFlatToDown60LongBase, + 399690, // TrackElemType::diagDown60ToFlatLongBase, + 458752, // TrackElemType::leftEighthDiveLoopUpToOrthogonal + 458752, // TrackElemType::rightEighthDiveLoopUpToOrthogonal + 458752, // TrackElemType::leftEighthDiveLoopDownToDiag + 458752, // TrackElemType::rightEighthDiveLoopDownToDiag + 109824, // TrackElemType::diagDown25Brakes + }; + static_assert(std::size(kTrackPricing) == EnumValue(TrackElemType::count)); + /** rct2: 0x0099EA1C */ static constexpr OpenRCT2::TrackElemType kTrackElementMirrorMap[] = { - TrackElemType::Flat, - TrackElemType::EndStation, - TrackElemType::BeginStation, - TrackElemType::MiddleStation, - TrackElemType::Up25, - TrackElemType::Up60, - TrackElemType::FlatToUp25, - TrackElemType::Up25ToUp60, - TrackElemType::Up60ToUp25, - TrackElemType::Up25ToFlat, - TrackElemType::Down25, - TrackElemType::Down60, - TrackElemType::FlatToDown25, - TrackElemType::Down25ToDown60, - TrackElemType::Down60ToDown25, - TrackElemType::Down25ToFlat, - TrackElemType::RightQuarterTurn5Tiles, // TrackElemType::LeftQuarterTurn5Tiles - TrackElemType::LeftQuarterTurn5Tiles, // TrackElemType::RightQuarterTurn5Tiles - TrackElemType::FlatToRightBank, // TrackElemType::FlatToLeftBank - TrackElemType::FlatToLeftBank, // TrackElemType::FlatToRightBank - TrackElemType::RightBankToFlat, // TrackElemType::LeftBankToFlat - TrackElemType::LeftBankToFlat, // TrackElemType::RightBankToFlat - TrackElemType::BankedRightQuarterTurn5Tiles, // TrackElemType::BankedLeftQuarterTurn5Tiles - TrackElemType::BankedLeftQuarterTurn5Tiles, // TrackElemType::BankedRightQuarterTurn5Tiles - TrackElemType::RightBankToUp25, // TrackElemType::LeftBankToUp25 - TrackElemType::LeftBankToUp25, // TrackElemType::RightBankToUp25 - TrackElemType::Up25ToRightBank, // TrackElemType::Up25ToLeftBank - TrackElemType::Up25ToLeftBank, // TrackElemType::Up25ToRightBank - TrackElemType::RightBankToDown25, // TrackElemType::LeftBankToDown25 - TrackElemType::LeftBankToDown25, // TrackElemType::RightBankToDown25 - TrackElemType::Down25ToRightBank, // TrackElemType::Down25ToLeftBank - TrackElemType::Down25ToLeftBank, // TrackElemType::Down25ToRightBank - TrackElemType::RightBank, // TrackElemType::LeftBank - TrackElemType::LeftBank, // TrackElemType::RightBank - TrackElemType::RightQuarterTurn5TilesUp25, // TrackElemType::LeftQuarterTurn5TilesUp25 - TrackElemType::LeftQuarterTurn5TilesUp25, // TrackElemType::RightQuarterTurn5TilesUp25 - TrackElemType::RightQuarterTurn5TilesDown25, // TrackElemType::LeftQuarterTurn5TilesDown25 - TrackElemType::LeftQuarterTurn5TilesDown25, // TrackElemType::RightQuarterTurn5TilesDown25 - TrackElemType::SBendRight, // TrackElemType::SBendLeft - TrackElemType::SBendLeft, // TrackElemType::SBendRight - TrackElemType::RightVerticalLoop, // TrackElemType::LeftVerticalLoop - TrackElemType::LeftVerticalLoop, // TrackElemType::RightVerticalLoop - TrackElemType::RightQuarterTurn3Tiles, // TrackElemType::LeftQuarterTurn3Tiles - TrackElemType::LeftQuarterTurn3Tiles, // TrackElemType::RightQuarterTurn3Tiles - TrackElemType::RightBankedQuarterTurn3Tiles, // TrackElemType::LeftBankedQuarterTurn3Tiles - TrackElemType::LeftBankedQuarterTurn3Tiles, // TrackElemType::RightBankedQuarterTurn3Tiles - TrackElemType::RightQuarterTurn3TilesUp25, // TrackElemType::LeftQuarterTurn3TilesUp25 - TrackElemType::LeftQuarterTurn3TilesUp25, // TrackElemType::RightQuarterTurn3TilesUp25 - TrackElemType::RightQuarterTurn3TilesDown25, // TrackElemType::LeftQuarterTurn3TilesDown25 - TrackElemType::LeftQuarterTurn3TilesDown25, // TrackElemType::RightQuarterTurn3TilesDown25 - TrackElemType::RightQuarterTurn1Tile, // TrackElemType::LeftQuarterTurn1Tile - TrackElemType::LeftQuarterTurn1Tile, // TrackElemType::RightQuarterTurn1Tile - TrackElemType::RightTwistDownToUp, // TrackElemType::LeftTwistDownToUp - TrackElemType::LeftTwistDownToUp, // TrackElemType::RightTwistDownToUp - TrackElemType::RightTwistUpToDown, // TrackElemType::LeftTwistUpToDown - TrackElemType::LeftTwistUpToDown, // TrackElemType::RightTwistUpToDown - TrackElemType::HalfLoopUp, - TrackElemType::HalfLoopDown, - TrackElemType::RightCorkscrewUp, // TrackElemType::LeftCorkscrewUp - TrackElemType::LeftCorkscrewUp, // TrackElemType::RightCorkscrewUp - TrackElemType::RightCorkscrewDown, // TrackElemType::LeftCorkscrewDown - TrackElemType::LeftCorkscrewDown, // TrackElemType::RightCorkscrewDown - TrackElemType::FlatToUp60, - TrackElemType::Up60ToFlat, - TrackElemType::FlatToDown60, - TrackElemType::Down60ToFlat, - TrackElemType::TowerBase, - TrackElemType::TowerSection, - TrackElemType::FlatCovered, - TrackElemType::Up25Covered, - TrackElemType::Up60Covered, - TrackElemType::FlatToUp25Covered, - TrackElemType::Up25ToUp60Covered, - TrackElemType::Up60ToUp25Covered, - TrackElemType::Up25ToFlatCovered, - TrackElemType::Down25Covered, - TrackElemType::Down60Covered, - TrackElemType::FlatToDown25Covered, - TrackElemType::Down25ToDown60Covered, - TrackElemType::Down60ToDown25Covered, - TrackElemType::Down25ToFlatCovered, - TrackElemType::RightQuarterTurn5TilesCovered, // TrackElemType::LeftQuarterTurn5TilesCovered - TrackElemType::LeftQuarterTurn5TilesCovered, // TrackElemType::RightQuarterTurn5TilesCovered - TrackElemType::SBendRightCovered, // TrackElemType::SBendLeftCovered - TrackElemType::SBendLeftCovered, // TrackElemType::SBendRightCovered - TrackElemType::RightQuarterTurn3TilesCovered, // TrackElemType::LeftQuarterTurn3TilesCovered - TrackElemType::LeftQuarterTurn3TilesCovered, // TrackElemType::RightQuarterTurn3TilesCovered - TrackElemType::RightHalfBankedHelixUpSmall, // TrackElemType::LeftHalfBankedHelixUpSmall - TrackElemType::LeftHalfBankedHelixUpSmall, // TrackElemType::RightHalfBankedHelixUpSmall - TrackElemType::RightHalfBankedHelixDownSmall, // TrackElemType::LeftHalfBankedHelixDownSmall - TrackElemType::LeftHalfBankedHelixDownSmall, // TrackElemType::RightHalfBankedHelixDownSmall - TrackElemType::RightHalfBankedHelixUpLarge, // TrackElemType::LeftHalfBankedHelixUpLarge - TrackElemType::LeftHalfBankedHelixUpLarge, // TrackElemType::RightHalfBankedHelixUpLarge - TrackElemType::RightHalfBankedHelixDownLarge, // TrackElemType::LeftHalfBankedHelixDownLarge - TrackElemType::LeftHalfBankedHelixDownLarge, // TrackElemType::RightHalfBankedHelixDownLarge - TrackElemType::RightQuarterTurn1TileUp60, // TrackElemType::LeftQuarterTurn1TileUp60 - TrackElemType::LeftQuarterTurn1TileUp60, // TrackElemType::RightQuarterTurn1TileUp60 - TrackElemType::RightQuarterTurn1TileDown60, // TrackElemType::LeftQuarterTurn1TileDown60 - TrackElemType::LeftQuarterTurn1TileDown60, // TrackElemType::RightQuarterTurn1TileDown60 - TrackElemType::Brakes, - TrackElemType::Booster, - TrackElemType::Maze, - TrackElemType::RightQuarterBankedHelixLargeUp, // TrackElemType::LeftQuarterBankedHelixLargeUp - TrackElemType::LeftQuarterBankedHelixLargeUp, // TrackElemType::RightQuarterBankedHelixLargeUp - TrackElemType::RightQuarterBankedHelixLargeDown, // TrackElemType::LeftQuarterBankedHelixLargeDown - TrackElemType::LeftQuarterBankedHelixLargeDown, // TrackElemType::RightQuarterBankedHelixLargeDown - TrackElemType::RightQuarterHelixLargeUp, // TrackElemType::LeftQuarterHelixLargeUp - TrackElemType::LeftQuarterHelixLargeUp, // TrackElemType::RightQuarterHelixLargeUp - TrackElemType::RightQuarterHelixLargeDown, // TrackElemType::LeftQuarterHelixLargeDown - TrackElemType::LeftQuarterHelixLargeDown, // TrackElemType::RightQuarterHelixLargeDown - TrackElemType::Up25RightBanked, // TrackElemType::Up25LeftBanked - TrackElemType::Up25LeftBanked, // TrackElemType::Up25RightBanked - TrackElemType::Waterfall, - TrackElemType::Rapids, - TrackElemType::OnRidePhoto, - TrackElemType::Down25RightBanked, // TrackElemType::Down25LeftBanked - TrackElemType::Down25LeftBanked, // TrackElemType::Down25RightBanked - TrackElemType::Watersplash, - TrackElemType::FlatToUp60LongBase, - TrackElemType::Up60ToFlatLongBase, - TrackElemType::Whirlpool, - TrackElemType::Down60ToFlatLongBase, - TrackElemType::FlatToDown60LongBase, - TrackElemType::CableLiftHill, - TrackElemType::ReverseFreefallSlope, - TrackElemType::ReverseFreefallVertical, - TrackElemType::Up90, - TrackElemType::Down90, - TrackElemType::Up60ToUp90, - TrackElemType::Down90ToDown60, - TrackElemType::Up90ToUp60, - TrackElemType::Down60ToDown90, - TrackElemType::BrakeForDrop, - TrackElemType::RightEighthToDiag, // TrackElemType::LeftEighthToDiag - TrackElemType::LeftEighthToDiag, // TrackElemType::RightEighthToDiag - TrackElemType::RightEighthToOrthogonal, // TrackElemType::LeftEighthToOrthogonal - TrackElemType::LeftEighthToOrthogonal, // TrackElemType::RightEighthToOrthogonal - TrackElemType::RightEighthBankToDiag, // TrackElemType::LeftEighthBankToDiag - TrackElemType::LeftEighthBankToDiag, // TrackElemType::RightEighthBankToDiag - TrackElemType::RightEighthBankToOrthogonal, // TrackElemType::LeftEighthBankToOrthogonal - TrackElemType::LeftEighthBankToOrthogonal, // TrackElemType::RightEighthBankToOrthogonal - TrackElemType::DiagFlat, - TrackElemType::DiagUp25, - TrackElemType::DiagUp60, - TrackElemType::DiagFlatToUp25, - TrackElemType::DiagUp25ToUp60, - TrackElemType::DiagUp60ToUp25, - TrackElemType::DiagUp25ToFlat, - TrackElemType::DiagDown25, - TrackElemType::DiagDown60, - TrackElemType::DiagFlatToDown25, - TrackElemType::DiagDown25ToDown60, - TrackElemType::DiagDown60ToDown25, - TrackElemType::DiagDown25ToFlat, - TrackElemType::DiagFlatToUp60, - TrackElemType::DiagUp60ToFlat, - TrackElemType::DiagFlatToDown60, - TrackElemType::DiagDown60ToFlat, - TrackElemType::DiagFlatToRightBank, // TrackElemType::DiagFlatToLeftBank - TrackElemType::DiagFlatToLeftBank, // TrackElemType::DiagFlatToRightBank - TrackElemType::DiagRightBankToFlat, // TrackElemType::DiagLeftBankToFlat - TrackElemType::DiagLeftBankToFlat, // TrackElemType::DiagRightBankToFlat - TrackElemType::DiagRightBankToUp25, // TrackElemType::DiagLeftBankToUp25 - TrackElemType::DiagLeftBankToUp25, // TrackElemType::DiagRightBankToUp25 - TrackElemType::DiagUp25ToRightBank, // TrackElemType::DiagUp25ToLeftBank - TrackElemType::DiagUp25ToLeftBank, // TrackElemType::DiagUp25ToRightBank - TrackElemType::DiagRightBankToDown25, // TrackElemType::DiagLeftBankToDown25 - TrackElemType::DiagLeftBankToDown25, // TrackElemType::DiagRightBankToDown25 - TrackElemType::DiagDown25ToRightBank, // TrackElemType::DiagDown25ToLeftBank - TrackElemType::DiagDown25ToLeftBank, // TrackElemType::DiagDown25ToRightBank - TrackElemType::DiagRightBank, // TrackElemType::DiagLeftBank - TrackElemType::DiagLeftBank, // TrackElemType::DiagRightBank - TrackElemType::LogFlumeReverser, - TrackElemType::SpinningTunnel, - TrackElemType::RightBarrelRollUpToDown, // TrackElemType::LeftBarrelRollUpToDown - TrackElemType::LeftBarrelRollUpToDown, // TrackElemType::RightBarrelRollUpToDown - TrackElemType::RightBarrelRollDownToUp, // TrackElemType::LeftBarrelRollDownToUp - TrackElemType::LeftBarrelRollDownToUp, // TrackElemType::RightBarrelRollDownToUp - TrackElemType::RightBankToRightQuarterTurn3TilesUp25, // TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25 - TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25, // TrackElemType::RightBankToRightQuarterTurn3TilesUp25 - TrackElemType::RightQuarterTurn3TilesDown25ToRightBank, // TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank - TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank, // TrackElemType::RightQuarterTurn3TilesDown25ToRightBank - TrackElemType::PoweredLift, - TrackElemType::RightLargeHalfLoopUp, // TrackElemType::LeftLargeHalfLoopUp - TrackElemType::LeftLargeHalfLoopUp, // TrackElemType::RightLargeHalfLoopUp - TrackElemType::RightLargeHalfLoopDown, // TrackElemType::LeftLargeHalfLoopDown - TrackElemType::LeftLargeHalfLoopDown, // TrackElemType::RightLargeHalfLoopDown - TrackElemType::RightFlyerTwistUp, // TrackElemType::LeftFlyerTwistUp - TrackElemType::LeftFlyerTwistUp, // TrackElemType::RightFlyerTwistUp - TrackElemType::RightFlyerTwistDown, // TrackElemType::LeftFlyerTwistDown - TrackElemType::LeftFlyerTwistDown, // TrackElemType::RightFlyerTwistDown - TrackElemType::FlyerHalfLoopUninvertedUp, - TrackElemType::FlyerHalfLoopInvertedDown, - TrackElemType::RightFlyerCorkscrewUp, // TrackElemType::LeftFlyerCorkscrewUp - TrackElemType::LeftFlyerCorkscrewUp, // TrackElemType::RightFlyerCorkscrewUp - TrackElemType::RightFlyerCorkscrewDown, // TrackElemType::LeftFlyerCorkscrewDown - TrackElemType::LeftFlyerCorkscrewDown, // TrackElemType::RightFlyerCorkscrewDown - TrackElemType::HeartLineTransferUp, - TrackElemType::HeartLineTransferDown, - TrackElemType::RightHeartLineRoll, // TrackElemType::LeftHeartLineRoll - TrackElemType::LeftHeartLineRoll, // TrackElemType::RightHeartLineRoll - TrackElemType::MinigolfHoleA, - TrackElemType::MinigolfHoleB, - TrackElemType::MinigolfHoleC, - TrackElemType::MinigolfHoleE, // TrackElemType::MinigolfHoleD - TrackElemType::MinigolfHoleD, // TrackElemType::MinigolfHoleE - TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop, - TrackElemType::Up90ToInvertedFlatQuarterLoop, - TrackElemType::InvertedFlatToDown90QuarterLoop, - TrackElemType::RightCurvedLiftHill, // TrackElemType::LeftCurvedLiftHill - TrackElemType::LeftCurvedLiftHill, // TrackElemType::RightCurvedLiftHill - TrackElemType::RightReverser, // TrackElemType::LeftReverser - TrackElemType::LeftReverser, // TrackElemType::RightReverser - TrackElemType::AirThrustTopCap, - TrackElemType::AirThrustVerticalDown, - TrackElemType::AirThrustVerticalDownToLevel, - TrackElemType::BlockBrakes, - TrackElemType::RightBankedQuarterTurn3TileUp25, // TrackElemType::LeftBankedQuarterTurn3TileUp25 - TrackElemType::LeftBankedQuarterTurn3TileUp25, // TrackElemType::RightBankedQuarterTurn3TileUp25 - TrackElemType::RightBankedQuarterTurn3TileDown25, // TrackElemType::LeftBankedQuarterTurn3TileDown25 - TrackElemType::LeftBankedQuarterTurn3TileDown25, // TrackElemType::RightBankedQuarterTurn3TileDown25 - TrackElemType::RightBankedQuarterTurn5TileUp25, // TrackElemType::LeftBankedQuarterTurn5TileUp25 - TrackElemType::LeftBankedQuarterTurn5TileUp25, // TrackElemType::RightBankedQuarterTurn5TileUp25 - TrackElemType::RightBankedQuarterTurn5TileDown25, // TrackElemType::LeftBankedQuarterTurn5TileDown25 - TrackElemType::LeftBankedQuarterTurn5TileDown25, // TrackElemType::RightBankedQuarterTurn5TileDown25 - TrackElemType::Up25ToRightBankedUp25, // TrackElemType::Up25ToLeftBankedUp25 - TrackElemType::Up25ToLeftBankedUp25, // TrackElemType::Up25ToRightBankedUp25 - TrackElemType::RightBankedUp25ToUp25, // TrackElemType::LeftBankedUp25ToUp25 - TrackElemType::LeftBankedUp25ToUp25, // TrackElemType::RightBankedUp25ToUp25 - TrackElemType::Down25ToRightBankedDown25, // TrackElemType::Down25ToLeftBankedDown25 - TrackElemType::Down25ToLeftBankedDown25, // TrackElemType::Down25ToRightBankedDown25 - TrackElemType::RightBankedDown25ToDown25, // TrackElemType::LeftBankedDown25ToDown25 - TrackElemType::LeftBankedDown25ToDown25, // TrackElemType::RightBankedDown25ToDown25 - TrackElemType::RightBankedFlatToRightBankedUp25, // TrackElemType::LeftBankedFlatToLeftBankedUp25 - TrackElemType::LeftBankedFlatToLeftBankedUp25, // TrackElemType::RightBankedFlatToRightBankedUp25 - TrackElemType::RightBankedUp25ToRightBankedFlat, // TrackElemType::LeftBankedUp25ToLeftBankedFlat - TrackElemType::LeftBankedUp25ToLeftBankedFlat, // TrackElemType::RightBankedUp25ToRightBankedFlat - TrackElemType::RightBankedFlatToRightBankedDown25, // TrackElemType::LeftBankedFlatToLeftBankedDown25 - TrackElemType::LeftBankedFlatToLeftBankedDown25, // TrackElemType::RightBankedFlatToRightBankedDown25 - TrackElemType::RightBankedDown25ToRightBankedFlat, // TrackElemType::LeftBankedDown25ToLeftBankedFlat - TrackElemType::LeftBankedDown25ToLeftBankedFlat, // TrackElemType::RightBankedDown25ToRightBankedFlat - TrackElemType::FlatToRightBankedUp25, // TrackElemType::FlatToLeftBankedUp25 - TrackElemType::FlatToLeftBankedUp25, // TrackElemType::FlatToRightBankedUp25 - TrackElemType::RightBankedUp25ToFlat, // TrackElemType::LeftBankedUp25ToFlat - TrackElemType::LeftBankedUp25ToFlat, // TrackElemType::RightBankedUp25ToFlat - TrackElemType::FlatToRightBankedDown25, // TrackElemType::FlatToLeftBankedDown25 - TrackElemType::FlatToLeftBankedDown25, // TrackElemType::FlatToRightBankedDown25 - TrackElemType::RightBankedDown25ToFlat, // TrackElemType::LeftBankedDown25ToFlat - TrackElemType::LeftBankedDown25ToFlat, // TrackElemType::RightBankedDown25ToFlat - TrackElemType::RightQuarterTurn1TileUp90, // TrackElemType::LeftQuarterTurn1TileUp90 - TrackElemType::LeftQuarterTurn1TileUp90, // TrackElemType::RightQuarterTurn1TileUp90 - TrackElemType::RightQuarterTurn1TileDown90, // TrackElemType::LeftQuarterTurn1TileDown90 - TrackElemType::LeftQuarterTurn1TileDown90, // TrackElemType::RightQuarterTurn1TileDown90 - TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop, - TrackElemType::MultiDimFlatToDown90QuarterLoop, - TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop, - TrackElemType::RotationControlToggle, - TrackElemType::FlatTrack1x4A, // TrackElemType::FlatTrack1x4A - TrackElemType::FlatTrack2x2, // TrackElemType::FlatTrack2x2 - TrackElemType::FlatTrack4x4, // TrackElemType::FlatTrack4x4 - TrackElemType::FlatTrack2x4, // TrackElemType::FlatTrack2x4 - TrackElemType::FlatTrack1x5, // TrackElemType::FlatTrack1x5 - TrackElemType::FlatTrack1x1A, // TrackElemType::FlatTrack1x1A - TrackElemType::FlatTrack1x4B, // TrackElemType::FlatTrack1x4B - TrackElemType::FlatTrack1x1B, // TrackElemType::FlatTrack1x1B - TrackElemType::FlatTrack1x4C, // TrackElemType::FlatTrack1x4C - TrackElemType::FlatTrack3x3, // TrackElemType::FlatTrack3x3 - TrackElemType::RightLargeCorkscrewUp, // TrackElemType::LeftLargeCorkscrewUp - TrackElemType::LeftLargeCorkscrewUp, // TrackElemType::RightLargeCorkscrewUp - TrackElemType::RightLargeCorkscrewDown, // TrackElemType::LeftLargeCorkscrewDown - TrackElemType::LeftLargeCorkscrewDown, // TrackElemType::RightLargeCorkscrewDown - TrackElemType::RightMediumHalfLoopUp, // TrackElemType::LeftMediumHalfLoopUp - TrackElemType::LeftMediumHalfLoopUp, // TrackElemType::RightMediumHalfLoopUp - TrackElemType::RightMediumHalfLoopDown, // TrackElemType::LeftMediumHalfLoopDown - TrackElemType::LeftMediumHalfLoopDown, // TrackElemType::RightMediumHalfLoopDown - TrackElemType::RightZeroGRollUp, // TrackElemType::LeftZeroGRollUp - TrackElemType::LeftZeroGRollUp, // TrackElemType::RightZeroGRollUp - TrackElemType::RightZeroGRollDown, // TrackElemType::LeftZeroGRollDown - TrackElemType::LeftZeroGRollDown, // TrackElemType::RightZeroGRollDown - TrackElemType::RightLargeZeroGRollUp, // TrackElemType::LeftLargeZeroGRollUp - TrackElemType::LeftLargeZeroGRollUp, // TrackElemType::RightLargeZeroGRollUp - TrackElemType::RightLargeZeroGRollDown, // TrackElemType::LeftLargeZeroGRollDown - TrackElemType::LeftLargeZeroGRollDown, // TrackElemType::RightLargeZeroGRollDown - TrackElemType::RightFlyerLargeHalfLoopUninvertedUp, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp - TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp, // TrackElemType::RightFlyerLargeHalfLoopUninvertedUp - TrackElemType::RightFlyerLargeHalfLoopInvertedDown, // TrackElemType::LeftFlyerLargeHalfLoopInvertedDown - TrackElemType::LeftFlyerLargeHalfLoopInvertedDown, // TrackElemType::RightFlyerLargeHalfLoopInvertedDown - TrackElemType::RightFlyerLargeHalfLoopInvertedUp, // TrackElemType::LeftFlyerLargeHalfLoopInvertedUp - TrackElemType::LeftFlyerLargeHalfLoopInvertedUp, // TrackElemType::RightFlyerLargeHalfLoopInvertedUp - TrackElemType::RightFlyerLargeHalfLoopUninvertedDown, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown - TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown, // TrackElemType::RightFlyerLargeHalfLoopUninvertedDown - TrackElemType::FlyerHalfLoopInvertedUp, - TrackElemType::FlyerHalfLoopUninvertedDown, - TrackElemType::RightEighthToDiagUp25, // TrackElemType::LeftEighthToDiagUp25 - TrackElemType::LeftEighthToDiagUp25, // TrackElemType::RightEighthToDiagUp25 - TrackElemType::RightEighthToDiagDown25, // TrackElemType::LeftEighthToDiagDown25 - TrackElemType::LeftEighthToDiagDown25, // TrackElemType::RightEighthToDiagDown25 - TrackElemType::RightEighthToOrthogonalUp25, // TrackElemType::LeftEighthToOrthogonalUp25 - TrackElemType::LeftEighthToOrthogonalUp25, // TrackElemType::RightEighthToOrthogonalUp25 - TrackElemType::RightEighthToOrthogonalDown25, // TrackElemType::LeftEighthToOrthogonalDown25 - TrackElemType::LeftEighthToOrthogonalDown25, // TrackElemType::RightEighthToOrthogonalDown25 - TrackElemType::DiagUp25ToRightBankedUp25, // TrackElemType::DiagUp25ToRightBankedUp25 - TrackElemType::DiagUp25ToLeftBankedUp25, // TrackElemType::DiagUp25ToLeftBankedUp25 - TrackElemType::DiagRightBankedUp25ToUp25, // TrackElemType::DiagRightBankedUp25ToUp25 - TrackElemType::DiagLeftBankedUp25ToUp25, // TrackElemType::DiagLeftBankedUp25ToUp25 - TrackElemType::DiagDown25ToRightBankedDown25, // TrackElemType::DiagDown25ToRightBankedDown25 - TrackElemType::DiagDown25ToLeftBankedDown25, // TrackElemType::DiagDown25ToLeftBankedDown25 - TrackElemType::DiagRightBankedDown25ToDown25, // TrackElemType::DiagRightBankedDown25ToDown25 - TrackElemType::DiagLeftBankedDown25ToDown25, // TrackElemType::DiagLeftBankedDown25ToDown25 - TrackElemType::DiagRightBankedFlatToRightBankedUp25, // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - TrackElemType::DiagLeftBankedFlatToLeftBankedUp25, // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - TrackElemType::DiagRightBankedUp25ToRightBankedFlat, // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat, // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - TrackElemType::DiagRightBankedFlatToRightBankedDown25,// TrackElemType::DiagRightBankedFlatToRightBankedDown25 - TrackElemType::DiagLeftBankedFlatToLeftBankedDown25, // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - TrackElemType::DiagRightBankedDown25ToRightBankedFlat,// TrackElemType::DiagRightBankedDown25ToRightBankedFlat - TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat, // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - TrackElemType::DiagFlatToRightBankedUp25, // TrackElemType::DiagFlatToRightBankedUp25 - TrackElemType::DiagFlatToLeftBankedUp25, // TrackElemType::DiagFlatToLeftBankedUp25 - TrackElemType::DiagRightBankedUp25ToFlat, // TrackElemType::DiagRightBankedUp25ToFlat - TrackElemType::DiagLeftBankedUp25ToFlat, // TrackElemType::DiagLeftBankedUp25ToFlat - TrackElemType::DiagFlatToRightBankedDown25, // TrackElemType::DiagFlatToRightBankedDown25 - TrackElemType::DiagFlatToLeftBankedDown25, // TrackElemType::DiagFlatToLeftBankedDown25 - TrackElemType::DiagRightBankedDown25ToFlat, // TrackElemType::DiagRightBankedDown25ToFlat - TrackElemType::DiagLeftBankedDown25ToFlat, // TrackElemType::DiagLeftBankedDown25ToFlat - TrackElemType::DiagUp25RightBanked, // TrackElemType::DiagUp25RightBanked - TrackElemType::DiagUp25LeftBanked, // TrackElemType::DiagUp25LeftBanked - TrackElemType::DiagDown25RightBanked, // TrackElemType::DiagDown25RightBanked - TrackElemType::DiagDown25LeftBanked, // TrackElemType::DiagDown25LeftBanked - TrackElemType::RightEighthBankToDiagUp25, // TrackElemType::RightEighthBankToDiagUp25 - TrackElemType::LeftEighthBankToDiagUp25, // TrackElemType::LeftEighthBankToDiagUp25 - TrackElemType::RightEighthBankToDiagDown25, // TrackElemType::RightEighthBankToDiagDown25 - TrackElemType::LeftEighthBankToDiagDown25, // TrackElemType::LeftEighthBankToDiagDown25 - TrackElemType::RightEighthBankToOrthogonalUp25, // TrackElemType::RightEighthBankToOrthogonalUp25 - TrackElemType::LeftEighthBankToOrthogonalUp25, // TrackElemType::LeftEighthBankToOrthogonalUp25 - TrackElemType::RightEighthBankToOrthogonalDown25, // TrackElemType::RightEighthBankToOrthogonalDown25 - TrackElemType::LeftEighthBankToOrthogonalDown25, // TrackElemType::LeftEighthBankToOrthogonalDown25 - TrackElemType::DiagBrakes, - TrackElemType::DiagBlockBrakes, - TrackElemType::Down25Brakes, - TrackElemType::DiagBooster, - TrackElemType::DiagFlatToUp60LongBase, // TrackElemType::DiagFlatToUp60LongBase, - TrackElemType::DiagUp60ToFlatLongBase, // TrackElemType::DiagUp60ToFlatLongBase, - TrackElemType::DiagFlatToDown60LongBase, // TrackElemType::DiagFlatToDown60LongBase, - TrackElemType::DiagDown60ToFlatLongBase, // TrackElemType::DiagDown60ToFlatLongBase, - TrackElemType::RightEighthDiveLoopUpToOrthogonal, // TrackElemType::LeftEighthDiveLoopUpToOrthogonal - TrackElemType::LeftEighthDiveLoopUpToOrthogonal, // TrackElemType::RightEighthDiveLoopUpToOrthogonal - TrackElemType::RightEighthDiveLoopDownToDiag, // TrackElemType::LeftEighthDiveLoopDownToDiag - TrackElemType::LeftEighthDiveLoopDownToDiag, // TrackElemType::RightEighthDiveLoopDownToDiag - TrackElemType::DiagDown25Brakes, - }; - static_assert(std::size(kTrackElementMirrorMap) == EnumValue(TrackElemType::Count)); - - /** rct2: 0x00999694 */ - static constexpr uint32_t kTrackHeightMarkerPositions[] = { - (1 << 0), // TrackElemType::Flat - (1 << 0), // TrackElemType::EndStation - (1 << 0), // TrackElemType::BeginStation - (1 << 0), // TrackElemType::MiddleStation - (1 << 0), // TrackElemType::Up25 - (1 << 0), // TrackElemType::Up60 - (1 << 0), // TrackElemType::FlatToUp25 - (1 << 0), // TrackElemType::Up25ToUp60 - (1 << 0), // TrackElemType::Up60ToUp25 - (1 << 0), // TrackElemType::Up25ToFlat - (1 << 0), // TrackElemType::Down25 - (1 << 0), // TrackElemType::Down60 - (1 << 0), // TrackElemType::FlatToDown25 - (1 << 0), // TrackElemType::Down25ToDown60 - (1 << 0), // TrackElemType::Down60ToDown25 - (1 << 0), // TrackElemType::Down25ToFlat - (1 << 0) | (1 << 6), // TrackElemType::LeftQuarterTurn5Tiles - (1 << 0) | (1 << 6), // TrackElemType::RightQuarterTurn5Tiles - (1 << 0), // TrackElemType::FlatToLeftBank - (1 << 0), // TrackElemType::FlatToRightBank - (1 << 0), // TrackElemType::LeftBankToFlat - (1 << 0), // TrackElemType::RightBankToFlat - (1 << 0) | (1 << 6), // TrackElemType::BankedLeftQuarterTurn5Tiles - (1 << 0) | (1 << 6), // TrackElemType::BankedRightQuarterTurn5Tiles - (1 << 0), // TrackElemType::LeftBankToUp25 - (1 << 0), // TrackElemType::RightBankToUp25 - (1 << 0), // TrackElemType::Up25ToLeftBank - (1 << 0), // TrackElemType::Up25ToRightBank - (1 << 0), // TrackElemType::LeftBankToDown25 - (1 << 0), // TrackElemType::RightBankToDown25 - (1 << 0), // TrackElemType::Down25ToLeftBank - (1 << 0), // TrackElemType::Down25ToRightBank - (1 << 0), // TrackElemType::LeftBank - (1 << 0), // TrackElemType::RightBank - (1 << 0) | (1 << 6), // TrackElemType::LeftQuarterTurn5TilesUp25 - (1 << 0) | (1 << 6), // TrackElemType::RightQuarterTurn5TilesUp25 - (1 << 0) | (1 << 6), // TrackElemType::LeftQuarterTurn5TilesDown25 - (1 << 0) | (1 << 6), // TrackElemType::RightQuarterTurn5TilesDown25 - (1 << 0) | (1 << 3), // TrackElemType::SBendLeft - (1 << 0) | (1 << 3), // TrackElemType::SBendRight - (1 << 0) | (1 << 9), // TrackElemType::LeftVerticalLoop - (1 << 0) | (1 << 9), // TrackElemType::RightVerticalLoop - (1 << 0) | (1 << 3), // TrackElemType::LeftQuarterTurn3Tiles - (1 << 0) | (1 << 3), // TrackElemType::RightQuarterTurn3Tiles - (1 << 0) | (1 << 3), // TrackElemType::LeftBankedQuarterTurn3Tiles - (1 << 0) | (1 << 3), // TrackElemType::RightBankedQuarterTurn3Tiles - (1 << 0) | (1 << 3), // TrackElemType::LeftQuarterTurn3TilesUp25 - (1 << 0) | (1 << 3), // TrackElemType::RightQuarterTurn3TilesUp25 - (1 << 0) | (1 << 3), // TrackElemType::LeftQuarterTurn3TilesDown25 - (1 << 0) | (1 << 3), // TrackElemType::RightQuarterTurn3TilesDown25 - (1 << 0), // TrackElemType::LeftQuarterTurn1Tile - (1 << 0), // TrackElemType::RightQuarterTurn1Tile - (1 << 0) | (1 << 2), // TrackElemType::LeftTwistDownToUp - (1 << 0) | (1 << 2), // TrackElemType::RightTwistDownToUp - (1 << 0) | (1 << 2), // TrackElemType::LeftTwistUpToDown - (1 << 0) | (1 << 2), // TrackElemType::RightTwistUpToDown - (1 << 0) | (1 << 3), // TrackElemType::HalfLoopUp - (1 << 0) | (1 << 3), // TrackElemType::HalfLoopDown - (1 << 0) | (1 << 2), // TrackElemType::LeftCorkscrewUp - (1 << 0) | (1 << 2), // TrackElemType::RightCorkscrewUp - (1 << 0) | (1 << 2), // TrackElemType::LeftCorkscrewDown - (1 << 0) | (1 << 2), // TrackElemType::RightCorkscrewDown - (1 << 0), // TrackElemType::FlatToUp60 - (1 << 0), // TrackElemType::Up60ToFlat - (1 << 0), // TrackElemType::FlatToDown60 - (1 << 0), // TrackElemType::Down60ToFlat - (1 << 1) | (1 << 3) | (1 << 6) | (1 << 7), // TrackElemType::TowerBase - (1 << 0), // TrackElemType::TowerSection - (1 << 0), // TrackElemType::FlatCovered - (1 << 0), // TrackElemType::Up25Covered - (1 << 0), // TrackElemType::Up60Covered - (1 << 0), // TrackElemType::FlatToUp25Covered - (1 << 0), // TrackElemType::Up25ToUp60Covered - (1 << 0), // TrackElemType::Up60ToUp25Covered - (1 << 0), // TrackElemType::Up25ToFlatCovered - (1 << 0), // TrackElemType::Down25Covered - (1 << 0), // TrackElemType::Down60Covered - (1 << 0), // TrackElemType::FlatToDown25Covered - (1 << 0), // TrackElemType::Down25ToDown60Covered - (1 << 0), // TrackElemType::Down60ToDown25Covered - (1 << 0), // TrackElemType::Down25ToFlatCovered - (1 << 0) | (1 << 6), // TrackElemType::LeftQuarterTurn5TilesCovered - (1 << 0) | (1 << 6), // TrackElemType::RightQuarterTurn5TilesCovered - (1 << 0) | (1 << 3), // TrackElemType::SBendLeftCovered - (1 << 0) | (1 << 3), // TrackElemType::SBendRightCovered - (1 << 0) | (1 << 3), // TrackElemType::LeftQuarterTurn3TilesCovered - (1 << 0) | (1 << 3), // TrackElemType::RightQuarterTurn3TilesCovered - (1 << 0) | (1 << 7), // TrackElemType::LeftHalfBankedHelixUpSmall - (1 << 0) | (1 << 7), // TrackElemType::RightHalfBankedHelixUpSmall - (1 << 0) | (1 << 7), // TrackElemType::LeftHalfBankedHelixDownSmall - (1 << 0) | (1 << 7), // TrackElemType::RightHalfBankedHelixDownSmall - (1 << 0) | (1 << 13), // TrackElemType::LeftHalfBankedHelixUpLarge - (1 << 0) | (1 << 13), // TrackElemType::RightHalfBankedHelixUpLarge - (1 << 0) | (1 << 13), // TrackElemType::LeftHalfBankedHelixDownLarge - (1 << 0) | (1 << 13), // TrackElemType::RightHalfBankedHelixDownLarge - (1 << 0), // TrackElemType::LeftQuarterTurn1TileUp60 - (1 << 0), // TrackElemType::RightQuarterTurn1TileUp60 - (1 << 0), // TrackElemType::LeftQuarterTurn1TileDown60 - (1 << 0), // TrackElemType::RightQuarterTurn1TileDown60 - (1 << 0), // TrackElemType::Brakes - (1 << 0), // TrackElemType::Booster - (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) | (1 << 13) | (1 << 14) | (1 << 15), // Maze - (1 << 0) | (1 << 6), // TrackElemType::LeftQuarterBankedHelixLargeUp - (1 << 0) | (1 << 6), // TrackElemType::RightQuarterBankedHelixLargeUp - (1 << 0) | (1 << 6), // TrackElemType::LeftQuarterBankedHelixLargeDown - (1 << 0) | (1 << 6), // TrackElemType::RightQuarterBankedHelixLargeDown - (1 << 0) | (1 << 6), // TrackElemType::LeftQuarterHelixLargeUp - (1 << 0) | (1 << 6), // TrackElemType::RightQuarterHelixLargeUp - (1 << 0) | (1 << 6), // TrackElemType::LeftQuarterHelixLargeDown - (1 << 0) | (1 << 6), // TrackElemType::RightQuarterHelixLargeDown - (1 << 0), // TrackElemType::Up25LeftBanked - (1 << 0) | (1 << 3) | (1 << 12) | (1 << 15), // TrackElemType::Up25RightBanked - (1 << 0), // TrackElemType::Waterfall - (1 << 0), // TrackElemType::Rapids - (1 << 0), // TrackElemType::OnRidePhoto - (1 << 0) | (1 << 7), // TrackElemType::Down25LeftBanked - (1 << 0), // TrackElemType::Down25RightBanked - (1 << 0) | (1 << 4), // TrackElemType::Watersplash - (1 << 0) | (1 << 3), // TrackElemType::FlatToUp60LongBase - (1 << 0) | (1 << 3), // TrackElemType::Up60ToFlatLongBase - (1 << 0), // TrackElemType::Whirlpool - (1 << 0) | (1 << 3), // TrackElemType::Down60ToFlatLongBase - (1 << 0) | (1 << 3), // TrackElemType::FlatToUp60LongBase - (1 << 0) | (1 << 3), // TrackElemType::CableLiftHill - (1 << 0) | (1 << 5), // TrackElemType::ReverseFreefallSlope - (1 << 0), // TrackElemType::ReverseFreefallVertical - (1 << 0), // TrackElemType::Up90 - (1 << 0), // TrackElemType::Down90 - (1 << 0), // TrackElemType::Up60ToUp90 - (1 << 0), // TrackElemType::Down90ToDown60 - (1 << 0), // TrackElemType::Up90ToUp60 - (1 << 0), // TrackElemType::Down60ToDown90 - (1 << 0), // TrackElemType::BrakeForDrop - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthToDiag - (1 << 0) | (1 << 4), // TrackElemType::RightEighthToDiag - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthToOrthogonal - (1 << 0) | (1 << 4), // TrackElemType::RightEighthToOrthogonal - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthBankToDiag - (1 << 0) | (1 << 4), // TrackElemType::RightEighthBankToDiag - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthBankToOrthogonal - (1 << 0) | (1 << 4), // TrackElemType::RightEighthBankToOrthogonal - (1 << 0), // TrackElemType::DiagFlat - (1 << 0), // TrackElemType::DiagUp25 - (1 << 0), // TrackElemType::DiagUp60 - (1 << 0), // TrackElemType::DiagFlatToUp25 - (1 << 0), // TrackElemType::DiagUp25ToUp60 - (1 << 0), // TrackElemType::DiagUp60ToUp25 - (1 << 0), // TrackElemType::DiagUp25ToFlat - (1 << 3), // TrackElemType::DiagDown25 - (1 << 3), // TrackElemType::DiagDown60 - (1 << 3), // TrackElemType::DiagFlatToDown25 - (1 << 3), // TrackElemType::DiagDown25ToDown60 - (1 << 3), // TrackElemType::DiagDown60ToDown25 - (1 << 3), // TrackElemType::DiagDown25ToFlat - (1 << 0), // TrackElemType::DiagFlatToUp60 - (1 << 0), // TrackElemType::DiagUp60ToFlat - (1 << 3), // TrackElemType::DiagFlatToDown60 - (1 << 3), // TrackElemType::DiagDown60ToFlat - (1 << 0), // TrackElemType::DiagFlatToLeftBank - (1 << 0), // TrackElemType::DiagFlatToRightBank - (1 << 0), // TrackElemType::DiagLeftBankToFlat - (1 << 0), // TrackElemType::DiagRightBankToFlat - (1 << 0), // TrackElemType::DiagLeftBankToUp25 - (1 << 0), // TrackElemType::DiagRightBankToUp25 - (1 << 0), // TrackElemType::DiagUp25ToLeftBank - (1 << 0), // TrackElemType::DiagUp25ToRightBank - (1 << 3), // TrackElemType::DiagLeftBankToDown25 - (1 << 3), // TrackElemType::DiagRightBankToDown25 - (1 << 3), // TrackElemType::DiagDown25ToLeftBank - (1 << 3), // TrackElemType::DiagDown25ToRightBank - (1 << 0), // TrackElemType::DiagLeftBank - (1 << 0), // TrackElemType::DiagRightBank - (1 << 0), // TrackElemType::LogFlumeReverser - (1 << 0), // TrackElemType::SpinningTunnel - (1 << 0) | (1 << 2), // TrackElemType::LeftBarrelRollUpToDown - (1 << 0) | (1 << 2), // TrackElemType::RightBarrelRollUpToDown - (1 << 0) | (1 << 2), // TrackElemType::LeftBarrelRollDownToUp - (1 << 0) | (1 << 2), // TrackElemType::RightBarrelRollDownToUp - (1 << 0) | (1 << 3), // TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25 - (1 << 0) | (1 << 3), // TrackElemType::RightBankToRightQuarterTurn3TilesUp25 - (1 << 0) | (1 << 3), // TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank - (1 << 0) | (1 << 3), // TrackElemType::RightQuarterTurn3TilesDown25ToRightBank - (1 << 0), // TrackElemType::PoweredLift - (1 << 0) | (1 << 6), // TrackElemType::LeftLargeHalfLoopUp - (1 << 0) | (1 << 6), // TrackElemType::RightLargeHalfLoopUp - (1 << 0) | (1 << 6), // TrackElemType::LeftLargeHalfLoopDown - (1 << 0) | (1 << 6), // TrackElemType::RightLargeHalfLoopDown - (1 << 0) | (1 << 2), // TrackElemType::LeftFlyerTwistUp - (1 << 0) | (1 << 2), // TrackElemType::RightFlyerTwistUp - (1 << 0) | (1 << 2), // TrackElemType::LeftFlyerTwistDown - (1 << 0) | (1 << 2), // TrackElemType::RightFlyerTwistDown - (1 << 0) | (1 << 3), // TrackElemType::FlyerHalfLoopUninvertedUp - (1 << 0) | (1 << 3), // TrackElemType::FlyerHalfLoopInvertedDown - (1 << 0) | (1 << 2), // TrackElemType::LeftFlyerCorkscrewUp - (1 << 0) | (1 << 2), // TrackElemType::RightFlyerCorkscrewUp - (1 << 0) | (1 << 2), // TrackElemType::LeftFlyerCorkscrewDown - (1 << 0) | (1 << 2), // TrackElemType::RightFlyerCorkscrewDown - (1 << 0) | (1 << 3), // TrackElemType::HeartLineTransferUp - (1 << 0) | (1 << 3), // TrackElemType::HeartLineTransferDown - (1 << 0) | (1 << 5), // TrackElemType::LeftHeartLineRoll - (1 << 0) | (1 << 5), // TrackElemType::RightHeartLineRoll - (1 << 0) | (1 << 1), // TrackElemType::MinigolfHoleA - (1 << 0) | (1 << 1), // TrackElemType::MinigolfHoleB - (1 << 0) | (1 << 1), // TrackElemType::MinigolfHoleC - (1 << 0) | (1 << 2), // TrackElemType::MinigolfHoleD - (1 << 0) | (1 << 2), // TrackElemType::MinigolfHoleE - (1 << 0) | (1 << 2), // TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop - (1 << 0) | (1 << 2), // TrackElemType::Up90ToInvertedFlatQuarterLoop - (1 << 0) | (1 << 2), // TrackElemType::InvertedFlatToDown90QuarterLoop - (1 << 0) | (1 << 3), // TrackElemType::LeftCurvedLiftHill - (1 << 0) | (1 << 3), // TrackElemType::RightCurvedLiftHill - (1 << 0) | (1 << 5), // TrackElemType::LeftReverser - (1 << 0) | (1 << 5), // TrackElemType::RightReverser - (1 << 0) | (1 << 3), // TrackElemType::AirThrustTopCap - (1 << 0), // TrackElemType::AirThrustVerticalDown - (1 << 0) | (1 << 5), // TrackElemType::AirThrustVerticalDownToLevel - (1 << 0), // TrackElemType::BlockBrakes - (1 << 0) | (1 << 3), // TrackElemType::LeftBankedQuarterTurn3TileUp25 - (1 << 0) | (1 << 3), // TrackElemType::RightBankedQuarterTurn3TileUp25 - (1 << 0) | (1 << 3), // TrackElemType::LeftBankedQuarterTurn3TileDown25 - (1 << 0) | (1 << 3), // TrackElemType::RightBankedQuarterTurn3TileDown25 - (1 << 0) | (1 << 6), // TrackElemType::LeftBankedQuarterTurn5TileUp25 - (1 << 0) | (1 << 6), // TrackElemType::RightBankedQuarterTurn5TileUp25 - (1 << 0) | (1 << 6), // TrackElemType::LeftBankedQuarterTurn5TileDown25 - (1 << 0) | (1 << 6), // TrackElemType::RightBankedQuarterTurn5TileDown25 - (1 << 0), // TrackElemType::Up25ToLeftBankedUp25 - (1 << 0), // TrackElemType::Up25ToRightBankedUp25 - (1 << 0), // TrackElemType::LeftBankedUp25ToUp25 - (1 << 0), // TrackElemType::RightBankedUp25ToUp25 - (1 << 0), // TrackElemType::Down25ToLeftBankedDown25 - (1 << 0), // TrackElemType::Down25ToRightBankedDown25 - (1 << 0), // TrackElemType::LeftBankedDown25ToDown25 - (1 << 0), // TrackElemType::RightBankedDown25ToDown25 - (1 << 0), // TrackElemType::LeftBankedFlatToLeftBankedUp25 - (1 << 0), // TrackElemType::RightBankedFlatToRightBankedUp25 - (1 << 0), // TrackElemType::LeftBankedUp25ToLeftBankedFlat - (1 << 0), // TrackElemType::RightBankedUp25ToRightBankedFlat - (1 << 0), // TrackElemType::LeftBankedFlatToLeftBankedDown25 - (1 << 0), // TrackElemType::RightBankedFlatToRightBankedDown25 - (1 << 0), // TrackElemType::LeftBankedDown25ToLeftBankedFlat - (1 << 0), // TrackElemType::RightBankedDown25ToRightBankedFlat - (1 << 0), // TrackElemType::FlatToLeftBankedUp25 - (1 << 0), // TrackElemType::FlatToRightBankedUp25 - (1 << 0), // TrackElemType::LeftBankedUp25ToFlat - (1 << 0), // TrackElemType::RightBankedUp25ToFlat - (1 << 0), // TrackElemType::FlatToLeftBankedDown25 - (1 << 0), // TrackElemType::FlatToRightBankedDown25 - (1 << 0), // TrackElemType::LeftBankedDown25ToFlat - (1 << 0), // TrackElemType::RightBankedDown25ToFlat - (1 << 0), // TrackElemType::LeftQuarterTurn1TileUp90 - (1 << 0), // TrackElemType::RightQuarterTurn1TileUp90 - (1 << 0), // TrackElemType::LeftQuarterTurn1TileDown90 - (1 << 0), // TrackElemType::RightQuarterTurn1TileDown90 - (1 << 0) | (1 << 2), // TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop - (1 << 0) | (1 << 2), // TrackElemType::MultiDimFlatToDown90QuarterLoop - (1 << 0) | (1 << 2), // TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop - (1 << 0), // TrackElemType::RotationControlToggle - (1 << 0), // TrackElemType::FlatTrack1x4A - (1 << 0), // TrackElemType::FlatTrack2x2 - (1 << 0), // TrackElemType::FlatTrack4x4 - (1 << 0), // TrackElemType::FlatTrack2x4 - (1 << 0), // TrackElemType::FlatTrack1x5 - (1 << 0), // TrackElemType::FlatTrack1x1A - (1 << 0), // TrackElemType::FlatTrack1x4B - (1 << 0), // TrackElemType::FlatTrack1x1B - (1 << 0), // TrackElemType::FlatTrack1x4C - (1 << 0), // TrackElemType::FlatTrack3x3 - (1 << 0) | (1 << 5), // TrackElemType::LeftLargeCorkscrewUp - (1 << 0) | (1 << 5), // TrackElemType::RightLargeCorkscrewUp - (1 << 0) | (1 << 5), // TrackElemType::LeftLargeCorkscrewDown - (1 << 0) | (1 << 5), // TrackElemType::RightLargeCorkscrewDown - (1 << 0) | (1 << 4), // TrackElemType::LeftMediumHalfLoopUp - (1 << 0) | (1 << 4), // TrackElemType::RightMediumHalfLoopUp - (1 << 0) | (1 << 4), // TrackElemType::LeftMediumHalfLoopDown - (1 << 0) | (1 << 4), // TrackElemType::RightMediumHalfLoopDown - (1 << 0) | (1 << 2), // TrackElemType::LeftZeroGRollUp - (1 << 0) | (1 << 2), // TrackElemType::RightZeroGRollUp - (1 << 0) | (1 << 2), // TrackElemType::LeftZeroGRollDown - (1 << 0) | (1 << 2), // TrackElemType::RightZeroGRollDown - (1 << 0) | (1 << 3), // TrackElemType::LeftLargeZeroGRollUp - (1 << 0) | (1 << 3), // TrackElemType::RightLargeZeroGRollUp - (1 << 0) | (1 << 3), // TrackElemType::LeftLargeZeroGRollDown - (1 << 0) | (1 << 3), // TrackElemType::RightLargeZeroGRollDown - (1 << 0) | (1 << 6), // TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp - (1 << 0) | (1 << 6), // TrackElemType::RightFlyerLargeHalfLoopUninvertedUp - (1 << 0) | (1 << 6), // TrackElemType::LeftFlyerLargeHalfLoopInvertedDown - (1 << 0) | (1 << 6), // TrackElemType::RightFlyerLargeHalfLoopInvertedDown - (1 << 0) | (1 << 6), // TrackElemType::LeftFlyerLargeHalfLoopInvertedUp - (1 << 0) | (1 << 6), // TrackElemType::RightFlyerLargeHalfLoopInvertedUp - (1 << 0) | (1 << 6), // TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown - (1 << 0) | (1 << 6), // TrackElemType::RightFlyerLargeHalfLoopUninvertedDown - (1 << 0) | (1 << 3), // TrackElemType::FlyerHalfLoopInvertedUp - (1 << 0) | (1 << 3), // TrackElemType::FlyerHalfLoopUninvertedDown - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthToDiagUp25 - (1 << 0) | (1 << 4), // TrackElemType::RightEighthToDiagUp25 - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthToDiagDown25 - (1 << 0) | (1 << 4), // TrackElemType::RightEighthToDiagDown25 - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthToOrthogonalUp25 - (1 << 0) | (1 << 4), // TrackElemType::RightEighthToOrthogonalUp25 - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthToOrthogonalDown25 - (1 << 0) | (1 << 4), // TrackElemType::RightEighthToOrthogonalDown25 - (1 << 0), // TrackElemType::DiagUp25ToRightBankedUp25 - (1 << 0), // TrackElemType::DiagUp25ToLeftBankedUp25 - (1 << 0), // TrackElemType::DiagRightBankedUp25ToUp25 - (1 << 0), // TrackElemType::DiagLeftBankedUp25ToUp25 - (1 << 0), // TrackElemType::DiagDown25ToRightBankedDown25 - (1 << 0), // TrackElemType::DiagDown25ToLeftBankedDown25 - (1 << 0), // TrackElemType::DiagRightBankedDown25ToDown25 - (1 << 0), // TrackElemType::DiagLeftBankedDown25ToDown25 - (1 << 0), // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - (1 << 0), // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - (1 << 0), // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - (1 << 0), // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - (1 << 0), // TrackElemType::DiagRightBankedFlatToRightBankedDown25 - (1 << 0), // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - (1 << 0), // TrackElemType::DiagRightBankedDown25ToRightBankedFlat - (1 << 0), // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - (1 << 0), // TrackElemType::DiagFlatToRightBankedUp25 - (1 << 0), // TrackElemType::DiagFlatToLeftBankedUp25 - (1 << 0), // TrackElemType::DiagRightBankedUp25ToFlat - (1 << 0), // TrackElemType::DiagLeftBankedUp25ToFlat - (1 << 0), // TrackElemType::DiagFlatToRightBankedDown25 - (1 << 0), // TrackElemType::DiagFlatToLeftBankedDown25 - (1 << 0), // TrackElemType::DiagRightBankedDown25ToFlat - (1 << 0), // TrackElemType::DiagLeftBankedDown25ToFlat - (1 << 0), // TrackElemType::DiagUp25RightBanked - (1 << 0), // TrackElemType::DiagUp25LeftBanked - (1 << 0), // TrackElemType::DiagDown25RightBanked - (1 << 0), // TrackElemType::DiagDown25LeftBanked - (1 << 0) | (1 << 4), // TrackElemType::RightEighthBankToDiagUp25 - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthBankToDiagUp25 - (1 << 0) | (1 << 4), // TrackElemType::RightEighthBankToDiagDown25 - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthBankToDiagDown25 - (1 << 0) | (1 << 4), // TrackElemType::RightEighthBankToOrthogonalUp25 - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthBankToOrthogonalUp25 - (1 << 0) | (1 << 4), // TrackElemType::RightEighthBankToOrthogonalDown25 - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthBankToOrthogonalDown25 - (1 << 0), // TrackElemType::DiagBrakes - (1 << 0), // TrackElemType::DiagBlockBrakes - (1 << 0), // TrackElemType::Down25Brakes - (1 << 0), // TrackElemType::DiagBooster - (1 << 0), // TrackElemType::DiagFlatToUp60LongBase, - (1 << 0), // TrackElemType::DiagUp60ToFlatLongBase, - (1 << 9), // TrackElemType::DiagFlatToDown60LongBase, - (1 << 9), // TrackElemType::DiagDown60ToFlatLongBase, - (1 << 0) | (1 << 5), // TrackElemType::LeftEighthDiveLoopUpToOrthogonal - (1 << 0) | (1 << 5), // TrackElemType::RightEighthDiveLoopUpToOrthogonal - (1 << 0) | (1 << 5), // TrackElemType::LeftEighthDiveLoopDownToDiag - (1 << 0) | (1 << 5), // TrackElemType::RightEighthDiveLoopDownToDiag - (1 << 3), // TrackElemType::DiagDown25Brakes - }; - static_assert(std::size(kTrackHeightMarkerPositions) == EnumValue(TrackElemType::Count)); - - - - + TrackElemType::flat, + TrackElemType::endStation, + TrackElemType::beginStation, + TrackElemType::middleStation, + TrackElemType::up25, + TrackElemType::up60, + TrackElemType::flatToUp25, + TrackElemType::up25ToUp60, + TrackElemType::up60ToUp25, + TrackElemType::up25ToFlat, + TrackElemType::down25, + TrackElemType::down60, + TrackElemType::flatToDown25, + TrackElemType::down25ToDown60, + TrackElemType::down60ToDown25, + TrackElemType::down25ToFlat, + TrackElemType::rightQuarterTurn5Tiles, // TrackElemType::leftQuarterTurn5Tiles + TrackElemType::leftQuarterTurn5Tiles, // TrackElemType::rightQuarterTurn5Tiles + TrackElemType::flatToRightBank, // TrackElemType::flatToLeftBank + TrackElemType::flatToLeftBank, // TrackElemType::flatToRightBank + TrackElemType::rightBankToFlat, // TrackElemType::leftBankToFlat + TrackElemType::leftBankToFlat, // TrackElemType::rightBankToFlat + TrackElemType::bankedRightQuarterTurn5Tiles, // TrackElemType::bankedLeftQuarterTurn5Tiles + TrackElemType::bankedLeftQuarterTurn5Tiles, // TrackElemType::bankedRightQuarterTurn5Tiles + TrackElemType::rightBankToUp25, // TrackElemType::leftBankToUp25 + TrackElemType::leftBankToUp25, // TrackElemType::rightBankToUp25 + TrackElemType::up25ToRightBank, // TrackElemType::up25ToLeftBank + TrackElemType::up25ToLeftBank, // TrackElemType::up25ToRightBank + TrackElemType::rightBankToDown25, // TrackElemType::leftBankToDown25 + TrackElemType::leftBankToDown25, // TrackElemType::rightBankToDown25 + TrackElemType::down25ToRightBank, // TrackElemType::down25ToLeftBank + TrackElemType::down25ToLeftBank, // TrackElemType::down25ToRightBank + TrackElemType::rightBank, // TrackElemType::leftBank + TrackElemType::leftBank, // TrackElemType::rightBank + TrackElemType::rightQuarterTurn5TilesUp25, // TrackElemType::leftQuarterTurn5TilesUp25 + TrackElemType::leftQuarterTurn5TilesUp25, // TrackElemType::rightQuarterTurn5TilesUp25 + TrackElemType::rightQuarterTurn5TilesDown25, // TrackElemType::leftQuarterTurn5TilesDown25 + TrackElemType::leftQuarterTurn5TilesDown25, // TrackElemType::rightQuarterTurn5TilesDown25 + TrackElemType::sBendRight, // TrackElemType::sBendLeft + TrackElemType::sBendLeft, // TrackElemType::sBendRight + TrackElemType::rightVerticalLoop, // TrackElemType::leftVerticalLoop + TrackElemType::leftVerticalLoop, // TrackElemType::rightVerticalLoop + TrackElemType::rightQuarterTurn3Tiles, // TrackElemType::leftQuarterTurn3Tiles + TrackElemType::leftQuarterTurn3Tiles, // TrackElemType::rightQuarterTurn3Tiles + TrackElemType::rightBankedQuarterTurn3Tiles, // TrackElemType::leftBankedQuarterTurn3Tiles + TrackElemType::leftBankedQuarterTurn3Tiles, // TrackElemType::rightBankedQuarterTurn3Tiles + TrackElemType::rightQuarterTurn3TilesUp25, // TrackElemType::leftQuarterTurn3TilesUp25 + TrackElemType::leftQuarterTurn3TilesUp25, // TrackElemType::rightQuarterTurn3TilesUp25 + TrackElemType::rightQuarterTurn3TilesDown25, // TrackElemType::leftQuarterTurn3TilesDown25 + TrackElemType::leftQuarterTurn3TilesDown25, // TrackElemType::rightQuarterTurn3TilesDown25 + TrackElemType::rightQuarterTurn1Tile, // TrackElemType::leftQuarterTurn1Tile + TrackElemType::leftQuarterTurn1Tile, // TrackElemType::rightQuarterTurn1Tile + TrackElemType::rightTwistDownToUp, // TrackElemType::leftTwistDownToUp + TrackElemType::leftTwistDownToUp, // TrackElemType::rightTwistDownToUp + TrackElemType::rightTwistUpToDown, // TrackElemType::leftTwistUpToDown + TrackElemType::leftTwistUpToDown, // TrackElemType::rightTwistUpToDown + TrackElemType::halfLoopUp, + TrackElemType::halfLoopDown, + TrackElemType::rightCorkscrewUp, // TrackElemType::leftCorkscrewUp + TrackElemType::leftCorkscrewUp, // TrackElemType::rightCorkscrewUp + TrackElemType::rightCorkscrewDown, // TrackElemType::leftCorkscrewDown + TrackElemType::leftCorkscrewDown, // TrackElemType::rightCorkscrewDown + TrackElemType::flatToUp60, + TrackElemType::up60ToFlat, + TrackElemType::flatToDown60, + TrackElemType::down60ToFlat, + TrackElemType::towerBase, + TrackElemType::towerSection, + TrackElemType::flatCovered, + TrackElemType::up25Covered, + TrackElemType::up60Covered, + TrackElemType::flatToUp25Covered, + TrackElemType::up25ToUp60Covered, + TrackElemType::up60ToUp25Covered, + TrackElemType::up25ToFlatCovered, + TrackElemType::down25Covered, + TrackElemType::down60Covered, + TrackElemType::flatToDown25Covered, + TrackElemType::down25ToDown60Covered, + TrackElemType::down60ToDown25Covered, + TrackElemType::down25ToFlatCovered, + TrackElemType::rightQuarterTurn5TilesCovered, // TrackElemType::leftQuarterTurn5TilesCovered + TrackElemType::leftQuarterTurn5TilesCovered, // TrackElemType::rightQuarterTurn5TilesCovered + TrackElemType::sBendRightCovered, // TrackElemType::sBendLeftCovered + TrackElemType::sBendLeftCovered, // TrackElemType::sBendRightCovered + TrackElemType::rightQuarterTurn3TilesCovered, // TrackElemType::leftQuarterTurn3TilesCovered + TrackElemType::leftQuarterTurn3TilesCovered, // TrackElemType::rightQuarterTurn3TilesCovered + TrackElemType::rightHalfBankedHelixUpSmall, // TrackElemType::leftHalfBankedHelixUpSmall + TrackElemType::leftHalfBankedHelixUpSmall, // TrackElemType::rightHalfBankedHelixUpSmall + TrackElemType::rightHalfBankedHelixDownSmall, // TrackElemType::leftHalfBankedHelixDownSmall + TrackElemType::leftHalfBankedHelixDownSmall, // TrackElemType::rightHalfBankedHelixDownSmall + TrackElemType::rightHalfBankedHelixUpLarge, // TrackElemType::leftHalfBankedHelixUpLarge + TrackElemType::leftHalfBankedHelixUpLarge, // TrackElemType::rightHalfBankedHelixUpLarge + TrackElemType::rightHalfBankedHelixDownLarge, // TrackElemType::leftHalfBankedHelixDownLarge + TrackElemType::leftHalfBankedHelixDownLarge, // TrackElemType::rightHalfBankedHelixDownLarge + TrackElemType::rightQuarterTurn1TileUp60, // TrackElemType::leftQuarterTurn1TileUp60 + TrackElemType::leftQuarterTurn1TileUp60, // TrackElemType::rightQuarterTurn1TileUp60 + TrackElemType::rightQuarterTurn1TileDown60, // TrackElemType::leftQuarterTurn1TileDown60 + TrackElemType::leftQuarterTurn1TileDown60, // TrackElemType::rightQuarterTurn1TileDown60 + TrackElemType::brakes, + TrackElemType::booster, + TrackElemType::maze, + TrackElemType::rightQuarterBankedHelixLargeUp, // TrackElemType::leftQuarterBankedHelixLargeUp + TrackElemType::leftQuarterBankedHelixLargeUp, // TrackElemType::rightQuarterBankedHelixLargeUp + TrackElemType::rightQuarterBankedHelixLargeDown, // TrackElemType::leftQuarterBankedHelixLargeDown + TrackElemType::leftQuarterBankedHelixLargeDown, // TrackElemType::rightQuarterBankedHelixLargeDown + TrackElemType::rightQuarterHelixLargeUp, // TrackElemType::leftQuarterHelixLargeUp + TrackElemType::leftQuarterHelixLargeUp, // TrackElemType::rightQuarterHelixLargeUp + TrackElemType::rightQuarterHelixLargeDown, // TrackElemType::leftQuarterHelixLargeDown + TrackElemType::leftQuarterHelixLargeDown, // TrackElemType::rightQuarterHelixLargeDown + TrackElemType::up25RightBanked, // TrackElemType::up25LeftBanked + TrackElemType::up25LeftBanked, // TrackElemType::up25RightBanked + TrackElemType::waterfall, + TrackElemType::rapids, + TrackElemType::onRidePhoto, + TrackElemType::down25RightBanked, // TrackElemType::down25LeftBanked + TrackElemType::down25LeftBanked, // TrackElemType::down25RightBanked + TrackElemType::watersplash, + TrackElemType::flatToUp60LongBase, + TrackElemType::up60ToFlatLongBase, + TrackElemType::whirlpool, + TrackElemType::down60ToFlatLongBase, + TrackElemType::flatToDown60LongBase, + TrackElemType::cableLiftHill, + TrackElemType::reverseFreefallSlope, + TrackElemType::reverseFreefallVertical, + TrackElemType::up90, + TrackElemType::down90, + TrackElemType::up60ToUp90, + TrackElemType::down90ToDown60, + TrackElemType::up90ToUp60, + TrackElemType::down60ToDown90, + TrackElemType::brakeForDrop, + TrackElemType::rightEighthToDiag, // TrackElemType::leftEighthToDiag + TrackElemType::leftEighthToDiag, // TrackElemType::rightEighthToDiag + TrackElemType::rightEighthToOrthogonal, // TrackElemType::leftEighthToOrthogonal + TrackElemType::leftEighthToOrthogonal, // TrackElemType::rightEighthToOrthogonal + TrackElemType::rightEighthBankToDiag, // TrackElemType::leftEighthBankToDiag + TrackElemType::leftEighthBankToDiag, // TrackElemType::rightEighthBankToDiag + TrackElemType::rightEighthBankToOrthogonal, // TrackElemType::leftEighthBankToOrthogonal + TrackElemType::leftEighthBankToOrthogonal, // TrackElemType::rightEighthBankToOrthogonal + TrackElemType::diagFlat, + TrackElemType::diagUp25, + TrackElemType::diagUp60, + TrackElemType::diagFlatToUp25, + TrackElemType::diagUp25ToUp60, + TrackElemType::diagUp60ToUp25, + TrackElemType::diagUp25ToFlat, + TrackElemType::diagDown25, + TrackElemType::diagDown60, + TrackElemType::diagFlatToDown25, + TrackElemType::diagDown25ToDown60, + TrackElemType::diagDown60ToDown25, + TrackElemType::diagDown25ToFlat, + TrackElemType::diagFlatToUp60, + TrackElemType::diagUp60ToFlat, + TrackElemType::diagFlatToDown60, + TrackElemType::diagDown60ToFlat, + TrackElemType::diagFlatToRightBank, // TrackElemType::diagFlatToLeftBank + TrackElemType::diagFlatToLeftBank, // TrackElemType::diagFlatToRightBank + TrackElemType::diagRightBankToFlat, // TrackElemType::diagLeftBankToFlat + TrackElemType::diagLeftBankToFlat, // TrackElemType::diagRightBankToFlat + TrackElemType::diagRightBankToUp25, // TrackElemType::diagLeftBankToUp25 + TrackElemType::diagLeftBankToUp25, // TrackElemType::diagRightBankToUp25 + TrackElemType::diagUp25ToRightBank, // TrackElemType::diagUp25ToLeftBank + TrackElemType::diagUp25ToLeftBank, // TrackElemType::diagUp25ToRightBank + TrackElemType::diagRightBankToDown25, // TrackElemType::diagLeftBankToDown25 + TrackElemType::diagLeftBankToDown25, // TrackElemType::diagRightBankToDown25 + TrackElemType::diagDown25ToRightBank, // TrackElemType::diagDown25ToLeftBank + TrackElemType::diagDown25ToLeftBank, // TrackElemType::diagDown25ToRightBank + TrackElemType::diagRightBank, // TrackElemType::diagLeftBank + TrackElemType::diagLeftBank, // TrackElemType::diagRightBank + TrackElemType::logFlumeReverser, + TrackElemType::spinningTunnel, + TrackElemType::rightBarrelRollUpToDown, // TrackElemType::leftBarrelRollUpToDown + TrackElemType::leftBarrelRollUpToDown, // TrackElemType::rightBarrelRollUpToDown + TrackElemType::rightBarrelRollDownToUp, // TrackElemType::leftBarrelRollDownToUp + TrackElemType::leftBarrelRollDownToUp, // TrackElemType::rightBarrelRollDownToUp + TrackElemType::rightBankToRightQuarterTurn3TilesUp25, // TrackElemType::leftBankToLeftQuarterTurn3TilesUp25 + TrackElemType::leftBankToLeftQuarterTurn3TilesUp25, // TrackElemType::rightBankToRightQuarterTurn3TilesUp25 + TrackElemType::rightQuarterTurn3TilesDown25ToRightBank, // TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank + TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank, // TrackElemType::rightQuarterTurn3TilesDown25ToRightBank + TrackElemType::poweredLift, + TrackElemType::rightLargeHalfLoopUp, // TrackElemType::leftLargeHalfLoopUp + TrackElemType::leftLargeHalfLoopUp, // TrackElemType::rightLargeHalfLoopUp + TrackElemType::rightLargeHalfLoopDown, // TrackElemType::leftLargeHalfLoopDown + TrackElemType::leftLargeHalfLoopDown, // TrackElemType::rightLargeHalfLoopDown + TrackElemType::rightFlyerTwistUp, // TrackElemType::leftFlyerTwistUp + TrackElemType::leftFlyerTwistUp, // TrackElemType::rightFlyerTwistUp + TrackElemType::rightFlyerTwistDown, // TrackElemType::leftFlyerTwistDown + TrackElemType::leftFlyerTwistDown, // TrackElemType::rightFlyerTwistDown + TrackElemType::flyerHalfLoopUninvertedUp, + TrackElemType::flyerHalfLoopInvertedDown, + TrackElemType::rightFlyerCorkscrewUp, // TrackElemType::leftFlyerCorkscrewUp + TrackElemType::leftFlyerCorkscrewUp, // TrackElemType::rightFlyerCorkscrewUp + TrackElemType::rightFlyerCorkscrewDown, // TrackElemType::leftFlyerCorkscrewDown + TrackElemType::leftFlyerCorkscrewDown, // TrackElemType::rightFlyerCorkscrewDown + TrackElemType::heartLineTransferUp, + TrackElemType::heartLineTransferDown, + TrackElemType::rightHeartLineRoll, // TrackElemType::leftHeartLineRoll + TrackElemType::leftHeartLineRoll, // TrackElemType::rightHeartLineRoll + TrackElemType::minigolfHoleA, + TrackElemType::minigolfHoleB, + TrackElemType::minigolfHoleC, + TrackElemType::minigolfHoleE, // TrackElemType::minigolfHoleD + TrackElemType::minigolfHoleD, // TrackElemType::minigolfHoleE + TrackElemType::multiDimInvertedFlatToDown90QuarterLoop, + TrackElemType::up90ToInvertedFlatQuarterLoop, + TrackElemType::invertedFlatToDown90QuarterLoop, + TrackElemType::rightCurvedLiftHill, // TrackElemType::leftCurvedLiftHill + TrackElemType::leftCurvedLiftHill, // TrackElemType::rightCurvedLiftHill + TrackElemType::rightReverser, // TrackElemType::leftReverser + TrackElemType::leftReverser, // TrackElemType::rightReverser + TrackElemType::airThrustTopCap, + TrackElemType::airThrustVerticalDown, + TrackElemType::airThrustVerticalDownToLevel, + TrackElemType::blockBrakes, + TrackElemType::rightBankedQuarterTurn3TileUp25, // TrackElemType::leftBankedQuarterTurn3TileUp25 + TrackElemType::leftBankedQuarterTurn3TileUp25, // TrackElemType::rightBankedQuarterTurn3TileUp25 + TrackElemType::rightBankedQuarterTurn3TileDown25, // TrackElemType::leftBankedQuarterTurn3TileDown25 + TrackElemType::leftBankedQuarterTurn3TileDown25, // TrackElemType::rightBankedQuarterTurn3TileDown25 + TrackElemType::rightBankedQuarterTurn5TileUp25, // TrackElemType::leftBankedQuarterTurn5TileUp25 + TrackElemType::leftBankedQuarterTurn5TileUp25, // TrackElemType::rightBankedQuarterTurn5TileUp25 + TrackElemType::rightBankedQuarterTurn5TileDown25, // TrackElemType::leftBankedQuarterTurn5TileDown25 + TrackElemType::leftBankedQuarterTurn5TileDown25, // TrackElemType::rightBankedQuarterTurn5TileDown25 + TrackElemType::up25ToRightBankedUp25, // TrackElemType::up25ToLeftBankedUp25 + TrackElemType::up25ToLeftBankedUp25, // TrackElemType::up25ToRightBankedUp25 + TrackElemType::rightBankedUp25ToUp25, // TrackElemType::leftBankedUp25ToUp25 + TrackElemType::leftBankedUp25ToUp25, // TrackElemType::rightBankedUp25ToUp25 + TrackElemType::down25ToRightBankedDown25, // TrackElemType::down25ToLeftBankedDown25 + TrackElemType::down25ToLeftBankedDown25, // TrackElemType::down25ToRightBankedDown25 + TrackElemType::rightBankedDown25ToDown25, // TrackElemType::leftBankedDown25ToDown25 + TrackElemType::leftBankedDown25ToDown25, // TrackElemType::rightBankedDown25ToDown25 + TrackElemType::rightBankedFlatToRightBankedUp25, // TrackElemType::leftBankedFlatToLeftBankedUp25 + TrackElemType::leftBankedFlatToLeftBankedUp25, // TrackElemType::rightBankedFlatToRightBankedUp25 + TrackElemType::rightBankedUp25ToRightBankedFlat, // TrackElemType::leftBankedUp25ToLeftBankedFlat + TrackElemType::leftBankedUp25ToLeftBankedFlat, // TrackElemType::rightBankedUp25ToRightBankedFlat + TrackElemType::rightBankedFlatToRightBankedDown25, // TrackElemType::leftBankedFlatToLeftBankedDown25 + TrackElemType::leftBankedFlatToLeftBankedDown25, // TrackElemType::rightBankedFlatToRightBankedDown25 + TrackElemType::rightBankedDown25ToRightBankedFlat, // TrackElemType::leftBankedDown25ToLeftBankedFlat + TrackElemType::leftBankedDown25ToLeftBankedFlat, // TrackElemType::rightBankedDown25ToRightBankedFlat + TrackElemType::flatToRightBankedUp25, // TrackElemType::flatToLeftBankedUp25 + TrackElemType::flatToLeftBankedUp25, // TrackElemType::flatToRightBankedUp25 + TrackElemType::rightBankedUp25ToFlat, // TrackElemType::leftBankedUp25ToFlat + TrackElemType::leftBankedUp25ToFlat, // TrackElemType::rightBankedUp25ToFlat + TrackElemType::flatToRightBankedDown25, // TrackElemType::flatToLeftBankedDown25 + TrackElemType::flatToLeftBankedDown25, // TrackElemType::flatToRightBankedDown25 + TrackElemType::rightBankedDown25ToFlat, // TrackElemType::leftBankedDown25ToFlat + TrackElemType::leftBankedDown25ToFlat, // TrackElemType::rightBankedDown25ToFlat + TrackElemType::rightQuarterTurn1TileUp90, // TrackElemType::leftQuarterTurn1TileUp90 + TrackElemType::leftQuarterTurn1TileUp90, // TrackElemType::rightQuarterTurn1TileUp90 + TrackElemType::rightQuarterTurn1TileDown90, // TrackElemType::leftQuarterTurn1TileDown90 + TrackElemType::leftQuarterTurn1TileDown90, // TrackElemType::rightQuarterTurn1TileDown90 + TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop, + TrackElemType::multiDimFlatToDown90QuarterLoop, + TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop, + TrackElemType::rotationControlToggle, + TrackElemType::flatTrack1x4A, // TrackElemType::flatTrack1x4A + TrackElemType::flatTrack2x2, // TrackElemType::flatTrack2x2 + TrackElemType::flatTrack4x4, // TrackElemType::flatTrack4x4 + TrackElemType::flatTrack2x4, // TrackElemType::flatTrack2x4 + TrackElemType::flatTrack1x5, // TrackElemType::flatTrack1x5 + TrackElemType::flatTrack1x1A, // TrackElemType::flatTrack1x1A + TrackElemType::flatTrack1x4B, // TrackElemType::flatTrack1x4B + TrackElemType::flatTrack1x1B, // TrackElemType::flatTrack1x1B + TrackElemType::flatTrack1x4C, // TrackElemType::flatTrack1x4C + TrackElemType::flatTrack3x3, // TrackElemType::flatTrack3x3 + TrackElemType::rightLargeCorkscrewUp, // TrackElemType::leftLargeCorkscrewUp + TrackElemType::leftLargeCorkscrewUp, // TrackElemType::rightLargeCorkscrewUp + TrackElemType::rightLargeCorkscrewDown, // TrackElemType::leftLargeCorkscrewDown + TrackElemType::leftLargeCorkscrewDown, // TrackElemType::rightLargeCorkscrewDown + TrackElemType::rightMediumHalfLoopUp, // TrackElemType::leftMediumHalfLoopUp + TrackElemType::leftMediumHalfLoopUp, // TrackElemType::rightMediumHalfLoopUp + TrackElemType::rightMediumHalfLoopDown, // TrackElemType::leftMediumHalfLoopDown + TrackElemType::leftMediumHalfLoopDown, // TrackElemType::rightMediumHalfLoopDown + TrackElemType::rightZeroGRollUp, // TrackElemType::leftZeroGRollUp + TrackElemType::leftZeroGRollUp, // TrackElemType::rightZeroGRollUp + TrackElemType::rightZeroGRollDown, // TrackElemType::leftZeroGRollDown + TrackElemType::leftZeroGRollDown, // TrackElemType::rightZeroGRollDown + TrackElemType::rightLargeZeroGRollUp, // TrackElemType::leftLargeZeroGRollUp + TrackElemType::leftLargeZeroGRollUp, // TrackElemType::rightLargeZeroGRollUp + TrackElemType::rightLargeZeroGRollDown, // TrackElemType::leftLargeZeroGRollDown + TrackElemType::leftLargeZeroGRollDown, // TrackElemType::rightLargeZeroGRollDown + TrackElemType::rightFlyerLargeHalfLoopUninvertedUp, // TrackElemType::leftFlyerLargeHalfLoopUninvertedUp + TrackElemType::leftFlyerLargeHalfLoopUninvertedUp, // TrackElemType::rightFlyerLargeHalfLoopUninvertedUp + TrackElemType::rightFlyerLargeHalfLoopInvertedDown, // TrackElemType::leftFlyerLargeHalfLoopInvertedDown + TrackElemType::leftFlyerLargeHalfLoopInvertedDown, // TrackElemType::rightFlyerLargeHalfLoopInvertedDown + TrackElemType::rightFlyerLargeHalfLoopInvertedUp, // TrackElemType::leftFlyerLargeHalfLoopInvertedUp + TrackElemType::leftFlyerLargeHalfLoopInvertedUp, // TrackElemType::rightFlyerLargeHalfLoopInvertedUp + TrackElemType::rightFlyerLargeHalfLoopUninvertedDown, // TrackElemType::leftFlyerLargeHalfLoopUninvertedDown + TrackElemType::leftFlyerLargeHalfLoopUninvertedDown, // TrackElemType::rightFlyerLargeHalfLoopUninvertedDown + TrackElemType::flyerHalfLoopInvertedUp, + TrackElemType::flyerHalfLoopUninvertedDown, + TrackElemType::rightEighthToDiagUp25, // TrackElemType::leftEighthToDiagUp25 + TrackElemType::leftEighthToDiagUp25, // TrackElemType::rightEighthToDiagUp25 + TrackElemType::rightEighthToDiagDown25, // TrackElemType::leftEighthToDiagDown25 + TrackElemType::leftEighthToDiagDown25, // TrackElemType::rightEighthToDiagDown25 + TrackElemType::rightEighthToOrthogonalUp25, // TrackElemType::leftEighthToOrthogonalUp25 + TrackElemType::leftEighthToOrthogonalUp25, // TrackElemType::rightEighthToOrthogonalUp25 + TrackElemType::rightEighthToOrthogonalDown25, // TrackElemType::leftEighthToOrthogonalDown25 + TrackElemType::leftEighthToOrthogonalDown25, // TrackElemType::rightEighthToOrthogonalDown25 + TrackElemType::diagUp25ToRightBankedUp25, // TrackElemType::diagUp25ToRightBankedUp25 + TrackElemType::diagUp25ToLeftBankedUp25, // TrackElemType::diagUp25ToLeftBankedUp25 + TrackElemType::diagRightBankedUp25ToUp25, // TrackElemType::diagRightBankedUp25ToUp25 + TrackElemType::diagLeftBankedUp25ToUp25, // TrackElemType::diagLeftBankedUp25ToUp25 + TrackElemType::diagDown25ToRightBankedDown25, // TrackElemType::diagDown25ToRightBankedDown25 + TrackElemType::diagDown25ToLeftBankedDown25, // TrackElemType::diagDown25ToLeftBankedDown25 + TrackElemType::diagRightBankedDown25ToDown25, // TrackElemType::diagRightBankedDown25ToDown25 + TrackElemType::diagLeftBankedDown25ToDown25, // TrackElemType::diagLeftBankedDown25ToDown25 + TrackElemType::diagRightBankedFlatToRightBankedUp25, // TrackElemType::diagRightBankedFlatToRightBankedUp25 + TrackElemType::diagLeftBankedFlatToLeftBankedUp25, // TrackElemType::diagLeftBankedFlatToLeftBankedUp25 + TrackElemType::diagRightBankedUp25ToRightBankedFlat, // TrackElemType::diagRightBankedUp25ToRightBankedFlat + TrackElemType::diagLeftBankedUp25ToLeftBankedFlat, // TrackElemType::diagLeftBankedUp25ToLeftBankedFlat + TrackElemType::diagRightBankedFlatToRightBankedDown25,// TrackElemType::diagRightBankedFlatToRightBankedDown25 + TrackElemType::diagLeftBankedFlatToLeftBankedDown25, // TrackElemType::diagLeftBankedFlatToLeftBankedDown25 + TrackElemType::diagRightBankedDown25ToRightBankedFlat,// TrackElemType::diagRightBankedDown25ToRightBankedFlat + TrackElemType::diagLeftBankedDown25ToLeftBankedFlat, // TrackElemType::diagLeftBankedDown25ToLeftBankedFlat + TrackElemType::diagFlatToRightBankedUp25, // TrackElemType::diagFlatToRightBankedUp25 + TrackElemType::diagFlatToLeftBankedUp25, // TrackElemType::diagFlatToLeftBankedUp25 + TrackElemType::diagRightBankedUp25ToFlat, // TrackElemType::diagRightBankedUp25ToFlat + TrackElemType::diagLeftBankedUp25ToFlat, // TrackElemType::diagLeftBankedUp25ToFlat + TrackElemType::diagFlatToRightBankedDown25, // TrackElemType::diagFlatToRightBankedDown25 + TrackElemType::diagFlatToLeftBankedDown25, // TrackElemType::diagFlatToLeftBankedDown25 + TrackElemType::diagRightBankedDown25ToFlat, // TrackElemType::diagRightBankedDown25ToFlat + TrackElemType::diagLeftBankedDown25ToFlat, // TrackElemType::diagLeftBankedDown25ToFlat + TrackElemType::diagUp25RightBanked, // TrackElemType::diagUp25RightBanked + TrackElemType::diagUp25LeftBanked, // TrackElemType::diagUp25LeftBanked + TrackElemType::diagDown25RightBanked, // TrackElemType::diagDown25RightBanked + TrackElemType::diagDown25LeftBanked, // TrackElemType::diagDown25LeftBanked + TrackElemType::rightEighthBankToDiagUp25, // TrackElemType::rightEighthBankToDiagUp25 + TrackElemType::leftEighthBankToDiagUp25, // TrackElemType::leftEighthBankToDiagUp25 + TrackElemType::rightEighthBankToDiagDown25, // TrackElemType::rightEighthBankToDiagDown25 + TrackElemType::leftEighthBankToDiagDown25, // TrackElemType::leftEighthBankToDiagDown25 + TrackElemType::rightEighthBankToOrthogonalUp25, // TrackElemType::rightEighthBankToOrthogonalUp25 + TrackElemType::leftEighthBankToOrthogonalUp25, // TrackElemType::leftEighthBankToOrthogonalUp25 + TrackElemType::rightEighthBankToOrthogonalDown25, // TrackElemType::rightEighthBankToOrthogonalDown25 + TrackElemType::leftEighthBankToOrthogonalDown25, // TrackElemType::leftEighthBankToOrthogonalDown25 + TrackElemType::diagBrakes, + TrackElemType::diagBlockBrakes, + TrackElemType::down25Brakes, + TrackElemType::diagBooster, + TrackElemType::diagFlatToUp60LongBase, // TrackElemType::diagFlatToUp60LongBase, + TrackElemType::diagUp60ToFlatLongBase, // TrackElemType::diagUp60ToFlatLongBase, + TrackElemType::diagFlatToDown60LongBase, // TrackElemType::diagFlatToDown60LongBase, + TrackElemType::diagDown60ToFlatLongBase, // TrackElemType::diagDown60ToFlatLongBase, + TrackElemType::rightEighthDiveLoopUpToOrthogonal, // TrackElemType::leftEighthDiveLoopUpToOrthogonal + TrackElemType::leftEighthDiveLoopUpToOrthogonal, // TrackElemType::rightEighthDiveLoopUpToOrthogonal + TrackElemType::rightEighthDiveLoopDownToDiag, // TrackElemType::leftEighthDiveLoopDownToDiag + TrackElemType::leftEighthDiveLoopDownToDiag, // TrackElemType::rightEighthDiveLoopDownToDiag + TrackElemType::diagDown25Brakes, + }; + static_assert(std::size(kTrackElementMirrorMap) == EnumValue(TrackElemType::count)); + /** rct2: 0x0099423C */ - static constexpr uint32_t kTrackFlags[] = { - /* TrackElemType::Flat */ TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::EndStation */ 0, - /* TrackElemType::BeginStation */ 0, - /* TrackElemType::MiddleStation */ 0, - /* TrackElemType::Up25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Up60 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::FlatToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Up25ToUp60 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Up60ToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Up25ToFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Down25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Down60 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::FlatToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Down25ToDown60 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Down60ToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Down25ToFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::LeftQuarterTurn5Tiles */ TRACK_ELEM_FLAG_TURN_LEFT, - /* TrackElemType::RightQuarterTurn5Tiles */ TRACK_ELEM_FLAG_TURN_RIGHT, - /* TrackElemType::FlatToLeftBank */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::FlatToRightBank */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankToFlat */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankToFlat */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::BankedLeftQuarterTurn5Tiles */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_BANKED | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::BankedRightQuarterTurn5Tiles */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_BANKED | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Up25ToLeftBank */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Up25ToRightBank */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Down25ToLeftBank */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Down25ToRightBank */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBank */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBank */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftQuarterTurn5TilesUp25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightQuarterTurn5TilesUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::LeftQuarterTurn5TilesDown25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightQuarterTurn5TilesDown25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::SBendLeft */ 0, - /* TrackElemType::SBendRight */ 0, - /* TrackElemType::LeftVerticalLoop */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightVerticalLoop */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftQuarterTurn3Tiles */ TRACK_ELEM_FLAG_TURN_LEFT, - /* TrackElemType::RightQuarterTurn3Tiles */ TRACK_ELEM_FLAG_TURN_RIGHT, - /* TrackElemType::LeftBankedQuarterTurn3Tiles */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_BANKED | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedQuarterTurn3Tiles */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_BANKED | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftQuarterTurn3TilesUp25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightQuarterTurn3TilesUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::LeftQuarterTurn3TilesDown25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightQuarterTurn3TilesDown25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::LeftQuarterTurn1Tile */ TRACK_ELEM_FLAG_TURN_LEFT, - /* TrackElemType::RightQuarterTurn1Tile */ TRACK_ELEM_FLAG_TURN_RIGHT, - /* TrackElemType::LeftTwistDownToUp */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightTwistDownToUp */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftTwistUpToDown */ TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightTwistUpToDown */ TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::HalfLoopUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::HalfLoopDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftCorkscrewUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightCorkscrewUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftCorkscrewDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightCorkscrewDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::FlatToUp60 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Up60ToFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::FlatToDown60 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Down60ToFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::TowerBase */ 0, - /* TrackElemType::TowerSection */ 0, - /* TrackElemType::FlatCovered */ 0, - /* TrackElemType::Up25Covered */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Up60Covered */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::FlatToUp25Covered */ TRACK_ELEM_FLAG_UP, - /* TrackElemType::Up25ToUp60Covered */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Up60ToUp25Covered */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Up25ToFlatCovered */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Down25Covered */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Down60Covered */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::FlatToDown25Covered */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Down25ToDown60Covered */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Down60ToDown25Covered */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Down25ToFlatCovered */ TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::LeftQuarterTurn5TilesCovered */ TRACK_ELEM_FLAG_TURN_LEFT, - /* TrackElemType::RightQuarterTurn5TilesCovered */ TRACK_ELEM_FLAG_TURN_RIGHT, - /* TrackElemType::SBendLeftCovered */ 0, - /* TrackElemType::SBendRightCovered */ 0, - /* TrackElemType::LeftQuarterTurn3TilesCovered */ TRACK_ELEM_FLAG_TURN_LEFT, - /* TrackElemType::RightQuarterTurn3TilesCovered */ TRACK_ELEM_FLAG_TURN_RIGHT, - /* TrackElemType::LeftHalfBankedHelixUpSmall */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightHalfBankedHelixUpSmall */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftHalfBankedHelixDownSmall */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightHalfBankedHelixDownSmall */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftHalfBankedHelixUpLarge */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightHalfBankedHelixUpLarge */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftHalfBankedHelixDownLarge */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightHalfBankedHelixDownLarge */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftQuarterTurn1TileUp60 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::RightQuarterTurn1TileUp60 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::LeftQuarterTurn1TileDown60 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::RightQuarterTurn1TileDown60 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Brakes */ 0, - /* TrackElemType::Booster */ 0, - /* TrackElemType::InvertedUp90ToFlatQuarterLoopAlias / Maze */ TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND, - /* TrackElemType::LeftQuarterBankedHelixLargeUp */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightQuarterBankedHelixLargeUp */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftQuarterBankedHelixLargeDown */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightQuarterBankedHelixLargeDown */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_HELIX | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftQuarterHelixLargeUp */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_HELIX, - /* TrackElemType::RightQuarterHelixLargeUp */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_HELIX, - /* TrackElemType::LeftQuarterHelixLargeDown */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_HELIX, - /* TrackElemType::RightQuarterHelixLargeDown */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_HELIX, - /* TrackElemType::Up25LeftBanked */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Up25RightBanked */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Waterfall */ 0, - /* TrackElemType::Rapids */ 0, - /* TrackElemType::OnRidePhoto */ 0, - /* TrackElemType::Down25LeftBanked */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Down25RightBanked */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Watersplash */ 0, - /* TrackElemType::FlatToUp60LongBase */ TRACK_ELEM_FLAG_UP, - /* TrackElemType::Up60ToFlatLongBase */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Whirlpool */ 0, - /* TrackElemType::Down60ToFlatLongBase */ TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::FlatToDown60LongBase */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::CableLiftHill */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::ReverseFreefallSlope */ TRACK_ELEM_FLAG_UP, - /* TrackElemType::ReverseFreefallVertical */ TRACK_ELEM_FLAG_UP, - /* TrackElemType::Up90 */ TRACK_ELEM_FLAG_UP, - /* TrackElemType::Down90 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Up60ToUp90 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Down90ToDown60 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::Up90ToUp60 */ TRACK_ELEM_FLAG_UP, - /* TrackElemType::Down60ToDown90 */ TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::BrakeForDrop */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::LeftEighthToDiag */ TRACK_ELEM_FLAG_TURN_LEFT, - /* TrackElemType::RightEighthToDiag */ TRACK_ELEM_FLAG_TURN_RIGHT, - /* TrackElemType::LeftEighthToOrthogonal */ TRACK_ELEM_FLAG_TURN_LEFT, - /* TrackElemType::RightEighthToOrthogonal */ TRACK_ELEM_FLAG_TURN_RIGHT, - /* TrackElemType::LeftEighthBankToDiag */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_BANKED | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightEighthBankToDiag */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_BANKED | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftEighthBankToOrthogonal */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_BANKED | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightEighthBankToOrthogonal */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_BANKED | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagFlat */ TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagUp60 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagFlatToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagUp25ToUp60 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagUp60ToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagUp25ToFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagDown60 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagFlatToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagDown25ToDown60 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagDown60ToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagDown25ToFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagFlatToUp60 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagUp60ToFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_IS_STEEP_UP | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagFlatToDown60 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagDown60ToFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, - /* TrackElemType::DiagFlatToLeftBank */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagFlatToRightBank */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagLeftBankToFlat */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagRightBankToFlat */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagLeftBankToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagRightBankToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagUp25ToLeftBank */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagUp25ToRightBank */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagLeftBankToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagRightBankToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagDown25ToLeftBank */ TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::DiagDown25ToRightBank */ TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::DiagLeftBank */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagRightBank */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LogFlumeReverser */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::SpinningTunnel */ TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBarrelRollUpToDown */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightBarrelRollUpToDown */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftBarrelRollDownToUp */ TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightBarrelRollDownToUp */ TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankToRightQuarterTurn3TilesUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightQuarterTurn3TilesDown25ToRightBank */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::PoweredLift */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::LeftLargeHalfLoopUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightLargeHalfLoopUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftLargeHalfLoopDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightLargeHalfLoopDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftFlyerTwistUp */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightFlyerTwistUp */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftFlyerTwistDown */ TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightFlyerTwistDown */ TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::FlyerHalfLoopUninvertedUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::FlyerHalfLoopInvertedDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftFlyerCorkscrewUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightFlyerCorkscrewUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftFlyerCorkscrewDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightFlyerCorkscrewDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::HeartLineTransferUp */ 0, - /* TrackElemType::HeartLineTransferDown */ 0, - /* TrackElemType::LeftHeartLineRoll */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL | TRACK_ELEM_FLAG_CAN_BE_PARTLY_UNDERGROUND, - /* TrackElemType::RightHeartLineRoll */ TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL | TRACK_ELEM_FLAG_CAN_BE_PARTLY_UNDERGROUND, - /* TrackElemType::MinigolfHoleA */ TRACK_ELEM_FLAG_IS_GOLF_HOLE, - /* TrackElemType::MinigolfHoleB */ TRACK_ELEM_FLAG_IS_GOLF_HOLE, - /* TrackElemType::MinigolfHoleC */ TRACK_ELEM_FLAG_IS_GOLF_HOLE, - /* TrackElemType::MinigolfHoleD */ TRACK_ELEM_FLAG_IS_GOLF_HOLE, - /* TrackElemType::MinigolfHoleE */ TRACK_ELEM_FLAG_IS_GOLF_HOLE, - /* TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::Up90ToInvertedFlatQuarterLoop */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::InvertedFlatToDown90QuarterLoop */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftCurvedLiftHill */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_UP, - /* TrackElemType::RightCurvedLiftHill */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_UP, - /* TrackElemType::LeftReverser */ 0, - /* TrackElemType::RightReverser */ 0, - /* TrackElemType::AirThrustTopCap */ 0, - /* TrackElemType::AirThrustVerticalDown */ TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::AirThrustVerticalDownToLevel */ TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::BlockBrakes */ 0, - /* TrackElemType::LeftBankedQuarterTurn3TileUp25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedQuarterTurn3TileUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedQuarterTurn3TileDown25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedQuarterTurn3TileDown25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedQuarterTurn5TileUp25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedQuarterTurn5TileUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedQuarterTurn5TileDown25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedQuarterTurn5TileDown25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Up25ToLeftBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Up25ToRightBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedUp25ToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedUp25ToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Down25ToLeftBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Down25ToRightBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedDown25ToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedDown25ToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedFlatToLeftBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedFlatToRightBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedUp25ToLeftBankedFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedUp25ToRightBankedFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedFlatToLeftBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedFlatToRightBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedDown25ToLeftBankedFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedDown25ToRightBankedFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::FlatToLeftBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::FlatToRightBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedUp25ToFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedUp25ToFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::FlatToLeftBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::FlatToRightBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftBankedDown25ToFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::RightBankedDown25ToFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::LeftQuarterTurn1TileUp90 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP, - /* TrackElemType::RightQuarterTurn1TileUp90 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP, - /* TrackElemType::LeftQuarterTurn1TileDown90 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::RightQuarterTurn1TileDown90 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::MultiDimFlatToDown90QuarterLoop */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RotationControlToggle */ 0, - /* TrackElemType::FlatTrack1x4A */ 0, - /* TrackElemType::FlatTrack2x2 */ 0, - /* TrackElemType::FlatTrack4x4 */ 0, - /* TrackElemType::FlatTrack2x4 */ TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND, - /* TrackElemType::FlatTrack1x5 */ 0, - /* TrackElemType::FlatTrack1x1A */ 0, - /* TrackElemType::FlatTrack1x4B */ 0, - /* TrackElemType::FlatTrack1x1B */ 0, - /* TrackElemType::FlatTrack1x4C */ 0, - /* TrackElemType::FlatTrack3x3 */ 0, - /* TrackElemType::LeftLargeCorkscrewUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightLargeCorkscrewUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftLargeCorkscrewDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightLargeCorkscrewDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftMediumHalfLoopUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightMediumHalfLoopUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftMediumHalfLoopDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightMediumHalfLoopDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftZeroGRollUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightZeroGRollUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftZeroGRollDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightZeroGRollDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftLargeZeroGRollUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightLargeZeroGRollUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftLargeZeroGRollDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightLargeZeroGRollDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::RightFlyerLargeHalfLoopUninvertedUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::LeftFlyerLargeHalfLoopInvertedDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightFlyerLargeHalfLoopInvertedDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftFlyerLargeHalfLoopInvertedUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::RightFlyerLargeHalfLoopInvertedUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION, - /* TrackElemType::RightFlyerLargeHalfLoopUninvertedDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION, - /* TrackElemType::FlyerHalfLoopInvertedUp */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::FlyerHalfLoopUnivertedDown */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION, - /* TrackElemType::LeftEighthToDiagUp25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightEighthToDiagUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::LeftEighthToDiagDown25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightEighthToDiagDown25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::LeftEighthToOrthogonalUp25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightEighthToOrthogonalUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::LeftEighthToOrthogonalDown25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightEighthToOrthogonalDown25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::DiagUp25ToLeftBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagUp25ToRightBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagLeftBankedUp25ToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagRightBankedUp25ToUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagDown25ToLeftBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagDown25ToRightBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagLeftBankedDown25ToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagRightBankedDown25ToDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagRightBankedFlatToRightBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagRightBankedUp25ToRightBankedFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagRightBankedFlatToRightBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagRightBankedDown25ToRightBankedFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagFlatToLeftBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagFlatToRightBankedUp25 */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagLeftBankedUp25ToFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagRightBankedUp25ToFlat */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagFlatToLeftBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagFlatToRightBankedDown25 */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagLeftBankedDown25ToFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::DiagRightBankedDown25ToFlat */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED, - /* TrackElemType::Up25LeftBanked */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Up25RightBanked */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Down25LeftBanked */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::Down25RightBanked */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_BANKED | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::LeftEighthBankToDiagUp25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightEighthBankToDiagUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::LeftEighthBankToDiagDown25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightEighthBankToDiagDown25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::LeftEighthBankToOrthogonalUp25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightEighthBankToOrthogonalUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::LeftEighthBankToOrthogonalDown25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::RightEighthBankToOrthogonalDown25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, - /* TrackElemType::DiagBrakes */ 0, - /* TrackElemType::DiagBlockBrakes */ 0, - /* TrackElemType::Down25Brakes */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagBooster */ 0, - /* TrackElemType::DiagFlatToUp60LongBase */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_IS_STEEP_UP, - /* TrackElemType::DiagUp60ToFlatLongBase */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_IS_STEEP_UP, - /* TrackElemType::DiagFlatToDown60LongBase */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - /* TrackElemType::DiagDown60ToFlatLongBase */ TRACK_ELEM_FLAG_DOWN, - /* TrackElemType::LeftEighthDiveLoopUpToOrthogonal */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightEighthDiveLoopUpToOrthogonal */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::LeftEighthDiveLoopDownToDiag */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::RightEighthDiveLoopDownToDiag */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, - /* TrackElemType::DiagDown25Brakes */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, - }; - static_assert(std::size(kTrackFlags) == EnumValue(TrackElemType::Count)); + static constexpr TrackFlags kTrackFlags[] = { + /* TrackElemType::flat */ { TrackElementFlag::allowLiftHill }, + /* TrackElemType::endStation */ {}, + /* TrackElemType::beginStation */ {}, + /* TrackElemType::middleStation */ {}, + /* TrackElemType::up25 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::up60 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::flatToUp25 */ { TrackElementFlag::up, TrackElementFlag::allowLiftHill }, + /* TrackElemType::up25ToUp60 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::up60ToUp25 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::up25ToFlat */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::down25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::down60 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::flatToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::down25ToDown60 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::down60ToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::down25ToFlat */ { TrackElementFlag::down, TrackElementFlag::allowLiftHill }, + /* TrackElemType::leftQuarterTurn5Tiles */ { TrackElementFlag::turnLeft }, + /* TrackElemType::rightQuarterTurn5Tiles */ { TrackElementFlag::turnRight }, + /* TrackElemType::flatToLeftBank */ { TrackElementFlag::banked }, + /* TrackElemType::flatToRightBank */ { TrackElementFlag::banked }, + /* TrackElemType::leftBankToFlat */ { TrackElementFlag::banked }, + /* TrackElemType::rightBankToFlat */ { TrackElementFlag::banked }, + /* TrackElemType::bankedLeftQuarterTurn5Tiles */ { TrackElementFlag::turnLeft, TrackElementFlag::turnBanked, TrackElementFlag::banked }, + /* TrackElemType::bankedRightQuarterTurn5Tiles */ { TrackElementFlag::turnRight, TrackElementFlag::turnBanked, TrackElementFlag::banked }, + /* TrackElemType::leftBankToUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::rightBankToUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::up25ToLeftBank */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::up25ToRightBank */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::down25ToLeftBank */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::down25ToRightBank */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::leftBank */ { TrackElementFlag::banked }, + /* TrackElemType::rightBank */ { TrackElementFlag::banked }, + /* TrackElemType::leftQuarterTurn5TilesUp25 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightQuarterTurn5TilesUp25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::leftQuarterTurn5TilesDown25 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightQuarterTurn5TilesDown25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::sBendLeft */ {}, + /* TrackElemType::sBendRight */ {}, + /* TrackElemType::leftVerticalLoop */ { TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightVerticalLoop */ { TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftQuarterTurn3Tiles */ { TrackElementFlag::turnLeft }, + /* TrackElemType::rightQuarterTurn3Tiles */ { TrackElementFlag::turnRight }, + /* TrackElemType::leftBankedQuarterTurn3Tiles */ { TrackElementFlag::turnLeft, TrackElementFlag::turnBanked, TrackElementFlag::banked }, + /* TrackElemType::rightBankedQuarterTurn3Tiles */ { TrackElementFlag::turnRight, TrackElementFlag::turnBanked, TrackElementFlag::banked }, + /* TrackElemType::leftQuarterTurn3TilesUp25 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightQuarterTurn3TilesUp25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::leftQuarterTurn3TilesDown25 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightQuarterTurn3TilesDown25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::leftQuarterTurn1Tile */ { TrackElementFlag::turnLeft }, + /* TrackElemType::rightQuarterTurn1Tile */ { TrackElementFlag::turnRight }, + /* TrackElemType::leftTwistDownToUp */ { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightTwistDownToUp */ { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftTwistUpToDown */ { TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightTwistUpToDown */ { TrackElementFlag::inversionToNormal }, + /* TrackElemType::halfLoopUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::halfLoopDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftCorkscrewUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightCorkscrewUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftCorkscrewDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightCorkscrewDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::flatToUp60 */ { TrackElementFlag::up, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::up60ToFlat */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::flatToDown60 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::down60ToFlat */ { TrackElementFlag::down, TrackElementFlag::allowLiftHill }, + /* TrackElemType::towerBase */ {}, + /* TrackElemType::towerSection */ {}, + /* TrackElemType::flatCovered */ {}, + /* TrackElemType::up25Covered */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::up60Covered */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::flatToUp25Covered */ { TrackElementFlag::up }, + /* TrackElemType::up25ToUp60Covered */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::up60ToUp25Covered */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::up25ToFlatCovered */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::down25Covered */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::down60Covered */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::flatToDown25Covered */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::down25ToDown60Covered */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::down60ToDown25Covered */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::down25ToFlatCovered */ { TrackElementFlag::down }, + /* TrackElemType::leftQuarterTurn5TilesCovered */ { TrackElementFlag::turnLeft }, + /* TrackElemType::rightQuarterTurn5TilesCovered */ { TrackElementFlag::turnRight }, + /* TrackElemType::sBendLeftCovered */ {}, + /* TrackElemType::sBendRightCovered */ {}, + /* TrackElemType::leftQuarterTurn3TilesCovered */ { TrackElementFlag::turnLeft }, + /* TrackElemType::rightQuarterTurn3TilesCovered */ { TrackElementFlag::turnRight }, + /* TrackElemType::leftHalfBankedHelixUpSmall */ { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::rightHalfBankedHelixUpSmall */ { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::leftHalfBankedHelixDownSmall */ { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::rightHalfBankedHelixDownSmall */ { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::leftHalfBankedHelixUpLarge */ { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::rightHalfBankedHelixUpLarge */ { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::leftHalfBankedHelixDownLarge */ { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::rightHalfBankedHelixDownLarge */ { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::leftQuarterTurn1TileUp60 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::rightQuarterTurn1TileUp60 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::leftQuarterTurn1TileDown60 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::rightQuarterTurn1TileDown60 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::brakes */ {}, + /* TrackElemType::booster */ {}, + /* TrackElemType::invertedUp90ToFlatQuarterLoopAlias / Maze */ { TrackElementFlag::onlyAboveGround }, + /* TrackElemType::leftQuarterBankedHelixLargeUp */ { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::rightQuarterBankedHelixLargeUp */ { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::leftQuarterBankedHelixLargeDown */ { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::rightQuarterBankedHelixLargeDown */ { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked }, + /* TrackElemType::leftQuarterHelixLargeUp */ { TrackElementFlag::turnLeft, TrackElementFlag::helix }, + /* TrackElemType::rightQuarterHelixLargeUp */ { TrackElementFlag::turnRight, TrackElementFlag::helix }, + /* TrackElemType::leftQuarterHelixLargeDown */ { TrackElementFlag::turnLeft, TrackElementFlag::helix }, + /* TrackElemType::rightQuarterHelixLargeDown */ { TrackElementFlag::turnRight, TrackElementFlag::helix }, + /* TrackElemType::up25LeftBanked */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::up25RightBanked */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::waterfall */ {}, + /* TrackElemType::rapids */ {}, + /* TrackElemType::onRidePhoto */ {}, + /* TrackElemType::down25LeftBanked */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::down25RightBanked */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::watersplash */ {}, + /* TrackElemType::flatToUp60LongBase */ { TrackElementFlag::up }, + /* TrackElemType::up60ToFlatLongBase */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::whirlpool */ {}, + /* TrackElemType::down60ToFlatLongBase */ { TrackElementFlag::down }, + /* TrackElemType::flatToDown60LongBase */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::cableLiftHill */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::reverseFreefallSlope */ { TrackElementFlag::up }, + /* TrackElemType::reverseFreefallVertical */ { TrackElementFlag::up }, + /* TrackElemType::up90 */ { TrackElementFlag::up }, + /* TrackElemType::down90 */ { TrackElementFlag::down, TrackElementFlag::allowLiftHill }, + /* TrackElemType::up60ToUp90 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::down90ToDown60 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::up90ToUp60 */ { TrackElementFlag::up }, + /* TrackElemType::down60ToDown90 */ { TrackElementFlag::down }, + /* TrackElemType::brakeForDrop */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::leftEighthToDiag */ { TrackElementFlag::turnLeft }, + /* TrackElemType::rightEighthToDiag */ { TrackElementFlag::turnRight }, + /* TrackElemType::leftEighthToOrthogonal */ { TrackElementFlag::turnLeft }, + /* TrackElemType::rightEighthToOrthogonal */ { TrackElementFlag::turnRight }, + /* TrackElemType::leftEighthBankToDiag */ { TrackElementFlag::turnLeft, TrackElementFlag::turnBanked, TrackElementFlag::banked }, + /* TrackElemType::rightEighthBankToDiag */ { TrackElementFlag::turnRight, TrackElementFlag::turnBanked, TrackElementFlag::banked }, + /* TrackElemType::leftEighthBankToOrthogonal */ { TrackElementFlag::turnLeft, TrackElementFlag::turnBanked, TrackElementFlag::banked }, + /* TrackElemType::rightEighthBankToOrthogonal */ { TrackElementFlag::turnRight, TrackElementFlag::turnBanked, TrackElementFlag::banked }, + /* TrackElemType::diagFlat */ { TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagUp25 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagUp60 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagFlatToUp25 */ { TrackElementFlag::up, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagUp25ToUp60 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagUp60ToUp25 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagUp25ToFlat */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagDown60 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagFlatToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagDown25ToDown60 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagDown60ToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagDown25ToFlat */ { TrackElementFlag::down, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagFlatToUp60 */ { TrackElementFlag::up, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagUp60ToFlat */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::isSteepUp, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagFlatToDown60 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagDown60ToFlat */ { TrackElementFlag::down, TrackElementFlag::allowLiftHill }, + /* TrackElemType::diagFlatToLeftBank */ { TrackElementFlag::banked }, + /* TrackElemType::diagFlatToRightBank */ { TrackElementFlag::banked }, + /* TrackElemType::diagLeftBankToFlat */ { TrackElementFlag::banked }, + /* TrackElemType::diagRightBankToFlat */ { TrackElementFlag::banked }, + /* TrackElemType::diagLeftBankToUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::diagRightBankToUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::diagUp25ToLeftBank */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::diagUp25ToRightBank */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::diagLeftBankToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::diagRightBankToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::diagDown25ToLeftBank */ { TrackElementFlag::down }, + /* TrackElemType::diagDown25ToRightBank */ { TrackElementFlag::down }, + /* TrackElemType::diagLeftBank */ { TrackElementFlag::banked }, + /* TrackElemType::diagRightBank */ { TrackElementFlag::banked }, + /* TrackElemType::logFlumeReverser */ { TrackElementFlag::banked }, + /* TrackElemType::spinningTunnel */ { TrackElementFlag::banked }, + /* TrackElemType::leftBarrelRollUpToDown */ { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightBarrelRollUpToDown */ { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftBarrelRollDownToUp */ { TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightBarrelRollDownToUp */ { TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftBankToLeftQuarterTurn3TilesUp25 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::rightBankToRightQuarterTurn3TilesUp25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::rightQuarterTurn3TilesDown25ToRightBank */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::poweredLift */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::leftLargeHalfLoopUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightLargeHalfLoopUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftLargeHalfLoopDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightLargeHalfLoopDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftFlyerTwistUp */ { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightFlyerTwistUp */ { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftFlyerTwistDown */ { TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightFlyerTwistDown */ { TrackElementFlag::inversionToNormal }, + /* TrackElemType::flyerHalfLoopUninvertedUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::flyerHalfLoopInvertedDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftFlyerCorkscrewUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightFlyerCorkscrewUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftFlyerCorkscrewDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightFlyerCorkscrewDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::heartLineTransferUp */ {}, + /* TrackElemType::heartLineTransferDown */ {}, + /* TrackElemType::leftHeartLineRoll */ { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal, TrackElementFlag::canBePartlyUnderground }, + /* TrackElemType::rightHeartLineRoll */ { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal, TrackElementFlag::canBePartlyUnderground }, + /* TrackElemType::minigolfHoleA */ { TrackElementFlag::isGolfHole }, + /* TrackElemType::minigolfHoleB */ { TrackElementFlag::isGolfHole }, + /* TrackElemType::minigolfHoleC */ { TrackElementFlag::isGolfHole }, + /* TrackElemType::minigolfHoleD */ { TrackElementFlag::isGolfHole }, + /* TrackElemType::minigolfHoleE */ { TrackElementFlag::isGolfHole }, + /* TrackElemType::multiDimInvertedFlatToDown90QuarterLoop */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::up90ToInvertedFlatQuarterLoop */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::invertedFlatToDown90QuarterLoop */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftCurvedLiftHill */ { TrackElementFlag::turnLeft, TrackElementFlag::up }, + /* TrackElemType::rightCurvedLiftHill */ { TrackElementFlag::turnRight, TrackElementFlag::up }, + /* TrackElemType::leftReverser */ {}, + /* TrackElemType::rightReverser */ {}, + /* TrackElemType::airThrustTopCap */ {}, + /* TrackElemType::airThrustVerticalDown */ { TrackElementFlag::down }, + /* TrackElemType::airThrustVerticalDownToLevel */ { TrackElementFlag::down }, + /* TrackElemType::blockBrakes */ {}, + /* TrackElemType::leftBankedQuarterTurn3TileUp25 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankedQuarterTurn3TileUp25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankedQuarterTurn3TileDown25 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankedQuarterTurn3TileDown25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankedQuarterTurn5TileUp25 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankedQuarterTurn5TileUp25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankedQuarterTurn5TileDown25 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankedQuarterTurn5TileDown25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::up25ToLeftBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::up25ToRightBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankedUp25ToUp25 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankedUp25ToUp25 */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::down25ToLeftBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::down25ToRightBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankedDown25ToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankedDown25ToDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankedFlatToLeftBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::rightBankedFlatToRightBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::leftBankedUp25ToLeftBankedFlat */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankedUp25ToRightBankedFlat */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankedFlatToLeftBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankedFlatToRightBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankedDown25ToLeftBankedFlat */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::rightBankedDown25ToRightBankedFlat */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::flatToLeftBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::flatToRightBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::leftBankedUp25ToFlat */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::rightBankedUp25ToFlat */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::flatToLeftBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::flatToRightBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::banked }, + /* TrackElemType::leftBankedDown25ToFlat */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::rightBankedDown25ToFlat */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::leftQuarterTurn1TileUp90 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::up }, + /* TrackElemType::rightQuarterTurn1TileUp90 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up }, + /* TrackElemType::leftQuarterTurn1TileDown90 */ { TrackElementFlag::turnLeft, TrackElementFlag::turnSloped, TrackElementFlag::down }, + /* TrackElemType::rightQuarterTurn1TileDown90 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down }, + /* TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::multiDimFlatToDown90QuarterLoop */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rotationControlToggle */ {}, + /* TrackElemType::flatTrack1x4A */ {}, + /* TrackElemType::flatTrack2x2 */ {}, + /* TrackElemType::flatTrack4x4 */ {}, + /* TrackElemType::flatTrack2x4 */ { TrackElementFlag::onlyAboveGround }, + /* TrackElemType::flatTrack1x5 */ {}, + /* TrackElemType::flatTrack1x1A */ {}, + /* TrackElemType::flatTrack1x4B */ {}, + /* TrackElemType::flatTrack1x1B */ {}, + /* TrackElemType::flatTrack1x4C */ {}, + /* TrackElemType::flatTrack3x3 */ {}, + /* TrackElemType::leftLargeCorkscrewUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightLargeCorkscrewUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftLargeCorkscrewDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightLargeCorkscrewDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftMediumHalfLoopUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightMediumHalfLoopUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftMediumHalfLoopDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightMediumHalfLoopDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftZeroGRollUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightZeroGRollUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftZeroGRollDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightZeroGRollDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftLargeZeroGRollUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightLargeZeroGRollUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftLargeZeroGRollDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightLargeZeroGRollDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftFlyerLargeHalfLoopUninvertedUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::rightFlyerLargeHalfLoopUninvertedUp */ { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::leftFlyerLargeHalfLoopInvertedDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightFlyerLargeHalfLoopInvertedDown */ { TrackElementFlag::down, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftFlyerLargeHalfLoopInvertedUp */ { TrackElementFlag::up, TrackElementFlag::inversionToNormal, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::rightFlyerLargeHalfLoopInvertedUp */ { TrackElementFlag::up, TrackElementFlag::inversionToNormal, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::leftFlyerLargeHalfLoopUninvertedDown */ { TrackElementFlag::down, TrackElementFlag::normalToInversion }, + /* TrackElemType::rightFlyerLargeHalfLoopUninvertedDown */ { TrackElementFlag::down, TrackElementFlag::normalToInversion }, + /* TrackElemType::flyerHalfLoopInvertedUp */ { TrackElementFlag::up, TrackElementFlag::inversionToNormal, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::flyerHalfLoopUnivertedDown */ { TrackElementFlag::down, TrackElementFlag::normalToInversion }, + /* TrackElemType::leftEighthToDiagUp25 */ { TrackElementFlag::turnLeft , TrackElementFlag::turnSloped, TrackElementFlag::up , TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightEighthToDiagUp25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up , TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::leftEighthToDiagDown25 */ { TrackElementFlag::turnLeft , TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightEighthToDiagDown25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::leftEighthToOrthogonalUp25 */ { TrackElementFlag::turnLeft , TrackElementFlag::turnSloped, TrackElementFlag::up , TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightEighthToOrthogonalUp25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up , TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::leftEighthToOrthogonalDown25 */ { TrackElementFlag::turnLeft , TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightEighthToOrthogonalDown25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::diagUp25ToLeftBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagUp25ToRightBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagLeftBankedUp25ToUp25 */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagRightBankedUp25ToUp25 */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagDown25ToLeftBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagDown25ToRightBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagLeftBankedDown25ToDown25 */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagRightBankedDown25ToDown25 */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagLeftBankedFlatToLeftBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::diagRightBankedFlatToRightBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::diagLeftBankedUp25ToLeftBankedFlat */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagRightBankedUp25ToRightBankedFlat */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagLeftBankedFlatToLeftBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagRightBankedFlatToRightBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagLeftBankedDown25ToLeftBankedFlat */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::diagRightBankedDown25ToRightBankedFlat */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::diagFlatToLeftBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::diagFlatToRightBankedUp25 */ { TrackElementFlag::up, TrackElementFlag::banked }, + /* TrackElemType::diagLeftBankedUp25ToFlat */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagRightBankedUp25ToFlat */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagFlatToLeftBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagFlatToRightBankedDown25 */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagLeftBankedDown25ToFlat */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::diagRightBankedDown25ToFlat */ { TrackElementFlag::down, TrackElementFlag::banked }, + /* TrackElemType::up25LeftBanked */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::up25RightBanked */ { TrackElementFlag::up, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::down25LeftBanked */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::down25RightBanked */ { TrackElementFlag::down, TrackElementFlag::banked, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::leftEighthBankToDiagUp25 */ { TrackElementFlag::turnLeft , TrackElementFlag::turnSloped, TrackElementFlag::up , TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightEighthBankToDiagUp25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up , TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::leftEighthBankToDiagDown25 */ { TrackElementFlag::turnLeft , TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightEighthBankToDiagDown25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::leftEighthBankToOrthogonalUp25 */ { TrackElementFlag::turnLeft , TrackElementFlag::turnSloped, TrackElementFlag::up , TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightEighthBankToOrthogonalUp25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::up , TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::leftEighthBankToOrthogonalDown25 */ { TrackElementFlag::turnLeft , TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::rightEighthBankToOrthogonalDown25 */ { TrackElementFlag::turnRight, TrackElementFlag::turnSloped, TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::allowLiftHill, TrackElementFlag::curveAllowsLift }, + /* TrackElemType::diagBrakes */ {}, + /* TrackElemType::diagBlockBrakes */ {}, + /* TrackElemType::down25Brakes */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagBooster */ {}, + /* TrackElemType::diagFlatToUp60LongBase */ { TrackElementFlag::up, TrackElementFlag::isSteepUp }, + /* TrackElemType::diagUp60ToFlatLongBase */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::isSteepUp }, + /* TrackElemType::diagFlatToDown60LongBase */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + /* TrackElemType::diagDown60ToFlatLongBase */ { TrackElementFlag::down }, + /* TrackElemType::leftEighthDiveLoopUpToOrthogonal */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightEighthDiveLoopUpToOrthogonal */ { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal }, + /* TrackElemType::leftEighthDiveLoopDownToDiag */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::rightEighthDiveLoopDownToDiag */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal }, + /* TrackElemType::diagDown25Brakes */ { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight }, + }; + static_assert(std::size(kTrackFlags) == EnumValue(TrackElemType::count)); // clang-format on /** rct2: 0x00997C9D */ @@ -3065,358 +2707,358 @@ namespace OpenRCT2::TrackMetaData static constexpr TrackDefinition kTrackDefinitions[] = { // TYPE VANGLE END VANGLE START BANK END BANK START PREVIEW Z OFFSET - { TrackGroup::straight, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Flat - { TrackGroup::stationEnd, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::EndStation - { TrackGroup::stationEnd, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::BeginStation - { TrackGroup::stationEnd, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::MiddleStation - { TrackGroup::slope, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up25 - { TrackGroup::slopeSteepUp, TrackPitch::Up60, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up60 - { TrackGroup::slope, TrackPitch::Up25, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatToUp25 - { TrackGroup::slopeSteepUp, TrackPitch::Up60, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up25ToUp60 - { TrackGroup::slopeSteepUp, TrackPitch::Up25, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up60ToUp25 - { TrackGroup::slope, TrackPitch::None, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up25ToFlat - { TrackGroup::slope, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down25 - { TrackGroup::slopeSteepDown, TrackPitch::Down60, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down60 - { TrackGroup::slope, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatToDown25 - { TrackGroup::slopeSteepDown, TrackPitch::Down60, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down25ToDown60 - { TrackGroup::slopeSteepDown, TrackPitch::Down25, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down60ToDown25 - { TrackGroup::slope, TrackPitch::None, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down25ToFlat - { TrackGroup::curve, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn5Tiles - { TrackGroup::curve, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn5Tiles - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::FlatToLeftBank - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::FlatToRightBank - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::LeftBankToFlat - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::RightBankToFlat - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::BankedLeftQuarterTurn5Tiles - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::BankedRightQuarterTurn5Tiles - { TrackGroup::flatRollBanking, TrackPitch::Up25, TrackPitch::None, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::LeftBankToUp25 - { TrackGroup::flatRollBanking, TrackPitch::Up25, TrackPitch::None, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::RightBankToUp25 - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::Up25, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::Up25ToLeftBank - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::Up25, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::Up25ToRightBank - { TrackGroup::flatRollBanking, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::LeftBankToDown25 - { TrackGroup::flatRollBanking, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::RightBankToDown25 - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::Down25, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::Down25ToLeftBank - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::Down25, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::Down25ToRightBank - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBank - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBank - { TrackGroup::slopeCurve, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn5TilesUp25 - { TrackGroup::slopeCurve, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn5TilesUp25 - { TrackGroup::slopeCurve, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn5TilesDown25 - { TrackGroup::slopeCurve, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn5TilesDown25 - { TrackGroup::sBend, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::SBendLeft - { TrackGroup::sBend, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::SBendRight - { TrackGroup::verticalLoop, TrackPitch::Down25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, -48 }, // TrackElemType::LeftVerticalLoop - { TrackGroup::verticalLoop, TrackPitch::Down25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, -48 }, // TrackElemType::RightVerticalLoop - { TrackGroup::curveSmall, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn3Tiles - { TrackGroup::curveSmall, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn3Tiles - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedQuarterTurn3Tiles - { TrackGroup::flatRollBanking, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBankedQuarterTurn3Tiles - { TrackGroup::slopeCurve, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn3TilesUp25 - { TrackGroup::slopeCurve, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn3TilesUp25 - { TrackGroup::slopeCurve, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn3TilesDown25 - { TrackGroup::slopeCurve, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn3TilesDown25 - { TrackGroup::curveVerySmall, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn1Tile - { TrackGroup::curveVerySmall, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn1Tile - { TrackGroup::twist, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::LeftTwistDownToUp - { TrackGroup::twist, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::RightTwistDownToUp - { TrackGroup::twist, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, 0 }, // TrackElemType::LeftTwistUpToDown - { TrackGroup::twist, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, 0 }, // TrackElemType::RightTwistUpToDown - { TrackGroup::halfLoop, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::HalfLoopUp - { TrackGroup::halfLoop, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -64 }, // TrackElemType::HalfLoopDown - { TrackGroup::corkscrew, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::LeftCorkscrewUp - { TrackGroup::corkscrew, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::RightCorkscrewUp - { TrackGroup::corkscrew, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -32 }, // TrackElemType::LeftCorkscrewDown - { TrackGroup::corkscrew, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -32 }, // TrackElemType::RightCorkscrewDown - { TrackGroup::flatToSteepSlope, TrackPitch::Up60, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatToUp60 - { TrackGroup::flatToSteepSlope, TrackPitch::None, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up60ToFlat - { TrackGroup::flatToSteepSlope, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatToDown60 - { TrackGroup::flatToSteepSlope, TrackPitch::None, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down60ToFlat - { TrackGroup::tower, TrackPitch::Tower, TrackPitch::Tower, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::TowerBase - { TrackGroup::tower, TrackPitch::Tower, TrackPitch::Tower, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::TowerSection - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatCovered - { TrackGroup::flat, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up25Covered - { TrackGroup::flat, TrackPitch::Up60, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up60Covered - { TrackGroup::flat, TrackPitch::Up25, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatToUp25Covered - { TrackGroup::flat, TrackPitch::Up60, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up25ToUp60Covered - { TrackGroup::flat, TrackPitch::Up25, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up60ToUp25Covered - { TrackGroup::flat, TrackPitch::None, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up25ToFlatCovered - { TrackGroup::flat, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down25Covered - { TrackGroup::flat, TrackPitch::Down60, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down60Covered - { TrackGroup::flat, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatToDown25Covered - { TrackGroup::flat, TrackPitch::Down60, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down25ToDown60Covered - { TrackGroup::flat, TrackPitch::Down25, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down60ToDown25Covered - { TrackGroup::flat, TrackPitch::None, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down25ToFlatCovered - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn5TilesCovered - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn5TilesCovered - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::SBendLeftCovered - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::SBendRightCovered - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn3TilesCovered - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn3TilesCovered - { TrackGroup::helixUpBankedHalf, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftHalfBankedHelixUpSmall - { TrackGroup::helixUpBankedHalf, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightHalfBankedHelixUpSmall - { TrackGroup::helixDownBankedHalf, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftHalfBankedHelixDownSmall - { TrackGroup::helixDownBankedHalf, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightHalfBankedHelixDownSmall - { TrackGroup::helixUpBankedHalf, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftHalfBankedHelixUpLarge - { TrackGroup::helixUpBankedHalf, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightHalfBankedHelixUpLarge - { TrackGroup::helixDownBankedHalf, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftHalfBankedHelixDownLarge - { TrackGroup::helixDownBankedHalf, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightHalfBankedHelixDownLarge - { TrackGroup::slopeCurveSteep, TrackPitch::Up60, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn1TileUp60 - { TrackGroup::slopeCurveSteep, TrackPitch::Up60, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn1TileUp60 - { TrackGroup::slopeCurveSteep, TrackPitch::Down60, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn1TileDown60 - { TrackGroup::slopeCurveSteep, TrackPitch::Down60, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn1TileDown60 - { TrackGroup::brakes, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Brakes - { TrackGroup::booster, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Booster - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Maze - { TrackGroup::helixUpBankedQuarter, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftQuarterBankedHelixLargeUp - { TrackGroup::helixUpBankedQuarter, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightQuarterBankedHelixLargeUp - { TrackGroup::helixDownBankedQuarter, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftQuarterBankedHelixLargeDown - { TrackGroup::helixDownBankedQuarter, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightQuarterBankedHelixLargeDown - { TrackGroup::helixUpUnbankedQuarter, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterHelixLargeUp - { TrackGroup::helixUpUnbankedQuarter, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterHelixLargeUp - { TrackGroup::helixDownUnbankedQuarter, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterHelixLargeDown - { TrackGroup::helixDownUnbankedQuarter, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterHelixLargeDown - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::Up25LeftBanked - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::Up25RightBanked - { TrackGroup::waterfall, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Waterfall - { TrackGroup::rapids, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Rapids - { TrackGroup::onridePhoto, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::OnRidePhoto - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::Down25LeftBanked - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::Down25RightBanked - { TrackGroup::waterSplash, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Watersplash - { TrackGroup::slopeSteepLong, TrackPitch::Up60, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatToUp60LongBase - { TrackGroup::slopeSteepLong, TrackPitch::None, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up60ToFlatLongBase - { TrackGroup::whirlpool, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Whirlpool - { TrackGroup::slopeSteepLong, TrackPitch::None, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down60ToFlatLongBase - { TrackGroup::slopeSteepLong, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatToDown60LongBase - { TrackGroup::liftHillCable, TrackPitch::Down60, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::CableLiftHill - { TrackGroup::reverseFreefall, TrackPitch::ReverseFreefall, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::ReverseFreefallSlope - { TrackGroup::reverseFreefall, TrackPitch::ReverseFreefall, TrackPitch::ReverseFreefall,TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::ReverseFreefallVertical - { TrackGroup::flat, TrackPitch::Up90, TrackPitch::Up90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up90 - { TrackGroup::flat, TrackPitch::Down90, TrackPitch::Down90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down90 - { TrackGroup::flat, TrackPitch::Up90, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up60ToUp90 - { TrackGroup::flat, TrackPitch::Down60, TrackPitch::Down90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down90ToDown60 - { TrackGroup::flat, TrackPitch::Up60, TrackPitch::Up90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Up90ToUp60 - { TrackGroup::flat, TrackPitch::Down90, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down60ToDown90 - { TrackGroup::brakeForDrop, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::BrakeForDrop - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftEighthToDiag - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightEighthToDiag - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftEighthToOrthogonal - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightEighthToOrthogonal - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftEighthBankToDiag - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightEighthBankToDiag - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftEighthBankToOrthogonal - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightEighthBankToOrthogonal - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagFlat - { TrackGroup::diagSlope, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagUp25 - { TrackGroup::diagSlopeSteepUp, TrackPitch::Up60, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagUp60 - { TrackGroup::diagSlope, TrackPitch::Up25, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToUp25 - { TrackGroup::diagSlopeSteepUp, TrackPitch::Up60, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagUp25ToUp60 - { TrackGroup::diagSlopeSteepUp, TrackPitch::Up25, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagUp60ToUp25 - { TrackGroup::diagSlope, TrackPitch::None, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagUp25ToFlat - { TrackGroup::diagSlope, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagDown25 - { TrackGroup::diagSlopeSteepDown, TrackPitch::Down60, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagDown60 - { TrackGroup::diagSlope, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToDown25 - { TrackGroup::diagSlopeSteepDown, TrackPitch::Down60, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagDown25ToDown60 - { TrackGroup::diagSlopeSteepDown, TrackPitch::Down25, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagDown60ToDown25 - { TrackGroup::diagSlope, TrackPitch::None, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagDown25ToFlat - { TrackGroup::diagSlopeSteepUp, TrackPitch::Up60, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToUp60 - { TrackGroup::diagSlopeSteepUp, TrackPitch::None, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagUp60ToFlat - { TrackGroup::diagSlopeSteepDown, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToDown60 - { TrackGroup::diagSlopeSteepDown, TrackPitch::None, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagDown60ToFlat - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToLeftBank - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToRightBank - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankToFlat - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankToFlat - { TrackGroup::flat, TrackPitch::Up25, TrackPitch::None, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankToUp25 - { TrackGroup::flat, TrackPitch::Up25, TrackPitch::None, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankToUp25 - { TrackGroup::flat, TrackPitch::None, TrackPitch::Up25, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::DiagUp25ToLeftBank - { TrackGroup::flat, TrackPitch::None, TrackPitch::Up25, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::DiagUp25ToRightBank - { TrackGroup::flat, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankToDown25 - { TrackGroup::flat, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankToDown25 - { TrackGroup::flat, TrackPitch::None, TrackPitch::Down25, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::DiagDown25ToLeftBank - { TrackGroup::flat, TrackPitch::None, TrackPitch::Down25, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::DiagDown25ToRightBank - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBank - { TrackGroup::flat, TrackPitch::None, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBank - { TrackGroup::logFlumeReverser, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LogFlumeReverser - { TrackGroup::spinningTunnel, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::SpinningTunnel - { TrackGroup::barrelRoll, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::LeftBarrelRollUpToDown - { TrackGroup::barrelRoll, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::RightBarrelRollUpToDown - { TrackGroup::barrelRoll, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, 0 }, // TrackElemType::LeftBarrelRollDownToUp - { TrackGroup::barrelRoll, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, 0 }, // TrackElemType::RightBarrelRollDownToUp - { TrackGroup::flat, TrackPitch::Up25, TrackPitch::None, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25 - { TrackGroup::flat, TrackPitch::Up25, TrackPitch::None, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::RightBankToRightQuarterTurn3TilesUp25 - { TrackGroup::flat, TrackPitch::None, TrackPitch::Down25, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank - { TrackGroup::flat, TrackPitch::None, TrackPitch::Down25, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn3TilesDown25ToRightBank - { TrackGroup::poweredLift, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::PoweredLift - {TrackGroup::halfLoopLarge, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::LeftLargeHalfLoopUp - {TrackGroup::halfLoopLarge, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::RightLargeHalfLoopUp - {TrackGroup::halfLoopLarge, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -64 }, // TrackElemType::LeftLargeHalfLoopDown - {TrackGroup::halfLoopLarge, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -64 }, // TrackElemType::RightLargeHalfLoopDown - {TrackGroup::inlineTwistUninverted, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::LeftFlyerTwistUp - {TrackGroup::inlineTwistUninverted, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::RightFlyerTwistUp - {TrackGroup::inlineTwistInverted, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::LeftFlyerTwistDown - {TrackGroup::inlineTwistInverted, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::RightFlyerTwistDown - {TrackGroup::flyingHalfLoopUninvertedUp, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::FlyerHalfLoopUninvertedUp - {TrackGroup::flyingHalfLoopInvertedDown, TrackPitch::Down25, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, -64 }, // TrackElemType::FlyerHalfLoopInvertedDown - {TrackGroup::corkscrewUninverted, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::LeftFlyerCorkscrewUp - {TrackGroup::corkscrewUninverted, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::RightFlyerCorkscrewUp - {TrackGroup::corkscrewInverted, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, -32 }, // TrackElemType::LeftFlyerCorkscrewDown - {TrackGroup::corkscrewInverted, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, -32 }, // TrackElemType::RightFlyerCorkscrewDown - {TrackGroup::heartlineTransfer, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::HeartLineTransferUp - {TrackGroup::heartlineTransfer, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::HeartLineTransferDown - {TrackGroup::heartlineRoll, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftHeartLineRoll - {TrackGroup::heartlineRoll, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightHeartLineRoll - {TrackGroup::miniGolfHole, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::MinigolfHoleA - {TrackGroup::miniGolfHole, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::MinigolfHoleB - {TrackGroup::miniGolfHole, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::MinigolfHoleC - {TrackGroup::miniGolfHole, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::MinigolfHoleD - {TrackGroup::miniGolfHole, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::MinigolfHoleE - { TrackGroup::quarterLoopInvertedDown, TrackPitch::Down90, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop - { TrackGroup::quarterLoop, TrackPitch::None, TrackPitch::Up90, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::Up90ToInvertedFlatQuarterLoop - { TrackGroup::quarterLoop, TrackPitch::Down90, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, 0 }, // TrackElemType::InvertedFlatToDown90QuarterLoop - { TrackGroup::liftHillCurved, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftCurvedLiftHill - { TrackGroup::liftHillCurved, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightCurvedLiftHill - { TrackGroup::reverser, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftReverser - { TrackGroup::reverser, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightReverser - { TrackGroup::slopeToFlat, TrackPitch::Down90, TrackPitch::Up90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::AirThrustTopCap - { TrackGroup::slopeToFlat, TrackPitch::Down90, TrackPitch::Down90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::AirThrustVerticalDown - { TrackGroup::slopeToFlat, TrackPitch::None, TrackPitch::Down90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::AirThrustVerticalDownToLevel - { TrackGroup::blockBrakes, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::BlockBrakes - { TrackGroup::slopeCurve, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedQuarterTurn3TileUp25 - { TrackGroup::slopeCurve, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBankedQuarterTurn3TileUp25 - { TrackGroup::slopeCurve, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedQuarterTurn3TileDown25 - { TrackGroup::slopeCurve, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBankedQuarterTurn3TileDown25 - { TrackGroup::slopeCurve, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedQuarterTurn5TileUp25 - { TrackGroup::slopeCurve, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBankedQuarterTurn5TileUp25 - { TrackGroup::slopeCurve, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedQuarterTurn5TileDown25 - { TrackGroup::slopeCurve, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBankedQuarterTurn5TileDown25 - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::Up25ToLeftBankedUp25 - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::Up25ToRightBankedUp25 - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedUp25ToUp25 - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::RightBankedUp25ToUp25 - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::Down25ToLeftBankedDown25 - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::Down25ToRightBankedDown25 - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedDown25ToDown25 - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::RightBankedDown25ToDown25 - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedFlatToLeftBankedUp25 - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBankedFlatToRightBankedUp25 - { TrackGroup::slopeRollBanking, TrackPitch::None, TrackPitch::Up25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedUp25ToLeftBankedFlat - { TrackGroup::slopeRollBanking, TrackPitch::None, TrackPitch::Up25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBankedUp25ToRightBankedFlat - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedFlatToLeftBankedDown25 - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBankedFlatToRightBankedDown25 - { TrackGroup::slopeRollBanking, TrackPitch::None, TrackPitch::Down25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedDown25ToLeftBankedFlat - { TrackGroup::slopeRollBanking, TrackPitch::None, TrackPitch::Down25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::RightBankedDown25ToRightBankedFlat - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::None, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::FlatToLeftBankedUp25 - { TrackGroup::slopeRollBanking, TrackPitch::Up25, TrackPitch::None, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::FlatToRightBankedUp25 - { TrackGroup::slopeRollBanking, TrackPitch::None, TrackPitch::Up25, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedUp25ToFlat - { TrackGroup::slopeRollBanking, TrackPitch::None, TrackPitch::Up25, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::RightBankedUp25ToFlat - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::None, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::FlatToLeftBankedDown25 - { TrackGroup::slopeRollBanking, TrackPitch::Down25, TrackPitch::None, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::FlatToRightBankedDown25 - { TrackGroup::slopeRollBanking, TrackPitch::None, TrackPitch::Down25, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::LeftBankedDown25ToFlat - { TrackGroup::slopeRollBanking, TrackPitch::None, TrackPitch::Down25, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::RightBankedDown25ToFlat - { TrackGroup::slopeCurveSteep, TrackPitch::Up90, TrackPitch::Up90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn1TileUp90 - { TrackGroup::slopeCurveSteep, TrackPitch::Up90, TrackPitch::Up90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn1TileUp90 - { TrackGroup::slopeCurveSteep, TrackPitch::Down90, TrackPitch::Down90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::LeftQuarterTurn1TileDown90 - { TrackGroup::slopeCurveSteep, TrackPitch::Down90, TrackPitch::Down90, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RightQuarterTurn1TileDown90 - { TrackGroup::quarterLoopUninvertedUp, TrackPitch::None, TrackPitch::Up90, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop - { TrackGroup::quarterLoopUninvertedDown, TrackPitch::Down90, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::MultiDimFlatToDown90QuarterLoop - { TrackGroup::quarterLoopInvertedUp, TrackPitch::None, TrackPitch::Up90, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop - { TrackGroup::rotationControlToggle, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::RotationControlToggle - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatTrack1x4A - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatTrack2x2 - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatTrack4x4 - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatTrack2x4 - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatTrack1x5 - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatTrack1x1A - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatTrack1x4B - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatTrack1x1B - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, -40 }, // TrackElemType::FlatTrack1x4C - { TrackGroup::flatRideBase, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::FlatTrack3x3 - { TrackGroup::corkscrewLarge, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 32 }, // TrackElemType::LeftLargeCorkscrewUp - { TrackGroup::corkscrewLarge, TrackPitch::None, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, 32 }, // TrackElemType::RightLargeCorkscrewUp - { TrackGroup::corkscrewLarge, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -32 }, // TrackElemType::LeftLargeCorkscrewDown - { TrackGroup::corkscrewLarge, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -32 }, // TrackElemType::RightLargeCorkscrewDown - { TrackGroup::halfLoopMedium, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::LeftMediumHalfLoopUp - { TrackGroup::halfLoopMedium, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::RightMediumHalfLoopUp - { TrackGroup::halfLoopMedium, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -64 }, // TrackElemType::LeftMediumHalfLoopDown - { TrackGroup::halfLoopMedium, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -64 }, // TrackElemType::RightMediumHalfLoopDown - { TrackGroup::zeroGRoll, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::LeftZeroGRollUp - { TrackGroup::zeroGRoll, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 0 }, // TrackElemType::RightZeroGRollUp - { TrackGroup::zeroGRoll, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, 0 }, // TrackElemType::LeftZeroGRollDown - { TrackGroup::zeroGRoll, TrackPitch::Down25, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, 0 }, // TrackElemType::RightZeroGRollDown - { TrackGroup::zeroGRollLarge, TrackPitch::None, TrackPitch::Up60, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::LeftLargeZeroGRollUp - { TrackGroup::zeroGRollLarge, TrackPitch::None, TrackPitch::Up60, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::RightLargeZeroGRollUp - { TrackGroup::zeroGRollLarge, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -64 }, // TrackElemType::LeftLargeZeroGRollDown - { TrackGroup::zeroGRollLarge, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -64 }, // TrackElemType::RightLargeZeroGRollDown - { TrackGroup::flyingLargeHalfLoopUninvertedUp, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp - { TrackGroup::flyingLargeHalfLoopUninvertedUp, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::RightFlyerLargeHalfLoopUninvertedUp - { TrackGroup::flyingLargeHalfLoopInvertedDown, TrackPitch::Down25, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, -64 }, // TrackElemType::LeftFlyerLargeHalfLoopInvertedDown - { TrackGroup::flyingLargeHalfLoopInvertedDown, TrackPitch::Down25, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, -64 }, // TrackElemType::RightFlyerLargeHalfLoopInvertedDown - { TrackGroup::flyingLargeHalfLoopInvertedUp, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::LeftFlyerLargeHalfLoopInvertedUp - { TrackGroup::flyingLargeHalfLoopInvertedUp, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::RightFlyerLargeHalfLoopInvertedUp - { TrackGroup::flyingLargeHalfLoopUninvertedDown, TrackPitch::Down25, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, -64 }, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown - { TrackGroup::flyingLargeHalfLoopUninvertedDown, TrackPitch::Down25, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, -64 }, // TrackElemType::RightFlyerLargeHalfLoopUninvertedDown - { TrackGroup::flyingHalfLoopInvertedUp, TrackPitch::None, TrackPitch::Up25, TrackRoll::UpsideDown, TrackRoll::None, 64 }, // TrackElemType::FlyerHalfLoopInvertedUp - { TrackGroup::flyingHalfLoopUninvertedDown, TrackPitch::Down25, TrackPitch::None, TrackRoll::UpsideDown, TrackRoll::None, -64 }, // TrackElemType::FlyerHalfLoopUninvertedDown - { TrackGroup::slopeCurveLarge, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 16 }, // TrackElemType::LeftEighthToDiagUp25 - { TrackGroup::slopeCurveLarge, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 16 }, // TrackElemType::RightEighthToDiagUp25 - { TrackGroup::slopeCurveLarge, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, -16 }, // TrackElemType::LeftEighthToDiagDown25 - { TrackGroup::slopeCurveLarge, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, -16 }, // TrackElemType::RightEighthToDiagDown25 - { TrackGroup::slopeCurveLarge, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 16 }, // TrackElemType::LeftEighthToOrthogonalUp25 - { TrackGroup::slopeCurveLarge, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::None, 16 }, // TrackElemType::RightEighthToOrthogonalUp25 - { TrackGroup::slopeCurveLarge, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, -16 }, // TrackElemType::LeftEighthToOrthogonalDown25 - { TrackGroup::slopeCurveLarge, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, -16 }, // TrackElemType::RightEighthToOrthogonalDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::DiagUp25ToLeftBankedUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::DiagUp25ToRightBankedUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankedUp25ToUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankedUp25ToUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::DiagDown25ToLeftBankedDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::DiagDown25ToRightBankedDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankedDown25ToDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankedDown25ToDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::None, TrackPitch::Up25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - { TrackGroup::slopeCurveLargeBanked, TrackPitch::None, TrackPitch::Up25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::None, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::None, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankedFlatToRightBankedDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::None, TrackPitch::Down25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - { TrackGroup::slopeCurveLargeBanked, TrackPitch::None, TrackPitch::Down25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankedDown25ToRightBankedFlat - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::None, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToLeftBankedUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::None, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToRightBankedUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::None, TrackPitch::Up25, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankedUp25ToFlat - { TrackGroup::slopeCurveLargeBanked, TrackPitch::None, TrackPitch::Up25, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankedUp25ToFlat - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::None, TrackRoll::Left, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToLeftBankedDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::None, TrackRoll::Right, TrackRoll::None, 0 }, // TrackElemType::DiagFlatToRightBankedDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::None, TrackPitch::Down25, TrackRoll::None, TrackRoll::Left, 0 }, // TrackElemType::DiagLeftBankedDown25ToFlat - { TrackGroup::slopeCurveLargeBanked, TrackPitch::None, TrackPitch::Down25, TrackRoll::None, TrackRoll::Right, 0 }, // TrackElemType::DiagRightBankedDown25ToFlat - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::Up25LeftBanked - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::Up25RightBanked - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Left, TrackRoll::Left, 0 }, // TrackElemType::Down25LeftBanked - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Right, TrackRoll::Right, 0 }, // TrackElemType::Down25RightBanked - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Left, TrackRoll::Left, 16 }, // TrackElemType::LeftEighthBankToDiagUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Right, TrackRoll::Right, 16 }, // TrackElemType::RightEighthBankToDiagUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Left, TrackRoll::Left, -16 }, // TrackElemType::LeftEighthBankToDiagDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Right, TrackRoll::Right, -16 }, // TrackElemType::RightEighthBankToDiagDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Left, TrackRoll::Left, 16 }, // TrackElemType::LeftEighthBankToOrthogonalUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Up25, TrackPitch::Up25, TrackRoll::Right, TrackRoll::Right, 16 }, // TrackElemType::RightEighthBankToOrthogonalUp25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Left, TrackRoll::Left, -16 }, // TrackElemType::LeftEighthBankToOrthogonalDown25 - { TrackGroup::slopeCurveLargeBanked, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::Right, TrackRoll::Right, -16 }, // TrackElemType::RightEighthBankToOrthogonalDown25 - { TrackGroup::diagBrakes, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagBrakes - { TrackGroup::diagBlockBrakes, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagBlockBrakes - { TrackGroup::inclinedBrakes, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down25Brakes - { TrackGroup::diagBooster, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagBooster - { TrackGroup::slopeSteepLong, TrackPitch::Up60, TrackPitch::None, TrackRoll::None, TrackRoll::None, 16 }, // TrackElemType::DiagFlatToUp60LongBase, - { TrackGroup::slopeSteepLong, TrackPitch::None, TrackPitch::Up60, TrackRoll::None, TrackRoll::None, 48 }, // TrackElemType::DiagUp60ToFlatLongBase, - { TrackGroup::slopeSteepLong, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::None, -32 }, // TrackElemType::DiagFlatToDown60LongBase, - { TrackGroup::slopeSteepLong, TrackPitch::None, TrackPitch::Down60, TrackRoll::None, TrackRoll::None, -24 }, // TrackElemType::DiagDown60ToFlatLongBase, - { TrackGroup::diveLoop, TrackPitch::None, TrackPitch::Up60, TrackRoll::UpsideDown, TrackRoll::None, 56 }, // TrackElemType::LeftEighthDiveLoopUpToOrthogonal - { TrackGroup::diveLoop, TrackPitch::None, TrackPitch::Up60, TrackRoll::UpsideDown, TrackRoll::None, 56 }, // TrackElemType::RightEighthDiveLoopUpToOrthogonal - { TrackGroup::diveLoop, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -56 }, // TrackElemType::LeftEighthDiveLoopDownToDiag - { TrackGroup::diveLoop, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -56 }, // TrackElemType::RightEighthDiveLoopDownToDiag - { TrackGroup::inclinedBrakes, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagDown25 - }; - static_assert(std::size(kTrackDefinitions) == EnumValue(TrackElemType::Count)); + { TrackGroup::straight, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flat + { TrackGroup::stationEnd, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::endStation + { TrackGroup::stationEnd, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::beginStation + { TrackGroup::stationEnd, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::middleStation + { TrackGroup::slope, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up25 + { TrackGroup::slopeSteepUp, TrackPitch::up60, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up60 + { TrackGroup::slope, TrackPitch::up25, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatToUp25 + { TrackGroup::slopeSteepUp, TrackPitch::up60, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up25ToUp60 + { TrackGroup::slopeSteepUp, TrackPitch::up25, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up60ToUp25 + { TrackGroup::slope, TrackPitch::none, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up25ToFlat + { TrackGroup::slope, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down25 + { TrackGroup::slopeSteepDown, TrackPitch::down60, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down60 + { TrackGroup::slope, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatToDown25 + { TrackGroup::slopeSteepDown, TrackPitch::down60, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down25ToDown60 + { TrackGroup::slopeSteepDown, TrackPitch::down25, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down60ToDown25 + { TrackGroup::slope, TrackPitch::none, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down25ToFlat + { TrackGroup::curve, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn5Tiles + { TrackGroup::curve, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn5Tiles + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::flatToLeftBank + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::flatToRightBank + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::leftBankToFlat + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::rightBankToFlat + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::bankedLeftQuarterTurn5Tiles + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::bankedRightQuarterTurn5Tiles + { TrackGroup::flatRollBanking, TrackPitch::up25, TrackPitch::none, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::leftBankToUp25 + { TrackGroup::flatRollBanking, TrackPitch::up25, TrackPitch::none, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::rightBankToUp25 + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::up25, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::up25ToLeftBank + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::up25, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::up25ToRightBank + { TrackGroup::flatRollBanking, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::leftBankToDown25 + { TrackGroup::flatRollBanking, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::rightBankToDown25 + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::down25, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::down25ToLeftBank + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::down25, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::down25ToRightBank + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBank + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBank + { TrackGroup::slopeCurve, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn5TilesUp25 + { TrackGroup::slopeCurve, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn5TilesUp25 + { TrackGroup::slopeCurve, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn5TilesDown25 + { TrackGroup::slopeCurve, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn5TilesDown25 + { TrackGroup::sBend, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::sBendLeft + { TrackGroup::sBend, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::sBendRight + { TrackGroup::verticalLoop, TrackPitch::down25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, -48 }, // TrackElemType::leftVerticalLoop + { TrackGroup::verticalLoop, TrackPitch::down25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, -48 }, // TrackElemType::rightVerticalLoop + { TrackGroup::curveSmall, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn3Tiles + { TrackGroup::curveSmall, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn3Tiles + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBankedQuarterTurn3Tiles + { TrackGroup::flatRollBanking, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBankedQuarterTurn3Tiles + { TrackGroup::slopeCurve, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn3TilesUp25 + { TrackGroup::slopeCurve, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn3TilesUp25 + { TrackGroup::slopeCurve, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn3TilesDown25 + { TrackGroup::slopeCurve, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn3TilesDown25 + { TrackGroup::curveVerySmall, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn1Tile + { TrackGroup::curveVerySmall, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn1Tile + { TrackGroup::twist, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::leftTwistDownToUp + { TrackGroup::twist, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::rightTwistDownToUp + { TrackGroup::twist, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, 0 }, // TrackElemType::leftTwistUpToDown + { TrackGroup::twist, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, 0 }, // TrackElemType::rightTwistUpToDown + { TrackGroup::halfLoop, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::halfLoopUp + { TrackGroup::halfLoop, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -64 }, // TrackElemType::halfLoopDown + { TrackGroup::corkscrew, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::leftCorkscrewUp + { TrackGroup::corkscrew, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::rightCorkscrewUp + { TrackGroup::corkscrew, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -32 }, // TrackElemType::leftCorkscrewDown + { TrackGroup::corkscrew, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -32 }, // TrackElemType::rightCorkscrewDown + { TrackGroup::flatToSteepSlope, TrackPitch::up60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatToUp60 + { TrackGroup::flatToSteepSlope, TrackPitch::none, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up60ToFlat + { TrackGroup::flatToSteepSlope, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatToDown60 + { TrackGroup::flatToSteepSlope, TrackPitch::none, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down60ToFlat + { TrackGroup::tower, TrackPitch::tower, TrackPitch::tower, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::towerBase + { TrackGroup::tower, TrackPitch::tower, TrackPitch::tower, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::towerSection + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatCovered + { TrackGroup::flat, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up25Covered + { TrackGroup::flat, TrackPitch::up60, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up60Covered + { TrackGroup::flat, TrackPitch::up25, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatToUp25Covered + { TrackGroup::flat, TrackPitch::up60, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up25ToUp60Covered + { TrackGroup::flat, TrackPitch::up25, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up60ToUp25Covered + { TrackGroup::flat, TrackPitch::none, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up25ToFlatCovered + { TrackGroup::flat, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down25Covered + { TrackGroup::flat, TrackPitch::down60, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down60Covered + { TrackGroup::flat, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatToDown25Covered + { TrackGroup::flat, TrackPitch::down60, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down25ToDown60Covered + { TrackGroup::flat, TrackPitch::down25, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down60ToDown25Covered + { TrackGroup::flat, TrackPitch::none, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down25ToFlatCovered + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn5TilesCovered + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn5TilesCovered + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::sBendLeftCovered + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::sBendRightCovered + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn3TilesCovered + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn3TilesCovered + { TrackGroup::helixUpBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftHalfBankedHelixUpSmall + { TrackGroup::helixUpBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightHalfBankedHelixUpSmall + { TrackGroup::helixDownBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftHalfBankedHelixDownSmall + { TrackGroup::helixDownBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightHalfBankedHelixDownSmall + { TrackGroup::helixUpBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftHalfBankedHelixUpLarge + { TrackGroup::helixUpBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightHalfBankedHelixUpLarge + { TrackGroup::helixDownBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftHalfBankedHelixDownLarge + { TrackGroup::helixDownBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightHalfBankedHelixDownLarge + { TrackGroup::slopeCurveSteep, TrackPitch::up60, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn1TileUp60 + { TrackGroup::slopeCurveSteep, TrackPitch::up60, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn1TileUp60 + { TrackGroup::slopeCurveSteep, TrackPitch::down60, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn1TileDown60 + { TrackGroup::slopeCurveSteep, TrackPitch::down60, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn1TileDown60 + { TrackGroup::brakes, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::brakes + { TrackGroup::booster, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::booster + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::maze + { TrackGroup::helixUpBankedQuarter, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftQuarterBankedHelixLargeUp + { TrackGroup::helixUpBankedQuarter, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightQuarterBankedHelixLargeUp + { TrackGroup::helixDownBankedQuarter, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftQuarterBankedHelixLargeDown + { TrackGroup::helixDownBankedQuarter, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightQuarterBankedHelixLargeDown + { TrackGroup::helixUpUnbankedQuarter, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterHelixLargeUp + { TrackGroup::helixUpUnbankedQuarter, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterHelixLargeUp + { TrackGroup::helixDownUnbankedQuarter, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterHelixLargeDown + { TrackGroup::helixDownUnbankedQuarter, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterHelixLargeDown + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::up25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::up25LeftBanked + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::up25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::up25RightBanked + { TrackGroup::waterfall, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::waterfall + { TrackGroup::rapids, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rapids + { TrackGroup::onridePhoto, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::onRidePhoto + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::down25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::down25LeftBanked + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::down25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::down25RightBanked + { TrackGroup::waterSplash, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::watersplash + { TrackGroup::slopeSteepLong, TrackPitch::up60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatToUp60LongBase + { TrackGroup::slopeSteepLong, TrackPitch::none, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up60ToFlatLongBase + { TrackGroup::whirlpool, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::whirlpool + { TrackGroup::slopeSteepLong, TrackPitch::none, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down60ToFlatLongBase + { TrackGroup::slopeSteepLong, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatToDown60LongBase + { TrackGroup::liftHillCable, TrackPitch::down60, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::cableLiftHill + { TrackGroup::reverseFreefall, TrackPitch::reverseFreefall, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::reverseFreefallSlope + { TrackGroup::reverseFreefall, TrackPitch::reverseFreefall, TrackPitch::reverseFreefall,TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::reverseFreefallVertical + { TrackGroup::flat, TrackPitch::up90, TrackPitch::up90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up90 + { TrackGroup::flat, TrackPitch::down90, TrackPitch::down90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down90 + { TrackGroup::flat, TrackPitch::up90, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up60ToUp90 + { TrackGroup::flat, TrackPitch::down60, TrackPitch::down90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down90ToDown60 + { TrackGroup::flat, TrackPitch::up60, TrackPitch::up90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::up90ToUp60 + { TrackGroup::flat, TrackPitch::down90, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down60ToDown90 + { TrackGroup::brakeForDrop, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::brakeForDrop + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftEighthToDiag + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightEighthToDiag + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftEighthToOrthogonal + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightEighthToOrthogonal + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftEighthBankToDiag + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightEighthBankToDiag + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftEighthBankToOrthogonal + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightEighthBankToOrthogonal + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagFlat + { TrackGroup::diagSlope, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagUp25 + { TrackGroup::diagSlopeSteepUp, TrackPitch::up60, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagUp60 + { TrackGroup::diagSlope, TrackPitch::up25, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagFlatToUp25 + { TrackGroup::diagSlopeSteepUp, TrackPitch::up60, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagUp25ToUp60 + { TrackGroup::diagSlopeSteepUp, TrackPitch::up25, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagUp60ToUp25 + { TrackGroup::diagSlope, TrackPitch::none, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagUp25ToFlat + { TrackGroup::diagSlope, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagDown25 + { TrackGroup::diagSlopeSteepDown, TrackPitch::down60, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagDown60 + { TrackGroup::diagSlope, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagFlatToDown25 + { TrackGroup::diagSlopeSteepDown, TrackPitch::down60, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagDown25ToDown60 + { TrackGroup::diagSlopeSteepDown, TrackPitch::down25, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagDown60ToDown25 + { TrackGroup::diagSlope, TrackPitch::none, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagDown25ToFlat + { TrackGroup::diagSlopeSteepUp, TrackPitch::up60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagFlatToUp60 + { TrackGroup::diagSlopeSteepUp, TrackPitch::none, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagUp60ToFlat + { TrackGroup::diagSlopeSteepDown, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagFlatToDown60 + { TrackGroup::diagSlopeSteepDown, TrackPitch::none, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagDown60ToFlat + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::diagFlatToLeftBank + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::diagFlatToRightBank + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankToFlat + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::diagRightBankToFlat + { TrackGroup::flat, TrackPitch::up25, TrackPitch::none, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankToUp25 + { TrackGroup::flat, TrackPitch::up25, TrackPitch::none, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::diagRightBankToUp25 + { TrackGroup::flat, TrackPitch::none, TrackPitch::up25, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::diagUp25ToLeftBank + { TrackGroup::flat, TrackPitch::none, TrackPitch::up25, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::diagUp25ToRightBank + { TrackGroup::flat, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankToDown25 + { TrackGroup::flat, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::diagRightBankToDown25 + { TrackGroup::flat, TrackPitch::none, TrackPitch::down25, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::diagDown25ToLeftBank + { TrackGroup::flat, TrackPitch::none, TrackPitch::down25, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::diagDown25ToRightBank + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::diagLeftBank + { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::diagRightBank + { TrackGroup::logFlumeReverser, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::logFlumeReverser + { TrackGroup::spinningTunnel, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::spinningTunnel + { TrackGroup::barrelRoll, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::leftBarrelRollUpToDown + { TrackGroup::barrelRoll, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::rightBarrelRollUpToDown + { TrackGroup::barrelRoll, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, 0 }, // TrackElemType::leftBarrelRollDownToUp + { TrackGroup::barrelRoll, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, 0 }, // TrackElemType::rightBarrelRollDownToUp + { TrackGroup::flat, TrackPitch::up25, TrackPitch::none, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::leftBankToLeftQuarterTurn3TilesUp25 + { TrackGroup::flat, TrackPitch::up25, TrackPitch::none, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::rightBankToRightQuarterTurn3TilesUp25 + { TrackGroup::flat, TrackPitch::none, TrackPitch::down25, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank + { TrackGroup::flat, TrackPitch::none, TrackPitch::down25, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn3TilesDown25ToRightBank + { TrackGroup::poweredLift, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::poweredLift + {TrackGroup::halfLoopLarge, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::leftLargeHalfLoopUp + {TrackGroup::halfLoopLarge, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::rightLargeHalfLoopUp + {TrackGroup::halfLoopLarge, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -64 }, // TrackElemType::leftLargeHalfLoopDown + {TrackGroup::halfLoopLarge, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -64 }, // TrackElemType::rightLargeHalfLoopDown + {TrackGroup::inlineTwistUninverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::leftFlyerTwistUp + {TrackGroup::inlineTwistUninverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::rightFlyerTwistUp + {TrackGroup::inlineTwistInverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::leftFlyerTwistDown + {TrackGroup::inlineTwistInverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::rightFlyerTwistDown + {TrackGroup::flyingHalfLoopUninvertedUp, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::flyerHalfLoopUninvertedUp + {TrackGroup::flyingHalfLoopInvertedDown, TrackPitch::down25, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, -64 }, // TrackElemType::flyerHalfLoopInvertedDown + {TrackGroup::corkscrewUninverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::leftFlyerCorkscrewUp + {TrackGroup::corkscrewUninverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::rightFlyerCorkscrewUp + {TrackGroup::corkscrewInverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, -32 }, // TrackElemType::leftFlyerCorkscrewDown + {TrackGroup::corkscrewInverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, -32 }, // TrackElemType::rightFlyerCorkscrewDown + {TrackGroup::heartlineTransfer, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::heartLineTransferUp + {TrackGroup::heartlineTransfer, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::heartLineTransferDown + {TrackGroup::heartlineRoll, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftHeartLineRoll + {TrackGroup::heartlineRoll, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightHeartLineRoll + {TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::minigolfHoleA + {TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::minigolfHoleB + {TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::minigolfHoleC + {TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::minigolfHoleD + {TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::minigolfHoleE + { TrackGroup::quarterLoopInvertedDown, TrackPitch::down90, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::multiDimInvertedFlatToDown90QuarterLoop + { TrackGroup::quarterLoop, TrackPitch::none, TrackPitch::up90, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::up90ToInvertedFlatQuarterLoop + { TrackGroup::quarterLoop, TrackPitch::down90, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, 0 }, // TrackElemType::invertedFlatToDown90QuarterLoop + { TrackGroup::liftHillCurved, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftCurvedLiftHill + { TrackGroup::liftHillCurved, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightCurvedLiftHill + { TrackGroup::reverser, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftReverser + { TrackGroup::reverser, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightReverser + { TrackGroup::slopeToFlat, TrackPitch::down90, TrackPitch::up90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::airThrustTopCap + { TrackGroup::slopeToFlat, TrackPitch::down90, TrackPitch::down90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::airThrustVerticalDown + { TrackGroup::slopeToFlat, TrackPitch::none, TrackPitch::down90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::airThrustVerticalDownToLevel + { TrackGroup::blockBrakes, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::blockBrakes + { TrackGroup::slopeCurve, TrackPitch::up25, TrackPitch::up25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBankedQuarterTurn3TileUp25 + { TrackGroup::slopeCurve, TrackPitch::up25, TrackPitch::up25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBankedQuarterTurn3TileUp25 + { TrackGroup::slopeCurve, TrackPitch::down25, TrackPitch::down25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBankedQuarterTurn3TileDown25 + { TrackGroup::slopeCurve, TrackPitch::down25, TrackPitch::down25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBankedQuarterTurn3TileDown25 + { TrackGroup::slopeCurve, TrackPitch::up25, TrackPitch::up25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBankedQuarterTurn5TileUp25 + { TrackGroup::slopeCurve, TrackPitch::up25, TrackPitch::up25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBankedQuarterTurn5TileUp25 + { TrackGroup::slopeCurve, TrackPitch::down25, TrackPitch::down25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBankedQuarterTurn5TileDown25 + { TrackGroup::slopeCurve, TrackPitch::down25, TrackPitch::down25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBankedQuarterTurn5TileDown25 + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::up25, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::up25ToLeftBankedUp25 + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::up25, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::up25ToRightBankedUp25 + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::leftBankedUp25ToUp25 + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::rightBankedUp25ToUp25 + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::down25, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::down25ToLeftBankedDown25 + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::down25, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::down25ToRightBankedDown25 + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::leftBankedDown25ToDown25 + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::rightBankedDown25ToDown25 + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBankedFlatToLeftBankedUp25 + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBankedFlatToRightBankedUp25 + { TrackGroup::slopeRollBanking, TrackPitch::none, TrackPitch::up25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBankedUp25ToLeftBankedFlat + { TrackGroup::slopeRollBanking, TrackPitch::none, TrackPitch::up25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBankedUp25ToRightBankedFlat + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBankedFlatToLeftBankedDown25 + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBankedFlatToRightBankedDown25 + { TrackGroup::slopeRollBanking, TrackPitch::none, TrackPitch::down25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::leftBankedDown25ToLeftBankedFlat + { TrackGroup::slopeRollBanking, TrackPitch::none, TrackPitch::down25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::rightBankedDown25ToRightBankedFlat + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::none, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::flatToLeftBankedUp25 + { TrackGroup::slopeRollBanking, TrackPitch::up25, TrackPitch::none, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::flatToRightBankedUp25 + { TrackGroup::slopeRollBanking, TrackPitch::none, TrackPitch::up25, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::leftBankedUp25ToFlat + { TrackGroup::slopeRollBanking, TrackPitch::none, TrackPitch::up25, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::rightBankedUp25ToFlat + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::none, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::flatToLeftBankedDown25 + { TrackGroup::slopeRollBanking, TrackPitch::down25, TrackPitch::none, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::flatToRightBankedDown25 + { TrackGroup::slopeRollBanking, TrackPitch::none, TrackPitch::down25, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::leftBankedDown25ToFlat + { TrackGroup::slopeRollBanking, TrackPitch::none, TrackPitch::down25, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::rightBankedDown25ToFlat + { TrackGroup::slopeCurveSteep, TrackPitch::up90, TrackPitch::up90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn1TileUp90 + { TrackGroup::slopeCurveSteep, TrackPitch::up90, TrackPitch::up90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn1TileUp90 + { TrackGroup::slopeCurveSteep, TrackPitch::down90, TrackPitch::down90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::leftQuarterTurn1TileDown90 + { TrackGroup::slopeCurveSteep, TrackPitch::down90, TrackPitch::down90, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rightQuarterTurn1TileDown90 + { TrackGroup::quarterLoopUninvertedUp, TrackPitch::none, TrackPitch::up90, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop + { TrackGroup::quarterLoopUninvertedDown, TrackPitch::down90, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::multiDimFlatToDown90QuarterLoop + { TrackGroup::quarterLoopInvertedUp, TrackPitch::none, TrackPitch::up90, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop + { TrackGroup::rotationControlToggle, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::rotationControlToggle + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatTrack1x4A + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatTrack2x2 + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatTrack4x4 + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatTrack2x4 + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatTrack1x5 + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatTrack1x1A + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatTrack1x4B + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatTrack1x1B + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, -40 }, // TrackElemType::flatTrack1x4C + { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::flatTrack3x3 + { TrackGroup::corkscrewLarge, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 32 }, // TrackElemType::leftLargeCorkscrewUp + { TrackGroup::corkscrewLarge, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 32 }, // TrackElemType::rightLargeCorkscrewUp + { TrackGroup::corkscrewLarge, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -32 }, // TrackElemType::leftLargeCorkscrewDown + { TrackGroup::corkscrewLarge, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -32 }, // TrackElemType::rightLargeCorkscrewDown + { TrackGroup::halfLoopMedium, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::leftMediumHalfLoopUp + { TrackGroup::halfLoopMedium, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::rightMediumHalfLoopUp + { TrackGroup::halfLoopMedium, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -64 }, // TrackElemType::leftMediumHalfLoopDown + { TrackGroup::halfLoopMedium, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -64 }, // TrackElemType::rightMediumHalfLoopDown + { TrackGroup::zeroGRoll, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::leftZeroGRollUp + { TrackGroup::zeroGRoll, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 0 }, // TrackElemType::rightZeroGRollUp + { TrackGroup::zeroGRoll, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, 0 }, // TrackElemType::leftZeroGRollDown + { TrackGroup::zeroGRoll, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, 0 }, // TrackElemType::rightZeroGRollDown + { TrackGroup::zeroGRollLarge, TrackPitch::none, TrackPitch::up60, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::leftLargeZeroGRollUp + { TrackGroup::zeroGRollLarge, TrackPitch::none, TrackPitch::up60, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::rightLargeZeroGRollUp + { TrackGroup::zeroGRollLarge, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -64 }, // TrackElemType::leftLargeZeroGRollDown + { TrackGroup::zeroGRollLarge, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -64 }, // TrackElemType::rightLargeZeroGRollDown + { TrackGroup::flyingLargeHalfLoopUninvertedUp, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::leftFlyerLargeHalfLoopUninvertedUp + { TrackGroup::flyingLargeHalfLoopUninvertedUp, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::rightFlyerLargeHalfLoopUninvertedUp + { TrackGroup::flyingLargeHalfLoopInvertedDown, TrackPitch::down25, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, -64 }, // TrackElemType::leftFlyerLargeHalfLoopInvertedDown + { TrackGroup::flyingLargeHalfLoopInvertedDown, TrackPitch::down25, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, -64 }, // TrackElemType::rightFlyerLargeHalfLoopInvertedDown + { TrackGroup::flyingLargeHalfLoopInvertedUp, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::leftFlyerLargeHalfLoopInvertedUp + { TrackGroup::flyingLargeHalfLoopInvertedUp, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::rightFlyerLargeHalfLoopInvertedUp + { TrackGroup::flyingLargeHalfLoopUninvertedDown, TrackPitch::down25, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, -64 }, // TrackElemType::leftFlyerLargeHalfLoopUninvertedDown + { TrackGroup::flyingLargeHalfLoopUninvertedDown, TrackPitch::down25, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, -64 }, // TrackElemType::rightFlyerLargeHalfLoopUninvertedDown + { TrackGroup::flyingHalfLoopInvertedUp, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 64 }, // TrackElemType::flyerHalfLoopInvertedUp + { TrackGroup::flyingHalfLoopUninvertedDown, TrackPitch::down25, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, -64 }, // TrackElemType::flyerHalfLoopUninvertedDown + { TrackGroup::slopeCurveLarge, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 16 }, // TrackElemType::leftEighthToDiagUp25 + { TrackGroup::slopeCurveLarge, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 16 }, // TrackElemType::rightEighthToDiagUp25 + { TrackGroup::slopeCurveLarge, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, -16 }, // TrackElemType::leftEighthToDiagDown25 + { TrackGroup::slopeCurveLarge, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, -16 }, // TrackElemType::rightEighthToDiagDown25 + { TrackGroup::slopeCurveLarge, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 16 }, // TrackElemType::leftEighthToOrthogonalUp25 + { TrackGroup::slopeCurveLarge, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::none, 16 }, // TrackElemType::rightEighthToOrthogonalUp25 + { TrackGroup::slopeCurveLarge, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, -16 }, // TrackElemType::leftEighthToOrthogonalDown25 + { TrackGroup::slopeCurveLarge, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, -16 }, // TrackElemType::rightEighthToOrthogonalDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::diagUp25ToLeftBankedUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::diagUp25ToRightBankedUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankedUp25ToUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::diagRightBankedUp25ToUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::diagDown25ToLeftBankedDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::diagDown25ToRightBankedDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankedDown25ToDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::diagRightBankedDown25ToDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankedFlatToLeftBankedUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::diagRightBankedFlatToRightBankedUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::none, TrackPitch::up25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankedUp25ToLeftBankedFlat + { TrackGroup::slopeCurveLargeBanked, TrackPitch::none, TrackPitch::up25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::diagRightBankedUp25ToRightBankedFlat + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::none, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankedFlatToLeftBankedDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::none, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::diagRightBankedFlatToRightBankedDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::none, TrackPitch::down25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankedDown25ToLeftBankedFlat + { TrackGroup::slopeCurveLargeBanked, TrackPitch::none, TrackPitch::down25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::diagRightBankedDown25ToRightBankedFlat + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::none, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::diagFlatToLeftBankedUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::none, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::diagFlatToRightBankedUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::none, TrackPitch::up25, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankedUp25ToFlat + { TrackGroup::slopeCurveLargeBanked, TrackPitch::none, TrackPitch::up25, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::diagRightBankedUp25ToFlat + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::none, TrackRoll::left, TrackRoll::none, 0 }, // TrackElemType::diagFlatToLeftBankedDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::none, TrackRoll::right, TrackRoll::none, 0 }, // TrackElemType::diagFlatToRightBankedDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::none, TrackPitch::down25, TrackRoll::none, TrackRoll::left, 0 }, // TrackElemType::diagLeftBankedDown25ToFlat + { TrackGroup::slopeCurveLargeBanked, TrackPitch::none, TrackPitch::down25, TrackRoll::none, TrackRoll::right, 0 }, // TrackElemType::diagRightBankedDown25ToFlat + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::up25LeftBanked + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::up25RightBanked + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::left, TrackRoll::left, 0 }, // TrackElemType::down25LeftBanked + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::right, TrackRoll::right, 0 }, // TrackElemType::down25RightBanked + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::left, TrackRoll::left, 16 }, // TrackElemType::leftEighthBankToDiagUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::right, TrackRoll::right, 16 }, // TrackElemType::rightEighthBankToDiagUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::left, TrackRoll::left, -16 }, // TrackElemType::leftEighthBankToDiagDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::right, TrackRoll::right, -16 }, // TrackElemType::rightEighthBankToDiagDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::left, TrackRoll::left, 16 }, // TrackElemType::leftEighthBankToOrthogonalUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::up25, TrackPitch::up25, TrackRoll::right, TrackRoll::right, 16 }, // TrackElemType::rightEighthBankToOrthogonalUp25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::left, TrackRoll::left, -16 }, // TrackElemType::leftEighthBankToOrthogonalDown25 + { TrackGroup::slopeCurveLargeBanked, TrackPitch::down25, TrackPitch::down25, TrackRoll::right, TrackRoll::right, -16 }, // TrackElemType::rightEighthBankToOrthogonalDown25 + { TrackGroup::diagBrakes, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagBrakes + { TrackGroup::diagBlockBrakes, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagBlockBrakes + { TrackGroup::inclinedBrakes, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::down25Brakes + { TrackGroup::diagBooster, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagBooster + { TrackGroup::slopeSteepLong, TrackPitch::up60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 16 }, // TrackElemType::diagFlatToUp60LongBase, + { TrackGroup::slopeSteepLong, TrackPitch::none, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 48 }, // TrackElemType::diagUp60ToFlatLongBase, + { TrackGroup::slopeSteepLong, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::none, -32 }, // TrackElemType::diagFlatToDown60LongBase, + { TrackGroup::slopeSteepLong, TrackPitch::none, TrackPitch::down60, TrackRoll::none, TrackRoll::none, -24 }, // TrackElemType::diagDown60ToFlatLongBase, + { TrackGroup::diveLoop, TrackPitch::none, TrackPitch::up60, TrackRoll::upsideDown, TrackRoll::none, 56 }, // TrackElemType::leftEighthDiveLoopUpToOrthogonal + { TrackGroup::diveLoop, TrackPitch::none, TrackPitch::up60, TrackRoll::upsideDown, TrackRoll::none, 56 }, // TrackElemType::rightEighthDiveLoopUpToOrthogonal + { TrackGroup::diveLoop, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -56 }, // TrackElemType::leftEighthDiveLoopDownToDiag + { TrackGroup::diveLoop, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown, -56 }, // TrackElemType::rightEighthDiveLoopDownToDiag + { TrackGroup::inclinedBrakes, TrackPitch::down25, TrackPitch::down25, TrackRoll::none, TrackRoll::none, 0 }, // TrackElemType::diagDown25 + }; + static_assert(std::size(kTrackDefinitions) == EnumValue(TrackElemType::count)); // clang-format on @@ -3481,7 +3123,7 @@ namespace OpenRCT2::TrackMetaData SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::L9, SpinFunction::R9, SpinFunction::L9, SpinFunction::R9, SpinFunction::None }; - static_assert(std::size(kTrackTypeToSpinFunction) == EnumValue(TrackElemType::Count)); + static_assert(std::size(kTrackTypeToSpinFunction) == EnumValue(TrackElemType::count)); #pragma region GForces @@ -3678,400 +3320,400 @@ namespace OpenRCT2::TrackMetaData { switch (type) { - case TrackElemType::Flat: - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: - case TrackElemType::Up25: - case TrackElemType::Up60: // - case TrackElemType::Down25: - case TrackElemType::Down60: // - case TrackElemType::FlatToLeftBank: - case TrackElemType::FlatToRightBank: - case TrackElemType::LeftBankToFlat: - case TrackElemType::RightBankToFlat: // - case TrackElemType::LeftBank: - case TrackElemType::RightBank: - case TrackElemType::TowerBase: - case TrackElemType::TowerSection: - case TrackElemType::FlatCovered: - case TrackElemType::Up25Covered: - case TrackElemType::Up60Covered: - case TrackElemType::Down25Covered: - case TrackElemType::Down60Covered: - case TrackElemType::Brakes: - case TrackElemType::RotationControlToggle: - case TrackElemType::Maze: - case TrackElemType::Up25LeftBanked: - case TrackElemType::Up25RightBanked: - case TrackElemType::Waterfall: - case TrackElemType::Rapids: - case TrackElemType::OnRidePhoto: - case TrackElemType::Down25LeftBanked: - case TrackElemType::Down25RightBanked: - case TrackElemType::Whirlpool: - case TrackElemType::ReverseFreefallVertical: - case TrackElemType::Up90: - case TrackElemType::Down90: - case TrackElemType::DiagFlat: - case TrackElemType::DiagUp25: - case TrackElemType::DiagUp60: - case TrackElemType::DiagDown25: - case TrackElemType::DiagDown60: - case TrackElemType::DiagFlatToLeftBank: - case TrackElemType::DiagFlatToRightBank: - case TrackElemType::DiagLeftBankToFlat: - case TrackElemType::DiagRightBankToFlat: - case TrackElemType::DiagLeftBank: - case TrackElemType::DiagRightBank: - case TrackElemType::LogFlumeReverser: - case TrackElemType::SpinningTunnel: - case TrackElemType::PoweredLift: - case TrackElemType::MinigolfHoleA: - case TrackElemType::MinigolfHoleB: - case TrackElemType::MinigolfHoleC: - case TrackElemType::MinigolfHoleD: - case TrackElemType::MinigolfHoleE: - case TrackElemType::LeftReverser: - case TrackElemType::RightReverser: - case TrackElemType::AirThrustVerticalDown: - case TrackElemType::BlockBrakes: - case TrackElemType::Up25ToLeftBankedUp25: - case TrackElemType::Up25ToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToUp25: - case TrackElemType::RightBankedUp25ToUp25: - case TrackElemType::Down25ToLeftBankedDown25: - case TrackElemType::Down25ToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToDown25: - case TrackElemType::RightBankedDown25ToDown25: - case TrackElemType::LeftQuarterTurn1TileUp90: - case TrackElemType::RightQuarterTurn1TileUp90: - case TrackElemType::LeftQuarterTurn1TileDown90: - case TrackElemType::RightQuarterTurn1TileDown90: + case TrackElemType::flat: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: + case TrackElemType::up25: + case TrackElemType::up60: // + case TrackElemType::down25: + case TrackElemType::down60: // + case TrackElemType::flatToLeftBank: + case TrackElemType::flatToRightBank: + case TrackElemType::leftBankToFlat: + case TrackElemType::rightBankToFlat: // + case TrackElemType::leftBank: + case TrackElemType::rightBank: + case TrackElemType::towerBase: + case TrackElemType::towerSection: + case TrackElemType::flatCovered: + case TrackElemType::up25Covered: + case TrackElemType::up60Covered: + case TrackElemType::down25Covered: + case TrackElemType::down60Covered: + case TrackElemType::brakes: + case TrackElemType::rotationControlToggle: + case TrackElemType::maze: + case TrackElemType::up25LeftBanked: + case TrackElemType::up25RightBanked: + case TrackElemType::waterfall: + case TrackElemType::rapids: + case TrackElemType::onRidePhoto: + case TrackElemType::down25LeftBanked: + case TrackElemType::down25RightBanked: + case TrackElemType::whirlpool: + case TrackElemType::reverseFreefallVertical: + case TrackElemType::up90: + case TrackElemType::down90: + case TrackElemType::diagFlat: + case TrackElemType::diagUp25: + case TrackElemType::diagUp60: + case TrackElemType::diagDown25: + case TrackElemType::diagDown60: + case TrackElemType::diagFlatToLeftBank: + case TrackElemType::diagFlatToRightBank: + case TrackElemType::diagLeftBankToFlat: + case TrackElemType::diagRightBankToFlat: + case TrackElemType::diagLeftBank: + case TrackElemType::diagRightBank: + case TrackElemType::logFlumeReverser: + case TrackElemType::spinningTunnel: + case TrackElemType::poweredLift: + case TrackElemType::minigolfHoleA: + case TrackElemType::minigolfHoleB: + case TrackElemType::minigolfHoleC: + case TrackElemType::minigolfHoleD: + case TrackElemType::minigolfHoleE: + case TrackElemType::leftReverser: + case TrackElemType::rightReverser: + case TrackElemType::airThrustVerticalDown: + case TrackElemType::blockBrakes: + case TrackElemType::up25ToLeftBankedUp25: + case TrackElemType::up25ToRightBankedUp25: + case TrackElemType::leftBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: + case TrackElemType::down25ToLeftBankedDown25: + case TrackElemType::down25ToRightBankedDown25: + case TrackElemType::leftBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: + case TrackElemType::leftQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: return EvaluatorConst<0>; - case TrackElemType::FlatToUp25: // - case TrackElemType::Down25ToFlat: // - case TrackElemType::LeftBankToUp25: - case TrackElemType::RightBankToUp25: - case TrackElemType::Down25ToLeftBank: - case TrackElemType::Down25ToRightBank: - case TrackElemType::FlatToUp25Covered: - case TrackElemType::Down25ToFlatCovered: - case TrackElemType::LeftBankedFlatToLeftBankedUp25: - case TrackElemType::RightBankedFlatToRightBankedUp25: - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: - case TrackElemType::RightBankedDown25ToRightBankedFlat: - case TrackElemType::FlatToLeftBankedUp25: - case TrackElemType::FlatToRightBankedUp25: - case TrackElemType::LeftBankedDown25ToFlat: - case TrackElemType::RightBankedDown25ToFlat: - case TrackElemType::DiagUp25ToLeftBankedUp25: - case TrackElemType::DiagUp25ToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToUp25: - case TrackElemType::DiagRightBankedUp25ToUp25: - case TrackElemType::DiagDown25ToLeftBankedDown25: - case TrackElemType::DiagDown25ToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToDown25: - case TrackElemType::DiagRightBankedDown25ToDown25: - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: - case TrackElemType::DiagFlatToLeftBankedUp25: - case TrackElemType::DiagFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToFlat: - case TrackElemType::DiagRightBankedUp25ToFlat: - case TrackElemType::DiagFlatToLeftBankedDown25: - case TrackElemType::DiagFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToFlat: - case TrackElemType::DiagRightBankedDown25ToFlat: - case TrackElemType::DiagUp25LeftBanked: - case TrackElemType::DiagUp25RightBanked: - case TrackElemType::DiagDown25LeftBanked: - case TrackElemType::DiagDown25RightBanked: + case TrackElemType::flatToUp25: // + case TrackElemType::down25ToFlat: // + case TrackElemType::leftBankToUp25: + case TrackElemType::rightBankToUp25: + case TrackElemType::down25ToLeftBank: + case TrackElemType::down25ToRightBank: + case TrackElemType::flatToUp25Covered: + case TrackElemType::down25ToFlatCovered: + case TrackElemType::leftBankedFlatToLeftBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: + case TrackElemType::flatToLeftBankedUp25: + case TrackElemType::flatToRightBankedUp25: + case TrackElemType::leftBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: + case TrackElemType::diagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: + case TrackElemType::diagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: + case TrackElemType::diagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: + case TrackElemType::diagUp25LeftBanked: + case TrackElemType::diagUp25RightBanked: + case TrackElemType::diagDown25LeftBanked: + case TrackElemType::diagDown25RightBanked: return EvaluatorConst<0>; - case TrackElemType::Up25ToFlat: // - case TrackElemType::FlatToDown25: // - case TrackElemType::Up25ToLeftBank: - case TrackElemType::Up25ToRightBank: - case TrackElemType::LeftBankToDown25: - case TrackElemType::RightBankToDown25: - case TrackElemType::Up25ToFlatCovered: - case TrackElemType::FlatToDown25Covered: - case TrackElemType::CableLiftHill: - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: - case TrackElemType::RightBankedUp25ToRightBankedFlat: - case TrackElemType::LeftBankedFlatToLeftBankedDown25: - case TrackElemType::RightBankedFlatToRightBankedDown25: - case TrackElemType::LeftBankedUp25ToFlat: - case TrackElemType::RightBankedUp25ToFlat: - case TrackElemType::FlatToLeftBankedDown25: - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::up25ToFlat: // + case TrackElemType::flatToDown25: // + case TrackElemType::up25ToLeftBank: + case TrackElemType::up25ToRightBank: + case TrackElemType::leftBankToDown25: + case TrackElemType::rightBankToDown25: + case TrackElemType::up25ToFlatCovered: + case TrackElemType::flatToDown25Covered: + case TrackElemType::cableLiftHill: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: + case TrackElemType::leftBankedFlatToLeftBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: + case TrackElemType::leftBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: + case TrackElemType::flatToLeftBankedDown25: + case TrackElemType::flatToRightBankedDown25: return EvaluatorConst<0>; - case TrackElemType::Up25ToUp60: // - case TrackElemType::Down60ToDown25: // - case TrackElemType::Up25ToUp60Covered: - case TrackElemType::Down60ToDown25Covered: + case TrackElemType::up25ToUp60: // + case TrackElemType::down60ToDown25: // + case TrackElemType::up25ToUp60Covered: + case TrackElemType::down60ToDown25Covered: return EvaluatorConst<0>; - case TrackElemType::Up60ToUp25: // - case TrackElemType::Down25ToDown60: // - case TrackElemType::Up60ToUp25Covered: - case TrackElemType::Down25ToDown60Covered: + case TrackElemType::up60ToUp25: // + case TrackElemType::down25ToDown60: // + case TrackElemType::up60ToUp25Covered: + case TrackElemType::down25ToDown60Covered: return EvaluatorConst<0>; - case TrackElemType::LeftQuarterTurn5Tiles: // - case TrackElemType::LeftQuarterTurn5TilesUp25: - case TrackElemType::LeftQuarterTurn5TilesDown25: - case TrackElemType::LeftTwistDownToUp: - case TrackElemType::LeftTwistUpToDown: - case TrackElemType::LeftQuarterTurn5TilesCovered: - case TrackElemType::LeftQuarterHelixLargeUp: - case TrackElemType::LeftQuarterHelixLargeDown: - case TrackElemType::LeftFlyerTwistUp: - case TrackElemType::LeftFlyerTwistDown: - case TrackElemType::LeftHeartLineRoll: + case TrackElemType::leftQuarterTurn5Tiles: // + case TrackElemType::leftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesDown25: + case TrackElemType::leftTwistDownToUp: + case TrackElemType::leftTwistUpToDown: + case TrackElemType::leftQuarterTurn5TilesCovered: + case TrackElemType::leftQuarterHelixLargeUp: + case TrackElemType::leftQuarterHelixLargeDown: + case TrackElemType::leftFlyerTwistUp: + case TrackElemType::leftFlyerTwistDown: + case TrackElemType::leftHeartLineRoll: return EvaluatorConst<98>; - case TrackElemType::RightQuarterTurn5Tiles: // - case TrackElemType::RightQuarterTurn5TilesUp25: - case TrackElemType::RightQuarterTurn5TilesDown25: - case TrackElemType::RightTwistDownToUp: - case TrackElemType::RightTwistUpToDown: - case TrackElemType::RightQuarterTurn5TilesCovered: - case TrackElemType::RightQuarterHelixLargeUp: - case TrackElemType::RightQuarterHelixLargeDown: - case TrackElemType::RightFlyerTwistUp: - case TrackElemType::RightFlyerTwistDown: - case TrackElemType::RightHeartLineRoll: + case TrackElemType::rightQuarterTurn5Tiles: // + case TrackElemType::rightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesDown25: + case TrackElemType::rightTwistDownToUp: + case TrackElemType::rightTwistUpToDown: + case TrackElemType::rightQuarterTurn5TilesCovered: + case TrackElemType::rightQuarterHelixLargeUp: + case TrackElemType::rightQuarterHelixLargeDown: + case TrackElemType::rightFlyerTwistUp: + case TrackElemType::rightFlyerTwistDown: + case TrackElemType::rightHeartLineRoll: return EvaluatorConst<-98>; - case TrackElemType::BankedLeftQuarterTurn5Tiles: - case TrackElemType::LeftHalfBankedHelixUpLarge: - case TrackElemType::LeftHalfBankedHelixDownLarge: - case TrackElemType::LeftQuarterBankedHelixLargeUp: - case TrackElemType::LeftQuarterBankedHelixLargeDown: + case TrackElemType::bankedLeftQuarterTurn5Tiles: + case TrackElemType::leftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: + case TrackElemType::leftQuarterBankedHelixLargeUp: + case TrackElemType::leftQuarterBankedHelixLargeDown: return EvaluatorConst<160>; - case TrackElemType::BankedRightQuarterTurn5Tiles: - case TrackElemType::RightHalfBankedHelixUpLarge: - case TrackElemType::RightHalfBankedHelixDownLarge: - case TrackElemType::RightQuarterBankedHelixLargeUp: - case TrackElemType::RightQuarterBankedHelixLargeDown: + case TrackElemType::bankedRightQuarterTurn5Tiles: + case TrackElemType::rightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: + case TrackElemType::rightQuarterBankedHelixLargeUp: + case TrackElemType::rightQuarterBankedHelixLargeDown: return EvaluatorConst<-160>; - case TrackElemType::SBendLeft: - case TrackElemType::SBendLeftCovered: + case TrackElemType::sBendLeft: + case TrackElemType::sBendLeftCovered: return EvaluatorSBendLeft; - case TrackElemType::SBendRight: - case TrackElemType::SBendRightCovered: + case TrackElemType::sBendRight: + case TrackElemType::sBendRightCovered: return EvaluatorSBendRight; - case TrackElemType::LeftVerticalLoop: - case TrackElemType::RightVerticalLoop: + case TrackElemType::leftVerticalLoop: + case TrackElemType::rightVerticalLoop: return EvaluatorConst<0>; - case TrackElemType::LeftQuarterTurn3Tiles: - case TrackElemType::LeftQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25: - case TrackElemType::LeftQuarterTurn3TilesCovered: - case TrackElemType::LeftCurvedLiftHill: + case TrackElemType::leftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesCovered: + case TrackElemType::leftCurvedLiftHill: return EvaluatorConst<59>; - case TrackElemType::RightQuarterTurn3Tiles: - case TrackElemType::RightQuarterTurn3TilesUp25: - case TrackElemType::RightQuarterTurn3TilesDown25: - case TrackElemType::RightQuarterTurn3TilesCovered: - case TrackElemType::RightCurvedLiftHill: + case TrackElemType::rightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesCovered: + case TrackElemType::rightCurvedLiftHill: return EvaluatorConst<-59>; - case TrackElemType::LeftBankedQuarterTurn3Tiles: - case TrackElemType::LeftHalfBankedHelixUpSmall: - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftBankedQuarterTurn3Tiles: + case TrackElemType::leftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return EvaluatorConst<100>; - case TrackElemType::RightBankedQuarterTurn3Tiles: - case TrackElemType::RightHalfBankedHelixUpSmall: - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightBankedQuarterTurn3Tiles: + case TrackElemType::rightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return EvaluatorConst<-100>; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return EvaluatorConst<45>; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return EvaluatorConst<-45>; - case TrackElemType::HalfLoopUp: - case TrackElemType::FlyerHalfLoopUninvertedUp: - case TrackElemType::FlyerHalfLoopInvertedUp: + case TrackElemType::halfLoopUp: + case TrackElemType::flyerHalfLoopUninvertedUp: + case TrackElemType::flyerHalfLoopInvertedUp: return EvaluatorConst<0>; - case TrackElemType::HalfLoopDown: - case TrackElemType::FlyerHalfLoopInvertedDown: - case TrackElemType::FlyerHalfLoopUninvertedDown: + case TrackElemType::halfLoopDown: + case TrackElemType::flyerHalfLoopInvertedDown: + case TrackElemType::flyerHalfLoopUninvertedDown: return EvaluatorConst<0>; - case TrackElemType::LeftLargeCorkscrewUp: - case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::leftLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewDown: return EvaluatorConst<117>; - case TrackElemType::RightLargeCorkscrewUp: - case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewDown: return EvaluatorConst<-117>; - case TrackElemType::LeftCorkscrewUp: - case TrackElemType::RightCorkscrewDown: - case TrackElemType::LeftFlyerCorkscrewUp: - case TrackElemType::RightFlyerCorkscrewDown: + case TrackElemType::leftCorkscrewUp: + case TrackElemType::rightCorkscrewDown: + case TrackElemType::leftFlyerCorkscrewUp: + case TrackElemType::rightFlyerCorkscrewDown: return EvaluatorConst<70>; - case TrackElemType::RightCorkscrewUp: - case TrackElemType::LeftCorkscrewDown: - case TrackElemType::RightFlyerCorkscrewUp: - case TrackElemType::LeftFlyerCorkscrewDown: + case TrackElemType::rightCorkscrewUp: + case TrackElemType::leftCorkscrewDown: + case TrackElemType::rightFlyerCorkscrewUp: + case TrackElemType::leftFlyerCorkscrewDown: return EvaluatorConst<-70>; - case TrackElemType::FlatToUp60: - case TrackElemType::Down60ToFlat: + case TrackElemType::flatToUp60: + case TrackElemType::down60ToFlat: return EvaluatorConst<0>; - case TrackElemType::Up60ToFlat: - case TrackElemType::FlatToDown60: - case TrackElemType::BrakeForDrop: + case TrackElemType::up60ToFlat: + case TrackElemType::flatToDown60: + case TrackElemType::brakeForDrop: return EvaluatorConst<0>; - case TrackElemType::LeftQuarterTurn1TileUp60: - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileDown60: return EvaluatorConst<88>; - case TrackElemType::RightQuarterTurn1TileUp60: - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileDown60: return EvaluatorConst<-88>; - case TrackElemType::Watersplash: + case TrackElemType::watersplash: return EvaluatorConst<0>; - case TrackElemType::FlatToUp60LongBase: - case TrackElemType::Down60ToFlatLongBase: - case TrackElemType::DiagFlatToUp60LongBase: - case TrackElemType::DiagDown60ToFlatLongBase: + case TrackElemType::flatToUp60LongBase: + case TrackElemType::down60ToFlatLongBase: + case TrackElemType::diagFlatToUp60LongBase: + case TrackElemType::diagDown60ToFlatLongBase: return EvaluatorConst<0>; - case TrackElemType::Up60ToFlatLongBase: - case TrackElemType::FlatToDown60LongBase: - case TrackElemType::DiagUp60ToFlatLongBase: - case TrackElemType::DiagFlatToDown60LongBase: + case TrackElemType::up60ToFlatLongBase: + case TrackElemType::flatToDown60LongBase: + case TrackElemType::diagUp60ToFlatLongBase: + case TrackElemType::diagFlatToDown60LongBase: return EvaluatorConst<0>; - case TrackElemType::ReverseFreefallSlope: - case TrackElemType::AirThrustVerticalDownToLevel: + case TrackElemType::reverseFreefallSlope: + case TrackElemType::airThrustVerticalDownToLevel: return EvaluatorConst<0>; - case TrackElemType::Up60ToUp90: - case TrackElemType::Down90ToDown60: + case TrackElemType::up60ToUp90: + case TrackElemType::down90ToDown60: return EvaluatorConst<0>; - case TrackElemType::Up90ToUp60: - case TrackElemType::Down60ToDown90: + case TrackElemType::up90ToUp60: + case TrackElemType::down60ToDown90: return EvaluatorConst<0>; - case TrackElemType::LeftEighthToDiag: - case TrackElemType::LeftEighthToOrthogonal: - case TrackElemType::LeftEighthToDiagUp25: - case TrackElemType::LeftEighthToDiagDown25: - case TrackElemType::LeftEighthToOrthogonalUp25: - case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::leftEighthToDiag: + case TrackElemType::leftEighthToOrthogonal: + case TrackElemType::leftEighthToDiagUp25: + case TrackElemType::leftEighthToDiagDown25: + case TrackElemType::leftEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalDown25: return EvaluatorConst<137>; - case TrackElemType::RightEighthToDiag: - case TrackElemType::RightEighthToOrthogonal: - case TrackElemType::RightEighthToDiagUp25: - case TrackElemType::RightEighthToDiagDown25: - case TrackElemType::RightEighthToOrthogonalUp25: - case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::rightEighthToDiag: + case TrackElemType::rightEighthToOrthogonal: + case TrackElemType::rightEighthToDiagUp25: + case TrackElemType::rightEighthToDiagDown25: + case TrackElemType::rightEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalDown25: return EvaluatorConst<-137>; - case TrackElemType::LeftEighthBankToDiag: - case TrackElemType::LeftEighthBankToOrthogonal: - case TrackElemType::LeftEighthBankToDiagUp25: - case TrackElemType::LeftEighthBankToDiagDown25: - case TrackElemType::LeftEighthBankToOrthogonalUp25: - case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::leftEighthBankToDiag: + case TrackElemType::leftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalDown25: return EvaluatorConst<200>; - case TrackElemType::RightEighthBankToDiag: - case TrackElemType::RightEighthBankToOrthogonal: - case TrackElemType::RightEighthBankToDiagUp25: - case TrackElemType::RightEighthBankToDiagDown25: - case TrackElemType::RightEighthBankToOrthogonalUp25: - case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToDiag: + case TrackElemType::rightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalDown25: return EvaluatorConst<-200>; - case TrackElemType::DiagFlatToUp25: - case TrackElemType::DiagDown25ToFlat: - case TrackElemType::DiagLeftBankToUp25: - case TrackElemType::DiagRightBankToUp25: - case TrackElemType::DiagDown25ToLeftBank: - case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::diagFlatToUp25: + case TrackElemType::diagDown25ToFlat: + case TrackElemType::diagLeftBankToUp25: + case TrackElemType::diagRightBankToUp25: + case TrackElemType::diagDown25ToLeftBank: + case TrackElemType::diagDown25ToRightBank: return EvaluatorConst<0>; - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagFlatToDown25: - case TrackElemType::DiagUp25ToLeftBank: - case TrackElemType::DiagUp25ToRightBank: - case TrackElemType::DiagLeftBankToDown25: - case TrackElemType::DiagRightBankToDown25: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagFlatToDown25: + case TrackElemType::diagUp25ToLeftBank: + case TrackElemType::diagUp25ToRightBank: + case TrackElemType::diagLeftBankToDown25: + case TrackElemType::diagRightBankToDown25: return EvaluatorConst<0>; - case TrackElemType::DiagUp25ToUp60: - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagUp25ToUp60: + case TrackElemType::diagDown60ToDown25: return EvaluatorConst<0>; - case TrackElemType::DiagUp60ToUp25: - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagUp60ToUp25: + case TrackElemType::diagDown25ToDown60: return EvaluatorConst<0>; - case TrackElemType::DiagFlatToUp60: - case TrackElemType::DiagDown60ToFlat: + case TrackElemType::diagFlatToUp60: + case TrackElemType::diagDown60ToFlat: return EvaluatorConst<0>; - case TrackElemType::DiagUp60ToFlat: - case TrackElemType::DiagFlatToDown60: + case TrackElemType::diagUp60ToFlat: + case TrackElemType::diagFlatToDown60: return EvaluatorConst<0>; - case TrackElemType::LeftBarrelRollUpToDown: - case TrackElemType::LeftBarrelRollDownToUp: + case TrackElemType::leftBarrelRollUpToDown: + case TrackElemType::leftBarrelRollDownToUp: return EvaluatorConst<115>; - case TrackElemType::RightBarrelRollUpToDown: - case TrackElemType::RightBarrelRollDownToUp: + case TrackElemType::rightBarrelRollUpToDown: + case TrackElemType::rightBarrelRollDownToUp: return EvaluatorConst<-115>; - case TrackElemType::LeftZeroGRollUp: + case TrackElemType::leftZeroGRollUp: return EvaluatorZeroGRollUpLeft; - case TrackElemType::RightZeroGRollUp: + case TrackElemType::rightZeroGRollUp: return EvaluatorZeroGRollUpRight; - case TrackElemType::LeftZeroGRollDown: + case TrackElemType::leftZeroGRollDown: return EvaluatorZeroGRollDownLeft; - case TrackElemType::RightZeroGRollDown: + case TrackElemType::rightZeroGRollDown: return EvaluatorZeroGRollDownRight; - case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollUp: return EvaluatorLargeZeroGRollUpLeft; - case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: return EvaluatorLargeZeroGRollUpRight; - case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::leftLargeZeroGRollDown: return EvaluatorLargeZeroGRollDownLeft; - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return EvaluatorLargeZeroGRollDownRight; - case TrackElemType::LeftEighthDiveLoopUpToOrthogonal: + case TrackElemType::leftEighthDiveLoopUpToOrthogonal: return EvaluatorDiveLoopUpLeft; - case TrackElemType::RightEighthDiveLoopUpToOrthogonal: + case TrackElemType::rightEighthDiveLoopUpToOrthogonal: return EvaluatorDiveLoopUpRight; - case TrackElemType::LeftEighthDiveLoopDownToDiag: + case TrackElemType::leftEighthDiveLoopDownToDiag: return EvaluatorDiveLoopDownLeft; - case TrackElemType::RightEighthDiveLoopDownToDiag: + case TrackElemType::rightEighthDiveLoopDownToDiag: return EvaluatorDiveLoopDownRight; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: return EvaluatorConst<90>; - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: return EvaluatorConst<-90>; - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: return EvaluatorConst<90>; - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return EvaluatorConst<-90>; - case TrackElemType::LeftLargeHalfLoopUp: - case TrackElemType::RightLargeHalfLoopUp: + case TrackElemType::leftLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: return EvaluatorConst<0>; - case TrackElemType::LeftLargeHalfLoopDown: - case TrackElemType::RightLargeHalfLoopDown: + case TrackElemType::leftLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: return EvaluatorConst<0>; - case TrackElemType::HeartLineTransferUp: + case TrackElemType::heartLineTransferUp: return EvaluatorConst<0>; - case TrackElemType::HeartLineTransferDown: + case TrackElemType::heartLineTransferDown: return EvaluatorConst<0>; - case TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop: - case TrackElemType::InvertedFlatToDown90QuarterLoop: - case TrackElemType::MultiDimFlatToDown90QuarterLoop: + case TrackElemType::multiDimInvertedFlatToDown90QuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: + case TrackElemType::multiDimFlatToDown90QuarterLoop: return EvaluatorConst<0>; - case TrackElemType::Up90ToInvertedFlatQuarterLoop: - case TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop: - case TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop: + case TrackElemType::up90ToInvertedFlatQuarterLoop: + case TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop: + case TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop: return EvaluatorConst<0>; - case TrackElemType::AirThrustTopCap: + case TrackElemType::airThrustTopCap: return EvaluatorConst<0>; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return EvaluatorConst<100>; - case TrackElemType::RightBankedQuarterTurn3TileUp25: - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return EvaluatorConst<-100>; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return EvaluatorConst<160>; - case TrackElemType::RightBankedQuarterTurn5TileUp25: - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return EvaluatorConst<-160>; default: return EvaluatorConst<0>; @@ -4082,407 +3724,407 @@ namespace OpenRCT2::TrackMetaData { switch (type) { - case TrackElemType::Flat: - case TrackElemType::EndStation: - case TrackElemType::BeginStation: - case TrackElemType::MiddleStation: - case TrackElemType::Up25: - case TrackElemType::Up60: // - case TrackElemType::Down25: - case TrackElemType::Down60: // - case TrackElemType::FlatToLeftBank: - case TrackElemType::FlatToRightBank: - case TrackElemType::LeftBankToFlat: - case TrackElemType::RightBankToFlat: // - case TrackElemType::LeftBank: - case TrackElemType::RightBank: - case TrackElemType::TowerBase: - case TrackElemType::TowerSection: - case TrackElemType::FlatCovered: - case TrackElemType::Up25Covered: - case TrackElemType::Up60Covered: - case TrackElemType::Down25Covered: - case TrackElemType::Down60Covered: - case TrackElemType::Brakes: - case TrackElemType::RotationControlToggle: - case TrackElemType::Maze: - case TrackElemType::Up25LeftBanked: - case TrackElemType::Up25RightBanked: - case TrackElemType::Waterfall: - case TrackElemType::Rapids: - case TrackElemType::OnRidePhoto: - case TrackElemType::Down25LeftBanked: - case TrackElemType::Down25RightBanked: - case TrackElemType::Whirlpool: - case TrackElemType::ReverseFreefallVertical: - case TrackElemType::Up90: - case TrackElemType::Down90: - case TrackElemType::DiagFlat: - case TrackElemType::DiagUp25: - case TrackElemType::DiagUp60: - case TrackElemType::DiagDown25: - case TrackElemType::DiagDown60: - case TrackElemType::DiagFlatToLeftBank: - case TrackElemType::DiagFlatToRightBank: - case TrackElemType::DiagLeftBankToFlat: - case TrackElemType::DiagRightBankToFlat: - case TrackElemType::DiagLeftBank: - case TrackElemType::DiagRightBank: - case TrackElemType::LogFlumeReverser: - case TrackElemType::SpinningTunnel: - case TrackElemType::PoweredLift: - case TrackElemType::MinigolfHoleA: - case TrackElemType::MinigolfHoleB: - case TrackElemType::MinigolfHoleC: - case TrackElemType::MinigolfHoleD: - case TrackElemType::MinigolfHoleE: - case TrackElemType::LeftReverser: - case TrackElemType::RightReverser: - case TrackElemType::AirThrustVerticalDown: - case TrackElemType::BlockBrakes: - case TrackElemType::Up25ToLeftBankedUp25: - case TrackElemType::Up25ToRightBankedUp25: - case TrackElemType::LeftBankedUp25ToUp25: - case TrackElemType::RightBankedUp25ToUp25: - case TrackElemType::Down25ToLeftBankedDown25: - case TrackElemType::Down25ToRightBankedDown25: - case TrackElemType::LeftBankedDown25ToDown25: - case TrackElemType::RightBankedDown25ToDown25: - case TrackElemType::LeftQuarterTurn1TileUp90: - case TrackElemType::RightQuarterTurn1TileUp90: - case TrackElemType::LeftQuarterTurn1TileDown90: - case TrackElemType::RightQuarterTurn1TileDown90: - case TrackElemType::LeftEighthToDiagUp25: - case TrackElemType::RightEighthToDiagUp25: - case TrackElemType::LeftEighthToDiagDown25: - case TrackElemType::RightEighthToDiagDown25: - case TrackElemType::LeftEighthToOrthogonalUp25: - case TrackElemType::RightEighthToOrthogonalUp25: - case TrackElemType::LeftEighthToOrthogonalDown25: - case TrackElemType::RightEighthToOrthogonalDown25: - case TrackElemType::DiagUp25ToLeftBankedUp25: - case TrackElemType::DiagUp25ToRightBankedUp25: - case TrackElemType::DiagLeftBankedUp25ToUp25: - case TrackElemType::DiagRightBankedUp25ToUp25: - case TrackElemType::DiagDown25ToLeftBankedDown25: - case TrackElemType::DiagDown25ToRightBankedDown25: - case TrackElemType::DiagLeftBankedDown25ToDown25: - case TrackElemType::DiagRightBankedDown25ToDown25: - case TrackElemType::DiagUp25LeftBanked: - case TrackElemType::DiagUp25RightBanked: - case TrackElemType::DiagDown25LeftBanked: - case TrackElemType::DiagDown25RightBanked: + case TrackElemType::flat: + case TrackElemType::endStation: + case TrackElemType::beginStation: + case TrackElemType::middleStation: + case TrackElemType::up25: + case TrackElemType::up60: // + case TrackElemType::down25: + case TrackElemType::down60: // + case TrackElemType::flatToLeftBank: + case TrackElemType::flatToRightBank: + case TrackElemType::leftBankToFlat: + case TrackElemType::rightBankToFlat: // + case TrackElemType::leftBank: + case TrackElemType::rightBank: + case TrackElemType::towerBase: + case TrackElemType::towerSection: + case TrackElemType::flatCovered: + case TrackElemType::up25Covered: + case TrackElemType::up60Covered: + case TrackElemType::down25Covered: + case TrackElemType::down60Covered: + case TrackElemType::brakes: + case TrackElemType::rotationControlToggle: + case TrackElemType::maze: + case TrackElemType::up25LeftBanked: + case TrackElemType::up25RightBanked: + case TrackElemType::waterfall: + case TrackElemType::rapids: + case TrackElemType::onRidePhoto: + case TrackElemType::down25LeftBanked: + case TrackElemType::down25RightBanked: + case TrackElemType::whirlpool: + case TrackElemType::reverseFreefallVertical: + case TrackElemType::up90: + case TrackElemType::down90: + case TrackElemType::diagFlat: + case TrackElemType::diagUp25: + case TrackElemType::diagUp60: + case TrackElemType::diagDown25: + case TrackElemType::diagDown60: + case TrackElemType::diagFlatToLeftBank: + case TrackElemType::diagFlatToRightBank: + case TrackElemType::diagLeftBankToFlat: + case TrackElemType::diagRightBankToFlat: + case TrackElemType::diagLeftBank: + case TrackElemType::diagRightBank: + case TrackElemType::logFlumeReverser: + case TrackElemType::spinningTunnel: + case TrackElemType::poweredLift: + case TrackElemType::minigolfHoleA: + case TrackElemType::minigolfHoleB: + case TrackElemType::minigolfHoleC: + case TrackElemType::minigolfHoleD: + case TrackElemType::minigolfHoleE: + case TrackElemType::leftReverser: + case TrackElemType::rightReverser: + case TrackElemType::airThrustVerticalDown: + case TrackElemType::blockBrakes: + case TrackElemType::up25ToLeftBankedUp25: + case TrackElemType::up25ToRightBankedUp25: + case TrackElemType::leftBankedUp25ToUp25: + case TrackElemType::rightBankedUp25ToUp25: + case TrackElemType::down25ToLeftBankedDown25: + case TrackElemType::down25ToRightBankedDown25: + case TrackElemType::leftBankedDown25ToDown25: + case TrackElemType::rightBankedDown25ToDown25: + case TrackElemType::leftQuarterTurn1TileUp90: + case TrackElemType::rightQuarterTurn1TileUp90: + case TrackElemType::leftQuarterTurn1TileDown90: + case TrackElemType::rightQuarterTurn1TileDown90: + case TrackElemType::leftEighthToDiagUp25: + case TrackElemType::rightEighthToDiagUp25: + case TrackElemType::leftEighthToDiagDown25: + case TrackElemType::rightEighthToDiagDown25: + case TrackElemType::leftEighthToOrthogonalUp25: + case TrackElemType::rightEighthToOrthogonalUp25: + case TrackElemType::leftEighthToOrthogonalDown25: + case TrackElemType::rightEighthToOrthogonalDown25: + case TrackElemType::diagUp25ToLeftBankedUp25: + case TrackElemType::diagUp25ToRightBankedUp25: + case TrackElemType::diagLeftBankedUp25ToUp25: + case TrackElemType::diagRightBankedUp25ToUp25: + case TrackElemType::diagDown25ToLeftBankedDown25: + case TrackElemType::diagDown25ToRightBankedDown25: + case TrackElemType::diagLeftBankedDown25ToDown25: + case TrackElemType::diagRightBankedDown25ToDown25: + case TrackElemType::diagUp25LeftBanked: + case TrackElemType::diagUp25RightBanked: + case TrackElemType::diagDown25LeftBanked: + case TrackElemType::diagDown25RightBanked: return EvaluatorConst<0>; - case TrackElemType::FlatToUp25: // - case TrackElemType::Down25ToFlat: // - case TrackElemType::LeftBankToUp25: - case TrackElemType::RightBankToUp25: - case TrackElemType::Down25ToLeftBank: - case TrackElemType::Down25ToRightBank: - case TrackElemType::FlatToUp25Covered: - case TrackElemType::Down25ToFlatCovered: - case TrackElemType::LeftBankedFlatToLeftBankedUp25: - case TrackElemType::RightBankedFlatToRightBankedUp25: - case TrackElemType::LeftBankedDown25ToLeftBankedFlat: - case TrackElemType::RightBankedDown25ToRightBankedFlat: - case TrackElemType::FlatToLeftBankedUp25: - case TrackElemType::FlatToRightBankedUp25: - case TrackElemType::LeftBankedDown25ToFlat: - case TrackElemType::RightBankedDown25ToFlat: + case TrackElemType::flatToUp25: // + case TrackElemType::down25ToFlat: // + case TrackElemType::leftBankToUp25: + case TrackElemType::rightBankToUp25: + case TrackElemType::down25ToLeftBank: + case TrackElemType::down25ToRightBank: + case TrackElemType::flatToUp25Covered: + case TrackElemType::down25ToFlatCovered: + case TrackElemType::leftBankedFlatToLeftBankedUp25: + case TrackElemType::rightBankedFlatToRightBankedUp25: + case TrackElemType::leftBankedDown25ToLeftBankedFlat: + case TrackElemType::rightBankedDown25ToRightBankedFlat: + case TrackElemType::flatToLeftBankedUp25: + case TrackElemType::flatToRightBankedUp25: + case TrackElemType::leftBankedDown25ToFlat: + case TrackElemType::rightBankedDown25ToFlat: return EvaluatorConst<103>; - case TrackElemType::Up25ToFlat: // - case TrackElemType::FlatToDown25: // - case TrackElemType::Up25ToLeftBank: - case TrackElemType::Up25ToRightBank: - case TrackElemType::LeftBankToDown25: - case TrackElemType::RightBankToDown25: - case TrackElemType::Up25ToFlatCovered: - case TrackElemType::FlatToDown25Covered: - case TrackElemType::CableLiftHill: - case TrackElemType::LeftBankedUp25ToLeftBankedFlat: - case TrackElemType::RightBankedUp25ToRightBankedFlat: - case TrackElemType::LeftBankedFlatToLeftBankedDown25: - case TrackElemType::RightBankedFlatToRightBankedDown25: - case TrackElemType::LeftBankedUp25ToFlat: - case TrackElemType::RightBankedUp25ToFlat: - case TrackElemType::FlatToLeftBankedDown25: - case TrackElemType::FlatToRightBankedDown25: + case TrackElemType::up25ToFlat: // + case TrackElemType::flatToDown25: // + case TrackElemType::up25ToLeftBank: + case TrackElemType::up25ToRightBank: + case TrackElemType::leftBankToDown25: + case TrackElemType::rightBankToDown25: + case TrackElemType::up25ToFlatCovered: + case TrackElemType::flatToDown25Covered: + case TrackElemType::cableLiftHill: + case TrackElemType::leftBankedUp25ToLeftBankedFlat: + case TrackElemType::rightBankedUp25ToRightBankedFlat: + case TrackElemType::leftBankedFlatToLeftBankedDown25: + case TrackElemType::rightBankedFlatToRightBankedDown25: + case TrackElemType::leftBankedUp25ToFlat: + case TrackElemType::rightBankedUp25ToFlat: + case TrackElemType::flatToLeftBankedDown25: + case TrackElemType::flatToRightBankedDown25: return EvaluatorConst<-103>; - case TrackElemType::Up25ToUp60: // - case TrackElemType::Down60ToDown25: // - case TrackElemType::Up25ToUp60Covered: - case TrackElemType::Down60ToDown25Covered: + case TrackElemType::up25ToUp60: // + case TrackElemType::down60ToDown25: // + case TrackElemType::up25ToUp60Covered: + case TrackElemType::down60ToDown25Covered: return EvaluatorConst<82>; - case TrackElemType::Up60ToUp25: // - case TrackElemType::Down25ToDown60: // - case TrackElemType::Up60ToUp25Covered: - case TrackElemType::Down25ToDown60Covered: + case TrackElemType::up60ToUp25: // + case TrackElemType::down25ToDown60: // + case TrackElemType::up60ToUp25Covered: + case TrackElemType::down25ToDown60Covered: return EvaluatorConst<-82>; - case TrackElemType::LeftQuarterTurn5Tiles: // - case TrackElemType::LeftQuarterTurn5TilesUp25: - case TrackElemType::LeftQuarterTurn5TilesDown25: - case TrackElemType::LeftTwistDownToUp: - case TrackElemType::LeftTwistUpToDown: - case TrackElemType::LeftQuarterTurn5TilesCovered: - case TrackElemType::LeftQuarterHelixLargeUp: - case TrackElemType::LeftQuarterHelixLargeDown: - case TrackElemType::LeftFlyerTwistUp: - case TrackElemType::LeftFlyerTwistDown: - case TrackElemType::LeftHeartLineRoll: + case TrackElemType::leftQuarterTurn5Tiles: // + case TrackElemType::leftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesDown25: + case TrackElemType::leftTwistDownToUp: + case TrackElemType::leftTwistUpToDown: + case TrackElemType::leftQuarterTurn5TilesCovered: + case TrackElemType::leftQuarterHelixLargeUp: + case TrackElemType::leftQuarterHelixLargeDown: + case TrackElemType::leftFlyerTwistUp: + case TrackElemType::leftFlyerTwistDown: + case TrackElemType::leftHeartLineRoll: return EvaluatorConst<0>; - case TrackElemType::RightQuarterTurn5Tiles: // - case TrackElemType::RightQuarterTurn5TilesUp25: - case TrackElemType::RightQuarterTurn5TilesDown25: - case TrackElemType::RightTwistDownToUp: - case TrackElemType::RightTwistUpToDown: - case TrackElemType::RightQuarterTurn5TilesCovered: - case TrackElemType::RightQuarterHelixLargeUp: - case TrackElemType::RightQuarterHelixLargeDown: - case TrackElemType::RightFlyerTwistUp: - case TrackElemType::RightFlyerTwistDown: - case TrackElemType::RightHeartLineRoll: + case TrackElemType::rightQuarterTurn5Tiles: // + case TrackElemType::rightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesDown25: + case TrackElemType::rightTwistDownToUp: + case TrackElemType::rightTwistUpToDown: + case TrackElemType::rightQuarterTurn5TilesCovered: + case TrackElemType::rightQuarterHelixLargeUp: + case TrackElemType::rightQuarterHelixLargeDown: + case TrackElemType::rightFlyerTwistUp: + case TrackElemType::rightFlyerTwistDown: + case TrackElemType::rightHeartLineRoll: return EvaluatorConst<0>; - case TrackElemType::BankedLeftQuarterTurn5Tiles: - case TrackElemType::LeftHalfBankedHelixUpLarge: - case TrackElemType::LeftHalfBankedHelixDownLarge: - case TrackElemType::LeftQuarterBankedHelixLargeUp: - case TrackElemType::LeftQuarterBankedHelixLargeDown: + case TrackElemType::bankedLeftQuarterTurn5Tiles: + case TrackElemType::leftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: + case TrackElemType::leftQuarterBankedHelixLargeUp: + case TrackElemType::leftQuarterBankedHelixLargeDown: return EvaluatorConst<200>; - case TrackElemType::BankedRightQuarterTurn5Tiles: - case TrackElemType::RightHalfBankedHelixUpLarge: - case TrackElemType::RightHalfBankedHelixDownLarge: - case TrackElemType::RightQuarterBankedHelixLargeUp: - case TrackElemType::RightQuarterBankedHelixLargeDown: + case TrackElemType::bankedRightQuarterTurn5Tiles: + case TrackElemType::rightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: + case TrackElemType::rightQuarterBankedHelixLargeUp: + case TrackElemType::rightQuarterBankedHelixLargeDown: return EvaluatorConst<200>; - case TrackElemType::SBendLeft: - case TrackElemType::SBendLeftCovered: + case TrackElemType::sBendLeft: + case TrackElemType::sBendLeftCovered: return EvaluatorConst<0>; - case TrackElemType::SBendRight: - case TrackElemType::SBendRightCovered: + case TrackElemType::sBendRight: + case TrackElemType::sBendRightCovered: return EvaluatorConst<0>; - case TrackElemType::LeftVerticalLoop: - case TrackElemType::RightVerticalLoop: + case TrackElemType::leftVerticalLoop: + case TrackElemType::rightVerticalLoop: return EvaluatorVerticalLoop; - case TrackElemType::LeftQuarterTurn3Tiles: - case TrackElemType::LeftQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25: - case TrackElemType::LeftQuarterTurn3TilesCovered: - case TrackElemType::LeftCurvedLiftHill: + case TrackElemType::leftQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesCovered: + case TrackElemType::leftCurvedLiftHill: return EvaluatorConst<0>; - case TrackElemType::RightQuarterTurn3Tiles: - case TrackElemType::RightQuarterTurn3TilesUp25: - case TrackElemType::RightQuarterTurn3TilesDown25: - case TrackElemType::RightQuarterTurn3TilesCovered: - case TrackElemType::RightCurvedLiftHill: + case TrackElemType::rightQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesCovered: + case TrackElemType::rightCurvedLiftHill: return EvaluatorConst<0>; - case TrackElemType::LeftBankedQuarterTurn3Tiles: - case TrackElemType::LeftHalfBankedHelixUpSmall: - case TrackElemType::LeftHalfBankedHelixDownSmall: + case TrackElemType::leftBankedQuarterTurn3Tiles: + case TrackElemType::leftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: return EvaluatorConst<100>; - case TrackElemType::RightBankedQuarterTurn3Tiles: - case TrackElemType::RightHalfBankedHelixUpSmall: - case TrackElemType::RightHalfBankedHelixDownSmall: + case TrackElemType::rightBankedQuarterTurn3Tiles: + case TrackElemType::rightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: return EvaluatorConst<100>; - case TrackElemType::LeftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1Tile: return EvaluatorConst<0>; - case TrackElemType::RightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1Tile: return EvaluatorConst<0>; - case TrackElemType::HalfLoopUp: - case TrackElemType::FlyerHalfLoopUninvertedUp: - case TrackElemType::FlyerHalfLoopInvertedUp: + case TrackElemType::halfLoopUp: + case TrackElemType::flyerHalfLoopUninvertedUp: + case TrackElemType::flyerHalfLoopInvertedUp: return EvaluatorHalfLoopUp; - case TrackElemType::HalfLoopDown: - case TrackElemType::FlyerHalfLoopInvertedDown: - case TrackElemType::FlyerHalfLoopUninvertedDown: + case TrackElemType::halfLoopDown: + case TrackElemType::flyerHalfLoopInvertedDown: + case TrackElemType::flyerHalfLoopUninvertedDown: return EvaluatorHalfLoopDown; - case TrackElemType::LeftLargeCorkscrewUp: - case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::leftLargeCorkscrewUp: + case TrackElemType::rightLargeCorkscrewDown: return EvaluatorConst<89>; - case TrackElemType::RightLargeCorkscrewUp: - case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::rightLargeCorkscrewUp: + case TrackElemType::leftLargeCorkscrewDown: return EvaluatorConst<89>; - case TrackElemType::LeftCorkscrewUp: - case TrackElemType::RightCorkscrewDown: - case TrackElemType::LeftFlyerCorkscrewUp: - case TrackElemType::RightFlyerCorkscrewDown: + case TrackElemType::leftCorkscrewUp: + case TrackElemType::rightCorkscrewDown: + case TrackElemType::leftFlyerCorkscrewUp: + case TrackElemType::rightFlyerCorkscrewDown: return EvaluatorConst<52>; - case TrackElemType::RightCorkscrewUp: - case TrackElemType::LeftCorkscrewDown: - case TrackElemType::RightFlyerCorkscrewUp: - case TrackElemType::LeftFlyerCorkscrewDown: + case TrackElemType::rightCorkscrewUp: + case TrackElemType::leftCorkscrewDown: + case TrackElemType::rightFlyerCorkscrewUp: + case TrackElemType::leftFlyerCorkscrewDown: return EvaluatorConst<52>; - case TrackElemType::FlatToUp60: - case TrackElemType::Down60ToFlat: + case TrackElemType::flatToUp60: + case TrackElemType::down60ToFlat: return EvaluatorConst<56>; - case TrackElemType::Up60ToFlat: - case TrackElemType::FlatToDown60: - case TrackElemType::BrakeForDrop: + case TrackElemType::up60ToFlat: + case TrackElemType::flatToDown60: + case TrackElemType::brakeForDrop: return EvaluatorConst<-56>; - case TrackElemType::LeftQuarterTurn1TileUp60: - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileDown60: return EvaluatorConst<0>; - case TrackElemType::RightQuarterTurn1TileUp60: - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileDown60: return EvaluatorConst<0>; - case TrackElemType::Watersplash: + case TrackElemType::watersplash: return EvaluatorWaterSplash; - case TrackElemType::FlatToUp60LongBase: - case TrackElemType::Down60ToFlatLongBase: + case TrackElemType::flatToUp60LongBase: + case TrackElemType::down60ToFlatLongBase: return EvaluatorConst<160>; - case TrackElemType::Up60ToFlatLongBase: - case TrackElemType::FlatToDown60LongBase: + case TrackElemType::up60ToFlatLongBase: + case TrackElemType::flatToDown60LongBase: return EvaluatorConst<-160>; - case TrackElemType::DiagFlatToUp60LongBase: - case TrackElemType::DiagDown60ToFlatLongBase: + case TrackElemType::diagFlatToUp60LongBase: + case TrackElemType::diagDown60ToFlatLongBase: return EvaluatorConst<180>; - case TrackElemType::DiagUp60ToFlatLongBase: - case TrackElemType::DiagFlatToDown60LongBase: + case TrackElemType::diagUp60ToFlatLongBase: + case TrackElemType::diagFlatToDown60LongBase: return EvaluatorConst<-180>; - case TrackElemType::ReverseFreefallSlope: - case TrackElemType::AirThrustVerticalDownToLevel: + case TrackElemType::reverseFreefallSlope: + case TrackElemType::airThrustVerticalDownToLevel: return EvaluatorConst<120>; - case TrackElemType::Up60ToUp90: - case TrackElemType::Down90ToDown60: + case TrackElemType::up60ToUp90: + case TrackElemType::down90ToDown60: return EvaluatorConst<110>; - case TrackElemType::Up90ToUp60: - case TrackElemType::Down60ToDown90: + case TrackElemType::up90ToUp60: + case TrackElemType::down60ToDown90: return EvaluatorConst<-110>; - case TrackElemType::LeftEighthToDiag: - case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::leftEighthToDiag: + case TrackElemType::leftEighthToOrthogonal: return EvaluatorConst<0>; - case TrackElemType::RightEighthToDiag: - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::rightEighthToDiag: + case TrackElemType::rightEighthToOrthogonal: return EvaluatorConst<0>; - case TrackElemType::LeftEighthBankToDiag: - case TrackElemType::LeftEighthBankToOrthogonal: - case TrackElemType::LeftEighthBankToDiagUp25: - case TrackElemType::LeftEighthBankToDiagDown25: - case TrackElemType::LeftEighthBankToOrthogonalUp25: - case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::leftEighthBankToDiag: + case TrackElemType::leftEighthBankToOrthogonal: + case TrackElemType::leftEighthBankToDiagUp25: + case TrackElemType::leftEighthBankToDiagDown25: + case TrackElemType::leftEighthBankToOrthogonalUp25: + case TrackElemType::leftEighthBankToOrthogonalDown25: return EvaluatorConst<270>; - case TrackElemType::RightEighthBankToDiag: - case TrackElemType::RightEighthBankToOrthogonal: - case TrackElemType::RightEighthBankToDiagUp25: - case TrackElemType::RightEighthBankToDiagDown25: - case TrackElemType::RightEighthBankToOrthogonalUp25: - case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::rightEighthBankToDiag: + case TrackElemType::rightEighthBankToOrthogonal: + case TrackElemType::rightEighthBankToDiagUp25: + case TrackElemType::rightEighthBankToDiagDown25: + case TrackElemType::rightEighthBankToOrthogonalUp25: + case TrackElemType::rightEighthBankToOrthogonalDown25: return EvaluatorConst<270>; - case TrackElemType::DiagFlatToUp25: - case TrackElemType::DiagDown25ToFlat: - case TrackElemType::DiagLeftBankToUp25: - case TrackElemType::DiagRightBankToUp25: - case TrackElemType::DiagDown25ToLeftBank: - case TrackElemType::DiagDown25ToRightBank: - case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: - case TrackElemType::DiagRightBankedFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: - case TrackElemType::DiagFlatToLeftBankedUp25: - case TrackElemType::DiagFlatToRightBankedUp25: - case TrackElemType::DiagLeftBankedDown25ToFlat: - case TrackElemType::DiagRightBankedDown25ToFlat: + case TrackElemType::diagFlatToUp25: + case TrackElemType::diagDown25ToFlat: + case TrackElemType::diagLeftBankToUp25: + case TrackElemType::diagRightBankToUp25: + case TrackElemType::diagDown25ToLeftBank: + case TrackElemType::diagDown25ToRightBank: + case TrackElemType::diagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::diagRightBankedFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::diagRightBankedDown25ToRightBankedFlat: + case TrackElemType::diagFlatToLeftBankedUp25: + case TrackElemType::diagFlatToRightBankedUp25: + case TrackElemType::diagLeftBankedDown25ToFlat: + case TrackElemType::diagRightBankedDown25ToFlat: return EvaluatorConst<113>; - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagFlatToDown25: - case TrackElemType::DiagUp25ToLeftBank: - case TrackElemType::DiagUp25ToRightBank: - case TrackElemType::DiagLeftBankToDown25: - case TrackElemType::DiagRightBankToDown25: - case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: - case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: - case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: - case TrackElemType::DiagRightBankedFlatToRightBankedDown25: - case TrackElemType::DiagLeftBankedUp25ToFlat: - case TrackElemType::DiagRightBankedUp25ToFlat: - case TrackElemType::DiagFlatToLeftBankedDown25: - case TrackElemType::DiagFlatToRightBankedDown25: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagFlatToDown25: + case TrackElemType::diagUp25ToLeftBank: + case TrackElemType::diagUp25ToRightBank: + case TrackElemType::diagLeftBankToDown25: + case TrackElemType::diagRightBankToDown25: + case TrackElemType::diagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::diagRightBankedUp25ToRightBankedFlat: + case TrackElemType::diagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::diagRightBankedFlatToRightBankedDown25: + case TrackElemType::diagLeftBankedUp25ToFlat: + case TrackElemType::diagRightBankedUp25ToFlat: + case TrackElemType::diagFlatToLeftBankedDown25: + case TrackElemType::diagFlatToRightBankedDown25: return EvaluatorConst<-113>; - case TrackElemType::DiagUp25ToUp60: - case TrackElemType::DiagDown60ToDown25: + case TrackElemType::diagUp25ToUp60: + case TrackElemType::diagDown60ToDown25: return EvaluatorConst<95>; - case TrackElemType::DiagUp60ToUp25: - case TrackElemType::DiagDown25ToDown60: + case TrackElemType::diagUp60ToUp25: + case TrackElemType::diagDown25ToDown60: return EvaluatorConst<-95>; - case TrackElemType::DiagFlatToUp60: - case TrackElemType::DiagDown60ToFlat: + case TrackElemType::diagFlatToUp60: + case TrackElemType::diagDown60ToFlat: return EvaluatorConst<60>; - case TrackElemType::DiagUp60ToFlat: - case TrackElemType::DiagFlatToDown60: + case TrackElemType::diagUp60ToFlat: + case TrackElemType::diagFlatToDown60: return EvaluatorConst<-60>; - case TrackElemType::LeftBarrelRollUpToDown: - case TrackElemType::LeftBarrelRollDownToUp: + case TrackElemType::leftBarrelRollUpToDown: + case TrackElemType::leftBarrelRollDownToUp: return EvaluatorConst<170>; - case TrackElemType::RightBarrelRollUpToDown: - case TrackElemType::RightBarrelRollDownToUp: + case TrackElemType::rightBarrelRollUpToDown: + case TrackElemType::rightBarrelRollDownToUp: return EvaluatorConst<170>; - case TrackElemType::LeftZeroGRollUp: - case TrackElemType::RightZeroGRollUp: + case TrackElemType::leftZeroGRollUp: + case TrackElemType::rightZeroGRollUp: return EvaluatorConst<250>; - case TrackElemType::LeftZeroGRollDown: - case TrackElemType::RightZeroGRollDown: + case TrackElemType::leftZeroGRollDown: + case TrackElemType::rightZeroGRollDown: return EvaluatorConst<250>; - case TrackElemType::LeftLargeZeroGRollUp: - case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::leftLargeZeroGRollUp: + case TrackElemType::rightLargeZeroGRollUp: return EvaluatorLargeZeroGRollUp; - case TrackElemType::LeftLargeZeroGRollDown: - case TrackElemType::RightLargeZeroGRollDown: + case TrackElemType::leftLargeZeroGRollDown: + case TrackElemType::rightLargeZeroGRollDown: return EvaluatorLargeZeroGRollDown; - case TrackElemType::LeftEighthDiveLoopUpToOrthogonal: - case TrackElemType::RightEighthDiveLoopUpToOrthogonal: + case TrackElemType::leftEighthDiveLoopUpToOrthogonal: + case TrackElemType::rightEighthDiveLoopUpToOrthogonal: return EvaluatorDiveLoopUp; - case TrackElemType::LeftEighthDiveLoopDownToDiag: - case TrackElemType::RightEighthDiveLoopDownToDiag: + case TrackElemType::leftEighthDiveLoopDownToDiag: + case TrackElemType::rightEighthDiveLoopDownToDiag: return EvaluatorDiveLoopDown; - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: return EvaluatorQuarterTurn3Tiles; - case TrackElemType::LeftMediumHalfLoopUp: - case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::leftMediumHalfLoopUp: + case TrackElemType::rightMediumHalfLoopUp: return EvaluatorMediumHalfLoopUp; - case TrackElemType::RightMediumHalfLoopDown: - case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::rightMediumHalfLoopDown: + case TrackElemType::leftMediumHalfLoopDown: return EvaluatorMediumHalfLoopDown; - case TrackElemType::LeftLargeHalfLoopUp: - case TrackElemType::RightLargeHalfLoopUp: - case TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp: - case TrackElemType::RightFlyerLargeHalfLoopUninvertedUp: - case TrackElemType::LeftFlyerLargeHalfLoopInvertedUp: - case TrackElemType::RightFlyerLargeHalfLoopInvertedUp: + case TrackElemType::leftLargeHalfLoopUp: + case TrackElemType::rightLargeHalfLoopUp: + case TrackElemType::leftFlyerLargeHalfLoopUninvertedUp: + case TrackElemType::rightFlyerLargeHalfLoopUninvertedUp: + case TrackElemType::leftFlyerLargeHalfLoopInvertedUp: + case TrackElemType::rightFlyerLargeHalfLoopInvertedUp: return EvaluatorLargeHalfLoopUp; - case TrackElemType::LeftLargeHalfLoopDown: - case TrackElemType::RightLargeHalfLoopDown: - case TrackElemType::LeftFlyerLargeHalfLoopInvertedDown: - case TrackElemType::RightFlyerLargeHalfLoopInvertedDown: - case TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown: - case TrackElemType::RightFlyerLargeHalfLoopUninvertedDown: + case TrackElemType::leftLargeHalfLoopDown: + case TrackElemType::rightLargeHalfLoopDown: + case TrackElemType::leftFlyerLargeHalfLoopInvertedDown: + case TrackElemType::rightFlyerLargeHalfLoopInvertedDown: + case TrackElemType::leftFlyerLargeHalfLoopUninvertedDown: + case TrackElemType::rightFlyerLargeHalfLoopUninvertedDown: return EvaluatorLargeHalfLoopDown; - case TrackElemType::HeartLineTransferUp: + case TrackElemType::heartLineTransferUp: return EvaluatorHeartLineTransferUp; - case TrackElemType::HeartLineTransferDown: + case TrackElemType::heartLineTransferDown: return EvaluatorHeartLineTransferDown; - case TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop: - case TrackElemType::InvertedFlatToDown90QuarterLoop: - case TrackElemType::MultiDimFlatToDown90QuarterLoop: + case TrackElemType::multiDimInvertedFlatToDown90QuarterLoop: + case TrackElemType::invertedFlatToDown90QuarterLoop: + case TrackElemType::multiDimFlatToDown90QuarterLoop: return EvaluatorDown90QuarterLoop; - case TrackElemType::Up90ToInvertedFlatQuarterLoop: - case TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop: - case TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop: + case TrackElemType::up90ToInvertedFlatQuarterLoop: + case TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop: + case TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop: return EvaluatorUp90QuarterLoop; - case TrackElemType::AirThrustTopCap: + case TrackElemType::airThrustTopCap: return EvaluatorConst<-60>; - case TrackElemType::LeftBankedQuarterTurn3TileUp25: - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: return EvaluatorConst<200>; - case TrackElemType::RightBankedQuarterTurn3TileUp25: - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: return EvaluatorConst<200>; - case TrackElemType::LeftBankedQuarterTurn5TileUp25: - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: return EvaluatorConst<200>; - case TrackElemType::RightBankedQuarterTurn5TileUp25: - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: return EvaluatorConst<200>; default: return EvaluatorConst<0>; @@ -4602,13 +4244,13 @@ namespace OpenRCT2::TrackMetaData STR_HELIX_UP_RIGHT, // 107 STR_HELIX_DOWN_LEFT, // 108 STR_HELIX_DOWN_RIGHT, // 109 - kStringIdEmpty, // TrackElemType::Up25LeftBanked - kStringIdEmpty, // TrackElemType::Up25RighBanked + kStringIdEmpty, // TrackElemType::up25LeftBanked + kStringIdEmpty, // TrackElemType::up25RighBanked STR_WATERFALLS, // 112 STR_RAPIDS, // 113 STR_ON_RIDE_PHOTO_SECTION, // 114 - kStringIdEmpty, // TrackElemType::Down25LeftBanked - kStringIdEmpty, // TrackElemType::Down25RightBanked + kStringIdEmpty, // TrackElemType::down25LeftBanked + kStringIdEmpty, // TrackElemType::down25RightBanked STR_WATER_SPLASH, // 117 kStringIdEmpty, // 118 kStringIdEmpty, // 119 @@ -4749,101 +4391,101 @@ namespace OpenRCT2::TrackMetaData STR_QUARTER_LOOP, // 254 STR_QUARTER_LOOP, // 255 STR_SPINNING_CONTROL_TOGGLE_TRACK, // 256 - kStringIdEmpty, // TrackElemType::FlatTrack1x4A - STR_BASE_SIZE_2_X_2, // TrackElemType::FlatTrack2x2 - STR_BASE_SIZE_4_X_4, // TrackElemType::FlatTrack4x4 - STR_BASE_SIZE_2_X_4, // TrackElemType::FlatTrack2x4 - STR_BASE_SIZE_5_X_1, // TrackElemType::FlatTrack1x5 - kStringIdEmpty, // TrackElemType::FlatTrack1x1A - kStringIdEmpty, // TrackElemType::FlatTrack1x4B - kStringIdEmpty, // TrackElemType::FlatTrack1x1B - kStringIdEmpty, // TrackElemType::FlatTrack1x4C - kStringIdEmpty, // TrackElemType::FlatTrack3x3 - STR_LARGE_HALF_CORKSCREW_LEFT, // TrackElemType::LeftCorkscrewUp - STR_LARGE_HALF_CORKSCREW_RIGHT, // TrackElemType::RightCorkscrewUp - STR_LARGE_HALF_CORKSCREW_LEFT, // TrackElemType::LeftCorkscrewDown - STR_LARGE_HALF_CORKSCREW_RIGHT, // TrackElemType::RightCorkscrewDown - STR_MEDIUM_HALF_LOOP_LEFT, // TrackElemType::LeftMediumHalfLoopUp - STR_MEDIUM_HALF_LOOP_RIGHT, // TrackElemType::RightMediumHalfLoopUp - STR_MEDIUM_HALF_LOOP_LEFT, // TrackElemType::LeftMediumHalfLoopDown - STR_MEDIUM_HALF_LOOP_RIGHT, // TrackElemType::RightMediumHalfLoopDown - STR_ZERO_G_ROLL_LEFT, // TrackElemType::LeftZeroGRollUp - STR_ZERO_G_ROLL_RIGHT, // TrackElemType::RightZeroGRollUp - STR_ZERO_G_ROLL_LEFT, // TrackElemType::LeftZeroGRollDown - STR_ZERO_G_ROLL_RIGHT, // TrackElemType::RightZeroGRollDown - STR_LARGE_ZERO_G_ROLL_LEFT, // TrackElemType::LeftLargeZeroGRollUp - STR_LARGE_ZERO_G_ROLL_RIGHT, // TrackElemType::RightLargeZeroGRollUp - STR_LARGE_ZERO_G_ROLL_LEFT, // TrackElemType::LeftLargeZeroGRollDown - STR_LARGE_ZERO_G_ROLL_RIGHT, // TrackElemType::RightLargeZeroGRollDown - STR_LARGE_HALF_LOOP_LEFT, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp - STR_LARGE_HALF_LOOP_RIGHT, // TrackElemType::RightFlyerLargeHalfLoopUninvertedUp - STR_LARGE_HALF_LOOP_LEFT, // TrackElemType::LeftFlyerLargeHalfLoopInvertedDown - STR_LARGE_HALF_LOOP_RIGHT, // TrackElemType::RightFlyerLargeHalfLoopInvertedDown - STR_LARGE_HALF_LOOP_LEFT, // TrackElemType::LeftFlyerLargeHalfLoopInvertedUp - STR_LARGE_HALF_LOOP_RIGHT, // TrackElemType::RightFlyerLargeHalfLoopInvertedUp - STR_LARGE_HALF_LOOP_LEFT, // TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown - STR_LARGE_HALF_LOOP_RIGHT, // TrackElemType::RightFlyerLargeHalfLoopUninvertedDown - STR_HALF_LOOP, // TrackElemType::FlyerHalfLoopInvertedUp - STR_HALF_LOOP, // TrackElemType::FlyerHalfLoopUninvertedDown - kStringIdEmpty, // TrackElemType::LeftEighthToDiagUp25 - kStringIdEmpty, // TrackElemType::RightEighthToDiagUp25 - kStringIdEmpty, // TrackElemType::LeftEighthToDiagDown25 - kStringIdEmpty, // TrackElemType::RightEighthToDiagDown25 - kStringIdEmpty, // TrackElemType::LeftEighthToOrthogonalUp25 - kStringIdEmpty, // TrackElemType::RightEighthToOrthogonalUp25 - kStringIdEmpty, // TrackElemType::LeftEighthToOrthogonalDown25 - kStringIdEmpty, // TrackElemType::RightEighthToOrthogonalDown25 - kStringIdEmpty, // TrackElemType::DiagUp25ToLeftBankedUp25 - kStringIdEmpty, // TrackElemType::DiagUp25ToRightBankedUp25 - kStringIdEmpty, // TrackElemType::DiagLeftBankedUp25ToUp25 - kStringIdEmpty, // TrackElemType::DiagRightBankedUp25ToUp25 - kStringIdEmpty, // TrackElemType::DiagDown25ToLeftBankedDown25 - kStringIdEmpty, // TrackElemType::DiagDown25ToRightBankedDown25 - kStringIdEmpty, // TrackElemType::DiagLeftBankedDown25ToDown25 - kStringIdEmpty, // TrackElemType::DiagRightBankedDown25ToDown25 - kStringIdEmpty, // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - kStringIdEmpty, // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - kStringIdEmpty, // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - kStringIdEmpty, // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - kStringIdEmpty, // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - kStringIdEmpty, // TrackElemType::DiagRightBankedFlatToRightBankedDown25 - kStringIdEmpty, // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - kStringIdEmpty, // TrackElemType::DiagRightBankedDown25ToRightBankedFlat - kStringIdEmpty, // TrackElemType::DiagFlatToLeftBankedUp25 - kStringIdEmpty, // TrackElemType::DiagFlatToRightBankedUp25 - kStringIdEmpty, // TrackElemType::DiagLeftBankedUp25ToFlat - kStringIdEmpty, // TrackElemType::DiagRightBankedUp25ToFlat - kStringIdEmpty, // TrackElemType::DiagFlatToLeftBankedDown25 - kStringIdEmpty, // TrackElemType::DiagFlatToRightBankedDown25 - kStringIdEmpty, // TrackElemType::DiagLeftBankedDown25ToFlat - kStringIdEmpty, // TrackElemType::DiagRightBankedDown25ToFlat - kStringIdEmpty, // TrackElemType::Up25LeftBanked - kStringIdEmpty, // TrackElemType::Up25RightBanked - kStringIdEmpty, // TrackElemType::Down25LeftBanked - kStringIdEmpty, // TrackElemType::Down25RightBanked - kStringIdEmpty, // TrackElemType::LeftEighthBankToDiagUp25 - kStringIdEmpty, // TrackElemType::RightEighthBankToDiagUp25 - kStringIdEmpty, // TrackElemType::LeftEighthBankToDiagDown25 - kStringIdEmpty, // TrackElemType::RightEighthBankToDiagDown25 - kStringIdEmpty, // TrackElemType::LeftEighthBankToOrthogonalUp25 - kStringIdEmpty, // TrackElemType::RightEighthBankToOrthogonalUp25 - kStringIdEmpty, // TrackElemType::LeftEighthBankToOrthogonalDown25 - kStringIdEmpty, // TrackElemType::RightEighthBankToOrthogonalDown25 - STR_BRAKES, // TrackElemType::DiagBrakes - STR_BLOCK_BRAKES, // TrackElemType::DiagBlockBrakes - STR_BRAKES, // TrackElemType::Down25Brakes - STR_BOOSTER, // TrackElemType::DiagBooster - kStringIdEmpty, // TrackElemType::DiagFlatToUp60LongBase, - kStringIdEmpty, // TrackElemType::DiagUp60ToFlatLongBase, - kStringIdEmpty, // TrackElemType::DiagFlatToDown60LongBase, - kStringIdEmpty, // TrackElemType::DiagDown60ToFlatLongBase, - STR_DIVE_LOOP_LEFT, // TrackElemType::LeftEighthDiveLoopUpToOrthogonal - STR_DIVE_LOOP_RIGHT, // TrackElemType::RightEighthDiveLoopUpToOrthogonal - STR_DIVE_LOOP_LEFT, // TrackElemType::LeftEighthDiveLoopDownToDiag - STR_DIVE_LOOP_RIGHT, // TrackElemType::RightEighthDiveLoopDownToDiag - STR_BRAKES, // TrackElemType::DiagDown25Brakes - }; - static_assert(std::size(kRideConfigurationStringIds) == EnumValue(TrackElemType::Count)); + kStringIdEmpty, // TrackElemType::flatTrack1x4A + STR_BASE_SIZE_2_X_2, // TrackElemType::flatTrack2x2 + STR_BASE_SIZE_4_X_4, // TrackElemType::flatTrack4x4 + STR_BASE_SIZE_2_X_4, // TrackElemType::flatTrack2x4 + STR_BASE_SIZE_5_X_1, // TrackElemType::flatTrack1x5 + kStringIdEmpty, // TrackElemType::flatTrack1x1A + kStringIdEmpty, // TrackElemType::flatTrack1x4B + kStringIdEmpty, // TrackElemType::flatTrack1x1B + kStringIdEmpty, // TrackElemType::flatTrack1x4C + kStringIdEmpty, // TrackElemType::flatTrack3x3 + STR_LARGE_HALF_CORKSCREW_LEFT, // TrackElemType::leftCorkscrewUp + STR_LARGE_HALF_CORKSCREW_RIGHT, // TrackElemType::rightCorkscrewUp + STR_LARGE_HALF_CORKSCREW_LEFT, // TrackElemType::leftCorkscrewDown + STR_LARGE_HALF_CORKSCREW_RIGHT, // TrackElemType::rightCorkscrewDown + STR_MEDIUM_HALF_LOOP_LEFT, // TrackElemType::leftMediumHalfLoopUp + STR_MEDIUM_HALF_LOOP_RIGHT, // TrackElemType::rightMediumHalfLoopUp + STR_MEDIUM_HALF_LOOP_LEFT, // TrackElemType::leftMediumHalfLoopDown + STR_MEDIUM_HALF_LOOP_RIGHT, // TrackElemType::rightMediumHalfLoopDown + STR_ZERO_G_ROLL_LEFT, // TrackElemType::leftZeroGRollUp + STR_ZERO_G_ROLL_RIGHT, // TrackElemType::rightZeroGRollUp + STR_ZERO_G_ROLL_LEFT, // TrackElemType::leftZeroGRollDown + STR_ZERO_G_ROLL_RIGHT, // TrackElemType::rightZeroGRollDown + STR_LARGE_ZERO_G_ROLL_LEFT, // TrackElemType::leftLargeZeroGRollUp + STR_LARGE_ZERO_G_ROLL_RIGHT, // TrackElemType::rightLargeZeroGRollUp + STR_LARGE_ZERO_G_ROLL_LEFT, // TrackElemType::leftLargeZeroGRollDown + STR_LARGE_ZERO_G_ROLL_RIGHT, // TrackElemType::rightLargeZeroGRollDown + STR_LARGE_HALF_LOOP_LEFT, // TrackElemType::leftFlyerLargeHalfLoopUninvertedUp + STR_LARGE_HALF_LOOP_RIGHT, // TrackElemType::rightFlyerLargeHalfLoopUninvertedUp + STR_LARGE_HALF_LOOP_LEFT, // TrackElemType::leftFlyerLargeHalfLoopInvertedDown + STR_LARGE_HALF_LOOP_RIGHT, // TrackElemType::rightFlyerLargeHalfLoopInvertedDown + STR_LARGE_HALF_LOOP_LEFT, // TrackElemType::leftFlyerLargeHalfLoopInvertedUp + STR_LARGE_HALF_LOOP_RIGHT, // TrackElemType::rightFlyerLargeHalfLoopInvertedUp + STR_LARGE_HALF_LOOP_LEFT, // TrackElemType::leftFlyerLargeHalfLoopUninvertedDown + STR_LARGE_HALF_LOOP_RIGHT, // TrackElemType::rightFlyerLargeHalfLoopUninvertedDown + STR_HALF_LOOP, // TrackElemType::flyerHalfLoopInvertedUp + STR_HALF_LOOP, // TrackElemType::flyerHalfLoopUninvertedDown + kStringIdEmpty, // TrackElemType::leftEighthToDiagUp25 + kStringIdEmpty, // TrackElemType::rightEighthToDiagUp25 + kStringIdEmpty, // TrackElemType::leftEighthToDiagDown25 + kStringIdEmpty, // TrackElemType::rightEighthToDiagDown25 + kStringIdEmpty, // TrackElemType::leftEighthToOrthogonalUp25 + kStringIdEmpty, // TrackElemType::rightEighthToOrthogonalUp25 + kStringIdEmpty, // TrackElemType::leftEighthToOrthogonalDown25 + kStringIdEmpty, // TrackElemType::rightEighthToOrthogonalDown25 + kStringIdEmpty, // TrackElemType::diagUp25ToLeftBankedUp25 + kStringIdEmpty, // TrackElemType::diagUp25ToRightBankedUp25 + kStringIdEmpty, // TrackElemType::diagLeftBankedUp25ToUp25 + kStringIdEmpty, // TrackElemType::diagRightBankedUp25ToUp25 + kStringIdEmpty, // TrackElemType::diagDown25ToLeftBankedDown25 + kStringIdEmpty, // TrackElemType::diagDown25ToRightBankedDown25 + kStringIdEmpty, // TrackElemType::diagLeftBankedDown25ToDown25 + kStringIdEmpty, // TrackElemType::diagRightBankedDown25ToDown25 + kStringIdEmpty, // TrackElemType::diagLeftBankedFlatToLeftBankedUp25 + kStringIdEmpty, // TrackElemType::diagRightBankedFlatToRightBankedUp25 + kStringIdEmpty, // TrackElemType::diagLeftBankedUp25ToLeftBankedFlat + kStringIdEmpty, // TrackElemType::diagRightBankedUp25ToRightBankedFlat + kStringIdEmpty, // TrackElemType::diagLeftBankedFlatToLeftBankedDown25 + kStringIdEmpty, // TrackElemType::diagRightBankedFlatToRightBankedDown25 + kStringIdEmpty, // TrackElemType::diagLeftBankedDown25ToLeftBankedFlat + kStringIdEmpty, // TrackElemType::diagRightBankedDown25ToRightBankedFlat + kStringIdEmpty, // TrackElemType::diagFlatToLeftBankedUp25 + kStringIdEmpty, // TrackElemType::diagFlatToRightBankedUp25 + kStringIdEmpty, // TrackElemType::diagLeftBankedUp25ToFlat + kStringIdEmpty, // TrackElemType::diagRightBankedUp25ToFlat + kStringIdEmpty, // TrackElemType::diagFlatToLeftBankedDown25 + kStringIdEmpty, // TrackElemType::diagFlatToRightBankedDown25 + kStringIdEmpty, // TrackElemType::diagLeftBankedDown25ToFlat + kStringIdEmpty, // TrackElemType::diagRightBankedDown25ToFlat + kStringIdEmpty, // TrackElemType::up25LeftBanked + kStringIdEmpty, // TrackElemType::up25RightBanked + kStringIdEmpty, // TrackElemType::down25LeftBanked + kStringIdEmpty, // TrackElemType::down25RightBanked + kStringIdEmpty, // TrackElemType::leftEighthBankToDiagUp25 + kStringIdEmpty, // TrackElemType::rightEighthBankToDiagUp25 + kStringIdEmpty, // TrackElemType::leftEighthBankToDiagDown25 + kStringIdEmpty, // TrackElemType::rightEighthBankToDiagDown25 + kStringIdEmpty, // TrackElemType::leftEighthBankToOrthogonalUp25 + kStringIdEmpty, // TrackElemType::rightEighthBankToOrthogonalUp25 + kStringIdEmpty, // TrackElemType::leftEighthBankToOrthogonalDown25 + kStringIdEmpty, // TrackElemType::rightEighthBankToOrthogonalDown25 + STR_BRAKES, // TrackElemType::diagBrakes + STR_BLOCK_BRAKES, // TrackElemType::diagBlockBrakes + STR_BRAKES, // TrackElemType::down25Brakes + STR_BOOSTER, // TrackElemType::diagBooster + kStringIdEmpty, // TrackElemType::diagFlatToUp60LongBase, + kStringIdEmpty, // TrackElemType::diagUp60ToFlatLongBase, + kStringIdEmpty, // TrackElemType::diagFlatToDown60LongBase, + kStringIdEmpty, // TrackElemType::diagDown60ToFlatLongBase, + STR_DIVE_LOOP_LEFT, // TrackElemType::leftEighthDiveLoopUpToOrthogonal + STR_DIVE_LOOP_RIGHT, // TrackElemType::rightEighthDiveLoopUpToOrthogonal + STR_DIVE_LOOP_LEFT, // TrackElemType::leftEighthDiveLoopDownToDiag + STR_DIVE_LOOP_RIGHT, // TrackElemType::rightEighthDiveLoopDownToDiag + STR_BRAKES, // TrackElemType::diagDown25Brakes + }; + static_assert(std::size(kRideConfigurationStringIds) == EnumValue(TrackElemType::count)); #pragma region trackBlocks @@ -4852,6 +4494,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = { { @@ -4863,8 +4506,8 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kEndStationSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN - | TRACK_SEQUENCE_FLAG_DISALLOW_DOORS, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin, + SequenceFlag::disallowDoors, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = blockedSegmentsAllTypes(kSegmentsAll), @@ -4872,8 +4515,8 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kBeginStationSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN - | TRACK_SEQUENCE_FLAG_DISALLOW_DOORS, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin, + SequenceFlag::disallowDoors, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = blockedSegmentsAllTypes(kSegmentsAll), @@ -4881,8 +4524,8 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMiddleStationSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN - | TRACK_SEQUENCE_FLAG_DISALLOW_DOORS, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin, + SequenceFlag::disallowDoors, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = blockedSegmentsAllTypes(kSegmentsAll), @@ -4891,6 +4534,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -4899,6 +4543,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp60Seq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -4907,6 +4552,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -4915,6 +4561,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25ToUp60Seq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToUp60Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -4923,6 +4570,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp60ToUp25Seq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToUp25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -4931,6 +4579,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25ToFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -4939,6 +4588,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -4948,6 +4598,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown60Seq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -4957,6 +4608,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToDown25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -4966,6 +4618,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25ToDown60Seq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToUp25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -4975,6 +4628,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown60ToDown25Seq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToUp60Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -4984,6 +4638,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25ToFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -4993,6 +4648,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn5TilesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { @@ -5057,6 +4713,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn5TilesSeq6 = { .clearance = { -64, -64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, @@ -5070,6 +4727,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn5TilesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftQuarterTurn5TilesSeq0.blockedSegments), @@ -5114,6 +4772,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn5TilesSeq6 = { .clearance = { -64, 64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, @@ -5123,6 +4782,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToLeftBankSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = { { @@ -5135,6 +4795,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToRightBankSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = blockedSegmentsFlipXAxis(kFlatToLeftBankSeq0.blockedSegments), @@ -5143,6 +4804,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankToFlatSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = { { @@ -5155,6 +4817,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankToFlatSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankToFlatSeq0.blockedSegments), @@ -5163,6 +4826,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kBankedLeftQuarterTurn5TilesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kLeftQuarterTurn5TilesSeq0.blockedSegments, @@ -5207,6 +4871,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kBankedLeftQuarterTurn5TilesSeq6 = { .clearance = { -64, -64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, @@ -5216,6 +4881,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kBankedRightQuarterTurn5TilesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kRightQuarterTurn5TilesSeq0.blockedSegments, @@ -5260,6 +4926,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kBankedRightQuarterTurn5TilesSeq6 = { .clearance = { -64, 64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, @@ -5269,6 +4936,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankToUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = { { @@ -5281,6 +4949,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankToUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankToUp25Seq0.blockedSegments), @@ -5289,6 +4958,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25ToLeftBankSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = { { @@ -5301,6 +4971,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25ToRightBankSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = blockedSegmentsFlipXAxis(kUp25ToLeftBankSeq0.blockedSegments), @@ -5309,6 +4980,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankToDown25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -5322,6 +4994,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankToDown25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -5331,6 +5004,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25ToLeftBankSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -5344,6 +5018,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25ToRightBankSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -5353,6 +5028,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = { { @@ -5365,6 +5041,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankSeq0.blockedSegments), @@ -5373,6 +5050,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn5TilesUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kLeftQuarterTurn5TilesSeq0.blockedSegments, @@ -5415,6 +5093,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn5TilesUp25Seq6 = { .clearance = { -64, -64, 48, 16, { 0b1111, 0b0110 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, @@ -5424,6 +5103,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn5TilesUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kRightQuarterTurn5TilesSeq0.blockedSegments, @@ -5466,6 +5146,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn5TilesUp25Seq6 = { .clearance = { -64, 64, 48, 16, { 0b1111, 0b1001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, @@ -5475,6 +5156,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn5TilesDown25Seq0 = { .clearance = { 0, 0, 48, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 2, @@ -5518,6 +5200,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn5TilesDown25Seq6 = { .clearance = { -64, -64, 0, 16, { 0b1111, 0b1001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, @@ -5527,6 +5210,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn5TilesDown25Seq0 = { .clearance = { 0, 0, 48, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 2, @@ -5570,6 +5254,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn5TilesDown25Seq6 = { .clearance = { -64, 64, 0, 16, { 0b1111, 0b0110 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, @@ -5579,6 +5264,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kSBendLeftSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { EnumsToFlags(PS::top, PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -5606,6 +5292,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kSBendLeftSeq3 = { .clearance = { -64, -32, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { EnumsToFlags(PS::bottom, PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -5617,6 +5304,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kSBendRightSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kSBendLeftSeq0.blockedSegments), }; @@ -5638,6 +5326,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kSBendRightSeq3 = { .clearance = { -64, 32, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kSBendLeftSeq3.blockedSegments), }; @@ -5645,6 +5334,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftVerticalLoopSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow @@ -5734,6 +5424,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftVerticalLoopSeq9 = { .clearance = { -32, -32, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { EnumsToFlags(PS::right, PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow @@ -5747,6 +5438,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightVerticalLoopSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftVerticalLoopSeq0.blockedSegments), }; @@ -5798,6 +5490,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightVerticalLoopSeq9 = { .clearance = { -32, 32, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftVerticalLoopSeq9.blockedSegments), }; @@ -5805,6 +5498,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn3TilesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { @@ -5828,6 +5522,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn3TilesSeq3 = { .clearance = { -32, -32, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner0 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, @@ -5841,6 +5536,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftQuarterTurn3TilesSeq0.blockedSegments), @@ -5861,6 +5557,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesSeq3 = { .clearance = { -32, 32, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner1 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, @@ -5870,6 +5567,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn3TilesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { @@ -5893,6 +5591,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn3TilesSeq3 = { .clearance = { -32, -32, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner0 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, @@ -5906,6 +5605,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn3TilesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedQuarterTurn3TilesSeq0.blockedSegments), @@ -5926,6 +5626,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn3TilesSeq3 = { .clearance = { -32, 32, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner1 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, @@ -5935,6 +5636,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn3TilesUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b0111, 0b0100 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { @@ -5962,6 +5664,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn3TilesUp25Seq3 = { .clearance = { -32, -32, 16, 16, { 0b0111, 0b0110 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner0 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, @@ -5975,6 +5678,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1011, 0b1000 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftQuarterTurn3TilesUp25Seq0.blockedSegments), @@ -5995,6 +5699,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesUp25Seq3 = { .clearance = { -32, 32, 16, 16, { 0b1011, 0b1001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, @@ -6004,6 +5709,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn3TilesDown25Seq0 = { .clearance = { 0, 0, 16, 16, { 0b0111, 0b0011 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kLeftQuarterTurn3TilesUp25Seq0.blockedSegments, @@ -6024,6 +5730,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn3TilesDown25Seq3 = { .clearance = { -32, -32, 0, 16, { 0b0111, 0b0001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner0 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, @@ -6033,6 +5740,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesDown25Seq0 = { .clearance = { 0, 0, 16, 16, { 0b1011, 0b0011 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kRightQuarterTurn3TilesUp25Seq0.blockedSegments, @@ -6053,6 +5761,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesDown25Seq3 = { .clearance = { -32, 32, 0, 16, { 0b1011, 0b0010 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, @@ -6062,6 +5771,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn1TileSeq0 = { .clearance = { 0, 0, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0011, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { @@ -6074,6 +5784,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn1TileSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b1001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftQuarterTurn1TileSeq0.blockedSegments), @@ -6082,6 +5793,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftTwistDownToUpSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow @@ -6103,6 +5815,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftTwistDownToUpSeq2 = { .clearance = { -64, 0, 16, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow @@ -6114,6 +5827,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightTwistDownToUpSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftTwistDownToUpSeq0.blockedSegments), }; @@ -6127,6 +5841,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightTwistDownToUpSeq2 = { .clearance = { -64, 0, 16, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftTwistDownToUpSeq2.blockedSegments), }; @@ -6134,6 +5849,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftTwistUpToDownSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kLeftTwistDownToUpSeq2.blockedSegments, 2), }; @@ -6147,6 +5863,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftTwistUpToDownSeq2 = { .clearance = { -64, 0, -16, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsRotate(kLeftTwistDownToUpSeq0.blockedSegments, 2), }; @@ -6154,6 +5871,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightTwistUpToDownSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftTwistUpToDownSeq0.blockedSegments), }; @@ -6167,6 +5885,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightTwistUpToDownSeq2 = { .clearance = { -64, 0, -16, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftTwistUpToDownSeq2.blockedSegments), }; @@ -6174,6 +5893,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kHalfLoopUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -6205,6 +5925,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kHalfLoopUpSeq3 = { .clearance = { -32, 0, 120, 16, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // inverted @@ -6214,6 +5935,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kHalfLoopDownSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // inverted @@ -6245,6 +5967,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kHalfLoopDownSeq3 = { .clearance = { 32, 0, -152, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -6256,6 +5979,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftCorkscrewUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow @@ -6277,6 +6001,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftCorkscrewUpSeq2 = { .clearance = { -32, -32, 48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .invertSegmentBlocking = true, .blockedSegments = { { @@ -6289,6 +6014,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightCorkscrewUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftCorkscrewUpSeq0.blockedSegments), }; @@ -6302,6 +6028,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightCorkscrewUpSeq2 = { .clearance = { -32, 32, 48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .invertSegmentBlocking = true, .blockedSegments = { { @@ -6314,6 +6041,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftCorkscrewDownSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kRightCorkscrewUpSeq2.blockedSegments, 1), @@ -6328,6 +6056,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftCorkscrewDownSeq2 = { .clearance = { -32, -32, -80, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsRotate(kRightCorkscrewUpSeq0.blockedSegments, 1), }; @@ -6335,6 +6064,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightCorkscrewDownSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kLeftCorkscrewUpSeq2.blockedSegments, 3), @@ -6349,6 +6079,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightCorkscrewDownSeq2 = { .clearance = { -32, 32, -80, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsRotate(kLeftCorkscrewUpSeq0.blockedSegments, 3), }; @@ -6356,6 +6087,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToUp60Seq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -6364,6 +6096,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp60ToFlatSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlat }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -6372,6 +6105,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToDown60Seq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlat }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = -2, @@ -6381,6 +6115,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown60ToFlatSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -6389,60 +6124,61 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kTowerBaseSeq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::trackOrigin }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kTowerBaseSeq1 = { .clearance = { -32, -32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kTowerBaseSeq2 = { .clearance = { -32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0, + .flags = { SequenceFlag::entranceConnectionNE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kTowerBaseSeq3 = { .clearance = { -32, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kTowerBaseSeq4 = { .clearance = { 0, -32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionNW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kTowerBaseSeq5 = { .clearance = { 0, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionSE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kTowerBaseSeq6 = { .clearance = { 32, -32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kTowerBaseSeq7 = { .clearance = { 32, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kTowerBaseSeq8 = { .clearance = { 32, 0, 0, 0, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_1 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kTowerSectionSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, }; static constexpr SequenceDescriptor kTowerSectionSeq1 = { @@ -6452,6 +6188,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatCoveredSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -6459,6 +6196,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25CoveredSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kUp25Seq0.blockedSegments, }; @@ -6466,6 +6204,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp60CoveredSeq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kUp60Seq0.blockedSegments, }; @@ -6473,6 +6212,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToUp25CoveredSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatToUp25Seq0.blockedSegments, }; @@ -6480,6 +6220,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25ToUp60CoveredSeq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kUp25ToUp60Seq0.blockedSegments, }; @@ -6487,6 +6228,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp60ToUp25CoveredSeq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kUp60ToUp25Seq0.blockedSegments, }; @@ -6494,6 +6236,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25ToFlatCoveredSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kUp25ToFlatSeq0.blockedSegments, }; @@ -6501,6 +6244,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25CoveredSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kDown25Seq0.blockedSegments, }; @@ -6508,6 +6252,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown60CoveredSeq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kDown60Seq0.blockedSegments, }; @@ -6515,6 +6260,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToDown25CoveredSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatToDown25Seq0.blockedSegments, }; @@ -6522,6 +6268,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25ToDown60CoveredSeq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kDown25ToDown60Seq0.blockedSegments, }; @@ -6529,6 +6276,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown60ToDown25CoveredSeq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kDown60ToDown25Seq0.blockedSegments, }; @@ -6536,6 +6284,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25ToFlatCoveredSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kDown25ToFlatSeq0.blockedSegments, }; @@ -6543,6 +6292,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn5TilesCoveredSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kLeftQuarterTurn5TilesSeq0.blockedSegments, }; @@ -6579,6 +6329,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn5TilesCoveredSeq6 = { .clearance = { -64, -64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, .blockedSegments = kLeftQuarterTurn5TilesSeq6.blockedSegments, @@ -6587,6 +6338,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn5TilesCoveredSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kRightQuarterTurn5TilesSeq0.blockedSegments, }; @@ -6623,6 +6375,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn5TilesCoveredSeq6 = { .clearance = { -64, 64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, .blockedSegments = kRightQuarterTurn5TilesSeq6.blockedSegments, @@ -6631,6 +6384,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kSBendLeftCoveredSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kSBendLeftSeq0.blockedSegments, }; @@ -6649,12 +6403,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kSBendLeftCoveredSeq3 = { .clearance = { -64, -32, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kSBendLeftSeq3.blockedSegments, }; static constexpr SequenceDescriptor kSBendRightCoveredSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kSBendRightSeq0.blockedSegments, }; @@ -6673,12 +6429,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kSBendRightCoveredSeq3 = { .clearance = { -64, 32, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kSBendRightSeq3.blockedSegments, }; static constexpr SequenceDescriptor kLeftQuarterTurn3TilesCoveredSeq0 = { .clearance = { 0, 0, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kLeftQuarterTurn3TilesSeq0.blockedSegments, }; @@ -6698,6 +6456,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn3TilesCoveredSeq3 = { .clearance = { -32, -32, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, .blockedSegments = kLeftQuarterTurn3TilesSeq3.blockedSegments, @@ -6706,6 +6465,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesCoveredSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kRightQuarterTurn3TilesSeq0.blockedSegments, }; @@ -6725,6 +6485,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesCoveredSeq3 = { .clearance = { -32, 32, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, .blockedSegments = kRightQuarterTurn3TilesSeq3.blockedSegments, @@ -6733,6 +6494,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq0 = { .clearance = { 0, 0, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { @@ -6813,6 +6575,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq7 = { .clearance = { 0, -96, 8, 4, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -2, @@ -6826,6 +6589,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpSmallSeq0.blockedSegments), @@ -6878,6 +6642,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq7 = { .clearance = { 0, 96, 8, 4, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 2, @@ -6887,6 +6652,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq0 = { .clearance = { 0, 0, 8, 4, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kLeftHalfBankedHelixUpSmallSeq0.blockedSegments, @@ -6939,6 +6705,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq7 = { .clearance = { 0, -96, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -2, @@ -6948,6 +6715,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq0 = { .clearance = { 0, 0, 8, 4, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kRightHalfBankedHelixUpSmallSeq0.blockedSegments, @@ -7000,6 +6768,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq7 = { .clearance = { 0, 96, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 2, @@ -7009,6 +6778,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { @@ -7155,6 +6925,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq13 = { .clearance = { 0, -160, 8, 4, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -2, @@ -7168,6 +6939,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq0.blockedSegments), @@ -7258,6 +7030,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq13 = { .clearance = { 0, 160, 8, 4, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 2, @@ -7267,6 +7040,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq0 = { .clearance = { 0, 0, 8, 4, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kLeftHalfBankedHelixUpLargeSeq0.blockedSegments, @@ -7357,6 +7131,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq13 = { .clearance = { 0, -160, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -2, @@ -7366,6 +7141,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq0 = { .clearance = { 0, 0, 8, 4, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kRightHalfBankedHelixUpLargeSeq0.blockedSegments, @@ -7456,6 +7232,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq13 = { .clearance = { 0, 160, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 2, @@ -7465,6 +7242,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn1TileUp60Seq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0011, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsAllTypes(kSegmentsAll), @@ -7473,6 +7251,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn1TileUp60Seq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsAllTypes(kSegmentsAll), @@ -7481,6 +7260,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn1TileDown60Seq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0011, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsAllTypes(kSegmentsAll), @@ -7489,6 +7269,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn1TileDown60Seq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsAllTypes(kSegmentsAll), @@ -7497,6 +7278,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kBrakesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -7505,96 +7287,99 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kBoosterSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, }; + // Maze sequence blocks do not have the height marker flag set because they are handled differently static constexpr SequenceDescriptor kMazeSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kMazeSeq1 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq2 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq3 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq4 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq5 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq6 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq7 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq8 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq9 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq10 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq11 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq12 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq13 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq14 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kMazeSeq15 = { - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, }; static constexpr SequenceDescriptor kLeftQuarterBankedHelixLargeUpSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kBankedLeftQuarterTurn5TilesSeq0.blockedSegments, }; @@ -7631,6 +7416,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterBankedHelixLargeUpSeq6 = { .clearance = { -64, -64, 0, 12, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, .blockedSegments = kBankedLeftQuarterTurn5TilesSeq6.blockedSegments, @@ -7639,6 +7425,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterBankedHelixLargeUpSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kBankedRightQuarterTurn5TilesSeq0.blockedSegments, }; @@ -7675,6 +7462,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterBankedHelixLargeUpSeq6 = { .clearance = { -64, 64, 0, 12, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, .blockedSegments = kBankedRightQuarterTurn5TilesSeq6.blockedSegments, @@ -7683,6 +7471,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterBankedHelixLargeDownSeq0 = { .clearance = { 0, 0, 0, 12, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kBankedLeftQuarterTurn5TilesSeq0.blockedSegments, }; @@ -7719,6 +7508,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterBankedHelixLargeDownSeq6 = { .clearance = { -64, -64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, .blockedSegments = kBankedLeftQuarterTurn5TilesSeq6.blockedSegments, @@ -7727,6 +7517,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterBankedHelixLargeDownSeq0 = { .clearance = { 0, 0, 0, 12, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kBankedRightQuarterTurn5TilesSeq0.blockedSegments, }; @@ -7763,6 +7554,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterBankedHelixLargeDownSeq6 = { .clearance = { -64, 64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, .blockedSegments = kBankedRightQuarterTurn5TilesSeq6.blockedSegments, @@ -7771,6 +7563,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterHelixLargeUpSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kLeftQuarterTurn5TilesSeq0.blockedSegments, }; @@ -7807,6 +7600,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterHelixLargeUpSeq6 = { .clearance = { -64, -64, 0, 12, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, .blockedSegments = kLeftQuarterTurn5TilesSeq6.blockedSegments, @@ -7815,6 +7609,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterHelixLargeUpSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kRightQuarterTurn5TilesSeq0.blockedSegments, }; @@ -7851,6 +7646,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterHelixLargeUpSeq6 = { .clearance = { -64, 64, 0, 12, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, .blockedSegments = kRightQuarterTurn5TilesSeq6.blockedSegments, @@ -7859,6 +7655,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterHelixLargeDownSeq0 = { .clearance = { 0, 0, 0, 12, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kLeftQuarterTurn5TilesSeq0.blockedSegments, }; @@ -7895,6 +7692,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterHelixLargeDownSeq6 = { .clearance = { -64, -64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = -1, .blockedSegments = kLeftQuarterTurn5TilesSeq6.blockedSegments, @@ -7903,6 +7701,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterHelixLargeDownSeq0 = { .clearance = { 0, 0, 0, 12, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kRightQuarterTurn5TilesSeq0.blockedSegments, }; @@ -7939,6 +7738,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterHelixLargeDownSeq6 = { .clearance = { -64, 64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre }, .extraSupportRotation = 1, .blockedSegments = kRightQuarterTurn5TilesSeq6.blockedSegments, @@ -7947,6 +7747,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25LeftBankedSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -7955,6 +7756,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25RightBankedSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -7963,6 +7765,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kWaterfallSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -7974,6 +7777,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRapidsSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -7981,6 +7785,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kOnRidePhotoSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsAllTypes(kSegmentsAll), }; @@ -7988,6 +7793,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25LeftBankedSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -7997,6 +7803,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25RightBankedSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -8006,6 +7813,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kWatersplashSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -8050,6 +7858,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kWatersplashSeq4 = { .clearance = { -128, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -8061,6 +7870,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToUp60LongBaseSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq0 }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -8085,6 +7895,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToUp60LongBaseSeq3 = { .clearance = { -96, 0, 40, 48, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq3 }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -8093,6 +7904,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp60ToFlatLongBaseSeq0 = { .clearance = { 0, 0, 0, 48, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq0 }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -8117,6 +7929,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp60ToFlatLongBaseSeq3 = { .clearance = { -96, 0, 80, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq3 }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -8125,6 +7938,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kWhirlpoolSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -8136,6 +7950,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown60ToFlatLongBaseSeq0 = { .clearance = { 0, 0, 40, 48, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq3 }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -8163,6 +7978,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown60ToFlatLongBaseSeq3 = { .clearance = { -96, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq0 }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -8172,6 +7988,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToDown60LongBaseSeq0 = { .clearance = { 0, 0, 80, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq3 }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -8199,6 +8016,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToDown60LongBaseSeq3 = { .clearance = { -96, 0, 0, 48, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq0 }, .metalSupports = { MetalSupportPlace::centre, true }, .extraSupportRotation = 2, @@ -8208,6 +8026,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kCableLiftHillSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8229,6 +8048,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kCableLiftHillSeq3 = { .clearance = { -96, 0, -96, 64, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::centre, true }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8236,6 +8056,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kReverseFreefallSlopeSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8271,6 +8092,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kReverseFreefallSlopeSeq5 = { .clearance = { -192, 0, 0, 208, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1011, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8283,6 +8105,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kReverseFreefallVerticalSeq0 = { .clearance = { 0, 0, 0, 48, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8294,6 +8117,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp90Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1111, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8304,6 +8128,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown90Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1111, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8314,6 +8139,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp60ToUp90Seq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b1100 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1011, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8325,6 +8151,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown90ToDown60Seq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0b0011 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1110, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8332,6 +8159,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp90ToUp60Seq0 = { .clearance = { 0, 0, 0, 56, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1011, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8339,6 +8167,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown60ToDown90Seq0 = { .clearance = { 0, 0, 0, 56, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1110, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -8350,6 +8179,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kBrakeForDropSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = kFlatSeq0.blockedSegments, @@ -8358,6 +8188,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthToDiagSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = { { @@ -8402,6 +8233,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthToDiagSeq4 = { .clearance = { -64, -32, 0, 0, { 0b0001, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::bottomCorner }, .blockedSegments = { { EnumsToFlags(PS::bottom, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow @@ -8413,6 +8245,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthToDiagSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .metalSupports = { MetalSupportPlace::centre }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftEighthToDiagSeq0.blockedSegments), @@ -8441,12 +8274,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthToDiagSeq4 = { .clearance = { -64, 32, 0, 0, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .metalSupports = { MetalSupportPlace::leftCorner }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftEighthToDiagSeq4.blockedSegments), }; static constexpr SequenceDescriptor kLeftEighthToOrthogonalSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsRotate(kRightEighthToDiagSeq4.blockedSegments, 2), }; @@ -8475,11 +8310,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthToOrthogonalSeq4 = { .clearance = { -64, 32, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kRightEighthToDiagSeq0.blockedSegments, 2), }; static constexpr SequenceDescriptor kRightEighthToOrthogonalSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsRotate(kLeftEighthToDiagSeq4.blockedSegments, 3), }; @@ -8508,12 +8345,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthToOrthogonalSeq4 = { .clearance = { -32, 64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kLeftEighthToDiagSeq0.blockedSegments, 3), }; static constexpr SequenceDescriptor kLeftEighthBankToDiagSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -8557,6 +8396,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthBankToDiagSeq4 = { .clearance = { -64, -32, 0, 0, { 0b0001, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::bottom, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow EnumsToFlags( @@ -8569,6 +8409,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthBankToDiagSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftEighthBankToDiagSeq0.blockedSegments), }; @@ -8596,11 +8437,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthBankToDiagSeq4 = { .clearance = { -64, 32, 0, 0, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftEighthBankToDiagSeq4.blockedSegments), }; static constexpr SequenceDescriptor kLeftEighthBankToOrthogonalSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsRotate(kRightEighthBankToDiagSeq4.blockedSegments, 2), }; @@ -8629,11 +8472,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthBankToOrthogonalSeq4 = { .clearance = { -64, 32, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kRightEighthBankToDiagSeq0.blockedSegments, 2), }; static constexpr SequenceDescriptor kRightEighthBankToOrthogonalSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsRotate(kLeftEighthBankToDiagSeq4.blockedSegments, 3), }; @@ -8662,11 +8507,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthBankToOrthogonalSeq4 = { .clearance = { -32, 64, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kLeftEighthBankToDiagSeq0.blockedSegments, 3), }; static constexpr SequenceDescriptor kDiagFlatSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -8707,6 +8554,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -8747,6 +8595,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp60Seq0 = { .clearance = { 0, 0, 0, 64, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -8787,6 +8636,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagFlatToUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -8827,6 +8677,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp25ToUp60Seq0 = { .clearance = { 0, 0, 0, 32, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -8867,6 +8718,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp60ToUp25Seq0 = { .clearance = { 0, 0, 0, 32, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -8907,6 +8759,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp25ToFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -8966,6 +8819,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown25Seq3 = { .clearance = { -32, 32, 0, 16, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagUp25Seq0.blockedSegments, 2), }; @@ -8990,6 +8844,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown60Seq3 = { .clearance = { -32, 32, 0, 64, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagUp60Seq0.blockedSegments, 2), }; @@ -9014,6 +8869,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagFlatToDown25Seq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagUp25ToFlatSeq0.blockedSegments, 2), }; @@ -9038,6 +8894,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown25ToDown60Seq3 = { .clearance = { -32, 32, 0, 32, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagUp60ToUp25Seq0.blockedSegments, 2), }; @@ -9062,6 +8919,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown60ToDown25Seq3 = { .clearance = { -32, 32, 0, 32, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagUp25ToUp60Seq0.blockedSegments, 2), }; @@ -9086,11 +8944,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown25ToFlatSeq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagFlatToUp25Seq0.blockedSegments, 2), }; static constexpr SequenceDescriptor kDiagFlatToUp60Seq0 = { .clearance = { 0, 0, 0, 24, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow kSegmentsUnimplemented, // inverted @@ -9131,6 +8991,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp60ToFlatSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow kSegmentsUnimplemented, // inverted @@ -9190,6 +9051,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagFlatToDown60Seq3 = { .clearance = { -32, 32, 0, 24, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatSeq0.blockedSegments, 2), }; @@ -9214,11 +9076,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown60ToFlatSeq3 = { .clearance = { -32, 32, 0, 24, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60Seq0.blockedSegments, 2), }; static constexpr SequenceDescriptor kDiagFlatToLeftBankSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9259,6 +9123,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagFlatToRightBankSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9299,6 +9164,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankToFlatSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9339,6 +9205,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankToFlatSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9379,6 +9246,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankToUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9419,6 +9287,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankToUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9459,6 +9328,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp25ToLeftBankSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9499,6 +9369,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp25ToRightBankSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9570,6 +9441,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankToDown25Seq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // narrow EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // inverted @@ -9610,6 +9482,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankToDown25Seq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // narrow EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // inverted @@ -9650,6 +9523,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown25ToLeftBankSeq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // narrow EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // inverted @@ -9690,6 +9564,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown25ToRightBankSeq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // narrow EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // inverted @@ -9699,6 +9574,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9739,6 +9615,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // inverted @@ -9779,6 +9656,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLogFlumeReverserSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -9786,7 +9664,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kSpinningTunnelSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, - .flags = TRACK_SEQUENCE_FLAG_DISALLOW_DOORS, + .flags = { SequenceFlag::disallowDoors, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsAll, // narrow @@ -9798,6 +9676,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBarrelRollUpToDownSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow @@ -9820,6 +9699,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBarrelRollUpToDownSeq2 = { .clearance = { -64, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = { { @@ -9832,6 +9712,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBarrelRollUpToDownSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBarrelRollUpToDownSeq0.blockedSegments), }; @@ -9846,6 +9727,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBarrelRollUpToDownSeq2 = { .clearance = { -64, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBarrelRollUpToDownSeq2.blockedSegments), @@ -9854,6 +9736,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBarrelRollDownToUpSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kLeftBarrelRollUpToDownSeq2.blockedSegments, 2), @@ -9869,6 +9752,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBarrelRollDownToUpSeq2 = { .clearance = { -64, 0, -32, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsRotate(kLeftBarrelRollUpToDownSeq0.blockedSegments, 2), }; @@ -9876,6 +9760,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBarrelRollDownToUpSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBarrelRollDownToUpSeq0.blockedSegments), @@ -9891,6 +9776,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBarrelRollDownToUpSeq2 = { .clearance = { -64, 0, -32, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBarrelRollDownToUpSeq2.blockedSegments), }; @@ -9898,6 +9784,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankToLeftQuarterTurn3TilesUp25Seq0 = { .clearance = { 0, 0, 0, 0, { 0b0111, 0b0100 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = { { EnumsToFlags(PS::top, PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -9929,6 +9816,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankToLeftQuarterTurn3TilesUp25Seq3 = { .clearance = { -32, -32, 16, 16, { 0b0111, 0b0110 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = { { EnumsToFlags(PS::bottom, PS::centre, PS::topLeft, PS::bottomRight), // narrow @@ -9940,6 +9828,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankToRightQuarterTurn3TilesUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1011, 0b1000 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankToLeftQuarterTurn3TilesUp25Seq0.blockedSegments), }; @@ -9959,6 +9848,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankToRightQuarterTurn3TilesUp25Seq3 = { .clearance = { -32, 32, 16, 16, { 0b1011, 0b1001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankToLeftQuarterTurn3TilesUp25Seq3.blockedSegments), }; @@ -9966,6 +9856,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn3TilesDown25ToLeftBankSeq0 = { .clearance = { 0, 0, 16, 16, { 0b0111, 0b0011 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = blockedSegmentsRotate(kRightBankToRightQuarterTurn3TilesUp25Seq3.blockedSegments, 1), }; @@ -9985,6 +9876,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn3TilesDown25ToLeftBankSeq3 = { .clearance = { -32, -32, 0, 0, { 0b0111, 0b0001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = blockedSegmentsRotate(kRightBankToRightQuarterTurn3TilesUp25Seq0.blockedSegments, 1), }; @@ -9992,6 +9884,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesDown25ToRightBankSeq0 = { .clearance = { 0, 0, 16, 16, { 0b1011, 0b0011 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftQuarterTurn3TilesDown25ToLeftBankSeq0.blockedSegments), }; @@ -10011,6 +9904,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn3TilesDown25ToRightBankSeq3 = { .clearance = { -32, 32, 0, 0, { 0b1011, 0b0010 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftQuarterTurn3TilesDown25ToLeftBankSeq3.blockedSegments), }; @@ -10018,6 +9912,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kPoweredLiftSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -10025,6 +9920,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeHalfLoopUpSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // inverted @@ -10085,6 +9981,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeHalfLoopUpSeq6 = { .clearance = { -64, -32, 248, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { EnumsToFlags(PS::right, PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow @@ -10096,6 +9993,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeHalfLoopUpSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeHalfLoopUpSeq0.blockedSegments), }; @@ -10132,6 +10030,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeHalfLoopUpSeq6 = { .clearance = { -64, 32, 248, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeHalfLoopUpSeq6.blockedSegments), }; @@ -10139,6 +10038,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeHalfLoopDownSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = kRightLargeHalfLoopUpSeq6.blockedSegments, }; @@ -10176,12 +10076,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeHalfLoopDownSeq6 = { .clearance = { 64, -32, -280, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kRightLargeHalfLoopUpSeq0.blockedSegments, }; static constexpr SequenceDescriptor kRightLargeHalfLoopDownSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = kLeftLargeHalfLoopUpSeq6.blockedSegments, }; @@ -10219,12 +10121,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeHalfLoopDownSeq6 = { .clearance = { 64, 32, -280, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kLeftLargeHalfLoopUpSeq0.blockedSegments, }; static constexpr SequenceDescriptor kLeftFlyerTwistUpSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // inverted @@ -10245,6 +10149,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerTwistUpSeq2 = { .clearance = { -64, 0, -16, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow @@ -10256,6 +10161,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerTwistUpSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerTwistUpSeq0.blockedSegments), }; @@ -10268,6 +10174,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerTwistUpSeq2 = { .clearance = { -64, 0, -16, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerTwistUpSeq2.blockedSegments), }; @@ -10275,6 +10182,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerTwistDownSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kLeftFlyerTwistUpSeq2.blockedSegments, 2), }; @@ -10287,6 +10195,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerTwistDownSeq2 = { .clearance = { -64, 0, 16, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kLeftFlyerTwistUpSeq0.blockedSegments, 2), }; @@ -10294,6 +10203,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerTwistDownSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerTwistDownSeq0.blockedSegments), }; @@ -10306,6 +10216,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerTwistDownSeq2 = { .clearance = { -64, 0, 16, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerTwistDownSeq2.blockedSegments), }; @@ -10313,6 +10224,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlyerHalfLoopUninvertedUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // inverted @@ -10343,6 +10255,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlyerHalfLoopUninvertedUpSeq3 = { .clearance = { -32, 0, 120, 16, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -10353,6 +10266,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlyerHalfLoopInvertedDownSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlyerHalfLoopUninvertedUpSeq3.blockedSegments, }; @@ -10372,6 +10286,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlyerHalfLoopInvertedDownSeq3 = { .clearance = { 32, 0, -120, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = kFlyerHalfLoopUninvertedUpSeq0.blockedSegments, }; @@ -10379,6 +10294,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerCorkscrewUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kLeftCorkscrewUpSeq0.blockedSegments, }; @@ -10391,6 +10307,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerCorkscrewUpSeq2 = { .clearance = { -32, -32, 48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = kLeftCorkscrewUpSeq2.blockedSegments, }; @@ -10398,6 +10315,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerCorkscrewUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kRightCorkscrewUpSeq0.blockedSegments, }; @@ -10410,6 +10328,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerCorkscrewUpSeq2 = { .clearance = { -32, 32, 48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = kRightCorkscrewUpSeq2.blockedSegments, }; @@ -10417,6 +10336,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerCorkscrewDownSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { kSegmentsUnimplemented, // narrow EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // inverted @@ -10437,6 +10357,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerCorkscrewDownSeq2 = { .clearance = { -32, -32, -48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -10448,6 +10369,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerCorkscrewDownSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { kSegmentsUnimplemented, // narrow EnumsToFlags(PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // inverted @@ -10464,6 +10386,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerCorkscrewDownSeq2 = { .clearance = { -32, 32, -48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerCorkscrewDownSeq2.blockedSegments), }; @@ -10471,6 +10394,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kHeartLineTransferUpSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -10504,6 +10428,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kHeartLineTransferUpSeq3 = { .clearance = { 0, 0, 32, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { kSegmentsUnimplemented, // narrow kSegmentsUnimplemented, // inverted @@ -10514,6 +10439,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kHeartLineTransferDownSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kHeartLineTransferUpSeq3.blockedSegments, }; @@ -10534,6 +10460,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kHeartLineTransferDownSeq3 = { .clearance = { 0, 0, -32, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .blockedSegments = kHeartLineTransferUpSeq0.blockedSegments, }; @@ -10541,6 +10468,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHeartLineRollSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -10596,6 +10524,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftHeartLineRollSeq5 = { .clearance = { -160, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -10607,6 +10536,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHeartLineRollSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftHeartLineRollSeq0.blockedSegments), }; @@ -10642,12 +10572,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightHeartLineRollSeq5 = { .clearance = { -160, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftHeartLineRollSeq5.blockedSegments), }; static constexpr SequenceDescriptor kMinigolfHoleASeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10658,6 +10590,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMinigolfHoleASeq1 = { .clearance = { -32, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10668,6 +10601,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMinigolfHoleBSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10678,6 +10612,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMinigolfHoleBSeq1 = { .clearance = { -32, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10688,6 +10623,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMinigolfHoleCSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10698,6 +10634,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMinigolfHoleCSeq1 = { .clearance = { -32, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10708,6 +10645,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMinigolfHoleDSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10728,6 +10666,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMinigolfHoleDSeq2 = { .clearance = { -32, 32, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::nwSe }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10738,6 +10677,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMinigolfHoleESeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10758,6 +10698,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMinigolfHoleESeq2 = { .clearance = { -32, -32, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::nwSe }, .blockedSegments = { { kSegmentsAll, // narrow @@ -10769,6 +10710,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMultiDimInvertedFlatToDown90QuarterLoopSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -10781,6 +10723,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMultiDimInvertedFlatToDown90QuarterLoopSeq2 = { .clearance = { -64, 0, -96, 56, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -10791,6 +10734,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp90ToInvertedFlatQuarterLoopSeq0 = { .clearance = { 0, 0, 0, 56, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow kSegmentsUnimplemented, // inverted @@ -10812,6 +10756,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp90ToInvertedFlatQuarterLoopSeq2 = { .clearance = { 64, 0, 96, 16, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -10823,6 +10768,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kInvertedFlatToDown90QuarterLoopSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow kSegmentsUnimplemented, // inverted @@ -10844,6 +10790,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kInvertedFlatToDown90QuarterLoopSeq2 = { .clearance = { -64, 0, -128, 56, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -10864,6 +10811,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftCurvedLiftHillSeq0 = { .clearance = { 0, 0, 0, 0, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = { { EnumsToFlags(PS::top, PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -10895,6 +10843,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftCurvedLiftHillSeq3 = { .clearance = { -32, -32, 0, 8, { 0b0111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = { { EnumsToFlags(PS::bottom, PS::centre, PS::topLeft, PS::bottomRight), // narrow @@ -10906,6 +10855,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightCurvedLiftHillSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftCurvedLiftHillSeq0.blockedSegments), }; @@ -10925,12 +10875,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightCurvedLiftHillSeq3 = { .clearance = { -32, 32, 0, 8, { 0b1011, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftCurvedLiftHillSeq3.blockedSegments), }; static constexpr SequenceDescriptor kLeftReverserSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -10981,6 +10933,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftReverserSeq5 = { .clearance = { -64, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -10991,6 +10944,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightReverserSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftReverserSeq0.blockedSegments), }; @@ -11021,12 +10975,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightReverserSeq5 = { .clearance = { -64, 0, 0, 0, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftReverserSeq5.blockedSegments), }; static constexpr SequenceDescriptor kAirThrustTopCapSeq0 = { .clearance = { 0, 0, 0, 32, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { kSegmentsUnimplemented, // narrow kSegmentsUnimplemented, // inverted @@ -11054,6 +11010,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kAirThrustTopCapSeq3 = { .clearance = { -32, 0, 0, 32, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { kSegmentsUnimplemented, // narrow kSegmentsUnimplemented, // inverted @@ -11063,6 +11020,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kAirThrustVerticalDownSeq0 = { .clearance = { 0, 0, 0, 48, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { kSegmentsUnimplemented, // narrow kSegmentsUnimplemented, // inverted @@ -11082,6 +11040,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kAirThrustVerticalDownToLevelSeq0 = { .clearance = { 0, 0, 0, 208, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -11137,6 +11096,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kAirThrustVerticalDownToLevelSeq5 = { .clearance = { -128, 0, 0, 32, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -11158,6 +11118,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kBlockBrakesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -11165,6 +11126,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn3TileUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b0111, 0b0100 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = { { EnumsToFlags(PS::top, PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -11191,6 +11153,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn3TileUp25Seq3 = { .clearance = { -32, -32, 16, 16, { 0b0111, 0b0110 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = { { EnumsToFlags(PS::bottom, PS::centre, PS::topLeft, PS::bottomRight), // narrow @@ -11202,6 +11165,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn3TileUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1011, 0b1000 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedQuarterTurn3TileUp25Seq0.blockedSegments), }; @@ -11221,6 +11185,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn3TileUp25Seq3 = { .clearance = { -32, 32, 16, 16, { 0b1011, 0b1001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedQuarterTurn3TileUp25Seq3.blockedSegments), }; @@ -11228,6 +11193,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn3TileDown25Seq0 = { .clearance = { 0, 0, 16, 16, { 0b0111, 0b0011 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsRotate(kRightBankedQuarterTurn3TileUp25Seq3.blockedSegments, 1), }; @@ -11247,6 +11213,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn3TileDown25Seq3 = { .clearance = { -32, -32, 0, 16, { 0b0111, 0b0001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsRotate(kRightBankedQuarterTurn3TileUp25Seq0.blockedSegments, 1), }; @@ -11254,6 +11221,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn3TileDown25Seq0 = { .clearance = { 0, 0, 16, 16, { 0b1011, 0b0011 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedQuarterTurn3TileDown25Seq0.blockedSegments), }; @@ -11273,6 +11241,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn3TileDown25Seq3 = { .clearance = { -32, 32, 0, 16, { 0b1011, 0b0010 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedQuarterTurn3TileDown25Seq3.blockedSegments), }; @@ -11280,6 +11249,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn5TileUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { EnumsToFlags(PS::top, PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -11338,6 +11308,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn5TileUp25Seq6 = { .clearance = { -64, -64, 48, 16, { 0b1111, 0b0110 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = { { EnumsToFlags(PS::bottom, PS::centre, PS::topLeft, PS::bottomRight), // narrow @@ -11353,6 +11324,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn5TileUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedQuarterTurn5TileUp25Seq0.blockedSegments), }; @@ -11391,6 +11363,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn5TileUp25Seq6 = { .clearance = { -64, 64, 48, 16, { 0b1111, 0b1001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedQuarterTurn5TileUp25Seq6.blockedSegments), }; @@ -11402,6 +11375,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn5TileDown25Seq0 = { .clearance = { 0, 0, 48, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsRotate(kRightBankedQuarterTurn5TileUp25Seq6.blockedSegments, 1), }; @@ -11440,6 +11414,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedQuarterTurn5TileDown25Seq6 = { .clearance = { -64, -64, 0, 16, { 0b1111, 0b1001 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner2 }, .blockedSegments = blockedSegmentsRotate(kRightBankedQuarterTurn5TileUp25Seq0.blockedSegments, 1), }; @@ -11451,6 +11426,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn5TileDown25Seq0 = { .clearance = { 0, 0, 48, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedQuarterTurn5TileDown25Seq0.blockedSegments), }; @@ -11489,6 +11465,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedQuarterTurn5TileDown25Seq6 = { .clearance = { -64, 64, 0, 16, { 0b1111, 0b0110 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::corner3 }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedQuarterTurn5TileDown25Seq6.blockedSegments), }; @@ -11500,6 +11477,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25ToLeftBankedUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -11511,6 +11489,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kUp25ToRightBankedUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .blockedSegments = blockedSegmentsFlipXAxis(kUp25ToLeftBankedUp25Seq0.blockedSegments), }; @@ -11518,6 +11497,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedUp25ToUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -11529,6 +11509,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedUp25ToUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedUp25ToUp25Seq0.blockedSegments), }; @@ -11536,6 +11517,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25ToLeftBankedDown25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .extraSupportRotation = 2, .blockedSegments = { { @@ -11548,6 +11530,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDown25ToRightBankedDown25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .extraSupportRotation = 2, .blockedSegments = blockedSegmentsFlipXAxis(kDown25ToLeftBankedDown25Seq0.blockedSegments), @@ -11556,6 +11539,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedDown25ToDown25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .extraSupportRotation = 2, .blockedSegments = { { @@ -11568,6 +11552,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedDown25ToDown25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .extraSupportRotation = 2, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedDown25ToDown25Seq0.blockedSegments), @@ -11576,6 +11561,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedFlatToLeftBankedUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -11587,6 +11573,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedFlatToRightBankedUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedFlatToLeftBankedUp25Seq0.blockedSegments), }; @@ -11594,6 +11581,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedUp25ToLeftBankedFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -11605,6 +11593,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedUp25ToRightBankedFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedUp25ToLeftBankedFlatSeq0.blockedSegments), }; @@ -11612,6 +11601,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedFlatToLeftBankedDown25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .extraSupportRotation = 2, .blockedSegments = { { @@ -11624,6 +11614,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedFlatToRightBankedDown25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .extraSupportRotation = 2, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedFlatToLeftBankedDown25Seq0.blockedSegments), @@ -11632,6 +11623,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedDown25ToLeftBankedFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .extraSupportRotation = 2, .blockedSegments = { { @@ -11644,6 +11636,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedDown25ToRightBankedFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .extraSupportRotation = 2, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedDown25ToLeftBankedFlatSeq0.blockedSegments), @@ -11652,6 +11645,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToLeftBankedUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -11663,6 +11657,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToRightBankedUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .blockedSegments = blockedSegmentsFlipXAxis(kFlatToLeftBankedUp25Seq0.blockedSegments), }; @@ -11670,6 +11665,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedUp25ToFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -11681,6 +11677,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedUp25ToFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedUp25ToFlatSeq0.blockedSegments), }; @@ -11688,6 +11685,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToLeftBankedDown25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .extraSupportRotation = 2, .blockedSegments = { { @@ -11700,6 +11698,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatToRightBankedDown25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0b0011 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat }, .extraSupportRotation = 2, .blockedSegments = blockedSegmentsFlipXAxis(kFlatToLeftBankedDown25Seq0.blockedSegments), @@ -11708,6 +11707,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftBankedDown25ToFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .extraSupportRotation = 2, .blockedSegments = { { @@ -11720,6 +11720,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightBankedDown25ToFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg }, .extraSupportRotation = 2, .blockedSegments = blockedSegmentsFlipXAxis(kLeftBankedDown25ToFlatSeq0.blockedSegments), @@ -11728,6 +11729,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn1TileUp90Seq0 = { .clearance = { 0, 0, 0, 72, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1111, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // inverted @@ -11742,6 +11744,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn1TileUp90Seq0 = { .clearance = { 0, 0, 0, 72, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1111, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftQuarterTurn1TileUp90Seq0.blockedSegments), }; @@ -11752,6 +11755,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftQuarterTurn1TileDown90Seq0 = { .clearance = { 0, 0, 0, 72, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1111, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topLeft, PS::bottomRight), // narrow EnumsToFlags(PS::centre, PS::topLeft, PS::bottomRight), // inverted @@ -11766,6 +11770,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightQuarterTurn1TileDown90Seq0 = { .clearance = { 0, 0, 0, 72, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1111, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftQuarterTurn1TileDown90Seq0.blockedSegments), }; @@ -11776,6 +11781,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMultiDimUp90ToInvertedFlatQuarterLoopSeq0 = { .clearance = { 0, 0, 0, 56, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -11788,12 +11794,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMultiDimUp90ToInvertedFlatQuarterLoopSeq2 = { .clearance = { 64, 0, 96, 16, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; static constexpr SequenceDescriptor kMultiDimFlatToDown90QuarterLoopSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -11806,6 +11814,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMultiDimFlatToDown90QuarterLoopSeq2 = { .clearance = { -64, 0, -128, 56, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -11816,6 +11825,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMultiDimInvertedUp90ToFlatQuarterLoopSeq0 = { .clearance = { 0, 0, 32, 56, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; @@ -11828,19 +11838,22 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kMultiDimInvertedUp90ToFlatQuarterLoopSeq2 = { .clearance = { 64, 0, 128, 16, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kFlatSeq0.blockedSegments, }; static constexpr SequenceDescriptor kRotationControlToggleSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = kFlatSeq0.blockedSegments, }; static constexpr SequenceDescriptor kFlatTrack1x4ASeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin, + SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; @@ -11851,7 +11864,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatTrack1x4ASeq2 = { .clearance = { -32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; @@ -11862,55 +11875,57 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatTrack2x2Seq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin, + SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x2Seq1 = { .clearance = { 0, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x2Seq2 = { .clearance = { 32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x2Seq3 = { .clearance = { 32, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin, + SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq1 = { .clearance = { 0, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0, + .flags = { SequenceFlag::entranceConnectionNE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq2 = { .clearance = { 0, 64, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0, + .flags = { SequenceFlag::entranceConnectionNE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq3 = { .clearance = { 0, 96, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq4 = { .clearance = { 32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionNW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; @@ -11926,13 +11941,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatTrack4x4Seq7 = { .clearance = { 32, 96, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionSE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq8 = { .clearance = { 64, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionNW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; @@ -11948,85 +11963,86 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatTrack4x4Seq11 = { .clearance = { 64, 96, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionSE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq12 = { .clearance = { 96, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq13 = { .clearance = { 96, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq14 = { .clearance = { 96, 64, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack4x4Seq15 = { .clearance = { 96, 96, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x4Seq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin, + SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x4Seq1 = { .clearance = { 0, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0, + .flags = { SequenceFlag::entranceConnectionNE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x4Seq2 = { .clearance = { 0, 64, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0, + .flags = { SequenceFlag::entranceConnectionNE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x4Seq3 = { .clearance = { 0, 96, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x4Seq4 = { .clearance = { 32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x4Seq5 = { .clearance = { 32, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x4Seq6 = { .clearance = { 32, 64, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack2x4Seq7 = { .clearance = { 32, 96, 0, 0, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_1 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack1x5Seq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, .woodenSupports = { WoodenSupportSubType::neSw }, }; @@ -12037,13 +12053,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatTrack1x5Seq2 = { .clearance = { -32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack1x5Seq3 = { .clearance = { 32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; @@ -12054,13 +12070,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatTrack1x1ASeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_ORIGIN | TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::trackOrigin, SequenceFlag::connectsToPath, + SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack1x4BSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::trackOrigin, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; @@ -12071,7 +12088,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatTrack1x4BSeq2 = { .clearance = { -32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; @@ -12082,92 +12099,96 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlatTrack1x1BSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 - | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN | TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, + SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin, SequenceFlag::connectsToPath, + SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack1x4CSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack1x4CSeq1 = { .clearance = { -64, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, + SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack1x4CSeq2 = { .clearance = { -32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack1x4CSeq3 = { .clearance = { 32, 0, 0, 0, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_1 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, + SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack3x3Seq0 = { .clearance = { 0, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_ORIGIN, + .flags = { SequenceFlag::trackOrigin }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack3x3Seq1 = { .clearance = { -32, -32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack3x3Seq2 = { .clearance = { -32, 0, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0, + .flags = { SequenceFlag::entranceConnectionNE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack3x3Seq3 = { .clearance = { -32, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_0 | TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack3x3Seq4 = { .clearance = { 0, -32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionNW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack3x3Seq5 = { .clearance = { 0, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1, + .flags = { SequenceFlag::entranceConnectionSE }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack3x3Seq6 = { .clearance = { 32, -32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2 | TRACK_SEQUENCE_FLAG_DIRECTION_3, + .flags = { SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack3x3Seq7 = { .clearance = { 32, 32, 0, 0, { 0b1111, 0 }, 0 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kFlatTrack3x3Seq8 = { .clearance = { 32, 0, 0, 0, { 0b1111, 0 }, RCT_PREVIEW_TRACK_FLAG_1 }, - .flags = TRACK_SEQUENCE_FLAG_DIRECTION_2, + .flags = { SequenceFlag::entranceConnectionSW }, .woodenSupports = { WoodenSupportSubType::neSw }, }; static constexpr SequenceDescriptor kLeftLargeCorkscrewUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow kSegmentsUnimplemented, // inverted @@ -12219,6 +12240,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeCorkscrewUpSeq5 = { .clearance = { -64, -64, 72, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { EnumsToFlags(PS::left, PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow @@ -12230,6 +12252,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeCorkscrewUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewUpSeq0.blockedSegments), }; @@ -12261,6 +12284,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeCorkscrewUpSeq5 = { .clearance = { -64, 64, 72, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewUpSeq5.blockedSegments), }; @@ -12268,6 +12292,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeCorkscrewDownSeq0 = { .clearance = { 0, 0, -40, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kRightLargeCorkscrewUpSeq5.blockedSegments, 1), }; @@ -12300,12 +12325,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeCorkscrewDownSeq5 = { .clearance = { -64, -64, -112, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kRightLargeCorkscrewUpSeq0.blockedSegments, 1), }; static constexpr SequenceDescriptor kRightLargeCorkscrewDownSeq0 = { .clearance = { 0, 0, -40, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewDownSeq0.blockedSegments), }; @@ -12338,12 +12365,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeCorkscrewDownSeq5 = { .clearance = { -64, 64, -112, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewDownSeq5.blockedSegments), }; static constexpr SequenceDescriptor kLeftMediumHalfLoopUpSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow kSegmentsUnimplemented, // inverted @@ -12384,6 +12413,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftMediumHalfLoopUpSeq4 = { .clearance = { -32, -32, 168, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow kSegmentsUnimplemented, // inverted @@ -12394,6 +12424,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightMediumHalfLoopUpSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftMediumHalfLoopUpSeq0.blockedSegments), }; @@ -12418,12 +12449,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightMediumHalfLoopUpSeq4 = { .clearance = { -32, 32, 168, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftMediumHalfLoopUpSeq4.blockedSegments), }; static constexpr SequenceDescriptor kLeftMediumHalfLoopDownSeq0 = { .clearance = { 0, 0, -48, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kRightMediumHalfLoopUpSeq4.blockedSegments, }; @@ -12448,12 +12481,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftMediumHalfLoopDownSeq4 = { .clearance = { 32, -32, -216, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kRightMediumHalfLoopUpSeq0.blockedSegments, }; static constexpr SequenceDescriptor kRightMediumHalfLoopDownSeq0 = { .clearance = { 0, 0, -48, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftMediumHalfLoopDownSeq0.blockedSegments), }; @@ -12478,12 +12513,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightMediumHalfLoopDownSeq4 = { .clearance = { 32, 32, -216, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftMediumHalfLoopDownSeq4.blockedSegments), }; static constexpr SequenceDescriptor kLeftZeroGRollUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -12506,6 +12543,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftZeroGRollUpSeq2 = { .clearance = { -64, 0, 24, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = { { @@ -12518,6 +12556,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightZeroGRollUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollUpSeq0.blockedSegments), }; @@ -12532,6 +12571,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightZeroGRollUpSeq2 = { .clearance = { -64, 0, 24, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollUpSeq2.blockedSegments), @@ -12540,6 +12580,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftZeroGRollDownSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kLeftZeroGRollUpSeq2.blockedSegments, 2), @@ -12555,6 +12596,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftZeroGRollDownSeq2 = { .clearance = { -64, 0, -56, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsRotate(kLeftZeroGRollUpSeq0.blockedSegments, 2), }; @@ -12562,6 +12604,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightZeroGRollDownSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollDownSeq0.blockedSegments), @@ -12577,6 +12620,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightZeroGRollDownSeq2 = { .clearance = { -64, 0, -56, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollDownSeq2.blockedSegments), }; @@ -12584,6 +12628,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeZeroGRollUpSeq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -12617,6 +12662,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeZeroGRollUpSeq3 = { .clearance = { -96, 0, 120, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = { { @@ -12629,6 +12675,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeZeroGRollUpSeq0 = { .clearance = { 0, 0, 0, 64, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollUpSeq0.blockedSegments), }; @@ -12650,6 +12697,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeZeroGRollUpSeq3 = { .clearance = { -96, 0, 120, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollUpSeq3.blockedSegments), @@ -12658,6 +12706,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeZeroGRollDownSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kLeftLargeZeroGRollUpSeq3.blockedSegments, 2), @@ -12680,6 +12729,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftLargeZeroGRollDownSeq3 = { .clearance = { -96, 0, -152, 64, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsRotate(kLeftLargeZeroGRollUpSeq0.blockedSegments, 2), }; @@ -12687,6 +12737,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeZeroGRollDownSeq0 = { .clearance = { 0, 0, -32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollDownSeq0.blockedSegments), @@ -12709,6 +12760,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightLargeZeroGRollDownSeq3 = { .clearance = { -96, 0, -152, 64, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollDownSeq3.blockedSegments), }; @@ -12716,6 +12768,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerLargeHalfLoopUninvertedUpSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow kSegmentsUnimplemented, // inverted @@ -12776,6 +12829,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerLargeHalfLoopUninvertedUpSeq6 = { .clearance = { -64, -32, 248, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { EnumsToFlags(PS::right, PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow @@ -12787,6 +12841,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerLargeHalfLoopUninvertedUpSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerLargeHalfLoopUninvertedUpSeq0.blockedSegments), }; @@ -12823,6 +12878,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerLargeHalfLoopUninvertedUpSeq6 = { .clearance = { -64, 32, 248, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerLargeHalfLoopUninvertedUpSeq6.blockedSegments), }; @@ -12830,6 +12886,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerLargeHalfLoopInvertedDownSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { kSegmentsUnimplemented, // narrow EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // inverted @@ -12893,6 +12950,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerLargeHalfLoopInvertedDownSeq6 = { .clearance = { 64, -32, -248, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -12904,6 +12962,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerLargeHalfLoopInvertedDownSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerLargeHalfLoopInvertedDownSeq0.blockedSegments), }; @@ -12943,6 +13002,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerLargeHalfLoopInvertedDownSeq6 = { .clearance = { 64, 32, -248, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerLargeHalfLoopInvertedDownSeq6.blockedSegments), }; @@ -12950,6 +13010,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerLargeHalfLoopInvertedUpSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { kSegmentsUnimplemented, // narrow EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // inverted @@ -13010,6 +13071,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerLargeHalfLoopInvertedUpSeq6 = { .clearance = { -64, -32, 248, 32, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -13021,6 +13083,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerLargeHalfLoopInvertedUpSeq0 = { .clearance = { 0, 0, 0, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerLargeHalfLoopInvertedUpSeq0.blockedSegments), }; @@ -13057,6 +13120,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerLargeHalfLoopInvertedUpSeq6 = { .clearance = { -64, 32, 248, 32, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerLargeHalfLoopInvertedUpSeq6.blockedSegments), }; @@ -13064,6 +13128,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerLargeHalfLoopUninvertedDownSeq0 = { .clearance = { 0, 0, -32, 32, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow kSegmentsUnimplemented, // inverted @@ -13124,6 +13189,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftFlyerLargeHalfLoopUninvertedDownSeq6 = { .clearance = { 64, -32, -280, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -13135,6 +13201,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerLargeHalfLoopUninvertedDownSeq0 = { .clearance = { 0, 0, -32, 32, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerLargeHalfLoopUninvertedDownSeq0.blockedSegments), }; @@ -13171,6 +13238,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightFlyerLargeHalfLoopUninvertedDownSeq6 = { .clearance = { 64, 32, -280, 24, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerLargeHalfLoopUninvertedDownSeq6.blockedSegments), }; @@ -13178,6 +13246,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlyerHalfLoopInvertedUpSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { kSegmentsUnimplemented, // narrow EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // inverted @@ -13209,6 +13278,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlyerHalfLoopInvertedUpSeq3 = { .clearance = { -32, 0, 120, 32, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { kSegmentsUnimplemented, // narrow @@ -13219,6 +13289,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlyerHalfLoopUninvertedDownSeq0 = { .clearance = { 0, 0, -32, 32, { 0b1111, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow kSegmentsUnimplemented, // inverted @@ -13249,6 +13320,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kFlyerHalfLoopUninvertedDownSeq3 = { .clearance = { 32, 0, -152, 16, { 0b1111, 0b1100 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -13260,6 +13332,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthToDiagUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .blockedSegments = { { EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow @@ -13313,6 +13386,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthToDiagUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftEighthToDiagUp25Seq0.blockedSegments), }; @@ -13346,6 +13420,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthToDiagDown25Seq0 = { .clearance = { 0, 0, -16, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .extraSupportRotation = 2, .blockedSegments = kLeftEighthToDiagUp25Seq0.blockedSegments, @@ -13374,12 +13449,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthToDiagDown25Seq4 = { .clearance = { -64, -32, -48, 16, { 0b0001, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kLeftEighthToDiagUp25Seq4.blockedSegments, }; static constexpr SequenceDescriptor kRightEighthToDiagDown25Seq0 = { .clearance = { 0, 0, -16, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .extraSupportRotation = 2, .blockedSegments = blockedSegmentsFlipXAxis(kLeftEighthToDiagDown25Seq0.blockedSegments), @@ -13408,11 +13485,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthToDiagDown25Seq4 = { .clearance = { -64, 32, -48, 16, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftEighthToDiagDown25Seq4.blockedSegments), }; static constexpr SequenceDescriptor kLeftEighthToOrthogonalUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kRightEighthToDiagUp25Seq4.blockedSegments, 2), }; @@ -13446,6 +13525,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthToOrthogonalUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kLeftEighthToDiagUp25Seq4.blockedSegments, 3), }; @@ -13473,6 +13553,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthToOrthogonalUp25Seq4 = { .clearance = { -32, 64, 32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::nwSe }, .blockedSegments = blockedSegmentsRotate(kLeftEighthToDiagUp25Seq0.blockedSegments, 3), }; @@ -13508,6 +13589,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthToOrthogonalDown25Seq4 = { .clearance = { -64, 32, -48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kLeftEighthToOrthogonalUp25Seq4.blockedSegments, }; @@ -13542,11 +13624,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthToOrthogonalDown25Seq4 = { .clearance = { -32, 64, -48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kRightEighthToOrthogonalUp25Seq4.blockedSegments, }; static constexpr SequenceDescriptor kDiagUp25ToLeftBankedUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13571,6 +13655,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp25ToRightBankedUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13595,6 +13680,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankedUp25ToUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13619,6 +13705,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankedUp25ToUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13662,6 +13749,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown25ToLeftBankedDown25Seq3 = { .clearance = { -32, 32, 0, 16, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; @@ -13686,6 +13774,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown25ToRightBankedDown25Seq3 = { .clearance = { -32, 32, 0, 16, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; @@ -13710,6 +13799,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankedDown25ToDown25Seq3 = { .clearance = { -32, 32, 0, 16, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; @@ -13734,11 +13824,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankedDown25ToDown25Seq3 = { .clearance = { -32, 32, 0, 16, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; static constexpr SequenceDescriptor kDiagLeftBankedFlatToLeftBankedUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13763,6 +13855,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankedFlatToRightBankedUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13787,6 +13880,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankedUp25ToLeftBankedFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13811,6 +13905,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankedUp25ToRightBankedFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13854,6 +13949,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankedFlatToLeftBankedDown25Seq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; @@ -13878,6 +13974,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankedFlatToRightBankedDown25Seq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; @@ -13902,6 +13999,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankedDown25ToLeftBankedFlatSeq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; @@ -13926,11 +14024,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankedDown25ToRightBankedFlatSeq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; static constexpr SequenceDescriptor kDiagFlatToLeftBankedUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13955,6 +14055,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagFlatToRightBankedUp25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -13979,6 +14080,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankedUp25ToFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -14003,6 +14105,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankedUp25ToFlatSeq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -14027,6 +14130,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagFlatToLeftBankedDown25Seq0 = { .clearance = { 0, 0, 0, 8, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -14070,6 +14174,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagFlatToRightBankedDown25Seq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; @@ -14094,6 +14199,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagLeftBankedDown25ToFlatSeq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; @@ -14118,11 +14224,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagRightBankedDown25ToFlatSeq3 = { .clearance = { -32, 32, 0, 8, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; static constexpr SequenceDescriptor kDiagUp25LeftBankedSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -14147,6 +14255,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp25RightBankedSeq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -14190,6 +14299,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown25LeftBankedSeq3 = { .clearance = { -32, 32, 0, 16, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; @@ -14214,12 +14324,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown25RightBankedSeq3 = { .clearance = { -32, 32, 0, 16, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq3.blockedSegments, }; static constexpr SequenceDescriptor kLeftEighthBankToDiagUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .blockedSegments = kLeftEighthToDiagUp25Seq0.blockedSegments, }; @@ -14253,6 +14365,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthBankToDiagUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .blockedSegments = blockedSegmentsFlipXAxis(kLeftEighthBankToDiagUp25Seq0.blockedSegments), }; @@ -14286,6 +14399,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthBankToDiagDown25Seq0 = { .clearance = { 0, 0, -16, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .extraSupportRotation = 2, .blockedSegments = kLeftEighthBankToDiagUp25Seq0.blockedSegments, @@ -14314,12 +14428,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthBankToDiagDown25Seq4 = { .clearance = { -64, -32, -48, 16, { 0b0001, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kLeftEighthBankToDiagUp25Seq4.blockedSegments, }; static constexpr SequenceDescriptor kRightEighthBankToDiagDown25Seq0 = { .clearance = { 0, 0, -16, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1000, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .extraSupportRotation = 2, .blockedSegments = kRightEighthBankToDiagUp25Seq0.blockedSegments, @@ -14348,11 +14464,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthBankToDiagDown25Seq4 = { .clearance = { -64, 32, -48, 16, { 0b0010, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kRightEighthBankToDiagUp25Seq4.blockedSegments, }; static constexpr SequenceDescriptor kLeftEighthBankToOrthogonalUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kRightEighthBankToDiagUp25Seq4.blockedSegments, 2), }; @@ -14380,12 +14498,14 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthBankToOrthogonalUp25Seq4 = { .clearance = { -64, 32, 32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw }, .blockedSegments = blockedSegmentsRotate(kRightEighthBankToDiagUp25Seq0.blockedSegments, 2), }; static constexpr SequenceDescriptor kRightEighthBankToOrthogonalUp25Seq0 = { .clearance = { 0, 0, 0, 16, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kLeftEighthBankToDiagUp25Seq4.blockedSegments, 3), }; @@ -14413,6 +14533,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthBankToOrthogonalUp25Seq4 = { .clearance = { -32, 64, 32, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::nwSe }, .blockedSegments = blockedSegmentsRotate(kLeftEighthBankToDiagUp25Seq0.blockedSegments, 3), }; @@ -14448,11 +14569,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthBankToOrthogonalDown25Seq4 = { .clearance = { -64, 32, -48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0010, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kLeftEighthBankToOrthogonalUp25Seq4.blockedSegments, }; static constexpr SequenceDescriptor kRightEighthBankToOrthogonalDown25Seq0 = { .clearance = { 0, 0, -16, 24, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25Deg }, .extraSupportRotation = 2, .blockedSegments = kRightEighthBankToOrthogonalUp25Seq0.blockedSegments, @@ -14482,11 +14605,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthBankToOrthogonalDown25Seq4 = { .clearance = { -32, 64, -48, 16, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0001, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kRightEighthBankToOrthogonalUp25Seq4.blockedSegments, }; static constexpr SequenceDescriptor kDiagBrakesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -14511,6 +14636,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagBlockBrakesSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = kDiagFlatSeq0.blockedSegments, }; @@ -14536,6 +14662,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq0 = { .clearance = { 0, 0, 0, 0, { 0b1101, 0 }, 0 }, .allowedWallEdges = 0b0000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow kSegmentsUnimplemented, // inverted @@ -14626,6 +14753,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq0 = { .clearance = { 0, 0, 0, 64, { 0b1101, 0 }, 0 }, .allowedWallEdges = 0b0000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow kSegmentsUnimplemented, // inverted @@ -14761,6 +14889,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq9 = { .clearance = { -96, 96, 0, 64, { 0b0010, 0 }, 0 }, .allowedWallEdges = 0b0000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq0.blockedSegments, 2), }; static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq0 = { @@ -14811,11 +14940,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq9 = { .clearance = { -96, 96, 0, 0, { 0b0010, 0 }, 0 }, .allowedWallEdges = 0b0000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq0.blockedSegments, 2), }; static constexpr SequenceDescriptor kLeftEighthDiveLoopUpToOrthogonalSeq0 = { .clearance = { 0, 0, 0, 64, { 0b1101, 0 }, 0 }, .allowedWallEdges = 0b0000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = { { EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow kSegmentsUnimplemented, // inverted @@ -14862,6 +14993,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthDiveLoopUpToOrthogonalSeq5 = { .clearance = { -96, 32, 112, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = { { EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow @@ -14872,6 +15004,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthDiveLoopUpToOrthogonalSeq0 = { .clearance = { 0, 0, 0, 64, { 0b1101, 0 }, 0 }, .allowedWallEdges = 0b0000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate( blockedSegmentsFlipXAxis(kLeftEighthDiveLoopUpToOrthogonalSeq0.blockedSegments), 1), }; @@ -14903,6 +15036,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthDiveLoopUpToOrthogonalSeq5 = { .clearance = { -32, 96, 112, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b0101, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate( blockedSegmentsFlipXAxis(kLeftEighthDiveLoopUpToOrthogonalSeq5.blockedSegments), 1), @@ -14910,6 +15044,7 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthDiveLoopDownToDiagSeq0 = { .clearance = { 0, 0, 112, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kRightEighthDiveLoopUpToOrthogonalSeq5.blockedSegments, 1), }; @@ -14937,11 +15072,13 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kLeftEighthDiveLoopDownToDiagSeq5 = { .clearance = { -96, -32, 0, 64, { 0b0001, 0 }, 0 }, .allowedWallEdges = 0b0000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kRightEighthDiveLoopUpToOrthogonalSeq0.blockedSegments, 1), }; static constexpr SequenceDescriptor kRightEighthDiveLoopDownToDiagSeq0 = { .clearance = { 0, 0, 112, 24, { 0b1111, 0 }, 0 }, .allowedWallEdges = 0b1010, + .flags = { SequenceFlag::hasHeightMarker }, .invertSegmentBlocking = true, .blockedSegments = blockedSegmentsRotate(kLeftEighthDiveLoopUpToOrthogonalSeq5.blockedSegments, 2), }; @@ -14969,955 +15106,956 @@ namespace OpenRCT2::TrackMetaData static constexpr SequenceDescriptor kRightEighthDiveLoopDownToDiagSeq5 = { .clearance = { -96, 32, 0, 64, { 0b0010, 0 }, 0 }, .allowedWallEdges = 0b0000, + .flags = { SequenceFlag::hasHeightMarker }, .blockedSegments = blockedSegmentsRotate(kLeftEighthDiveLoopUpToOrthogonalSeq0.blockedSegments, 2), }; static constexpr SequenceData kSequenceDescriptorsByElement[] = { - /* TrackElemType::Flat */ { 1, { kFlatSeq0 } }, - /* TrackElemType::EndStation */ { 1, { kEndStationSeq0 } }, - /* TrackElemType::BeginStation */ { 1, { kBeginStationSeq0 } }, - /* TrackElemType::MiddleStation */ { 1, { kMiddleStationSeq0 } }, - /* TrackElemType::Up25 */ { 1, { kUp25Seq0 } }, - /* TrackElemType::Up60 */ { 1, { kUp60Seq0 } }, - /* TrackElemType::FlatToUp25 */ { 1, { kFlatToUp25Seq0 } }, - /* TrackElemType::Up25ToUp60 */ { 1, { kUp25ToUp60Seq0 } }, - /* TrackElemType::Up60ToUp25 */ { 1, { kUp60ToUp25Seq0 } }, - /* TrackElemType::Up25ToFlat */ { 1, { kUp25ToFlatSeq0 } }, - /* TrackElemType::Down25 */ { 1, { kDown25Seq0 } }, - /* TrackElemType::Down60 */ { 1, { kDown60Seq0 } }, - /* TrackElemType::FlatToDown25 */ { 1, { kFlatToDown25Seq0 } }, - /* TrackElemType::Down25ToDown60 */ { 1, { kDown25ToDown60Seq0 } }, - /* TrackElemType::Down60ToDown25 */ { 1, { kDown60ToDown25Seq0 } }, - /* TrackElemType::Down25ToFlat */ { 1, { kDown25ToFlatSeq0 } }, - /* TrackElemType::LeftQuarterTurn5Tiles */ + /* TrackElemType::flat */ { 1, { kFlatSeq0 } }, + /* TrackElemType::endStation */ { 1, { kEndStationSeq0 } }, + /* TrackElemType::beginStation */ { 1, { kBeginStationSeq0 } }, + /* TrackElemType::middleStation */ { 1, { kMiddleStationSeq0 } }, + /* TrackElemType::up25 */ { 1, { kUp25Seq0 } }, + /* TrackElemType::up60 */ { 1, { kUp60Seq0 } }, + /* TrackElemType::flatToUp25 */ { 1, { kFlatToUp25Seq0 } }, + /* TrackElemType::up25ToUp60 */ { 1, { kUp25ToUp60Seq0 } }, + /* TrackElemType::up60ToUp25 */ { 1, { kUp60ToUp25Seq0 } }, + /* TrackElemType::up25ToFlat */ { 1, { kUp25ToFlatSeq0 } }, + /* TrackElemType::down25 */ { 1, { kDown25Seq0 } }, + /* TrackElemType::down60 */ { 1, { kDown60Seq0 } }, + /* TrackElemType::flatToDown25 */ { 1, { kFlatToDown25Seq0 } }, + /* TrackElemType::down25ToDown60 */ { 1, { kDown25ToDown60Seq0 } }, + /* TrackElemType::down60ToDown25 */ { 1, { kDown60ToDown25Seq0 } }, + /* TrackElemType::down25ToFlat */ { 1, { kDown25ToFlatSeq0 } }, + /* TrackElemType::leftQuarterTurn5Tiles */ { 7, { kLeftQuarterTurn5TilesSeq0, kLeftQuarterTurn5TilesSeq1, kLeftQuarterTurn5TilesSeq2, kLeftQuarterTurn5TilesSeq3, kLeftQuarterTurn5TilesSeq4, kLeftQuarterTurn5TilesSeq5, kLeftQuarterTurn5TilesSeq6 } }, - /* TrackElemType::RightQuarterTurn5Tiles */ + /* TrackElemType::rightQuarterTurn5Tiles */ { 7, { kRightQuarterTurn5TilesSeq0, kRightQuarterTurn5TilesSeq1, kRightQuarterTurn5TilesSeq2, kRightQuarterTurn5TilesSeq3, kRightQuarterTurn5TilesSeq4, kRightQuarterTurn5TilesSeq5, kRightQuarterTurn5TilesSeq6 } }, - /* TrackElemType::FlatToLeftBank */ { 1, { kFlatToLeftBankSeq0 } }, - /* TrackElemType::FlatToRightBank */ { 1, { kFlatToRightBankSeq0 } }, - /* TrackElemType::LeftBankToFlat */ { 1, { kLeftBankToFlatSeq0 } }, - /* TrackElemType::RightBankToFlat */ { 1, { kRightBankToFlatSeq0 } }, - /* TrackElemType::BankedLeftQuarterTurn5Tiles */ + /* TrackElemType::flatToLeftBank */ { 1, { kFlatToLeftBankSeq0 } }, + /* TrackElemType::flatToRightBank */ { 1, { kFlatToRightBankSeq0 } }, + /* TrackElemType::leftBankToFlat */ { 1, { kLeftBankToFlatSeq0 } }, + /* TrackElemType::rightBankToFlat */ { 1, { kRightBankToFlatSeq0 } }, + /* TrackElemType::bankedLeftQuarterTurn5Tiles */ { 7, { kBankedLeftQuarterTurn5TilesSeq0, kBankedLeftQuarterTurn5TilesSeq1, kBankedLeftQuarterTurn5TilesSeq2, kBankedLeftQuarterTurn5TilesSeq3, kBankedLeftQuarterTurn5TilesSeq4, kBankedLeftQuarterTurn5TilesSeq5, kBankedLeftQuarterTurn5TilesSeq6 } }, - /* TrackElemType::BankedRightQuarterTurn5Tiles */ + /* TrackElemType::bankedRightQuarterTurn5Tiles */ { 7, { kBankedRightQuarterTurn5TilesSeq0, kBankedRightQuarterTurn5TilesSeq1, kBankedRightQuarterTurn5TilesSeq2, kBankedRightQuarterTurn5TilesSeq3, kBankedRightQuarterTurn5TilesSeq4, kBankedRightQuarterTurn5TilesSeq5, kBankedRightQuarterTurn5TilesSeq6 } }, - /* TrackElemType::LeftBankToUp25 */ { 1, { kLeftBankToUp25Seq0 } }, - /* TrackElemType::RightBankToUp25 */ { 1, { kRightBankToUp25Seq0 } }, - /* TrackElemType::Up25ToLeftBank */ { 1, { kUp25ToLeftBankSeq0 } }, - /* TrackElemType::Up25ToRightBank */ { 1, { kUp25ToRightBankSeq0 } }, - /* TrackElemType::LeftBankToDown25 */ { 1, { kLeftBankToDown25Seq0 } }, - /* TrackElemType::RightBankToDown25 */ { 1, { kRightBankToDown25Seq0 } }, - /* TrackElemType::Down25ToLeftBank */ { 1, { kDown25ToLeftBankSeq0 } }, - /* TrackElemType::Down25ToRightBank */ { 1, { kDown25ToRightBankSeq0 } }, - /* TrackElemType::LeftBank */ { 1, { kLeftBankSeq0 } }, - /* TrackElemType::RightBank */ { 1, { kRightBankSeq0 } }, - /* TrackElemType::LeftQuarterTurn5TilesUp25 */ + /* TrackElemType::leftBankToUp25 */ { 1, { kLeftBankToUp25Seq0 } }, + /* TrackElemType::rightBankToUp25 */ { 1, { kRightBankToUp25Seq0 } }, + /* TrackElemType::up25ToLeftBank */ { 1, { kUp25ToLeftBankSeq0 } }, + /* TrackElemType::up25ToRightBank */ { 1, { kUp25ToRightBankSeq0 } }, + /* TrackElemType::leftBankToDown25 */ { 1, { kLeftBankToDown25Seq0 } }, + /* TrackElemType::rightBankToDown25 */ { 1, { kRightBankToDown25Seq0 } }, + /* TrackElemType::down25ToLeftBank */ { 1, { kDown25ToLeftBankSeq0 } }, + /* TrackElemType::down25ToRightBank */ { 1, { kDown25ToRightBankSeq0 } }, + /* TrackElemType::leftBank */ { 1, { kLeftBankSeq0 } }, + /* TrackElemType::rightBank */ { 1, { kRightBankSeq0 } }, + /* TrackElemType::leftQuarterTurn5TilesUp25 */ { 7, { kLeftQuarterTurn5TilesUp25Seq0, kLeftQuarterTurn5TilesUp25Seq1, kLeftQuarterTurn5TilesUp25Seq2, kLeftQuarterTurn5TilesUp25Seq3, kLeftQuarterTurn5TilesUp25Seq4, kLeftQuarterTurn5TilesUp25Seq5, kLeftQuarterTurn5TilesUp25Seq6 } }, - /* TrackElemType::RightQuarterTurn5TilesUp25 */ + /* TrackElemType::rightQuarterTurn5TilesUp25 */ { 7, { kRightQuarterTurn5TilesUp25Seq0, kRightQuarterTurn5TilesUp25Seq1, kRightQuarterTurn5TilesUp25Seq2, kRightQuarterTurn5TilesUp25Seq3, kRightQuarterTurn5TilesUp25Seq4, kRightQuarterTurn5TilesUp25Seq5, kRightQuarterTurn5TilesUp25Seq6 } }, - /* TrackElemType::LeftQuarterTurn5TilesDown25 */ + /* TrackElemType::leftQuarterTurn5TilesDown25 */ { 7, { kLeftQuarterTurn5TilesDown25Seq0, kLeftQuarterTurn5TilesDown25Seq1, kLeftQuarterTurn5TilesDown25Seq2, kLeftQuarterTurn5TilesDown25Seq3, kLeftQuarterTurn5TilesDown25Seq4, kLeftQuarterTurn5TilesDown25Seq5, kLeftQuarterTurn5TilesDown25Seq6 } }, - /* TrackElemType::RightQuarterTurn5TilesDown25 */ + /* TrackElemType::rightQuarterTurn5TilesDown25 */ { 7, { kRightQuarterTurn5TilesDown25Seq0, kRightQuarterTurn5TilesDown25Seq1, kRightQuarterTurn5TilesDown25Seq2, kRightQuarterTurn5TilesDown25Seq3, kRightQuarterTurn5TilesDown25Seq4, kRightQuarterTurn5TilesDown25Seq5, kRightQuarterTurn5TilesDown25Seq6 } }, - /* TrackElemType::SBendLeft */ { 4, { kSBendLeftSeq0, kSBendLeftSeq1, kSBendLeftSeq2, kSBendLeftSeq3 } }, - /* TrackElemType::SBendRight */ { 4, { kSBendRightSeq0, kSBendRightSeq1, kSBendRightSeq2, kSBendRightSeq3 } }, - /* TrackElemType::LeftVerticalLoop */ + /* TrackElemType::sBendLeft */ { 4, { kSBendLeftSeq0, kSBendLeftSeq1, kSBendLeftSeq2, kSBendLeftSeq3 } }, + /* TrackElemType::sBendRight */ { 4, { kSBendRightSeq0, kSBendRightSeq1, kSBendRightSeq2, kSBendRightSeq3 } }, + /* TrackElemType::leftVerticalLoop */ { 10, { kLeftVerticalLoopSeq0, kLeftVerticalLoopSeq1, kLeftVerticalLoopSeq2, kLeftVerticalLoopSeq3, kLeftVerticalLoopSeq4, kLeftVerticalLoopSeq5, kLeftVerticalLoopSeq6, kLeftVerticalLoopSeq7, kLeftVerticalLoopSeq8, kLeftVerticalLoopSeq9 } }, - /* TrackElemType::RightVerticalLoop */ + /* TrackElemType::rightVerticalLoop */ { 10, { kRightVerticalLoopSeq0, kRightVerticalLoopSeq1, kRightVerticalLoopSeq2, kRightVerticalLoopSeq3, kRightVerticalLoopSeq4, kRightVerticalLoopSeq5, kRightVerticalLoopSeq6, kRightVerticalLoopSeq7, kRightVerticalLoopSeq8, kRightVerticalLoopSeq9 } }, - /* TrackElemType::LeftQuarterTurn3Tiles */ + /* TrackElemType::leftQuarterTurn3Tiles */ { 4, { kLeftQuarterTurn3TilesSeq0, kLeftQuarterTurn3TilesSeq1, kLeftQuarterTurn3TilesSeq2, kLeftQuarterTurn3TilesSeq3 } }, - /* TrackElemType::RightQuarterTurn3Tiles */ + /* TrackElemType::rightQuarterTurn3Tiles */ { 4, { kRightQuarterTurn3TilesSeq0, kRightQuarterTurn3TilesSeq1, kRightQuarterTurn3TilesSeq2, kRightQuarterTurn3TilesSeq3 } }, - /* TrackElemType::LeftBankedQuarterTurn3Tiles */ + /* TrackElemType::leftBankedQuarterTurn3Tiles */ { 4, { kLeftBankedQuarterTurn3TilesSeq0, kLeftBankedQuarterTurn3TilesSeq1, kLeftBankedQuarterTurn3TilesSeq2, kLeftBankedQuarterTurn3TilesSeq3 } }, - /* TrackElemType::RightBankedQuarterTurn3Tiles */ + /* TrackElemType::rightBankedQuarterTurn3Tiles */ { 4, { kRightBankedQuarterTurn3TilesSeq0, kRightBankedQuarterTurn3TilesSeq1, kRightBankedQuarterTurn3TilesSeq2, kRightBankedQuarterTurn3TilesSeq3 } }, - /* TrackElemType::LeftQuarterTurn3TilesUp25 */ + /* TrackElemType::leftQuarterTurn3TilesUp25 */ { 4, { kLeftQuarterTurn3TilesUp25Seq0, kLeftQuarterTurn3TilesUp25Seq1, kLeftQuarterTurn3TilesUp25Seq2, kLeftQuarterTurn3TilesUp25Seq3 } }, - /* TrackElemType::RightQuarterTurn3TilesUp25 */ + /* TrackElemType::rightQuarterTurn3TilesUp25 */ { 4, { kRightQuarterTurn3TilesUp25Seq0, kRightQuarterTurn3TilesUp25Seq1, kRightQuarterTurn3TilesUp25Seq2, kRightQuarterTurn3TilesUp25Seq3 } }, - /* TrackElemType::LeftQuarterTurn3TilesDown25 */ + /* TrackElemType::leftQuarterTurn3TilesDown25 */ { 4, { kLeftQuarterTurn3TilesDown25Seq0, kLeftQuarterTurn3TilesDown25Seq1, kLeftQuarterTurn3TilesDown25Seq2, kLeftQuarterTurn3TilesDown25Seq3 } }, - /* TrackElemType::RightQuarterTurn3TilesDown25 */ + /* TrackElemType::rightQuarterTurn3TilesDown25 */ { 4, { kRightQuarterTurn3TilesDown25Seq0, kRightQuarterTurn3TilesDown25Seq1, kRightQuarterTurn3TilesDown25Seq2, kRightQuarterTurn3TilesDown25Seq3 } }, - /* TrackElemType::LeftQuarterTurn1Tile */ { 1, { kLeftQuarterTurn1TileSeq0 } }, - /* TrackElemType::RightQuarterTurn1Tile */ { 1, { kRightQuarterTurn1TileSeq0 } }, - /* TrackElemType::LeftTwistDownToUp */ + /* TrackElemType::leftQuarterTurn1Tile */ { 1, { kLeftQuarterTurn1TileSeq0 } }, + /* TrackElemType::rightQuarterTurn1Tile */ { 1, { kRightQuarterTurn1TileSeq0 } }, + /* TrackElemType::leftTwistDownToUp */ { 3, { kLeftTwistDownToUpSeq0, kLeftTwistDownToUpSeq1, kLeftTwistDownToUpSeq2 } }, - /* TrackElemType::RightTwistDownToUp */ + /* TrackElemType::rightTwistDownToUp */ { 3, { kRightTwistDownToUpSeq0, kRightTwistDownToUpSeq1, kRightTwistDownToUpSeq2 } }, - /* TrackElemType::LeftTwistUpToDown */ + /* TrackElemType::leftTwistUpToDown */ { 3, { kLeftTwistUpToDownSeq0, kLeftTwistUpToDownSeq1, kLeftTwistUpToDownSeq2 } }, - /* TrackElemType::RightTwistUpToDown */ + /* TrackElemType::rightTwistUpToDown */ { 3, { kRightTwistUpToDownSeq0, kRightTwistUpToDownSeq1, kRightTwistUpToDownSeq2 } }, - /* TrackElemType::HalfLoopUp */ { 4, { kHalfLoopUpSeq0, kHalfLoopUpSeq1, kHalfLoopUpSeq2, kHalfLoopUpSeq3 } }, - /* TrackElemType::HalfLoopDown */ { 4, { kHalfLoopDownSeq0, kHalfLoopDownSeq1, kHalfLoopDownSeq2, kHalfLoopDownSeq3 } }, - /* TrackElemType::LeftCorkscrewUp */ { 3, { kLeftCorkscrewUpSeq0, kLeftCorkscrewUpSeq1, kLeftCorkscrewUpSeq2 } }, - /* TrackElemType::RightCorkscrewUp */ { 3, { kRightCorkscrewUpSeq0, kRightCorkscrewUpSeq1, kRightCorkscrewUpSeq2 } }, - /* TrackElemType::LeftCorkscrewDown */ + /* TrackElemType::halfLoopUp */ { 4, { kHalfLoopUpSeq0, kHalfLoopUpSeq1, kHalfLoopUpSeq2, kHalfLoopUpSeq3 } }, + /* TrackElemType::halfLoopDown */ { 4, { kHalfLoopDownSeq0, kHalfLoopDownSeq1, kHalfLoopDownSeq2, kHalfLoopDownSeq3 } }, + /* TrackElemType::leftCorkscrewUp */ { 3, { kLeftCorkscrewUpSeq0, kLeftCorkscrewUpSeq1, kLeftCorkscrewUpSeq2 } }, + /* TrackElemType::rightCorkscrewUp */ { 3, { kRightCorkscrewUpSeq0, kRightCorkscrewUpSeq1, kRightCorkscrewUpSeq2 } }, + /* TrackElemType::leftCorkscrewDown */ { 3, { kLeftCorkscrewDownSeq0, kLeftCorkscrewDownSeq1, kLeftCorkscrewDownSeq2 } }, - /* TrackElemType::RightCorkscrewDown */ + /* TrackElemType::rightCorkscrewDown */ { 3, { kRightCorkscrewDownSeq0, kRightCorkscrewDownSeq1, kRightCorkscrewDownSeq2 } }, - /* TrackElemType::FlatToUp60 */ { 1, { kFlatToUp60Seq0 } }, - /* TrackElemType::Up60ToFlat */ { 1, { kUp60ToFlatSeq0 } }, - /* TrackElemType::FlatToDown60 */ { 1, { kFlatToDown60Seq0 } }, - /* TrackElemType::Down60ToFlat */ { 1, { kDown60ToFlatSeq0 } }, - /* TrackElemType::TowerBase */ + /* TrackElemType::flatToUp60 */ { 1, { kFlatToUp60Seq0 } }, + /* TrackElemType::up60ToFlat */ { 1, { kUp60ToFlatSeq0 } }, + /* TrackElemType::flatToDown60 */ { 1, { kFlatToDown60Seq0 } }, + /* TrackElemType::down60ToFlat */ { 1, { kDown60ToFlatSeq0 } }, + /* TrackElemType::towerBase */ { 9, { kTowerBaseSeq0, kTowerBaseSeq1, kTowerBaseSeq2, kTowerBaseSeq3, kTowerBaseSeq4, kTowerBaseSeq5, kTowerBaseSeq6, kTowerBaseSeq7, kTowerBaseSeq8 } }, - /* TrackElemType::TowerSection */ { 2, { kTowerSectionSeq0, kTowerSectionSeq1 } }, - /* TrackElemType::FlatCovered */ { 1, { kFlatCoveredSeq0 } }, - /* TrackElemType::Up25Covered */ { 1, { kUp25CoveredSeq0 } }, - /* TrackElemType::Up60Covered */ { 1, { kUp60CoveredSeq0 } }, - /* TrackElemType::FlatToUp25Covered */ { 1, { kFlatToUp25CoveredSeq0 } }, - /* TrackElemType::Up25ToUp60Covered */ { 1, { kUp25ToUp60CoveredSeq0 } }, - /* TrackElemType::Up60ToUp25Covered */ { 1, { kUp60ToUp25CoveredSeq0 } }, - /* TrackElemType::Up25ToFlatCovered */ { 1, { kUp25ToFlatCoveredSeq0 } }, - /* TrackElemType::Down25Covered */ { 1, { kDown25CoveredSeq0 } }, - /* TrackElemType::Down60Covered */ { 1, { kDown60CoveredSeq0 } }, - /* TrackElemType::FlatToDown25Covered */ { 1, { kFlatToDown25CoveredSeq0 } }, - /* TrackElemType::Down25ToDown60Covered */ { 1, { kDown25ToDown60CoveredSeq0 } }, - /* TrackElemType::Down60ToDown25Covered */ { 1, { kDown60ToDown25CoveredSeq0 } }, - /* TrackElemType::Down25ToFlatCovered */ { 1, { kDown25ToFlatCoveredSeq0 } }, - /* TrackElemType::LeftQuarterTurn5TilesCovered */ + /* TrackElemType::towerSection */ { 2, { kTowerSectionSeq0, kTowerSectionSeq1 } }, + /* TrackElemType::flatCovered */ { 1, { kFlatCoveredSeq0 } }, + /* TrackElemType::up25Covered */ { 1, { kUp25CoveredSeq0 } }, + /* TrackElemType::up60Covered */ { 1, { kUp60CoveredSeq0 } }, + /* TrackElemType::flatToUp25Covered */ { 1, { kFlatToUp25CoveredSeq0 } }, + /* TrackElemType::up25ToUp60Covered */ { 1, { kUp25ToUp60CoveredSeq0 } }, + /* TrackElemType::up60ToUp25Covered */ { 1, { kUp60ToUp25CoveredSeq0 } }, + /* TrackElemType::up25ToFlatCovered */ { 1, { kUp25ToFlatCoveredSeq0 } }, + /* TrackElemType::down25Covered */ { 1, { kDown25CoveredSeq0 } }, + /* TrackElemType::down60Covered */ { 1, { kDown60CoveredSeq0 } }, + /* TrackElemType::flatToDown25Covered */ { 1, { kFlatToDown25CoveredSeq0 } }, + /* TrackElemType::down25ToDown60Covered */ { 1, { kDown25ToDown60CoveredSeq0 } }, + /* TrackElemType::down60ToDown25Covered */ { 1, { kDown60ToDown25CoveredSeq0 } }, + /* TrackElemType::down25ToFlatCovered */ { 1, { kDown25ToFlatCoveredSeq0 } }, + /* TrackElemType::leftQuarterTurn5TilesCovered */ { 7, { kLeftQuarterTurn5TilesCoveredSeq0, kLeftQuarterTurn5TilesCoveredSeq1, kLeftQuarterTurn5TilesCoveredSeq2, kLeftQuarterTurn5TilesCoveredSeq3, kLeftQuarterTurn5TilesCoveredSeq4, kLeftQuarterTurn5TilesCoveredSeq5, kLeftQuarterTurn5TilesCoveredSeq6 } }, - /* TrackElemType::RightQuarterTurn5TilesCovered */ + /* TrackElemType::rightQuarterTurn5TilesCovered */ { 7, { kRightQuarterTurn5TilesCoveredSeq0, kRightQuarterTurn5TilesCoveredSeq1, kRightQuarterTurn5TilesCoveredSeq2, kRightQuarterTurn5TilesCoveredSeq3, kRightQuarterTurn5TilesCoveredSeq4, kRightQuarterTurn5TilesCoveredSeq5, kRightQuarterTurn5TilesCoveredSeq6 } }, - /* TrackElemType::SBendLeftCovered */ + /* TrackElemType::sBendLeftCovered */ { 4, { kSBendLeftCoveredSeq0, kSBendLeftCoveredSeq1, kSBendLeftCoveredSeq2, kSBendLeftCoveredSeq3 } }, - /* TrackElemType::SBendRightCovered */ + /* TrackElemType::sBendRightCovered */ { 4, { kSBendRightCoveredSeq0, kSBendRightCoveredSeq1, kSBendRightCoveredSeq2, kSBendRightCoveredSeq3 } }, - /* TrackElemType::LeftQuarterTurn3TilesCovered */ + /* TrackElemType::leftQuarterTurn3TilesCovered */ { 4, { kLeftQuarterTurn3TilesCoveredSeq0, kLeftQuarterTurn3TilesCoveredSeq1, kLeftQuarterTurn3TilesCoveredSeq2, kLeftQuarterTurn3TilesCoveredSeq3 } }, - /* TrackElemType::RightQuarterTurn3TilesCovered */ + /* TrackElemType::rightQuarterTurn3TilesCovered */ { 4, { kRightQuarterTurn3TilesCoveredSeq0, kRightQuarterTurn3TilesCoveredSeq1, kRightQuarterTurn3TilesCoveredSeq2, kRightQuarterTurn3TilesCoveredSeq3 } }, - /* TrackElemType::LeftHalfBankedHelixUpSmall */ + /* TrackElemType::leftHalfBankedHelixUpSmall */ { 8, { kLeftHalfBankedHelixUpSmallSeq0, kLeftHalfBankedHelixUpSmallSeq1, kLeftHalfBankedHelixUpSmallSeq2, kLeftHalfBankedHelixUpSmallSeq3, kLeftHalfBankedHelixUpSmallSeq4, kLeftHalfBankedHelixUpSmallSeq5, kLeftHalfBankedHelixUpSmallSeq6, kLeftHalfBankedHelixUpSmallSeq7 } }, - /* TrackElemType::RightHalfBankedHelixUpSmall */ + /* TrackElemType::rightHalfBankedHelixUpSmall */ { 8, { kRightHalfBankedHelixUpSmallSeq0, kRightHalfBankedHelixUpSmallSeq1, kRightHalfBankedHelixUpSmallSeq2, kRightHalfBankedHelixUpSmallSeq3, kRightHalfBankedHelixUpSmallSeq4, kRightHalfBankedHelixUpSmallSeq5, kRightHalfBankedHelixUpSmallSeq6, kRightHalfBankedHelixUpSmallSeq7 } }, - /* TrackElemType::LeftHalfBankedHelixDownSmall */ + /* TrackElemType::leftHalfBankedHelixDownSmall */ { 8, { kLeftHalfBankedHelixDownSmallSeq0, kLeftHalfBankedHelixDownSmallSeq1, kLeftHalfBankedHelixDownSmallSeq2, kLeftHalfBankedHelixDownSmallSeq3, kLeftHalfBankedHelixDownSmallSeq4, kLeftHalfBankedHelixDownSmallSeq5, kLeftHalfBankedHelixDownSmallSeq6, kLeftHalfBankedHelixDownSmallSeq7 } }, - /* TrackElemType::RightHalfBankedHelixDownSmall */ + /* TrackElemType::rightHalfBankedHelixDownSmall */ { 8, { kRightHalfBankedHelixDownSmallSeq0, kRightHalfBankedHelixDownSmallSeq1, kRightHalfBankedHelixDownSmallSeq2, kRightHalfBankedHelixDownSmallSeq3, kRightHalfBankedHelixDownSmallSeq4, kRightHalfBankedHelixDownSmallSeq5, kRightHalfBankedHelixDownSmallSeq6, kRightHalfBankedHelixDownSmallSeq7 } }, - /* TrackElemType::LeftHalfBankedHelixUpLarge */ + /* TrackElemType::leftHalfBankedHelixUpLarge */ { 14, { kLeftHalfBankedHelixUpLargeSeq0, kLeftHalfBankedHelixUpLargeSeq1, kLeftHalfBankedHelixUpLargeSeq2, kLeftHalfBankedHelixUpLargeSeq3, kLeftHalfBankedHelixUpLargeSeq4, kLeftHalfBankedHelixUpLargeSeq5, kLeftHalfBankedHelixUpLargeSeq6, kLeftHalfBankedHelixUpLargeSeq7, kLeftHalfBankedHelixUpLargeSeq8, kLeftHalfBankedHelixUpLargeSeq9, kLeftHalfBankedHelixUpLargeSeq10, kLeftHalfBankedHelixUpLargeSeq11, kLeftHalfBankedHelixUpLargeSeq12, kLeftHalfBankedHelixUpLargeSeq13 } }, - /* TrackElemType::RightHalfBankedHelixUpLarge */ + /* TrackElemType::rightHalfBankedHelixUpLarge */ { 14, { kRightHalfBankedHelixUpLargeSeq0, kRightHalfBankedHelixUpLargeSeq1, kRightHalfBankedHelixUpLargeSeq2, kRightHalfBankedHelixUpLargeSeq3, kRightHalfBankedHelixUpLargeSeq4, kRightHalfBankedHelixUpLargeSeq5, kRightHalfBankedHelixUpLargeSeq6, kRightHalfBankedHelixUpLargeSeq7, kRightHalfBankedHelixUpLargeSeq8, kRightHalfBankedHelixUpLargeSeq9, kRightHalfBankedHelixUpLargeSeq10, kRightHalfBankedHelixUpLargeSeq11, kRightHalfBankedHelixUpLargeSeq12, kRightHalfBankedHelixUpLargeSeq13 } }, - /* TrackElemType::LeftHalfBankedHelixDownLarge */ + /* TrackElemType::leftHalfBankedHelixDownLarge */ { 14, { kLeftHalfBankedHelixDownLargeSeq0, kLeftHalfBankedHelixDownLargeSeq1, kLeftHalfBankedHelixDownLargeSeq2, kLeftHalfBankedHelixDownLargeSeq3, kLeftHalfBankedHelixDownLargeSeq4, kLeftHalfBankedHelixDownLargeSeq5, kLeftHalfBankedHelixDownLargeSeq6, kLeftHalfBankedHelixDownLargeSeq7, kLeftHalfBankedHelixDownLargeSeq8, kLeftHalfBankedHelixDownLargeSeq9, kLeftHalfBankedHelixDownLargeSeq10, kLeftHalfBankedHelixDownLargeSeq11, kLeftHalfBankedHelixDownLargeSeq12, kLeftHalfBankedHelixDownLargeSeq13 } }, - /* TrackElemType::RightHalfBankedHelixDownLarge */ + /* TrackElemType::rightHalfBankedHelixDownLarge */ { 14, { kRightHalfBankedHelixDownLargeSeq0, kRightHalfBankedHelixDownLargeSeq1, kRightHalfBankedHelixDownLargeSeq2, kRightHalfBankedHelixDownLargeSeq3, kRightHalfBankedHelixDownLargeSeq4, kRightHalfBankedHelixDownLargeSeq5, kRightHalfBankedHelixDownLargeSeq6, kRightHalfBankedHelixDownLargeSeq7, kRightHalfBankedHelixDownLargeSeq8, kRightHalfBankedHelixDownLargeSeq9, kRightHalfBankedHelixDownLargeSeq10, kRightHalfBankedHelixDownLargeSeq11, kRightHalfBankedHelixDownLargeSeq12, kRightHalfBankedHelixDownLargeSeq13 } }, - /* TrackElemType::LeftQuarterTurn1TileUp60 */ { 1, { kLeftQuarterTurn1TileUp60Seq0 } }, - /* TrackElemType::RightQuarterTurn1TileUp60 */ { 1, { kRightQuarterTurn1TileUp60Seq0 } }, - /* TrackElemType::LeftQuarterTurn1TileDown60 */ { 1, { kLeftQuarterTurn1TileDown60Seq0 } }, - /* TrackElemType::RightQuarterTurn1TileDown60 */ { 1, { kRightQuarterTurn1TileDown60Seq0 } }, - /* TrackElemType::Brakes */ { 1, { kBrakesSeq0 } }, - /* TrackElemType::Booster */ { 1, { kBoosterSeq0 } }, - /* TrackElemType::Maze */ + /* TrackElemType::leftQuarterTurn1TileUp60 */ { 1, { kLeftQuarterTurn1TileUp60Seq0 } }, + /* TrackElemType::rightQuarterTurn1TileUp60 */ { 1, { kRightQuarterTurn1TileUp60Seq0 } }, + /* TrackElemType::leftQuarterTurn1TileDown60 */ { 1, { kLeftQuarterTurn1TileDown60Seq0 } }, + /* TrackElemType::rightQuarterTurn1TileDown60 */ { 1, { kRightQuarterTurn1TileDown60Seq0 } }, + /* TrackElemType::brakes */ { 1, { kBrakesSeq0 } }, + /* TrackElemType::booster */ { 1, { kBoosterSeq0 } }, + /* TrackElemType::maze */ { 1, { kMazeSeq0, kMazeSeq1, kMazeSeq2, kMazeSeq3, kMazeSeq4, kMazeSeq5, kMazeSeq6, kMazeSeq7, kMazeSeq8, kMazeSeq9, kMazeSeq10, kMazeSeq11, kMazeSeq12, kMazeSeq13, kMazeSeq14, kMazeSeq15 } }, - /* TrackElemType::LeftQuarterBankedHelixLargeUp */ + /* TrackElemType::leftQuarterBankedHelixLargeUp */ { 7, { kLeftQuarterBankedHelixLargeUpSeq0, kLeftQuarterBankedHelixLargeUpSeq1, kLeftQuarterBankedHelixLargeUpSeq2, kLeftQuarterBankedHelixLargeUpSeq3, kLeftQuarterBankedHelixLargeUpSeq4, kLeftQuarterBankedHelixLargeUpSeq5, kLeftQuarterBankedHelixLargeUpSeq6 } }, - /* TrackElemType::RightQuarterBankedHelixLargeUp */ + /* TrackElemType::rightQuarterBankedHelixLargeUp */ { 7, { kRightQuarterBankedHelixLargeUpSeq0, kRightQuarterBankedHelixLargeUpSeq1, kRightQuarterBankedHelixLargeUpSeq2, kRightQuarterBankedHelixLargeUpSeq3, kRightQuarterBankedHelixLargeUpSeq4, kRightQuarterBankedHelixLargeUpSeq5, kRightQuarterBankedHelixLargeUpSeq6 } }, - /* TrackElemType::LeftQuarterBankedHelixLargeDown */ + /* TrackElemType::leftQuarterBankedHelixLargeDown */ { 7, { kLeftQuarterBankedHelixLargeDownSeq0, kLeftQuarterBankedHelixLargeDownSeq1, kLeftQuarterBankedHelixLargeDownSeq2, kLeftQuarterBankedHelixLargeDownSeq3, kLeftQuarterBankedHelixLargeDownSeq4, kLeftQuarterBankedHelixLargeDownSeq5, kLeftQuarterBankedHelixLargeDownSeq6 } }, - /* TrackElemType::RightQuarterBankedHelixLargeDown */ + /* TrackElemType::rightQuarterBankedHelixLargeDown */ { 7, { kRightQuarterBankedHelixLargeDownSeq0, kRightQuarterBankedHelixLargeDownSeq1, kRightQuarterBankedHelixLargeDownSeq2, kRightQuarterBankedHelixLargeDownSeq3, kRightQuarterBankedHelixLargeDownSeq4, kRightQuarterBankedHelixLargeDownSeq5, kRightQuarterBankedHelixLargeDownSeq6 } }, - /* TrackElemType::LeftQuarterHelixLargeUp */ + /* TrackElemType::leftQuarterHelixLargeUp */ { 7, { kLeftQuarterHelixLargeUpSeq0, kLeftQuarterHelixLargeUpSeq1, kLeftQuarterHelixLargeUpSeq2, kLeftQuarterHelixLargeUpSeq3, kLeftQuarterHelixLargeUpSeq4, kLeftQuarterHelixLargeUpSeq5, kLeftQuarterHelixLargeUpSeq6 } }, - /* TrackElemType::RightQuarterHelixLargeUp */ + /* TrackElemType::rightQuarterHelixLargeUp */ { 7, { kRightQuarterHelixLargeUpSeq0, kRightQuarterHelixLargeUpSeq1, kRightQuarterHelixLargeUpSeq2, kRightQuarterHelixLargeUpSeq3, kRightQuarterHelixLargeUpSeq4, kRightQuarterHelixLargeUpSeq5, kRightQuarterHelixLargeUpSeq6 } }, - /* TrackElemType::LeftQuarterHelixLargeDown */ + /* TrackElemType::leftQuarterHelixLargeDown */ { 7, { kLeftQuarterHelixLargeDownSeq0, kLeftQuarterHelixLargeDownSeq1, kLeftQuarterHelixLargeDownSeq2, kLeftQuarterHelixLargeDownSeq3, kLeftQuarterHelixLargeDownSeq4, kLeftQuarterHelixLargeDownSeq5, kLeftQuarterHelixLargeDownSeq6 } }, - /* TrackElemType::RightQuarterHelixLargeDown */ + /* TrackElemType::rightQuarterHelixLargeDown */ { 7, { kRightQuarterHelixLargeDownSeq0, kRightQuarterHelixLargeDownSeq1, kRightQuarterHelixLargeDownSeq2, kRightQuarterHelixLargeDownSeq3, kRightQuarterHelixLargeDownSeq4, kRightQuarterHelixLargeDownSeq5, kRightQuarterHelixLargeDownSeq6 } }, - /* TrackElemType::Up25LeftBanked */ { 1, { kUp25LeftBankedSeq0 } }, - /* TrackElemType::Up25RightBanked */ { 1, { kUp25RightBankedSeq0 } }, - /* TrackElemType::Waterfall */ { 1, { kWaterfallSeq0 } }, - /* TrackElemType::Rapids */ { 1, { kRapidsSeq0 } }, - /* TrackElemType::OnRidePhoto */ { 1, { kOnRidePhotoSeq0 } }, - /* TrackElemType::Down25LeftBanked */ { 1, { kDown25LeftBankedSeq0 } }, - /* TrackElemType::Down25RightBanked */ { 1, { kDown25RightBankedSeq0 } }, - /* TrackElemType::Watersplash */ + /* TrackElemType::up25LeftBanked */ { 1, { kUp25LeftBankedSeq0 } }, + /* TrackElemType::up25RightBanked */ { 1, { kUp25RightBankedSeq0 } }, + /* TrackElemType::waterfall */ { 1, { kWaterfallSeq0 } }, + /* TrackElemType::rapids */ { 1, { kRapidsSeq0 } }, + /* TrackElemType::onRidePhoto */ { 1, { kOnRidePhotoSeq0 } }, + /* TrackElemType::down25LeftBanked */ { 1, { kDown25LeftBankedSeq0 } }, + /* TrackElemType::down25RightBanked */ { 1, { kDown25RightBankedSeq0 } }, + /* TrackElemType::watersplash */ { 5, { kWatersplashSeq0, kWatersplashSeq1, kWatersplashSeq2, kWatersplashSeq3, kWatersplashSeq4 } }, - /* TrackElemType::FlatToUp60LongBase */ + /* TrackElemType::flatToUp60LongBase */ { 4, { kFlatToUp60LongBaseSeq0, kFlatToUp60LongBaseSeq1, kFlatToUp60LongBaseSeq2, kFlatToUp60LongBaseSeq3 } }, - /* TrackElemType::Up60ToFlatLongBase */ + /* TrackElemType::up60ToFlatLongBase */ { 4, { kUp60ToFlatLongBaseSeq0, kUp60ToFlatLongBaseSeq1, kUp60ToFlatLongBaseSeq2, kUp60ToFlatLongBaseSeq3 } }, - /* TrackElemType::Whirlpool */ { 1, { kWhirlpoolSeq0 } }, - /* TrackElemType::Down60ToFlatLongBase */ + /* TrackElemType::whirlpool */ { 1, { kWhirlpoolSeq0 } }, + /* TrackElemType::down60ToFlatLongBase */ { 4, { kDown60ToFlatLongBaseSeq0, kDown60ToFlatLongBaseSeq1, kDown60ToFlatLongBaseSeq2, kDown60ToFlatLongBaseSeq3 } }, - /* TrackElemType::FlatToDown60LongBase */ + /* TrackElemType::flatToDown60LongBase */ { 4, { kFlatToDown60LongBaseSeq0, kFlatToDown60LongBaseSeq1, kFlatToDown60LongBaseSeq2, kFlatToDown60LongBaseSeq3 } }, - /* TrackElemType::CableLiftHill */ + /* TrackElemType::cableLiftHill */ { 4, { kCableLiftHillSeq0, kCableLiftHillSeq1, kCableLiftHillSeq2, kCableLiftHillSeq3 } }, - /* TrackElemType::ReverseFreefallSlope */ + /* TrackElemType::reverseFreefallSlope */ { 7, { kReverseFreefallSlopeSeq0, kReverseFreefallSlopeSeq1, kReverseFreefallSlopeSeq2, kReverseFreefallSlopeSeq3, kReverseFreefallSlopeSeq4, kReverseFreefallSlopeSeq5, kReverseFreefallSlopeSeq6 } }, - /* TrackElemType::ReverseFreefallVertical */ { 2, { kReverseFreefallVerticalSeq0, kReverseFreefallVerticalSeq1 } }, - /* TrackElemType::Up90 */ { 2, { kUp90Seq0, kUp90Seq1 } }, - /* TrackElemType::Down90 */ { 2, { kDown90Seq0, kDown90Seq1 } }, - /* TrackElemType::Up60ToUp90 */ { 2, { kUp60ToUp90Seq0, kUp60ToUp90Seq1 } }, - /* TrackElemType::Down90ToDown60 */ { 1, { kDown90ToDown60Seq0 } }, - /* TrackElemType::Up90ToUp60 */ { 1, { kUp90ToUp60Seq0 } }, - /* TrackElemType::Down60ToDown90 */ { 2, { kDown60ToDown90Seq0, kDown60ToDown90Seq1 } }, - /* TrackElemType::BrakeForDrop */ { 1, { kBrakeForDropSeq0 } }, - /* TrackElemType::LeftEighthToDiag */ + /* TrackElemType::reverseFreefallVertical */ { 2, { kReverseFreefallVerticalSeq0, kReverseFreefallVerticalSeq1 } }, + /* TrackElemType::up90 */ { 2, { kUp90Seq0, kUp90Seq1 } }, + /* TrackElemType::down90 */ { 2, { kDown90Seq0, kDown90Seq1 } }, + /* TrackElemType::up60ToUp90 */ { 2, { kUp60ToUp90Seq0, kUp60ToUp90Seq1 } }, + /* TrackElemType::down90ToDown60 */ { 1, { kDown90ToDown60Seq0 } }, + /* TrackElemType::up90ToUp60 */ { 1, { kUp90ToUp60Seq0 } }, + /* TrackElemType::down60ToDown90 */ { 2, { kDown60ToDown90Seq0, kDown60ToDown90Seq1 } }, + /* TrackElemType::brakeForDrop */ { 1, { kBrakeForDropSeq0 } }, + /* TrackElemType::leftEighthToDiag */ { 5, { kLeftEighthToDiagSeq0, kLeftEighthToDiagSeq1, kLeftEighthToDiagSeq2, kLeftEighthToDiagSeq3, kLeftEighthToDiagSeq4 } }, - /* TrackElemType::RightEighthToDiag */ + /* TrackElemType::rightEighthToDiag */ { 5, { kRightEighthToDiagSeq0, kRightEighthToDiagSeq1, kRightEighthToDiagSeq2, kRightEighthToDiagSeq3, kRightEighthToDiagSeq4 } }, - /* TrackElemType::LeftEighthToOrthogonal */ + /* TrackElemType::leftEighthToOrthogonal */ { 5, { kLeftEighthToOrthogonalSeq0, kLeftEighthToOrthogonalSeq1, kLeftEighthToOrthogonalSeq2, kLeftEighthToOrthogonalSeq3, kLeftEighthToOrthogonalSeq4 } }, - /* TrackElemType::RightEighthToOrthogonal */ + /* TrackElemType::rightEighthToOrthogonal */ { 5, { kRightEighthToOrthogonalSeq0, kRightEighthToOrthogonalSeq1, kRightEighthToOrthogonalSeq2, kRightEighthToOrthogonalSeq3, kRightEighthToOrthogonalSeq4 } }, - /* TrackElemType::LeftEighthBankToDiag */ + /* TrackElemType::leftEighthBankToDiag */ { 5, { kLeftEighthBankToDiagSeq0, kLeftEighthBankToDiagSeq1, kLeftEighthBankToDiagSeq2, kLeftEighthBankToDiagSeq3, kLeftEighthBankToDiagSeq4 } }, - /* TrackElemType::RightEighthBankToDiag */ + /* TrackElemType::rightEighthBankToDiag */ { 5, { kRightEighthBankToDiagSeq0, kRightEighthBankToDiagSeq1, kRightEighthBankToDiagSeq2, kRightEighthBankToDiagSeq3, kRightEighthBankToDiagSeq4 } }, - /* TrackElemType::LeftEighthBankToOrthogonal */ + /* TrackElemType::leftEighthBankToOrthogonal */ { 5, { kLeftEighthBankToOrthogonalSeq0, kLeftEighthBankToOrthogonalSeq1, kLeftEighthBankToOrthogonalSeq2, kLeftEighthBankToOrthogonalSeq3, kLeftEighthBankToOrthogonalSeq4 } }, - /* TrackElemType::RightEighthBankToOrthogonal */ + /* TrackElemType::rightEighthBankToOrthogonal */ { 5, { kRightEighthBankToOrthogonalSeq0, kRightEighthBankToOrthogonalSeq1, kRightEighthBankToOrthogonalSeq2, kRightEighthBankToOrthogonalSeq3, kRightEighthBankToOrthogonalSeq4 } }, - /* TrackElemType::DiagFlat */ { 4, { kDiagFlatSeq0, kDiagFlatSeq1, kDiagFlatSeq2, kDiagFlatSeq3 } }, - /* TrackElemType::DiagUp25 */ { 4, { kDiagUp25Seq0, kDiagUp25Seq1, kDiagUp25Seq2, kDiagUp25Seq3 } }, - /* TrackElemType::DiagUp60 */ { 4, { kDiagUp60Seq0, kDiagUp60Seq1, kDiagUp60Seq2, kDiagUp60Seq3 } }, - /* TrackElemType::DiagFlatToUp25 */ + /* TrackElemType::diagFlat */ { 4, { kDiagFlatSeq0, kDiagFlatSeq1, kDiagFlatSeq2, kDiagFlatSeq3 } }, + /* TrackElemType::diagUp25 */ { 4, { kDiagUp25Seq0, kDiagUp25Seq1, kDiagUp25Seq2, kDiagUp25Seq3 } }, + /* TrackElemType::diagUp60 */ { 4, { kDiagUp60Seq0, kDiagUp60Seq1, kDiagUp60Seq2, kDiagUp60Seq3 } }, + /* TrackElemType::diagFlatToUp25 */ { 4, { kDiagFlatToUp25Seq0, kDiagFlatToUp25Seq1, kDiagFlatToUp25Seq2, kDiagFlatToUp25Seq3 } }, - /* TrackElemType::DiagUp25ToUp60 */ + /* TrackElemType::diagUp25ToUp60 */ { 4, { kDiagUp25ToUp60Seq0, kDiagUp25ToUp60Seq1, kDiagUp25ToUp60Seq2, kDiagUp25ToUp60Seq3 } }, - /* TrackElemType::DiagUp60ToUp25 */ + /* TrackElemType::diagUp60ToUp25 */ { 4, { kDiagUp60ToUp25Seq0, kDiagUp60ToUp25Seq1, kDiagUp60ToUp25Seq2, kDiagUp60ToUp25Seq3 } }, - /* TrackElemType::DiagUp25ToFlat */ + /* TrackElemType::diagUp25ToFlat */ { 4, { kDiagUp25ToFlatSeq0, kDiagUp25ToFlatSeq1, kDiagUp25ToFlatSeq2, kDiagUp25ToFlatSeq3 } }, - /* TrackElemType::DiagDown25 */ { 4, { kDiagDown25Seq0, kDiagDown25Seq1, kDiagDown25Seq2, kDiagDown25Seq3 } }, - /* TrackElemType::DiagDown60 */ { 4, { kDiagDown60Seq0, kDiagDown60Seq1, kDiagDown60Seq2, kDiagDown60Seq3 } }, - /* TrackElemType::DiagFlatToDown25 */ + /* TrackElemType::diagDown25 */ { 4, { kDiagDown25Seq0, kDiagDown25Seq1, kDiagDown25Seq2, kDiagDown25Seq3 } }, + /* TrackElemType::diagDown60 */ { 4, { kDiagDown60Seq0, kDiagDown60Seq1, kDiagDown60Seq2, kDiagDown60Seq3 } }, + /* TrackElemType::diagFlatToDown25 */ { 4, { kDiagFlatToDown25Seq0, kDiagFlatToDown25Seq1, kDiagFlatToDown25Seq2, kDiagFlatToDown25Seq3 } }, - /* TrackElemType::DiagDown25ToDown60 */ + /* TrackElemType::diagDown25ToDown60 */ { 4, { kDiagDown25ToDown60Seq0, kDiagDown25ToDown60Seq1, kDiagDown25ToDown60Seq2, kDiagDown25ToDown60Seq3 } }, - /* TrackElemType::DiagDown60ToDown25 */ + /* TrackElemType::diagDown60ToDown25 */ { 4, { kDiagDown60ToDown25Seq0, kDiagDown60ToDown25Seq1, kDiagDown60ToDown25Seq2, kDiagDown60ToDown25Seq3 } }, - /* TrackElemType::DiagDown25ToFlat */ + /* TrackElemType::diagDown25ToFlat */ { 4, { kDiagDown25ToFlatSeq0, kDiagDown25ToFlatSeq1, kDiagDown25ToFlatSeq2, kDiagDown25ToFlatSeq3 } }, - /* TrackElemType::DiagFlatToUp60 */ + /* TrackElemType::diagFlatToUp60 */ { 4, { kDiagFlatToUp60Seq0, kDiagFlatToUp60Seq1, kDiagFlatToUp60Seq2, kDiagFlatToUp60Seq3 } }, - /* TrackElemType::DiagUp60ToFlat */ + /* TrackElemType::diagUp60ToFlat */ { 4, { kDiagUp60ToFlatSeq0, kDiagUp60ToFlatSeq1, kDiagUp60ToFlatSeq2, kDiagUp60ToFlatSeq3 } }, - /* TrackElemType::DiagFlatToDown60 */ + /* TrackElemType::diagFlatToDown60 */ { 4, { kDiagFlatToDown60Seq0, kDiagFlatToDown60Seq1, kDiagFlatToDown60Seq2, kDiagFlatToDown60Seq3 } }, - /* TrackElemType::DiagDown60ToFlat */ + /* TrackElemType::diagDown60ToFlat */ { 4, { kDiagDown60ToFlatSeq0, kDiagDown60ToFlatSeq1, kDiagDown60ToFlatSeq2, kDiagDown60ToFlatSeq3 } }, - /* TrackElemType::DiagFlatToLeftBank */ + /* TrackElemType::diagFlatToLeftBank */ { 4, { kDiagFlatToLeftBankSeq0, kDiagFlatToLeftBankSeq1, kDiagFlatToLeftBankSeq2, kDiagFlatToLeftBankSeq3 } }, - /* TrackElemType::DiagFlatToRightBank */ + /* TrackElemType::diagFlatToRightBank */ { 4, { kDiagFlatToRightBankSeq0, kDiagFlatToRightBankSeq1, kDiagFlatToRightBankSeq2, kDiagFlatToRightBankSeq3 } }, - /* TrackElemType::DiagLeftBankToFlat */ + /* TrackElemType::diagLeftBankToFlat */ { 4, { kDiagLeftBankToFlatSeq0, kDiagLeftBankToFlatSeq1, kDiagLeftBankToFlatSeq2, kDiagLeftBankToFlatSeq3 } }, - /* TrackElemType::DiagRightBankToFlat */ + /* TrackElemType::diagRightBankToFlat */ { 4, { kDiagRightBankToFlatSeq0, kDiagRightBankToFlatSeq1, kDiagRightBankToFlatSeq2, kDiagRightBankToFlatSeq3 } }, - /* TrackElemType::DiagLeftBankToUp25 */ + /* TrackElemType::diagLeftBankToUp25 */ { 4, { kDiagLeftBankToUp25Seq0, kDiagLeftBankToUp25Seq1, kDiagLeftBankToUp25Seq2, kDiagLeftBankToUp25Seq3 } }, - /* TrackElemType::DiagRightBankToUp25 */ + /* TrackElemType::diagRightBankToUp25 */ { 4, { kDiagRightBankToUp25Seq0, kDiagRightBankToUp25Seq1, kDiagRightBankToUp25Seq2, kDiagRightBankToUp25Seq3 } }, - /* TrackElemType::DiagUp25ToLeftBank */ + /* TrackElemType::diagUp25ToLeftBank */ { 4, { kDiagUp25ToLeftBankSeq0, kDiagUp25ToLeftBankSeq1, kDiagUp25ToLeftBankSeq2, kDiagUp25ToLeftBankSeq3 } }, - /* TrackElemType::DiagUp25ToRightBank */ + /* TrackElemType::diagUp25ToRightBank */ { 4, { kDiagUp25ToRightBankSeq0, kDiagUp25ToRightBankSeq1, kDiagUp25ToRightBankSeq2, kDiagUp25ToRightBankSeq3 } }, - /* TrackElemType::DiagLeftBankToDown25 */ + /* TrackElemType::diagLeftBankToDown25 */ { 4, { kDiagLeftBankToDown25Seq0, kDiagLeftBankToDown25Seq1, kDiagLeftBankToDown25Seq2, kDiagLeftBankToDown25Seq3 } }, - /* TrackElemType::DiagRightBankToDown25 */ + /* TrackElemType::diagRightBankToDown25 */ { 4, { kDiagRightBankToDown25Seq0, kDiagRightBankToDown25Seq1, kDiagRightBankToDown25Seq2, kDiagRightBankToDown25Seq3 } }, - /* TrackElemType::DiagDown25ToLeftBank */ + /* TrackElemType::diagDown25ToLeftBank */ { 4, { kDiagDown25ToLeftBankSeq0, kDiagDown25ToLeftBankSeq1, kDiagDown25ToLeftBankSeq2, kDiagDown25ToLeftBankSeq3 } }, - /* TrackElemType::DiagDown25ToRightBank */ + /* TrackElemType::diagDown25ToRightBank */ { 4, { kDiagDown25ToRightBankSeq0, kDiagDown25ToRightBankSeq1, kDiagDown25ToRightBankSeq2, kDiagDown25ToRightBankSeq3 } }, - /* TrackElemType::DiagLeftBank */ { 4, { kDiagLeftBankSeq0, kDiagLeftBankSeq1, kDiagLeftBankSeq2, kDiagLeftBankSeq3 } }, - /* TrackElemType::DiagRightBank */ + /* TrackElemType::diagLeftBank */ { 4, { kDiagLeftBankSeq0, kDiagLeftBankSeq1, kDiagLeftBankSeq2, kDiagLeftBankSeq3 } }, + /* TrackElemType::diagRightBank */ { 4, { kDiagRightBankSeq0, kDiagRightBankSeq1, kDiagRightBankSeq2, kDiagRightBankSeq3 } }, - /* TrackElemType::LogFlumeReverser */ { 1, { kLogFlumeReverserSeq0 } }, - /* TrackElemType::SpinningTunnel */ { 1, { kSpinningTunnelSeq0 } }, - /* TrackElemType::LeftBarrelRollUpToDown */ + /* TrackElemType::logFlumeReverser */ { 1, { kLogFlumeReverserSeq0 } }, + /* TrackElemType::spinningTunnel */ { 1, { kSpinningTunnelSeq0 } }, + /* TrackElemType::leftBarrelRollUpToDown */ { 3, { kLeftBarrelRollUpToDownSeq0, kLeftBarrelRollUpToDownSeq1, kLeftBarrelRollUpToDownSeq2 } }, - /* TrackElemType::RightBarrelRollUpToDown */ + /* TrackElemType::rightBarrelRollUpToDown */ { 3, { kRightBarrelRollUpToDownSeq0, kRightBarrelRollUpToDownSeq1, kRightBarrelRollUpToDownSeq2 } }, - /* TrackElemType::LeftBarrelRollDownToUp */ + /* TrackElemType::leftBarrelRollDownToUp */ { 3, { kLeftBarrelRollDownToUpSeq0, kLeftBarrelRollDownToUpSeq1, kLeftBarrelRollDownToUpSeq2 } }, - /* TrackElemType::RightBarrelRollDownToUp */ + /* TrackElemType::rightBarrelRollDownToUp */ { 3, { kRightBarrelRollDownToUpSeq0, kRightBarrelRollDownToUpSeq1, kRightBarrelRollDownToUpSeq2 } }, - /* TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25 */ + /* TrackElemType::leftBankToLeftQuarterTurn3TilesUp25 */ { 4, { kLeftBankToLeftQuarterTurn3TilesUp25Seq0, kLeftBankToLeftQuarterTurn3TilesUp25Seq1, kLeftBankToLeftQuarterTurn3TilesUp25Seq2, kLeftBankToLeftQuarterTurn3TilesUp25Seq3 } }, - /* TrackElemType::RightBankToRightQuarterTurn3TilesUp25 */ + /* TrackElemType::rightBankToRightQuarterTurn3TilesUp25 */ { 4, { kRightBankToRightQuarterTurn3TilesUp25Seq0, kRightBankToRightQuarterTurn3TilesUp25Seq1, kRightBankToRightQuarterTurn3TilesUp25Seq2, kRightBankToRightQuarterTurn3TilesUp25Seq3 } }, - /* TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank */ + /* TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank */ { 4, { kLeftQuarterTurn3TilesDown25ToLeftBankSeq0, kLeftQuarterTurn3TilesDown25ToLeftBankSeq1, kLeftQuarterTurn3TilesDown25ToLeftBankSeq2, kLeftQuarterTurn3TilesDown25ToLeftBankSeq3 } }, - /* TrackElemType::RightQuarterTurn3TilesDown25ToRightBank */ + /* TrackElemType::rightQuarterTurn3TilesDown25ToRightBank */ { 4, { kRightQuarterTurn3TilesDown25ToRightBankSeq0, kRightQuarterTurn3TilesDown25ToRightBankSeq1, kRightQuarterTurn3TilesDown25ToRightBankSeq2, kRightQuarterTurn3TilesDown25ToRightBankSeq3 } }, - /* TrackElemType::PoweredLift */ { 1, { kPoweredLiftSeq0 } }, - /* TrackElemType::LeftLargeHalfLoopUp */ + /* TrackElemType::poweredLift */ { 1, { kPoweredLiftSeq0 } }, + /* TrackElemType::leftLargeHalfLoopUp */ { 7, { kLeftLargeHalfLoopUpSeq0, kLeftLargeHalfLoopUpSeq1, kLeftLargeHalfLoopUpSeq2, kLeftLargeHalfLoopUpSeq3, kLeftLargeHalfLoopUpSeq4, kLeftLargeHalfLoopUpSeq5, kLeftLargeHalfLoopUpSeq6 } }, - /* TrackElemType::RightLargeHalfLoopUp */ + /* TrackElemType::rightLargeHalfLoopUp */ { 7, { kRightLargeHalfLoopUpSeq0, kRightLargeHalfLoopUpSeq1, kRightLargeHalfLoopUpSeq2, kRightLargeHalfLoopUpSeq3, kRightLargeHalfLoopUpSeq4, kRightLargeHalfLoopUpSeq5, kRightLargeHalfLoopUpSeq6 } }, - /* TrackElemType::LeftLargeHalfLoopDown */ + /* TrackElemType::leftLargeHalfLoopDown */ { 7, { kLeftLargeHalfLoopDownSeq0, kLeftLargeHalfLoopDownSeq1, kLeftLargeHalfLoopDownSeq2, kLeftLargeHalfLoopDownSeq3, kLeftLargeHalfLoopDownSeq4, kLeftLargeHalfLoopDownSeq5, kLeftLargeHalfLoopDownSeq6 } }, - /* TrackElemType::RightLargeHalfLoopDown */ + /* TrackElemType::rightLargeHalfLoopDown */ { 7, { kRightLargeHalfLoopDownSeq0, kRightLargeHalfLoopDownSeq1, kRightLargeHalfLoopDownSeq2, kRightLargeHalfLoopDownSeq3, kRightLargeHalfLoopDownSeq4, kRightLargeHalfLoopDownSeq5, kRightLargeHalfLoopDownSeq6 } }, - /* TrackElemType::LeftFlyerTwistUp */ { 3, { kLeftFlyerTwistUpSeq0, kLeftFlyerTwistUpSeq1, kLeftFlyerTwistUpSeq2 } }, - /* TrackElemType::RightFlyerTwistUp */ + /* TrackElemType::leftFlyerTwistUp */ { 3, { kLeftFlyerTwistUpSeq0, kLeftFlyerTwistUpSeq1, kLeftFlyerTwistUpSeq2 } }, + /* TrackElemType::rightFlyerTwistUp */ { 3, { kRightFlyerTwistUpSeq0, kRightFlyerTwistUpSeq1, kRightFlyerTwistUpSeq2 } }, - /* TrackElemType::LeftFlyerTwistDown */ + /* TrackElemType::leftFlyerTwistDown */ { 3, { kLeftFlyerTwistDownSeq0, kLeftFlyerTwistDownSeq1, kLeftFlyerTwistDownSeq2 } }, - /* TrackElemType::RightFlyerTwistDown */ + /* TrackElemType::rightFlyerTwistDown */ { 3, { kRightFlyerTwistDownSeq0, kRightFlyerTwistDownSeq1, kRightFlyerTwistDownSeq2 } }, - /* TrackElemType::FlyerHalfLoopUninvertedUp */ + /* TrackElemType::flyerHalfLoopUninvertedUp */ { 4, { kFlyerHalfLoopUninvertedUpSeq0, kFlyerHalfLoopUninvertedUpSeq1, kFlyerHalfLoopUninvertedUpSeq2, kFlyerHalfLoopUninvertedUpSeq3 } }, - /* TrackElemType::FlyerHalfLoopInvertedDown */ + /* TrackElemType::flyerHalfLoopInvertedDown */ { 4, { kFlyerHalfLoopInvertedDownSeq0, kFlyerHalfLoopInvertedDownSeq1, kFlyerHalfLoopInvertedDownSeq2, kFlyerHalfLoopInvertedDownSeq3 } }, - /* TrackElemType::LeftFlyerCorkscrewUp */ + /* TrackElemType::leftFlyerCorkscrewUp */ { 3, { kLeftFlyerCorkscrewUpSeq0, kLeftFlyerCorkscrewUpSeq1, kLeftFlyerCorkscrewUpSeq2 } }, - /* TrackElemType::RightFlyerCorkscrewUp */ + /* TrackElemType::rightFlyerCorkscrewUp */ { 3, { kRightFlyerCorkscrewUpSeq0, kRightFlyerCorkscrewUpSeq1, kRightFlyerCorkscrewUpSeq2 } }, - /* TrackElemType::LeftFlyerCorkscrewDown */ + /* TrackElemType::leftFlyerCorkscrewDown */ { 3, { kLeftFlyerCorkscrewDownSeq0, kLeftFlyerCorkscrewDownSeq1, kLeftFlyerCorkscrewDownSeq2 } }, - /* TrackElemType::RightFlyerCorkscrewDown */ + /* TrackElemType::rightFlyerCorkscrewDown */ { 3, { kRightFlyerCorkscrewDownSeq0, kRightFlyerCorkscrewDownSeq1, kRightFlyerCorkscrewDownSeq2 } }, - /* TrackElemType::HeartLineTransferUp */ + /* TrackElemType::heartLineTransferUp */ { 4, { kHeartLineTransferUpSeq0, kHeartLineTransferUpSeq1, kHeartLineTransferUpSeq2, kHeartLineTransferUpSeq3 } }, - /* TrackElemType::HeartLineTransferDown */ + /* TrackElemType::heartLineTransferDown */ { 4, { kHeartLineTransferDownSeq0, kHeartLineTransferDownSeq1, kHeartLineTransferDownSeq2, kHeartLineTransferDownSeq3 } }, - /* TrackElemType::LeftHeartLineRoll */ + /* TrackElemType::leftHeartLineRoll */ { 6, { kLeftHeartLineRollSeq0, kLeftHeartLineRollSeq1, kLeftHeartLineRollSeq2, kLeftHeartLineRollSeq3, kLeftHeartLineRollSeq4, kLeftHeartLineRollSeq5 } }, - /* TrackElemType::RightHeartLineRoll */ + /* TrackElemType::rightHeartLineRoll */ { 6, { kRightHeartLineRollSeq0, kRightHeartLineRollSeq1, kRightHeartLineRollSeq2, kRightHeartLineRollSeq3, kRightHeartLineRollSeq4, kRightHeartLineRollSeq5 } }, - /* TrackElemType::MinigolfHoleA */ { 2, { kMinigolfHoleASeq0, kMinigolfHoleASeq1 } }, - /* TrackElemType::MinigolfHoleB */ { 2, { kMinigolfHoleBSeq0, kMinigolfHoleBSeq1 } }, - /* TrackElemType::MinigolfHoleC */ { 2, { kMinigolfHoleCSeq0, kMinigolfHoleCSeq1 } }, - /* TrackElemType::MinigolfHoleD */ { 3, { kMinigolfHoleDSeq0, kMinigolfHoleDSeq1, kMinigolfHoleDSeq2 } }, - /* TrackElemType::MinigolfHoleE */ { 3, { kMinigolfHoleESeq0, kMinigolfHoleESeq1, kMinigolfHoleESeq2 } }, - /* TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop */ + /* TrackElemType::minigolfHoleA */ { 2, { kMinigolfHoleASeq0, kMinigolfHoleASeq1 } }, + /* TrackElemType::minigolfHoleB */ { 2, { kMinigolfHoleBSeq0, kMinigolfHoleBSeq1 } }, + /* TrackElemType::minigolfHoleC */ { 2, { kMinigolfHoleCSeq0, kMinigolfHoleCSeq1 } }, + /* TrackElemType::minigolfHoleD */ { 3, { kMinigolfHoleDSeq0, kMinigolfHoleDSeq1, kMinigolfHoleDSeq2 } }, + /* TrackElemType::minigolfHoleE */ { 3, { kMinigolfHoleESeq0, kMinigolfHoleESeq1, kMinigolfHoleESeq2 } }, + /* TrackElemType::multiDimInvertedFlatToDown90QuarterLoop */ { 4, { kMultiDimInvertedFlatToDown90QuarterLoopSeq0, kMultiDimInvertedFlatToDown90QuarterLoopSeq1, kMultiDimInvertedFlatToDown90QuarterLoopSeq2, kMultiDimInvertedFlatToDown90QuarterLoopSeq3 } }, - /* TrackElemType::Up90ToInvertedFlatQuarterLoop */ + /* TrackElemType::up90ToInvertedFlatQuarterLoop */ { 3, { kUp90ToInvertedFlatQuarterLoopSeq0, kUp90ToInvertedFlatQuarterLoopSeq1, kUp90ToInvertedFlatQuarterLoopSeq2 } }, - /* TrackElemType::InvertedFlatToDown90QuarterLoop */ + /* TrackElemType::invertedFlatToDown90QuarterLoop */ { 4, { kInvertedFlatToDown90QuarterLoopSeq0, kInvertedFlatToDown90QuarterLoopSeq1, kInvertedFlatToDown90QuarterLoopSeq2, kInvertedFlatToDown90QuarterLoopSeq3 } }, - /* TrackElemType::LeftCurvedLiftHill */ + /* TrackElemType::leftCurvedLiftHill */ { 4, { kLeftCurvedLiftHillSeq0, kLeftCurvedLiftHillSeq1, kLeftCurvedLiftHillSeq2, kLeftCurvedLiftHillSeq3 } }, - /* TrackElemType::RightCurvedLiftHill */ + /* TrackElemType::rightCurvedLiftHill */ { 4, { kRightCurvedLiftHillSeq0, kRightCurvedLiftHillSeq1, kRightCurvedLiftHillSeq2, kRightCurvedLiftHillSeq3 } }, - /* TrackElemType::LeftReverser */ + /* TrackElemType::leftReverser */ { 6, { kLeftReverserSeq0, kLeftReverserSeq1, kLeftReverserSeq2, kLeftReverserSeq3, kLeftReverserSeq4, kLeftReverserSeq5 } }, - /* TrackElemType::RightReverser */ + /* TrackElemType::rightReverser */ { 6, { kRightReverserSeq0, kRightReverserSeq1, kRightReverserSeq2, kRightReverserSeq3, kRightReverserSeq4, kRightReverserSeq5 } }, - /* TrackElemType::AirThrustTopCap */ + /* TrackElemType::airThrustTopCap */ { 4, { kAirThrustTopCapSeq0, kAirThrustTopCapSeq1, kAirThrustTopCapSeq2, kAirThrustTopCapSeq3 } }, - /* TrackElemType::AirThrustVerticalDown */ { 2, { kAirThrustVerticalDownSeq0, kAirThrustVerticalDownSeq1 } }, - /* TrackElemType::AirThrustVerticalDownToLevel */ + /* TrackElemType::airThrustVerticalDown */ { 2, { kAirThrustVerticalDownSeq0, kAirThrustVerticalDownSeq1 } }, + /* TrackElemType::airThrustVerticalDownToLevel */ { 7, { kAirThrustVerticalDownToLevelSeq0, kAirThrustVerticalDownToLevelSeq1, kAirThrustVerticalDownToLevelSeq2, kAirThrustVerticalDownToLevelSeq3, kAirThrustVerticalDownToLevelSeq4, kAirThrustVerticalDownToLevelSeq5, kAirThrustVerticalDownToLevelSeq6 } }, - /* TrackElemType::BlockBrakes */ { 1, { kBlockBrakesSeq0 } }, - /* TrackElemType::LeftBankedQuarterTurn3TileUp25 */ + /* TrackElemType::blockBrakes */ { 1, { kBlockBrakesSeq0 } }, + /* TrackElemType::leftBankedQuarterTurn3TileUp25 */ { 4, { kLeftBankedQuarterTurn3TileUp25Seq0, kLeftBankedQuarterTurn3TileUp25Seq1, kLeftBankedQuarterTurn3TileUp25Seq2, kLeftBankedQuarterTurn3TileUp25Seq3 } }, - /* TrackElemType::RightBankedQuarterTurn3TileUp25 */ + /* TrackElemType::rightBankedQuarterTurn3TileUp25 */ { 4, { kRightBankedQuarterTurn3TileUp25Seq0, kRightBankedQuarterTurn3TileUp25Seq1, kRightBankedQuarterTurn3TileUp25Seq2, kRightBankedQuarterTurn3TileUp25Seq3 } }, - /* TrackElemType::LeftBankedQuarterTurn3TileDown25 */ + /* TrackElemType::leftBankedQuarterTurn3TileDown25 */ { 4, { kLeftBankedQuarterTurn3TileDown25Seq0, kLeftBankedQuarterTurn3TileDown25Seq1, kLeftBankedQuarterTurn3TileDown25Seq2, kLeftBankedQuarterTurn3TileDown25Seq3 } }, - /* TrackElemType::RightBankedQuarterTurn3TileDown25 */ + /* TrackElemType::rightBankedQuarterTurn3TileDown25 */ { 4, { kRightBankedQuarterTurn3TileDown25Seq0, kRightBankedQuarterTurn3TileDown25Seq1, kRightBankedQuarterTurn3TileDown25Seq2, kRightBankedQuarterTurn3TileDown25Seq3 } }, - /* TrackElemType::LeftBankedQuarterTurn5TileUp25 */ + /* TrackElemType::leftBankedQuarterTurn5TileUp25 */ { 7, { kLeftBankedQuarterTurn5TileUp25Seq0, kLeftBankedQuarterTurn5TileUp25Seq1, kLeftBankedQuarterTurn5TileUp25Seq2, kLeftBankedQuarterTurn5TileUp25Seq3, kLeftBankedQuarterTurn5TileUp25Seq4, kLeftBankedQuarterTurn5TileUp25Seq5, kLeftBankedQuarterTurn5TileUp25Seq6, kLeftBankedQuarterTurn5TileUp25Seq7 } }, - /* TrackElemType::RightBankedQuarterTurn5TileUp25 */ + /* TrackElemType::rightBankedQuarterTurn5TileUp25 */ { 7, { kRightBankedQuarterTurn5TileUp25Seq0, kRightBankedQuarterTurn5TileUp25Seq1, kRightBankedQuarterTurn5TileUp25Seq2, kRightBankedQuarterTurn5TileUp25Seq3, kRightBankedQuarterTurn5TileUp25Seq4, kRightBankedQuarterTurn5TileUp25Seq5, kRightBankedQuarterTurn5TileUp25Seq6, kRightBankedQuarterTurn5TileUp25Seq7 } }, - /* TrackElemType::LeftBankedQuarterTurn5TileDown25 */ + /* TrackElemType::leftBankedQuarterTurn5TileDown25 */ { 7, { kLeftBankedQuarterTurn5TileDown25Seq0, kLeftBankedQuarterTurn5TileDown25Seq1, kLeftBankedQuarterTurn5TileDown25Seq2, kLeftBankedQuarterTurn5TileDown25Seq3, kLeftBankedQuarterTurn5TileDown25Seq4, kLeftBankedQuarterTurn5TileDown25Seq5, kLeftBankedQuarterTurn5TileDown25Seq6, kLeftBankedQuarterTurn5TileDown25Seq7 } }, - /* TrackElemType::RightBankedQuarterTurn5TileDown25 */ + /* TrackElemType::rightBankedQuarterTurn5TileDown25 */ { 7, { kRightBankedQuarterTurn5TileDown25Seq0, kRightBankedQuarterTurn5TileDown25Seq1, kRightBankedQuarterTurn5TileDown25Seq2, kRightBankedQuarterTurn5TileDown25Seq3, kRightBankedQuarterTurn5TileDown25Seq4, kRightBankedQuarterTurn5TileDown25Seq5, kRightBankedQuarterTurn5TileDown25Seq6, kRightBankedQuarterTurn5TileDown25Seq7 } }, - /* TrackElemType::Up25ToLeftBankedUp25 */ { 1, { kUp25ToLeftBankedUp25Seq0 } }, - /* TrackElemType::Up25ToRightBankedUp25 */ { 1, { kUp25ToRightBankedUp25Seq0 } }, - /* TrackElemType::LeftBankedUp25ToUp25 */ { 1, { kLeftBankedUp25ToUp25Seq0 } }, - /* TrackElemType::RightBankedUp25ToUp25 */ { 1, { kRightBankedUp25ToUp25Seq0 } }, - /* TrackElemType::Down25ToLeftBankedDown25 */ { 1, { kDown25ToLeftBankedDown25Seq0 } }, - /* TrackElemType::Down25ToRightBankedDown25 */ { 1, { kDown25ToRightBankedDown25Seq0 } }, - /* TrackElemType::LeftBankedDown25ToDown25 */ { 1, { kLeftBankedDown25ToDown25Seq0 } }, - /* TrackElemType::RightBankedDown25ToDown25 */ { 1, { kRightBankedDown25ToDown25Seq0 } }, - /* TrackElemType::LeftBankedFlatToLeftBankedUp25 */ { 1, { kLeftBankedFlatToLeftBankedUp25Seq0 } }, - /* TrackElemType::RightBankedFlatToRightBankedUp25 */ { 1, { kRightBankedFlatToRightBankedUp25Seq0 } }, - /* TrackElemType::LeftBankedUp25ToLeftBankedFlat */ { 1, { kLeftBankedUp25ToLeftBankedFlatSeq0 } }, - /* TrackElemType::RightBankedUp25ToRightBankedFlat */ { 1, { kRightBankedUp25ToRightBankedFlatSeq0 } }, - /* TrackElemType::LeftBankedFlatToLeftBankedDown25 */ { 1, { kLeftBankedFlatToLeftBankedDown25Seq0 } }, - /* TrackElemType::RightBankedFlatToRightBankedDown25 */ { 1, { kRightBankedFlatToRightBankedDown25Seq0 } }, - /* TrackElemType::LeftBankedDown25ToLeftBankedFlat */ { 1, { kLeftBankedDown25ToLeftBankedFlatSeq0 } }, - /* TrackElemType::RightBankedDown25ToRightBankedFlat */ { 1, { kRightBankedDown25ToRightBankedFlatSeq0 } }, - /* TrackElemType::FlatToLeftBankedUp25 */ { 1, { kFlatToLeftBankedUp25Seq0 } }, - /* TrackElemType::FlatToRightBankedUp25 */ { 1, { kFlatToRightBankedUp25Seq0 } }, - /* TrackElemType::LeftBankedUp25ToFlat */ { 1, { kLeftBankedUp25ToFlatSeq0 } }, - /* TrackElemType::RightBankedUp25ToFlat */ { 1, { kRightBankedUp25ToFlatSeq0 } }, - /* TrackElemType::FlatToLeftBankedDown25 */ { 1, { kFlatToLeftBankedDown25Seq0 } }, - /* TrackElemType::FlatToRightBankedDown25 */ { 1, { kFlatToRightBankedDown25Seq0 } }, - /* TrackElemType::LeftBankedDown25ToFlat */ { 1, { kLeftBankedDown25ToFlatSeq0 } }, - /* TrackElemType::RightBankedDown25ToFlat */ { 1, { kRightBankedDown25ToFlatSeq0 } }, - /* TrackElemType::LeftQuarterTurn1TileUp90 */ { 2, { kLeftQuarterTurn1TileUp90Seq0, kLeftQuarterTurn1TileUp90Seq1 } }, - /* TrackElemType::RightQuarterTurn1TileUp90 */ + /* TrackElemType::up25ToLeftBankedUp25 */ { 1, { kUp25ToLeftBankedUp25Seq0 } }, + /* TrackElemType::up25ToRightBankedUp25 */ { 1, { kUp25ToRightBankedUp25Seq0 } }, + /* TrackElemType::leftBankedUp25ToUp25 */ { 1, { kLeftBankedUp25ToUp25Seq0 } }, + /* TrackElemType::rightBankedUp25ToUp25 */ { 1, { kRightBankedUp25ToUp25Seq0 } }, + /* TrackElemType::down25ToLeftBankedDown25 */ { 1, { kDown25ToLeftBankedDown25Seq0 } }, + /* TrackElemType::down25ToRightBankedDown25 */ { 1, { kDown25ToRightBankedDown25Seq0 } }, + /* TrackElemType::leftBankedDown25ToDown25 */ { 1, { kLeftBankedDown25ToDown25Seq0 } }, + /* TrackElemType::rightBankedDown25ToDown25 */ { 1, { kRightBankedDown25ToDown25Seq0 } }, + /* TrackElemType::leftBankedFlatToLeftBankedUp25 */ { 1, { kLeftBankedFlatToLeftBankedUp25Seq0 } }, + /* TrackElemType::rightBankedFlatToRightBankedUp25 */ { 1, { kRightBankedFlatToRightBankedUp25Seq0 } }, + /* TrackElemType::leftBankedUp25ToLeftBankedFlat */ { 1, { kLeftBankedUp25ToLeftBankedFlatSeq0 } }, + /* TrackElemType::rightBankedUp25ToRightBankedFlat */ { 1, { kRightBankedUp25ToRightBankedFlatSeq0 } }, + /* TrackElemType::leftBankedFlatToLeftBankedDown25 */ { 1, { kLeftBankedFlatToLeftBankedDown25Seq0 } }, + /* TrackElemType::rightBankedFlatToRightBankedDown25 */ { 1, { kRightBankedFlatToRightBankedDown25Seq0 } }, + /* TrackElemType::leftBankedDown25ToLeftBankedFlat */ { 1, { kLeftBankedDown25ToLeftBankedFlatSeq0 } }, + /* TrackElemType::rightBankedDown25ToRightBankedFlat */ { 1, { kRightBankedDown25ToRightBankedFlatSeq0 } }, + /* TrackElemType::flatToLeftBankedUp25 */ { 1, { kFlatToLeftBankedUp25Seq0 } }, + /* TrackElemType::flatToRightBankedUp25 */ { 1, { kFlatToRightBankedUp25Seq0 } }, + /* TrackElemType::leftBankedUp25ToFlat */ { 1, { kLeftBankedUp25ToFlatSeq0 } }, + /* TrackElemType::rightBankedUp25ToFlat */ { 1, { kRightBankedUp25ToFlatSeq0 } }, + /* TrackElemType::flatToLeftBankedDown25 */ { 1, { kFlatToLeftBankedDown25Seq0 } }, + /* TrackElemType::flatToRightBankedDown25 */ { 1, { kFlatToRightBankedDown25Seq0 } }, + /* TrackElemType::leftBankedDown25ToFlat */ { 1, { kLeftBankedDown25ToFlatSeq0 } }, + /* TrackElemType::rightBankedDown25ToFlat */ { 1, { kRightBankedDown25ToFlatSeq0 } }, + /* TrackElemType::leftQuarterTurn1TileUp90 */ { 2, { kLeftQuarterTurn1TileUp90Seq0, kLeftQuarterTurn1TileUp90Seq1 } }, + /* TrackElemType::rightQuarterTurn1TileUp90 */ { 2, { kRightQuarterTurn1TileUp90Seq0, kRightQuarterTurn1TileUp90Seq1 } }, - /* TrackElemType::LeftQuarterTurn1TileDown90 */ + /* TrackElemType::leftQuarterTurn1TileDown90 */ { 2, { kLeftQuarterTurn1TileDown90Seq0, kLeftQuarterTurn1TileDown90Seq1 } }, - /* TrackElemType::RightQuarterTurn1TileDown90 */ + /* TrackElemType::rightQuarterTurn1TileDown90 */ { 2, { kRightQuarterTurn1TileDown90Seq0, kRightQuarterTurn1TileDown90Seq1 } }, - /* TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop */ + /* TrackElemType::multiDimUp90ToInvertedFlatQuarterLoop */ { 3, { kMultiDimUp90ToInvertedFlatQuarterLoopSeq0, kMultiDimUp90ToInvertedFlatQuarterLoopSeq1, kMultiDimUp90ToInvertedFlatQuarterLoopSeq2 } }, - /* TrackElemType::MultiDimFlatToDown90QuarterLoop */ + /* TrackElemType::multiDimFlatToDown90QuarterLoop */ { 4, { kMultiDimFlatToDown90QuarterLoopSeq0, kMultiDimFlatToDown90QuarterLoopSeq1, kMultiDimFlatToDown90QuarterLoopSeq2, kMultiDimFlatToDown90QuarterLoopSeq3 } }, - /* TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop */ + /* TrackElemType::multiDimInvertedUp90ToFlatQuarterLoop */ { 3, { kMultiDimInvertedUp90ToFlatQuarterLoopSeq0, kMultiDimInvertedUp90ToFlatQuarterLoopSeq1, kMultiDimInvertedUp90ToFlatQuarterLoopSeq2 } }, - /* TrackElemType::RotationControlToggle */ { 1, { kRotationControlToggleSeq0 } }, - /* TrackElemType::FlatTrack1x4A */ + /* TrackElemType::rotationControlToggle */ { 1, { kRotationControlToggleSeq0 } }, + /* TrackElemType::flatTrack1x4A */ { 4, { kFlatTrack1x4ASeq0, kFlatTrack1x4ASeq1, kFlatTrack1x4ASeq2, kFlatTrack1x4ASeq3 } }, - /* TrackElemType::FlatTrack2x2 */ { 4, { kFlatTrack2x2Seq0, kFlatTrack2x2Seq1, kFlatTrack2x2Seq2, kFlatTrack2x2Seq3 } }, - /* TrackElemType::FlatTrack4x4 */ + /* TrackElemType::flatTrack2x2 */ { 4, { kFlatTrack2x2Seq0, kFlatTrack2x2Seq1, kFlatTrack2x2Seq2, kFlatTrack2x2Seq3 } }, + /* TrackElemType::flatTrack4x4 */ { 16, { kFlatTrack4x4Seq0, kFlatTrack4x4Seq1, kFlatTrack4x4Seq2, kFlatTrack4x4Seq3, kFlatTrack4x4Seq4, kFlatTrack4x4Seq5, kFlatTrack4x4Seq6, kFlatTrack4x4Seq7, kFlatTrack4x4Seq8, kFlatTrack4x4Seq9, kFlatTrack4x4Seq10, kFlatTrack4x4Seq11, kFlatTrack4x4Seq12, kFlatTrack4x4Seq13, kFlatTrack4x4Seq14, kFlatTrack4x4Seq15 } }, - /* TrackElemType::FlatTrack2x4 */ + /* TrackElemType::flatTrack2x4 */ { 8, { kFlatTrack2x4Seq0, kFlatTrack2x4Seq1, kFlatTrack2x4Seq2, kFlatTrack2x4Seq3, kFlatTrack2x4Seq4, kFlatTrack2x4Seq5, kFlatTrack2x4Seq6, kFlatTrack2x4Seq7 } }, - /* TrackElemType::FlatTrack1x5 */ + /* TrackElemType::flatTrack1x5 */ { 5, { kFlatTrack1x5Seq0, kFlatTrack1x5Seq1, kFlatTrack1x5Seq2, kFlatTrack1x5Seq3, kFlatTrack1x5Seq4 } }, - /* TrackElemType::FlatTrack1x1A */ { 1, { kFlatTrack1x1ASeq0 } }, - /* TrackElemType::FlatTrack1x4B */ + /* TrackElemType::flatTrack1x1A */ { 1, { kFlatTrack1x1ASeq0 } }, + /* TrackElemType::flatTrack1x4B */ { 4, { kFlatTrack1x4BSeq0, kFlatTrack1x4BSeq1, kFlatTrack1x4BSeq2, kFlatTrack1x4BSeq3 } }, - /* TrackElemType::FlatTrack1x1B */ { 1, { kFlatTrack1x1BSeq0 } }, - /* TrackElemType::FlatTrack1x4C */ + /* TrackElemType::flatTrack1x1B */ { 1, { kFlatTrack1x1BSeq0 } }, + /* TrackElemType::flatTrack1x4C */ { 4, { kFlatTrack1x4CSeq0, kFlatTrack1x4CSeq1, kFlatTrack1x4CSeq2, kFlatTrack1x4CSeq3 } }, - /* TrackElemType::FlatTrack3x3 */ + /* TrackElemType::flatTrack3x3 */ { 9, { kFlatTrack3x3Seq0, kFlatTrack3x3Seq1, kFlatTrack3x3Seq2, kFlatTrack3x3Seq3, kFlatTrack3x3Seq4, kFlatTrack3x3Seq5, kFlatTrack3x3Seq6, kFlatTrack3x3Seq7, kFlatTrack3x3Seq8 } }, - /* TrackElemType::LeftLargeCorkscrewUp */ + /* TrackElemType::leftLargeCorkscrewUp */ { 6, { kLeftLargeCorkscrewUpSeq0, kLeftLargeCorkscrewUpSeq1, kLeftLargeCorkscrewUpSeq2, kLeftLargeCorkscrewUpSeq3, kLeftLargeCorkscrewUpSeq4, kLeftLargeCorkscrewUpSeq5 } }, - /* TrackElemType::RightLargeCorkscrewUp */ + /* TrackElemType::rightLargeCorkscrewUp */ { 6, { kRightLargeCorkscrewUpSeq0, kRightLargeCorkscrewUpSeq1, kRightLargeCorkscrewUpSeq2, kRightLargeCorkscrewUpSeq3, kRightLargeCorkscrewUpSeq4, kRightLargeCorkscrewUpSeq5 } }, - /* TrackElemType::LeftLargeCorkscrewDown */ + /* TrackElemType::leftLargeCorkscrewDown */ { 6, { kLeftLargeCorkscrewDownSeq0, kLeftLargeCorkscrewDownSeq1, kLeftLargeCorkscrewDownSeq2, kLeftLargeCorkscrewDownSeq3, kLeftLargeCorkscrewDownSeq4, kLeftLargeCorkscrewDownSeq5 } }, - /* TrackElemType::RightLargeCorkscrewDown */ + /* TrackElemType::rightLargeCorkscrewDown */ { 6, { kRightLargeCorkscrewDownSeq0, kRightLargeCorkscrewDownSeq1, kRightLargeCorkscrewDownSeq2, kRightLargeCorkscrewDownSeq3, kRightLargeCorkscrewDownSeq4, kRightLargeCorkscrewDownSeq5 } }, - /* TrackElemType::LeftMediumHalfLoopUp */ + /* TrackElemType::leftMediumHalfLoopUp */ { 5, { kLeftMediumHalfLoopUpSeq0, kLeftMediumHalfLoopUpSeq1, kLeftMediumHalfLoopUpSeq2, kLeftMediumHalfLoopUpSeq3, kLeftMediumHalfLoopUpSeq4 } }, - /* TrackElemType::RightMediumHalfLoopUp */ + /* TrackElemType::rightMediumHalfLoopUp */ { 5, { kRightMediumHalfLoopUpSeq0, kRightMediumHalfLoopUpSeq1, kRightMediumHalfLoopUpSeq2, kRightMediumHalfLoopUpSeq3, kRightMediumHalfLoopUpSeq4 } }, - /* TrackElemType::LeftMediumHalfLoopDown */ + /* TrackElemType::leftMediumHalfLoopDown */ { 5, { kLeftMediumHalfLoopDownSeq0, kLeftMediumHalfLoopDownSeq1, kLeftMediumHalfLoopDownSeq2, kLeftMediumHalfLoopDownSeq3, kLeftMediumHalfLoopDownSeq4 } }, - /* TrackElemType::RightMediumHalfLoopDown */ + /* TrackElemType::rightMediumHalfLoopDown */ { 5, { kRightMediumHalfLoopDownSeq0, kRightMediumHalfLoopDownSeq1, kRightMediumHalfLoopDownSeq2, kRightMediumHalfLoopDownSeq3, kRightMediumHalfLoopDownSeq4 } }, - /* TrackElemType::LeftZeroGRollUp */ { 3, { kLeftZeroGRollUpSeq0, kLeftZeroGRollUpSeq1, kLeftZeroGRollUpSeq2 } }, - /* TrackElemType::RightZeroGRollUp */ { 3, { kRightZeroGRollUpSeq0, kRightZeroGRollUpSeq1, kRightZeroGRollUpSeq2 } }, - /* TrackElemType::LeftZeroGRollDown */ + /* TrackElemType::leftZeroGRollUp */ { 3, { kLeftZeroGRollUpSeq0, kLeftZeroGRollUpSeq1, kLeftZeroGRollUpSeq2 } }, + /* TrackElemType::rightZeroGRollUp */ { 3, { kRightZeroGRollUpSeq0, kRightZeroGRollUpSeq1, kRightZeroGRollUpSeq2 } }, + /* TrackElemType::leftZeroGRollDown */ { 3, { kLeftZeroGRollDownSeq0, kLeftZeroGRollDownSeq1, kLeftZeroGRollDownSeq2 } }, - /* TrackElemType::RightZeroGRollDown */ + /* TrackElemType::rightZeroGRollDown */ { 3, { kRightZeroGRollDownSeq0, kRightZeroGRollDownSeq1, kRightZeroGRollDownSeq2 } }, - /* TrackElemType::LeftLargeZeroGRollUp */ + /* TrackElemType::leftLargeZeroGRollUp */ { 4, { kLeftLargeZeroGRollUpSeq0, kLeftLargeZeroGRollUpSeq1, kLeftLargeZeroGRollUpSeq2, kLeftLargeZeroGRollUpSeq3 } }, - /* TrackElemType::RightLargeZeroGRollUp */ + /* TrackElemType::rightLargeZeroGRollUp */ { 4, { kRightLargeZeroGRollUpSeq0, kRightLargeZeroGRollUpSeq1, kRightLargeZeroGRollUpSeq2, kRightLargeZeroGRollUpSeq3 } }, - /* TrackElemType::LeftLargeZeroGRollDown */ + /* TrackElemType::leftLargeZeroGRollDown */ { 4, { kLeftLargeZeroGRollDownSeq0, kLeftLargeZeroGRollDownSeq1, kLeftLargeZeroGRollDownSeq2, kLeftLargeZeroGRollDownSeq3 } }, - /* TrackElemType::RightLargeZeroGRollDown */ + /* TrackElemType::rightLargeZeroGRollDown */ { 4, { kRightLargeZeroGRollDownSeq0, kRightLargeZeroGRollDownSeq1, kRightLargeZeroGRollDownSeq2, kRightLargeZeroGRollDownSeq3 } }, - /* TrackElemType::LeftFlyerLargeHalfLoopUninvertedUp */ + /* TrackElemType::leftFlyerLargeHalfLoopUninvertedUp */ { 7, { kLeftFlyerLargeHalfLoopUninvertedUpSeq0, kLeftFlyerLargeHalfLoopUninvertedUpSeq1, kLeftFlyerLargeHalfLoopUninvertedUpSeq2, kLeftFlyerLargeHalfLoopUninvertedUpSeq3, kLeftFlyerLargeHalfLoopUninvertedUpSeq4, kLeftFlyerLargeHalfLoopUninvertedUpSeq5, kLeftFlyerLargeHalfLoopUninvertedUpSeq6 } }, - /* TrackElemType::RightFlyerLargeHalfLoopUninvertedUp */ + /* TrackElemType::rightFlyerLargeHalfLoopUninvertedUp */ { 7, { kRightFlyerLargeHalfLoopUninvertedUpSeq0, kRightFlyerLargeHalfLoopUninvertedUpSeq1, kRightFlyerLargeHalfLoopUninvertedUpSeq2, kRightFlyerLargeHalfLoopUninvertedUpSeq3, kRightFlyerLargeHalfLoopUninvertedUpSeq4, kRightFlyerLargeHalfLoopUninvertedUpSeq5, kRightFlyerLargeHalfLoopUninvertedUpSeq6 } }, - /* TrackElemType::LeftFlyerLargeHalfLoopInvertedDown */ + /* TrackElemType::leftFlyerLargeHalfLoopInvertedDown */ { 7, { kLeftFlyerLargeHalfLoopInvertedDownSeq0, kLeftFlyerLargeHalfLoopInvertedDownSeq1, kLeftFlyerLargeHalfLoopInvertedDownSeq2, kLeftFlyerLargeHalfLoopInvertedDownSeq3, kLeftFlyerLargeHalfLoopInvertedDownSeq4, kLeftFlyerLargeHalfLoopInvertedDownSeq5, kLeftFlyerLargeHalfLoopInvertedDownSeq6 } }, - /* TrackElemType::RightFlyerLargeHalfLoopInvertedDown */ + /* TrackElemType::rightFlyerLargeHalfLoopInvertedDown */ { 7, { kRightFlyerLargeHalfLoopInvertedDownSeq0, kRightFlyerLargeHalfLoopInvertedDownSeq1, kRightFlyerLargeHalfLoopInvertedDownSeq2, kRightFlyerLargeHalfLoopInvertedDownSeq3, kRightFlyerLargeHalfLoopInvertedDownSeq4, kRightFlyerLargeHalfLoopInvertedDownSeq5, kRightFlyerLargeHalfLoopInvertedDownSeq6 } }, - /* TrackElemType::LeftFlyerLargeHalfLoopInvertedUp */ + /* TrackElemType::leftFlyerLargeHalfLoopInvertedUp */ { 7, { kLeftFlyerLargeHalfLoopInvertedUpSeq0, kLeftFlyerLargeHalfLoopInvertedUpSeq1, kLeftFlyerLargeHalfLoopInvertedUpSeq2, kLeftFlyerLargeHalfLoopInvertedUpSeq3, kLeftFlyerLargeHalfLoopInvertedUpSeq4, kLeftFlyerLargeHalfLoopInvertedUpSeq5, kLeftFlyerLargeHalfLoopInvertedUpSeq6 } }, - /* TrackElemType::RightFlyerLargeHalfLoopInvertedUp */ + /* TrackElemType::rightFlyerLargeHalfLoopInvertedUp */ { 7, { kRightFlyerLargeHalfLoopInvertedUpSeq0, kRightFlyerLargeHalfLoopInvertedUpSeq1, kRightFlyerLargeHalfLoopInvertedUpSeq2, kRightFlyerLargeHalfLoopInvertedUpSeq3, kRightFlyerLargeHalfLoopInvertedUpSeq4, kRightFlyerLargeHalfLoopInvertedUpSeq5, kRightFlyerLargeHalfLoopInvertedUpSeq6 } }, - /* TrackElemType::LeftFlyerLargeHalfLoopUninvertedDown */ + /* TrackElemType::leftFlyerLargeHalfLoopUninvertedDown */ { 7, { kLeftFlyerLargeHalfLoopUninvertedDownSeq0, kLeftFlyerLargeHalfLoopUninvertedDownSeq1, kLeftFlyerLargeHalfLoopUninvertedDownSeq2, kLeftFlyerLargeHalfLoopUninvertedDownSeq3, kLeftFlyerLargeHalfLoopUninvertedDownSeq4, kLeftFlyerLargeHalfLoopUninvertedDownSeq5, kLeftFlyerLargeHalfLoopUninvertedDownSeq6 } }, - /* TrackElemType::RightFlyerLargeHalfLoopUninvertedDown */ + /* TrackElemType::rightFlyerLargeHalfLoopUninvertedDown */ { 7, { kRightFlyerLargeHalfLoopUninvertedDownSeq0, kRightFlyerLargeHalfLoopUninvertedDownSeq1, kRightFlyerLargeHalfLoopUninvertedDownSeq2, kRightFlyerLargeHalfLoopUninvertedDownSeq3, kRightFlyerLargeHalfLoopUninvertedDownSeq4, kRightFlyerLargeHalfLoopUninvertedDownSeq5, kRightFlyerLargeHalfLoopUninvertedDownSeq6 } }, - /* TrackElemType::FlyerHalfLoopInvertedUp */ + /* TrackElemType::flyerHalfLoopInvertedUp */ { 4, { kFlyerHalfLoopInvertedUpSeq0, kFlyerHalfLoopInvertedUpSeq1, kFlyerHalfLoopInvertedUpSeq2, kFlyerHalfLoopInvertedUpSeq3 } }, - /* TrackElemType::FlyerHalfLoopUninvertedDown */ + /* TrackElemType::flyerHalfLoopUninvertedDown */ { 4, { kFlyerHalfLoopUninvertedDownSeq0, kFlyerHalfLoopUninvertedDownSeq1, kFlyerHalfLoopUninvertedDownSeq2, kFlyerHalfLoopUninvertedDownSeq3 } }, - /* TrackElemType::LeftEighthToDiagUp25 */ + /* TrackElemType::leftEighthToDiagUp25 */ { 5, { kLeftEighthToDiagUp25Seq0, kLeftEighthToDiagUp25Seq1, kLeftEighthToDiagUp25Seq2, kLeftEighthToDiagUp25Seq3, kLeftEighthToDiagUp25Seq4 } }, - /* TrackElemType::RightEighthToDiagUp25 */ + /* TrackElemType::rightEighthToDiagUp25 */ { 5, { kRightEighthToDiagUp25Seq0, kRightEighthToDiagUp25Seq1, kRightEighthToDiagUp25Seq2, kRightEighthToDiagUp25Seq3, kRightEighthToDiagUp25Seq4 } }, - /* TrackElemType::LeftEighthToDiagDown25 */ + /* TrackElemType::leftEighthToDiagDown25 */ { 5, { kLeftEighthToDiagDown25Seq0, kLeftEighthToDiagDown25Seq1, kLeftEighthToDiagDown25Seq2, kLeftEighthToDiagDown25Seq3, kLeftEighthToDiagDown25Seq4 } }, - /* TrackElemType::RightEighthToDiagDown25 */ + /* TrackElemType::rightEighthToDiagDown25 */ { 5, { kRightEighthToDiagDown25Seq0, kRightEighthToDiagDown25Seq1, kRightEighthToDiagDown25Seq2, kRightEighthToDiagDown25Seq3, kRightEighthToDiagDown25Seq4 } }, - /* TrackElemType::LeftEighthToOrthogonalUp25 */ + /* TrackElemType::leftEighthToOrthogonalUp25 */ { 5, { kLeftEighthToOrthogonalUp25Seq0, kLeftEighthToOrthogonalUp25Seq1, kLeftEighthToOrthogonalUp25Seq2, kLeftEighthToOrthogonalUp25Seq3, kLeftEighthToOrthogonalUp25Seq4 } }, - /* TrackElemType::RightEighthToOrthogonalUp25 */ + /* TrackElemType::rightEighthToOrthogonalUp25 */ { 5, { kRightEighthToOrthogonalUp25Seq0, kRightEighthToOrthogonalUp25Seq1, kRightEighthToOrthogonalUp25Seq2, kRightEighthToOrthogonalUp25Seq3, kRightEighthToOrthogonalUp25Seq4 } }, - /* TrackElemType::LeftEighthToOrthogonalDown25 */ + /* TrackElemType::leftEighthToOrthogonalDown25 */ { 5, { kLeftEighthToOrthogonalDown25Seq0, kLeftEighthToOrthogonalDown25Seq1, kLeftEighthToOrthogonalDown25Seq2, kLeftEighthToOrthogonalDown25Seq3, kLeftEighthToOrthogonalDown25Seq4 } }, - /* TrackElemType::RightEighthToOrthogonalDown25 */ + /* TrackElemType::rightEighthToOrthogonalDown25 */ { 5, { kRightEighthToOrthogonalDown25Seq0, kRightEighthToOrthogonalDown25Seq1, kRightEighthToOrthogonalDown25Seq2, kRightEighthToOrthogonalDown25Seq3, kRightEighthToOrthogonalDown25Seq4 } }, - /* TrackElemType::DiagUp25ToLeftBankedUp25 */ + /* TrackElemType::diagUp25ToLeftBankedUp25 */ { 4, { kDiagUp25ToLeftBankedUp25Seq0, kDiagUp25ToLeftBankedUp25Seq1, kDiagUp25ToLeftBankedUp25Seq2, kDiagUp25ToLeftBankedUp25Seq3 } }, - /* TrackElemType::DiagUp25ToRightBankedUp25 */ + /* TrackElemType::diagUp25ToRightBankedUp25 */ { 4, { kDiagUp25ToRightBankedUp25Seq0, kDiagUp25ToRightBankedUp25Seq1, kDiagUp25ToRightBankedUp25Seq2, kDiagUp25ToRightBankedUp25Seq3 } }, - /* TrackElemType::DiagLeftBankedUp25ToUp25 */ + /* TrackElemType::diagLeftBankedUp25ToUp25 */ { 4, { kDiagLeftBankedUp25ToUp25Seq0, kDiagLeftBankedUp25ToUp25Seq1, kDiagLeftBankedUp25ToUp25Seq2, kDiagLeftBankedUp25ToUp25Seq3 } }, - /* TrackElemType::DiagRightBankedUp25ToUp25 */ + /* TrackElemType::diagRightBankedUp25ToUp25 */ { 4, { kDiagRightBankedUp25ToUp25Seq0, kDiagRightBankedUp25ToUp25Seq1, kDiagRightBankedUp25ToUp25Seq2, kDiagRightBankedUp25ToUp25Seq3 } }, - /* TrackElemType::DiagDown25ToLeftBankedDown25 */ + /* TrackElemType::diagDown25ToLeftBankedDown25 */ { 4, { kDiagDown25ToLeftBankedDown25Seq0, kDiagDown25ToLeftBankedDown25Seq1, kDiagDown25ToLeftBankedDown25Seq2, kDiagDown25ToLeftBankedDown25Seq3 } }, - /* TrackElemType::DiagDown25ToRightBankedDown25 */ + /* TrackElemType::diagDown25ToRightBankedDown25 */ { 4, { kDiagDown25ToRightBankedDown25Seq0, kDiagDown25ToRightBankedDown25Seq1, kDiagDown25ToRightBankedDown25Seq2, kDiagDown25ToRightBankedDown25Seq3 } }, - /* TrackElemType::DiagLeftBankedDown25ToDown25 */ + /* TrackElemType::diagLeftBankedDown25ToDown25 */ { 4, { kDiagLeftBankedDown25ToDown25Seq0, kDiagLeftBankedDown25ToDown25Seq1, kDiagLeftBankedDown25ToDown25Seq2, kDiagLeftBankedDown25ToDown25Seq3 } }, - /* TrackElemType::DiagRightBankedDown25ToDown25 */ + /* TrackElemType::diagRightBankedDown25ToDown25 */ { 4, { kDiagRightBankedDown25ToDown25Seq0, kDiagRightBankedDown25ToDown25Seq1, kDiagRightBankedDown25ToDown25Seq2, kDiagRightBankedDown25ToDown25Seq3 } }, - /* TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 */ + /* TrackElemType::diagLeftBankedFlatToLeftBankedUp25 */ { 4, { kDiagLeftBankedFlatToLeftBankedUp25Seq0, kDiagLeftBankedFlatToLeftBankedUp25Seq1, kDiagLeftBankedFlatToLeftBankedUp25Seq2, kDiagLeftBankedFlatToLeftBankedUp25Seq3 } }, - /* TrackElemType::DiagRightBankedFlatToRightBankedUp25 */ + /* TrackElemType::diagRightBankedFlatToRightBankedUp25 */ { 4, { kDiagRightBankedFlatToRightBankedUp25Seq0, kDiagRightBankedFlatToRightBankedUp25Seq1, kDiagRightBankedFlatToRightBankedUp25Seq2, kDiagRightBankedFlatToRightBankedUp25Seq3 } }, - /* TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat */ + /* TrackElemType::diagLeftBankedUp25ToLeftBankedFlat */ { 4, { kDiagLeftBankedUp25ToLeftBankedFlatSeq0, kDiagLeftBankedUp25ToLeftBankedFlatSeq1, kDiagLeftBankedUp25ToLeftBankedFlatSeq2, kDiagLeftBankedUp25ToLeftBankedFlatSeq3 } }, - /* TrackElemType::DiagRightBankedUp25ToRightBankedFlat */ + /* TrackElemType::diagRightBankedUp25ToRightBankedFlat */ { 4, { kDiagRightBankedUp25ToRightBankedFlatSeq0, kDiagRightBankedUp25ToRightBankedFlatSeq1, kDiagRightBankedUp25ToRightBankedFlatSeq2, kDiagRightBankedUp25ToRightBankedFlatSeq3 } }, - /* TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 */ + /* TrackElemType::diagLeftBankedFlatToLeftBankedDown25 */ { 4, { kDiagLeftBankedFlatToLeftBankedDown25Seq0, kDiagLeftBankedFlatToLeftBankedDown25Seq1, kDiagLeftBankedFlatToLeftBankedDown25Seq2, kDiagLeftBankedFlatToLeftBankedDown25Seq3 } }, - /* TrackElemType::DiagRightBankedFlatToRightBankedDown25 */ + /* TrackElemType::diagRightBankedFlatToRightBankedDown25 */ { 4, { kDiagRightBankedFlatToRightBankedDown25Seq0, kDiagRightBankedFlatToRightBankedDown25Seq1, kDiagRightBankedFlatToRightBankedDown25Seq2, kDiagRightBankedFlatToRightBankedDown25Seq3 } }, - /* TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat */ + /* TrackElemType::diagLeftBankedDown25ToLeftBankedFlat */ { 4, { kDiagLeftBankedDown25ToLeftBankedFlatSeq0, kDiagLeftBankedDown25ToLeftBankedFlatSeq1, kDiagLeftBankedDown25ToLeftBankedFlatSeq2, kDiagLeftBankedDown25ToLeftBankedFlatSeq3 } }, - /* TrackElemType::DiagRightBankedDown25ToRightBankedFlat */ + /* TrackElemType::diagRightBankedDown25ToRightBankedFlat */ { 4, { kDiagRightBankedDown25ToRightBankedFlatSeq0, kDiagRightBankedDown25ToRightBankedFlatSeq1, kDiagRightBankedDown25ToRightBankedFlatSeq2, kDiagRightBankedDown25ToRightBankedFlatSeq3 } }, - /* TrackElemType::DiagFlatToLeftBankedUp25 */ + /* TrackElemType::diagFlatToLeftBankedUp25 */ { 4, { kDiagFlatToLeftBankedUp25Seq0, kDiagFlatToLeftBankedUp25Seq1, kDiagFlatToLeftBankedUp25Seq2, kDiagFlatToLeftBankedUp25Seq3 } }, - /* TrackElemType::DiagFlatToRightBankedUp25 */ + /* TrackElemType::diagFlatToRightBankedUp25 */ { 4, { kDiagFlatToRightBankedUp25Seq0, kDiagFlatToRightBankedUp25Seq1, kDiagFlatToRightBankedUp25Seq2, kDiagFlatToRightBankedUp25Seq3 } }, - /* TrackElemType::DiagLeftBankedUp25ToFlat */ + /* TrackElemType::diagLeftBankedUp25ToFlat */ { 4, { kDiagLeftBankedUp25ToFlatSeq0, kDiagLeftBankedUp25ToFlatSeq1, kDiagLeftBankedUp25ToFlatSeq2, kDiagLeftBankedUp25ToFlatSeq3 } }, - /* TrackElemType::DiagRightBankedUp25ToFlat */ + /* TrackElemType::diagRightBankedUp25ToFlat */ { 4, { kDiagRightBankedUp25ToFlatSeq0, kDiagRightBankedUp25ToFlatSeq1, kDiagRightBankedUp25ToFlatSeq2, kDiagRightBankedUp25ToFlatSeq3 } }, - /* TrackElemType::DiagFlatToLeftBankedDown25 */ + /* TrackElemType::diagFlatToLeftBankedDown25 */ { 4, { kDiagFlatToLeftBankedDown25Seq0, kDiagFlatToLeftBankedDown25Seq1, kDiagFlatToLeftBankedDown25Seq2, kDiagFlatToLeftBankedDown25Seq3 } }, - /* TrackElemType::DiagFlatToRightBankedDown25 */ + /* TrackElemType::diagFlatToRightBankedDown25 */ { 4, { kDiagFlatToRightBankedDown25Seq0, kDiagFlatToRightBankedDown25Seq1, kDiagFlatToRightBankedDown25Seq2, kDiagFlatToRightBankedDown25Seq3 } }, - /* TrackElemType::DiagLeftBankedDown25ToFlat */ + /* TrackElemType::diagLeftBankedDown25ToFlat */ { 4, { kDiagLeftBankedDown25ToFlatSeq0, kDiagLeftBankedDown25ToFlatSeq1, kDiagLeftBankedDown25ToFlatSeq2, kDiagLeftBankedDown25ToFlatSeq3 } }, - /* TrackElemType::DiagRightBankedDown25ToFlat */ + /* TrackElemType::diagRightBankedDown25ToFlat */ { 4, { kDiagRightBankedDown25ToFlatSeq0, kDiagRightBankedDown25ToFlatSeq1, kDiagRightBankedDown25ToFlatSeq2, kDiagRightBankedDown25ToFlatSeq3 } }, - /* TrackElemType::DiagUp25LeftBanked */ + /* TrackElemType::diagUp25LeftBanked */ { 4, { kDiagUp25LeftBankedSeq0, kDiagUp25LeftBankedSeq1, kDiagUp25LeftBankedSeq2, kDiagUp25LeftBankedSeq3 } }, - /* TrackElemType::DiagUp25RightBanked */ + /* TrackElemType::diagUp25RightBanked */ { 4, { kDiagUp25RightBankedSeq0, kDiagUp25RightBankedSeq1, kDiagUp25RightBankedSeq2, kDiagUp25RightBankedSeq3 } }, - /* TrackElemType::DiagDown25LeftBanked */ + /* TrackElemType::diagDown25LeftBanked */ { 4, { kDiagDown25LeftBankedSeq0, kDiagDown25LeftBankedSeq1, kDiagDown25LeftBankedSeq2, kDiagDown25LeftBankedSeq3 } }, - /* TrackElemType::DiagDown25RightBanked */ + /* TrackElemType::diagDown25RightBanked */ { 4, { kDiagDown25RightBankedSeq0, kDiagDown25RightBankedSeq1, kDiagDown25RightBankedSeq2, kDiagDown25RightBankedSeq3 } }, - /* TrackElemType::LeftEighthBankToDiagUp25 */ + /* TrackElemType::leftEighthBankToDiagUp25 */ { 5, { kLeftEighthBankToDiagUp25Seq0, kLeftEighthBankToDiagUp25Seq1, kLeftEighthBankToDiagUp25Seq2, kLeftEighthBankToDiagUp25Seq3, kLeftEighthBankToDiagUp25Seq4 } }, - /* TrackElemType::RightEighthBankToDiagUp25 */ + /* TrackElemType::rightEighthBankToDiagUp25 */ { 5, { kRightEighthBankToDiagUp25Seq0, kRightEighthBankToDiagUp25Seq1, kRightEighthBankToDiagUp25Seq2, kRightEighthBankToDiagUp25Seq3, kRightEighthBankToDiagUp25Seq4 } }, - /* TrackElemType::LeftEighthBankToDiagDown25 */ + /* TrackElemType::leftEighthBankToDiagDown25 */ { 5, { kLeftEighthBankToDiagDown25Seq0, kLeftEighthBankToDiagDown25Seq1, kLeftEighthBankToDiagDown25Seq2, kLeftEighthBankToDiagDown25Seq3, kLeftEighthBankToDiagDown25Seq4 } }, - /* TrackElemType::RightEighthBankToDiagDown25 */ + /* TrackElemType::rightEighthBankToDiagDown25 */ { 5, { kRightEighthBankToDiagDown25Seq0, kRightEighthBankToDiagDown25Seq1, kRightEighthBankToDiagDown25Seq2, kRightEighthBankToDiagDown25Seq3, kRightEighthBankToDiagDown25Seq4 } }, - /* TrackElemType::LeftEighthBankToOrthogonalUp25 */ + /* TrackElemType::leftEighthBankToOrthogonalUp25 */ { 5, { kLeftEighthBankToOrthogonalUp25Seq0, kLeftEighthBankToOrthogonalUp25Seq1, kLeftEighthBankToOrthogonalUp25Seq2, kLeftEighthBankToOrthogonalUp25Seq3, kLeftEighthBankToOrthogonalUp25Seq4 } }, - /* TrackElemType::RightEighthBankToOrthogonalUp25 */ + /* TrackElemType::rightEighthBankToOrthogonalUp25 */ { 5, { kRightEighthBankToOrthogonalUp25Seq0, kRightEighthBankToOrthogonalUp25Seq1, kRightEighthBankToOrthogonalUp25Seq2, kRightEighthBankToOrthogonalUp25Seq3, kRightEighthBankToOrthogonalUp25Seq4 } }, - /* TrackElemType::LeftEighthBankToOrthogonalDown25 */ + /* TrackElemType::leftEighthBankToOrthogonalDown25 */ { 5, { kLeftEighthBankToOrthogonalDown25Seq0, kLeftEighthBankToOrthogonalDown25Seq1, kLeftEighthBankToOrthogonalDown25Seq2, kLeftEighthBankToOrthogonalDown25Seq3, kLeftEighthBankToOrthogonalDown25Seq4 } }, - /* TrackElemType::RightEighthBankToOrthogonalDown25 */ + /* TrackElemType::rightEighthBankToOrthogonalDown25 */ { 5, { kRightEighthBankToOrthogonalDown25Seq0, kRightEighthBankToOrthogonalDown25Seq1, kRightEighthBankToOrthogonalDown25Seq2, kRightEighthBankToOrthogonalDown25Seq3, kRightEighthBankToOrthogonalDown25Seq4 } }, - /* TrackElemType::DiagBrakes */ { 4, { kDiagBrakesSeq0, kDiagBrakesSeq1, kDiagBrakesSeq2, kDiagBrakesSeq3 } }, - /* TrackElemType::DiagBlockBrakes */ + /* TrackElemType::diagBrakes */ { 4, { kDiagBrakesSeq0, kDiagBrakesSeq1, kDiagBrakesSeq2, kDiagBrakesSeq3 } }, + /* TrackElemType::diagBlockBrakes */ { 4, { kDiagBlockBrakesSeq0, kDiagBlockBrakesSeq1, kDiagBlockBrakesSeq2, kDiagBlockBrakesSeq3 } }, - /* TrackElemType::InclinedBrakes */ + /* TrackElemType::inclinedBrakes */ { 1, { kDown25Seq0 } }, - /* TrackElemType::DiagBooster */ { 4, { kDiagFlatSeq0, kDiagFlatSeq1, kDiagFlatSeq2, kDiagFlatSeq3 } }, - /* TrackElemType::DiagFlatToUp60LongBase */ + /* TrackElemType::diagBooster */ { 4, { kDiagFlatSeq0, kDiagFlatSeq1, kDiagFlatSeq2, kDiagFlatSeq3 } }, + /* TrackElemType::diagFlatToUp60LongBase */ { 10, { kDiagFlatToUp60LongBaseSeq0, kDiagFlatToUp60LongBaseSeq1, kDiagFlatToUp60LongBaseSeq2, kDiagFlatToUp60LongBaseSeq3, kDiagFlatToUp60LongBaseSeq4, kDiagFlatToUp60LongBaseSeq5, kDiagFlatToUp60LongBaseSeq6, kDiagFlatToUp60LongBaseSeq7, kDiagFlatToUp60LongBaseSeq8, kDiagFlatToUp60LongBaseSeq9 } }, - /* TrackElemType::DiagUp60ToFlatLongBase */ + /* TrackElemType::diagUp60ToFlatLongBase */ { 10, { kDiagUp60ToFlatLongBaseSeq0, kDiagUp60ToFlatLongBaseSeq1, kDiagUp60ToFlatLongBaseSeq2, kDiagUp60ToFlatLongBaseSeq3, kDiagUp60ToFlatLongBaseSeq4, kDiagUp60ToFlatLongBaseSeq5, kDiagUp60ToFlatLongBaseSeq6, kDiagUp60ToFlatLongBaseSeq7, kDiagUp60ToFlatLongBaseSeq8, kDiagUp60ToFlatLongBaseSeq9 } }, - /* TrackElemType::DiagFlatToDown60LongBase */ + /* TrackElemType::diagFlatToDown60LongBase */ { 10, { kDiagFlatToDown60LongBaseSeq0, kDiagFlatToDown60LongBaseSeq1, kDiagFlatToDown60LongBaseSeq2, kDiagFlatToDown60LongBaseSeq3, kDiagFlatToDown60LongBaseSeq4, kDiagFlatToDown60LongBaseSeq5, kDiagFlatToDown60LongBaseSeq6, kDiagFlatToDown60LongBaseSeq7, kDiagFlatToDown60LongBaseSeq8, kDiagFlatToDown60LongBaseSeq9 } }, - /* TrackElemType::DiagDown60ToFlatLongBase */ + /* TrackElemType::diagDown60ToFlatLongBase */ { 10, { kDiagDown60ToFlatLongBaseSeq0, kDiagDown60ToFlatLongBaseSeq1, kDiagDown60ToFlatLongBaseSeq2, kDiagDown60ToFlatLongBaseSeq3, kDiagDown60ToFlatLongBaseSeq4, kDiagDown60ToFlatLongBaseSeq5, kDiagDown60ToFlatLongBaseSeq6, kDiagDown60ToFlatLongBaseSeq7, kDiagDown60ToFlatLongBaseSeq8, kDiagDown60ToFlatLongBaseSeq9 } }, - /* TrackElemType::LeftEighthDiveLoopUpToOrthogonal */ + /* TrackElemType::leftEighthDiveLoopUpToOrthogonal */ { 6, { kLeftEighthDiveLoopUpToOrthogonalSeq0, kLeftEighthDiveLoopUpToOrthogonalSeq1, kLeftEighthDiveLoopUpToOrthogonalSeq2, kLeftEighthDiveLoopUpToOrthogonalSeq3, kLeftEighthDiveLoopUpToOrthogonalSeq4, kLeftEighthDiveLoopUpToOrthogonalSeq5 } }, - /* TrackElemType::RightEighthDiveLoopUpToOrthogonal */ + /* TrackElemType::rightEighthDiveLoopUpToOrthogonal */ { 6, { kRightEighthDiveLoopUpToOrthogonalSeq0, kRightEighthDiveLoopUpToOrthogonalSeq1, kRightEighthDiveLoopUpToOrthogonalSeq2, kRightEighthDiveLoopUpToOrthogonalSeq3, kRightEighthDiveLoopUpToOrthogonalSeq4, kRightEighthDiveLoopUpToOrthogonalSeq5 } }, - /* TrackElemType::LeftEighthDiveLoopDownToDiag */ + /* TrackElemType::leftEighthDiveLoopDownToDiag */ { 6, { kLeftEighthDiveLoopDownToDiagSeq0, kLeftEighthDiveLoopDownToDiagSeq1, kLeftEighthDiveLoopDownToDiagSeq2, kLeftEighthDiveLoopDownToDiagSeq3, kLeftEighthDiveLoopDownToDiagSeq4, kLeftEighthDiveLoopDownToDiagSeq5 } }, - /* TrackElemType::RightEighthDiveLoopDownToDiag */ + /* TrackElemType::rightEighthDiveLoopDownToDiag */ { 6, { kRightEighthDiveLoopDownToDiagSeq0, kRightEighthDiveLoopDownToDiagSeq1, kRightEighthDiveLoopDownToDiagSeq2, kRightEighthDiveLoopDownToDiagSeq3, kRightEighthDiveLoopDownToDiagSeq4, kRightEighthDiveLoopDownToDiagSeq5 } }, - /* TrackElemType::DiagDown25Brakes */ { 4, { kDiagDown25Seq0, kDiagDown25Seq1, kDiagDown25Seq2, kDiagDown25Seq3 } } + /* TrackElemType::diagDown25Brakes */ { 4, { kDiagDown25Seq0, kDiagDown25Seq1, kDiagDown25Seq2, kDiagDown25Seq3 } } }; #pragma endregion static constexpr auto BuildDescriptorTable() { - std::array res{}; + std::array res{}; - for (int i = 0; i < EnumValue(TrackElemType::Count); i++) + for (int i = 0; i < EnumValue(TrackElemType::count); i++) { TrackElementDescriptor& desc = res[i]; desc.description = kRideConfigurationStringIds[i]; @@ -15925,7 +16063,6 @@ namespace OpenRCT2::TrackMetaData desc.coordinates = kTrackCoordinates[i]; desc.curveChain = kTrackCurveChain[i]; desc.flags = kTrackFlags[i]; - desc.heightMarkerPositions = kTrackHeightMarkerPositions[i]; desc.mirrorElement = kTrackElementMirrorMap[i]; desc.pieceLength = kTrackPieceLengths[i]; desc.priceModifier = kTrackPricing[i]; @@ -15940,7 +16077,6 @@ namespace OpenRCT2::TrackMetaData desc.sequences[sequenceIndex] = kSequenceDescriptorsByElement[i].sequences[sequenceIndex]; } } - return res; } diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index 6f497068acb9..428245919e77 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,8 @@ #pragma once +#include "../core/FlagHolder.hpp" +#include "../localisation/StringIdType.h" #include "../paint/support/MetalSupports.h" #include "../paint/support/WoodenSupports.h" #include "../paint/tile_element/Segment.h" @@ -19,6 +21,7 @@ using namespace OpenRCT2; namespace OpenRCT2::TrackMetaData { constexpr uint8_t kMaxSequencesPerPiece = 16; + using TrackFlags = FlagHolder; // 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3 @@ -68,11 +71,11 @@ namespace OpenRCT2::TrackMetaData constexpr DodgemsTrackSize GetDodgemsTrackSize(OpenRCT2::TrackElemType type) { - if (type == OpenRCT2::TrackElemType::FlatTrack2x2) + if (type == OpenRCT2::TrackElemType::flatTrack2x2) return { 4, 4, 59, 59 }; - if (type == OpenRCT2::TrackElemType::FlatTrack4x4) + if (type == OpenRCT2::TrackElemType::flatTrack4x4) return { 4, 4, 123, 123 }; - if (type == OpenRCT2::TrackElemType::FlatTrack2x4) + if (type == OpenRCT2::TrackElemType::flatTrack2x4) return { 4, 4, 59, 123 }; return { 0, 0, 0, 0 }; } @@ -89,18 +92,25 @@ namespace OpenRCT2::TrackMetaData uint8_t alternates = false; }; + using SequenceFlags = FlagHolder; + struct SequenceDescriptor { SequenceClearance clearance{}; /** rct2: 0x00999A94 */ uint8_t allowedWallEdges{}; /** rct2: 0x0099BA64 */ - uint8_t flags{}; + SequenceFlags flags{}; SequenceWoodenSupport woodenSupports{}; SequenceMetalSupport metalSupports{}; int8_t extraSupportRotation = 0; bool invertSegmentBlocking = false; std::array blockedSegments{ kSegmentsNone, kSegmentsNone, kSegmentsNone }; + + constexpr uint8_t getEntranceConnectionSides() const + { + return flags.holder & 0xF; + } }; using TrackComputeFunction = int32_t (*)(const int16_t); @@ -109,15 +119,17 @@ namespace OpenRCT2::TrackMetaData StringId description; TrackCoordinates coordinates; + // Used to estimate the ride length for number of powered vehicle trains uint8_t pieceLength; + // Piece the ride construction window automatically selects next TrackCurveChain curveChain; + // Track element to build when building "covered"/"splashdown" track OpenRCT2::TrackElemType alternativeType; // Price Modifier should be used as in the following calculation: // (RideTrackPrice * TED::PriceModifier) / 65536 uint32_t priceModifier; OpenRCT2::TrackElemType mirrorElement; - uint32_t heightMarkerPositions; - uint32_t flags; + TrackFlags flags; uint8_t numSequences{}; std::array sequences; diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index bb07e65998b5..037e682bef15 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,6 +21,7 @@ #include "../actions/LargeSceneryPlaceAction.h" #include "../actions/LargeSceneryRemoveAction.h" #include "../actions/MazePlaceTrackAction.h" +#include "../actions/ResultWithMessage.h" #include "../actions/RideCreateAction.h" #include "../actions/RideDemolishAction.h" #include "../actions/RideEntranceExitPlaceAction.h" @@ -31,6 +32,7 @@ #include "../actions/WallPlaceAction.h" #include "../actions/WallRemoveAction.h" #include "../audio/Audio.h" +#include "../config/Config.h" #include "../core/DataSerialiser.h" #include "../core/File.h" #include "../core/Numerics.hpp" @@ -76,6 +78,8 @@ #include using namespace OpenRCT2; +using OpenRCT2::GameActions::CommandFlag; +using OpenRCT2::GameActions::CommandFlags; namespace OpenRCT2::TrackDesignSceneryElementFlags { @@ -222,7 +226,7 @@ ResultWithMessage TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, con const auto& element = trackElement.element->AsTrack(); // Remove this check for new track design format - if (element->GetTrackType() > TrackElemType::HighestAlias) + if (element->GetTrackType() > TrackElemType::highestAlias) { return { false, STR_TRACK_ELEM_UNSUPPORTED_TD6 }; } @@ -235,7 +239,7 @@ ResultWithMessage TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, con track.seatRotation = element->GetSeatRotation(); // This warning will not apply to new track design format - if (track.type == TrackElemType::BlockBrakes && element->GetBrakeBoosterSpeed() != kRCT2DefaultBlockBrakeSpeed) + if (track.type == TrackElemType::blockBrakes && element->GetBrakeBoosterSpeed() != kRCT2DefaultBlockBrakeSpeed) { warningMessage = STR_TRACK_DESIGN_BLOCK_BRAKE_SPEED_RESET; } @@ -924,10 +928,11 @@ void TrackDesignMirror(TrackDesign& td) static void TrackDesignAddSelectedTile(const CoordsXY& coords) { - auto tileIterator = std::find(gMapSelectionTiles.begin(), gMapSelectionTiles.end(), coords); - if (tileIterator == gMapSelectionTiles.end()) + const auto& selectedTiles = MapSelection::getSelectedTiles(); + const auto tileIterator = std::find(selectedTiles.begin(), selectedTiles.end(), coords); + if (tileIterator == selectedTiles.end()) { - gMapSelectionTiles.push_back(coords); + MapSelection::addSelectedTile(coords); } } @@ -955,8 +960,7 @@ static GameActions::Result TrackDesignPlaceSceneryElementRemoveGhost( int32_t z = scenery.loc.z + originZ; uint8_t sceneryRotation = (rotation + scenery.getRotation()) & kTileElementDirectionMask; - const uint32_t flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND - | GAME_COMMAND_FLAG_GHOST; + const CommandFlags flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }; std::unique_ptr ga; switch (entryInfo->Type) { @@ -1045,7 +1049,7 @@ static GameActions::Result TrackDesignPlaceSceneryElement( } int16_t z; - uint8_t flags; + CommandFlags flags; auto& gameState = getGameState(); @@ -1063,24 +1067,23 @@ static GameActions::Result TrackDesignPlaceSceneryElement( z = scenery.loc.z + originZ; uint8_t quadrant = (scenery.getQuadrant() + _currentTrackPieceDirection) & 3; - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_TRACK_DESIGN; + flags = { CommandFlag::apply, CommandFlag::trackDesign }; if (tds.placeOperation == TrackPlaceOperation::placeTrackPreview) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_TRACK_DESIGN | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED - | GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::apply, CommandFlag::trackDesign, CommandFlag::allowDuringPaused, CommandFlag::noSpend }; } else if (tds.placeOperation == TrackPlaceOperation::placeGhost) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_TRACK_DESIGN | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED - | GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::apply, CommandFlag::trackDesign, CommandFlag::allowDuringPaused, CommandFlag::ghost, + CommandFlag::noSpend }; } else if (tds.placeOperation == TrackPlaceOperation::placeQuery) { - flags = GAME_COMMAND_FLAG_TRACK_DESIGN; + flags = { CommandFlag::trackDesign }; } if (tds.isReplay) { - flags |= GAME_COMMAND_FLAG_REPLAY; + flags.set(CommandFlag::replay); } auto smallSceneryPlace = GameActions::SmallSceneryPlaceAction( @@ -1088,10 +1091,10 @@ static GameActions::Result TrackDesignPlaceSceneryElement( scenery.secondaryColour, scenery.tertiaryColour); smallSceneryPlace.SetFlags(flags); - auto res = flags & GAME_COMMAND_FLAG_APPLY ? GameActions::ExecuteNested(&smallSceneryPlace, gameState) - : GameActions::QueryNested(&smallSceneryPlace, gameState); + auto res = flags.has(CommandFlag::apply) ? GameActions::ExecuteNested(&smallSceneryPlace, gameState) + : GameActions::QueryNested(&smallSceneryPlace, gameState); - cost = res.Error == GameActions::Status::Ok ? res.Cost : 0; + cost = res.error == GameActions::Status::ok ? res.cost : 0; break; } case ObjectType::largeScenery: @@ -1106,33 +1109,32 @@ static GameActions::Result TrackDesignPlaceSceneryElement( z = scenery.loc.z + originZ; - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_TRACK_DESIGN; + flags = { CommandFlag::apply, CommandFlag::trackDesign }; if (tds.placeOperation == TrackPlaceOperation::placeTrackPreview) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_TRACK_DESIGN | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED - | GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::apply, CommandFlag::trackDesign, CommandFlag::allowDuringPaused, CommandFlag::noSpend }; } else if (tds.placeOperation == TrackPlaceOperation::placeGhost) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_TRACK_DESIGN | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED - | GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::apply, CommandFlag::trackDesign, CommandFlag::allowDuringPaused, CommandFlag::ghost, + CommandFlag::noSpend }; } else if (tds.placeOperation == TrackPlaceOperation::placeQuery) { - flags = GAME_COMMAND_FLAG_TRACK_DESIGN; + flags = { CommandFlag::trackDesign }; } if (tds.isReplay) { - flags |= GAME_COMMAND_FLAG_REPLAY; + flags.set(CommandFlag::replay); } auto sceneryPlaceAction = GameActions::LargeSceneryPlaceAction( { mapCoord.x, mapCoord.y, z, rotation }, entryInfo->Index, scenery.primaryColour, scenery.secondaryColour, scenery.tertiaryColour); sceneryPlaceAction.SetFlags(flags); - auto res = flags & GAME_COMMAND_FLAG_APPLY ? GameActions::ExecuteNested(&sceneryPlaceAction, gameState) - : GameActions::QueryNested(&sceneryPlaceAction, gameState); + auto res = flags.has(CommandFlag::apply) ? GameActions::ExecuteNested(&sceneryPlaceAction, gameState) + : GameActions::QueryNested(&sceneryPlaceAction, gameState); - cost = res.Cost; + cost = res.cost; break; } case ObjectType::walls: @@ -1146,33 +1148,31 @@ static GameActions::Result TrackDesignPlaceSceneryElement( rotation += scenery.getRotation(); rotation &= 3; - flags = GAME_COMMAND_FLAG_APPLY; + flags = { CommandFlag::apply }; if (tds.placeOperation == TrackPlaceOperation::placeTrackPreview) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_TRACK_DESIGN | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED - | GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::apply, CommandFlag::trackDesign, CommandFlag::allowDuringPaused, CommandFlag::noSpend }; } else if (tds.placeOperation == TrackPlaceOperation::placeGhost) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND - | GAME_COMMAND_FLAG_GHOST; + flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }; } else if (tds.placeOperation == TrackPlaceOperation::placeQuery) { - flags = 0; + flags = {}; } if (tds.isReplay) { - flags |= GAME_COMMAND_FLAG_REPLAY; + flags.set(CommandFlag::replay); } auto wallPlaceAction = GameActions::WallPlaceAction( entryInfo->Index, { mapCoord.x, mapCoord.y, z }, rotation, scenery.primaryColour, scenery.secondaryColour, scenery.tertiaryColour); wallPlaceAction.SetFlags(flags); - auto res = flags & GAME_COMMAND_FLAG_APPLY ? GameActions::ExecuteNested(&wallPlaceAction, gameState) - : GameActions::QueryNested(&wallPlaceAction, gameState); + auto res = flags.has(CommandFlag::apply) ? GameActions::ExecuteNested(&wallPlaceAction, gameState) + : GameActions::QueryNested(&wallPlaceAction, gameState); - cost = res.Cost; + cost = res.cost; break; } case ObjectType::paths: @@ -1180,23 +1180,22 @@ static GameActions::Result TrackDesignPlaceSceneryElement( z = scenery.loc.z + originZ; if (mode == 0) { - flags = GAME_COMMAND_FLAG_APPLY; + flags = { CommandFlag::apply }; if (tds.placeOperation == TrackPlaceOperation::placeTrackPreview) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend }; } if (tds.placeOperation == TrackPlaceOperation::placeGhost) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND - | GAME_COMMAND_FLAG_GHOST; + flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }; } if (tds.placeOperation == TrackPlaceOperation::placeQuery) { - flags = 0; + flags = {}; } if (tds.isReplay) { - flags |= GAME_COMMAND_FLAG_REPLAY; + flags.set(CommandFlag::replay); } uint8_t slopeDirection = (scenery.getSlopeDirection() + rotation) & 0x3; FootpathSlope slope = { FootpathSlopeType::flat, slopeDirection }; @@ -1211,10 +1210,10 @@ static GameActions::Result TrackDesignPlaceSceneryElement( auto footpathPlaceAction = GameActions::FootpathLayoutPlaceAction( { mapCoord.x, mapCoord.y, z }, slope, entryInfo->Index, entryInfo->SecondaryIndex, edges, constructFlags); footpathPlaceAction.SetFlags(flags); - auto res = flags & GAME_COMMAND_FLAG_APPLY ? GameActions::ExecuteNested(&footpathPlaceAction, gameState) - : GameActions::QueryNested(&footpathPlaceAction, gameState); + auto res = flags.has(CommandFlag::apply) ? GameActions::ExecuteNested(&footpathPlaceAction, gameState) + : GameActions::QueryNested(&footpathPlaceAction, gameState); // Ignore failures - cost = res.Error == GameActions::Status::Ok ? res.Cost : 0; + cost = res.error == GameActions::Status::ok ? res.cost : 0; } else { @@ -1229,31 +1228,28 @@ static GameActions::Result TrackDesignPlaceSceneryElement( return GameActions::Result(); } - if (tds.placeOperation == TrackPlaceOperation::place) - { - FootpathQueueChainReset(); - FootpathRemoveEdgesAt(mapCoord, reinterpret_cast(pathElement)); - } - - flags = GAME_COMMAND_FLAG_APPLY; + flags = { CommandFlag::apply }; if (tds.placeOperation == TrackPlaceOperation::placeTrackPreview) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend }; } if (tds.placeOperation == TrackPlaceOperation::placeGhost) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND - | GAME_COMMAND_FLAG_GHOST; + flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }; } if (tds.isReplay) { - flags |= GAME_COMMAND_FLAG_REPLAY; + flags.set(CommandFlag::replay); } - if (tds.placeOperation == TrackPlaceOperation::place) + if (tds.placeOperation == TrackPlaceOperation::placeTrackPreview + || tds.placeOperation == TrackPlaceOperation::place) { - FootpathConnectEdges(mapCoord, reinterpret_cast(pathElement), flags); - FootpathUpdateQueueChains(); + if (!pathElement->IsQueue() || FootpathQueueCountConnections(mapCoord, *pathElement) < 2) + { + FootpathRemoveEdgesAt(mapCoord, reinterpret_cast(pathElement)); + FootpathConnectEdges(mapCoord, reinterpret_cast(pathElement), flags); + } } return GameActions::Result(); @@ -1265,7 +1261,7 @@ static GameActions::Result TrackDesignPlaceSceneryElement( } auto res = GameActions::Result(); - res.Cost = cost; + res.cost = cost; return res; } @@ -1299,7 +1295,7 @@ static GameActions::Result TrackDesignPlaceAllScenery( TrackDesignUpdatePreviewBounds(tds, mapCoord); auto placementRes = TrackDesignPlaceSceneryElement(tds, mapCoord, mode, scenery, rotation, origin.z); - if (placementRes.Error != GameActions::Status::Ok) + if (placementRes.error != GameActions::Status::ok) { if (tds.placeOperation != TrackPlaceOperation::removeGhost) { @@ -1307,18 +1303,18 @@ static GameActions::Result TrackDesignPlaceAllScenery( return placementRes; } - if (placementRes.Error == GameActions::Status::NoClearance) + if (placementRes.error == GameActions::Status::noClearance) { // Some scenery might be obstructed, don't abort the entire operation. continue; } } - cost += placementRes.Cost; + cost += placementRes.cost; } } auto res = GameActions::Result(); - res.Cost = cost; + res.cost = cost; return res; } @@ -1358,7 +1354,7 @@ static std::optional TrackDesignPlaceEntrances( if (tile_element == nullptr) { return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); } do @@ -1373,38 +1369,37 @@ static std::optional TrackDesignPlaceEntrances( } auto stationIndex = tile_element->AsTrack()->GetStationIndex(); - uint8_t flags = GAME_COMMAND_FLAG_APPLY; + CommandFlags flags = { CommandFlag::apply }; if (tds.placeOperation == TrackPlaceOperation::placeTrackPreview) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED - | GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend }; } if (tds.placeOperation == TrackPlaceOperation::placeGhost) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND - | GAME_COMMAND_FLAG_GHOST; + flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend, + CommandFlag::ghost }; } if (tds.placeOperation == TrackPlaceOperation::placeQuery) { - flags = 0; + flags = {}; } if (tds.isReplay) { - flags |= GAME_COMMAND_FLAG_REPLAY; + flags.set(CommandFlag::replay); } auto rideEntranceExitPlaceAction = GameActions::RideEntranceExitPlaceAction( newCoords, rotation, rideId, stationIndex, entrance.isExit); rideEntranceExitPlaceAction.SetFlags(flags); - auto res = flags & GAME_COMMAND_FLAG_APPLY + auto res = flags.has(CommandFlag::apply) ? GameActions::ExecuteNested(&rideEntranceExitPlaceAction, gameState) : GameActions::QueryNested(&rideEntranceExitPlaceAction, gameState); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) { return res; } - totalCost += res.Cost; + totalCost += res.cost; tds.entranceExitPlaced = true; _trackDesignPlaceStateEntranceExitPlaced = true; break; @@ -1412,13 +1407,13 @@ static std::optional TrackDesignPlaceEntrances( } else { - auto res = GameActions::RideEntranceExitPlaceAction::TrackPlaceQuery(newCoords, false); - if (res.Error != GameActions::Status::Ok) + auto res = GameActions::RideEntranceExitPlaceAction::TrackPlaceQuery(gameState, newCoords, false); + if (res.error != GameActions::Status::ok) { return res; } - totalCost += res.Cost; + totalCost += res.cost; tds.entranceExitPlaced = true; _trackDesignPlaceStateEntranceExitPlaced = true; } @@ -1438,7 +1433,7 @@ static GameActions::Result TrackDesignPlaceMaze( { if (tds.placeOperation == TrackPlaceOperation::drawOutlines) { - gMapSelectionTiles.clear(); + MapSelection::clearSelectedTiles(); gMapSelectArrowPosition = CoordsXYZ{ origin, TileElementHeight(origin) }; gMapSelectArrowDirection = _currentTrackPieceDirection; } @@ -1466,42 +1461,41 @@ static GameActions::Result TrackDesignPlaceMaze( || tds.placeOperation == TrackPlaceOperation::placeGhost || tds.placeOperation == TrackPlaceOperation::placeTrackPreview) { - uint8_t flags; + CommandFlags flags; money64 cost = 0; uint16_t mazeEntry = Numerics::rol16(maze_element.mazeEntry, rotation * 4); if (tds.placeOperation == TrackPlaceOperation::placeTrackPreview) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend }; } else if (tds.placeOperation == TrackPlaceOperation::placeGhost) { - flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND - | GAME_COMMAND_FLAG_GHOST; + flags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }; } else if (tds.placeOperation == TrackPlaceOperation::placeQuery) { - flags = 0; + flags = {}; } else { - flags = GAME_COMMAND_FLAG_APPLY; + flags = { CommandFlag::apply }; } if (tds.isReplay) { - flags |= GAME_COMMAND_FLAG_REPLAY; + flags.set(CommandFlag::replay); } auto mazePlace = GameActions::MazePlaceTrackAction({ mapCoord, origin.z }, ride.id, mazeEntry); mazePlace.SetFlags(flags); - auto res = flags & GAME_COMMAND_FLAG_APPLY ? GameActions::ExecuteNested(&mazePlace, gameState) - : GameActions::QueryNested(&mazePlace, gameState); - if (res.Error != GameActions::Status::Ok) + auto res = flags.has(CommandFlag::apply) ? GameActions::ExecuteNested(&mazePlace, gameState) + : GameActions::QueryNested(&mazePlace, gameState); + if (res.error != GameActions::Status::ok) { return res; } - cost = res.Cost; + cost = res.cost; totalCost += cost; } @@ -1551,12 +1545,12 @@ static GameActions::Result TrackDesignPlaceMaze( if (tds.placeOperation == TrackPlaceOperation::removeGhost) { auto gameAction = GameActions::RideDemolishAction(ride.id, GameActions::RideModifyType::demolish); - gameAction.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + gameAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); GameActions::Execute(&gameAction, getGameState()); } auto res = GameActions::Result(); - res.Cost = totalCost; + res.cost = totalCost; return res; } @@ -1567,7 +1561,7 @@ static GameActions::Result TrackDesignPlaceRide( tds.origin = origin; if (tds.placeOperation == TrackPlaceOperation::drawOutlines) { - gMapSelectionTiles.clear(); + MapSelection::clearSelectedTiles(); gMapSelectArrowPosition = CoordsXYZ{ origin, TileElementHeight(origin) }; gMapSelectArrowDirection = _currentTrackPieceDirection; } @@ -1605,8 +1599,7 @@ static GameActions::Result TrackDesignPlaceRide( auto trackRemoveAction = GameActions::TrackRemoveAction( trackType, 0, { newCoords, tempZ, static_cast(rotation & 3) }); trackRemoveAction.SetFlags( - GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST - | GAME_COMMAND_FLAG_TRACK_DESIGN); + { CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost, CommandFlag::trackDesign }); GameActions::ExecuteNested(&trackRemoveAction, gameState); break; } @@ -1630,40 +1623,37 @@ static GameActions::Result TrackDesignPlaceRide( liftHillAndAlternativeState.set(LiftHillAndInverted::inverted); } - uint8_t flags = GAME_COMMAND_FLAG_APPLY; + CommandFlags flags = { CommandFlag::apply }; if (tds.placeOperation == TrackPlaceOperation::placeTrackPreview) { - flags |= GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED; - flags |= GAME_COMMAND_FLAG_NO_SPEND; + flags.set(CommandFlag::allowDuringPaused, CommandFlag::noSpend); } else if (tds.placeOperation == TrackPlaceOperation::placeGhost) { - flags |= GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED; - flags |= GAME_COMMAND_FLAG_NO_SPEND; - flags |= GAME_COMMAND_FLAG_GHOST; + flags.set(CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost); } else if (tds.placeOperation == TrackPlaceOperation::placeQuery) { - flags = GAME_COMMAND_FLAG_NO_SPEND; + flags = { CommandFlag::noSpend }; } if (tds.isReplay) { - flags |= GAME_COMMAND_FLAG_REPLAY; + flags.set(CommandFlag::replay); } auto trackPlaceAction = GameActions::TrackPlaceAction( - ride.id, trackType, ride.type, { newCoords, tempZ, static_cast(rotation) }, - track.brakeBoosterSpeed, track.colourScheme, track.seatRotation, liftHillAndAlternativeState, true); + ride.id, trackType, ride.type, { newCoords, tempZ, rotation }, track.brakeBoosterSpeed, track.colourScheme, + track.seatRotation, liftHillAndAlternativeState, true); trackPlaceAction.SetFlags(flags); - auto res = flags & GAME_COMMAND_FLAG_APPLY ? GameActions::ExecuteNested(&trackPlaceAction, gameState) - : GameActions::QueryNested(&trackPlaceAction, gameState); - if (res.Error != GameActions::Status::Ok) + auto res = flags.has(CommandFlag::apply) ? GameActions::ExecuteNested(&trackPlaceAction, gameState) + : GameActions::QueryNested(&trackPlaceAction, gameState); + if (res.error != GameActions::Status::ok) { return res; } - totalCost += res.Cost; + totalCost += res.cost; break; } case TrackPlaceOperation::getPlaceZ: @@ -1682,7 +1672,7 @@ static GameActions::Result TrackDesignPlaceRide( if (surfaceElement == nullptr) { return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } @@ -1740,7 +1730,7 @@ static GameActions::Result TrackDesignPlaceRide( } auto res = GameActions::Result(); - res.Cost = totalCost; + res.cost = totalCost; return res; } @@ -1795,43 +1785,47 @@ static GameActions::Result TrackDesignPlaceVirtual( _currentRideIndex = savedRideId; _currentTrackPieceDirection = savedTrackPieceDirection; - if (trackPlaceRes.Error != GameActions::Status::Ok) + if (trackPlaceRes.error != GameActions::Status::ok) { return trackPlaceRes; } // Scenery elements auto sceneryPlaceRes = TrackDesignPlaceAllScenery(tds, td.sceneryElements, coords.direction); - if (sceneryPlaceRes.Error != GameActions::Status::Ok) + if (sceneryPlaceRes.error != GameActions::Status::ok) { return sceneryPlaceRes; } + if (tds.placeOperation == TrackPlaceOperation::place || tds.placeOperation == TrackPlaceOperation::placeTrackPreview) + { + ride.chainQueues(); + } + // 0x6D0FE6 if (tds.placeOperation == TrackPlaceOperation::drawOutlines) { gMapSelectFlags.set(MapSelectFlag::enableConstruct); gMapSelectFlags.set(MapSelectFlag::enableArrow); gMapSelectFlags.unset(MapSelectFlag::green); - MapInvalidateMapSelectionTiles(); } auto res = GameActions::Result(); - res.Cost = trackPlaceRes.Cost + sceneryPlaceRes.Cost; + res.cost = trackPlaceRes.cost + sceneryPlaceRes.cost; return res; } GameActions::Result TrackDesignPlace( - const TrackDesign& td, uint32_t flags, bool placeScenery, Ride& ride, const CoordsXYZD& coords) + const TrackDesign& td, CommandFlags flags, bool placeScenery, Ride& ride, const CoordsXYZD& coords) { - TrackPlaceOperation ptdOperation = (flags & GAME_COMMAND_FLAG_APPLY) != 0 ? TrackPlaceOperation::place - : TrackPlaceOperation::placeQuery; - if ((flags & GAME_COMMAND_FLAG_APPLY) != 0 && (flags & GAME_COMMAND_FLAG_GHOST) != 0) + TrackPlaceOperation ptdOperation = flags.has(CommandFlag::apply) ? TrackPlaceOperation::place + : TrackPlaceOperation::placeQuery; + if (flags.hasAll(CommandFlag::apply, CommandFlag::ghost)) { ptdOperation = TrackPlaceOperation::placeGhost; } - bool isReplay = flags & GAME_COMMAND_FLAG_REPLAY; + bool isReplay = flags.has(CommandFlag::replay); TrackDesignState tds{}; return TrackDesignPlaceVirtual(tds, td, ptdOperation, placeScenery, ride, coords, isReplay); @@ -1864,10 +1858,11 @@ int32_t TrackDesignGetZPlacement(const TrackDesign& td, Ride& ride, const Coords return TrackDesignGetZPlacement(tds, td, ride, coords); } -static money64 TrackDesignCreateRide(int32_t type, int32_t subType, int32_t flags, RideId* outRideIndex) +static money64 TrackDesignCreateRide(int32_t type, int32_t subType, CommandFlags flags, RideId* outRideIndex) { // Don't set colours as will be set correctly later. - auto gameAction = GameActions::RideCreateAction(type, subType, 0, 0, getGameState().lastEntranceStyle); + auto gameAction = GameActions::RideCreateAction( + type, subType, 0, 0, getGameState().lastEntranceStyle, Config::Get().general.defaultInspectionInterval); gameAction.SetFlags(flags); auto& gameState = getGameState(); @@ -1875,14 +1870,14 @@ static money64 TrackDesignCreateRide(int32_t type, int32_t subType, int32_t flag auto res = GameActions::ExecuteNested(&gameAction, gameState); // Callee's of this function expect kMoney64Undefined in case of failure. - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) { return kMoney64Undefined; } - *outRideIndex = res.GetData(); + *outRideIndex = res.getData(); - return res.Cost; + return res.cost; } /** @@ -1902,7 +1897,7 @@ static bool TrackDesignPlacePreview( auto entry_index = objManager.GetLoadedObjectEntryIndex(td.trackAndVehicle.vehicleObject); RideId rideIndex; - uint8_t rideCreateFlags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND; + CommandFlags rideCreateFlags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend }; if (TrackDesignCreateRide(td.trackAndVehicle.rtdIndex, entry_index, rideCreateFlags, &rideIndex) == kMoney64Undefined) { return false; @@ -1961,7 +1956,7 @@ static bool TrackDesignPlacePreview( { mapSize.x, mapSize.y, z, _currentTrackPieceDirection }); gameState.park.flags = backup_park_flags; - if (res.Error == GameActions::Status::Ok) + if (res.error == GameActions::Status::ok) { if (entry_index == kObjectEntryIndexNull) { @@ -1974,7 +1969,7 @@ static bool TrackDesignPlacePreview( _currentTrackPieceDirection = backup_rotation; _trackDesignDrawingPreview = false; - gameStateData.cost = res.Cost; + gameStateData.cost = res.cost; *outRide = ride; return true; } diff --git a/src/openrct2/ride/TrackDesign.h b/src/openrct2/ride/TrackDesign.h index 9738492bbb4d..59567a0bd5e4 100644 --- a/src/openrct2/ride/TrackDesign.h +++ b/src/openrct2/ride/TrackDesign.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,6 +10,7 @@ #pragma once #include "../Limits.h" +#include "../actions/CommandFlag.h" #include "../actions/GameActionResult.h" #include "../core/EnumUtils.hpp" #include "../object/Object.h" @@ -100,7 +101,7 @@ enum class TrackDesignTrackElementFlag : uint8_t struct TrackDesignTrackElement { - OpenRCT2::TrackElemType type = OpenRCT2::TrackElemType::Flat; + OpenRCT2::TrackElemType type = OpenRCT2::TrackElemType::flat; uint8_t flags = 0; uint8_t colourScheme = 0; ::StationIndex stationIndex = StationIndex::FromUnderlying(0); @@ -238,7 +239,7 @@ extern RideId gTrackDesignSaveRideIndex; void TrackDesignMirror(TrackDesign& td); OpenRCT2::GameActions::Result TrackDesignPlace( - const TrackDesign& td, uint32_t flags, bool placeScenery, Ride& ride, const CoordsXYZD& coords); + const TrackDesign& td, OpenRCT2::GameActions::CommandFlags flags, bool placeScenery, Ride& ride, const CoordsXYZD& coords); void TrackDesignPreviewRemoveGhosts(const TrackDesign& td, Ride& ride, const CoordsXYZD& coords); void TrackDesignPreviewDrawOutlines( TrackDesignState& tds, const TrackDesign& td, Ride& ride, const CoordsXYZD& coords, bool placeScenery); diff --git a/src/openrct2/ride/TrackDesignRepository.cpp b/src/openrct2/ride/TrackDesignRepository.cpp index 379758cb778f..95d79f730ed0 100644 --- a/src/openrct2/ride/TrackDesignRepository.cpp +++ b/src/openrct2/ride/TrackDesignRepository.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/TrackDesignRepository.h b/src/openrct2/ride/TrackDesignRepository.h index b661bea5035f..2769f1ab5d4f 100644 --- a/src/openrct2/ride/TrackDesignRepository.h +++ b/src/openrct2/ride/TrackDesignRepository.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/TrackDesignSave.cpp b/src/openrct2/ride/TrackDesignSave.cpp index cebc468b8009..478643f98559 100644 --- a/src/openrct2/ride/TrackDesignSave.cpp +++ b/src/openrct2/ride/TrackDesignSave.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,7 +11,9 @@ #include "../Diagnostic.h" #include "../Game.h" #include "../audio/Audio.h" +#include "../drawing/Drawing.h" #include "../interface/Viewport.h" +#include "../localisation/Formatter.h" #include "../localisation/StringIds.h" #include "../object/FootpathObject.h" #include "../object/FootpathRailingsObject.h" @@ -283,8 +285,7 @@ static TrackDesignAddStatus TrackDesignSaveAddLargeScenery(const CoordsXY& loc, auto direction = tileElement->GetDirection(); auto sequence = tileElement->GetSequenceIndex(); - auto sceneryOrigin = MapLargeSceneryGetOrigin( - { loc.x, loc.y, z << 3, static_cast(direction) }, sequence, nullptr); + auto sceneryOrigin = MapLargeSceneryGetOrigin({ loc.x, loc.y, z << 3, direction }, sequence, nullptr); if (!sceneryOrigin.has_value()) { return TrackDesignAddStatus::Success(); @@ -298,7 +299,7 @@ static TrackDesignAddStatus TrackDesignSaveAddLargeScenery(const CoordsXY& loc, CoordsXYZ tileLoc = { sceneryOrigin->x + rotatedOffsetPos.x, sceneryOrigin->y + rotatedOffsetPos.y, sceneryOrigin->z + tile.offset.z }; - auto largeElement = MapGetLargeScenerySegment({ tileLoc, static_cast(direction) }, tile.index); + auto largeElement = MapGetLargeScenerySegment({ tileLoc, direction }, tile.index); if (largeElement != nullptr) { if (tile.index == 0) @@ -499,8 +500,7 @@ static void TrackDesignSaveRemoveLargeScenery(const CoordsXY& loc, LargeSceneryE auto direction = tileElement->GetDirection(); auto sequence = tileElement->GetSequenceIndex(); - auto sceneryOrigin = MapLargeSceneryGetOrigin( - { loc.x, loc.y, z << 3, static_cast(direction) }, sequence, nullptr); + auto sceneryOrigin = MapLargeSceneryGetOrigin({ loc.x, loc.y, z << 3, direction }, sequence, nullptr); if (!sceneryOrigin) { return; @@ -514,7 +514,7 @@ static void TrackDesignSaveRemoveLargeScenery(const CoordsXY& loc, LargeSceneryE CoordsXYZ tileLoc = { sceneryOrigin->x + rotatedOffsetPos.x, sceneryOrigin->y + rotatedOffsetPos.y, sceneryOrigin->z + tile.offset.z }; - auto largeElement = MapGetLargeScenerySegment({ tileLoc, static_cast(direction) }, tile.index); + auto largeElement = MapGetLargeScenerySegment({ tileLoc, direction }, tile.index); if (largeElement != nullptr) { if (tile.index == 0) diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index 3ffcf818a853..9c35572f0b73 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -247,7 +247,7 @@ static bool TrackPaintUtilDrawStationImpl( // height += 5 (height + 5); hasFence = TrackPaintUtilHasFence(EDGE_NW, position, trackElement, ride, session.CurrentRotation); - if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 0) + if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 0) { if (hasGreenLight) { @@ -260,7 +260,7 @@ static bool TrackPaintUtilDrawStationImpl( hasFence ? SPR_STATION_PLATFORM_FENCED_END_RED_LIGHT_SW_NE : SPR_STATION_PLATFORM_END_RED_LIGHT_SW_NE); } } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 2) { imageId = session.SupportColours.WithIndex( (hasFence ? SPR_STATION_PLATFORM_BEGIN_FENCED_SW_NE : SPR_STATION_PLATFORM_BEGIN_SW_NE)); @@ -275,12 +275,12 @@ static bool TrackPaintUtilDrawStationImpl( TrackPaintUtilDrawStationCovers(session, EDGE_NW, hasFence, stationObj, coverHeight, stationColourScheme); // height += 5 (height + 5) - if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 0) + if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 0) { imageId = session.SupportColours.WithIndex( (hasGreenLight ? SPR_STATION_PLATFORM_END_GREEN_LIGHT_SW_NE : SPR_STATION_PLATFORM_END_RED_LIGHT_SW_NE)); } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 2) { imageId = session.SupportColours.WithIndex(SPR_STATION_PLATFORM_BEGIN_SW_NE); } @@ -294,11 +294,11 @@ static bool TrackPaintUtilDrawStationImpl( hasFence = TrackPaintUtilHasFence(EDGE_SE, position, trackElement, ride, session.CurrentRotation); if (hasFence) { - if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 0) + if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 0) { imageId = session.SupportColours.WithIndex(SPR_STATION_BEGIN_ANGLE_FENCE_SW_NE); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 2) { imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_ANGLE_FENCED_NE_SW); } @@ -308,13 +308,13 @@ static bool TrackPaintUtilDrawStationImpl( } PaintAddImageAsParent(session, imageId, { 0, 31, height + fenceOffsetB }, { 32, 1, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 0) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 0) { // Addition: draw only small fence if there is an entrance/exit at the beginning imageId = session.SupportColours.WithIndex(SPR_STATION_FENCE_SMALL_NW_SE); PaintAddImageAsParent(session, imageId, { 31, 23, height + fenceOffsetB }, { 1, 8, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 2) { // Addition: draw only small fence if there is an entrance/exit at the end imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_NE_SW); @@ -324,12 +324,12 @@ static bool TrackPaintUtilDrawStationImpl( TrackPaintUtilDrawStationCovers(session, EDGE_SE, hasFence, stationObj, coverHeight, stationColourScheme); // height += 7 (height + 7) - if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 0) + if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 0) { imageId = session.SupportColours.WithIndex(SPR_STATION_FENCE_SMALL_NW_SE); PaintAddImageAsParent(session, imageId, { 31, 0, height + fenceOffsetB }, { 1, 8, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 2) { imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_NE_SW); PaintAddImageAsParent(session, imageId, { 31, 0, height + fenceOffsetB }, { 1, 8, 7 }); @@ -344,7 +344,7 @@ static bool TrackPaintUtilDrawStationImpl( // height += 5 (height + 5); hasFence = TrackPaintUtilHasFence(EDGE_NE, position, trackElement, ride, session.CurrentRotation); - if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 3) + if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 3) { if (hasGreenLight) { @@ -357,7 +357,7 @@ static bool TrackPaintUtilDrawStationImpl( hasFence ? SPR_STATION_PLATFORM_FENCED_END_RED_LIGHT_NW_SE : SPR_STATION_PLATFORM_END_RED_LIGHT_NW_SE); } } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 1) { imageId = session.SupportColours.WithIndex( (hasFence ? SPR_STATION_PLATFORM_BEGIN_FENCED_NW_SE : SPR_STATION_PLATFORM_BEGIN_NW_SE)); @@ -372,12 +372,12 @@ static bool TrackPaintUtilDrawStationImpl( TrackPaintUtilDrawStationCovers(session, EDGE_NE, hasFence, stationObj, coverHeight, stationColourScheme); // height += 5 (height + 5) - if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 3) + if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 3) { imageId = session.SupportColours.WithIndex( (hasGreenLight ? SPR_STATION_PLATFORM_END_GREEN_LIGHT_NW_SE : SPR_STATION_PLATFORM_END_RED_LIGHT_NW_SE)); } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 1) { imageId = session.SupportColours.WithIndex(SPR_STATION_PLATFORM_BEGIN_NW_SE); } @@ -391,11 +391,11 @@ static bool TrackPaintUtilDrawStationImpl( hasFence = TrackPaintUtilHasFence(EDGE_SW, position, trackElement, ride, session.CurrentRotation); if (hasFence) { - if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 3) + if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 3) { imageId = session.SupportColours.WithIndex(SPR_STATION_BEGIN_ANGLE_FENCE_NW_SE); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 1) { imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_ANGLE_FENCED_NW_SE); } @@ -405,13 +405,13 @@ static bool TrackPaintUtilDrawStationImpl( } PaintAddImageAsParent(session, imageId, { 31, 0, height + fenceOffsetB }, { 1, 32, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 3) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 3) { // Addition: draw only small fence if there is an entrance/exit at the beginning imageId = session.SupportColours.WithIndex(SPR_STATION_FENCE_SMALL_SW_NE); PaintAddImageAsParent(session, imageId, { 23, 31, height + fenceOffsetB }, { 8, 1, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 1) { // Addition: draw only small fence if there is an entrance/exit at the end imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_NW_SE); @@ -422,12 +422,12 @@ static bool TrackPaintUtilDrawStationImpl( TrackPaintUtilDrawStationCovers(session, EDGE_SW, hasFence, stationObj, coverHeight, stationColourScheme); // height += 7 (height + 7) - if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 3) + if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 3) { imageId = session.SupportColours.WithIndex(SPR_STATION_FENCE_SMALL_SW_NE); PaintAddImageAsParent(session, imageId, { 0, 31, height + fenceOffsetB }, { 8, 1, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 1) { imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_NW_SE); PaintAddImageAsParent(session, imageId, { 0, 31, height + fenceOffsetB }, { 8, 1, 7 }); @@ -460,7 +460,7 @@ bool TrackPaintUtilDrawStationInverted( // height += 5 (height + 5); hasFence = TrackPaintUtilHasFence(EDGE_NW, position, trackElement, ride, session.CurrentRotation); - if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 0) + if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 0) { if (hasGreenLight) { @@ -473,7 +473,7 @@ bool TrackPaintUtilDrawStationInverted( hasFence ? SPR_STATION_PLATFORM_FENCED_END_RED_LIGHT_SW_NE : SPR_STATION_PLATFORM_END_RED_LIGHT_SW_NE); } } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 2) { imageId = session.SupportColours.WithIndex( (hasFence ? SPR_STATION_PLATFORM_BEGIN_FENCED_SW_NE : SPR_STATION_PLATFORM_BEGIN_SW_NE)); @@ -488,12 +488,12 @@ bool TrackPaintUtilDrawStationInverted( TrackPaintUtilDrawStationCovers2(session, EDGE_NW, hasFence, stationObj, height, stationVariant, colour); // height += 5 (height + 5) - if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 0) + if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 0) { imageId = session.SupportColours.WithIndex( (hasGreenLight ? SPR_STATION_PLATFORM_END_GREEN_LIGHT_SW_NE : SPR_STATION_PLATFORM_END_RED_LIGHT_SW_NE)); } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 2) { imageId = session.SupportColours.WithIndex(SPR_STATION_PLATFORM_BEGIN_SW_NE); } @@ -507,11 +507,11 @@ bool TrackPaintUtilDrawStationInverted( hasFence = TrackPaintUtilHasFence(EDGE_SE, position, trackElement, ride, session.CurrentRotation); if (hasFence) { - if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 0) + if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 0) { imageId = session.SupportColours.WithIndex(SPR_STATION_INVERTED_BEGIN_ANGLE_FENCE_SW_NE); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 2) { imageId = session.SupportColours.WithIndex(SPR_STATION_INVERTED_LIGHT_BACK_ANGLE_FENCED_NE_SW); } @@ -521,13 +521,13 @@ bool TrackPaintUtilDrawStationInverted( } PaintAddImageAsParent(session, imageId, { 0, 31, height + 8 }, { 32, 1, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 0) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 0) { // Addition: draw only small fence if there is an entrance/exit at the beginning imageId = session.SupportColours.WithIndex(SPR_STATION_FENCE_SMALL_NW_SE); PaintAddImageAsParent(session, imageId, { 31, 23, height + 8 }, { 1, 8, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 2) { // Addition: draw only small fence if there is an entrance/exit at the end imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_NE_SW); @@ -537,12 +537,12 @@ bool TrackPaintUtilDrawStationInverted( TrackPaintUtilDrawStationCovers2(session, EDGE_SE, hasFence, stationObj, height, stationVariant, colour); // height += 7 (height + 7) - if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 0) + if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 0) { imageId = session.SupportColours.WithIndex(SPR_STATION_FENCE_SMALL_NW_SE); PaintAddImageAsParent(session, imageId, { 31, 0, height + 8 }, { 1, 8, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 2) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 2) { imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_NE_SW); PaintAddImageAsParent(session, imageId, { 31, 0, height + 8 }, { 1, 8, 7 }); @@ -557,7 +557,7 @@ bool TrackPaintUtilDrawStationInverted( // height += 5 (height + 5); hasFence = TrackPaintUtilHasFence(EDGE_NE, position, trackElement, ride, session.CurrentRotation); - if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 3) + if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 3) { if (hasGreenLight) { @@ -570,7 +570,7 @@ bool TrackPaintUtilDrawStationInverted( hasFence ? SPR_STATION_PLATFORM_FENCED_END_RED_LIGHT_NW_SE : SPR_STATION_PLATFORM_END_RED_LIGHT_NW_SE); } } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 1) { imageId = session.SupportColours.WithIndex( (hasFence ? SPR_STATION_PLATFORM_BEGIN_FENCED_NW_SE : SPR_STATION_PLATFORM_BEGIN_NW_SE)); @@ -585,12 +585,12 @@ bool TrackPaintUtilDrawStationInverted( TrackPaintUtilDrawStationCovers2(session, EDGE_NE, hasFence, stationObj, height, stationVariant, colour); // height += 5 (height + 5) - if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 3) + if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 3) { imageId = session.SupportColours.WithIndex( (hasGreenLight ? SPR_STATION_PLATFORM_END_GREEN_LIGHT_NW_SE : SPR_STATION_PLATFORM_END_RED_LIGHT_NW_SE)); } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 1) { imageId = session.SupportColours.WithIndex(SPR_STATION_PLATFORM_BEGIN_NW_SE); } @@ -604,11 +604,11 @@ bool TrackPaintUtilDrawStationInverted( hasFence = TrackPaintUtilHasFence(EDGE_SW, position, trackElement, ride, session.CurrentRotation); if (hasFence) { - if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 3) + if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 3) { imageId = session.SupportColours.WithIndex(SPR_STATION_INVERTED_BEGIN_ANGLE_FENCE_NW_SE); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 1) { imageId = session.SupportColours.WithIndex(SPR_STATION_INVERTED_LIGHT_BACK_ANGLE_FENCED_NW_SE); } @@ -618,13 +618,13 @@ bool TrackPaintUtilDrawStationInverted( } PaintAddImageAsParent(session, imageId, { 31, 0, height + 8 }, { 1, 32, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 3) + else if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 3) { // Addition: draw only small fence if there is an entrance/exit at the beginning imageId = session.SupportColours.WithIndex(SPR_STATION_FENCE_SMALL_SW_NE); PaintAddImageAsParent(session, imageId, { 23, 31, height + 8 }, { 8, 1, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 1) { // Addition: draw only small fence if there is an entrance/exit at the end imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_NW_SE); @@ -635,12 +635,12 @@ bool TrackPaintUtilDrawStationInverted( TrackPaintUtilDrawStationCovers2(session, EDGE_SW, hasFence, stationObj, height, stationVariant, colour); // height += 7 (height + 7) - if (trackElement.GetTrackType() == TrackElemType::BeginStation && direction == 3) + if (trackElement.GetTrackType() == TrackElemType::beginStation && direction == 3) { imageId = session.SupportColours.WithIndex(SPR_STATION_FENCE_SMALL_SW_NE); PaintAddImageAsParent(session, imageId, { 0, 31, height + 8 }, { 8, 1, 7 }); } - else if (trackElement.GetTrackType() == TrackElemType::EndStation && direction == 1) + else if (trackElement.GetTrackType() == TrackElemType::endStation && direction == 1) { imageId = session.SupportColours.WithIndex(SPR_STATION_LIGHT_BACK_NW_SE); PaintAddImageAsParent(session, imageId, { 0, 31, height + 8 }, { 8, 1, 7 }); @@ -1793,10 +1793,18 @@ void TrackPaintUtilSpinningTunnelPaint(PaintSession& session, int8_t thickness, } } +void TrackPaintUtilOnridePhotoPlatformPaintBase(PaintSession& session, int32_t height) +{ + auto image = ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK); + if (session.TrackColours == ConstructionMarker) + image = session.TrackColours.WithIndex(SPR_STATION_BASE_BORDERLESS); + PaintAddImageAsParent(session, image, { 0, 0, height }, { 32, 32, 1 }); +} + void TrackPaintUtilOnridePhotoPlatformPaint( PaintSession& session, Direction direction, int32_t height, MetalSupportType supportType) { - PaintAddImageAsParent(session, ImageId(SPR_STATION_BASE_BORDERLESS, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 }); + TrackPaintUtilOnridePhotoPlatformPaintBase(session, height); DrawSupportsSideBySide(session, direction, height, session.SupportColours, supportType); } @@ -1978,7 +1986,8 @@ void PaintTrack(PaintSession& session, Direction direction, int32_t height, cons { session.InteractionType = ViewportInteractionItem::none; const auto& ted = GetTrackElementDescriptor(trackType); - if (ted.heightMarkerPositions & (1 << trackSequence)) + if ((trackType == TrackElemType::maze) + || (trackSequence < ted.numSequences && ted.sequences[trackSequence].flags.has(SequenceFlag::hasHeightMarker))) { uint16_t ax = ride->getRideTypeDescriptor().Heights.VehicleZOffset; // 0x1689 represents 0 height there are -127 to 128 heights above and below it @@ -1999,7 +2008,7 @@ void PaintTrack(PaintSession& session, Direction direction, int32_t height, cons zOffset = 23; const auto* originElement = ride->getOriginElement(StationIndex::FromUnderlying(0)); - if (originElement != nullptr && originElement->GetTrackType() == TrackElemType::FlatTrack1x1B) + if (originElement != nullptr && originElement->GetTrackType() == TrackElemType::flatTrack1x1B) LightFx::AddKioskLights(session.MapPosition, height, zOffset); else if (kRideTypeDescriptors[ride->type].HasFlag(RtdFlag::isShopOrFacility)) LightFx::AddShopLights(session.MapPosition, trackElement.GetDirection(), height, zOffset); diff --git a/src/openrct2/ride/TrackPaint.h b/src/openrct2/ride/TrackPaint.h index 50bcf26b945a..fd47663105e3 100644 --- a/src/openrct2/ride/TrackPaint.h +++ b/src/openrct2/ride/TrackPaint.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -499,6 +499,7 @@ void TrackPaintUtilLeftQuarterTurn1TilePaint( const ImageId colourFlags, const uint32_t* sprites); void TrackPaintUtilSpinningTunnelPaint(PaintSession& session, int8_t thickness, int16_t height, Direction direction); +void TrackPaintUtilOnridePhotoPlatformPaintBase(PaintSession& session, int32_t height); /** * Renders the black metal platform and the supports of the on-ride photo section. * diff --git a/src/openrct2/ride/TrackStyle.cpp b/src/openrct2/ride/TrackStyle.cpp index 1d926da03fa2..c96641e77dbe 100644 --- a/src/openrct2/ride/TrackStyle.cpp +++ b/src/openrct2/ride/TrackStyle.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/TrackStyle.h b/src/openrct2/ride/TrackStyle.h index 5d1495359e4f..06751d9ea052 100644 --- a/src/openrct2/ride/TrackStyle.h +++ b/src/openrct2/ride/TrackStyle.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/TrainManager.cpp b/src/openrct2/ride/TrainManager.cpp index 4aad73ac8950..cc39b2b71146 100644 --- a/src/openrct2/ride/TrainManager.cpp +++ b/src/openrct2/ride/TrainManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/TrainManager.h b/src/openrct2/ride/TrainManager.h index 654820f56fc8..d6596c79b5d8 100644 --- a/src/openrct2/ride/TrainManager.h +++ b/src/openrct2/ride/TrainManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 0e4a0b928907..3bd210e8a504 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,13 +12,10 @@ #include "../Context.h" #include "../Diagnostic.h" #include "../Editor.h" -#include "../Game.h" #include "../GameState.h" #include "../OpenRCT2.h" #include "../actions/RideSetStatusAction.h" #include "../audio/Audio.h" -#include "../audio/AudioChannel.h" -#include "../audio/AudioMixer.h" #include "../config/Config.h" #include "../core/EnumUtils.hpp" #include "../core/FixedPoint.hpp" @@ -35,7 +32,6 @@ #include "../math/Trigonometry.hpp" #include "../object/SmallSceneryEntry.h" #include "../paint/vehicle/Vehicle.MiniGolf.h" -#include "../platform/Platform.h" #include "../profiling/Profiling.h" #include "../rct12/RCT12.h" #include "../scenario/Scenario.h" @@ -46,18 +42,14 @@ #include "../windows/Intent.h" #include "../world/Map.h" #include "../world/MapAnimation.h" -#include "../world/Park.h" -#include "../world/Scenery.h" #include "../world/tile_element/LargeSceneryElement.h" #include "../world/tile_element/PathElement.h" #include "../world/tile_element/SmallSceneryElement.h" #include "../world/tile_element/SurfaceElement.h" #include "../world/tile_element/TrackElement.h" #include "../world/tile_element/WallElement.h" -#include "CableLift.h" #include "Ride.h" #include "RideData.h" -#include "Station.h" #include "Track.h" #include "TrackData.h" #include "TrainManager.h" @@ -71,7 +63,6 @@ using namespace OpenRCT2; using namespace OpenRCT2::Audio; using namespace OpenRCT2::TrackMetaData; -using namespace OpenRCT2::Math::Trigonometry; using namespace OpenRCT2::RideVehicle; static bool vehicle_boat_is_location_accessible(const CoordsXYZ& location); @@ -97,287 +88,17 @@ uint8_t _vehicleF64E2C; Vehicle* _vehicleFrontVehicle; CoordsXYZ _vehicleCurPosition; -static constexpr OpenRCT2::Audio::SoundId _screamSetMisc[] = { - OpenRCT2::Audio::SoundId::scream8, - OpenRCT2::Audio::SoundId::scream1, +static constexpr SoundId _screamSetMisc[] = { + SoundId::scream8, + SoundId::scream1, }; -static constexpr OpenRCT2::Audio::SoundId _screamSetWooden[] = { - OpenRCT2::Audio::SoundId::scream3, OpenRCT2::Audio::SoundId::scream1, OpenRCT2::Audio::SoundId::scream5, - OpenRCT2::Audio::SoundId::scream6, OpenRCT2::Audio::SoundId::scream7, OpenRCT2::Audio::SoundId::scream2, - OpenRCT2::Audio::SoundId::scream4, +static constexpr SoundId _screamSetWooden[] = { + SoundId::scream3, SoundId::scream1, SoundId::scream5, SoundId::scream6, + SoundId::scream7, SoundId::scream2, SoundId::scream4, }; -static constexpr OpenRCT2::Audio::SoundId _screamSetSteel[] = { - OpenRCT2::Audio::SoundId::scream1, - OpenRCT2::Audio::SoundId::scream6, -}; - -// clang-format off -static constexpr uint8_t kSpaceRingsTimeToSpriteMap[] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, - 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, - 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, - 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, - 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 0, - 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, - 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, - 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, - 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, - 21, 22, 22, 22, 23, 23, 23, 0, 0, 0, 1, 1, 1, 2, 2, 2, - 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, - 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, - 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, - 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 0, - 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, - 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, - 2, 1, 1, 1, 1, 0, 0, 0, 0, 23, 23, 23, 22, 22, 22, 21, - 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, - 16, 15, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, - 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 5, - 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, - 0, 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, - 18, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, - 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, - 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, - 2, 2, 2, 1, 1, 1, 0, 0, 0, 23, 23, 23, 22, 22, 22, 21, - 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, - 16, 15, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, - 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, - 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, - 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, - 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 27, - 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, - 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, - 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, - 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, - 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, - 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, - 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, - 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, - 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, - 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, - 78, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, - 82, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, - 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 86, 86, 86, 86, 86, 86, 86, 85, - 85, 85, 85, 85, 85, 84, 84, 84, 84, 84, 84, 83, 83, 83, 83, 83, - 82, 82, 82, 82, 82, 81, 81, 81, 81, 80, 80, 80, 80, 79, 79, 79, - 78, 78, 78, 77, 77, 77, 76, 76, 76, 75, 75, 75, 74, 74, 74, 73, - 73, 73, 72, 72, 72, 71, 71, 71, 70, 70, 70, 69, 69, 69, 68, 68, - 68, 67, 67, 67, 66, 66, 66, 65, 65, 65, 64, 64, 64, 63, 63, 63, - 62, 62, 62, 61, 61, 61, 60, 60, 60, 59, 59, 59, 58, 58, 58, 57, - 57, 57, 56, 56, 56, 55, 55, 55, 54, 54, 54, 53, 53, 53, 52, 52, - 52, 51, 51, 51, 50, 50, 50, 49, 49, 49, 48, 48, 48, 47, 47, 47, - 46, 46, 46, 45, 45, 45, 44, 44, 44, 43, 43, 43, 42, 42, 42, 41, - 41, 41, 40, 40, 40, 39, 39, 39, 38, 38, 38, 37, 37, 37, 36, 36, - 36, 35, 35, 35, 34, 34, 34, 33, 33, 33, 32, 32, 32, 31, 31, 31, - 30, 30, 30, 30, 29, 29, 29, 29, 28, 28, 28, 28, 28, 27, 27, 27, - 27, 27, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 24, 24, - 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, - 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, - 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, - 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, - 22, 22, 22, 23, 23, 23, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, - 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, - 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, - 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, - 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 0, 0, - 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, - 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, - 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, - 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, - 22, 22, 22, 23, 23, 23, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, - 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, - 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, - 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, - 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 13, - 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, 8, - 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, - 2, 2, 1, 1, 1, 0, 0, 0, 23, 23, 23, 22, 22, 22, 21, 21, - 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, 16, - 15, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, - 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 5, 5, - 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, - 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, - 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 13, - 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, 8, - 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, - 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, - 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, - 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, - 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, - 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, - 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, - 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, - 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, - 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, - 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, - 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 80, 81, - 81, 81, 81, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 84, 84, 84, - 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, - 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 86, - 86, 86, 86, 86, 86, 86, 85, 85, 85, 85, 85, 85, 84, 84, 84, 84, - 84, 84, 83, 83, 83, 83, 83, 82, 82, 82, 82, 82, 81, 81, 81, 81, - 80, 80, 80, 80, 79, 79, 79, 78, 78, 78, 77, 77, 77, 76, 76, 76, - 75, 75, 75, 74, 74, 74, 73, 73, 73, 72, 72, 72, 71, 71, 71, 70, - 70, 70, 69, 69, 69, 68, 68, 68, 67, 67, 67, 66, 66, 66, 65, 65, - 65, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 61, 60, 60, 60, - 59, 59, 59, 58, 58, 58, 57, 57, 57, 56, 56, 56, 55, 55, 55, 54, - 54, 54, 53, 53, 53, 52, 52, 52, 51, 51, 51, 50, 50, 50, 49, 49, - 49, 48, 48, 48, 47, 47, 47, 46, 46, 46, 45, 45, 45, 44, 44, 44, - 43, 43, 43, 42, 42, 42, 41, 41, 41, 40, 40, 40, 39, 39, 39, 38, - 38, 38, 37, 37, 37, 36, 36, 36, 35, 35, 35, 34, 34, 34, 33, 33, - 33, 32, 32, 32, 31, 31, 31, 30, 30, 30, 30, 29, 29, 29, 29, 28, - 28, 28, 28, 28, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 25, - 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 0, - 255, -}; -// clang-format on - -static constexpr int8_t kSwingingTimeToSpriteMap0[] = { - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, 0, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap1[] = { - 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, -1, -1, -1, -1, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, - -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap2[] = { - 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, - 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, - -1, -1, -1, -2, -2, -2, -3, -3, -3, -3, -4, -4, -4, -4, -4, -5, -5, -5, -5, -5, -5, -6, -6, -6, -6, -6, - -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, - -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap3[] = { - 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, -1, - -1, -2, -2, -3, -3, -4, -4, -4, -5, -5, -5, -5, -6, -6, -6, -6, -6, -7, -7, -7, -7, -7, -7, -8, -8, -8, -8, - -8, -8, -8, -8, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, - -7, -7, -7, -7, -6, -6, -6, -6, -6, -5, -5, -5, -5, -4, -4, -4, -3, -3, -2, -2, -1, -1, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap4[] = { - 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, - 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, - 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, -1, - -1, -1, -1, -1, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -5, -5, -5, -5, -5, -5, -5, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -4, -4, - -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap5[] = { - 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, - 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, - 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, - 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, - 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, -1, -1, -1, -1, -2, -2, -2, -2, -3, -3, -3, -3, - -4, -4, -4, -4, -5, -5, -5, -5, -6, -6, -6, -6, -7, -7, -7, -7, -8, -8, -8, -8, -9, -9, -9, -9, - -10, -10, -10, -10, -11, -11, -11, -11, -12, -12, -12, -12, -13, -13, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, - -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, - -5, -5, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, 0, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap6[] = { - 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, - 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, - 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, - 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 22, - 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 15, - 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, - 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, -1, - -1, -1, -2, -2, -2, -3, -3, -3, -4, -4, -4, -5, -5, -5, -6, -6, -6, -7, -7, -7, -8, -8, -8, - -9, -9, -9, -10, -10, -10, -11, -11, -11, -12, -12, -12, -13, -13, -13, -14, -14, -14, -15, -15, -15, -16, -16, - -16, -17, -17, -17, -18, -18, -18, -19, -19, -19, -20, -20, -20, -21, -21, -21, -22, -22, -22, -23, -23, -23, -23, - -23, -24, -24, -24, -24, -24, -24, -24, -24, -24, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, - -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, - -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, - -6, -6, -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -1, 0, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap7[] = { - 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, - 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, - 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, - 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, - 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, -35, - -35, -35, -34, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31, -31, -30, -30, -30, -29, -29, -29, -28, -28, - -28, -27, -27, -27, -26, -26, -26, -25, -25, -25, -24, -24, -24, -23, -23, -23, -22, -22, -22, -21, -21, -21, - -20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, - -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, - -6, -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -1, 0, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap8[] = { - 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, - 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, - 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 31, - 31, 31, 31, 31, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, - 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 0, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap9[] = { - 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, - 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, - 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 31, - 31, 31, 31, 31, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, - 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 0, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap10[] = { - 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, - 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 11, - 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, - 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 31, 31, 31, 31, 30, 30, 30, 30, 29, 29, 29, 29, 28, - 28, 28, 28, 27, 27, 27, 27, 26, 26, 26, 26, 25, 25, 25, 25, 24, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 22, 21, 21, 21, - 21, 20, 20, 20, 20, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, - 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, - 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 0, 0, -128, -}; -static constexpr int8_t kSwingingTimeToSpriteMap11[] = { - 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, - 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, - 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, - 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 0, -128, -}; - -/** rct2: 0x0099F9D0 */ -static constexpr const int8_t* SwingingTimeToSpriteMaps[] = { - kSwingingTimeToSpriteMap0, kSwingingTimeToSpriteMap1, kSwingingTimeToSpriteMap2, kSwingingTimeToSpriteMap3, - kSwingingTimeToSpriteMap4, kSwingingTimeToSpriteMap5, kSwingingTimeToSpriteMap6, kSwingingTimeToSpriteMap7, - kSwingingTimeToSpriteMap8, kSwingingTimeToSpriteMap9, kSwingingTimeToSpriteMap10, kSwingingTimeToSpriteMap11, +static constexpr SoundId _screamSetSteel[] = { + SoundId::scream1, + SoundId::scream6, }; /** rct2: 0x009A37C4 */ @@ -393,19 +114,19 @@ static constexpr CoordsXY kSurroundingTiles[] = { { 0, +kCoordsXYStep }, }; -static constexpr OpenRCT2::Audio::SoundId kDoorOpenSoundIds[] = { - OpenRCT2::Audio::SoundId::null, // DoorSoundType::none - OpenRCT2::Audio::SoundId::doorOpen, // DoorSoundType::door - OpenRCT2::Audio::SoundId::portcullis, // DoorSoundType::portcullis +static constexpr SoundId kDoorOpenSoundIds[] = { + SoundId::null, // DoorSoundType::none + SoundId::doorOpen, // DoorSoundType::door + SoundId::portcullis, // DoorSoundType::portcullis }; -static_assert(std::size(kDoorOpenSoundIds) == OpenRCT2::Audio::kDoorSoundTypeCount); +static_assert(std::size(kDoorOpenSoundIds) == kDoorSoundTypeCount); -static constexpr OpenRCT2::Audio::SoundId kDoorCloseSoundIds[] = { - OpenRCT2::Audio::SoundId::null, // DoorSoundType::none - OpenRCT2::Audio::SoundId::doorClose, // DoorSoundType::door - OpenRCT2::Audio::SoundId::portcullis, // DoorSoundType::portcullis +static constexpr SoundId kDoorCloseSoundIds[] = { + SoundId::null, // DoorSoundType::none + SoundId::doorClose, // DoorSoundType::door + SoundId::portcullis, // DoorSoundType::portcullis }; -static_assert(std::size(kDoorCloseSoundIds) == OpenRCT2::Audio::kDoorSoundTypeCount); +static_assert(std::size(kDoorCloseSoundIds) == kDoorSoundTypeCount); template<> bool EntityBase::Is() const @@ -421,25 +142,25 @@ bool EntityBase::Is() const */ static void InvokeVehicleCrashHook(const EntityId vehicleId, const std::string_view crashId) { - auto& hookEngine = OpenRCT2::GetContext()->GetScriptEngine().GetHookEngine(); - if (hookEngine.HasSubscriptions(OpenRCT2::Scripting::HookType::vehicleCrash)) + auto& hookEngine = GetContext()->GetScriptEngine().GetHookEngine(); + if (hookEngine.HasSubscriptions(Scripting::HookType::vehicleCrash)) { - auto ctx = OpenRCT2::GetContext()->GetScriptEngine().GetContext(); + auto ctx = GetContext()->GetScriptEngine().GetContext(); // Create event args object - auto obj = OpenRCT2::Scripting::DukObject(ctx); + auto obj = Scripting::DukObject(ctx); obj.Set("id", vehicleId.ToUnderlying()); obj.Set("crashIntoType", crashId); // Call the subscriptions auto e = obj.Take(); - hookEngine.Call(OpenRCT2::Scripting::HookType::vehicleCrash, e, true); + hookEngine.Call(Scripting::HookType::vehicleCrash, e, true); } } #endif static bool vehicle_move_info_valid( - VehicleTrackSubposition trackSubposition, OpenRCT2::TrackElemType type, uint8_t direction, int32_t offset) + VehicleTrackSubposition trackSubposition, TrackElemType type, uint8_t direction, int32_t offset) { uint16_t typeAndDirection = (EnumValue(type) << 2) | (direction & 3); @@ -496,7 +217,7 @@ static bool vehicle_move_info_valid( } static const VehicleInfo* vehicle_get_move_info( - VehicleTrackSubposition trackSubposition, OpenRCT2::TrackElemType type, uint8_t direction, int32_t offset) + VehicleTrackSubposition trackSubposition, TrackElemType type, uint8_t direction, int32_t offset) { uint16_t typeAndDirection = (EnumValue(type) << 2) | (direction & 3); @@ -513,7 +234,7 @@ const VehicleInfo* Vehicle::GetMoveInfo() const return vehicle_get_move_info(TrackSubposition, GetTrackType(), GetTrackDirection(), track_progress); } -uint16_t VehicleGetMoveInfoSize(VehicleTrackSubposition trackSubposition, OpenRCT2::TrackElemType type, uint8_t direction) +uint16_t VehicleGetMoveInfoSize(VehicleTrackSubposition trackSubposition, TrackElemType type, uint8_t direction) { uint16_t typeAndDirection = (EnumValue(type) << 2) | (direction & 3); @@ -550,12 +271,12 @@ void Vehicle::UpdateTrackChange() return; const auto moveInfo = GetMoveInfo(); - if (moveInfo == nullptr || moveInfo->IsInvalid()) + if (moveInfo == nullptr || moveInfo->isInvalid()) return; _vehicleCurPosition = TrackLocation + CoordsXYZ{ moveInfo->x, moveInfo->y, moveInfo->z + GetRideTypeDescriptor((*curRide).type).Heights.VehicleZOffset }; - Orientation = moveInfo->direction; + Orientation = moveInfo->yaw; roll = moveInfo->roll; pitch = moveInfo->pitch; MoveTo(_vehicleCurPosition); @@ -568,7 +289,7 @@ Vehicle* TryGetVehicle(EntityId spriteIndex) void VehicleSoundsUpdate() { - auto windowManager = OpenRCT2::Ui::GetWindowManager(); + auto windowManager = Ui::GetWindowManager(); windowManager->BroadcastIntent(Intent(INTENT_ACTION_UPDATE_VEHICLE_SOUNDS)); } @@ -617,10 +338,10 @@ bool Vehicle::CloseRestraints() RideBreakdownAddNewsItem(*curRide); - curRide->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST - | RIDE_INVALIDATE_RIDE_MAINTENANCE; + curRide->windowInvalidateFlags.set( + RideInvalidateFlag::main, RideInvalidateFlag::list, RideInvalidateFlag::maintenance); - curRide->mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; + curRide->mechanicStatus = MechanicStatus::calling; Vehicle* broken_vehicle = getGameState().entities.GetEntity(curRide->vehicles[curRide->brokenTrain]); if (broken_vehicle != nullptr) @@ -733,10 +454,10 @@ bool Vehicle::OpenRestraints() RideBreakdownAddNewsItem(*curRide); - curRide->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST - | RIDE_INVALIDATE_RIDE_MAINTENANCE; + curRide->windowInvalidateFlags.set( + RideInvalidateFlag::main, RideInvalidateFlag::list, RideInvalidateFlag::maintenance); - curRide->mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; + curRide->mechanicStatus = MechanicStatus::calling; Vehicle* broken_vehicle = getGameState().entities.GetEntity(curRide->vehicles[curRide->brokenTrain]); if (broken_vehicle != nullptr) @@ -762,31 +483,29 @@ bool Vehicle::OpenRestraints() return restraintsOpen; } -void RideUpdateMeasurementsSpecialElements_Default(Ride& ride, const OpenRCT2::TrackElemType trackType) +void RideUpdateMeasurementsSpecialElements_Default(Ride& ride, const TrackElemType trackType) { const auto& ted = GetTrackElementDescriptor(trackType); - uint16_t trackFlags = ted.flags; - if (trackFlags & TRACK_ELEM_FLAG_NORMAL_TO_INVERSION) + if (ted.flags.has(TrackElementFlag::normalToInversion)) { - if (ride.numInversions < OpenRCT2::Limits::kMaxInversions) + if (ride.numInversions < Limits::kMaxInversions) ride.numInversions++; } } -void RideUpdateMeasurementsSpecialElements_MiniGolf(Ride& ride, const OpenRCT2::TrackElemType trackType) +void RideUpdateMeasurementsSpecialElements_MiniGolf(Ride& ride, const TrackElemType trackType) { const auto& ted = GetTrackElementDescriptor(trackType); - uint16_t trackFlags = ted.flags; - if (trackFlags & TRACK_ELEM_FLAG_IS_GOLF_HOLE) + if (ted.flags.has(TrackElementFlag::isGolfHole)) { - if (ride.numHoles < OpenRCT2::Limits::kMaxGolfHoles) + if (ride.numHoles < Limits::kMaxGolfHoles) ride.numHoles++; } } -void RideUpdateMeasurementsSpecialElements_WaterCoaster(Ride& ride, const OpenRCT2::TrackElemType trackType) +void RideUpdateMeasurementsSpecialElements_WaterCoaster(Ride& ride, const TrackElemType trackType) { - if (trackType >= TrackElemType::FlatCovered && trackType <= TrackElemType::RightQuarterTurn3TilesCovered) + if (trackType >= TrackElemType::flatCovered && trackType <= TrackElemType::rightQuarterTurn3TilesCovered) { ride.specialTrackElements.set(SpecialElement::splash); } @@ -802,7 +521,7 @@ void Vehicle::UpdateMeasurements() if (curRide == nullptr) return; - if (status == Vehicle::Status::TravellingBoat) + if (status == Status::travellingBoat) { curRide->lifecycleFlags |= RIDE_LIFECYCLE_TESTED; curRide->lifecycleFlags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -849,26 +568,26 @@ void Vehicle::UpdateMeasurements() if (curRide->getRideTypeDescriptor().HasFlag(RtdFlag::hasGForces)) { auto gForces = GetGForces(); - gForces.VerticalG += curRide->previousVerticalG; - gForces.LateralG += curRide->previousLateralG; - gForces.VerticalG /= 2; - gForces.LateralG /= 2; + gForces.verticalG += curRide->previousVerticalG; + gForces.lateralG += curRide->previousLateralG; + gForces.verticalG /= 2; + gForces.lateralG /= 2; - curRide->previousVerticalG = gForces.VerticalG; - curRide->previousLateralG = gForces.LateralG; - if (gForces.VerticalG <= 0) + curRide->previousVerticalG = gForces.verticalG; + curRide->previousLateralG = gForces.lateralG; + if (gForces.verticalG <= 0) { curRide->totalAirTime++; } - if (gForces.VerticalG > curRide->maxPositiveVerticalG) - curRide->maxPositiveVerticalG = gForces.VerticalG; + if (gForces.verticalG > curRide->maxPositiveVerticalG) + curRide->maxPositiveVerticalG = gForces.verticalG; - if (gForces.VerticalG < curRide->maxNegativeVerticalG) - curRide->maxNegativeVerticalG = gForces.VerticalG; + if (gForces.verticalG < curRide->maxNegativeVerticalG) + curRide->maxNegativeVerticalG = gForces.verticalG; - gForces.LateralG = std::abs(gForces.LateralG); - curRide->maxLateralG = std::max(curRide->maxLateralG, static_cast(gForces.LateralG)); + gForces.lateralG = std::abs(gForces.lateralG); + curRide->maxLateralG = std::max(curRide->maxLateralG, static_cast(gForces.lateralG)); } } @@ -882,12 +601,12 @@ void Vehicle::UpdateMeasurements() return; auto trackElemType = GetTrackType(); - if (trackElemType == TrackElemType::PoweredLift || HasFlag(VehicleFlags::OnLiftHill)) + if (trackElemType == TrackElemType::poweredLift || HasFlag(VehicleFlags::OnLiftHill)) { - if (!(curRide->testingFlags.has(RideTestingFlag::poweredLift))) + if (!curRide->testingFlags.has(RideTestingFlag::poweredLift)) { curRide->testingFlags.set(RideTestingFlag::poweredLift); - if (curRide->numPoweredLifts < OpenRCT2::Limits::kRideMaxNumPoweredLiftsCount) + if (curRide->numPoweredLifts < Limits::kRideMaxNumPoweredLiftsCount) curRide->numPoweredLifts++; } } @@ -901,22 +620,22 @@ void Vehicle::UpdateMeasurements() switch (trackElemType) { - case TrackElemType::Rapids: + case TrackElemType::rapids: curRide->specialTrackElements.set(SpecialElement::rapids); break; - case TrackElemType::SpinningTunnel: + case TrackElemType::spinningTunnel: curRide->specialTrackElements.set(SpecialElement::spinningTunnel); break; - case TrackElemType::Waterfall: + case TrackElemType::waterfall: curRide->specialTrackElements.set(SpecialElement::waterfall); break; - case TrackElemType::LogFlumeReverser: + case TrackElemType::logFlumeReverser: curRide->specialTrackElements.set(SpecialElement::reverser); break; - case TrackElemType::Whirlpool: + case TrackElemType::whirlpool: curRide->specialTrackElements.set(SpecialElement::whirlpool); break; - case TrackElemType::Watersplash: + case TrackElemType::watersplash: if (velocity >= 11.0_mph) { curRide->specialTrackElements.set(SpecialElement::splash); @@ -927,14 +646,13 @@ void Vehicle::UpdateMeasurements() } const auto& ted = GetTrackElementDescriptor(trackElemType); - uint16_t trackFlags = ted.flags; auto testingFlags = curRide->testingFlags; - if (testingFlags.has(RideTestingFlag::turnLeft) && trackFlags & TRACK_ELEM_FLAG_TURN_LEFT) + if (testingFlags.has(RideTestingFlag::turnLeft) && ted.flags.has(TrackElementFlag::turnLeft)) { // 0x800 as this is masked to kCurrentTurnCountMask curRide->turnCountDefault += 0x800; } - else if (testingFlags.has(RideTestingFlag::turnRight) && trackFlags & TRACK_ELEM_FLAG_TURN_RIGHT) + else if (testingFlags.has(RideTestingFlag::turnRight) && ted.flags.has(TrackElementFlag::turnRight)) { // 0x800 as this is masked to kCurrentTurnCountMask curRide->turnCountDefault += 0x800; @@ -946,10 +664,10 @@ void Vehicle::UpdateMeasurements() RideTestingFlag::turnSloped); uint8_t turnType = 1; - if (!(testingFlags.has(RideTestingFlag::turnBanked))) + if (!testingFlags.has(RideTestingFlag::turnBanked)) { turnType = 2; - if (!(testingFlags.has(RideTestingFlag::turnSloped))) + if (!testingFlags.has(RideTestingFlag::turnSloped)) { turnType = 0; } @@ -972,31 +690,31 @@ void Vehicle::UpdateMeasurements() } else { - if (trackFlags & TRACK_ELEM_FLAG_TURN_LEFT) + if (ted.flags.has(TrackElementFlag::turnLeft)) { curRide->testingFlags.set(RideTestingFlag::turnLeft); curRide->turnCountDefault &= ~kCurrentTurnCountMask; - if (trackFlags & TRACK_ELEM_FLAG_TURN_BANKED) + if (ted.flags.has(TrackElementFlag::turnBanked)) { curRide->testingFlags.set(RideTestingFlag::turnBanked); } - if (trackFlags & TRACK_ELEM_FLAG_TURN_SLOPED) + if (ted.flags.has(TrackElementFlag::turnSloped)) { curRide->testingFlags.set(RideTestingFlag::turnSloped); } } - if (trackFlags & TRACK_ELEM_FLAG_TURN_RIGHT) + if (ted.flags.has(TrackElementFlag::turnRight)) { curRide->testingFlags.set(RideTestingFlag::turnRight); curRide->turnCountDefault &= ~kCurrentTurnCountMask; - if (trackFlags & TRACK_ELEM_FLAG_TURN_BANKED) + if (ted.flags.has(TrackElementFlag::turnBanked)) { curRide->testingFlags.set(RideTestingFlag::turnBanked); } - if (trackFlags & TRACK_ELEM_FLAG_TURN_SLOPED) + if (ted.flags.has(TrackElementFlag::turnSloped)) { curRide->testingFlags.set(RideTestingFlag::turnSloped); } @@ -1005,7 +723,7 @@ void Vehicle::UpdateMeasurements() if (testingFlags.has(RideTestingFlag::dropDown)) { - if (velocity < 0 || !(trackFlags & TRACK_ELEM_FLAG_DOWN)) + if (velocity < 0 || !ted.flags.has(TrackElementFlag::down)) { curRide->testingFlags.unset(RideTestingFlag::dropDown); @@ -1020,12 +738,12 @@ void Vehicle::UpdateMeasurements() } } } - else if (trackFlags & TRACK_ELEM_FLAG_DOWN && velocity >= 0) + else if (ted.flags.has(TrackElementFlag::down) && velocity >= 0) { curRide->testingFlags.unset(RideTestingFlag::dropUp); curRide->testingFlags.set(RideTestingFlag::dropDown); - if (curRide->numDrops < OpenRCT2::Limits::kRideMaxDropsCount) + if (curRide->numDrops < Limits::kRideMaxDropsCount) curRide->numDrops++; curRide->startDropHeight = z / kCoordsZStep; @@ -1034,7 +752,7 @@ void Vehicle::UpdateMeasurements() if (testingFlags.has(RideTestingFlag::dropUp)) { - if (velocity > 0 || !(trackFlags & TRACK_ELEM_FLAG_UP)) + if (velocity > 0 || !ted.flags.has(TrackElementFlag::up)) { curRide->testingFlags.unset(RideTestingFlag::dropUp); @@ -1049,20 +767,20 @@ void Vehicle::UpdateMeasurements() } } } - else if (trackFlags & TRACK_ELEM_FLAG_UP && velocity <= 0) + else if (ted.flags.has(TrackElementFlag::up) && velocity <= 0) { curRide->testingFlags.unset(RideTestingFlag::dropDown); curRide->testingFlags.set(RideTestingFlag::dropUp); - if (curRide->numDrops < OpenRCT2::Limits::kRideMaxDropsCount) + if (curRide->numDrops < Limits::kRideMaxDropsCount) curRide->numDrops++; curRide->startDropHeight = z / kCoordsZStep; } - if (trackFlags & TRACK_ELEM_FLAG_HELIX) + if (ted.flags.has(TrackElementFlag::helix)) { - if (curRide->numHelices < OpenRCT2::Limits::kMaxHelices) + if (curRide->numHelices < Limits::kMaxHelices) curRide->numHelices++; } } @@ -1127,7 +845,7 @@ void Vehicle::UpdateMeasurements() } } - if (!(curRide->testingFlags.has(RideTestingFlag::sheltered))) + if (!curRide->testingFlags.has(RideTestingFlag::sheltered)) { curRide->testingFlags.set(RideTestingFlag::sheltered); @@ -1153,7 +871,7 @@ void Vehicle::UpdateMeasurements() struct SoundIdVolume { - OpenRCT2::Audio::SoundId id; + SoundId id; uint8_t volume; }; @@ -1162,10 +880,9 @@ struct SoundIdVolume * rct2: 0x006D7AC0 */ static SoundIdVolume VehicleSoundFadeInOut( - OpenRCT2::Audio::SoundId currentSoundId, uint8_t currentVolume, OpenRCT2::Audio::SoundId targetSoundId, - uint8_t targetVolume) + SoundId currentSoundId, uint8_t currentVolume, SoundId targetSoundId, uint8_t targetVolume) { - if (currentSoundId != OpenRCT2::Audio::SoundId::null) + if (currentSoundId != SoundId::null) { if (currentSoundId == targetSoundId) { @@ -1187,14 +904,14 @@ static SoundIdVolume VehicleSoundFadeInOut( void Vehicle::GetLiftHillSound(const Ride& curRide, SoundIdVolume& curSound) { - scream_sound_id = OpenRCT2::Audio::SoundId::null; + scream_sound_id = SoundId::null; if (curRide.type < std::size(kRideTypeDescriptors)) { // Get lift hill sound curSound.id = GetRideTypeDescriptor(curRide.type).LiftData.sound_id; curSound.volume = 243; if (!(sound2_flags & VEHICLE_SOUND2_FLAGS_LIFT_HILL)) - curSound.id = OpenRCT2::Audio::SoundId::null; + curSound.id = SoundId::null; } } @@ -1233,78 +950,78 @@ void Vehicle::Update() { if (!(carEntry->flags & CAR_ENTRY_FLAG_WATER_RIDE) || (pitch == VehiclePitch::up25 && velocity <= 2.0_mph)) { - SetFlag(VehicleFlags::StoppedOnLift); + SetFlag(VehicleFlags::StoppedBySafetyCutOut); } } } switch (status) { - case Vehicle::Status::MovingToEndOfStation: + case Status::movingToEndOfStation: UpdateMovingToEndOfStation(); break; - case Vehicle::Status::WaitingForPassengers: + case Status::waitingForPassengers: UpdateWaitingForPassengers(); break; - case Vehicle::Status::WaitingToDepart: + case Status::waitingToDepart: UpdateWaitingToDepart(); break; - case Vehicle::Status::Crashing: - case Vehicle::Status::Crashed: + case Status::crashing: + case Status::crashed: UpdateCrash(); break; - case Vehicle::Status::TravellingDodgems: + case Status::travellingDodgems: UpdateDodgemsMode(); break; - case Vehicle::Status::Swinging: + case Status::swinging: UpdateSwinging(); break; - case Vehicle::Status::SimulatorOperating: + case Status::simulatorOperating: UpdateSimulatorOperating(); break; - case Vehicle::Status::TopSpinOperating: + case Status::topSpinOperating: UpdateTopSpinOperating(); break; - case Vehicle::Status::FerrisWheelRotating: + case Status::ferrisWheelRotating: UpdateFerrisWheelRotating(); break; - case Vehicle::Status::SpaceRingsOperating: + case Status::spaceRingsOperating: UpdateSpaceRingsOperating(); break; - case Vehicle::Status::HauntedHouseOperating: + case Status::hauntedHouseOperating: UpdateHauntedHouseOperating(); break; - case Vehicle::Status::CrookedHouseOperating: + case Status::crookedHouseOperating: UpdateCrookedHouseOperating(); break; - case Vehicle::Status::Rotating: + case Status::rotating: UpdateRotating(); break; - case Vehicle::Status::Departing: + case Status::departing: UpdateDeparting(); break; - case Vehicle::Status::Travelling: + case Status::travelling: UpdateTravelling(); break; - case Vehicle::Status::TravellingCableLift: + case Status::travellingCableLift: UpdateTravellingCableLift(); break; - case Vehicle::Status::TravellingBoat: + case Status::travellingBoat: UpdateTravellingBoat(); break; - case Vehicle::Status::Arriving: + case Status::arriving: UpdateArriving(); break; - case Vehicle::Status::UnloadingPassengers: + case Status::unloadingPassengers: UpdateUnloadingPassengers(); break; - case Vehicle::Status::WaitingForCableLift: + case Status::waitingForCableLift: UpdateWaitingForCableLift(); break; - case Vehicle::Status::ShowingFilm: + case Status::showingFilm: UpdateShowingFilm(); break; - case Vehicle::Status::DoingCircusShow: + case Status::doingCircusShow: UpdateDoingCircusShow(); break; default: @@ -1366,7 +1083,7 @@ void Vehicle::UpdateMovingToEndOfStation() current_station = StationIndex::FromUnderlying(0); velocity = 0; acceleration = 0; - SetState(Vehicle::Status::WaitingForPassengers); + SetState(Status::waitingForPassengers); break; default: { @@ -1401,7 +1118,7 @@ void Vehicle::UpdateMovingToEndOfStation() if (curRide->mode == RideMode::race && sub_state >= 40) { - SetState(Vehicle::Status::WaitingForPassengers); + SetState(Status::waitingForPassengers); break; } } @@ -1419,7 +1136,7 @@ void Vehicle::UpdateMovingToEndOfStation() current_station = StationIndex::FromUnderlying(station); velocity = 0; acceleration = 0; - SetState(Vehicle::Status::WaitingForPassengers); + SetState(Status::waitingForPassengers); break; } } @@ -1463,7 +1180,7 @@ void Vehicle::TrainReadyToDepart(uint8_t num_peeps_on_train, uint8_t num_used_se if (!peep[seat].IsNull()) { curRide->getStation(current_station).TrainAtStation = RideStation::kNoTrain; - SetState(Vehicle::Status::UnloadingPassengers); + SetState(Status::unloadingPassengers); return; } @@ -1479,7 +1196,7 @@ void Vehicle::TrainReadyToDepart(uint8_t num_peeps_on_train, uint8_t num_used_se return; curRide->getStation(current_station).TrainAtStation = RideStation::kNoTrain; - SetState(Vehicle::Status::WaitingForPassengers); + SetState(Status::waitingForPassengers); } static std::optional ride_get_train_index_from_vehicle(const Ride& ride, EntityId spriteIndex) @@ -1613,8 +1330,7 @@ void Vehicle::UpdateWaitingForPassengers() if (train == nullptr) continue; - if (train->status == Vehicle::Status::UnloadingPassengers - || train->status == Vehicle::Status::MovingToEndOfStation) + if (train->status == Status::unloadingPassengers || train->status == Status::movingToEndOfStation) { if (train->current_station == current_station) { @@ -1670,7 +1386,7 @@ void Vehicle::UpdateWaitingForPassengers() SetFlag(VehicleFlags::WaitingOnAdjacentStation); } - SetState(Vehicle::Status::WaitingToDepart); + SetState(Status::waitingToDepart); } /** @@ -1713,7 +1429,7 @@ void Vehicle::UpdateDodgemsMode() Invalidate(); velocity = 0; acceleration = 0; - SetState(Vehicle::Status::UnloadingPassengers); + SetState(Status::unloadingPassengers); } /** @@ -1761,7 +1477,7 @@ void Vehicle::UpdateWaitingToDepart() { if (!currentStation.Exit.IsNull()) { - SetState(Vehicle::Status::UnloadingPassengers); + SetState(Status::unloadingPassengers); return; } } @@ -1775,7 +1491,7 @@ void Vehicle::UpdateWaitingToDepart() { if (!currentStation.Exit.IsNull()) { - SetState(Vehicle::Status::UnloadingPassengers); + SetState(Status::unloadingPassengers); return; } break; @@ -1804,7 +1520,7 @@ void Vehicle::UpdateWaitingToDepart() } } - SetState(Vehicle::Status::Departing); + SetState(Status::departing); if (curRide->lifecycleFlags & RIDE_LIFECYCLE_CABLE_LIFT) { @@ -1817,7 +1533,7 @@ void Vehicle::UpdateWaitingToDepart() { if (track.element->AsTrack()->HasCableLift()) { - SetState(Vehicle::Status::WaitingForCableLift, sub_state); + SetState(Status::waitingForCableLift, sub_state); } } } @@ -1827,36 +1543,36 @@ void Vehicle::UpdateWaitingToDepart() case RideMode::dodgems: // Dodgems mode uses sub_state and TimeActive to tell how long // the vehicle has been ridden. - SetState(Vehicle::Status::TravellingDodgems); + SetState(Status::travellingDodgems); TimeActive = 0; UpdateDodgemsMode(); break; case RideMode::swing: - SetState(Vehicle::Status::Swinging); + SetState(Status::swinging); NumSwings = 0; current_time = -1; UpdateSwinging(); break; case RideMode::rotation: - SetState(Vehicle::Status::Rotating); + SetState(Status::rotating); NumRotations = 0; current_time = -1; UpdateRotating(); break; case RideMode::filmAvengingAviators: - SetState(Vehicle::Status::SimulatorOperating); + SetState(Status::simulatorOperating); current_time = -1; UpdateSimulatorOperating(); break; case RideMode::filmThrillRiders: - SetState(Vehicle::Status::SimulatorOperating, 1); + SetState(Status::simulatorOperating, 1); current_time = -1; UpdateSimulatorOperating(); break; case RideMode::beginners: case RideMode::intense: case RideMode::berserk: - SetState(Vehicle::Status::TopSpinOperating, sub_state); + SetState(Status::topSpinOperating, sub_state); switch (curRide->mode) { case RideMode::beginners: @@ -1881,7 +1597,7 @@ void Vehicle::UpdateWaitingToDepart() break; case RideMode::forwardRotation: case RideMode::backwardRotation: - SetState(Vehicle::Status::FerrisWheelRotating, flatRideAnimationFrame); + SetState(Status::ferrisWheelRotating, flatRideAnimationFrame); NumRotations = 0; ferris_wheel_var_0 = 8; ferris_wheel_var_1 = 8; @@ -1890,7 +1606,7 @@ void Vehicle::UpdateWaitingToDepart() case RideMode::mouseTails3DFilm: case RideMode::stormChasers3DFilm: case RideMode::spaceRaiders3DFilm: - SetState(Vehicle::Status::ShowingFilm, sub_state); + SetState(Status::showingFilm, sub_state); switch (curRide->mode) { case RideMode::mouseTails3DFilm: @@ -1912,24 +1628,24 @@ void Vehicle::UpdateWaitingToDepart() UpdateShowingFilm(); break; case RideMode::circus: - SetState(Vehicle::Status::DoingCircusShow); + SetState(Status::doingCircusShow); current_time = -1; UpdateDoingCircusShow(); break; case RideMode::spaceRings: - SetState(Vehicle::Status::SpaceRingsOperating); + SetState(Status::spaceRingsOperating); flatRideAnimationFrame = 0; current_time = -1; UpdateSpaceRingsOperating(); break; case RideMode::hauntedHouse: - SetState(Vehicle::Status::HauntedHouseOperating); + SetState(Status::hauntedHouseOperating); flatRideAnimationFrame = 0; current_time = -1; UpdateHauntedHouseOperating(); break; case RideMode::crookedHouse: - SetState(Vehicle::Status::CrookedHouseOperating); + SetState(Status::crookedHouseOperating); flatRideAnimationFrame = 0; current_time = -1; UpdateCrookedHouseOperating(); @@ -2020,7 +1736,7 @@ static bool try_add_synchronised_station(const CoordsXYZ& coords) continue; } - if (vehicle->status != Vehicle::Status::WaitingToDepart) + if (vehicle->status != Vehicle::Status::waitingToDepart) { continue; } @@ -2157,7 +1873,7 @@ static bool ride_station_can_depart_synchronised(const Ride& ride, StationIndex { continue; } - if (v->status != Vehicle::Status::WaitingToDepart && v->velocity != 0) + if (v->status != Vehicle::Status::waitingToDepart && v->velocity != 0) { // Here at least one vehicle on the ride is moving. return false; @@ -2195,12 +1911,12 @@ static bool ride_station_can_depart_synchronised(const Ride& ride, StationIndex { continue; } - if (otherVehicle->status != Vehicle::Status::Travelling) + if (otherVehicle->status != Vehicle::Status::travelling) { if (currentStation == otherVehicle->current_station) { - if (otherVehicle->status == Vehicle::Status::WaitingToDepart - || otherVehicle->status == Vehicle::Status::MovingToEndOfStation) + if (otherVehicle->status == Vehicle::Status::waitingToDepart + || otherVehicle->status == Vehicle::Status::movingToEndOfStation) { numTrainsAtStation++; } @@ -2281,7 +1997,7 @@ static void test_finish(Ride& ride) { ride.lifecycleFlags &= ~RIDE_LIFECYCLE_TEST_IN_PROGRESS; ride.lifecycleFlags |= RIDE_LIFECYCLE_TESTED; - ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_RATINGS; + ride.windowInvalidateFlags.set(RideInvalidateFlag::ratings); auto rideStations = ride.getStations(); for (int32_t i = ride.numStations - 1; i >= 1; i--) @@ -2396,7 +2112,7 @@ bool Vehicle::CurrentTowerElementIsTop() if (trackElement->GetRideIndex() != ride) continue; - if (trackElement->GetTrackType() != TrackElemType::TowerSection) + if (trackElement->GetTrackType() != TrackElemType::towerSection) continue; return false; @@ -2422,8 +2138,8 @@ void Vehicle::UpdateTravellingBoatHireSetup() var_35 = 0; // No longer on a track so reset to 0 for import/export SetTrackDirection(0); - SetTrackType(TrackElemType::Flat); - SetState(Vehicle::Status::TravellingBoat); + SetTrackType(TrackElemType::flat); + SetState(Status::travellingBoat); remaining_distance += 27924; UpdateTravellingBoat(); @@ -2473,9 +2189,9 @@ void Vehicle::UpdateDeparting() curRide->lifecycleFlags |= RIDE_LIFECYCLE_BROKEN_DOWN; RideBreakdownAddNewsItem(*curRide); - curRide->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST - | RIDE_INVALIDATE_RIDE_MAINTENANCE; - curRide->mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; + curRide->windowInvalidateFlags.set( + RideInvalidateFlag::main, RideInvalidateFlag::list, RideInvalidateFlag::maintenance); + curRide->mechanicStatus = MechanicStatus::calling; curRide->inspectionStation = current_station; curRide->breakdownReason = curRide->breakdownReasonPending; velocity = 0; @@ -2487,15 +2203,13 @@ void Vehicle::UpdateDeparting() if (rideEntry->flags & RIDE_ENTRY_FLAG_PLAY_DEPART_SOUND) { - auto soundId = (rideEntry->Cars[0].soundRange == SoundRange::tramBell) ? OpenRCT2::Audio::SoundId::tram - : OpenRCT2::Audio::SoundId::trainDeparting; - - OpenRCT2::Audio::Play3D(soundId, GetLocation()); + auto soundId = (rideEntry->Cars[0].soundRange == SoundRange::tramBell) ? SoundId::tram : SoundId::trainDeparting; + Play3D(soundId, GetLocation()); } if (curRide->mode == RideMode::upwardLaunch || (curRide->mode == RideMode::downwardLaunch && NumLaunches > 1)) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::rideLaunch2, GetLocation()); + Play3D(SoundId::rideLaunch2, GetLocation()); } if (!(curRide->lifecycleFlags & RIDE_LIFECYCLE_TESTED)) @@ -2611,7 +2325,7 @@ void Vehicle::UpdateDeparting() { if (_vehicleBreakdown == BREAKDOWN_SAFETY_CUT_OUT) { - SetFlag(VehicleFlags::StoppedOnLift); + SetFlag(VehicleFlags::StoppedBySafetyCutOut); ClearFlag(VehicleFlags::CollisionDisabled); } } @@ -2629,7 +2343,7 @@ void Vehicle::UpdateDeparting() { if (_vehicleBreakdown == BREAKDOWN_SAFETY_CUT_OUT) { - SetFlag(VehicleFlags::StoppedOnLift); + SetFlag(VehicleFlags::StoppedBySafetyCutOut); ClearFlag(VehicleFlags::CollisionDisabled); } } @@ -2701,7 +2415,7 @@ void Vehicle::FinishDeparting() if (NumLaunches >= 1 && (14 << 16) > velocity) return; - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::rideLaunch1, GetLocation()); + Play3D(SoundId::rideLaunch1, GetLocation()); } if (curRide->mode == RideMode::upwardLaunch) @@ -2709,7 +2423,7 @@ void Vehicle::FinishDeparting() if ((curRide->launchSpeed << 16) > velocity) return; - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::rideLaunch1, GetLocation()); + Play3D(SoundId::rideLaunch1, GetLocation()); } if (curRide->mode != RideMode::race && !curRide->isBlockSectioned()) @@ -2726,7 +2440,7 @@ void Vehicle::FinishDeparting() currentStation.Depart |= waitingTime; } lost_time_out = 0; - SetState(Vehicle::Status::Travelling, 1); + SetState(Status::travelling, 1); if (velocity < 0) sub_state = 0; } @@ -2807,7 +2521,7 @@ void Vehicle::UpdateCollisionSetup() return; } - SetState(Vehicle::Status::Crashed, sub_state); + SetState(Status::crashed, sub_state); if (!(curRide->lifecycleFlags & RIDE_LIFECYCLE_CRASHED)) { @@ -2829,7 +2543,7 @@ void Vehicle::UpdateCollisionSetup() } curRide->lifecycleFlags |= RIDE_LIFECYCLE_CRASHED; - curRide->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + curRide->windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); KillAllPassengersInTrain(); Vehicle* lastVehicle = this; @@ -2845,7 +2559,7 @@ void Vehicle::UpdateCollisionSetup() #endif const auto trainLoc = train->GetLocation(); - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::crash, trainLoc); + Play3D(SoundId::crash, trainLoc); ExplosionCloud::Create(trainLoc); @@ -2895,11 +2609,11 @@ void Vehicle::UpdateCrashSetup() SimulateCrash(); return; } - SetState(Vehicle::Status::Crashing, sub_state); + SetState(Status::crashing, sub_state); if (NumPeepsUntilTrainTail() != 0) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::hauntedHouseScream2, GetLocation()); + Play3D(SoundId::hauntedHouseScream2, GetLocation()); } int32_t edx = velocity >> 10; @@ -3021,7 +2735,7 @@ void Vehicle::UpdateTravelling() { if (sub_state <= 1) { - SetState(Vehicle::Status::Arriving, 1); + SetState(Status::arriving, 1); var_C0 = 0; return; } @@ -3091,7 +2805,7 @@ void Vehicle::UpdateTravelling() if (_vehicleBreakdown == 0) { sound2_flags &= ~VEHICLE_SOUND2_FLAGS_LIFT_HILL; - SetFlag(VehicleFlags::StoppedOnLift); + SetFlag(VehicleFlags::StoppedBySafetyCutOut); } } } @@ -3107,7 +2821,7 @@ void Vehicle::UpdateTravelling() { if (_vehicleBreakdown == 0) { - SetFlag(VehicleFlags::StoppedOnLift); + SetFlag(VehicleFlags::StoppedBySafetyCutOut); sound2_flags &= ~VEHICLE_SOUND2_FLAGS_LIFT_HILL; } } @@ -3131,7 +2845,7 @@ void Vehicle::UpdateTravelling() if (curRide->mode == RideMode::poweredLaunchPasstrough && velocity < 0) return; - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); current_station = _vehicleStationIndex; var_C0 = 0; if (velocity < 0) @@ -3256,7 +2970,7 @@ void Vehicle::UpdateArriving() ClearFlag(VehicleFlags::ReverseInclineCompletedLap); velocity = 0; acceleration = 0; - SetState(Vehicle::Status::UnloadingPassengers); + SetState(Status::unloadingPassengers); return; default: { @@ -3268,7 +2982,7 @@ void Vehicle::UpdateArriving() bool hasBrakesFailure = curRide->lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN && curRide->breakdownReasonPending == BREAKDOWN_BRAKES_FAILURE; if (hasBrakesFailure && curRide->inspectionStation == current_station - && curRide->mechanicStatus != RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES) + && curRide->mechanicStatus != MechanicStatus::hasFixedStationBrakes) { stationBrakesWork = false; } @@ -3287,7 +3001,7 @@ void Vehicle::UpdateArriving() if (curFlags & VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_AT_STATION && !stationBrakesWork) { - SetState(Vehicle::Status::Departing, 1); + SetState(Status::departing, 1); return; } @@ -3320,42 +3034,42 @@ void Vehicle::UpdateArriving() { if (NumLaps < curRide->numCircuits) { - SetState(Vehicle::Status::Departing, 1); + SetState(Status::departing, 1); return; } if (NumLaps == curRide->numCircuits && HasFlag(VehicleFlags::ReverseInclineCompletedLap)) { - SetState(Vehicle::Status::Departing, 1); + SetState(Status::departing, 1); return; } } if (curRide->numCircuits != 1 && NumLaps < curRide->numCircuits) { - SetState(Vehicle::Status::Departing, 1); + SetState(Status::departing, 1); return; } if ((curRide->mode == RideMode::upwardLaunch || curRide->mode == RideMode::downwardLaunch) && NumLaunches < 2) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::rideLaunch2, GetLocation()); + Play3D(SoundId::rideLaunch2, GetLocation()); velocity = 0; acceleration = 0; - SetState(Vehicle::Status::Departing, 1); + SetState(Status::departing, 1); return; } if (curRide->mode == RideMode::race && curRide->lifecycleFlags & RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING) { - SetState(Vehicle::Status::Departing, 1); + SetState(Status::departing, 1); return; } ClearFlag(VehicleFlags::ReverseInclineCompletedLap); velocity = 0; acceleration = 0; - SetState(Vehicle::Status::UnloadingPassengers); + SetState(Status::unloadingPassengers); } /** @@ -3416,7 +3130,7 @@ void Vehicle::UpdateUnloadingPassengers() { UpdateTestFinish(); } - SetState(Vehicle::Status::MovingToEndOfStation); + SetState(Status::movingToEndOfStation); return; } @@ -3457,7 +3171,7 @@ void Vehicle::UpdateUnloadingPassengers() { UpdateTestFinish(); } - SetState(Vehicle::Status::MovingToEndOfStation); + SetState(Status::movingToEndOfStation); } /** @@ -3474,10 +3188,10 @@ void Vehicle::UpdateWaitingForCableLift() if (cableLift == nullptr) return; - if (cableLift->status != Vehicle::Status::WaitingForPassengers) + if (cableLift->status != Status::waitingForPassengers) return; - cableLift->SetState(Vehicle::Status::WaitingToDepart, sub_state); + cableLift->SetState(Status::waitingToDepart, sub_state); cableLift->cable_lift_target = Id; } @@ -3500,10 +3214,10 @@ void Vehicle::UpdateTravellingCableLift() curRide->lifecycleFlags |= RIDE_LIFECYCLE_BROKEN_DOWN; RideBreakdownAddNewsItem(*curRide); - curRide->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST - | RIDE_INVALIDATE_RIDE_MAINTENANCE; + curRide->windowInvalidateFlags.set( + RideInvalidateFlag::main, RideInvalidateFlag::list, RideInvalidateFlag::maintenance); - curRide->mechanicStatus = RIDE_MECHANIC_STATUS_CALLING; + curRide->mechanicStatus = MechanicStatus::calling; curRide->inspectionStation = current_station; curRide->breakdownReason = curRide->breakdownReasonPending; velocity = 0; @@ -3541,7 +3255,7 @@ void Vehicle::UpdateTravellingCableLift() if (curFlags & VEHICLE_UPDATE_MOTION_TRACK_FLAG_11) { - SetState(Vehicle::Status::Travelling, 1); + SetState(Status::travelling, 1); lost_time_out = 0; return; } @@ -3600,7 +3314,7 @@ void Vehicle::TryReconnectBoatToTrack(const CoordsXY& currentBoatLocation, const } track_progress = 0; - SetState(Vehicle::Status::Travelling, sub_state); + SetState(Status::travelling, sub_state); _vehicleCurPosition.x = currentBoatLocation.x; _vehicleCurPosition.y = currentBoatLocation.y; } @@ -4021,7 +3735,7 @@ void Vehicle::UpdateSwinging() swingState += 4; } - const int8_t* spriteMap = SwingingTimeToSpriteMaps[swingState]; + const auto spriteMap = kSwingingTimeToSpriteMaps[swingState]; int8_t spriteType = spriteMap[current_time + 1]; // 0x80 indicates that a complete swing has been @@ -4061,7 +3775,7 @@ void Vehicle::UpdateSwinging() // swing has to be in slowing down phase if (sub_state == 0) { - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; return; } @@ -4158,7 +3872,7 @@ void Vehicle::UpdateFerrisWheelRotating() if (subState != flatRideAnimationFrame) return; - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; } @@ -4184,7 +3898,7 @@ void Vehicle::UpdateSimulatorOperating() return; } - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; } @@ -4198,7 +3912,7 @@ void UpdateRotatingEnterprise(Vehicle& vehicle) { if (vehicle.sub_state == 2) { - vehicle.SetState(Vehicle::Status::Arriving); + vehicle.SetState(Vehicle::Status::arriving); vehicle.var_C0 = 0; return; } @@ -4276,7 +3990,7 @@ void Vehicle::UpdateRotating() { if (sub_state == 2) { - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; return; } @@ -4311,7 +4025,7 @@ void Vehicle::UpdateSpaceRingsOperating() } else { - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; } } @@ -4339,7 +4053,7 @@ void Vehicle::UpdateHauntedHouseOperating() if (current_time + 1 > 1500) { - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; return; } @@ -4348,24 +4062,24 @@ void Vehicle::UpdateHauntedHouseOperating() switch (current_time) { case 45: - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::hauntedHouseScare, GetLocation()); + Play3D(SoundId::hauntedHouseScare, GetLocation()); break; case 75: flatRideAnimationFrame = 1; Invalidate(); break; case 400: - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::hauntedHouseScream1, GetLocation()); + Play3D(SoundId::hauntedHouseScream1, GetLocation()); break; case 745: - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::hauntedHouseScare, GetLocation()); + Play3D(SoundId::hauntedHouseScare, GetLocation()); break; case 775: flatRideAnimationFrame = 1; Invalidate(); break; case 1100: - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::hauntedHouseScream2, GetLocation()); + Play3D(SoundId::hauntedHouseScream2, GetLocation()); break; } } @@ -4382,7 +4096,7 @@ void Vehicle::UpdateCrookedHouseOperating() // Originally used an array of size 1 at 0x009A0AC4 and passed the sub state into it. if (static_cast(current_time + 1) > 600) { - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; return; } @@ -4418,7 +4132,7 @@ void Vehicle::UpdateTopSpinOperating() return; } - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; } @@ -4441,7 +4155,7 @@ void Vehicle::UpdateShowingFilm() } else { - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; } } @@ -4462,7 +4176,7 @@ void Vehicle::UpdateDoingCircusShow() } else { - SetState(Vehicle::Status::Arriving); + SetState(Status::arriving); var_C0 = 0; } } @@ -4594,7 +4308,7 @@ void Vehicle::CrashOnLand() SimulateCrash(); return; } - SetState(Vehicle::Status::Crashed, sub_state); + SetState(Status::crashed, sub_state); #ifdef ENABLE_SCRIPTING InvokeVehicleCrashHook(Id, "land"); @@ -4619,7 +4333,7 @@ void Vehicle::CrashOnLand() } } curRide->lifecycleFlags |= RIDE_LIFECYCLE_CRASHED; - curRide->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + curRide->windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); if (IsHead()) { @@ -4629,7 +4343,7 @@ void Vehicle::CrashOnLand() sub_state = 2; const auto curLoc = GetLocation(); - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::crash, curLoc); + Play3D(SoundId::crash, curLoc); ExplosionCloud::Create(curLoc); ExplosionFlare::Create(curLoc); @@ -4662,7 +4376,7 @@ void Vehicle::CrashOnWater() SimulateCrash(); return; } - SetState(Vehicle::Status::Crashed, sub_state); + SetState(Status::crashed, sub_state); #ifdef ENABLE_SCRIPTING InvokeVehicleCrashHook(Id, "water"); @@ -4687,7 +4401,7 @@ void Vehicle::CrashOnWater() } } curRide->lifecycleFlags |= RIDE_LIFECYCLE_CRASHED; - curRide->windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + curRide->windowInvalidateFlags.set(RideInvalidateFlag::main, RideInvalidateFlag::list); if (IsHead()) { @@ -4697,7 +4411,7 @@ void Vehicle::CrashOnWater() sub_state = 2; const auto curLoc = GetLocation(); - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::water1, curLoc); + Play3D(SoundId::water1, curLoc); CrashSplashParticle::Create(curLoc); CrashSplashParticle::Create(curLoc + CoordsXYZ{ -8, -9, 0 }); @@ -4818,9 +4532,9 @@ void Vehicle::UpdateCrash() void Vehicle::UpdateSound() { // frictionVolume (bl) should be set before hand - SoundIdVolume frictionSound = { OpenRCT2::Audio::SoundId::null, 255 }; + SoundIdVolume frictionSound = { SoundId::null, 255 }; // bh screamVolume should be set before hand - SoundIdVolume screamSound = { OpenRCT2::Audio::SoundId::null, 255 }; + SoundIdVolume screamSound = { SoundId::null, 255 }; auto curRide = GetRide(); if (curRide == nullptr) @@ -4849,7 +4563,7 @@ void Vehicle::UpdateSound() screamSound.id = scream_sound_id; if (!(currentTicks & 0x7F)) { - if (velocity < 4.0_mph || scream_sound_id != OpenRCT2::Audio::SoundId::null) + if (velocity < 4.0_mph || scream_sound_id != SoundId::null) { GetLiftHillSound(*curRide, screamSound); break; @@ -4857,13 +4571,13 @@ void Vehicle::UpdateSound() if ((ScenarioRand() & 0xFFFF) <= 0x5555) { - scream_sound_id = OpenRCT2::Audio::SoundId::trainWhistle; + scream_sound_id = SoundId::trainWhistle; screamSound.volume = 255; break; } } - if (screamSound.id == OpenRCT2::Audio::SoundId::noScream) - screamSound.id = OpenRCT2::Audio::SoundId::null; + if (screamSound.id == SoundId::noScream) + screamSound.id = SoundId::null; screamSound.volume = 255; break; @@ -4871,7 +4585,7 @@ void Vehicle::UpdateSound() screamSound.id = scream_sound_id; if (!(currentTicks & 0x7F)) { - if (velocity < 4.0_mph || scream_sound_id != OpenRCT2::Audio::SoundId::null) + if (velocity < 4.0_mph || scream_sound_id != SoundId::null) { GetLiftHillSound(*curRide, screamSound); break; @@ -4879,13 +4593,13 @@ void Vehicle::UpdateSound() if ((ScenarioRand() & 0xFFFF) <= 0x5555) { - scream_sound_id = OpenRCT2::Audio::SoundId::tram; + scream_sound_id = SoundId::tram; screamSound.volume = 255; break; } } - if (screamSound.id == OpenRCT2::Audio::SoundId::noScream) - screamSound.id = OpenRCT2::Audio::SoundId::null; + if (screamSound.id == SoundId::noScream) + screamSound.id = SoundId::null; screamSound.volume = 255; break; @@ -4893,12 +4607,12 @@ void Vehicle::UpdateSound() if ((carEntry.flags & CAR_ENTRY_FLAG_RIDERS_SCREAM)) { screamSound.id = UpdateScreamSound(); - if (screamSound.id == OpenRCT2::Audio::SoundId::noScream) + if (screamSound.id == SoundId::noScream) { - screamSound.id = OpenRCT2::Audio::SoundId::null; + screamSound.id = SoundId::null; break; } - if (screamSound.id != OpenRCT2::Audio::SoundId::null) + if (screamSound.id != SoundId::null) { break; } @@ -4928,16 +4642,16 @@ void Vehicle::UpdateSound() * * rct2: 0x006D796B */ -OpenRCT2::Audio::SoundId Vehicle::UpdateScreamSound() +SoundId Vehicle::UpdateScreamSound() { int32_t totalNumPeeps = NumPeepsUntilTrainTail(); if (totalNumPeeps == 0) - return OpenRCT2::Audio::SoundId::null; + return SoundId::null; if (velocity < 0) { if (velocity > -2.75_mph) - return OpenRCT2::Audio::SoundId::null; + return SoundId::null; for (Vehicle* vehicle2 = getGameState().entities.GetEntity(Id); vehicle2 != nullptr; vehicle2 = getGameState().entities.GetEntity(vehicle2->next_vehicle_on_train)) @@ -4955,11 +4669,11 @@ OpenRCT2::Audio::SoundId Vehicle::UpdateScreamSound() if (vehicle2->pitch == VehiclePitch::up50) return ProduceScreamSound(totalNumPeeps); } - return OpenRCT2::Audio::SoundId::null; + return SoundId::null; } if (velocity < 2.75_mph) - return OpenRCT2::Audio::SoundId::null; + return SoundId::null; for (Vehicle* vehicle2 = getGameState().entities.GetEntity(Id); vehicle2 != nullptr; vehicle2 = getGameState().entities.GetEntity(vehicle2->next_vehicle_on_train)) @@ -4977,16 +4691,16 @@ OpenRCT2::Audio::SoundId Vehicle::UpdateScreamSound() if (vehicle2->pitch == VehiclePitch::down50) return ProduceScreamSound(totalNumPeeps); } - return OpenRCT2::Audio::SoundId::null; + return SoundId::null; } -OpenRCT2::Audio::SoundId Vehicle::ProduceScreamSound(const int32_t totalNumPeeps) +SoundId Vehicle::ProduceScreamSound(const int32_t totalNumPeeps) { const auto* rideEntry = GetRideEntry(); const auto& carEntry = rideEntry->Cars[vehicle_type]; - if (scream_sound_id == OpenRCT2::Audio::SoundId::null) + if (scream_sound_id == SoundId::null) { auto r = ScenarioRand(); if (totalNumPeeps >= static_cast(r % 16)) @@ -5003,13 +4717,13 @@ OpenRCT2::Audio::SoundId Vehicle::ProduceScreamSound(const int32_t totalNumPeeps scream_sound_id = _screamSetSteel[r % std::size(_screamSetSteel)]; break; default: - scream_sound_id = OpenRCT2::Audio::SoundId::noScream; + scream_sound_id = SoundId::noScream; break; } } else { - scream_sound_id = OpenRCT2::Audio::SoundId::noScream; + scream_sound_id = SoundId::noScream; } } return scream_sound_id; @@ -5371,17 +5085,17 @@ void Vehicle::UpdateTrackMotionUpStopCheck() const if (!IsOnCoveredTrack()) { auto gForces = GetGForces(); - gForces.LateralG = std::abs(gForces.LateralG); - if (gForces.LateralG <= 150) + gForces.lateralG = std::abs(gForces.lateralG); + if (gForces.lateralG <= 150) { if (Geometry::getAccelerationFromPitch(pitch) < 0) { - if (gForces.VerticalG > -40) + if (gForces.verticalG > -40) { return; } } - else if (gForces.VerticalG > -80) + else if (gForces.verticalG > -80) { return; } @@ -5402,14 +5116,14 @@ void Vehicle::UpdateTrackMotionUpStopCheck() const if (Geometry::getAccelerationFromPitch(pitch) < 0) { - if (gForces.VerticalG > -45) + if (gForces.verticalG > -45) { return; } } else { - if (gForces.VerticalG > -80) + if (gForces.verticalG > -80) { return; } @@ -5472,7 +5186,7 @@ void Vehicle::ApplyStopBlockBrake() void Vehicle::ApplyCableLiftBlockBrake(bool brakeClosed) { // If we are already on the cable lift, ignore the brake - if (status == Vehicle::Status::TravellingCableLift) + if (status == Status::travellingCableLift) return; // Slow down if travelling faster than 4mph @@ -5493,7 +5207,7 @@ void Vehicle::ApplyCableLiftBlockBrake(bool brakeClosed) velocity = 0; acceleration = 0; if (!brakeClosed) - SetState(Vehicle::Status::WaitingForCableLift, sub_state); + SetState(Status::waitingForCableLift, sub_state); else _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_AT_BLOCK_BRAKE; } @@ -5531,7 +5245,7 @@ void Vehicle::CheckAndApplyBlockSectionStopSite() switch (trackType) { - case TrackElemType::BlockBrakes: + case TrackElemType::blockBrakes: // Check if this brake is the start of a cable lift if (curRide->lifecycleFlags & RIDE_LIFECYCLE_CABLE_LIFT) { @@ -5546,26 +5260,26 @@ void Vehicle::CheckAndApplyBlockSectionStopSite() } } [[fallthrough]]; - case TrackElemType::DiagBlockBrakes: + case TrackElemType::diagBlockBrakes: if (curRide->isBlockSectioned() && trackElement->AsTrack()->IsBrakeClosed()) ApplyStopBlockBrake(); else ApplyNonStopBlockBrake(); break; - case TrackElemType::EndStation: + case TrackElemType::endStation: if (trackElement->AsTrack()->IsBrakeClosed()) _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_AT_BLOCK_BRAKE; break; - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: - case TrackElemType::CableLiftHill: - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::up25ToFlat: + case TrackElemType::up60ToFlat: + case TrackElemType::cableLiftHill: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagUp60ToFlat: if (curRide->isBlockSectioned()) { - if (trackType == TrackElemType::CableLiftHill || trackElement->AsTrack()->HasChain()) + if (trackType == TrackElemType::cableLiftHill || trackElement->AsTrack()->HasChain()) { if (trackElement->AsTrack()->IsBrakeClosed()) { @@ -5586,7 +5300,7 @@ void Vehicle::CheckAndApplyBlockSectionStopSite() void Vehicle::UpdateVelocity() { int32_t nextVelocity = acceleration + velocity; - if (HasFlag(VehicleFlags::StoppedOnLift)) + if (HasFlag(VehicleFlags::StoppedBySafetyCutOut)) { nextVelocity = 0; } @@ -5616,13 +5330,13 @@ static void BlockBrakesOpenPreviousSection(const Ride& ride, const CoordsXYZ& ve MapInvalidateElement(location, reinterpret_cast(trackElement)); auto trackType = trackElement->GetTrackType(); - if (trackType == TrackElemType::EndStation) + if (trackType == TrackElemType::endStation) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::blockBrakeClose, location); + Play3D(SoundId::blockBrakeClose, location); } else if (TrackTypeIsBlockBrakes(trackType)) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::blockBrakeClose, location); + Play3D(SoundId::blockBrakeClose, location); BlockBrakeSetLinkedBrakesClosed(location, *trackElement, false); } } @@ -5631,40 +5345,40 @@ int32_t Vehicle::GetSwingAmount() const { switch (GetTrackType()) { - case TrackElemType::LeftQuarterTurn5Tiles: - case TrackElemType::BankedLeftQuarterTurn5Tiles: - case TrackElemType::LeftQuarterTurn5TilesUp25: - case TrackElemType::LeftQuarterTurn5TilesDown25: - case TrackElemType::LeftQuarterTurn5TilesCovered: - case TrackElemType::LeftHalfBankedHelixUpLarge: - case TrackElemType::LeftHalfBankedHelixDownLarge: - case TrackElemType::LeftQuarterBankedHelixLargeUp: - case TrackElemType::LeftQuarterBankedHelixLargeDown: - case TrackElemType::LeftQuarterHelixLargeUp: - case TrackElemType::LeftQuarterHelixLargeDown: - case TrackElemType::LeftBankedQuarterTurn5TileUp25: - case TrackElemType::LeftBankedQuarterTurn5TileDown25: + case TrackElemType::leftQuarterTurn5Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesDown25: + case TrackElemType::leftQuarterTurn5TilesCovered: + case TrackElemType::leftHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: + case TrackElemType::leftQuarterBankedHelixLargeUp: + case TrackElemType::leftQuarterBankedHelixLargeDown: + case TrackElemType::leftQuarterHelixLargeUp: + case TrackElemType::leftQuarterHelixLargeDown: + case TrackElemType::leftBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: // Loc6D67E1 return 14; - case TrackElemType::RightQuarterTurn5Tiles: - case TrackElemType::BankedRightQuarterTurn5Tiles: - case TrackElemType::RightQuarterTurn5TilesUp25: - case TrackElemType::RightQuarterTurn5TilesDown25: - case TrackElemType::RightQuarterTurn5TilesCovered: - case TrackElemType::RightHalfBankedHelixUpLarge: - case TrackElemType::RightHalfBankedHelixDownLarge: - case TrackElemType::RightQuarterBankedHelixLargeUp: - case TrackElemType::RightQuarterBankedHelixLargeDown: - case TrackElemType::RightQuarterHelixLargeUp: - case TrackElemType::RightQuarterHelixLargeDown: - case TrackElemType::RightBankedQuarterTurn5TileUp25: - case TrackElemType::RightBankedQuarterTurn5TileDown25: + case TrackElemType::rightQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesCovered: + case TrackElemType::rightHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: + case TrackElemType::rightQuarterBankedHelixLargeUp: + case TrackElemType::rightQuarterBankedHelixLargeDown: + case TrackElemType::rightQuarterHelixLargeUp: + case TrackElemType::rightQuarterHelixLargeDown: + case TrackElemType::rightBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: // Loc6D6804 return -14; - case TrackElemType::SBendLeft: - case TrackElemType::SBendLeftCovered: + case TrackElemType::sBendLeft: + case TrackElemType::sBendLeftCovered: // Loc6D67EF if (track_progress < 48) { @@ -5672,8 +5386,8 @@ int32_t Vehicle::GetSwingAmount() const } return -15; - case TrackElemType::SBendRight: - case TrackElemType::SBendRightCovered: + case TrackElemType::sBendRight: + case TrackElemType::sBendRightCovered: // Loc6D67CC if (track_progress < 48) { @@ -5681,59 +5395,59 @@ int32_t Vehicle::GetSwingAmount() const } return 15; - case TrackElemType::LeftQuarterTurn3Tiles: - case TrackElemType::LeftBankedQuarterTurn3Tiles: - case TrackElemType::LeftQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25: - case TrackElemType::LeftQuarterTurn3TilesCovered: - case TrackElemType::LeftHalfBankedHelixUpSmall: - case TrackElemType::LeftHalfBankedHelixDownSmall: - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: - case TrackElemType::LeftCurvedLiftHill: - case TrackElemType::LeftBankedQuarterTurn3TileUp25: - case TrackElemType::LeftBankedQuarterTurn3TileDown25: + case TrackElemType::leftQuarterTurn3Tiles: + case TrackElemType::leftBankedQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25: + case TrackElemType::leftQuarterTurn3TilesCovered: + case TrackElemType::leftHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::leftCurvedLiftHill: + case TrackElemType::leftBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: // Loc6D67BE return 13; - case TrackElemType::RightQuarterTurn3Tiles: - case TrackElemType::RightBankedQuarterTurn3Tiles: - case TrackElemType::RightQuarterTurn3TilesUp25: - case TrackElemType::RightQuarterTurn3TilesDown25: - case TrackElemType::RightQuarterTurn3TilesCovered: - case TrackElemType::RightHalfBankedHelixUpSmall: - case TrackElemType::RightHalfBankedHelixDownSmall: - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: - case TrackElemType::RightCurvedLiftHill: - case TrackElemType::RightBankedQuarterTurn3TileUp25: - case TrackElemType::RightBankedQuarterTurn3TileDown25: + case TrackElemType::rightQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesCovered: + case TrackElemType::rightHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::rightCurvedLiftHill: + case TrackElemType::rightBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: // Loc6D67B0 return -13; - case TrackElemType::LeftQuarterTurn1Tile: - case TrackElemType::LeftQuarterTurn1TileUp60: - case TrackElemType::LeftQuarterTurn1TileDown60: + case TrackElemType::leftQuarterTurn1Tile: + case TrackElemType::leftQuarterTurn1TileUp60: + case TrackElemType::leftQuarterTurn1TileDown60: // Loc6D67A2 return 12; - case TrackElemType::RightQuarterTurn1Tile: - case TrackElemType::RightQuarterTurn1TileUp60: - case TrackElemType::RightQuarterTurn1TileDown60: + case TrackElemType::rightQuarterTurn1Tile: + case TrackElemType::rightQuarterTurn1TileUp60: + case TrackElemType::rightQuarterTurn1TileDown60: // Loc6D6794 return -12; - case TrackElemType::LeftEighthToDiag: - case TrackElemType::LeftEighthToOrthogonal: - case TrackElemType::LeftEighthBankToDiag: - case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::leftEighthToDiag: + case TrackElemType::leftEighthToOrthogonal: + case TrackElemType::leftEighthBankToDiag: + case TrackElemType::leftEighthBankToOrthogonal: // Loc6D67D3 return 15; - case TrackElemType::RightEighthToDiag: - case TrackElemType::RightEighthToOrthogonal: - case TrackElemType::RightEighthBankToDiag: - case TrackElemType::RightEighthBankToOrthogonal: + case TrackElemType::rightEighthToDiag: + case TrackElemType::rightEighthToOrthogonal: + case TrackElemType::rightEighthBankToDiag: + case TrackElemType::rightEighthBankToOrthogonal: // Loc6D67F6 return -15; default: @@ -5822,15 +5536,15 @@ void Vehicle::UpdateSwingingCar() auto trackType = GetTrackType(); switch (trackType) { - case TrackElemType::BankedLeftQuarterTurn5Tiles: - case TrackElemType::LeftBank: - case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::bankedLeftQuarterTurn5Tiles: + case TrackElemType::leftBank: + case TrackElemType::leftBankedQuarterTurn3Tiles: dx = 10831; cx = -819; break; - case TrackElemType::BankedRightQuarterTurn5Tiles: - case TrackElemType::RightBank: - case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: + case TrackElemType::rightBank: + case TrackElemType::rightBankedQuarterTurn3Tiles: dx = 819; cx = -10831; break; @@ -6042,11 +5756,11 @@ static uint8_t GetTargetFrame(const CarEntry& carEntry, uint32_t animationState) */ static constexpr CoordsXYZ ComputeSteamOffset(int32_t height, int32_t length, VehiclePitch pitch, uint8_t yaw) { - uint8_t trueYaw = OpenRCT2::Entity::Yaw::YawTo64(yaw); - auto offsets = PitchToDirectionVectorFromGeometry[EnumValue(pitch)]; + uint8_t trueYaw = Entity::Yaw::YawTo64(yaw); + auto offsets = Math::Trigonometry::PitchToDirectionVectorFromGeometry[EnumValue(pitch)]; int32_t projectedRun = (offsets.x * length - offsets.y * height) / 256; int32_t projectedHeight = (offsets.x * height + offsets.y * length) / 256; - return { ComputeXYVector(projectedRun, trueYaw), projectedHeight }; + return { Math::Trigonometry::ComputeXYVector(projectedRun, trueYaw), projectedHeight }; } /** @@ -6098,7 +5812,7 @@ static void AnimateSteamLocomotive(Vehicle& vehicle, const CarEntry& carEntry) if (curRide != nullptr) { if (!RideHasStationShelter(*curRide) - || (vehicle.status != Vehicle::Status::MovingToEndOfStation && vehicle.status != Vehicle::Status::Arriving)) + || (vehicle.status != Vehicle::Status::movingToEndOfStation && vehicle.status != Vehicle::Status::arriving)) { CoordsXYZ steamOffset = ComputeSteamOffset( carEntry.SteamEffect.Vertical, carEntry.SteamEffect.Longitudinal, vehicle.pitch, vehicle.Orientation); @@ -6243,7 +5957,7 @@ static void play_scenery_door_open_sound(const CoordsXYZ& loc, WallElement* tile return; auto soundId = kDoorOpenSoundIds[EnumValue(doorSoundType)]; - OpenRCT2::Audio::Play3D(soundId, loc); + Play3D(soundId, loc); } /** @@ -6312,8 +6026,8 @@ void Vehicle::UpdateSceneryDoor() const template static void AnimateLandscapeDoor( - const CoordsXYZ& doorLocation, TrackElement& trackElement, const bool isLastVehicle, - const OpenRCT2::Audio::DoorSoundType doorSound, const CoordsXYZ& soundLocation) + const CoordsXYZ& doorLocation, TrackElement& trackElement, const bool isLastVehicle, const DoorSoundType doorSound, + const CoordsXYZ& soundLocation) { const auto doorState = isBackwards ? trackElement.GetDoorAState() : trackElement.GetDoorBState(); if (!isLastVehicle && doorState == kLandEdgeDoorFrameClosed) @@ -6324,7 +6038,7 @@ static void AnimateLandscapeDoor( trackElement.SetDoorBState(kLandEdgeDoorFrameOpening); MapAnimations::CreateTemporary(doorLocation, MapAnimations::TemporaryType::landEdgeDoor); - OpenRCT2::Audio::Play3D(kDoorOpenSoundIds[EnumValue(doorSound)], soundLocation); + Play3D(kDoorOpenSoundIds[EnumValue(doorSound)], soundLocation); } if (isLastVehicle) @@ -6335,7 +6049,7 @@ static void AnimateLandscapeDoor( trackElement.SetDoorBState(kLandEdgeDoorFrameClosing); MapAnimations::CreateTemporary(doorLocation, MapAnimations::TemporaryType::landEdgeDoor); - OpenRCT2::Audio::Play3D(kDoorCloseSoundIds[EnumValue(doorSound)], soundLocation); + Play3D(kDoorCloseSoundIds[EnumValue(doorSound)], soundLocation); } } @@ -6443,8 +6157,7 @@ static void vehicle_update_play_water_splash_sound() return; } - OpenRCT2::Audio::Play3D( - OpenRCT2::Audio::SoundId::waterSplash, { _vehicleCurPosition.x, _vehicleCurPosition.y, _vehicleCurPosition.z }); + Play3D(SoundId::waterSplash, { _vehicleCurPosition.x, _vehicleCurPosition.y, _vehicleCurPosition.z }); } /** @@ -6484,7 +6197,7 @@ void Vehicle::UpdateHandleWaterSplash() const } else { - if (trackType == TrackElemType::Down25ToFlat) + if (trackType == TrackElemType::down25ToFlat) { if (track_progress == 12) { @@ -6494,7 +6207,7 @@ void Vehicle::UpdateHandleWaterSplash() const } if (IsHead()) { - if (trackType == TrackElemType::Watersplash) + if (trackType == TrackElemType::watersplash) { if (track_progress == 48) { @@ -6674,7 +6387,7 @@ bool Vehicle::UpdateMotionCollisionDetection(const CoordsXYZ& loc, EntityId* oth return false; } - if (collideVehicle->status == Vehicle::Status::TravellingBoat && sub_state == BoatHireSubState::EnteringReturnPosition) + if (collideVehicle->status == Status::travellingBoat && sub_state == BoatHireSubState::EnteringReturnPosition) { return false; } @@ -6688,7 +6401,7 @@ bool Vehicle::UpdateMotionCollisionDetection(const CoordsXYZ& loc, EntityId* oth return true; } - if (status == Vehicle::Status::MovingToEndOfStation) + if (status == Status::movingToEndOfStation) { if (Orientation == 0) { @@ -6720,8 +6433,7 @@ bool Vehicle::UpdateMotionCollisionDetection(const CoordsXYZ& loc, EntityId* oth } } - if (collideVehicle->status == Vehicle::Status::TravellingBoat && status != Vehicle::Status::Arriving - && status != Vehicle::Status::Travelling) + if ((collideVehicle->status == Status::travellingBoat) && (status != Status::arriving) && (status != Status::travelling)) { return false; } @@ -6771,7 +6483,7 @@ void Vehicle::Sub6DBF3E() auto trackType = GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!ted.sequences[0].flags.has(SequenceFlag::trackOrigin)) { return; } @@ -6794,7 +6506,7 @@ void Vehicle::Sub6DBF3E() _vehicleStationIndex = tileElement->AsTrack()->GetStationIndex(); } - if (trackType == TrackElemType::TowerBase && this == gCurrentVehicle) + if (trackType == TrackElemType::towerBase && this == gCurrentVehicle) { if (track_progress > 3 && !HasFlag(VehicleFlags::PoweredCarInReverse)) { @@ -6814,7 +6526,7 @@ void Vehicle::Sub6DBF3E() } } - if (trackType != TrackElemType::EndStation || this != gCurrentVehicle) + if (trackType != TrackElemType::endStation || this != gCurrentVehicle) { return; } @@ -6920,7 +6632,7 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack( return false; } - if (trackType == TrackElemType::CableLiftHill && this == gCurrentVehicle) + if (trackType == TrackElemType::cableLiftHill && this == gCurrentVehicle) { _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_11; } @@ -6930,11 +6642,11 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack( if (next_vehicle_on_train.IsNull()) { SetBrakeClosedMultiTile(*tileElement->AsTrack(), TrackLocation, true); - if (TrackTypeIsBlockBrakes(trackType) || trackType == TrackElemType::EndStation) + if (TrackTypeIsBlockBrakes(trackType) || trackType == TrackElemType::endStation) { if (!(rideEntry.Cars[0].flags & CAR_ENTRY_FLAG_POWERED)) { - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::blockBrakeRelease, TrackLocation); + Play3D(SoundId::blockBrakeRelease, TrackLocation); } } MapInvalidateElement(TrackLocation, tileElement); @@ -6995,8 +6707,8 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack( tileElement = xyElement.element; location = { xyElement, curZ, static_cast(direction) }; } - if (tileElement->AsTrack()->GetTrackType() == TrackElemType::LeftReverser - || tileElement->AsTrack()->GetTrackType() == TrackElemType::RightReverser) + if (tileElement->AsTrack()->GetTrackType() == TrackElemType::leftReverser + || tileElement->AsTrack()->GetTrackType() == TrackElemType::rightReverser) { if (IsHead() && velocity <= 3.0_mph) { @@ -7040,12 +6752,12 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack( if ((carEntry->flags & CAR_ENTRY_FLAG_GO_KART) && TrackSubposition < VehicleTrackSubposition::GoKartsMovingToRightLane) { trackType = tileElement->AsTrack()->GetTrackType(); - if (trackType == TrackElemType::Flat || trackType == TrackElemType::LeftQuarterTurn3Tiles - || trackType == TrackElemType::RightQuarterTurn3Tiles || trackType == TrackElemType::LeftQuarterTurn5Tiles - || trackType == TrackElemType::RightQuarterTurn5Tiles || trackType == TrackElemType::LeftEighthToDiag - || trackType == TrackElemType::RightEighthToDiag || trackType == TrackElemType::LeftEighthToOrthogonal - || trackType == TrackElemType::RightEighthToOrthogonal || trackType == TrackElemType::DiagFlat - || trackType == TrackElemType::SBendLeft || trackType == TrackElemType::SBendRight + if (trackType == TrackElemType::flat || trackType == TrackElemType::leftQuarterTurn3Tiles + || trackType == TrackElemType::rightQuarterTurn3Tiles || trackType == TrackElemType::leftQuarterTurn5Tiles + || trackType == TrackElemType::rightQuarterTurn5Tiles || trackType == TrackElemType::leftEighthToDiag + || trackType == TrackElemType::rightEighthToDiag || trackType == TrackElemType::leftEighthToOrthogonal + || trackType == TrackElemType::rightEighthToOrthogonal || trackType == TrackElemType::diagFlat + || trackType == TrackElemType::sBendLeft || trackType == TrackElemType::sBendRight || ((curRide.lifecycleFlags & RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING) && tileElement->AsTrack()->IsStation())) { UpdateGoKartAttemptSwitchLanes(); @@ -7076,7 +6788,7 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack( } trackType = tileElement->AsTrack()->GetTrackType(); - if (trackType != TrackElemType::Brakes) + if (trackType != TrackElemType::brakes) { target_seat_rotation = tileElement->AsTrack()->GetSeatRotation(); } @@ -7087,12 +6799,12 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack( { ClearFlag(VehicleFlags::StoppedOnHoldingBrake); } - if (trackType == TrackElemType::OnRidePhoto) + if (trackType == TrackElemType::onRidePhoto) { tileElement->AsTrack()->SetPhotoTimeout(); MapAnimations::CreateTemporary(TrackLocation, MapAnimations::TemporaryType::onRidePhoto); } - if (trackType == TrackElemType::RotationControlToggle) + if (trackType == TrackElemType::rotationControlToggle) { Flags ^= VehicleFlags::SpinningIsLocked; } @@ -7113,7 +6825,7 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu while (true) { auto trackType = GetTrackType(); - if (trackType == TrackElemType::HeartLineTransferUp || trackType == TrackElemType::HeartLineTransferDown) + if (trackType == TrackElemType::heartLineTransferUp || trackType == TrackElemType::heartLineTransferDown) { if (track_progress == 80) { @@ -7133,7 +6845,7 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu { bool hasBrakesFailure = curRide.lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN && curRide.breakdownReasonPending == BREAKDOWN_BRAKES_FAILURE; - if (!hasBrakesFailure || curRide.mechanicStatus == RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES) + if (!hasBrakesFailure || curRide.mechanicStatus == MechanicStatus::hasFixedStationBrakes) { auto brakeSpeed = ChooseBrakeSpeed() << kTrackSpeedShiftAmount; @@ -7146,7 +6858,7 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu if (_vehicleF64E2C == 0) { _vehicleF64E2C++; - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::brakeRelease, { x, y, z }); + Play3D(SoundId::brakeRelease, { x, y, z }); } } } @@ -7165,13 +6877,13 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu acceleration += CalculateRiderBraking(); } - if ((trackType == TrackElemType::Flat && curRide.getRideTypeDescriptor().HasFlag(RtdFlag::hasLsmBehaviourOnFlat)) - || (trackType == TrackElemType::PoweredLift)) + if ((trackType == TrackElemType::flat && curRide.getRideTypeDescriptor().HasFlag(RtdFlag::hasLsmBehaviourOnFlat)) + || (trackType == TrackElemType::poweredLift)) { acceleration = GetRideTypeDescriptor(curRide.type).LegacyBoosterSettings.PoweredLiftAcceleration << kBoosterAccelerationShiftAmount; } - if (trackType == TrackElemType::BrakeForDrop) + if (trackType == TrackElemType::brakeForDrop) { if (IsHead()) { @@ -7189,7 +6901,7 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu } } } - if (trackType == TrackElemType::LogFlumeReverser) + if (trackType == TrackElemType::logFlumeReverser) { if (track_progress != 16 || velocity < 4.0_mph) { @@ -7235,7 +6947,7 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu moveInfo->z + GetRideTypeDescriptor(curRide.type).Heights.VehicleZOffset }; bool useReverserDistance = TrackSubposition == VehicleTrackSubposition::ReverserRCFrontBogie - && (trackType == TrackElemType::LeftReverser || trackType == TrackElemType::RightReverser) + && (trackType == TrackElemType::leftReverser || trackType == TrackElemType::rightReverser) && track_progress >= 30 && track_progress <= 66; // Loc6DB8A5 @@ -7243,7 +6955,7 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu nextVehiclePosition - _vehicleCurPosition, useReverserDistance); if (TrackSubposition == VehicleTrackSubposition::ReverserRCRearBogie - && (trackType == TrackElemType::LeftReverser || trackType == TrackElemType::RightReverser) + && (trackType == TrackElemType::leftReverser || trackType == TrackElemType::rightReverser) && track_progress == 96) { ReverseReverserCar(); @@ -7254,7 +6966,7 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu } _vehicleCurPosition = nextVehiclePosition; - Orientation = moveInfo->direction; + Orientation = moveInfo->yaw; roll = moveInfo->roll; pitch = moveInfo->pitch; @@ -7382,7 +7094,7 @@ bool Vehicle::UpdateTrackMotionBackwardsGetNewTrack(TrackElemType trackType, con tileElement = trackBeginEnd.begin_element; trackType = tileElement->AsTrack()->GetTrackType(); - if (trackType == TrackElemType::LeftReverser || trackType == TrackElemType::RightReverser) + if (trackType == TrackElemType::leftReverser || trackType == TrackElemType::rightReverser) { return false; } @@ -7454,7 +7166,7 @@ bool Vehicle::UpdateTrackMotionBackwardsGetNewTrack(TrackElemType trackType, con { trackType = tileElement->AsTrack()->GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.flags & TRACK_ELEM_FLAG_DOWN)) + if (!ted.flags.has(TrackElementFlag::down)) { _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_9; } @@ -7478,7 +7190,7 @@ bool Vehicle::UpdateTrackMotionBackwardsGetNewTrack(TrackElemType trackType, con } trackType = tileElement->AsTrack()->GetTrackType(); - if (trackType != TrackElemType::Brakes) + if (trackType != TrackElemType::brakes) { target_seat_rotation = tileElement->AsTrack()->GetSeatRotation(); } @@ -7507,7 +7219,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c while (true) { auto trackType = GetTrackType(); - if (trackType == TrackElemType::Flat && curRide.getRideTypeDescriptor().HasFlag(RtdFlag::hasLsmBehaviourOnFlat)) + if (trackType == TrackElemType::flat && curRide.getRideTypeDescriptor().HasFlag(RtdFlag::hasLsmBehaviourOnFlat)) { int32_t unkVelocity = _vehicleVelocityF64E08; if (unkVelocity < -524288) @@ -7552,7 +7264,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c remaining_distance += Geometry::getTranslationDistance(nextVehiclePosition - _vehicleCurPosition, false); _vehicleCurPosition = nextVehiclePosition; - Orientation = moveInfo->direction; + Orientation = moveInfo->yaw; roll = moveInfo->roll; pitch = moveInfo->pitch; @@ -7634,11 +7346,11 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c if (remaining_distance < 0x368A) { Loc6DCDE4(curRide); - return Vehicle::UpdateMiniGolfSubroutineStatus::stop; + return UpdateMiniGolfSubroutineStatus::stop; } acceleration = Geometry::getAccelerationFromPitch(pitch); _vehicleUnkF64E10++; - return Vehicle::UpdateMiniGolfSubroutineStatus::restart; + return UpdateMiniGolfSubroutineStatus::restart; } if (mini_golf_flags & MiniGolfFlag::Flag2) @@ -7656,11 +7368,11 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c if (remaining_distance < 0x368A) { Loc6DCDE4(curRide); - return Vehicle::UpdateMiniGolfSubroutineStatus::stop; + return UpdateMiniGolfSubroutineStatus::stop; } acceleration = Geometry::getAccelerationFromPitch(pitch); _vehicleUnkF64E10++; - return Vehicle::UpdateMiniGolfSubroutineStatus::restart; + return UpdateMiniGolfSubroutineStatus::restart; } mini_golf_flags &= ~MiniGolfFlag::Flag2; } @@ -7671,7 +7383,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c Vehicle* vEDI = getGameState().entities.GetEntity(vehicleIdx); if (vEDI == nullptr) { - return Vehicle::UpdateMiniGolfSubroutineStatus::stop; + return UpdateMiniGolfSubroutineStatus::stop; } if (!(vEDI->mini_golf_flags & MiniGolfFlag::Flag0) || (vEDI->mini_golf_flags & MiniGolfFlag::Flag2)) { @@ -7684,11 +7396,11 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c if (remaining_distance < 0x368A) { Loc6DCDE4(curRide); - return Vehicle::UpdateMiniGolfSubroutineStatus::stop; + return UpdateMiniGolfSubroutineStatus::stop; } acceleration = Geometry::getAccelerationFromPitch(pitch); _vehicleUnkF64E10++; - return Vehicle::UpdateMiniGolfSubroutineStatus::restart; + return UpdateMiniGolfSubroutineStatus::restart; } if (vEDI->var_D3 != 0) { @@ -7701,11 +7413,11 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c if (remaining_distance < 0x368A) { Loc6DCDE4(curRide); - return Vehicle::UpdateMiniGolfSubroutineStatus::stop; + return UpdateMiniGolfSubroutineStatus::stop; } acceleration = Geometry::getAccelerationFromPitch(pitch); _vehicleUnkF64E10++; - return Vehicle::UpdateMiniGolfSubroutineStatus::restart; + return UpdateMiniGolfSubroutineStatus::restart; } vEDI->mini_golf_flags &= ~MiniGolfFlag::Flag0; mini_golf_flags &= ~MiniGolfFlag::Flag0; @@ -7717,7 +7429,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c Vehicle* vEDI = getGameState().entities.GetEntity(vehicleIdx); if (vEDI == nullptr) { - return Vehicle::UpdateMiniGolfSubroutineStatus::stop; + return UpdateMiniGolfSubroutineStatus::stop; } if (!(vEDI->mini_golf_flags & MiniGolfFlag::Flag1) || (vEDI->mini_golf_flags & MiniGolfFlag::Flag2)) { @@ -7730,11 +7442,11 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c if (remaining_distance < 0x368A) { Loc6DCDE4(curRide); - return Vehicle::UpdateMiniGolfSubroutineStatus::stop; + return UpdateMiniGolfSubroutineStatus::stop; } acceleration = Geometry::getAccelerationFromPitch(pitch); _vehicleUnkF64E10++; - return Vehicle::UpdateMiniGolfSubroutineStatus::restart; + return UpdateMiniGolfSubroutineStatus::restart; } if (vEDI->var_D3 != 0) { @@ -7747,11 +7459,11 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c if (remaining_distance < 0x368A) { Loc6DCDE4(curRide); - return Vehicle::UpdateMiniGolfSubroutineStatus::stop; + return UpdateMiniGolfSubroutineStatus::stop; } acceleration = Geometry::getAccelerationFromPitch(pitch); _vehicleUnkF64E10++; - return Vehicle::UpdateMiniGolfSubroutineStatus::restart; + return UpdateMiniGolfSubroutineStatus::restart; } vEDI->mini_golf_flags &= ~MiniGolfFlag::Flag1; mini_golf_flags &= ~MiniGolfFlag::Flag1; @@ -7783,26 +7495,26 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c if (remaining_distance < 0x368A) { Loc6DCDE4(curRide); - return Vehicle::UpdateMiniGolfSubroutineStatus::stop; + return UpdateMiniGolfSubroutineStatus::stop; } acceleration = Geometry::getAccelerationFromPitch(pitch); _vehicleUnkF64E10++; - return Vehicle::UpdateMiniGolfSubroutineStatus::restart; + return UpdateMiniGolfSubroutineStatus::restart; } mini_golf_flags |= MiniGolfFlag::Flag4; mini_golf_flags &= ~MiniGolfFlag::Flag3; } - return Vehicle::UpdateMiniGolfSubroutineStatus::carryOn; + return UpdateMiniGolfSubroutineStatus::carryOn; } [[nodiscard]] Vehicle::UpdateMiniGolfSubroutineStatus Vehicle::Loc6DC462(const Ride& curRide) { while (true) { - Vehicle::UpdateMiniGolfSubroutineStatus flagsStatus = Vehicle::UpdateMiniGolfSubroutineStatus::restart; - while (flagsStatus == Vehicle::UpdateMiniGolfSubroutineStatus::restart) + UpdateMiniGolfSubroutineStatus flagsStatus = UpdateMiniGolfSubroutineStatus::restart; + while (flagsStatus == UpdateMiniGolfSubroutineStatus::restart) { flagsStatus = UpdateTrackMotionMiniGolfFlagsStatus(curRide); } @@ -7982,7 +7694,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c } _vehicleCurPosition = trackPos; - Orientation = moveInfo->direction; + Orientation = moveInfo->yaw; roll = moveInfo->roll; pitch = moveInfo->pitch; @@ -8032,7 +7744,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c remaining_distance = 0x368A; acceleration = Geometry::getAccelerationFromPitch(pitch); _vehicleUnkF64E10++; - return Vehicle::UpdateMiniGolfSubroutineStatus::restart; + return UpdateMiniGolfSubroutineStatus::restart; } TrackLocation = trackPos; @@ -8072,7 +7784,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c } _vehicleCurPosition = trackPos; - Orientation = moveInfo->direction; + Orientation = moveInfo->yaw; roll = moveInfo->roll; pitch = moveInfo->pitch; @@ -8175,12 +7887,12 @@ void Vehicle::Loc6DCE02(const Ride& curRide) auto trackType = GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.sequences[0].flags & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!ted.sequences[0].flags.has(SequenceFlag::trackOrigin)) { return; } _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_3; - if (trackType != TrackElemType::EndStation) + if (trackType != TrackElemType::endStation) { return; } @@ -8342,11 +8054,11 @@ static uint8_t modified_speed(TrackElemType trackType, VehicleTrackSubposition t uint8_t speedModifier = FULL_SPEED; - if (trackType == TrackElemType::LeftQuarterTurn1Tile) + if (trackType == TrackElemType::leftQuarterTurn1Tile) { speedModifier = (trackSubposition == VehicleTrackSubposition::GoKartsLeftLane) ? HALF_SPEED : THREE_QUARTER_SPEED; } - else if (trackType == TrackElemType::RightQuarterTurn1Tile) + else if (trackType == TrackElemType::rightQuarterTurn1Tile) { speedModifier = (trackSubposition == VehicleTrackSubposition::GoKartsRightLane) ? HALF_SPEED : THREE_QUARTER_SPEED; } @@ -8632,7 +8344,7 @@ int32_t Vehicle::UpdateTrackMotion(int32_t* outStation) } } - if (vehicle->GetTrackType() == TrackElemType::Watersplash) + if (vehicle->GetTrackType() == TrackElemType::watersplash) { if (vehicle->track_progress >= 48 && vehicle->track_progress <= 128) { @@ -8750,7 +8462,7 @@ void Vehicle::UpdateCrossings() const MapGetTrackElementAtOfTypeSeq(frontVehicle->TrackLocation, frontVehicle->GetTrackType(), 0) }; int32_t curZ = frontVehicle->TrackLocation.z; - if (xyElement.element != nullptr && status != Vehicle::Status::Arriving) + if (xyElement.element != nullptr && status != Status::arriving) { int16_t autoReserveAhead = 4 + abs(velocity) / 150000; int16_t crossingBonus = 0; @@ -8808,7 +8520,7 @@ void Vehicle::UpdateCrossings() const // Ensure trains near a station don't block possible crossings after the stop, // except when they are departing - if (xyElement.element->AsTrack()->IsStation() && status != Vehicle::Status::Departing) + if (xyElement.element->AsTrack()->IsStation() && status != Status::departing) { break; } @@ -8823,7 +8535,7 @@ void Vehicle::UpdateCrossings() const } // Ensure departing trains don't clear blocked crossings behind them that might already be blocked by another incoming train - uint8_t freeCount = travellingForwards && status != Vehicle::Status::Departing ? 3 : 1; + uint8_t freeCount = travellingForwards && status != Status::departing ? 3 : 1; while (freeCount-- > 0) { if (travellingForwards) @@ -8850,10 +8562,10 @@ void Vehicle::Claxon() const switch (rideEntry->Cars[vehicle_type].soundRange) { case SoundRange::steamWhistle: - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::trainWhistle, { x, y, z }); + Play3D(SoundId::trainWhistle, { x, y, z }); break; case SoundRange::tramBell: - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::tram, { x, y, z }); + Play3D(SoundId::tram, { x, y, z }); break; default: break; @@ -8890,7 +8602,7 @@ Vehicle* Vehicle::GetCar(size_t carIndex) const return car; } -void Vehicle::SetState(Vehicle::Status vehicleStatus, uint8_t subState) +void Vehicle::SetState(Status vehicleStatus, uint8_t subState) { status = vehicleStatus; sub_state = subState; diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h index 8dfb21fc6a70..48c21212d5fa 100644 --- a/src/openrct2/ride/Vehicle.h +++ b/src/openrct2/ride/Vehicle.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,13 +16,10 @@ #include "../world/Location.hpp" #include "Angles.h" #include "CarEntry.h" -#include "Station.h" #include "VehicleColour.h" #include "VehicleSubpositionData.h" -#include #include -#include struct Ride; struct RideObjectEntry; @@ -32,8 +29,8 @@ struct PaintSession; struct GForces { - int32_t VerticalG{}; - int32_t LateralG{}; + int32_t verticalG{}; + int32_t lateralG{}; }; // Size: 0x09 @@ -42,20 +39,20 @@ struct VehicleInfo int16_t x; // 0x00 int16_t y; // 0x02 int16_t z; // 0x04 - uint8_t direction; // 0x06 + uint8_t yaw; // 0x06 VehiclePitch pitch; // 0x07 VehicleRoll roll; // 0x08 - bool IsInvalid() const + bool isInvalid() const { - return x == 0 && y == 0 && z == 0 && direction == 0 && pitch == VehiclePitch::flat && roll == VehicleRoll::unbanked; + return x == 0 && y == 0 && z == 0 && yaw == 0 && pitch == VehiclePitch::flat && roll == VehicleRoll::unbanked; } }; struct SoundIdVolume; -constexpr uint16_t VehicleTrackDirectionMask = 0b0000000000000011; -constexpr uint16_t VehicleTrackTypeMask = 0b1111111111111100; +static constexpr uint16_t kVehicleTrackDirectionMask = 0b0000000000000011; +static constexpr uint16_t kVehicleTrackTypeMask = 0b1111111111111100; enum class MiniGolfAnimation : uint8_t; @@ -65,43 +62,43 @@ struct Vehicle : EntityBase enum class Type : uint8_t { - Head, - Tail, + head, + tail, }; enum class Status : uint8_t { - MovingToEndOfStation, - WaitingForPassengers, - WaitingToDepart, - Departing, - Travelling, - Arriving, - UnloadingPassengers, - TravellingBoat, - Crashing, - Crashed, - TravellingDodgems, - Swinging, - Rotating, - FerrisWheelRotating, - SimulatorOperating, - ShowingFilm, - SpaceRingsOperating, - TopSpinOperating, - HauntedHouseOperating, - DoingCircusShow, - CrookedHouseOperating, - WaitingForCableLift, - TravellingCableLift, - Stopping, - WaitingForPassengers17, - WaitingToStart, - Starting, - Operating1A, - Stopping1B, - UnloadingPassengers1C, - StoppedByBlockBrakes + movingToEndOfStation, + waitingForPassengers, + waitingToDepart, + departing, + travelling, + arriving, + unloadingPassengers, + travellingBoat, + crashing, + crashed, + travellingDodgems, + swinging, + rotating, + ferrisWheelRotating, + simulatorOperating, + showingFilm, + spaceRingsOperating, + topSpinOperating, + hauntedHouseOperating, + doingCircusShow, + crookedHouseOperating, + waitingForCableLift, + travellingCableLift, + stopping, + waitingForPassengers17, + waitingToStart, + starting, + operating1A, + stopping1B, + unloadingPassengers1C, + stoppedByBlockBrakes, }; Type SubType; @@ -222,7 +219,7 @@ struct Vehicle : EntityBase constexpr bool IsHead() const { - return SubType == Vehicle::Type::Head; + return SubType == Vehicle::Type::head; } void Update(); Vehicle* GetHead(); @@ -256,19 +253,19 @@ struct Vehicle : EntityBase bool IsOnCoveredTrack() const; uint8_t GetTrackDirection() const { - return TrackTypeAndDirection & VehicleTrackDirectionMask; + return TrackTypeAndDirection & kVehicleTrackDirectionMask; } void SetTrackType(OpenRCT2::TrackElemType trackType) { // set the upper 14 bits to 0, then set track type - TrackTypeAndDirection &= ~VehicleTrackTypeMask; + TrackTypeAndDirection &= ~kVehicleTrackTypeMask; TrackTypeAndDirection |= EnumValue(trackType) << 2; } void SetTrackDirection(uint8_t trackDirection) { // set the lower 2 bits only - TrackTypeAndDirection &= ~VehicleTrackDirectionMask; - TrackTypeAndDirection |= trackDirection & VehicleTrackDirectionMask; + TrackTypeAndDirection &= ~kVehicleTrackDirectionMask; + TrackTypeAndDirection |= trackDirection & kVehicleTrackDirectionMask; } bool HasFlag(uint32_t flag) const { @@ -468,19 +465,20 @@ namespace OpenRCT2::VehicleFlags constexpr uint32_t PoweredCarInReverse = (1 << 3); constexpr uint32_t ReadyToDepart = (1 << 4); constexpr uint32_t Testing = (1 << 5); - constexpr uint32_t CurrentlyColliding = (1 << 6); // When go-karts are colliding, they have a higher chance of changing - // lanes - constexpr uint32_t StoppedOnLift = (1 << 7); // Used on rides when safety cutout stops them on a lift + // When go-karts are colliding, they have a higher chance of changing lanes + constexpr uint32_t CurrentlyColliding = (1 << 6); + // Used on vehicles when a safety cut-out stops them, such as RCs on a lift hill and powered rides + constexpr uint32_t StoppedBySafetyCutOut = (1 << 7); constexpr uint32_t CarIsBroken = (1 << 8); constexpr uint32_t TrainIsBroken = (1 << 9); constexpr uint32_t StoppedOnHoldingBrake = (1 << 10); - constexpr uint32_t CarIsInverted = (1 << 11); // Used on rides where trains can run for extended periods of time, - // i.e. the Flying, Lay-down and Multi-dimension RCs. - constexpr uint32_t ReverseInclineCompletedLap = (1 << 12); // Set when the vehicle travels backwards through the station for - // the first time - constexpr uint32_t SpinningIsLocked = (1 << 13); // After passing a rotation toggle track piece this will enable - constexpr uint32_t MoveSingleCar = (1 << 14); // OpenRCT2 Flag: Used to override UpdateMotion to move the position of - // an individual car on a train + // Used on vehicles that can run inverted for extended periods of time, i.e. the Flying, Lay-down and Multi-Dimension trains + constexpr uint32_t CarIsInverted = (1 << 11); + // Set when the vehicle travels backwards through the station for the first time + constexpr uint32_t ReverseInclineCompletedLap = (1 << 12); + constexpr uint32_t SpinningIsLocked = (1 << 13); // After passing a rotation toggle track piece this will enable + // OpenRCT2 Flag: Used to override UpdateMotion to move the position of an individual car on a train + constexpr uint32_t MoveSingleCar = (1 << 14); constexpr uint32_t Crashed = (1 << 15); // Car displays as smoke plume constexpr uint32_t CarIsReversed = (1 << 16); // Car is displayed running backwards } // namespace OpenRCT2::VehicleFlags diff --git a/src/openrct2/ride/VehicleColour.h b/src/openrct2/ride/VehicleColour.h index 2d9dcace22e2..3da5f402ad69 100644 --- a/src/openrct2/ride/VehicleColour.h +++ b/src/openrct2/ride/VehicleColour.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/VehicleData.cpp b/src/openrct2/ride/VehicleData.cpp index 9fd0a8ae1339..16e2e50850f0 100644 --- a/src/openrct2/ride/VehicleData.cpp +++ b/src/openrct2/ride/VehicleData.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -794,4 +794,270 @@ const uint8_t MotionSimulatorTimeToSpriteMap[] = { }; const int32_t MotionSimulatorTimeToSpriteMapCount = static_cast(std::size(MotionSimulatorTimeToSpriteMap)); + +const uint8_t kSpaceRingsTimeToSpriteMap[] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, + 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, + 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, + 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, + 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 0, + 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, + 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, + 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, + 21, 22, 22, 22, 23, 23, 23, 0, 0, 0, 1, 1, 1, 2, 2, 2, + 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, + 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, + 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, + 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 0, + 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, + 2, 1, 1, 1, 1, 0, 0, 0, 0, 23, 23, 23, 22, 22, 22, 21, + 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, + 16, 15, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, + 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 5, + 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, + 0, 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, + 18, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, + 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, + 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, + 2, 2, 2, 1, 1, 1, 0, 0, 0, 23, 23, 23, 22, 22, 22, 21, + 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, + 16, 15, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, + 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, + 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, + 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, + 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 27, + 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, + 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, + 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, + 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, + 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, + 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, + 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, + 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, + 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, + 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, + 78, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, + 82, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, + 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 86, 86, 86, 86, 86, 86, 86, 85, + 85, 85, 85, 85, 85, 84, 84, 84, 84, 84, 84, 83, 83, 83, 83, 83, + 82, 82, 82, 82, 82, 81, 81, 81, 81, 80, 80, 80, 80, 79, 79, 79, + 78, 78, 78, 77, 77, 77, 76, 76, 76, 75, 75, 75, 74, 74, 74, 73, + 73, 73, 72, 72, 72, 71, 71, 71, 70, 70, 70, 69, 69, 69, 68, 68, + 68, 67, 67, 67, 66, 66, 66, 65, 65, 65, 64, 64, 64, 63, 63, 63, + 62, 62, 62, 61, 61, 61, 60, 60, 60, 59, 59, 59, 58, 58, 58, 57, + 57, 57, 56, 56, 56, 55, 55, 55, 54, 54, 54, 53, 53, 53, 52, 52, + 52, 51, 51, 51, 50, 50, 50, 49, 49, 49, 48, 48, 48, 47, 47, 47, + 46, 46, 46, 45, 45, 45, 44, 44, 44, 43, 43, 43, 42, 42, 42, 41, + 41, 41, 40, 40, 40, 39, 39, 39, 38, 38, 38, 37, 37, 37, 36, 36, + 36, 35, 35, 35, 34, 34, 34, 33, 33, 33, 32, 32, 32, 31, 31, 31, + 30, 30, 30, 30, 29, 29, 29, 29, 28, 28, 28, 28, 28, 27, 27, 27, + 27, 27, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 24, 24, + 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, + 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, + 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, + 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, + 22, 22, 22, 23, 23, 23, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, + 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, + 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, + 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, + 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 0, 0, + 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, + 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, + 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, + 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, + 22, 22, 22, 23, 23, 23, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, + 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, + 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, + 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, + 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, + 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 13, + 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, 8, + 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, + 2, 2, 1, 1, 1, 0, 0, 0, 23, 23, 23, 22, 22, 22, 21, 21, + 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, 16, + 15, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, + 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 5, 5, + 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, + 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, + 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 13, + 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, 8, + 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, + 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, + 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, + 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, + 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, + 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, + 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, + 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, + 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, + 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, + 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, + 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 80, 81, + 81, 81, 81, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 84, 84, 84, + 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, + 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 86, + 86, 86, 86, 86, 86, 86, 85, 85, 85, 85, 85, 85, 84, 84, 84, 84, + 84, 84, 83, 83, 83, 83, 83, 82, 82, 82, 82, 82, 81, 81, 81, 81, + 80, 80, 80, 80, 79, 79, 79, 78, 78, 78, 77, 77, 77, 76, 76, 76, + 75, 75, 75, 74, 74, 74, 73, 73, 73, 72, 72, 72, 71, 71, 71, 70, + 70, 70, 69, 69, 69, 68, 68, 68, 67, 67, 67, 66, 66, 66, 65, 65, + 65, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 61, 60, 60, 60, + 59, 59, 59, 58, 58, 58, 57, 57, 57, 56, 56, 56, 55, 55, 55, 54, + 54, 54, 53, 53, 53, 52, 52, 52, 51, 51, 51, 50, 50, 50, 49, 49, + 49, 48, 48, 48, 47, 47, 47, 46, 46, 46, 45, 45, 45, 44, 44, 44, + 43, 43, 43, 42, 42, 42, 41, 41, 41, 40, 40, 40, 39, 39, 39, 38, + 38, 38, 37, 37, 37, 36, 36, 36, 35, 35, 35, 34, 34, 34, 33, 33, + 33, 32, 32, 32, 31, 31, 31, 30, 30, 30, 30, 29, 29, 29, 29, 28, + 28, 28, 28, 28, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 25, + 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 0, + 255, +}; + +static constexpr int8_t kSwingingTimeToSpriteMap0[] = { + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, + -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, 0, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap1[] = { + 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, -1, -1, -1, -1, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, + -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap2[] = { + 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, + 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, + -1, -1, -1, -2, -2, -2, -3, -3, -3, -3, -4, -4, -4, -4, -4, -5, -5, -5, -5, -5, -5, -6, -6, -6, -6, -6, + -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, + -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap3[] = { + 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, -1, + -1, -2, -2, -3, -3, -4, -4, -4, -5, -5, -5, -5, -6, -6, -6, -6, -6, -7, -7, -7, -7, -7, -7, -8, -8, -8, -8, + -8, -8, -8, -8, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, + -7, -7, -7, -7, -6, -6, -6, -6, -6, -5, -5, -5, -5, -4, -4, -4, -3, -3, -2, -2, -1, -1, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap4[] = { + 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, + 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, -1, + -1, -1, -1, -1, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -5, -5, -5, -5, -5, -5, -5, -6, -6, + -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -4, -4, + -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap5[] = { + 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, + 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, + 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, + 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, + 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, -1, -1, -1, -1, -2, -2, -2, -2, -3, -3, -3, -3, + -4, -4, -4, -4, -5, -5, -5, -5, -6, -6, -6, -6, -7, -7, -7, -7, -8, -8, -8, -8, -9, -9, -9, -9, + -10, -10, -10, -10, -11, -11, -11, -11, -12, -12, -12, -12, -13, -13, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, + -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, + -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, + -5, -5, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, 0, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap6[] = { + 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, + 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, + 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, + 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 22, + 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 15, + 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, + 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, -1, + -1, -1, -2, -2, -2, -3, -3, -3, -4, -4, -4, -5, -5, -5, -6, -6, -6, -7, -7, -7, -8, -8, -8, + -9, -9, -9, -10, -10, -10, -11, -11, -11, -12, -12, -12, -13, -13, -13, -14, -14, -14, -15, -15, -15, -16, -16, + -16, -17, -17, -17, -18, -18, -18, -19, -19, -19, -20, -20, -20, -21, -21, -21, -22, -22, -22, -23, -23, -23, -23, + -23, -24, -24, -24, -24, -24, -24, -24, -24, -24, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, + -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, + -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, + -6, -6, -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -1, 0, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap7[] = { + 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, + 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, + 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, + 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, -35, + -35, -35, -34, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31, -31, -30, -30, -30, -29, -29, -29, -28, -28, + -28, -27, -27, -27, -26, -26, -26, -25, -25, -25, -24, -24, -24, -23, -23, -23, -22, -22, -22, -21, -21, -21, + -20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, + -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, + -6, -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -1, 0, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap8[] = { + 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, + 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 31, + 31, 31, 31, 31, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, + 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 0, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap9[] = { + 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, + 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 31, + 31, 31, 31, 31, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, + 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 0, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap10[] = { + 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, + 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 11, + 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, + 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 31, 31, 31, 31, 30, 30, 30, 30, 29, 29, 29, 29, 28, + 28, 28, 28, 27, 27, 27, 27, 26, 26, 26, 26, 25, 25, 25, 25, 24, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 22, 21, 21, 21, + 21, 20, 20, 20, 20, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, + 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, + 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 0, 0, -128, +}; +static constexpr int8_t kSwingingTimeToSpriteMap11[] = { + 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, + 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, + 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, + 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 0, -128, +}; + +const int8_t* kSwingingTimeToSpriteMaps[] = { + kSwingingTimeToSpriteMap0, kSwingingTimeToSpriteMap1, kSwingingTimeToSpriteMap2, kSwingingTimeToSpriteMap3, + kSwingingTimeToSpriteMap4, kSwingingTimeToSpriteMap5, kSwingingTimeToSpriteMap6, kSwingingTimeToSpriteMap7, + kSwingingTimeToSpriteMap8, kSwingingTimeToSpriteMap9, kSwingingTimeToSpriteMap10, kSwingingTimeToSpriteMap11, +}; // clang-format on diff --git a/src/openrct2/ride/VehicleData.h b/src/openrct2/ride/VehicleData.h index 5885c01efa3f..33dd52927de5 100644 --- a/src/openrct2/ride/VehicleData.h +++ b/src/openrct2/ride/VehicleData.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -25,3 +25,8 @@ extern const TopSpinTimeToSpriteMap* kTopSpinTimeToSpriteMaps[]; extern const uint8_t MotionSimulatorTimeToSpriteMap[]; extern const int32_t MotionSimulatorTimeToSpriteMapCount; + +extern const uint8_t kSpaceRingsTimeToSpriteMap[]; + +/** rct2: 0x0099F9D0 */ +extern const int8_t* kSwingingTimeToSpriteMaps[]; diff --git a/src/openrct2/ride/VehicleGeometry.cpp b/src/openrct2/ride/VehicleGeometry.cpp index d834bb1e84ad..4eebc866e16c 100644 --- a/src/openrct2/ride/VehicleGeometry.cpp +++ b/src/openrct2/ride/VehicleGeometry.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/VehicleGeometry.h b/src/openrct2/ride/VehicleGeometry.h index 4d2e64958cbd..9ec6d311d066 100644 --- a/src/openrct2/ride/VehicleGeometry.h +++ b/src/openrct2/ride/VehicleGeometry.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ride/VehicleRiderControl.cpp b/src/openrct2/ride/VehicleRiderControl.cpp index 9e0224f314b1..43d8141114e1 100644 --- a/src/openrct2/ride/VehicleRiderControl.cpp +++ b/src/openrct2/ride/VehicleRiderControl.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -165,54 +165,54 @@ int32_t Vehicle::CalculateRiderBraking() const auto trackType = GetTrackType(); switch (trackType) { - case TrackElemType::LeftQuarterTurn3Tiles: - case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn3Tiles: + case TrackElemType::rightQuarterTurn3Tiles: targetSpeed = riderSettings.minSpeed; brakeThreshold = riderSettings.brakeThreshold / 2; break; - case TrackElemType::LeftQuarterTurn3TilesUp25: - case TrackElemType::RightQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25: - case TrackElemType::RightQuarterTurn3TilesDown25: - case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: - case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: - case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: - case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + case TrackElemType::leftQuarterTurn3TilesUp25: + case TrackElemType::rightQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25: + case TrackElemType::rightQuarterTurn3TilesDown25: + case TrackElemType::leftBankToLeftQuarterTurn3TilesUp25: + case TrackElemType::rightBankToRightQuarterTurn3TilesUp25: + case TrackElemType::leftQuarterTurn3TilesDown25ToLeftBank: + case TrackElemType::rightQuarterTurn3TilesDown25ToRightBank: targetSpeed = (riderSettings.maxSpeed + 3 * riderSettings.minSpeed) / 4; brakeThreshold = 3 * riderSettings.brakeThreshold / 4; break; - case TrackElemType::LeftHalfBankedHelixUpSmall: - case TrackElemType::RightHalfBankedHelixUpSmall: - case TrackElemType::LeftHalfBankedHelixDownSmall: - case TrackElemType::RightHalfBankedHelixDownSmall: - case TrackElemType::LeftBankedQuarterTurn3TileUp25: - case TrackElemType::RightBankedQuarterTurn3TileUp25: - case TrackElemType::LeftBankedQuarterTurn3TileDown25: - case TrackElemType::RightBankedQuarterTurn3TileDown25: - case TrackElemType::LeftBankedQuarterTurn3Tiles: - case TrackElemType::RightBankedQuarterTurn3Tiles: - case TrackElemType::LeftQuarterTurn5Tiles: - case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::leftHalfBankedHelixUpSmall: + case TrackElemType::rightHalfBankedHelixUpSmall: + case TrackElemType::leftHalfBankedHelixDownSmall: + case TrackElemType::rightHalfBankedHelixDownSmall: + case TrackElemType::leftBankedQuarterTurn3TileUp25: + case TrackElemType::rightBankedQuarterTurn3TileUp25: + case TrackElemType::leftBankedQuarterTurn3TileDown25: + case TrackElemType::rightBankedQuarterTurn3TileDown25: + case TrackElemType::leftBankedQuarterTurn3Tiles: + case TrackElemType::rightBankedQuarterTurn3Tiles: + case TrackElemType::leftQuarterTurn5Tiles: + case TrackElemType::rightQuarterTurn5Tiles: targetSpeed = (riderSettings.maxSpeed + riderSettings.minSpeed) / 2; break; - case TrackElemType::LeftHalfBankedHelixUpLarge: - case TrackElemType::RightHalfBankedHelixUpLarge: - case TrackElemType::LeftHalfBankedHelixDownLarge: - case TrackElemType::RightHalfBankedHelixDownLarge: - case TrackElemType::LeftBankedQuarterTurn5TileUp25: - case TrackElemType::RightBankedQuarterTurn5TileUp25: - case TrackElemType::LeftBankedQuarterTurn5TileDown25: - case TrackElemType::RightBankedQuarterTurn5TileDown25: - case TrackElemType::BankedLeftQuarterTurn5Tiles: - case TrackElemType::BankedRightQuarterTurn5Tiles: - case TrackElemType::LeftQuarterTurn5TilesUp25: - case TrackElemType::RightQuarterTurn5TilesUp25: - case TrackElemType::LeftQuarterTurn5TilesDown25: - case TrackElemType::RightQuarterTurn5TilesDown25: - case TrackElemType::LeftEighthToDiag: - case TrackElemType::RightEighthToDiag: - case TrackElemType::LeftEighthToOrthogonal: - case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::leftHalfBankedHelixUpLarge: + case TrackElemType::rightHalfBankedHelixUpLarge: + case TrackElemType::leftHalfBankedHelixDownLarge: + case TrackElemType::rightHalfBankedHelixDownLarge: + case TrackElemType::leftBankedQuarterTurn5TileUp25: + case TrackElemType::rightBankedQuarterTurn5TileUp25: + case TrackElemType::leftBankedQuarterTurn5TileDown25: + case TrackElemType::rightBankedQuarterTurn5TileDown25: + case TrackElemType::bankedLeftQuarterTurn5Tiles: + case TrackElemType::bankedRightQuarterTurn5Tiles: + case TrackElemType::leftQuarterTurn5TilesUp25: + case TrackElemType::rightQuarterTurn5TilesUp25: + case TrackElemType::leftQuarterTurn5TilesDown25: + case TrackElemType::rightQuarterTurn5TilesDown25: + case TrackElemType::leftEighthToDiag: + case TrackElemType::rightEighthToDiag: + case TrackElemType::leftEighthToOrthogonal: + case TrackElemType::rightEighthToOrthogonal: targetSpeed = (3 * riderSettings.maxSpeed + riderSettings.minSpeed) / 4; break; default: diff --git a/src/openrct2/ride/VehicleSubpositionData.cpp b/src/openrct2/ride/VehicleSubpositionData.cpp index ca6b4009c914..a0e87bdd88c0 100644 --- a/src/openrct2/ride/VehicleSubpositionData.cpp +++ b/src/openrct2/ride/VehicleSubpositionData.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -39624,65 +39624,65 @@ static constexpr const VehicleInfoList *TrackVehicleInfoListDefault[] = { &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown0, &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown1, &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown2, &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown3, // RightFlyerLargeHalfLoopUninvertedDown &TrackVehicleInfo_8E644E, &TrackVehicleInfo_8E69F9, &TrackVehicleInfo_8E6FA4, &TrackVehicleInfo_8E754F, // FlyerHalfLoopInvertedUp &TrackVehicleInfo_FlyerHalfLoopUninvertedDown0, &TrackVehicleInfo_FlyerHalfLoopUninvertedDown1, &TrackVehicleInfo_FlyerHalfLoopUninvertedDown2, &TrackVehicleInfo_FlyerHalfLoopUninvertedDown3, // FlyerHalfLoopUninvertedDown - &TrackVehicleInfoLeftEighthToDiagUp250, &TrackVehicleInfoLeftEighthToDiagUp251, &TrackVehicleInfoLeftEighthToDiagUp252, &TrackVehicleInfoLeftEighthToDiagUp253, // TrackElemType::LeftEighthToDiagUp25 - &TrackVehicleInfoRightEighthToDiagUp250, &TrackVehicleInfoRightEighthToDiagUp251, &TrackVehicleInfoRightEighthToDiagUp252, &TrackVehicleInfoRightEighthToDiagUp253, // TrackElemType::RightEighthToDiagUp25 - &TrackVehicleInfoLeftEighthToDiagDown250, &TrackVehicleInfoLeftEighthToDiagDown251, &TrackVehicleInfoLeftEighthToDiagDown252, &TrackVehicleInfoLeftEighthToDiagDown253, // TrackElemType::LeftEighthToDiagDown25 - &TrackVehicleInfoRightEighthToDiagDown250, &TrackVehicleInfoRightEighthToDiagDown251, &TrackVehicleInfoRightEighthToDiagDown252, &TrackVehicleInfoRightEighthToDiagDown253, // TrackElemType::RightEighthToDiagDown25 - &TrackVehicleInfoLeftEighthToOrthogonalUp250, &TrackVehicleInfoLeftEighthToOrthogonalUp251, &TrackVehicleInfoLeftEighthToOrthogonalUp252, &TrackVehicleInfoLeftEighthToOrthogonalUp253, // TrackElemType::LeftEighthToOrthogonalUp25 - &TrackVehicleInfoRightEighthToOrthogonalUp250, &TrackVehicleInfoRightEighthToOrthogonalUp251, &TrackVehicleInfoRightEighthToOrthogonalUp252, &TrackVehicleInfoRightEighthToOrthogonalUp253, // TrackElemType::RightEighthToOrthogonalUp25 - &TrackVehicleInfoLeftEighthToOrthogonalDown250, &TrackVehicleInfoLeftEighthToOrthogonalDown251, &TrackVehicleInfoLeftEighthToOrthogonalDown252, &TrackVehicleInfoLeftEighthToOrthogonalDown253, // TrackElemType::LeftEighthToOrthogonalDown25 - &TrackVehicleInfoRightEighthToOrthogonalDown250, &TrackVehicleInfoRightEighthToOrthogonalDown251, &TrackVehicleInfoRightEighthToOrthogonalDown252, &TrackVehicleInfoRightEighthToOrthogonalDown253, // TrackElemType::RightEighthToOrthogonalDown25 - - &TrackVehicleInfoDiagUp25ToLeftBankedUp250, &TrackVehicleInfoDiagUp25ToLeftBankedUp251, &TrackVehicleInfoDiagUp25ToLeftBankedUp252, &TrackVehicleInfoDiagUp25ToLeftBankedUp253, // TrackElemType::DiagUp25ToLeftBankedUp25 - &TrackVehicleInfoDiagUp25ToRightBankedUp250, &TrackVehicleInfoDiagUp25ToRightBankedUp251, &TrackVehicleInfoDiagUp25ToRightBankedUp252, &TrackVehicleInfoDiagUp25ToRightBankedUp253, // TrackElemType::DiagUp25ToRightBankedUp25 - &TrackVehicleInfoDiagLeftBankedUp25ToUp250, &TrackVehicleInfoDiagLeftBankedUp25ToUp251, &TrackVehicleInfoDiagLeftBankedUp25ToUp252, &TrackVehicleInfoDiagLeftBankedUp25ToUp253, // TrackElemType::DiagLeftBankedUp25ToUp25 - &TrackVehicleInfoDiagRightBankedUp25ToUp250, &TrackVehicleInfoDiagRightBankedUp25ToUp251, &TrackVehicleInfoDiagRightBankedUp25ToUp252, &TrackVehicleInfoDiagRightBankedUp25ToUp253, // TrackElemType::DiagRightBankedUp25ToUp25 - &TrackVehicleInfoDiagDown25ToLeftBankedDown250, &TrackVehicleInfoDiagDown25ToLeftBankedDown251, &TrackVehicleInfoDiagDown25ToLeftBankedDown252, &TrackVehicleInfoDiagDown25ToLeftBankedDown253, // TrackElemType::DiagDown25ToLeftBankedDown25 - &TrackVehicleInfoDiagDown25ToRightBankedDown250, &TrackVehicleInfoDiagDown25ToRightBankedDown251, &TrackVehicleInfoDiagDown25ToRightBankedDown252, &TrackVehicleInfoDiagDown25ToRightBankedDown253, // TrackElemType::DiagDown25ToRightBankedDown25 - &TrackVehicleInfoDiagLeftBankedDown25ToDown250, &TrackVehicleInfoDiagLeftBankedDown25ToDown251, &TrackVehicleInfoDiagLeftBankedDown25ToDown252, &TrackVehicleInfoDiagLeftBankedDown25ToDown253, // TrackElemType::DiagLeftBankedDown25ToDown25 - &TrackVehicleInfoDiagRightBankedDown25ToDown250, &TrackVehicleInfoDiagRightBankedDown25ToDown251, &TrackVehicleInfoDiagRightBankedDown25ToDown252, &TrackVehicleInfoDiagRightBankedDown25ToDown253, // TrackElemType::DiagRightBankedDown25ToDown25 - &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedUp250, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedUp251, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedUp252, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedUp253, // TrackElemType::DiagLeftBankedFlatToLeftBankedUp25 - &TrackVehicleInfoDiagRightBankedFlatToRightBankedUp250, &TrackVehicleInfoDiagRightBankedFlatToRightBankedUp251, &TrackVehicleInfoDiagRightBankedFlatToRightBankedUp252, &TrackVehicleInfoDiagRightBankedFlatToRightBankedUp253, // TrackElemType::DiagRightBankedFlatToRightBankedUp25 - &TrackVehicleInfoDiagLeftBankedUp25ToLeftBankedFlat0, &TrackVehicleInfoDiagLeftBankedUp25ToLeftBankedFlat1, &TrackVehicleInfoDiagLeftBankedUp25ToLeftBankedFlat2, &TrackVehicleInfoDiagLeftBankedUp25ToLeftBankedFlat3, // TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat - &TrackVehicleInfoDiagRightBankedUp25ToRightBankedFlat0, &TrackVehicleInfoDiagRightBankedUp25ToRightBankedFlat1, &TrackVehicleInfoDiagRightBankedUp25ToRightBankedFlat2, &TrackVehicleInfoDiagRightBankedUp25ToRightBankedFlat3, // TrackElemType::DiagRightBankedUp25ToRightBankedFlat - &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedDown250, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedDown251, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedDown252, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedDown253, // TrackElemType::DiagLeftBankedFlatToLeftBankedDown25 - &TrackVehicleInfoDiagRightBankedFlatToRightBankedDown250, &TrackVehicleInfoDiagRightBankedFlatToRightBankedDown251, &TrackVehicleInfoDiagRightBankedFlatToRightBankedDown252, &TrackVehicleInfoDiagRightBankedFlatToRightBankedDown253, // TrackElemType::DiagRightBankedFlatToRightBankedDown25 - &TrackVehicleInfoDiagLeftBankedDown25ToLeftBankedFlat0, &TrackVehicleInfoDiagLeftBankedDown25ToLeftBankedFlat1, &TrackVehicleInfoDiagLeftBankedDown25ToLeftBankedFlat2, &TrackVehicleInfoDiagLeftBankedDown25ToLeftBankedFlat3, // TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat - &TrackVehicleInfoDiagRightBankedDown25ToRightBankedFlat0, &TrackVehicleInfoDiagRightBankedDown25ToRightBankedFlat1, &TrackVehicleInfoDiagRightBankedDown25ToRightBankedFlat2, &TrackVehicleInfoDiagRightBankedDown25ToRightBankedFlat3, // TrackElemType::DiagRightBankedDown25ToRightBankedFlat - &TrackVehicleInfoDiagFlatToLeftBankedUp250, &TrackVehicleInfoDiagFlatToLeftBankedUp251, &TrackVehicleInfoDiagFlatToLeftBankedUp252, &TrackVehicleInfoDiagFlatToLeftBankedUp253, // TrackElemType::DiagFlatToLeftBankedUp25 - &TrackVehicleInfoDiagFlatToRightBankedUp250, &TrackVehicleInfoDiagFlatToRightBankedUp251, &TrackVehicleInfoDiagFlatToRightBankedUp252, &TrackVehicleInfoDiagFlatToRightBankedUp253, // TrackElemType::DiagFlatToRightBankedUp25 - &TrackVehicleInfoDiagLeftBankedUp25ToFlat0, &TrackVehicleInfoDiagLeftBankedUp25ToFlat1, &TrackVehicleInfoDiagLeftBankedUp25ToFlat2, &TrackVehicleInfoDiagLeftBankedUp25ToFlat3, // TrackElemType::DiagLeftBankedUp25ToFlat - &TrackVehicleInfoDiagRightBankedUp25ToFlat0, &TrackVehicleInfoDiagRightBankedUp25ToFlat1, &TrackVehicleInfoDiagRightBankedUp25ToFlat2, &TrackVehicleInfoDiagRightBankedUp25ToFlat3, // TrackElemType::DiagRightBankedUp25ToFlat - &TrackVehicleInfoDiagFlatToLeftBankedDown250, &TrackVehicleInfoDiagFlatToLeftBankedDown251, &TrackVehicleInfoDiagFlatToLeftBankedDown252, &TrackVehicleInfoDiagFlatToLeftBankedDown253, // TrackElemType::DiagFlatToLeftBankedDown25 - &TrackVehicleInfoDiagFlatToRightBankedDown250, &TrackVehicleInfoDiagFlatToRightBankedDown251, &TrackVehicleInfoDiagFlatToRightBankedDown252, &TrackVehicleInfoDiagFlatToRightBankedDown253, // TrackElemType::DiagFlatToRightBankedDown25 - &TrackVehicleInfoDiagLeftBankedDown25ToFlat0, &TrackVehicleInfoDiagLeftBankedDown25ToFlat1, &TrackVehicleInfoDiagLeftBankedDown25ToFlat2, &TrackVehicleInfoDiagLeftBankedDown25ToFlat3, // TrackElemType::DiagLeftBankedDown25ToFlat - &TrackVehicleInfoDiagRightBankedDown25ToFlat0, &TrackVehicleInfoDiagRightBankedDown25ToFlat1, &TrackVehicleInfoDiagRightBankedDown25ToFlat2, &TrackVehicleInfoDiagRightBankedDown25ToFlat3, // TrackElemType::DiagRightBankedDown25ToFlat - &TrackVehicleInfoDiagUp25LeftBanked0, &TrackVehicleInfoDiagUp25LeftBanked1, &TrackVehicleInfoDiagUp25LeftBanked2, &TrackVehicleInfoDiagUp25LeftBanked3, // TrackElemType::DiagUp25LeftBanked - &TrackVehicleInfoDiagUp25RightBanked0, &TrackVehicleInfoDiagUp25RightBanked1, &TrackVehicleInfoDiagUp25RightBanked2, &TrackVehicleInfoDiagUp25RightBanked3, // TrackElemType::DiagUp25RightBanked - &TrackVehicleInfoDiagDown25LeftBanked0, &TrackVehicleInfoDiagDown25LeftBanked1, &TrackVehicleInfoDiagDown25LeftBanked2, &TrackVehicleInfoDiagDown25LeftBanked3, // TrackElemType::DiagDown25LeftBanked - &TrackVehicleInfoDiagDown25RightBanked0, &TrackVehicleInfoDiagDown25RightBanked1, &TrackVehicleInfoDiagDown25RightBanked2, &TrackVehicleInfoDiagDown25RightBanked3, // TrackElemType::DiagDown25RightBanked - - &TrackVehicleInfoLeftEighthBankToDiagUp250, &TrackVehicleInfoLeftEighthBankToDiagUp251, &TrackVehicleInfoLeftEighthBankToDiagUp252, &TrackVehicleInfoLeftEighthBankToDiagUp253, // TrackElemType::LeftEighthBankBankToDiagUp25 - &TrackVehicleInfoRightEighthBankToDiagUp250, &TrackVehicleInfoRightEighthBankToDiagUp251, &TrackVehicleInfoRightEighthBankToDiagUp252, &TrackVehicleInfoRightEighthBankToDiagUp253, // TrackElemType::RightEighthBankBankToDiagUp25 - &TrackVehicleInfoLeftEighthBankToDiagDown250, &TrackVehicleInfoLeftEighthBankToDiagDown251, &TrackVehicleInfoLeftEighthBankToDiagDown252, &TrackVehicleInfoLeftEighthBankToDiagDown253, // TrackElemType::LeftEighthBankBankToDiagDown25 - &TrackVehicleInfoRightEighthBankToDiagDown250, &TrackVehicleInfoRightEighthBankToDiagDown251, &TrackVehicleInfoRightEighthBankToDiagDown252, &TrackVehicleInfoRightEighthBankToDiagDown253, // TrackElemType::RightEighthBankBankToDiagDown25 - &TrackVehicleInfoLeftEighthBankToOrthogonalUp250, &TrackVehicleInfoLeftEighthBankToOrthogonalUp251, &TrackVehicleInfoLeftEighthBankToOrthogonalUp252, &TrackVehicleInfoLeftEighthBankToOrthogonalUp253, // TrackElemType::LeftEighthBankBankToOrthogonalUp25 - &TrackVehicleInfoRightEighthBankToOrthogonalUp250, &TrackVehicleInfoRightEighthBankToOrthogonalUp251, &TrackVehicleInfoRightEighthBankToOrthogonalUp252, &TrackVehicleInfoRightEighthBankToOrthogonalUp253, // TrackElemType::RightEighthBankBankToOrthogonalUp25 - &TrackVehicleInfoLeftEighthBankToOrthogonalDown250, &TrackVehicleInfoLeftEighthBankToOrthogonalDown251, &TrackVehicleInfoLeftEighthBankToOrthogonalDown252, &TrackVehicleInfoLeftEighthBankToOrthogonalDown253, // TrackElemType::LeftEighthBankBankToOrthogonalDown25 - &TrackVehicleInfoRightEighthBankToOrthogonalDown250, &TrackVehicleInfoRightEighthBankToOrthogonalDown251, &TrackVehicleInfoRightEighthBankToOrthogonalDown252, &TrackVehicleInfoRightEighthBankToOrthogonalDown253, // TrackElemType::RightEighthBankBankToOrthogonalDown25 + &TrackVehicleInfoLeftEighthToDiagUp250, &TrackVehicleInfoLeftEighthToDiagUp251, &TrackVehicleInfoLeftEighthToDiagUp252, &TrackVehicleInfoLeftEighthToDiagUp253, // TrackElemType::leftEighthToDiagUp25 + &TrackVehicleInfoRightEighthToDiagUp250, &TrackVehicleInfoRightEighthToDiagUp251, &TrackVehicleInfoRightEighthToDiagUp252, &TrackVehicleInfoRightEighthToDiagUp253, // TrackElemType::rightEighthToDiagUp25 + &TrackVehicleInfoLeftEighthToDiagDown250, &TrackVehicleInfoLeftEighthToDiagDown251, &TrackVehicleInfoLeftEighthToDiagDown252, &TrackVehicleInfoLeftEighthToDiagDown253, // TrackElemType::leftEighthToDiagDown25 + &TrackVehicleInfoRightEighthToDiagDown250, &TrackVehicleInfoRightEighthToDiagDown251, &TrackVehicleInfoRightEighthToDiagDown252, &TrackVehicleInfoRightEighthToDiagDown253, // TrackElemType::rightEighthToDiagDown25 + &TrackVehicleInfoLeftEighthToOrthogonalUp250, &TrackVehicleInfoLeftEighthToOrthogonalUp251, &TrackVehicleInfoLeftEighthToOrthogonalUp252, &TrackVehicleInfoLeftEighthToOrthogonalUp253, // TrackElemType::leftEighthToOrthogonalUp25 + &TrackVehicleInfoRightEighthToOrthogonalUp250, &TrackVehicleInfoRightEighthToOrthogonalUp251, &TrackVehicleInfoRightEighthToOrthogonalUp252, &TrackVehicleInfoRightEighthToOrthogonalUp253, // TrackElemType::rightEighthToOrthogonalUp25 + &TrackVehicleInfoLeftEighthToOrthogonalDown250, &TrackVehicleInfoLeftEighthToOrthogonalDown251, &TrackVehicleInfoLeftEighthToOrthogonalDown252, &TrackVehicleInfoLeftEighthToOrthogonalDown253, // TrackElemType::leftEighthToOrthogonalDown25 + &TrackVehicleInfoRightEighthToOrthogonalDown250, &TrackVehicleInfoRightEighthToOrthogonalDown251, &TrackVehicleInfoRightEighthToOrthogonalDown252, &TrackVehicleInfoRightEighthToOrthogonalDown253, // TrackElemType::rightEighthToOrthogonalDown25 + + &TrackVehicleInfoDiagUp25ToLeftBankedUp250, &TrackVehicleInfoDiagUp25ToLeftBankedUp251, &TrackVehicleInfoDiagUp25ToLeftBankedUp252, &TrackVehicleInfoDiagUp25ToLeftBankedUp253, // TrackElemType::diagUp25ToLeftBankedUp25 + &TrackVehicleInfoDiagUp25ToRightBankedUp250, &TrackVehicleInfoDiagUp25ToRightBankedUp251, &TrackVehicleInfoDiagUp25ToRightBankedUp252, &TrackVehicleInfoDiagUp25ToRightBankedUp253, // TrackElemType::diagUp25ToRightBankedUp25 + &TrackVehicleInfoDiagLeftBankedUp25ToUp250, &TrackVehicleInfoDiagLeftBankedUp25ToUp251, &TrackVehicleInfoDiagLeftBankedUp25ToUp252, &TrackVehicleInfoDiagLeftBankedUp25ToUp253, // TrackElemType::diagLeftBankedUp25ToUp25 + &TrackVehicleInfoDiagRightBankedUp25ToUp250, &TrackVehicleInfoDiagRightBankedUp25ToUp251, &TrackVehicleInfoDiagRightBankedUp25ToUp252, &TrackVehicleInfoDiagRightBankedUp25ToUp253, // TrackElemType::diagRightBankedUp25ToUp25 + &TrackVehicleInfoDiagDown25ToLeftBankedDown250, &TrackVehicleInfoDiagDown25ToLeftBankedDown251, &TrackVehicleInfoDiagDown25ToLeftBankedDown252, &TrackVehicleInfoDiagDown25ToLeftBankedDown253, // TrackElemType::diagDown25ToLeftBankedDown25 + &TrackVehicleInfoDiagDown25ToRightBankedDown250, &TrackVehicleInfoDiagDown25ToRightBankedDown251, &TrackVehicleInfoDiagDown25ToRightBankedDown252, &TrackVehicleInfoDiagDown25ToRightBankedDown253, // TrackElemType::diagDown25ToRightBankedDown25 + &TrackVehicleInfoDiagLeftBankedDown25ToDown250, &TrackVehicleInfoDiagLeftBankedDown25ToDown251, &TrackVehicleInfoDiagLeftBankedDown25ToDown252, &TrackVehicleInfoDiagLeftBankedDown25ToDown253, // TrackElemType::diagLeftBankedDown25ToDown25 + &TrackVehicleInfoDiagRightBankedDown25ToDown250, &TrackVehicleInfoDiagRightBankedDown25ToDown251, &TrackVehicleInfoDiagRightBankedDown25ToDown252, &TrackVehicleInfoDiagRightBankedDown25ToDown253, // TrackElemType::diagRightBankedDown25ToDown25 + &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedUp250, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedUp251, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedUp252, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedUp253, // TrackElemType::diagLeftBankedFlatToLeftBankedUp25 + &TrackVehicleInfoDiagRightBankedFlatToRightBankedUp250, &TrackVehicleInfoDiagRightBankedFlatToRightBankedUp251, &TrackVehicleInfoDiagRightBankedFlatToRightBankedUp252, &TrackVehicleInfoDiagRightBankedFlatToRightBankedUp253, // TrackElemType::diagRightBankedFlatToRightBankedUp25 + &TrackVehicleInfoDiagLeftBankedUp25ToLeftBankedFlat0, &TrackVehicleInfoDiagLeftBankedUp25ToLeftBankedFlat1, &TrackVehicleInfoDiagLeftBankedUp25ToLeftBankedFlat2, &TrackVehicleInfoDiagLeftBankedUp25ToLeftBankedFlat3, // TrackElemType::diagLeftBankedUp25ToLeftBankedFlat + &TrackVehicleInfoDiagRightBankedUp25ToRightBankedFlat0, &TrackVehicleInfoDiagRightBankedUp25ToRightBankedFlat1, &TrackVehicleInfoDiagRightBankedUp25ToRightBankedFlat2, &TrackVehicleInfoDiagRightBankedUp25ToRightBankedFlat3, // TrackElemType::diagRightBankedUp25ToRightBankedFlat + &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedDown250, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedDown251, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedDown252, &TrackVehicleInfoDiagLeftBankedFlatToLeftBankedDown253, // TrackElemType::diagLeftBankedFlatToLeftBankedDown25 + &TrackVehicleInfoDiagRightBankedFlatToRightBankedDown250, &TrackVehicleInfoDiagRightBankedFlatToRightBankedDown251, &TrackVehicleInfoDiagRightBankedFlatToRightBankedDown252, &TrackVehicleInfoDiagRightBankedFlatToRightBankedDown253, // TrackElemType::diagRightBankedFlatToRightBankedDown25 + &TrackVehicleInfoDiagLeftBankedDown25ToLeftBankedFlat0, &TrackVehicleInfoDiagLeftBankedDown25ToLeftBankedFlat1, &TrackVehicleInfoDiagLeftBankedDown25ToLeftBankedFlat2, &TrackVehicleInfoDiagLeftBankedDown25ToLeftBankedFlat3, // TrackElemType::diagLeftBankedDown25ToLeftBankedFlat + &TrackVehicleInfoDiagRightBankedDown25ToRightBankedFlat0, &TrackVehicleInfoDiagRightBankedDown25ToRightBankedFlat1, &TrackVehicleInfoDiagRightBankedDown25ToRightBankedFlat2, &TrackVehicleInfoDiagRightBankedDown25ToRightBankedFlat3, // TrackElemType::diagRightBankedDown25ToRightBankedFlat + &TrackVehicleInfoDiagFlatToLeftBankedUp250, &TrackVehicleInfoDiagFlatToLeftBankedUp251, &TrackVehicleInfoDiagFlatToLeftBankedUp252, &TrackVehicleInfoDiagFlatToLeftBankedUp253, // TrackElemType::diagFlatToLeftBankedUp25 + &TrackVehicleInfoDiagFlatToRightBankedUp250, &TrackVehicleInfoDiagFlatToRightBankedUp251, &TrackVehicleInfoDiagFlatToRightBankedUp252, &TrackVehicleInfoDiagFlatToRightBankedUp253, // TrackElemType::diagFlatToRightBankedUp25 + &TrackVehicleInfoDiagLeftBankedUp25ToFlat0, &TrackVehicleInfoDiagLeftBankedUp25ToFlat1, &TrackVehicleInfoDiagLeftBankedUp25ToFlat2, &TrackVehicleInfoDiagLeftBankedUp25ToFlat3, // TrackElemType::diagLeftBankedUp25ToFlat + &TrackVehicleInfoDiagRightBankedUp25ToFlat0, &TrackVehicleInfoDiagRightBankedUp25ToFlat1, &TrackVehicleInfoDiagRightBankedUp25ToFlat2, &TrackVehicleInfoDiagRightBankedUp25ToFlat3, // TrackElemType::diagRightBankedUp25ToFlat + &TrackVehicleInfoDiagFlatToLeftBankedDown250, &TrackVehicleInfoDiagFlatToLeftBankedDown251, &TrackVehicleInfoDiagFlatToLeftBankedDown252, &TrackVehicleInfoDiagFlatToLeftBankedDown253, // TrackElemType::diagFlatToLeftBankedDown25 + &TrackVehicleInfoDiagFlatToRightBankedDown250, &TrackVehicleInfoDiagFlatToRightBankedDown251, &TrackVehicleInfoDiagFlatToRightBankedDown252, &TrackVehicleInfoDiagFlatToRightBankedDown253, // TrackElemType::diagFlatToRightBankedDown25 + &TrackVehicleInfoDiagLeftBankedDown25ToFlat0, &TrackVehicleInfoDiagLeftBankedDown25ToFlat1, &TrackVehicleInfoDiagLeftBankedDown25ToFlat2, &TrackVehicleInfoDiagLeftBankedDown25ToFlat3, // TrackElemType::diagLeftBankedDown25ToFlat + &TrackVehicleInfoDiagRightBankedDown25ToFlat0, &TrackVehicleInfoDiagRightBankedDown25ToFlat1, &TrackVehicleInfoDiagRightBankedDown25ToFlat2, &TrackVehicleInfoDiagRightBankedDown25ToFlat3, // TrackElemType::diagRightBankedDown25ToFlat + &TrackVehicleInfoDiagUp25LeftBanked0, &TrackVehicleInfoDiagUp25LeftBanked1, &TrackVehicleInfoDiagUp25LeftBanked2, &TrackVehicleInfoDiagUp25LeftBanked3, // TrackElemType::diagUp25LeftBanked + &TrackVehicleInfoDiagUp25RightBanked0, &TrackVehicleInfoDiagUp25RightBanked1, &TrackVehicleInfoDiagUp25RightBanked2, &TrackVehicleInfoDiagUp25RightBanked3, // TrackElemType::diagUp25RightBanked + &TrackVehicleInfoDiagDown25LeftBanked0, &TrackVehicleInfoDiagDown25LeftBanked1, &TrackVehicleInfoDiagDown25LeftBanked2, &TrackVehicleInfoDiagDown25LeftBanked3, // TrackElemType::diagDown25LeftBanked + &TrackVehicleInfoDiagDown25RightBanked0, &TrackVehicleInfoDiagDown25RightBanked1, &TrackVehicleInfoDiagDown25RightBanked2, &TrackVehicleInfoDiagDown25RightBanked3, // TrackElemType::diagDown25RightBanked + + &TrackVehicleInfoLeftEighthBankToDiagUp250, &TrackVehicleInfoLeftEighthBankToDiagUp251, &TrackVehicleInfoLeftEighthBankToDiagUp252, &TrackVehicleInfoLeftEighthBankToDiagUp253, // TrackElemType::leftEighthBankBankToDiagUp25 + &TrackVehicleInfoRightEighthBankToDiagUp250, &TrackVehicleInfoRightEighthBankToDiagUp251, &TrackVehicleInfoRightEighthBankToDiagUp252, &TrackVehicleInfoRightEighthBankToDiagUp253, // TrackElemType::rightEighthBankBankToDiagUp25 + &TrackVehicleInfoLeftEighthBankToDiagDown250, &TrackVehicleInfoLeftEighthBankToDiagDown251, &TrackVehicleInfoLeftEighthBankToDiagDown252, &TrackVehicleInfoLeftEighthBankToDiagDown253, // TrackElemType::leftEighthBankBankToDiagDown25 + &TrackVehicleInfoRightEighthBankToDiagDown250, &TrackVehicleInfoRightEighthBankToDiagDown251, &TrackVehicleInfoRightEighthBankToDiagDown252, &TrackVehicleInfoRightEighthBankToDiagDown253, // TrackElemType::rightEighthBankBankToDiagDown25 + &TrackVehicleInfoLeftEighthBankToOrthogonalUp250, &TrackVehicleInfoLeftEighthBankToOrthogonalUp251, &TrackVehicleInfoLeftEighthBankToOrthogonalUp252, &TrackVehicleInfoLeftEighthBankToOrthogonalUp253, // TrackElemType::leftEighthBankBankToOrthogonalUp25 + &TrackVehicleInfoRightEighthBankToOrthogonalUp250, &TrackVehicleInfoRightEighthBankToOrthogonalUp251, &TrackVehicleInfoRightEighthBankToOrthogonalUp252, &TrackVehicleInfoRightEighthBankToOrthogonalUp253, // TrackElemType::rightEighthBankBankToOrthogonalUp25 + &TrackVehicleInfoLeftEighthBankToOrthogonalDown250, &TrackVehicleInfoLeftEighthBankToOrthogonalDown251, &TrackVehicleInfoLeftEighthBankToOrthogonalDown252, &TrackVehicleInfoLeftEighthBankToOrthogonalDown253, // TrackElemType::leftEighthBankBankToOrthogonalDown25 + &TrackVehicleInfoRightEighthBankToOrthogonalDown250, &TrackVehicleInfoRightEighthBankToOrthogonalDown251, &TrackVehicleInfoRightEighthBankToOrthogonalDown252, &TrackVehicleInfoRightEighthBankToOrthogonalDown253, // TrackElemType::rightEighthBankBankToOrthogonalDown25 &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBrakes &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBlockBrakes &TrackVehicleInfo_8C27B2, &TrackVehicleInfo_8C28D4, &TrackVehicleInfo_8C29F6, &TrackVehicleInfo_8C2B18, // SlopedBrakes &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBooster - &TrackVehicleInfoDiagFlatToUp60LongBase0 , &TrackVehicleInfoDiagFlatToUp60LongBase1 , &TrackVehicleInfoDiagFlatToUp60LongBase2 , &TrackVehicleInfoDiagFlatToUp60LongBase3 , //TrackElemType::DiagFlatToUp60LongBase, - &TrackVehicleInfoDiagUp60ToFlatLongBase0 , &TrackVehicleInfoDiagUp60ToFlatLongBase1 , &TrackVehicleInfoDiagUp60ToFlatLongBase2 , &TrackVehicleInfoDiagUp60ToFlatLongBase3 , //TrackElemType::DiagUp60ToFlatLongBase, - &TrackVehicleInfoDiagFlatToDown60LongBase0, &TrackVehicleInfoDiagFlatToDown60LongBase1, &TrackVehicleInfoDiagFlatToDown60LongBase2, &TrackVehicleInfoDiagFlatToDown60LongBase3, //TrackElemType::DiagFlatToDown60LongBase, - &TrackVehicleInfoDiagDown60ToFlatLongBase0, &TrackVehicleInfoDiagDown60ToFlatLongBase1, &TrackVehicleInfoDiagDown60ToFlatLongBase2, &TrackVehicleInfoDiagDown60ToFlatLongBase3, //TrackElemType::DiagDown60ToFlatLongBase, - - &TrackVehicleInfoLeftEighthDiveLoopUpToOrthogonal0 , &TrackVehicleInfoLeftEighthDiveLoopUpToOrthogonal1 , &TrackVehicleInfoLeftEighthDiveLoopUpToOrthogonal2 , &TrackVehicleInfoLeftEighthDiveLoopUpToOrthogonal3 , //TrackElemType::LeftEighthDiveLoopUpToOrthogonal - &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal0 , &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal1 , &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal2 , &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal3 , //TrackElemType::RightEighthDiveLoopUpToOrthogonal - &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal0 , &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal1 , &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal2 , &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal3 , //TrackElemType::LeftEighthDiveLoopDownToOrthogonal - &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal0, &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal1, &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal2, &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal3, //TrackElemType::RightEighthDiveLoopDownToOrthogonal + &TrackVehicleInfoDiagFlatToUp60LongBase0 , &TrackVehicleInfoDiagFlatToUp60LongBase1 , &TrackVehicleInfoDiagFlatToUp60LongBase2 , &TrackVehicleInfoDiagFlatToUp60LongBase3 , //TrackElemType::diagFlatToUp60LongBase, + &TrackVehicleInfoDiagUp60ToFlatLongBase0 , &TrackVehicleInfoDiagUp60ToFlatLongBase1 , &TrackVehicleInfoDiagUp60ToFlatLongBase2 , &TrackVehicleInfoDiagUp60ToFlatLongBase3 , //TrackElemType::diagUp60ToFlatLongBase, + &TrackVehicleInfoDiagFlatToDown60LongBase0, &TrackVehicleInfoDiagFlatToDown60LongBase1, &TrackVehicleInfoDiagFlatToDown60LongBase2, &TrackVehicleInfoDiagFlatToDown60LongBase3, //TrackElemType::diagFlatToDown60LongBase, + &TrackVehicleInfoDiagDown60ToFlatLongBase0, &TrackVehicleInfoDiagDown60ToFlatLongBase1, &TrackVehicleInfoDiagDown60ToFlatLongBase2, &TrackVehicleInfoDiagDown60ToFlatLongBase3, //TrackElemType::diagDown60ToFlatLongBase, + + &TrackVehicleInfoLeftEighthDiveLoopUpToOrthogonal0 , &TrackVehicleInfoLeftEighthDiveLoopUpToOrthogonal1 , &TrackVehicleInfoLeftEighthDiveLoopUpToOrthogonal2 , &TrackVehicleInfoLeftEighthDiveLoopUpToOrthogonal3 , //TrackElemType::leftEighthDiveLoopUpToOrthogonal + &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal0 , &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal1 , &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal2 , &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal3 , //TrackElemType::rightEighthDiveLoopUpToOrthogonal + &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal0 , &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal1 , &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal2 , &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal3 , //TrackElemType::leftEighthDiveLoopDownToOrthogonal + &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal0, &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal1, &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal2, &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal3, //TrackElemType::rightEighthDiveLoopDownToOrthogonal &TrackVehicleInfo_916BF6, &TrackVehicleInfo_916D18, &TrackVehicleInfo_916E3A, &TrackVehicleInfo_916F5C, // DiagDown25Brakes }; static_assert(std::size(TrackVehicleInfoListDefault) == VehicleTrackSubpositionSizeDefault); @@ -40020,58 +40020,58 @@ static constexpr const VehicleInfoList *TrackVehicleInfoListChairliftStartBullwh }; static constexpr const VehicleInfoList *TrackVehicleInfoListGoKartsLeftLane[] = { - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::Flat - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::EndStation - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::BeginStation - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::MiddleStation - &TrackVehicleInfo_900E52, &TrackVehicleInfo_900F74, &TrackVehicleInfo_901096, &TrackVehicleInfo_9011B8, // TrackElemType::Up25 - &LeftLane::TrackVehicleInfoUp600, &LeftLane::TrackVehicleInfoUp601, &LeftLane::TrackVehicleInfoUp602, &LeftLane::TrackVehicleInfoUp603, // TrackElemType::Up60 - &TrackVehicleInfo_8FFBEA, &TrackVehicleInfo_8FFD0C, &TrackVehicleInfo_8FFE2E, &TrackVehicleInfo_8FFF50, // TrackElemType::FlatToUp25 - &LeftLane::TrackVehicleInfoUp25ToUp600, &LeftLane::TrackVehicleInfoUp25ToUp601, &LeftLane::TrackVehicleInfoUp25ToUp602, &LeftLane::TrackVehicleInfoUp25ToUp603, // TrackElemType::Up25ToUp60 - &LeftLane::TrackVehicleInfoUp60ToUp250, &LeftLane::TrackVehicleInfoUp60ToUp251, &LeftLane::TrackVehicleInfoUp60ToUp252, &LeftLane::TrackVehicleInfoUp60ToUp253, // TrackElemType::Up60ToUp25 - &TrackVehicleInfo_900072, &TrackVehicleInfo_9001A6, &TrackVehicleInfo_9002DA, &TrackVehicleInfo_90040E, // TrackElemType::Up25ToFlat - &TrackVehicleInfo_9012DA, &TrackVehicleInfo_9013FC, &TrackVehicleInfo_90151E, &TrackVehicleInfo_901640, // TrackElemType::Down25 - &LeftLane::TrackVehicleInfoDown600, &LeftLane::TrackVehicleInfoDown601, &LeftLane::TrackVehicleInfoDown602, &LeftLane::TrackVehicleInfoDown603, // TrackElemType::Down60 - &TrackVehicleInfo_9009CA, &TrackVehicleInfo_900AEC, &TrackVehicleInfo_900C0E, &TrackVehicleInfo_900D30, // TrackElemType::FlatToDown25 - &LeftLane::TrackVehicleInfoDown25ToDown600, &LeftLane::TrackVehicleInfoDown25ToDown601, &LeftLane::TrackVehicleInfoDown25ToDown602, &LeftLane::TrackVehicleInfoDown25ToDown603, // TrackElemType::Down25ToDown60 - &LeftLane::TrackVehicleInfoDown60ToDown250, &LeftLane::TrackVehicleInfoDown60ToDown251, &LeftLane::TrackVehicleInfoDown60ToDown252, &LeftLane::TrackVehicleInfoDown60ToDown253, // TrackElemType::Down60ToDown25 - &TrackVehicleInfo_900542, &TrackVehicleInfo_900664, &TrackVehicleInfo_900786, &TrackVehicleInfo_9008A8, // TrackElemType::Down25ToFlat - &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles0, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles1, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles2, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles3, // TrackElemType::LeftQuarterTurn5Tiles - &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles0, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles1, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles2, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles3, // TrackElemType::RightQuarterTurn5Tiles - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::FlatToLeftBank - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::FlatToRightBank - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::LeftBankToFlat - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::RightBankToFlat - &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles0, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles1, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles2, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles3, // TrackElemType::BankedLeftQuarterTurn5Tiles - &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles0, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles1, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles2, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles3, // TrackElemType::BankedRightQuarterTurn5Tiles - &TrackVehicleInfo_8FFBEA, &TrackVehicleInfo_8FFD0C, &TrackVehicleInfo_8FFE2E, &TrackVehicleInfo_8FFF50, // TrackElemType::LeftBankToUp25 - &TrackVehicleInfo_8FFBEA, &TrackVehicleInfo_8FFD0C, &TrackVehicleInfo_8FFE2E, &TrackVehicleInfo_8FFF50, // TrackElemType::RightBankToUp25 - &TrackVehicleInfo_900072, &TrackVehicleInfo_9001A6, &TrackVehicleInfo_9002DA, &TrackVehicleInfo_90040E, // TrackElemType::Up25ToLeftBank - &TrackVehicleInfo_900072, &TrackVehicleInfo_9001A6, &TrackVehicleInfo_9002DA, &TrackVehicleInfo_90040E, // TrackElemType::Up25ToRightBank - &TrackVehicleInfo_9009CA, &TrackVehicleInfo_900AEC, &TrackVehicleInfo_900C0E, &TrackVehicleInfo_900D30, // TrackElemType::LeftBankToDown25 - &TrackVehicleInfo_9009CA, &TrackVehicleInfo_900AEC, &TrackVehicleInfo_900C0E, &TrackVehicleInfo_900D30, // TrackElemType::RightBankToDown25 - &TrackVehicleInfo_900542, &TrackVehicleInfo_900664, &TrackVehicleInfo_900786, &TrackVehicleInfo_9008A8, // TrackElemType::Down25ToLeftBank - &TrackVehicleInfo_900542, &TrackVehicleInfo_900664, &TrackVehicleInfo_900786, &TrackVehicleInfo_9008A8, // TrackElemType::Down25ToRightBank - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::LeftBank - &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::RightBank - &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp0, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp1, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp2, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp3, // TrackElemType::LeftQuarterTurn5TilesUp25 - &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp0, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp1, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp2, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp3, // TrackElemType::RightQuarterTurn5TilesUp25 - &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown0, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown1, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown2, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown3, // TrackElemType::LeftQuarterTurn5TilesDown25 - &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown0, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown1, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown2, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown3, // TrackElemType::RightQuarterTurn5TilesDown25 - &LeftLane::TrackVehicleInfoLeftSBend0, &LeftLane::TrackVehicleInfoLeftSBend1, &LeftLane::TrackVehicleInfoLeftSBend2, &LeftLane::TrackVehicleInfoLeftSBend3, // TrackElemType::SBendLeft - &LeftLane::TrackVehicleInfoRightSBend0, &LeftLane::TrackVehicleInfoRightSBend1, &LeftLane::TrackVehicleInfoRightSBend2, &LeftLane::TrackVehicleInfoRightSBend3, // TrackElemType::SBendRight - &TrackVehicleInfo_8D44BE, &TrackVehicleInfo_8D4FA6, &TrackVehicleInfo_8D5A8E, &TrackVehicleInfo_8D6576, // TrackElemType::LeftVerticalLoop - &TrackVehicleInfo_8D705E, &TrackVehicleInfo_8D7B46, &TrackVehicleInfo_8D862E, &TrackVehicleInfo_8D9116, // TrackElemType::RightVerticalLoop - &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // TrackElemType::LeftQuarterTurn3Tiles - &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles0, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles1, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles2, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles3, // TrackElemType::RightQuarterTurn3Tiles - &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // TrackElemType::LeftBankedQuarterTurn3Tiles - &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles0, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles1, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles2, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles3, // TrackElemType::RightBankedQuarterTurn3Tiles - &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp0, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp1, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp2, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp3, // TrackElemType::LeftQuarterTurn3TilesUp25 - &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp0, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp1, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp2, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp3, // TrackElemType::RightQuarterTurn3TilesUp25 - &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown0, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown1, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown2, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown3, // TrackElemType::LeftQuarterTurn3TilesDown25 - &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown0, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown1, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown2, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown3, // TrackElemType::RightQuarterTurn3TilesDown25 - &TrackVehicleInfo_901C05, &TrackVehicleInfo_901C7C, &TrackVehicleInfo_901CFC, &TrackVehicleInfo_901D73, // TrackElemType::LeftQuarterTurn1Tile - &TrackVehicleInfo_901762, &TrackVehicleInfo_901884, &TrackVehicleInfo_9019AF, &TrackVehicleInfo_901AE3, // TrackElemType::RightQuarterTurn1Tile + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::flat + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::endStation + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::beginStation + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::middleStation + &TrackVehicleInfo_900E52, &TrackVehicleInfo_900F74, &TrackVehicleInfo_901096, &TrackVehicleInfo_9011B8, // TrackElemType::up25 + &LeftLane::TrackVehicleInfoUp600, &LeftLane::TrackVehicleInfoUp601, &LeftLane::TrackVehicleInfoUp602, &LeftLane::TrackVehicleInfoUp603, // TrackElemType::up60 + &TrackVehicleInfo_8FFBEA, &TrackVehicleInfo_8FFD0C, &TrackVehicleInfo_8FFE2E, &TrackVehicleInfo_8FFF50, // TrackElemType::flatToUp25 + &LeftLane::TrackVehicleInfoUp25ToUp600, &LeftLane::TrackVehicleInfoUp25ToUp601, &LeftLane::TrackVehicleInfoUp25ToUp602, &LeftLane::TrackVehicleInfoUp25ToUp603, // TrackElemType::up25ToUp60 + &LeftLane::TrackVehicleInfoUp60ToUp250, &LeftLane::TrackVehicleInfoUp60ToUp251, &LeftLane::TrackVehicleInfoUp60ToUp252, &LeftLane::TrackVehicleInfoUp60ToUp253, // TrackElemType::up60ToUp25 + &TrackVehicleInfo_900072, &TrackVehicleInfo_9001A6, &TrackVehicleInfo_9002DA, &TrackVehicleInfo_90040E, // TrackElemType::up25ToFlat + &TrackVehicleInfo_9012DA, &TrackVehicleInfo_9013FC, &TrackVehicleInfo_90151E, &TrackVehicleInfo_901640, // TrackElemType::down25 + &LeftLane::TrackVehicleInfoDown600, &LeftLane::TrackVehicleInfoDown601, &LeftLane::TrackVehicleInfoDown602, &LeftLane::TrackVehicleInfoDown603, // TrackElemType::down60 + &TrackVehicleInfo_9009CA, &TrackVehicleInfo_900AEC, &TrackVehicleInfo_900C0E, &TrackVehicleInfo_900D30, // TrackElemType::flatToDown25 + &LeftLane::TrackVehicleInfoDown25ToDown600, &LeftLane::TrackVehicleInfoDown25ToDown601, &LeftLane::TrackVehicleInfoDown25ToDown602, &LeftLane::TrackVehicleInfoDown25ToDown603, // TrackElemType::down25ToDown60 + &LeftLane::TrackVehicleInfoDown60ToDown250, &LeftLane::TrackVehicleInfoDown60ToDown251, &LeftLane::TrackVehicleInfoDown60ToDown252, &LeftLane::TrackVehicleInfoDown60ToDown253, // TrackElemType::down60ToDown25 + &TrackVehicleInfo_900542, &TrackVehicleInfo_900664, &TrackVehicleInfo_900786, &TrackVehicleInfo_9008A8, // TrackElemType::down25ToFlat + &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles0, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles1, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles2, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles3, // TrackElemType::leftQuarterTurn5Tiles + &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles0, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles1, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles2, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles3, // TrackElemType::rightQuarterTurn5Tiles + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::flatToLeftBank + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::flatToRightBank + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::leftBankToFlat + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::rightBankToFlat + &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles0, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles1, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles2, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles3, // TrackElemType::bankedLeftQuarterTurn5Tiles + &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles0, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles1, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles2, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles3, // TrackElemType::bankedRightQuarterTurn5Tiles + &TrackVehicleInfo_8FFBEA, &TrackVehicleInfo_8FFD0C, &TrackVehicleInfo_8FFE2E, &TrackVehicleInfo_8FFF50, // TrackElemType::leftBankToUp25 + &TrackVehicleInfo_8FFBEA, &TrackVehicleInfo_8FFD0C, &TrackVehicleInfo_8FFE2E, &TrackVehicleInfo_8FFF50, // TrackElemType::rightBankToUp25 + &TrackVehicleInfo_900072, &TrackVehicleInfo_9001A6, &TrackVehicleInfo_9002DA, &TrackVehicleInfo_90040E, // TrackElemType::up25ToLeftBank + &TrackVehicleInfo_900072, &TrackVehicleInfo_9001A6, &TrackVehicleInfo_9002DA, &TrackVehicleInfo_90040E, // TrackElemType::up25ToRightBank + &TrackVehicleInfo_9009CA, &TrackVehicleInfo_900AEC, &TrackVehicleInfo_900C0E, &TrackVehicleInfo_900D30, // TrackElemType::leftBankToDown25 + &TrackVehicleInfo_9009CA, &TrackVehicleInfo_900AEC, &TrackVehicleInfo_900C0E, &TrackVehicleInfo_900D30, // TrackElemType::rightBankToDown25 + &TrackVehicleInfo_900542, &TrackVehicleInfo_900664, &TrackVehicleInfo_900786, &TrackVehicleInfo_9008A8, // TrackElemType::down25ToLeftBank + &TrackVehicleInfo_900542, &TrackVehicleInfo_900664, &TrackVehicleInfo_900786, &TrackVehicleInfo_9008A8, // TrackElemType::down25ToRightBank + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::leftBank + &TrackVehicleInfo_8FF2DA, &TrackVehicleInfo_8FF3FC, &TrackVehicleInfo_8FF51E, &TrackVehicleInfo_8FF640, // TrackElemType::rightBank + &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp0, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp1, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp2, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp3, // TrackElemType::leftQuarterTurn5TilesUp25 + &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp0, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp1, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp2, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp3, // TrackElemType::rightQuarterTurn5TilesUp25 + &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown0, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown1, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown2, &LeftLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown3, // TrackElemType::leftQuarterTurn5TilesDown25 + &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown0, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown1, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown2, &LeftLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown3, // TrackElemType::rightQuarterTurn5TilesDown25 + &LeftLane::TrackVehicleInfoLeftSBend0, &LeftLane::TrackVehicleInfoLeftSBend1, &LeftLane::TrackVehicleInfoLeftSBend2, &LeftLane::TrackVehicleInfoLeftSBend3, // TrackElemType::sBendLeft + &LeftLane::TrackVehicleInfoRightSBend0, &LeftLane::TrackVehicleInfoRightSBend1, &LeftLane::TrackVehicleInfoRightSBend2, &LeftLane::TrackVehicleInfoRightSBend3, // TrackElemType::sBendRight + &TrackVehicleInfo_8D44BE, &TrackVehicleInfo_8D4FA6, &TrackVehicleInfo_8D5A8E, &TrackVehicleInfo_8D6576, // TrackElemType::leftVerticalLoop + &TrackVehicleInfo_8D705E, &TrackVehicleInfo_8D7B46, &TrackVehicleInfo_8D862E, &TrackVehicleInfo_8D9116, // TrackElemType::rightVerticalLoop + &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // TrackElemType::leftQuarterTurn3Tiles + &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles0, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles1, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles2, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles3, // TrackElemType::rightQuarterTurn3Tiles + &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // TrackElemType::leftBankedQuarterTurn3Tiles + &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles0, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles1, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles2, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles3, // TrackElemType::rightBankedQuarterTurn3Tiles + &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp0, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp1, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp2, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp3, // TrackElemType::leftQuarterTurn3TilesUp25 + &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp0, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp1, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp2, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp3, // TrackElemType::rightQuarterTurn3TilesUp25 + &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown0, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown1, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown2, &LeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown3, // TrackElemType::leftQuarterTurn3TilesDown25 + &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown0, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown1, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown2, &LeftLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown3, // TrackElemType::rightQuarterTurn3TilesDown25 + &TrackVehicleInfo_901C05, &TrackVehicleInfo_901C7C, &TrackVehicleInfo_901CFC, &TrackVehicleInfo_901D73, // TrackElemType::leftQuarterTurn1Tile + &TrackVehicleInfo_901762, &TrackVehicleInfo_901884, &TrackVehicleInfo_9019AF, &TrackVehicleInfo_901AE3, // TrackElemType::rightQuarterTurn1Tile &TrackVehicleInfo_8D9BFE, &TrackVehicleInfo_8D9F60, &TrackVehicleInfo_8DA2C2, &TrackVehicleInfo_8DA624, // LeftTwistDownToUp &TrackVehicleInfo_8DA986, &TrackVehicleInfo_8DACE8, &TrackVehicleInfo_8DB04A, &TrackVehicleInfo_8DB3AC, // RightTwistDownToUp &TrackVehicleInfo_8DB70E, &TrackVehicleInfo_8DBA70, &TrackVehicleInfo_8DBDD2, &TrackVehicleInfo_8DC134, // LeftTwistUpToDown @@ -40313,69 +40313,69 @@ static constexpr const VehicleInfoList *TrackVehicleInfoListGoKartsLeftLane[] = &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown0, &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown1, &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown2, &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown3, // RightFlyerLargeHalfLoopUninvertedDown &TrackVehicleInfo_8E644E, &TrackVehicleInfo_8E69F9, &TrackVehicleInfo_8E6FA4, &TrackVehicleInfo_8E754F, // FlyerHalfLoopInvertedUp &TrackVehicleInfo_FlyerHalfLoopUninvertedDown0, &TrackVehicleInfo_FlyerHalfLoopUninvertedDown1, &TrackVehicleInfo_FlyerHalfLoopUninvertedDown2, &TrackVehicleInfo_FlyerHalfLoopUninvertedDown3, // FlyerHalfLoopUninvertedDown - &LeftLane::TrackVehicleInfoLeftEighthToDiagUp250, &LeftLane::TrackVehicleInfoLeftEighthToDiagUp251, &LeftLane::TrackVehicleInfoLeftEighthToDiagUp252, &LeftLane::TrackVehicleInfoLeftEighthToDiagUp253, // TrackElemType::LeftEighthToDiagUp25 - &LeftLane::TrackVehicleInfoRightEighthToDiagUp250, &LeftLane::TrackVehicleInfoRightEighthToDiagUp251, &LeftLane::TrackVehicleInfoRightEighthToDiagUp252, &LeftLane::TrackVehicleInfoRightEighthToDiagUp253, // TrackElemType::RightEighthToDiagUp25 - &LeftLane::TrackVehicleInfoLeftEighthToDiagDown250, &LeftLane::TrackVehicleInfoLeftEighthToDiagDown251, &LeftLane::TrackVehicleInfoLeftEighthToDiagDown252, &LeftLane::TrackVehicleInfoLeftEighthToDiagDown253, // TrackElemType::LeftEighthToDiagDown25 - &LeftLane::TrackVehicleInfoRightEighthToDiagDown250, &LeftLane::TrackVehicleInfoRightEighthToDiagDown251, &LeftLane::TrackVehicleInfoRightEighthToDiagDown252, &LeftLane::TrackVehicleInfoRightEighthToDiagDown253, // TrackElemType::RightEighthToDiagDown25 - &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalUp250, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalUp251, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalUp252, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalUp253, // TrackElemType::LeftEighthToOrthogonalUp25 - &LeftLane::TrackVehicleInfoRightEighthToOrthogonalUp250, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalUp251, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalUp252, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalUp253, // TrackElemType::RightEighthToOrthogonalUp25 - &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalDown250, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalDown251, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalDown252, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalDown253, // TrackElemType::LeftEighthToOrthogonalDown25 - &LeftLane::TrackVehicleInfoRightEighthToOrthogonalDown250, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalDown251, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalDown252, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalDown253, // TrackElemType::RightEighthToOrthogonalDown25 + &LeftLane::TrackVehicleInfoLeftEighthToDiagUp250, &LeftLane::TrackVehicleInfoLeftEighthToDiagUp251, &LeftLane::TrackVehicleInfoLeftEighthToDiagUp252, &LeftLane::TrackVehicleInfoLeftEighthToDiagUp253, // TrackElemType::leftEighthToDiagUp25 + &LeftLane::TrackVehicleInfoRightEighthToDiagUp250, &LeftLane::TrackVehicleInfoRightEighthToDiagUp251, &LeftLane::TrackVehicleInfoRightEighthToDiagUp252, &LeftLane::TrackVehicleInfoRightEighthToDiagUp253, // TrackElemType::rightEighthToDiagUp25 + &LeftLane::TrackVehicleInfoLeftEighthToDiagDown250, &LeftLane::TrackVehicleInfoLeftEighthToDiagDown251, &LeftLane::TrackVehicleInfoLeftEighthToDiagDown252, &LeftLane::TrackVehicleInfoLeftEighthToDiagDown253, // TrackElemType::leftEighthToDiagDown25 + &LeftLane::TrackVehicleInfoRightEighthToDiagDown250, &LeftLane::TrackVehicleInfoRightEighthToDiagDown251, &LeftLane::TrackVehicleInfoRightEighthToDiagDown252, &LeftLane::TrackVehicleInfoRightEighthToDiagDown253, // TrackElemType::rightEighthToDiagDown25 + &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalUp250, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalUp251, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalUp252, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalUp253, // TrackElemType::leftEighthToOrthogonalUp25 + &LeftLane::TrackVehicleInfoRightEighthToOrthogonalUp250, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalUp251, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalUp252, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalUp253, // TrackElemType::rightEighthToOrthogonalUp25 + &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalDown250, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalDown251, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalDown252, &LeftLane::TrackVehicleInfoLeftEighthToOrthogonalDown253, // TrackElemType::leftEighthToOrthogonalDown25 + &LeftLane::TrackVehicleInfoRightEighthToOrthogonalDown250, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalDown251, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalDown252, &LeftLane::TrackVehicleInfoRightEighthToOrthogonalDown253, // TrackElemType::rightEighthToOrthogonalDown25 }; static constexpr const VehicleInfoList *TrackVehicleInfoListGoKartsRightLane[] = { - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::Flat - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::EndStation - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::BeginStation - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::MiddleStation - &TrackVehicleInfo_9034D1, &TrackVehicleInfo_9035F3, &TrackVehicleInfo_903715, &TrackVehicleInfo_903837, // TrackElemType::Up25 - &RightLane::TrackVehicleInfoUp600, &RightLane::TrackVehicleInfoUp601, &RightLane::TrackVehicleInfoUp602, &RightLane::TrackVehicleInfoUp603, // TrackElemType::Up60 - &TrackVehicleInfo_902269, &TrackVehicleInfo_90238B, &TrackVehicleInfo_9024AD, &TrackVehicleInfo_9025CF, // TrackElemType::FlatToUp25 - &RightLane::TrackVehicleInfoUp25ToUp600, &RightLane::TrackVehicleInfoUp25ToUp601, &RightLane::TrackVehicleInfoUp25ToUp602, &RightLane::TrackVehicleInfoUp25ToUp603, // TrackElemType::Up25ToUp60 - &RightLane::TrackVehicleInfoUp60ToUp250, &RightLane::TrackVehicleInfoUp60ToUp251, &RightLane::TrackVehicleInfoUp60ToUp252, &RightLane::TrackVehicleInfoUp60ToUp253, // TrackElemType::Up60ToUp25 - &TrackVehicleInfo_9026F1, &TrackVehicleInfo_902825, &TrackVehicleInfo_902959, &TrackVehicleInfo_902A8D, // TrackElemType::Up25ToFlat - &TrackVehicleInfo_903959, &TrackVehicleInfo_903A7B, &TrackVehicleInfo_903B9D, &TrackVehicleInfo_903CBF, // TrackElemType::Down25 - &RightLane::TrackVehicleInfoDown600, &RightLane::TrackVehicleInfoDown601, &RightLane::TrackVehicleInfoDown602, &RightLane::TrackVehicleInfoDown603, // TrackElemType::Down60 - &TrackVehicleInfo_903049, &TrackVehicleInfo_90316B, &TrackVehicleInfo_90328D, &TrackVehicleInfo_9033AF, // TrackElemType::FlatToDown25 - &RightLane::TrackVehicleInfoDown25ToDown600, &RightLane::TrackVehicleInfoDown25ToDown601, &RightLane::TrackVehicleInfoDown25ToDown602, &RightLane::TrackVehicleInfoDown25ToDown603, // TrackElemType::Down25ToDown60 - &RightLane::TrackVehicleInfoDown60ToDown250, &RightLane::TrackVehicleInfoDown60ToDown251, &RightLane::TrackVehicleInfoDown60ToDown252, &RightLane::TrackVehicleInfoDown60ToDown253, // TrackElemType::Down60ToDown25 - &TrackVehicleInfo_902BC1, &TrackVehicleInfo_902CE3, &TrackVehicleInfo_902E05, &TrackVehicleInfo_902F27, // TrackElemType::Down25ToFlat - &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles0, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles1, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles2, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles3, // TrackElemType::LeftQuarterTurn5Tiles - &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles0, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles1, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles2, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles3, // TrackElemType::RightQuarterTurn5Tiles - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::FlatToLeftBank - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::FlatToRightBank - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::LeftBankToFlat - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::RightBankToFlat - &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles0, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles1, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles2, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles3, // TrackElemType::BankedLeftQuarterTurn5Tiles - &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles0, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles1, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles2, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles3, // TrackElemType::BankedRightQuarterTurn5Tiles - &TrackVehicleInfo_902269, &TrackVehicleInfo_90238B, &TrackVehicleInfo_9024AD, &TrackVehicleInfo_9025CF, // TrackElemType::LeftBankToUp25 - &TrackVehicleInfo_902269, &TrackVehicleInfo_90238B, &TrackVehicleInfo_9024AD, &TrackVehicleInfo_9025CF, // TrackElemType::RightBankToUp25 - &TrackVehicleInfo_9026F1, &TrackVehicleInfo_902825, &TrackVehicleInfo_902959, &TrackVehicleInfo_902A8D, // TrackElemType::Up25ToLeftBank - &TrackVehicleInfo_9026F1, &TrackVehicleInfo_902825, &TrackVehicleInfo_902959, &TrackVehicleInfo_902A8D, // TrackElemType::Up25ToRightBank - &TrackVehicleInfo_903049, &TrackVehicleInfo_90316B, &TrackVehicleInfo_90328D, &TrackVehicleInfo_9033AF, // TrackElemType::LeftBankToDown25 - &TrackVehicleInfo_903049, &TrackVehicleInfo_90316B, &TrackVehicleInfo_90328D, &TrackVehicleInfo_9033AF, // TrackElemType::RightBankToDown25 - &TrackVehicleInfo_902BC1, &TrackVehicleInfo_902CE3, &TrackVehicleInfo_902E05, &TrackVehicleInfo_902F27, // TrackElemType::Down25ToLeftBank - &TrackVehicleInfo_902BC1, &TrackVehicleInfo_902CE3, &TrackVehicleInfo_902E05, &TrackVehicleInfo_902F27, // TrackElemType::Down25ToRightBank - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::LeftBank - &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::RightBank - &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp0, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp1, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp2, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp3, // TrackElemType::LeftQuarterTurn5TilesUp25 - &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp0, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp1, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp2, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp3, // TrackElemType::RightQuarterTurn5TilesUp25 - &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown0, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown1, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown2, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown3, // TrackElemType::LeftQuarterTurn5TilesDown25 - &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown0, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown1, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown2, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown3, // TrackElemType::RightQuarterTurn5TilesDown25 - &RightLane::TrackVehicleInfoLeftSBend0, &RightLane::TrackVehicleInfoLeftSBend1, &RightLane::TrackVehicleInfoLeftSBend2, &RightLane::TrackVehicleInfoLeftSBend3, // TrackElemType::SBendLeft - &RightLane::TrackVehicleInfoRightSBend0, &RightLane::TrackVehicleInfoRightSBend1, &RightLane::TrackVehicleInfoRightSBend2, &RightLane::TrackVehicleInfoRightSBend3, // TrackElemType::SBendRight - &TrackVehicleInfo_8D44BE, &TrackVehicleInfo_8D4FA6, &TrackVehicleInfo_8D5A8E, &TrackVehicleInfo_8D6576, // TrackElemType::LeftVerticalLoop - &TrackVehicleInfo_8D705E, &TrackVehicleInfo_8D7B46, &TrackVehicleInfo_8D862E, &TrackVehicleInfo_8D9116, // TrackElemType::RightVerticalLoop - &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // TrackElemType::LeftQuarterTurn3Tiles - &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles0, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles1, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles2, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles3, // TrackElemType::RightQuarterTurn3Tiles - &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // TrackElemType::LeftBankedQuarterTurn3Tiles - &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles0, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles1, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles2, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles3, // TrackElemType::RightBankedQuarterTurn3Tiles - &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp0, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp1, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp2, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp3, // TrackElemType::LeftQuarterTurn3TilesUp25 - &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp0, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp1, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp2, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp3, // TrackElemType::RightQuarterTurn3TilesUp25 - &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown0, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown1, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown2, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown3, // TrackElemType::LeftQuarterTurn3TilesDown25 - &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown0, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown1, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown2, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown3, // TrackElemType::RightQuarterTurn3TilesDown25 - &TrackVehicleInfo_903DE1, &TrackVehicleInfo_903F0C, &TrackVehicleInfo_904040, &TrackVehicleInfo_904162, // TrackElemType::LeftQuarterTurn1Tile - &TrackVehicleInfo_904284, &TrackVehicleInfo_9042F2, &TrackVehicleInfo_904369, &TrackVehicleInfo_9043E9, // TrackElemType::RightQuarterTurn1Tile + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::flat + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::endStation + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::beginStation + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::middleStation + &TrackVehicleInfo_9034D1, &TrackVehicleInfo_9035F3, &TrackVehicleInfo_903715, &TrackVehicleInfo_903837, // TrackElemType::up25 + &RightLane::TrackVehicleInfoUp600, &RightLane::TrackVehicleInfoUp601, &RightLane::TrackVehicleInfoUp602, &RightLane::TrackVehicleInfoUp603, // TrackElemType::up60 + &TrackVehicleInfo_902269, &TrackVehicleInfo_90238B, &TrackVehicleInfo_9024AD, &TrackVehicleInfo_9025CF, // TrackElemType::flatToUp25 + &RightLane::TrackVehicleInfoUp25ToUp600, &RightLane::TrackVehicleInfoUp25ToUp601, &RightLane::TrackVehicleInfoUp25ToUp602, &RightLane::TrackVehicleInfoUp25ToUp603, // TrackElemType::up25ToUp60 + &RightLane::TrackVehicleInfoUp60ToUp250, &RightLane::TrackVehicleInfoUp60ToUp251, &RightLane::TrackVehicleInfoUp60ToUp252, &RightLane::TrackVehicleInfoUp60ToUp253, // TrackElemType::up60ToUp25 + &TrackVehicleInfo_9026F1, &TrackVehicleInfo_902825, &TrackVehicleInfo_902959, &TrackVehicleInfo_902A8D, // TrackElemType::up25ToFlat + &TrackVehicleInfo_903959, &TrackVehicleInfo_903A7B, &TrackVehicleInfo_903B9D, &TrackVehicleInfo_903CBF, // TrackElemType::down25 + &RightLane::TrackVehicleInfoDown600, &RightLane::TrackVehicleInfoDown601, &RightLane::TrackVehicleInfoDown602, &RightLane::TrackVehicleInfoDown603, // TrackElemType::down60 + &TrackVehicleInfo_903049, &TrackVehicleInfo_90316B, &TrackVehicleInfo_90328D, &TrackVehicleInfo_9033AF, // TrackElemType::flatToDown25 + &RightLane::TrackVehicleInfoDown25ToDown600, &RightLane::TrackVehicleInfoDown25ToDown601, &RightLane::TrackVehicleInfoDown25ToDown602, &RightLane::TrackVehicleInfoDown25ToDown603, // TrackElemType::down25ToDown60 + &RightLane::TrackVehicleInfoDown60ToDown250, &RightLane::TrackVehicleInfoDown60ToDown251, &RightLane::TrackVehicleInfoDown60ToDown252, &RightLane::TrackVehicleInfoDown60ToDown253, // TrackElemType::down60ToDown25 + &TrackVehicleInfo_902BC1, &TrackVehicleInfo_902CE3, &TrackVehicleInfo_902E05, &TrackVehicleInfo_902F27, // TrackElemType::down25ToFlat + &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles0, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles1, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles2, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles3, // TrackElemType::leftQuarterTurn5Tiles + &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles0, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles1, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles2, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles3, // TrackElemType::rightQuarterTurn5Tiles + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::flatToLeftBank + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::flatToRightBank + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::leftBankToFlat + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::rightBankToFlat + &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles0, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles1, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles2, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles3, // TrackElemType::bankedLeftQuarterTurn5Tiles + &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles0, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles1, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles2, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles3, // TrackElemType::bankedRightQuarterTurn5Tiles + &TrackVehicleInfo_902269, &TrackVehicleInfo_90238B, &TrackVehicleInfo_9024AD, &TrackVehicleInfo_9025CF, // TrackElemType::leftBankToUp25 + &TrackVehicleInfo_902269, &TrackVehicleInfo_90238B, &TrackVehicleInfo_9024AD, &TrackVehicleInfo_9025CF, // TrackElemType::rightBankToUp25 + &TrackVehicleInfo_9026F1, &TrackVehicleInfo_902825, &TrackVehicleInfo_902959, &TrackVehicleInfo_902A8D, // TrackElemType::up25ToLeftBank + &TrackVehicleInfo_9026F1, &TrackVehicleInfo_902825, &TrackVehicleInfo_902959, &TrackVehicleInfo_902A8D, // TrackElemType::up25ToRightBank + &TrackVehicleInfo_903049, &TrackVehicleInfo_90316B, &TrackVehicleInfo_90328D, &TrackVehicleInfo_9033AF, // TrackElemType::leftBankToDown25 + &TrackVehicleInfo_903049, &TrackVehicleInfo_90316B, &TrackVehicleInfo_90328D, &TrackVehicleInfo_9033AF, // TrackElemType::rightBankToDown25 + &TrackVehicleInfo_902BC1, &TrackVehicleInfo_902CE3, &TrackVehicleInfo_902E05, &TrackVehicleInfo_902F27, // TrackElemType::down25ToLeftBank + &TrackVehicleInfo_902BC1, &TrackVehicleInfo_902CE3, &TrackVehicleInfo_902E05, &TrackVehicleInfo_902F27, // TrackElemType::down25ToRightBank + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::leftBank + &TrackVehicleInfo_901DE1, &TrackVehicleInfo_901F03, &TrackVehicleInfo_902025, &TrackVehicleInfo_902147, // TrackElemType::rightBank + &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp0, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp1, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp2, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegUp3, // TrackElemType::leftQuarterTurn5TilesUp25 + &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp0, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp1, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp2, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegUp3, // TrackElemType::rightQuarterTurn5TilesUp25 + &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown0, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown1, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown2, &RightLane::TrackVehicleInfoLeftQuarterTurn5Tiles25DegDown3, // TrackElemType::leftQuarterTurn5TilesDown25 + &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown0, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown1, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown2, &RightLane::TrackVehicleInfoRightQuarterTurn5Tiles25DegDown3, // TrackElemType::rightQuarterTurn5TilesDown25 + &RightLane::TrackVehicleInfoLeftSBend0, &RightLane::TrackVehicleInfoLeftSBend1, &RightLane::TrackVehicleInfoLeftSBend2, &RightLane::TrackVehicleInfoLeftSBend3, // TrackElemType::sBendLeft + &RightLane::TrackVehicleInfoRightSBend0, &RightLane::TrackVehicleInfoRightSBend1, &RightLane::TrackVehicleInfoRightSBend2, &RightLane::TrackVehicleInfoRightSBend3, // TrackElemType::sBendRight + &TrackVehicleInfo_8D44BE, &TrackVehicleInfo_8D4FA6, &TrackVehicleInfo_8D5A8E, &TrackVehicleInfo_8D6576, // TrackElemType::leftVerticalLoop + &TrackVehicleInfo_8D705E, &TrackVehicleInfo_8D7B46, &TrackVehicleInfo_8D862E, &TrackVehicleInfo_8D9116, // TrackElemType::rightVerticalLoop + &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // TrackElemType::leftQuarterTurn3Tiles + &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles0, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles1, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles2, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles3, // TrackElemType::rightQuarterTurn3Tiles + &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // TrackElemType::leftBankedQuarterTurn3Tiles + &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles0, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles1, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles2, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles3, // TrackElemType::rightBankedQuarterTurn3Tiles + &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp0, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp1, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp2, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegUp3, // TrackElemType::leftQuarterTurn3TilesUp25 + &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp0, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp1, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp2, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegUp3, // TrackElemType::rightQuarterTurn3TilesUp25 + &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown0, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown1, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown2, &RightLane::TrackVehicleInfoLeftQuarterTurn3Tiles25DegDown3, // TrackElemType::leftQuarterTurn3TilesDown25 + &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown0, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown1, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown2, &RightLane::TrackVehicleInfoRightQuarterTurn3Tiles25DegDown3, // TrackElemType::rightQuarterTurn3TilesDown25 + &TrackVehicleInfo_903DE1, &TrackVehicleInfo_903F0C, &TrackVehicleInfo_904040, &TrackVehicleInfo_904162, // TrackElemType::leftQuarterTurn1Tile + &TrackVehicleInfo_904284, &TrackVehicleInfo_9042F2, &TrackVehicleInfo_904369, &TrackVehicleInfo_9043E9, // TrackElemType::rightQuarterTurn1Tile &TrackVehicleInfo_8D9BFE, &TrackVehicleInfo_8D9F60, &TrackVehicleInfo_8DA2C2, &TrackVehicleInfo_8DA624, // LeftTwistDownToUp &TrackVehicleInfo_8DA986, &TrackVehicleInfo_8DACE8, &TrackVehicleInfo_8DB04A, &TrackVehicleInfo_8DB3AC, // RightTwistDownToUp &TrackVehicleInfo_8DB70E, &TrackVehicleInfo_8DBA70, &TrackVehicleInfo_8DBDD2, &TrackVehicleInfo_8DC134, // LeftTwistUpToDown @@ -40617,14 +40617,14 @@ static constexpr const VehicleInfoList *TrackVehicleInfoListGoKartsRightLane[] = &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown0, &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown1, &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown2, &TrackVehicleInfo_RightFlyerLargeHalfLoopUninvertedDown3, // RightFlyerLargeHalfLoopUninvertedDown &TrackVehicleInfo_8E644E, &TrackVehicleInfo_8E69F9, &TrackVehicleInfo_8E6FA4, &TrackVehicleInfo_8E754F, // FlyerHalfLoopInvertedUp &TrackVehicleInfo_FlyerHalfLoopUninvertedDown0, &TrackVehicleInfo_FlyerHalfLoopUninvertedDown1, &TrackVehicleInfo_FlyerHalfLoopUninvertedDown2, &TrackVehicleInfo_FlyerHalfLoopUninvertedDown3, // FlyerHalfLoopUninvertedDown - &RightLane::TrackVehicleInfoLeftEighthToDiagUp250, &RightLane::TrackVehicleInfoLeftEighthToDiagUp251, &RightLane::TrackVehicleInfoLeftEighthToDiagUp252, &RightLane::TrackVehicleInfoLeftEighthToDiagUp253, // TrackElemType::LeftEighthToDiagUp25 - &RightLane::TrackVehicleInfoRightEighthToDiagUp250, &RightLane::TrackVehicleInfoRightEighthToDiagUp251, &RightLane::TrackVehicleInfoRightEighthToDiagUp252, &RightLane::TrackVehicleInfoRightEighthToDiagUp253, // TrackElemType::RightEighthToDiagUp25 - &RightLane::TrackVehicleInfoLeftEighthToDiagDown250, &RightLane::TrackVehicleInfoLeftEighthToDiagDown251, &RightLane::TrackVehicleInfoLeftEighthToDiagDown252, &RightLane::TrackVehicleInfoLeftEighthToDiagDown253, // TrackElemType::LeftEighthToDiagDown25 - &RightLane::TrackVehicleInfoRightEighthToDiagDown250, &RightLane::TrackVehicleInfoRightEighthToDiagDown251, &RightLane::TrackVehicleInfoRightEighthToDiagDown252, &RightLane::TrackVehicleInfoRightEighthToDiagDown253, // TrackElemType::RightEighthToDiagDown25 - &RightLane::TrackVehicleInfoLeftEighthToOrthogonalUp250, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalUp251, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalUp252, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalUp253, // TrackElemType::LeftEighthToOrthogonalUp25 - &RightLane::TrackVehicleInfoRightEighthToOrthogonalUp250, &RightLane::TrackVehicleInfoRightEighthToOrthogonalUp251, &RightLane::TrackVehicleInfoRightEighthToOrthogonalUp252, &RightLane::TrackVehicleInfoRightEighthToOrthogonalUp253, // TrackElemType::RightEighthToOrthogonalUp25 - &RightLane::TrackVehicleInfoLeftEighthToOrthogonalDown250, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalDown251, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalDown252, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalDown253, // TrackElemType::LeftEighthToOrthogonalDown25 - &RightLane::TrackVehicleInfoRightEighthToOrthogonalDown250, &RightLane::TrackVehicleInfoRightEighthToOrthogonalDown251, &RightLane::TrackVehicleInfoRightEighthToOrthogonalDown252, &RightLane::TrackVehicleInfoRightEighthToOrthogonalDown253, // TrackElemType::RightEighthToOrthogonalDown25 + &RightLane::TrackVehicleInfoLeftEighthToDiagUp250, &RightLane::TrackVehicleInfoLeftEighthToDiagUp251, &RightLane::TrackVehicleInfoLeftEighthToDiagUp252, &RightLane::TrackVehicleInfoLeftEighthToDiagUp253, // TrackElemType::leftEighthToDiagUp25 + &RightLane::TrackVehicleInfoRightEighthToDiagUp250, &RightLane::TrackVehicleInfoRightEighthToDiagUp251, &RightLane::TrackVehicleInfoRightEighthToDiagUp252, &RightLane::TrackVehicleInfoRightEighthToDiagUp253, // TrackElemType::rightEighthToDiagUp25 + &RightLane::TrackVehicleInfoLeftEighthToDiagDown250, &RightLane::TrackVehicleInfoLeftEighthToDiagDown251, &RightLane::TrackVehicleInfoLeftEighthToDiagDown252, &RightLane::TrackVehicleInfoLeftEighthToDiagDown253, // TrackElemType::leftEighthToDiagDown25 + &RightLane::TrackVehicleInfoRightEighthToDiagDown250, &RightLane::TrackVehicleInfoRightEighthToDiagDown251, &RightLane::TrackVehicleInfoRightEighthToDiagDown252, &RightLane::TrackVehicleInfoRightEighthToDiagDown253, // TrackElemType::rightEighthToDiagDown25 + &RightLane::TrackVehicleInfoLeftEighthToOrthogonalUp250, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalUp251, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalUp252, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalUp253, // TrackElemType::leftEighthToOrthogonalUp25 + &RightLane::TrackVehicleInfoRightEighthToOrthogonalUp250, &RightLane::TrackVehicleInfoRightEighthToOrthogonalUp251, &RightLane::TrackVehicleInfoRightEighthToOrthogonalUp252, &RightLane::TrackVehicleInfoRightEighthToOrthogonalUp253, // TrackElemType::rightEighthToOrthogonalUp25 + &RightLane::TrackVehicleInfoLeftEighthToOrthogonalDown250, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalDown251, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalDown252, &RightLane::TrackVehicleInfoLeftEighthToOrthogonalDown253, // TrackElemType::leftEighthToOrthogonalDown25 + &RightLane::TrackVehicleInfoRightEighthToOrthogonalDown250, &RightLane::TrackVehicleInfoRightEighthToOrthogonalDown251, &RightLane::TrackVehicleInfoRightEighthToOrthogonalDown252, &RightLane::TrackVehicleInfoRightEighthToOrthogonalDown253, // TrackElemType::rightEighthToOrthogonalDown25 }; static constexpr const VehicleInfoList *TrackVehicleInfoListGoKartsMovingToRightLane[] = { @@ -40666,8 +40666,8 @@ static constexpr const VehicleInfoList *TrackVehicleInfoListGoKartsMovingToRight &TrackVehicleInfo_8D148E, &TrackVehicleInfo_8D1889, &TrackVehicleInfo_8D1C8D, &TrackVehicleInfo_8D209A, // RightQuarterTurn5TilesUp25 &TrackVehicleInfo_8D249E, &TrackVehicleInfo_8D28A2, &TrackVehicleInfo_8D2CAF, &TrackVehicleInfo_8D30B3, // LeftQuarterTurn5TilesDown25 &TrackVehicleInfo_8D34AE, &TrackVehicleInfo_8D38A9, &TrackVehicleInfo_8D3CAD, &TrackVehicleInfo_8D40BA, // RightQuarterTurn5TilesDown25 - &MovingToRightLane::TrackVehicleInfoLeftSBend0, &MovingToRightLane::TrackVehicleInfoLeftSBend1, &MovingToRightLane::TrackVehicleInfoLeftSBend2, &MovingToRightLane::TrackVehicleInfoLeftSBend3, // TrackElemType::SBendLeft - &MovingToRightLane::TrackVehicleInfoRightSBend0, &MovingToRightLane::TrackVehicleInfoRightSBend1, &MovingToRightLane::TrackVehicleInfoRightSBend2, &MovingToRightLane::TrackVehicleInfoRightSBend3, // TrackElemType::SBendRight + &MovingToRightLane::TrackVehicleInfoLeftSBend0, &MovingToRightLane::TrackVehicleInfoLeftSBend1, &MovingToRightLane::TrackVehicleInfoLeftSBend2, &MovingToRightLane::TrackVehicleInfoLeftSBend3, // TrackElemType::sBendLeft + &MovingToRightLane::TrackVehicleInfoRightSBend0, &MovingToRightLane::TrackVehicleInfoRightSBend1, &MovingToRightLane::TrackVehicleInfoRightSBend2, &MovingToRightLane::TrackVehicleInfoRightSBend3, // TrackElemType::sBendRight &TrackVehicleInfo_8D44BE, &TrackVehicleInfo_8D4FA6, &TrackVehicleInfo_8D5A8E, &TrackVehicleInfo_8D6576, // LeftVerticalLoop &TrackVehicleInfo_8D705E, &TrackVehicleInfo_8D7B46, &TrackVehicleInfo_8D862E, &TrackVehicleInfo_8D9116, // RightVerticalLoop &MovingToRightLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &MovingToRightLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &MovingToRightLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &MovingToRightLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // LeftQuarterTurn3Tiles @@ -40811,8 +40811,8 @@ static constexpr const VehicleInfoList *TrackVehicleInfoListGoKartsMovingToLeftL &TrackVehicleInfo_8D148E, &TrackVehicleInfo_8D1889, &TrackVehicleInfo_8D1C8D, &TrackVehicleInfo_8D209A, // RightQuarterTurn5TilesUp25 &TrackVehicleInfo_8D249E, &TrackVehicleInfo_8D28A2, &TrackVehicleInfo_8D2CAF, &TrackVehicleInfo_8D30B3, // LeftQuarterTurn5TilesDown25 &TrackVehicleInfo_8D34AE, &TrackVehicleInfo_8D38A9, &TrackVehicleInfo_8D3CAD, &TrackVehicleInfo_8D40BA, // RightQuarterTurn5TilesDown25 - &MovingToLeftLane::TrackVehicleInfoLeftSBend0, &MovingToLeftLane::TrackVehicleInfoLeftSBend1, &MovingToLeftLane::TrackVehicleInfoLeftSBend2, &MovingToLeftLane::TrackVehicleInfoLeftSBend3, // TrackElemType::SBendLeft - &MovingToLeftLane::TrackVehicleInfoRightSBend0, &MovingToLeftLane::TrackVehicleInfoRightSBend1, &MovingToLeftLane::TrackVehicleInfoRightSBend2, &MovingToLeftLane::TrackVehicleInfoRightSBend3, // TrackElemType::SBendRight + &MovingToLeftLane::TrackVehicleInfoLeftSBend0, &MovingToLeftLane::TrackVehicleInfoLeftSBend1, &MovingToLeftLane::TrackVehicleInfoLeftSBend2, &MovingToLeftLane::TrackVehicleInfoLeftSBend3, // TrackElemType::sBendLeft + &MovingToLeftLane::TrackVehicleInfoRightSBend0, &MovingToLeftLane::TrackVehicleInfoRightSBend1, &MovingToLeftLane::TrackVehicleInfoRightSBend2, &MovingToLeftLane::TrackVehicleInfoRightSBend3, // TrackElemType::sBendRight &TrackVehicleInfo_8D44BE, &TrackVehicleInfo_8D4FA6, &TrackVehicleInfo_8D5A8E, &TrackVehicleInfo_8D6576, // LeftVerticalLoop &TrackVehicleInfo_8D705E, &TrackVehicleInfo_8D7B46, &TrackVehicleInfo_8D862E, &TrackVehicleInfo_8D9116, // RightVerticalLoop &MovingToLeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles0, &MovingToLeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles1, &MovingToLeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles2, &MovingToLeftLane::TrackVehicleInfoLeftQuarterTurn3Tiles3, // LeftQuarterTurn3Tiles diff --git a/src/openrct2/ride/VehicleSubpositionData.h b/src/openrct2/ride/VehicleSubpositionData.h index 22a35ac56f50..6e820283e371 100644 --- a/src/openrct2/ride/VehicleSubpositionData.h +++ b/src/openrct2/ride/VehicleSubpositionData.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -14,7 +14,7 @@ #include -constexpr const size_t VehicleTrackSubpositionSizeDefault = EnumValue(OpenRCT2::TrackElemType::Count) +constexpr const size_t VehicleTrackSubpositionSizeDefault = EnumValue(OpenRCT2::TrackElemType::count) * kNumOrthogonalDirections; struct VehicleInfo; diff --git a/src/openrct2/ride/rtd/coaster/AirPoweredVerticalCoaster.h b/src/openrct2/ride/rtd/coaster/AirPoweredVerticalCoaster.h index 10193e0eda94..d0f89858f89d 100644 --- a/src/openrct2/ride/rtd/coaster/AirPoweredVerticalCoaster.h +++ b/src/openrct2/ride/rtd/coaster/AirPoweredVerticalCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor AirPoweredVerticalCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::airPoweredVerticalCoaster, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/coaster/AlpineCoaster.h b/src/openrct2/ride/rtd/coaster/AlpineCoaster.h index d4d7bba43506..6a02333e4250 100644 --- a/src/openrct2/ride/rtd/coaster/AlpineCoaster.h +++ b/src/openrct2/ride/rtd/coaster/AlpineCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor AlpineCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::alpineCoaster, .supportType = MetalSupportType::fork, diff --git a/src/openrct2/ride/rtd/coaster/BobsleighCoaster.h b/src/openrct2/ride/rtd/coaster/BobsleighCoaster.h index 8362f2071dd0..f23979b53d55 100644 --- a/src/openrct2/ride/rtd/coaster/BobsleighCoaster.h +++ b/src/openrct2/ride/rtd/coaster/BobsleighCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor BobsleighCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::bobsleighCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/ClassicMiniRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ClassicMiniRollerCoaster.h index 74ba628a2c0f..e369e7743225 100644 --- a/src/openrct2/ride/rtd/coaster/ClassicMiniRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ClassicMiniRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ClassicMiniRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::juniorRollerCoaster, .supportType = MetalSupportType::fork, diff --git a/src/openrct2/ride/rtd/coaster/ClassicStandUpRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ClassicStandUpRollerCoaster.h index 9596ad05ec61..5f203d403871 100644 --- a/src/openrct2/ride/rtd/coaster/ClassicStandUpRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ClassicStandUpRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ClassicStandUpRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::classicStandUpRollerCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/ClassicWoodenRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ClassicWoodenRollerCoaster.h index 1c36c3d6bee4..e0513e40f5e1 100644 --- a/src/openrct2/ride/rtd/coaster/ClassicWoodenRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ClassicWoodenRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ClassicWoodenRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::classicWoodenRollerCoaster, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/coaster/ClassicWoodenTwisterRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ClassicWoodenTwisterRollerCoaster.h index 3f220a06c6b2..91e224c818ac 100644 --- a/src/openrct2/ride/rtd/coaster/ClassicWoodenTwisterRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ClassicWoodenTwisterRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ClassicWoodenTwisterRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::classicWoodenTwisterRollerCoaster, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/coaster/CompactInvertedCoaster.h b/src/openrct2/ride/rtd/coaster/CompactInvertedCoaster.h index 9feb2a3a1799..217eae60882c 100644 --- a/src/openrct2/ride/rtd/coaster/CompactInvertedCoaster.h +++ b/src/openrct2/ride/rtd/coaster/CompactInvertedCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor CompactInvertedCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::compactInvertedCoaster, .supportType = MetalSupportType::tubesInverted, diff --git a/src/openrct2/ride/rtd/coaster/CorkscrewRollerCoaster.h b/src/openrct2/ride/rtd/coaster/CorkscrewRollerCoaster.h index 56180b678372..30cdf7c7aea2 100644 --- a/src/openrct2/ride/rtd/coaster/CorkscrewRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/CorkscrewRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor CorkscrewRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::corkscrewRollerCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h b/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h index e87e58e0eb42..5e6af51f5805 100644 --- a/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor FlyingRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::flyingRollerCoaster, .supportType = MetalSupportType::tubesInverted, @@ -99,7 +99,7 @@ constexpr RideTypeDescriptor FlyingRollerCoasterRTD = constexpr RideTypeDescriptor FlyingRollerCoasterAltRTD = { .Category = RideCategory::none, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::null, .enabledTrackGroups = { }, diff --git a/src/openrct2/ride/rtd/coaster/GigaCoaster.h b/src/openrct2/ride/rtd/coaster/GigaCoaster.h index b33e454aac80..682c0ac4da70 100644 --- a/src/openrct2/ride/rtd/coaster/GigaCoaster.h +++ b/src/openrct2/ride/rtd/coaster/GigaCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor GigaCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::latticeTriangle, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/HeartlineTwisterCoaster.h b/src/openrct2/ride/rtd/coaster/HeartlineTwisterCoaster.h index 3401adc44258..2deac214639b 100644 --- a/src/openrct2/ride/rtd/coaster/HeartlineTwisterCoaster.h +++ b/src/openrct2/ride/rtd/coaster/HeartlineTwisterCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor HeartlineTwisterCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::heartlineTwisterCoaster, .supportType = WoodenSupportType::mine, diff --git a/src/openrct2/ride/rtd/coaster/HybridCoaster.h b/src/openrct2/ride/rtd/coaster/HybridCoaster.h index a4a6045f5d08..252d7aa03627 100644 --- a/src/openrct2/ride/rtd/coaster/HybridCoaster.h +++ b/src/openrct2/ride/rtd/coaster/HybridCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor HybridCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::hybridCoaster, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/coaster/HyperTwister.h b/src/openrct2/ride/rtd/coaster/HyperTwister.h index 62bb10249b6c..dfa5077c8193 100644 --- a/src/openrct2/ride/rtd/coaster/HyperTwister.h +++ b/src/openrct2/ride/rtd/coaster/HyperTwister.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor HyperTwisterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::twisterRollerCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/Hypercoaster.h b/src/openrct2/ride/rtd/coaster/Hypercoaster.h index e48a545af393..630e9fe30d3e 100644 --- a/src/openrct2/ride/rtd/coaster/Hypercoaster.h +++ b/src/openrct2/ride/rtd/coaster/Hypercoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor HypercoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::corkscrewRollerCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/InvertedHairpinCoaster.h b/src/openrct2/ride/rtd/coaster/InvertedHairpinCoaster.h index 3017104be96c..f4e53e7dada5 100644 --- a/src/openrct2/ride/rtd/coaster/InvertedHairpinCoaster.h +++ b/src/openrct2/ride/rtd/coaster/InvertedHairpinCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor InvertedHairpinCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::invertedHairpinCoaster, .supportType = MetalSupportType::tubesInverted, diff --git a/src/openrct2/ride/rtd/coaster/InvertedImpulseCoaster.h b/src/openrct2/ride/rtd/coaster/InvertedImpulseCoaster.h index fe86bb95a652..24b49cea0b3a 100644 --- a/src/openrct2/ride/rtd/coaster/InvertedImpulseCoaster.h +++ b/src/openrct2/ride/rtd/coaster/InvertedImpulseCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor InvertedImpulseCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::invertedImpulseCoaster, .supportType = MetalSupportType::tubesInverted, diff --git a/src/openrct2/ride/rtd/coaster/InvertedRollerCoaster.h b/src/openrct2/ride/rtd/coaster/InvertedRollerCoaster.h index a3eef9b7abe1..64eb9efa1bf9 100644 --- a/src/openrct2/ride/rtd/coaster/InvertedRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/InvertedRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor InvertedRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::invertedRollerCoaster, .supportType = MetalSupportType::boxed, diff --git a/src/openrct2/ride/rtd/coaster/JuniorRollerCoaster.h b/src/openrct2/ride/rtd/coaster/JuniorRollerCoaster.h index 78ccf41052eb..e23588954da3 100644 --- a/src/openrct2/ride/rtd/coaster/JuniorRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/JuniorRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor JuniorRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::juniorRollerCoaster, .supportType = MetalSupportType::fork, diff --git a/src/openrct2/ride/rtd/coaster/LIMLaunchedRollerCoaster.h b/src/openrct2/ride/rtd/coaster/LIMLaunchedRollerCoaster.h index 615478a07c74..b0759f12302b 100644 --- a/src/openrct2/ride/rtd/coaster/LIMLaunchedRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/LIMLaunchedRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor LIMLaunchedRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::limLaunchedRollerCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h b/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h index db2c78e04a41..4b807d51af8a 100644 --- a/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor LSMLaunchedRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::latticeTriangleAlt, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/LayDownRollerCoaster.h b/src/openrct2/ride/rtd/coaster/LayDownRollerCoaster.h index 5be964e847bf..dc717ddd493b 100644 --- a/src/openrct2/ride/rtd/coaster/LayDownRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/LayDownRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor LayDownRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor( { .trackStyle = TrackStyle::corkscrewRollerCoaster, @@ -98,7 +98,7 @@ constexpr RideTypeDescriptor LayDownRollerCoasterRTD = constexpr RideTypeDescriptor LayDownRollerCoasterAltRTD = { .Category = RideCategory::none, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::null, .enabledTrackGroups = { }, diff --git a/src/openrct2/ride/rtd/coaster/LoopingRollerCoaster.h b/src/openrct2/ride/rtd/coaster/LoopingRollerCoaster.h index 7d172b53a8ec..931cbec079c5 100644 --- a/src/openrct2/ride/rtd/coaster/LoopingRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/LoopingRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor LoopingRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::loopingRollerCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/MineRide.h b/src/openrct2/ride/rtd/coaster/MineRide.h index 7e3988683abe..b9a7ec40207c 100644 --- a/src/openrct2/ride/rtd/coaster/MineRide.h +++ b/src/openrct2/ride/rtd/coaster/MineRide.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MineRideRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::mineRide, .supportType = MetalSupportType::fork, diff --git a/src/openrct2/ride/rtd/coaster/MineTrainCoaster.h b/src/openrct2/ride/rtd/coaster/MineTrainCoaster.h index d46ca376539a..60fd727eb5d4 100644 --- a/src/openrct2/ride/rtd/coaster/MineTrainCoaster.h +++ b/src/openrct2/ride/rtd/coaster/MineTrainCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MineTrainCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::mineTrainCoaster, .supportType = WoodenSupportType::mine, diff --git a/src/openrct2/ride/rtd/coaster/MiniRollerCoaster.h b/src/openrct2/ride/rtd/coaster/MiniRollerCoaster.h index 432b8e516501..3cfbb55e7ba3 100644 --- a/src/openrct2/ride/rtd/coaster/MiniRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/MiniRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MiniRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::miniRollerCoaster, .supportType = MetalSupportType::fork, diff --git a/src/openrct2/ride/rtd/coaster/MiniSuspendedCoaster.h b/src/openrct2/ride/rtd/coaster/MiniSuspendedCoaster.h index 3049551613bd..4e34859ca596 100644 --- a/src/openrct2/ride/rtd/coaster/MiniSuspendedCoaster.h +++ b/src/openrct2/ride/rtd/coaster/MiniSuspendedCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MiniSuspendedCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::miniSuspendedCoaster, .supportType = MetalSupportType::fork, diff --git a/src/openrct2/ride/rtd/coaster/MultiDimensionRollerCoaster.h b/src/openrct2/ride/rtd/coaster/MultiDimensionRollerCoaster.h index e8925af0bb6f..69aaf16904fe 100644 --- a/src/openrct2/ride/rtd/coaster/MultiDimensionRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/MultiDimensionRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MultiDimensionRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::multiDimensionRollerCoaster, .supportType = MetalSupportType::tubesInverted, @@ -98,7 +98,7 @@ constexpr RideTypeDescriptor MultiDimensionRollerCoasterRTD = constexpr RideTypeDescriptor MultiDimensionRollerCoasterAltRTD = { .Category = RideCategory::none, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::null, .enabledTrackGroups = { }, diff --git a/src/openrct2/ride/rtd/coaster/ReverseFreefallCoaster.h b/src/openrct2/ride/rtd/coaster/ReverseFreefallCoaster.h index 29423a6ac2a9..347f7985a780 100644 --- a/src/openrct2/ride/rtd/coaster/ReverseFreefallCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ReverseFreefallCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ReverseFreefallCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::reverseFreefallCoaster, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/coaster/ReverserRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ReverserRollerCoaster.h index c5242562288b..cedf9b1fb043 100644 --- a/src/openrct2/ride/rtd/coaster/ReverserRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ReverserRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ReverserRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::reverserRollerCoaster, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/coaster/SideFrictionRollerCoaster.h b/src/openrct2/ride/rtd/coaster/SideFrictionRollerCoaster.h index c5cb42a850b3..eb57d5269d55 100644 --- a/src/openrct2/ride/rtd/coaster/SideFrictionRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/SideFrictionRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SideFrictionRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::sideFrictionRollerCoaster, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/coaster/SingleRailRollerCoaster.h b/src/openrct2/ride/rtd/coaster/SingleRailRollerCoaster.h index c1e44b1726de..99435f5b2dd5 100644 --- a/src/openrct2/ride/rtd/coaster/SingleRailRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/SingleRailRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SingleRailRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::singleRailRollerCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/SpinningWildMouse.h b/src/openrct2/ride/rtd/coaster/SpinningWildMouse.h index 4c8b5d8bb477..2e4d2c157089 100644 --- a/src/openrct2/ride/rtd/coaster/SpinningWildMouse.h +++ b/src/openrct2/ride/rtd/coaster/SpinningWildMouse.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SpinningWildMouseRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::steelWildMouse, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/SpiralRollerCoaster.h b/src/openrct2/ride/rtd/coaster/SpiralRollerCoaster.h index 1f5e6cddab6c..f0f5acbe02a4 100644 --- a/src/openrct2/ride/rtd/coaster/SpiralRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/SpiralRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SpiralRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::miniRollerCoaster, .supportType = MetalSupportType::fork, diff --git a/src/openrct2/ride/rtd/coaster/StandUpRollerCoaster.h b/src/openrct2/ride/rtd/coaster/StandUpRollerCoaster.h index 070137164fc2..e25581f7f4c4 100644 --- a/src/openrct2/ride/rtd/coaster/StandUpRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/StandUpRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor StandUpRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::standUpRollerCoaster, .supportType = MetalSupportType::tubes, @@ -67,7 +67,7 @@ constexpr RideTypeDescriptor StandUpRollerCoasterRTD = false, { { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, - { RatingsModifierType::BonusSynchronisation, 0, RideRating::make(0, 40), RideRating::make(0, 10), 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RideRating::make(0, 40), RideRating::make(0, 5), 0 }, { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, { RatingsModifierType::BonusMaxSpeed, 0, 44281, 123987, 35424 }, { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, diff --git a/src/openrct2/ride/rtd/coaster/SteelWildMouse.h b/src/openrct2/ride/rtd/coaster/SteelWildMouse.h index 2b9af8ebac61..d38c63c3aedc 100644 --- a/src/openrct2/ride/rtd/coaster/SteelWildMouse.h +++ b/src/openrct2/ride/rtd/coaster/SteelWildMouse.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SteelWildMouseRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::steelWildMouse, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/Steeplechase.h b/src/openrct2/ride/rtd/coaster/Steeplechase.h index a5d4afdfe002..1440a7e9b119 100644 --- a/src/openrct2/ride/rtd/coaster/Steeplechase.h +++ b/src/openrct2/ride/rtd/coaster/Steeplechase.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SteeplechaseRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::steeplechase, .supportType = MetalSupportType::stick, diff --git a/src/openrct2/ride/rtd/coaster/SuspendedSwingingCoaster.h b/src/openrct2/ride/rtd/coaster/SuspendedSwingingCoaster.h index 6fa9852e47b7..45ef9544c3ad 100644 --- a/src/openrct2/ride/rtd/coaster/SuspendedSwingingCoaster.h +++ b/src/openrct2/ride/rtd/coaster/SuspendedSwingingCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SuspendedSwingingCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::suspendedSwingingCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h b/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h index daf11b1d3e16..765f8afe4a8c 100644 --- a/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor TwisterRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::twisterRollerCoaster, .supportType = MetalSupportType::tubes, diff --git a/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h b/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h index 204db0f746e4..ff701e412012 100644 --- a/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h +++ b/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor VerticalDropCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::twisterRollerCoaster, .supportType = MetalSupportType::boxed, diff --git a/src/openrct2/ride/rtd/coaster/VirginiaReel.h b/src/openrct2/ride/rtd/coaster/VirginiaReel.h index 327a8d5445b7..0ac2a9710881 100644 --- a/src/openrct2/ride/rtd/coaster/VirginiaReel.h +++ b/src/openrct2/ride/rtd/coaster/VirginiaReel.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor VirginiaReelRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::virginiaReel, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/coaster/WaterCoaster.h b/src/openrct2/ride/rtd/coaster/WaterCoaster.h index 298f55db22f3..5f5d8b61d0de 100644 --- a/src/openrct2/ride/rtd/coaster/WaterCoaster.h +++ b/src/openrct2/ride/rtd/coaster/WaterCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -22,7 +22,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor WaterCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor( { .trackStyle = TrackStyle::waterCoaster, diff --git a/src/openrct2/ride/rtd/coaster/WoodenRollerCoaster.h b/src/openrct2/ride/rtd/coaster/WoodenRollerCoaster.h index 1de1d7074c95..ec5dc4dcaea0 100644 --- a/src/openrct2/ride/rtd/coaster/WoodenRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/WoodenRollerCoaster.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor WoodenRollerCoasterRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::woodenRollerCoaster, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/coaster/WoodenWildMouse.h b/src/openrct2/ride/rtd/coaster/WoodenWildMouse.h index 9e32e89ddeb1..b7bdede3c68c 100644 --- a/src/openrct2/ride/rtd/coaster/WoodenWildMouse.h +++ b/src/openrct2/ride/rtd/coaster/WoodenWildMouse.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor WoodenWildMouseRTD = { .Category = RideCategory::rollerCoaster, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::woodenWildMouse, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/gentle/CarRide.h b/src/openrct2/ride/rtd/gentle/CarRide.h index f8ea14a464cc..36cab8cd1c8d 100644 --- a/src/openrct2/ride/rtd/gentle/CarRide.h +++ b/src/openrct2/ride/rtd/gentle/CarRide.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor CarRideRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::carRide, .supportType = MetalSupportType::boxed, diff --git a/src/openrct2/ride/rtd/gentle/Circus.h b/src/openrct2/ride/rtd/gentle/Circus.h index af9371e32cc7..bf30065a5318 100644 --- a/src/openrct2/ride/rtd/gentle/Circus.h +++ b/src/openrct2/ride/rtd/gentle/Circus.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor CircusRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::FlatTrack3x3, + .StartTrackPiece = TrackElemType::flatTrack3x3, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::circus, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/gentle/CrookedHouse.h b/src/openrct2/ride/rtd/gentle/CrookedHouse.h index e43e0858276e..76077bf18709 100644 --- a/src/openrct2/ride/rtd/gentle/CrookedHouse.h +++ b/src/openrct2/ride/rtd/gentle/CrookedHouse.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor CrookedHouseRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::FlatTrack3x3, + .StartTrackPiece = TrackElemType::flatTrack3x3, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::crookedHouse, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/gentle/Dodgems.h b/src/openrct2/ride/rtd/gentle/Dodgems.h index f17f36cf66c1..c49655d5cb0b 100644 --- a/src/openrct2/ride/rtd/gentle/Dodgems.h +++ b/src/openrct2/ride/rtd/gentle/Dodgems.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor DodgemsRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::FlatTrack4x4, + .StartTrackPiece = TrackElemType::flatTrack4x4, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::dodgems, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/gentle/FerrisWheel.h b/src/openrct2/ride/rtd/gentle/FerrisWheel.h index 6ca6c9d1f9f5..8f8cd318a35e 100644 --- a/src/openrct2/ride/rtd/gentle/FerrisWheel.h +++ b/src/openrct2/ride/rtd/gentle/FerrisWheel.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor FerrisWheelRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::FlatTrack1x4C, + .StartTrackPiece = TrackElemType::flatTrack1x4C, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::ferrisWheel, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/gentle/FlyingSaucers.h b/src/openrct2/ride/rtd/gentle/FlyingSaucers.h index 7908cd658d91..69a702136d40 100644 --- a/src/openrct2/ride/rtd/gentle/FlyingSaucers.h +++ b/src/openrct2/ride/rtd/gentle/FlyingSaucers.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor FlyingSaucersRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::FlatTrack4x4, + .StartTrackPiece = TrackElemType::flatTrack4x4, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::flyingSaucers, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/gentle/GhostTrain.h b/src/openrct2/ride/rtd/gentle/GhostTrain.h index e5c3abc8a9ac..37be525b4cda 100644 --- a/src/openrct2/ride/rtd/gentle/GhostTrain.h +++ b/src/openrct2/ride/rtd/gentle/GhostTrain.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor GhostTrainRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::ghostTrain, .supportType = MetalSupportType::boxed, diff --git a/src/openrct2/ride/rtd/gentle/HauntedHouse.h b/src/openrct2/ride/rtd/gentle/HauntedHouse.h index 760b3397805b..e0d129412b86 100644 --- a/src/openrct2/ride/rtd/gentle/HauntedHouse.h +++ b/src/openrct2/ride/rtd/gentle/HauntedHouse.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor HauntedHouseRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::FlatTrack3x3, + .StartTrackPiece = TrackElemType::flatTrack3x3, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::hauntedHouse, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/gentle/Maze.h b/src/openrct2/ride/rtd/gentle/Maze.h index 4ce8056d23d7..2915aee85d94 100644 --- a/src/openrct2/ride/rtd/gentle/Maze.h +++ b/src/openrct2/ride/rtd/gentle/Maze.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -22,7 +22,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MazeRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::Maze, + .StartTrackPiece = TrackElemType::maze, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::maze, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/gentle/MerryGoRound.h b/src/openrct2/ride/rtd/gentle/MerryGoRound.h index 48fbdd592a85..4a06bfe36e01 100644 --- a/src/openrct2/ride/rtd/gentle/MerryGoRound.h +++ b/src/openrct2/ride/rtd/gentle/MerryGoRound.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MerryGoRoundRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::FlatTrack3x3, + .StartTrackPiece = TrackElemType::flatTrack3x3, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::merryGoRound, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/gentle/MiniGolf.h b/src/openrct2/ride/rtd/gentle/MiniGolf.h index 4afc86b725a1..956ca12c1e6a 100644 --- a/src/openrct2/ride/rtd/gentle/MiniGolf.h +++ b/src/openrct2/ride/rtd/gentle/MiniGolf.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 { constexpr RideTypeDescriptor MiniGolfRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::miniGolf, .supportType = MetalSupportType::boxed, diff --git a/src/openrct2/ride/rtd/gentle/MiniHelicopters.h b/src/openrct2/ride/rtd/gentle/MiniHelicopters.h index b70f41ec2f60..368964597578 100644 --- a/src/openrct2/ride/rtd/gentle/MiniHelicopters.h +++ b/src/openrct2/ride/rtd/gentle/MiniHelicopters.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MiniHelicoptersRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::miniHelicopters, .supportType = MetalSupportType::stick, diff --git a/src/openrct2/ride/rtd/gentle/MonorailCycles.h b/src/openrct2/ride/rtd/gentle/MonorailCycles.h index 7f4169695711..e7c2cc3cea78 100644 --- a/src/openrct2/ride/rtd/gentle/MonorailCycles.h +++ b/src/openrct2/ride/rtd/gentle/MonorailCycles.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MonorailCyclesRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::monorailCycles, .supportType = MetalSupportType::stick, diff --git a/src/openrct2/ride/rtd/gentle/MonsterTrucks.h b/src/openrct2/ride/rtd/gentle/MonsterTrucks.h index 95b6f94dc630..c9e20a3ac208 100644 --- a/src/openrct2/ride/rtd/gentle/MonsterTrucks.h +++ b/src/openrct2/ride/rtd/gentle/MonsterTrucks.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MonsterTrucksRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::carRide, .supportType = MetalSupportType::boxed, diff --git a/src/openrct2/ride/rtd/gentle/ObservationTower.h b/src/openrct2/ride/rtd/gentle/ObservationTower.h index e7fc6e158745..dc9e2cca98ff 100644 --- a/src/openrct2/ride/rtd/gentle/ObservationTower.h +++ b/src/openrct2/ride/rtd/gentle/ObservationTower.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ObservationTowerRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::TowerBase, + .StartTrackPiece = TrackElemType::towerBase, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::observationTower, .enabledTrackGroups = {TrackGroup::tower}, diff --git a/src/openrct2/ride/rtd/gentle/SpaceRings.h b/src/openrct2/ride/rtd/gentle/SpaceRings.h index 68f2506cd1ae..379e94a4e1d9 100644 --- a/src/openrct2/ride/rtd/gentle/SpaceRings.h +++ b/src/openrct2/ride/rtd/gentle/SpaceRings.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SpaceRingsRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::FlatTrack3x3, + .StartTrackPiece = TrackElemType::flatTrack3x3, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::spaceRings, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/gentle/SpiralSlide.h b/src/openrct2/ride/rtd/gentle/SpiralSlide.h index 5340d229a7c7..d104bc023408 100644 --- a/src/openrct2/ride/rtd/gentle/SpiralSlide.h +++ b/src/openrct2/ride/rtd/gentle/SpiralSlide.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SpiralSlideRTD = { .Category = RideCategory::gentle, - .StartTrackPiece = TrackElemType::FlatTrack2x2, + .StartTrackPiece = TrackElemType::flatTrack2x2, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::spiralSlide, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/shops/CashMachine.h b/src/openrct2/ride/rtd/shops/CashMachine.h index 16ef56ca7fb6..2443b003fc27 100644 --- a/src/openrct2/ride/rtd/shops/CashMachine.h +++ b/src/openrct2/ride/rtd/shops/CashMachine.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor CashMachineRTD = { .Category = RideCategory::shop, - .StartTrackPiece = TrackElemType::FlatTrack1x1A, + .StartTrackPiece = TrackElemType::flatTrack1x1A, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::shop, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/shops/DrinkStall.h b/src/openrct2/ride/rtd/shops/DrinkStall.h index d59796e0aa75..7d88ed5c4313 100644 --- a/src/openrct2/ride/rtd/shops/DrinkStall.h +++ b/src/openrct2/ride/rtd/shops/DrinkStall.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor DrinkStallRTD = { .Category = RideCategory::shop, - .StartTrackPiece = TrackElemType::FlatTrack1x1A, + .StartTrackPiece = TrackElemType::flatTrack1x1A, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::shop, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/shops/FirstAid.h b/src/openrct2/ride/rtd/shops/FirstAid.h index 2f9bef002741..4874d821d7d5 100644 --- a/src/openrct2/ride/rtd/shops/FirstAid.h +++ b/src/openrct2/ride/rtd/shops/FirstAid.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor FirstAidRTD = { .Category = RideCategory::shop, - .StartTrackPiece = TrackElemType::FlatTrack1x1A, + .StartTrackPiece = TrackElemType::flatTrack1x1A, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::facility, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/shops/FoodStall.h b/src/openrct2/ride/rtd/shops/FoodStall.h index 09bb7ea951d0..a3a7ece43d5a 100644 --- a/src/openrct2/ride/rtd/shops/FoodStall.h +++ b/src/openrct2/ride/rtd/shops/FoodStall.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor FoodStallRTD = { .Category = RideCategory::shop, - .StartTrackPiece = TrackElemType::FlatTrack1x1A, + .StartTrackPiece = TrackElemType::flatTrack1x1A, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::shop, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/shops/InformationKiosk.h b/src/openrct2/ride/rtd/shops/InformationKiosk.h index e0442945622e..0f42a4308659 100644 --- a/src/openrct2/ride/rtd/shops/InformationKiosk.h +++ b/src/openrct2/ride/rtd/shops/InformationKiosk.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor InformationKioskRTD = { .Category = RideCategory::shop, - .StartTrackPiece = TrackElemType::FlatTrack1x1B, + .StartTrackPiece = TrackElemType::flatTrack1x1B, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::shop, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/shops/Shop.h b/src/openrct2/ride/rtd/shops/Shop.h index 835cf9a3145f..50adb96b6c69 100644 --- a/src/openrct2/ride/rtd/shops/Shop.h +++ b/src/openrct2/ride/rtd/shops/Shop.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ShopRTD = { .Category = RideCategory::shop, - .StartTrackPiece = TrackElemType::FlatTrack1x1A, + .StartTrackPiece = TrackElemType::flatTrack1x1A, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::shop, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/shops/Toilets.h b/src/openrct2/ride/rtd/shops/Toilets.h index 90c7f4370c71..8b36153d142e 100644 --- a/src/openrct2/ride/rtd/shops/Toilets.h +++ b/src/openrct2/ride/rtd/shops/Toilets.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ToiletsRTD = { .Category = RideCategory::shop, - .StartTrackPiece = TrackElemType::FlatTrack1x1A, + .StartTrackPiece = TrackElemType::flatTrack1x1A, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::facility, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/thrill/3DCinema.h b/src/openrct2/ride/rtd/thrill/3DCinema.h index 9c0d1b1301ad..e17835a535c3 100644 --- a/src/openrct2/ride/rtd/thrill/3DCinema.h +++ b/src/openrct2/ride/rtd/thrill/3DCinema.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor CinemaRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::FlatTrack3x3, + .StartTrackPiece = TrackElemType::flatTrack3x3, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::_3DCinema, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/thrill/Enterprise.h b/src/openrct2/ride/rtd/thrill/Enterprise.h index 6d6d269bb1b8..b7cd66f2142b 100644 --- a/src/openrct2/ride/rtd/thrill/Enterprise.h +++ b/src/openrct2/ride/rtd/thrill/Enterprise.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor EnterpriseRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::FlatTrack4x4, + .StartTrackPiece = TrackElemType::flatTrack4x4, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::enterprise, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/thrill/GoKarts.h b/src/openrct2/ride/rtd/thrill/GoKarts.h index 22dd8e49c52d..9de2b7192309 100644 --- a/src/openrct2/ride/rtd/thrill/GoKarts.h +++ b/src/openrct2/ride/rtd/thrill/GoKarts.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor GoKartsRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::goKarts, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/thrill/LaunchedFreefall.h b/src/openrct2/ride/rtd/thrill/LaunchedFreefall.h index 6f39b68faffe..8f641f42b04c 100644 --- a/src/openrct2/ride/rtd/thrill/LaunchedFreefall.h +++ b/src/openrct2/ride/rtd/thrill/LaunchedFreefall.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor LaunchedFreefallRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::TowerBase, + .StartTrackPiece = TrackElemType::towerBase, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::launchedFreefall, .enabledTrackGroups = {TrackGroup::tower}, diff --git a/src/openrct2/ride/rtd/thrill/MagicCarpet.h b/src/openrct2/ride/rtd/thrill/MagicCarpet.h index e7e72326e1c6..6062cd149a76 100644 --- a/src/openrct2/ride/rtd/thrill/MagicCarpet.h +++ b/src/openrct2/ride/rtd/thrill/MagicCarpet.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MagicCarpetRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::FlatTrack1x4A, + .StartTrackPiece = TrackElemType::flatTrack1x4A, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::magicCarpet, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/thrill/MotionSimulator.h b/src/openrct2/ride/rtd/thrill/MotionSimulator.h index a38c942257db..306fc74cc57a 100644 --- a/src/openrct2/ride/rtd/thrill/MotionSimulator.h +++ b/src/openrct2/ride/rtd/thrill/MotionSimulator.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MotionSimulatorRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::FlatTrack2x2, + .StartTrackPiece = TrackElemType::flatTrack2x2, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::motionSimulator, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/thrill/RotoDrop.h b/src/openrct2/ride/rtd/thrill/RotoDrop.h index 86ec8e70a772..fde33fda502f 100644 --- a/src/openrct2/ride/rtd/thrill/RotoDrop.h +++ b/src/openrct2/ride/rtd/thrill/RotoDrop.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor RotoDropRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::TowerBase, + .StartTrackPiece = TrackElemType::towerBase, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::rotoDrop, .enabledTrackGroups = {TrackGroup::tower}, diff --git a/src/openrct2/ride/rtd/thrill/SwingingInverterShip.h b/src/openrct2/ride/rtd/thrill/SwingingInverterShip.h index 359d8db36b07..a0cc258ae314 100644 --- a/src/openrct2/ride/rtd/thrill/SwingingInverterShip.h +++ b/src/openrct2/ride/rtd/thrill/SwingingInverterShip.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SwingingInverterShipRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::FlatTrack1x4B, + .StartTrackPiece = TrackElemType::flatTrack1x4B, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::swingingInverterShip, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/thrill/SwingingShip.h b/src/openrct2/ride/rtd/thrill/SwingingShip.h index fde428342eec..5e637c5c4e98 100644 --- a/src/openrct2/ride/rtd/thrill/SwingingShip.h +++ b/src/openrct2/ride/rtd/thrill/SwingingShip.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SwingingShipRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::FlatTrack1x5, + .StartTrackPiece = TrackElemType::flatTrack1x5, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::swingingShip, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/thrill/TopSpin.h b/src/openrct2/ride/rtd/thrill/TopSpin.h index ded2100ddc88..7ff6b3f50a80 100644 --- a/src/openrct2/ride/rtd/thrill/TopSpin.h +++ b/src/openrct2/ride/rtd/thrill/TopSpin.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor TopSpinRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::FlatTrack3x3, + .StartTrackPiece = TrackElemType::flatTrack3x3, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::topSpin, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/thrill/Twist.h b/src/openrct2/ride/rtd/thrill/Twist.h index 98dfe8589202..b99ca416750e 100644 --- a/src/openrct2/ride/rtd/thrill/Twist.h +++ b/src/openrct2/ride/rtd/thrill/Twist.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,7 +19,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor TwistRTD = { .Category = RideCategory::thrill, - .StartTrackPiece = TrackElemType::FlatTrack3x3, + .StartTrackPiece = TrackElemType::flatTrack3x3, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::twist, .enabledTrackGroups = {}, diff --git a/src/openrct2/ride/rtd/transport/Chairlift.h b/src/openrct2/ride/rtd/transport/Chairlift.h index e91f83ed1a79..f4d0b2185346 100644 --- a/src/openrct2/ride/rtd/transport/Chairlift.h +++ b/src/openrct2/ride/rtd/transport/Chairlift.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor ChairliftRTD = { .Category = RideCategory::transport, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::chairlift, .supportType = MetalSupportType::truss, diff --git a/src/openrct2/ride/rtd/transport/Lift.h b/src/openrct2/ride/rtd/transport/Lift.h index c1d1f2a4a145..15cf642c7806 100644 --- a/src/openrct2/ride/rtd/transport/Lift.h +++ b/src/openrct2/ride/rtd/transport/Lift.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor LiftRTD = { .Category = RideCategory::transport, - .StartTrackPiece = TrackElemType::TowerBase, + .StartTrackPiece = TrackElemType::towerBase, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::lift, .enabledTrackGroups = {TrackGroup::tower}, diff --git a/src/openrct2/ride/rtd/transport/MiniatureRailway.h b/src/openrct2/ride/rtd/transport/MiniatureRailway.h index 13d40550b93c..d67ddbea50d0 100644 --- a/src/openrct2/ride/rtd/transport/MiniatureRailway.h +++ b/src/openrct2/ride/rtd/transport/MiniatureRailway.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor MiniatureRailwayRTD = { .Category = RideCategory::transport, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::miniatureRailway, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/transport/Monorail.h b/src/openrct2/ride/rtd/transport/Monorail.h index 674b31499f1f..8e763811cec3 100644 --- a/src/openrct2/ride/rtd/transport/Monorail.h +++ b/src/openrct2/ride/rtd/transport/Monorail.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 { constexpr RideTypeDescriptor MonorailRTD = { .Category = RideCategory::transport, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::monorail, .supportType = MetalSupportType::boxed, diff --git a/src/openrct2/ride/rtd/transport/SuspendedMonorail.h b/src/openrct2/ride/rtd/transport/SuspendedMonorail.h index ed5dfd3c692d..7ebc8c0bb17c 100644 --- a/src/openrct2/ride/rtd/transport/SuspendedMonorail.h +++ b/src/openrct2/ride/rtd/transport/SuspendedMonorail.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SuspendedMonorailRTD = { .Category = RideCategory::transport, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::suspendedMonorail, .supportType = MetalSupportType::boxed, diff --git a/src/openrct2/ride/rtd/water/BoatHire.h b/src/openrct2/ride/rtd/water/BoatHire.h index b48d8f53a687..43656ce763d7 100644 --- a/src/openrct2/ride/rtd/water/BoatHire.h +++ b/src/openrct2/ride/rtd/water/BoatHire.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor BoatHireRTD = { .Category = RideCategory::water, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::boatHire, .enabledTrackGroups = {TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::curveVerySmall, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::sBend}, diff --git a/src/openrct2/ride/rtd/water/DinghySlide.h b/src/openrct2/ride/rtd/water/DinghySlide.h index d7d79ba84a41..fd902e3acf9d 100644 --- a/src/openrct2/ride/rtd/water/DinghySlide.h +++ b/src/openrct2/ride/rtd/water/DinghySlide.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor DinghySlideRTD = { .Category = RideCategory::water, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor( { .trackStyle = TrackStyle::dinghySlide, diff --git a/src/openrct2/ride/rtd/water/LogFlume.h b/src/openrct2/ride/rtd/water/LogFlume.h index 5ee6e039aa8e..02b8dd28ba7f 100644 --- a/src/openrct2/ride/rtd/water/LogFlume.h +++ b/src/openrct2/ride/rtd/water/LogFlume.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor LogFlumeRTD = { .Category = RideCategory::water, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::logFlume, .supportType = MetalSupportType::boxed, @@ -38,7 +38,7 @@ constexpr RideTypeDescriptor LogFlumeRTD = .DefaultMode = RideMode::continuousCircuit, .Naming = { STR_RIDE_NAME_LOG_FLUME, STR_RIDE_DESCRIPTION_LOG_FLUME }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::Station }, - .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_CONTROL_FAILURE), + .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 10, 24, 7, 9, }, .MaxMass = 255, .LiftData = { Audio::SoundId::liftFlume, 5, 5 }, diff --git a/src/openrct2/ride/rtd/water/RiverRafts.h b/src/openrct2/ride/rtd/water/RiverRafts.h index 3a60b70723c1..ca0689b00da2 100644 --- a/src/openrct2/ride/rtd/water/RiverRafts.h +++ b/src/openrct2/ride/rtd/water/RiverRafts.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor RiverRaftsRTD = { .Category = RideCategory::water, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::splashBoats, .supportType = WoodenSupportType::truss, diff --git a/src/openrct2/ride/rtd/water/RiverRapids.h b/src/openrct2/ride/rtd/water/RiverRapids.h index 85eca6af24ce..b7424ae71b1b 100644 --- a/src/openrct2/ride/rtd/water/RiverRapids.h +++ b/src/openrct2/ride/rtd/water/RiverRapids.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -20,7 +20,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor RiverRapidsRTD = { .Category = RideCategory::water, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::riverRapids, .supportType = WoodenSupportType::truss, @@ -39,7 +39,7 @@ constexpr RideTypeDescriptor RiverRapidsRTD = .DefaultMode = RideMode::continuousCircuit, .Naming = { STR_RIDE_NAME_RIVER_RAPIDS, STR_RIDE_DESCRIPTION_RIVER_RAPIDS }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::Station }, - .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_CONTROL_FAILURE), + .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 9, 32, 14, 15, }, .MaxMass = 255, .LiftData = { Audio::SoundId::liftFlume, 5, 5 }, diff --git a/src/openrct2/ride/rtd/water/SplashBoats.h b/src/openrct2/ride/rtd/water/SplashBoats.h index f85b348cb1ed..b8c9cff03731 100644 --- a/src/openrct2/ride/rtd/water/SplashBoats.h +++ b/src/openrct2/ride/rtd/water/SplashBoats.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SplashBoatsRTD = { .Category = RideCategory::water, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::splashBoats, .supportType = WoodenSupportType::truss, @@ -39,7 +39,7 @@ constexpr RideTypeDescriptor SplashBoatsRTD = .DefaultMode = RideMode::continuousCircuit, .Naming = { STR_RIDE_NAME_SPLASH_BOATS, STR_RIDE_DESCRIPTION_SPLASH_BOATS }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::Station }, - .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_CONTROL_FAILURE), + .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 16, 24, 7, 11, }, .MaxMass = 255, .LiftData = { Audio::SoundId::liftFlume, 5, 5 }, diff --git a/src/openrct2/ride/rtd/water/SubmarineRide.h b/src/openrct2/ride/rtd/water/SubmarineRide.h index 34de4624981d..3aa57ca886ad 100644 --- a/src/openrct2/ride/rtd/water/SubmarineRide.h +++ b/src/openrct2/ride/rtd/water/SubmarineRide.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -21,7 +21,7 @@ namespace OpenRCT2 constexpr RideTypeDescriptor SubmarineRideRTD = { .Category = RideCategory::water, - .StartTrackPiece = TrackElemType::EndStation, + .StartTrackPiece = TrackElemType::endStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .trackStyle = TrackStyle::submarineRide, .supportType = MetalSupportType::stick, diff --git a/src/openrct2/sawyer_coding/SawyerChunk.cpp b/src/openrct2/sawyer_coding/SawyerChunk.cpp index c0a04dd764ab..b31ba6acfb9d 100644 --- a/src/openrct2/sawyer_coding/SawyerChunk.cpp +++ b/src/openrct2/sawyer_coding/SawyerChunk.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/sawyer_coding/SawyerChunk.h b/src/openrct2/sawyer_coding/SawyerChunk.h index f5a8e124d206..46aa6c6981a1 100644 --- a/src/openrct2/sawyer_coding/SawyerChunk.h +++ b/src/openrct2/sawyer_coding/SawyerChunk.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/sawyer_coding/SawyerChunkReader.cpp b/src/openrct2/sawyer_coding/SawyerChunkReader.cpp index 12c53bfa4a8e..ae7ca2ed59c6 100644 --- a/src/openrct2/sawyer_coding/SawyerChunkReader.cpp +++ b/src/openrct2/sawyer_coding/SawyerChunkReader.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/sawyer_coding/SawyerChunkReader.h b/src/openrct2/sawyer_coding/SawyerChunkReader.h index ed20fe151ac9..c44fb5ac0b2c 100644 --- a/src/openrct2/sawyer_coding/SawyerChunkReader.h +++ b/src/openrct2/sawyer_coding/SawyerChunkReader.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/sawyer_coding/SawyerChunkWriter.cpp b/src/openrct2/sawyer_coding/SawyerChunkWriter.cpp index f777438c9694..b4ffeca2a2cb 100644 --- a/src/openrct2/sawyer_coding/SawyerChunkWriter.cpp +++ b/src/openrct2/sawyer_coding/SawyerChunkWriter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/sawyer_coding/SawyerChunkWriter.h b/src/openrct2/sawyer_coding/SawyerChunkWriter.h index 3b87b3d39fa9..655257105894 100644 --- a/src/openrct2/sawyer_coding/SawyerChunkWriter.h +++ b/src/openrct2/sawyer_coding/SawyerChunkWriter.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/sawyer_coding/SawyerCoding.cpp b/src/openrct2/sawyer_coding/SawyerCoding.cpp index 0da40d045d8a..3431bd20ea45 100644 --- a/src/openrct2/sawyer_coding/SawyerCoding.cpp +++ b/src/openrct2/sawyer_coding/SawyerCoding.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/sawyer_coding/SawyerCoding.h b/src/openrct2/sawyer_coding/SawyerCoding.h index 90b4a02e7100..1f7d53fc120a 100644 --- a/src/openrct2/sawyer_coding/SawyerCoding.h +++ b/src/openrct2/sawyer_coding/SawyerCoding.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index a57b29e89811..c5961c1b502e 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,6 +18,7 @@ #include "../OpenRCT2.h" #include "../ParkImporter.h" #include "../PlatformEnvironment.h" +#include "../actions/ResultWithMessage.h" #include "../audio/Audio.h" #include "../config/Config.h" #include "../core/BitSet.hpp" @@ -26,20 +27,20 @@ #include "../core/Path.hpp" #include "../core/Random.hpp" #include "../core/UnitConversion.h" +#include "../drawing/Drawing.h" #include "../entity/Duck.h" #include "../entity/Guest.h" #include "../entity/Staff.h" #include "../interface/Viewport.h" +#include "../localisation/Formatter.h" #include "../management/Award.h" #include "../management/Finance.h" #include "../management/Marketing.h" #include "../management/NewsItem.h" #include "../management/Research.h" #include "../network/Network.h" -#include "../object/Object.h" #include "../object/ObjectEntryManager.h" #include "../object/ObjectLimits.h" -#include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/ScenarioMetaObject.h" #include "../object/WaterEntry.h" @@ -224,7 +225,7 @@ void ScenarioSuccessSubmitName(GameState_t& gameState, const char* name) static void ScenarioCheckEntranceFeeTooHigh() { const auto& park = getGameState().park; - const auto max_fee = AddClamp(park.totalRideValueForMoney, park.totalRideValueForMoney / 2); + const auto max_fee = AddClamp(park.totalRideValueForMoney, park.totalRideValueForMoney / 2); if ((park.flags & PARK_FLAGS_PARK_OPEN) && Park::GetEntranceFee() > max_fee) { @@ -380,7 +381,7 @@ static void ScenarioUpdateDayNightCycle() // Only update palette if day / night cycle has changed if (gDayNightCycle != currentDayNightCycle) { - UpdatePalette(gGamePalette, 10, 236); + UpdatePalette(gGamePalette, OpenRCT2::Drawing::PaletteIndex::pi10, 236); } } diff --git a/src/openrct2/scenario/Scenario.h b/src/openrct2/scenario/Scenario.h index 5a9effa15e27..1225b4ac552a 100644 --- a/src/openrct2/scenario/Scenario.h +++ b/src/openrct2/scenario/Scenario.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenario/ScenarioCategory.cpp b/src/openrct2/scenario/ScenarioCategory.cpp index 0404202b6dd1..336f555774f7 100644 --- a/src/openrct2/scenario/ScenarioCategory.cpp +++ b/src/openrct2/scenario/ScenarioCategory.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenario/ScenarioCategory.h b/src/openrct2/scenario/ScenarioCategory.h index de02649e5e4d..3ee1c2845701 100644 --- a/src/openrct2/scenario/ScenarioCategory.h +++ b/src/openrct2/scenario/ScenarioCategory.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenario/ScenarioObjective.cpp b/src/openrct2/scenario/ScenarioObjective.cpp index a624ed36ad6d..effe18255089 100644 --- a/src/openrct2/scenario/ScenarioObjective.cpp +++ b/src/openrct2/scenario/ScenarioObjective.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "../GameState.h" #include "../config/Config.h" #include "../core/UnitConversion.h" +#include "../localisation/Formatter.h" #include "../object/ObjectLimits.h" #include "../ride/RideManager.hpp" #include "Scenario.h" diff --git a/src/openrct2/scenario/ScenarioObjective.h b/src/openrct2/scenario/ScenarioObjective.h index 88685a677e96..bb606a3c7290 100644 --- a/src/openrct2/scenario/ScenarioObjective.h +++ b/src/openrct2/scenario/ScenarioObjective.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenario/ScenarioOptions.h b/src/openrct2/scenario/ScenarioOptions.h index df448327d911..669effbae031 100644 --- a/src/openrct2/scenario/ScenarioOptions.h +++ b/src/openrct2/scenario/ScenarioOptions.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenario/ScenarioRepository.cpp b/src/openrct2/scenario/ScenarioRepository.cpp index 52719352f2f4..5d6ca298c187 100644 --- a/src/openrct2/scenario/ScenarioRepository.cpp +++ b/src/openrct2/scenario/ScenarioRepository.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenario/ScenarioRepository.h b/src/openrct2/scenario/ScenarioRepository.h index 6b9d9ff6c942..b051675dbaf9 100644 --- a/src/openrct2/scenario/ScenarioRepository.h +++ b/src/openrct2/scenario/ScenarioRepository.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenario/ScenarioSources.cpp b/src/openrct2/scenario/ScenarioSources.cpp index 9a43c8c60049..16ff1dcf0204 100644 --- a/src/openrct2/scenario/ScenarioSources.cpp +++ b/src/openrct2/scenario/ScenarioSources.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenario/ScenarioSources.h b/src/openrct2/scenario/ScenarioSources.h index 6e64a2f8c84a..bd029272efe3 100644 --- a/src/openrct2/scenario/ScenarioSources.h +++ b/src/openrct2/scenario/ScenarioSources.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/Scene.cpp b/src/openrct2/scenes/Scene.cpp index 62f64623576f..e890bd6a7128 100644 --- a/src/openrct2/scenes/Scene.cpp +++ b/src/openrct2/scenes/Scene.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/Scene.h b/src/openrct2/scenes/Scene.h index 86984b47d90e..cae75e109dc9 100644 --- a/src/openrct2/scenes/Scene.h +++ b/src/openrct2/scenes/Scene.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/intro/IntroScene.cpp b/src/openrct2/scenes/intro/IntroScene.cpp index 852ccd81513f..46755c1f22e9 100644 --- a/src/openrct2/scenes/intro/IntroScene.cpp +++ b/src/openrct2/scenes/intro/IntroScene.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/intro/IntroScene.h b/src/openrct2/scenes/intro/IntroScene.h index 73fcffe0aaca..579a0cfa9f1d 100644 --- a/src/openrct2/scenes/intro/IntroScene.h +++ b/src/openrct2/scenes/intro/IntroScene.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,7 +13,10 @@ #include -struct RenderTarget; +namespace OpenRCT2::Drawing +{ + struct RenderTarget; +} namespace OpenRCT2 { @@ -43,5 +46,5 @@ namespace OpenRCT2 bool IntroIsPlaying(); void IntroUpdate(); - void IntroDraw(RenderTarget& rt); + void IntroDraw(Drawing::RenderTarget& rt); } // namespace OpenRCT2 diff --git a/src/openrct2/scenes/preloader/PreloaderScene.cpp b/src/openrct2/scenes/preloader/PreloaderScene.cpp index 0a33469f2f10..9ad1315bddd8 100644 --- a/src/openrct2/scenes/preloader/PreloaderScene.cpp +++ b/src/openrct2/scenes/preloader/PreloaderScene.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -37,7 +37,7 @@ void PreloaderScene::Load() gLegacyScene = LegacyScene::playing; gameStateInitAll(getGameState(), kDefaultMapSize); - ViewportInitAll(); + ContextResetSubsystems(); ContextOpenWindow(WindowClass::mainWindow); WindowSetFlagForAllViewports(VIEWPORT_FLAG_RENDERING_INHIBITED, true); WindowResizeGui(ContextGetWidth(), ContextGetHeight()); diff --git a/src/openrct2/scenes/preloader/PreloaderScene.h b/src/openrct2/scenes/preloader/PreloaderScene.h index 0da7774f6550..8a1d9b566db6 100644 --- a/src/openrct2/scenes/preloader/PreloaderScene.h +++ b/src/openrct2/scenes/preloader/PreloaderScene.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,7 +10,6 @@ #pragma once #include "../../core/JobPool.h" -#include "../../drawing/Drawing.h" #include "../Scene.h" namespace OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/End.cpp b/src/openrct2/scenes/title/Command/End.cpp index fe0a04bcb968..bc4a33a8f234 100644 --- a/src/openrct2/scenes/title/Command/End.cpp +++ b/src/openrct2/scenes/title/Command/End.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/End.h b/src/openrct2/scenes/title/Command/End.h index 9c8361faa8c6..f6d42888dd6b 100644 --- a/src/openrct2/scenes/title/Command/End.h +++ b/src/openrct2/scenes/title/Command/End.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/FollowEntity.cpp b/src/openrct2/scenes/title/Command/FollowEntity.cpp index 88e6132d1b68..c984cbde77b0 100644 --- a/src/openrct2/scenes/title/Command/FollowEntity.cpp +++ b/src/openrct2/scenes/title/Command/FollowEntity.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/FollowEntity.h b/src/openrct2/scenes/title/Command/FollowEntity.h index 221bf082f7df..8f2167669227 100644 --- a/src/openrct2/scenes/title/Command/FollowEntity.h +++ b/src/openrct2/scenes/title/Command/FollowEntity.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/LoadPark.cpp b/src/openrct2/scenes/title/Command/LoadPark.cpp index e9ae65f2da30..7077c91e9013 100644 --- a/src/openrct2/scenes/title/Command/LoadPark.cpp +++ b/src/openrct2/scenes/title/Command/LoadPark.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/LoadPark.h b/src/openrct2/scenes/title/Command/LoadPark.h index 94b5a5810358..421197613953 100644 --- a/src/openrct2/scenes/title/Command/LoadPark.h +++ b/src/openrct2/scenes/title/Command/LoadPark.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/LoadScenario.cpp b/src/openrct2/scenes/title/Command/LoadScenario.cpp index c58f0d4cbab9..1893c198c7a2 100644 --- a/src/openrct2/scenes/title/Command/LoadScenario.cpp +++ b/src/openrct2/scenes/title/Command/LoadScenario.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/LoadScenario.h b/src/openrct2/scenes/title/Command/LoadScenario.h index 3a9cb17bac25..8140ae056d11 100644 --- a/src/openrct2/scenes/title/Command/LoadScenario.h +++ b/src/openrct2/scenes/title/Command/LoadScenario.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/Restart.cpp b/src/openrct2/scenes/title/Command/Restart.cpp index bb728894b166..951c589c8598 100644 --- a/src/openrct2/scenes/title/Command/Restart.cpp +++ b/src/openrct2/scenes/title/Command/Restart.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/Restart.h b/src/openrct2/scenes/title/Command/Restart.h index e13731e8c0c1..3f5f9d29c2c6 100644 --- a/src/openrct2/scenes/title/Command/Restart.h +++ b/src/openrct2/scenes/title/Command/Restart.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/RotateView.cpp b/src/openrct2/scenes/title/Command/RotateView.cpp index d4699cad5798..5411bd673a5f 100644 --- a/src/openrct2/scenes/title/Command/RotateView.cpp +++ b/src/openrct2/scenes/title/Command/RotateView.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/RotateView.h b/src/openrct2/scenes/title/Command/RotateView.h index bbf9fda0afd4..fd71d044c820 100644 --- a/src/openrct2/scenes/title/Command/RotateView.h +++ b/src/openrct2/scenes/title/Command/RotateView.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/SetLocation.cpp b/src/openrct2/scenes/title/Command/SetLocation.cpp index ebf4bea7d3eb..3f9e1481540c 100644 --- a/src/openrct2/scenes/title/Command/SetLocation.cpp +++ b/src/openrct2/scenes/title/Command/SetLocation.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/SetLocation.h b/src/openrct2/scenes/title/Command/SetLocation.h index 5937f98f38b0..4bd6122566da 100644 --- a/src/openrct2/scenes/title/Command/SetLocation.h +++ b/src/openrct2/scenes/title/Command/SetLocation.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/SetSpeed.cpp b/src/openrct2/scenes/title/Command/SetSpeed.cpp index 350d4eb4bbbf..00657bfddc9e 100644 --- a/src/openrct2/scenes/title/Command/SetSpeed.cpp +++ b/src/openrct2/scenes/title/Command/SetSpeed.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/SetSpeed.h b/src/openrct2/scenes/title/Command/SetSpeed.h index 01dfb1e4c9d0..66bc6c73aa12 100644 --- a/src/openrct2/scenes/title/Command/SetSpeed.h +++ b/src/openrct2/scenes/title/Command/SetSpeed.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/SetZoom.cpp b/src/openrct2/scenes/title/Command/SetZoom.cpp index 6436d7c5dc59..a568eee29036 100644 --- a/src/openrct2/scenes/title/Command/SetZoom.cpp +++ b/src/openrct2/scenes/title/Command/SetZoom.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/SetZoom.h b/src/openrct2/scenes/title/Command/SetZoom.h index 369aa8214fe1..aed5a32eb01d 100644 --- a/src/openrct2/scenes/title/Command/SetZoom.h +++ b/src/openrct2/scenes/title/Command/SetZoom.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/Wait.cpp b/src/openrct2/scenes/title/Command/Wait.cpp index b754bb1072af..dcbeaa92159e 100644 --- a/src/openrct2/scenes/title/Command/Wait.cpp +++ b/src/openrct2/scenes/title/Command/Wait.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/Command/Wait.h b/src/openrct2/scenes/title/Command/Wait.h index 50b8677f4b73..2671532fca1a 100644 --- a/src/openrct2/scenes/title/Command/Wait.h +++ b/src/openrct2/scenes/title/Command/Wait.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/TitleScene.cpp b/src/openrct2/scenes/title/TitleScene.cpp index 9ab24763d231..cadfc12206db 100644 --- a/src/openrct2/scenes/title/TitleScene.cpp +++ b/src/openrct2/scenes/title/TitleScene.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,9 +18,9 @@ #include "../../audio/Audio.h" #include "../../config/Config.h" #include "../../core/Console.hpp" +#include "../../drawing/Drawing.h" #include "../../drawing/Text.h" #include "../../interface/Screenshot.h" -#include "../../interface/Viewport.h" #include "../../network/Network.h" #include "../../network/NetworkBase.h" #include "../../scenario/ScenarioRepository.h" @@ -107,7 +107,7 @@ void TitleScene::Load() GetContext().GetNetwork().Close(); #endif gameStateInitAll(getGameState(), kDefaultMapSize); - ViewportInitAll(); + ContextResetSubsystems(); ContextOpenWindow(WindowClass::mainWindow); TitleInitialise(); @@ -141,7 +141,7 @@ void TitleScene::Tick() ScreenshotCheck(); TitleHandleKeyboardInput(); - if (GameIsNotPaused()) + if (!gOpenRCT2Headless && GameIsNotPaused()) { TryLoadSequence(); _sequencePlayer->Update(); @@ -205,6 +205,10 @@ void TitleScene::CreateWindows() void TitleScene::TitleInitialise() { + if (gOpenRCT2Headless) + { + return; + } if (_sequencePlayer == nullptr) { _sequencePlayer = GetContext().GetUiContext().GetTitleSequencePlayer(); @@ -285,7 +289,7 @@ void TitleScene::TitleInitialise() bool TitleScene::TryLoadSequence(bool loadPreview) { - if (_loadedTitleSequenceId != _currentSequence || loadPreview) + if (!gOpenRCT2Headless && (_loadedTitleSequenceId != _currentSequence || loadPreview)) { if (_sequencePlayer == nullptr) { diff --git a/src/openrct2/scenes/title/TitleScene.h b/src/openrct2/scenes/title/TitleScene.h index 24114d21d83b..10fed6a85a3d 100644 --- a/src/openrct2/scenes/title/TitleScene.h +++ b/src/openrct2/scenes/title/TitleScene.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,9 +9,10 @@ #pragma once -#include "../../drawing/Drawing.h" #include "../Scene.h" +#include + struct ITitleSequencePlayer; namespace OpenRCT2 diff --git a/src/openrct2/scenes/title/TitleSequence.cpp b/src/openrct2/scenes/title/TitleSequence.cpp index f32a72aab96d..8a6277d97473 100644 --- a/src/openrct2/scenes/title/TitleSequence.cpp +++ b/src/openrct2/scenes/title/TitleSequence.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/TitleSequence.h b/src/openrct2/scenes/title/TitleSequence.h index b712907414c0..c07a2d10307d 100644 --- a/src/openrct2/scenes/title/TitleSequence.h +++ b/src/openrct2/scenes/title/TitleSequence.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/TitleSequenceManager.cpp b/src/openrct2/scenes/title/TitleSequenceManager.cpp index 5f29808365e3..a7e68de10575 100644 --- a/src/openrct2/scenes/title/TitleSequenceManager.cpp +++ b/src/openrct2/scenes/title/TitleSequenceManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/TitleSequenceManager.h b/src/openrct2/scenes/title/TitleSequenceManager.h index 58c1bfdb2ef3..ae81b86aef7b 100644 --- a/src/openrct2/scenes/title/TitleSequenceManager.h +++ b/src/openrct2/scenes/title/TitleSequenceManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scenes/title/TitleSequencePlayer.h b/src/openrct2/scenes/title/TitleSequencePlayer.h index 1d2a4f64bef3..a0d9d1d5aad9 100644 --- a/src/openrct2/scenes/title/TitleSequencePlayer.h +++ b/src/openrct2/scenes/title/TitleSequencePlayer.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/Duktape.hpp b/src/openrct2/scripting/Duktape.hpp index ed3a8903d465..dccff7780063 100644 --- a/src/openrct2/scripting/Duktape.hpp +++ b/src/openrct2/scripting/Duktape.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -442,8 +442,8 @@ namespace OpenRCT2::Scripting inline DukValue ToDuk(duk_context* ctx, const GForces& value) { DukObject dukGForces(ctx); - dukGForces.Set("lateralG", value.LateralG); - dukGForces.Set("verticalG", value.VerticalG); + dukGForces.Set("lateralG", value.lateralG); + dukGForces.Set("verticalG", value.verticalG); return dukGForces.Take(); } diff --git a/src/openrct2/scripting/HookEngine.cpp b/src/openrct2/scripting/HookEngine.cpp index 0a3ad83c1307..16599f9fa233 100644 --- a/src/openrct2/scripting/HookEngine.cpp +++ b/src/openrct2/scripting/HookEngine.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/HookEngine.h b/src/openrct2/scripting/HookEngine.h index 8d4e4b1525a9..072abb139436 100644 --- a/src/openrct2/scripting/HookEngine.h +++ b/src/openrct2/scripting/HookEngine.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/IconNames.hpp b/src/openrct2/scripting/IconNames.hpp index b8718d2b6f33..89c9484a2724 100644 --- a/src/openrct2/scripting/IconNames.hpp +++ b/src/openrct2/scripting/IconNames.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/Plugin.cpp b/src/openrct2/scripting/Plugin.cpp index 4c487364a322..21a8a1a803c1 100644 --- a/src/openrct2/scripting/Plugin.cpp +++ b/src/openrct2/scripting/Plugin.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/Plugin.h b/src/openrct2/scripting/Plugin.h index db89340f8013..326f0442b1ad 100644 --- a/src/openrct2/scripting/Plugin.h +++ b/src/openrct2/scripting/Plugin.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index 8a85ee57e336..41611d519c49 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -546,18 +546,18 @@ void ScriptEngine::RegisterConstants() { ConstantBuilder builder(_context); builder.Namespace("TrackSlope") - .Constant("None", EnumValue(TrackPitch::None)) - .Constant("Up25", EnumValue(TrackPitch::Up25)) - .Constant("Up60", EnumValue(TrackPitch::Up60)) - .Constant("Down25", EnumValue(TrackPitch::Down25)) - .Constant("Down60", EnumValue(TrackPitch::Down60)) - .Constant("Up90", EnumValue(TrackPitch::Up90)) - .Constant("Down90", EnumValue(TrackPitch::Down90)); + .Constant("None", EnumValue(TrackPitch::none)) + .Constant("Up25", EnumValue(TrackPitch::up25)) + .Constant("Up60", EnumValue(TrackPitch::up60)) + .Constant("Down25", EnumValue(TrackPitch::down25)) + .Constant("Down60", EnumValue(TrackPitch::down60)) + .Constant("Up90", EnumValue(TrackPitch::up90)) + .Constant("Down90", EnumValue(TrackPitch::down90)); builder.Namespace("TrackBanking") - .Constant("None", EnumValue(TrackRoll::None)) - .Constant("BankLeft", EnumValue(TrackRoll::Left)) - .Constant("BankRight", EnumValue(TrackRoll::Right)) - .Constant("UpsideDown", EnumValue(TrackRoll::UpsideDown)); + .Constant("None", EnumValue(TrackRoll::none)) + .Constant("BankLeft", EnumValue(TrackRoll::left)) + .Constant("BankRight", EnumValue(TrackRoll::right)) + .Constant("UpsideDown", EnumValue(TrackRoll::upsideDown)); } void ScriptEngine::RefreshPlugins() @@ -1100,10 +1100,10 @@ GameActions::Result ScriptEngine::QueryOrExecuteCustomGameAction(const GameActio auto dukArgs = DuktapeTryParseJson(_context, argsz); if (!dukArgs) { - auto action = GameActions::Result(); - action.Error = GameActions::Status::InvalidParameters; - action.ErrorTitle = "Invalid JSON"; - return action; + auto res = GameActions::Result(); + res.error = GameActions::Status::invalidParameters; + res.errorTitle = "Invalid JSON"; + return res; } std::vector pluginCallArgs; @@ -1137,11 +1137,11 @@ GameActions::Result ScriptEngine::QueryOrExecuteCustomGameAction(const GameActio return DukToGameActionResult(dukResult); } - auto action = GameActions::Result(); - action.Error = GameActions::Status::Unknown; - action.ErrorTitle = "Unknown custom action"; - action.ErrorMessage = customAction.GetPluginName() + ": " + actionz; - return action; + auto res = GameActions::Result(); + res.error = GameActions::Status::unknown; + res.errorTitle = "Unknown custom action"; + res.errorMessage = customAction.GetPluginName() + ": " + actionz; + return res; } GameActions::Result ScriptEngine::DukToGameActionResult(const DukValue& d) @@ -1149,25 +1149,25 @@ GameActions::Result ScriptEngine::DukToGameActionResult(const DukValue& d) auto result = GameActions::Result(); if (d.type() == DUK_TYPE_OBJECT) { - result.Error = static_cast(AsOrDefault(d["error"])); - result.ErrorTitle = AsOrDefault(d["errorTitle"]); - result.ErrorMessage = AsOrDefault(d["errorMessage"]); - result.Cost = AsOrDefault(d["cost"]); + result.error = static_cast(AsOrDefault(d["error"])); + result.errorTitle = AsOrDefault(d["errorTitle"]); + result.errorMessage = AsOrDefault(d["errorMessage"]); + result.cost = AsOrDefault(d["cost"]); auto expenditureType = AsOrDefault(d["expenditureType"]); if (!expenditureType.empty()) { auto expenditure = StringToExpenditureType(expenditureType); if (expenditure != ExpenditureType::count) { - result.Expenditure = expenditure; + result.expenditure = expenditure; } } } else { - result.Error = GameActions::Status::Unknown; - result.ErrorTitle = "Unknown"; - result.ErrorMessage = "Unknown"; + result.error = GameActions::Status::unknown; + result.errorTitle = "Unknown"; + result.errorMessage = "Unknown"; } return result; } @@ -1214,41 +1214,41 @@ DukValue ScriptEngine::GameActionResultToDuk(const GameActions::GameAction& acti DukStackFrame frame(_context); DukObject obj(_context); - obj.Set("error", static_cast(result.Error)); - if (result.Error != GameActions::Status::Ok) + obj.Set("error", static_cast(result.error)); + if (result.error != GameActions::Status::ok) { - obj.Set("errorTitle", result.GetErrorTitle()); - obj.Set("errorMessage", result.GetErrorMessage()); + obj.Set("errorTitle", result.getErrorTitle()); + obj.Set("errorMessage", result.getErrorMessage()); } - if (result.Cost != kMoney64Undefined) + if (result.cost != kMoney64Undefined) { - obj.Set("cost", result.Cost); + obj.Set("cost", result.cost); } - if (!result.Position.IsNull()) + if (!result.position.IsNull()) { - obj.Set("position", ToDuk(_context, result.Position)); + obj.Set("position", ToDuk(_context, result.position)); } - if (result.Expenditure != ExpenditureType::count) + if (result.expenditure != ExpenditureType::count) { - obj.Set("expenditureType", ExpenditureTypeToString(result.Expenditure)); + obj.Set("expenditureType", ExpenditureTypeToString(result.expenditure)); } // RideCreateAction only if (action.GetType() == GameCommand::CreateRide) { - if (result.Error == GameActions::Status::Ok) + if (result.error == GameActions::Status::ok) { - const auto rideIndex = result.GetData(); + const auto rideIndex = result.getData(); obj.Set("ride", rideIndex.ToUnderlying()); } } // StaffHireNewAction only else if (action.GetType() == GameCommand::HireNewStaffMember) { - if (result.Error == GameActions::Status::Ok) + if (result.error == GameActions::Status::ok) { - const auto actionResult = result.GetData(); + const auto actionResult = result.getData(); if (!actionResult.StaffEntityId.IsNull()) { obj.Set("peep", actionResult.StaffEntityId.ToUnderlying()); @@ -1260,13 +1260,13 @@ DukValue ScriptEngine::GameActionResultToDuk(const GameActions::GameAction& acti switch (action.GetType()) { case GameCommand::PlaceBanner: - bannerId = result.GetData().bannerId; + bannerId = result.getData().bannerId; break; case GameCommand::PlaceLargeScenery: - bannerId = result.GetData().bannerId; + bannerId = result.getData().bannerId; break; case GameCommand::PlaceWall: - bannerId = result.GetData().BannerId; + bannerId = result.getData().BannerId; break; default: break; @@ -1535,9 +1535,9 @@ void ScriptEngine::RunGameActionHooks(const GameActions::GameAction& action, Gam auto error = AsOrDefault(dukResult["error"]); if (error != 0) { - result.Error = static_cast(error); - result.ErrorTitle = AsOrDefault(dukResult["errorTitle"]); - result.ErrorMessage = AsOrDefault(dukResult["errorMessage"]); + result.error = static_cast(error); + result.errorTitle = AsOrDefault(dukResult["errorTitle"]); + result.errorMessage = AsOrDefault(dukResult["errorMessage"]); } } } diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index 1ab7c0836a75..076d5ee49300 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScBalloon.cpp b/src/openrct2/scripting/bindings/entity/ScBalloon.cpp index bfb17a94c67a..e1e9de8e78d3 100644 --- a/src/openrct2/scripting/bindings/entity/ScBalloon.cpp +++ b/src/openrct2/scripting/bindings/entity/ScBalloon.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScBalloon.hpp b/src/openrct2/scripting/bindings/entity/ScBalloon.hpp index d6e962b92ef7..346237e8f375 100644 --- a/src/openrct2/scripting/bindings/entity/ScBalloon.hpp +++ b/src/openrct2/scripting/bindings/entity/ScBalloon.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScEntity.hpp b/src/openrct2/scripting/bindings/entity/ScEntity.hpp index 3efdeacca2c2..8440240705d0 100644 --- a/src/openrct2/scripting/bindings/entity/ScEntity.hpp +++ b/src/openrct2/scripting/bindings/entity/ScEntity.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,7 +13,6 @@ #include "../../../Context.h" #include "../../../GameState.h" - #include "../../../entity/EntityList.h" #include "../../../entity/EntityRegistry.h" #include "../../../entity/Peep.h" #include "../../Duktape.hpp" diff --git a/src/openrct2/scripting/bindings/entity/ScGuest.cpp b/src/openrct2/scripting/bindings/entity/ScGuest.cpp index 8c921f98c338..9eb551832dbc 100644 --- a/src/openrct2/scripting/bindings/entity/ScGuest.cpp +++ b/src/openrct2/scripting/bindings/entity/ScGuest.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include "../../../GameState.h" #include "../../../entity/Guest.h" + #include "../../../localisation/Formatter.h" #include "../../../localisation/Formatting.h" #include "../../../object/ObjectManager.h" #include "../../../object/PeepAnimationsObject.h" diff --git a/src/openrct2/scripting/bindings/entity/ScGuest.hpp b/src/openrct2/scripting/bindings/entity/ScGuest.hpp index 1bcb1ff1306f..03a7ff052535 100644 --- a/src/openrct2/scripting/bindings/entity/ScGuest.hpp +++ b/src/openrct2/scripting/bindings/entity/ScGuest.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScLitter.cpp b/src/openrct2/scripting/bindings/entity/ScLitter.cpp index ad012b8cf928..37e9a93340dc 100644 --- a/src/openrct2/scripting/bindings/entity/ScLitter.cpp +++ b/src/openrct2/scripting/bindings/entity/ScLitter.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScLitter.hpp b/src/openrct2/scripting/bindings/entity/ScLitter.hpp index 2e5a4d5dd05b..70c3dd39efd3 100644 --- a/src/openrct2/scripting/bindings/entity/ScLitter.hpp +++ b/src/openrct2/scripting/bindings/entity/ScLitter.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScMoneyEffect.cpp b/src/openrct2/scripting/bindings/entity/ScMoneyEffect.cpp index 0def2f9b9c0e..7b8c02d7a6d9 100644 --- a/src/openrct2/scripting/bindings/entity/ScMoneyEffect.cpp +++ b/src/openrct2/scripting/bindings/entity/ScMoneyEffect.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScMoneyEffect.hpp b/src/openrct2/scripting/bindings/entity/ScMoneyEffect.hpp index 295d8327eab8..8935b7322792 100644 --- a/src/openrct2/scripting/bindings/entity/ScMoneyEffect.hpp +++ b/src/openrct2/scripting/bindings/entity/ScMoneyEffect.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScParticle.cpp b/src/openrct2/scripting/bindings/entity/ScParticle.cpp index c876122cff5b..fe7374664cd4 100644 --- a/src/openrct2/scripting/bindings/entity/ScParticle.cpp +++ b/src/openrct2/scripting/bindings/entity/ScParticle.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScParticle.hpp b/src/openrct2/scripting/bindings/entity/ScParticle.hpp index 3fd08873cb5e..b1991c1da7c4 100644 --- a/src/openrct2/scripting/bindings/entity/ScParticle.hpp +++ b/src/openrct2/scripting/bindings/entity/ScParticle.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScPeep.hpp b/src/openrct2/scripting/bindings/entity/ScPeep.hpp index 2d098c978beb..e3262ef630df 100644 --- a/src/openrct2/scripting/bindings/entity/ScPeep.hpp +++ b/src/openrct2/scripting/bindings/entity/ScPeep.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScStaff.cpp b/src/openrct2/scripting/bindings/entity/ScStaff.cpp index 11eed011ff2a..dc8f811f8612 100644 --- a/src/openrct2/scripting/bindings/entity/ScStaff.cpp +++ b/src/openrct2/scripting/bindings/entity/ScStaff.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -16,6 +16,7 @@ #include "../../../object/ObjectManager.h" #include "../../../object/PeepAnimationsObject.h" #include "../../../peep/PeepAnimations.h" + #include "../../../rct12/RCT12.h" #include "../../../world/Map.h" namespace OpenRCT2::Scripting diff --git a/src/openrct2/scripting/bindings/entity/ScStaff.hpp b/src/openrct2/scripting/bindings/entity/ScStaff.hpp index e34e8bfe6360..5c86c1b570ab 100644 --- a/src/openrct2/scripting/bindings/entity/ScStaff.hpp +++ b/src/openrct2/scripting/bindings/entity/ScStaff.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/entity/ScVehicle.cpp b/src/openrct2/scripting/bindings/entity/ScVehicle.cpp index 0bae5e793d5b..1af3af1b2302 100644 --- a/src/openrct2/scripting/bindings/entity/ScVehicle.cpp +++ b/src/openrct2/scripting/bindings/entity/ScVehicle.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -23,37 +23,37 @@ namespace OpenRCT2::Scripting { static const DukEnumMap VehicleStatusMap( { - { "moving_to_end_of_station", Vehicle::Status::MovingToEndOfStation }, - { "waiting_for_passengers", Vehicle::Status::WaitingForPassengers }, - { "waiting_to_depart", Vehicle::Status::WaitingToDepart }, - { "departing", Vehicle::Status::Departing }, - { "travelling", Vehicle::Status::Travelling }, - { "arriving", Vehicle::Status::Arriving }, - { "unloading_passengers", Vehicle::Status::UnloadingPassengers }, - { "travelling_boat", Vehicle::Status::TravellingBoat }, - { "crashing", Vehicle::Status::Crashing }, - { "crashed", Vehicle::Status::Crashed }, - { "travelling_dodgems", Vehicle::Status::TravellingDodgems }, - { "swinging", Vehicle::Status::Swinging }, - { "rotating", Vehicle::Status::Rotating }, - { "ferris_wheel_rotating", Vehicle::Status::FerrisWheelRotating }, - { "simulator_operating", Vehicle::Status::SimulatorOperating }, - { "showing_film", Vehicle::Status::ShowingFilm }, - { "space_rings_operating", Vehicle::Status::SpaceRingsOperating }, - { "top_spin_operating", Vehicle::Status::TopSpinOperating }, - { "haunted_house_operating", Vehicle::Status::HauntedHouseOperating }, - { "doing_circus_show", Vehicle::Status::DoingCircusShow }, - { "crooked_house_operating", Vehicle::Status::CrookedHouseOperating }, - { "waiting_for_cable_lift", Vehicle::Status::WaitingForCableLift }, - { "travelling_cable_lift", Vehicle::Status::TravellingCableLift }, - { "stopping", Vehicle::Status::Stopping }, - { "waiting_for_passengers_17", Vehicle::Status::WaitingForPassengers17 }, - { "waiting_to_start", Vehicle::Status::WaitingToStart }, - { "starting", Vehicle::Status::Starting }, - { "operating_1a", Vehicle::Status::Operating1A }, - { "stopping_1b", Vehicle::Status::Stopping1B }, - { "unloading_passengers_1c", Vehicle::Status::UnloadingPassengers1C }, - { "stopped_by_block_brake", Vehicle::Status::StoppedByBlockBrakes }, + { "moving_to_end_of_station", Vehicle::Status::movingToEndOfStation }, + { "waiting_for_passengers", Vehicle::Status::waitingForPassengers }, + { "waiting_to_depart", Vehicle::Status::waitingToDepart }, + { "departing", Vehicle::Status::departing }, + { "travelling", Vehicle::Status::travelling }, + { "arriving", Vehicle::Status::arriving }, + { "unloading_passengers", Vehicle::Status::unloadingPassengers }, + { "travelling_boat", Vehicle::Status::travellingBoat }, + { "crashing", Vehicle::Status::crashing }, + { "crashed", Vehicle::Status::crashed }, + { "travelling_dodgems", Vehicle::Status::travellingDodgems }, + { "swinging", Vehicle::Status::swinging }, + { "rotating", Vehicle::Status::rotating }, + { "ferris_wheel_rotating", Vehicle::Status::ferrisWheelRotating }, + { "simulator_operating", Vehicle::Status::simulatorOperating }, + { "showing_film", Vehicle::Status::showingFilm }, + { "space_rings_operating", Vehicle::Status::spaceRingsOperating }, + { "top_spin_operating", Vehicle::Status::topSpinOperating }, + { "haunted_house_operating", Vehicle::Status::hauntedHouseOperating }, + { "doing_circus_show", Vehicle::Status::doingCircusShow }, + { "crooked_house_operating", Vehicle::Status::crookedHouseOperating }, + { "waiting_for_cable_lift", Vehicle::Status::waitingForCableLift }, + { "travelling_cable_lift", Vehicle::Status::travellingCableLift }, + { "stopping", Vehicle::Status::stopping }, + { "waiting_for_passengers_17", Vehicle::Status::waitingForPassengers17 }, + { "waiting_to_start", Vehicle::Status::waitingToStart }, + { "starting", Vehicle::Status::starting }, + { "operating_1a", Vehicle::Status::operating1A }, + { "stopping_1b", Vehicle::Status::stopping1B }, + { "unloading_passengers_1c", Vehicle::Status::unloadingPassengers1C }, + { "stopped_by_block_brake", Vehicle::Status::stoppedByBlockBrakes }, }); ScVehicle::ScVehicle(EntityId id) diff --git a/src/openrct2/scripting/bindings/entity/ScVehicle.hpp b/src/openrct2/scripting/bindings/entity/ScVehicle.hpp index 97fce3d007a3..f2fca357d7c8 100644 --- a/src/openrct2/scripting/bindings/entity/ScVehicle.hpp +++ b/src/openrct2/scripting/bindings/entity/ScVehicle.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/game/ScCheats.hpp b/src/openrct2/scripting/bindings/game/ScCheats.hpp index f03902f0e463..fce32288c14c 100644 --- a/src/openrct2/scripting/bindings/game/ScCheats.hpp +++ b/src/openrct2/scripting/bindings/game/ScCheats.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/game/ScConfiguration.hpp b/src/openrct2/scripting/bindings/game/ScConfiguration.hpp index 40b163333b36..544ddc9e5e7d 100644 --- a/src/openrct2/scripting/bindings/game/ScConfiguration.hpp +++ b/src/openrct2/scripting/bindings/game/ScConfiguration.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/game/ScConsole.hpp b/src/openrct2/scripting/bindings/game/ScConsole.hpp index 90bc0847a2d7..18df59ca957b 100644 --- a/src/openrct2/scripting/bindings/game/ScConsole.hpp +++ b/src/openrct2/scripting/bindings/game/ScConsole.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/game/ScContext.hpp b/src/openrct2/scripting/bindings/game/ScContext.hpp index 59625fe7e6c2..1e4f9a2e1f17 100644 --- a/src/openrct2/scripting/bindings/game/ScContext.hpp +++ b/src/openrct2/scripting/bindings/game/ScContext.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -189,7 +189,7 @@ namespace OpenRCT2::Scripting DukValue getTrackSegment(uint16_t type) { auto ctx = GetContext()->GetScriptEngine().GetContext(); - if (type >= EnumValue(TrackElemType::Count)) + if (type >= EnumValue(TrackElemType::count)) { return ToDuk(ctx, nullptr); } @@ -204,7 +204,7 @@ namespace OpenRCT2::Scripting auto ctx = GetContext()->GetScriptEngine().GetContext(); std::vector result; - for (uint16_t type = 0; type < EnumValue(TrackElemType::Count); type++) + for (uint16_t type = 0; type < EnumValue(TrackElemType::count); type++) { auto obj = std::make_shared(static_cast(type)); if (obj != nullptr) diff --git a/src/openrct2/scripting/bindings/game/ScDisposable.hpp b/src/openrct2/scripting/bindings/game/ScDisposable.hpp index 1a9ba288a3b7..35cc0ffa68a7 100644 --- a/src/openrct2/scripting/bindings/game/ScDisposable.hpp +++ b/src/openrct2/scripting/bindings/game/ScDisposable.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/game/ScPlugin.hpp b/src/openrct2/scripting/bindings/game/ScPlugin.hpp index bddb5b6ab7e4..294031fd6f0d 100644 --- a/src/openrct2/scripting/bindings/game/ScPlugin.hpp +++ b/src/openrct2/scripting/bindings/game/ScPlugin.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/game/ScProfiler.hpp b/src/openrct2/scripting/bindings/game/ScProfiler.hpp index 014871833b65..555d047bec76 100644 --- a/src/openrct2/scripting/bindings/game/ScProfiler.hpp +++ b/src/openrct2/scripting/bindings/game/ScProfiler.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/network/ScNetwork.cpp b/src/openrct2/scripting/bindings/network/ScNetwork.cpp index 604c7d50e79e..4d75d2182c14 100644 --- a/src/openrct2/scripting/bindings/network/ScNetwork.cpp +++ b/src/openrct2/scripting/bindings/network/ScNetwork.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/network/ScNetwork.hpp b/src/openrct2/scripting/bindings/network/ScNetwork.hpp index 18451b0168c3..b16c45a82e5d 100644 --- a/src/openrct2/scripting/bindings/network/ScNetwork.hpp +++ b/src/openrct2/scripting/bindings/network/ScNetwork.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/network/ScPlayer.cpp b/src/openrct2/scripting/bindings/network/ScPlayer.cpp index 966f368e90dc..076527474254 100644 --- a/src/openrct2/scripting/bindings/network/ScPlayer.cpp +++ b/src/openrct2/scripting/bindings/network/ScPlayer.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/network/ScPlayer.hpp b/src/openrct2/scripting/bindings/network/ScPlayer.hpp index a1d3abcc63b2..d9ab47e5b025 100644 --- a/src/openrct2/scripting/bindings/network/ScPlayer.hpp +++ b/src/openrct2/scripting/bindings/network/ScPlayer.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/network/ScPlayerGroup.cpp b/src/openrct2/scripting/bindings/network/ScPlayerGroup.cpp index a9d259c9dea6..b08cb20ef8f4 100644 --- a/src/openrct2/scripting/bindings/network/ScPlayerGroup.cpp +++ b/src/openrct2/scripting/bindings/network/ScPlayerGroup.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/network/ScPlayerGroup.hpp b/src/openrct2/scripting/bindings/network/ScPlayerGroup.hpp index 23410dc96c4d..ea1ac8958028 100644 --- a/src/openrct2/scripting/bindings/network/ScPlayerGroup.hpp +++ b/src/openrct2/scripting/bindings/network/ScPlayerGroup.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/network/ScSocket.hpp b/src/openrct2/scripting/bindings/network/ScSocket.hpp index e28f5e41cb0f..a1066966c12c 100644 --- a/src/openrct2/scripting/bindings/network/ScSocket.hpp +++ b/src/openrct2/scripting/bindings/network/ScSocket.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/object/ScInstalledObject.cpp b/src/openrct2/scripting/bindings/object/ScInstalledObject.cpp index 1c8ca8d97b8e..68fe9030a92a 100644 --- a/src/openrct2/scripting/bindings/object/ScInstalledObject.cpp +++ b/src/openrct2/scripting/bindings/object/ScInstalledObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/object/ScInstalledObject.hpp b/src/openrct2/scripting/bindings/object/ScInstalledObject.hpp index 7fa8bd2da197..fe8dd51f709d 100644 --- a/src/openrct2/scripting/bindings/object/ScInstalledObject.hpp +++ b/src/openrct2/scripting/bindings/object/ScInstalledObject.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/object/ScObject.hpp b/src/openrct2/scripting/bindings/object/ScObject.hpp index c350cfb55bdc..4c4d851dbf89 100644 --- a/src/openrct2/scripting/bindings/object/ScObject.hpp +++ b/src/openrct2/scripting/bindings/object/ScObject.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/object/ScObjectManager.cpp b/src/openrct2/scripting/bindings/object/ScObjectManager.cpp index bab6a27f9bc2..c817e999eb86 100644 --- a/src/openrct2/scripting/bindings/object/ScObjectManager.cpp +++ b/src/openrct2/scripting/bindings/object/ScObjectManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,8 +11,10 @@ #include "ScObjectManager.h" + #include "../../../Context.h" #include "../../../object/ObjectList.h" #include "../../../ride/RideData.h" + #include "../../../windows/Intent.h" #include "../../Duktape.hpp" #include "../../ScriptEngine.h" @@ -191,6 +193,8 @@ void ScObjectManager::unload(const DukValue& p1, const DukValue& p2) } objectManager.UnloadObjects(descriptors); } + auto intent = Intent(INTENT_ACTION_REFRESH_SCENERY); + ContextBroadcastIntent(&intent); } DukValue ScObjectManager::getObject(const std::string& typez, int32_t index) const diff --git a/src/openrct2/scripting/bindings/object/ScObjectManager.h b/src/openrct2/scripting/bindings/object/ScObjectManager.h index 630beb1a4f6b..16bdda6837be 100644 --- a/src/openrct2/scripting/bindings/object/ScObjectManager.h +++ b/src/openrct2/scripting/bindings/object/ScObjectManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/ride/ScRide.cpp b/src/openrct2/scripting/bindings/ride/ScRide.cpp index aa9194681af8..05b157ace3b0 100644 --- a/src/openrct2/scripting/bindings/ride/ScRide.cpp +++ b/src/openrct2/scripting/bindings/ride/ScRide.cpp @@ -454,7 +454,7 @@ namespace OpenRCT2::Scripting uint8_t ScRide::inspectionInterval_get() const { auto ride = GetRide(); - return ride != nullptr ? ride->inspectionInterval : 0; + return ride != nullptr ? EnumValue(ride->inspectionInterval) : 0; } void ScRide::inspectionInterval_set(uint8_t value) { @@ -462,7 +462,9 @@ namespace OpenRCT2::Scripting auto ride = GetRide(); if (ride != nullptr) { - ride->inspectionInterval = std::clamp(value, RIDE_INSPECTION_EVERY_10_MINUTES, RIDE_INSPECTION_NEVER); + auto clamped = std::clamp( + value, EnumValue(RideInspection::every10Minutes), EnumValue(RideInspection::never)); + ride->inspectionInterval = static_cast(clamped); } } diff --git a/src/openrct2/scripting/bindings/ride/ScTrackIterator.cpp b/src/openrct2/scripting/bindings/ride/ScTrackIterator.cpp index b23fe59bc6ff..a596b7988624 100644 --- a/src/openrct2/scripting/bindings/ride/ScTrackIterator.cpp +++ b/src/openrct2/scripting/bindings/ride/ScTrackIterator.cpp @@ -64,7 +64,7 @@ DukValue ScTrackIterator::segment_get() const auto& scriptEngine = GetContext()->GetScriptEngine(); auto ctx = scriptEngine.GetContext(); - if (_type >= TrackElemType::Count) + if (_type >= TrackElemType::count) return ToDuk(ctx, nullptr); return GetObjectAsDukValue(ctx, std::make_shared(_type)); diff --git a/src/openrct2/scripting/bindings/ride/ScTrackSegment.cpp b/src/openrct2/scripting/bindings/ride/ScTrackSegment.cpp index afa982c48ba1..9634f4807328 100644 --- a/src/openrct2/scripting/bindings/ride/ScTrackSegment.cpp +++ b/src/openrct2/scripting/bindings/ride/ScTrackSegment.cpp @@ -50,21 +50,21 @@ void ScTrackSegment::Register(duk_context* ctx) dukglue_register_property(ctx, &ScTrackSegment::getTrackPitchDirection, nullptr, "slopeDirection"); dukglue_register_property( - ctx, &ScTrackSegment::getTrackFlag, nullptr, "onlyAllowedUnderwater"); + ctx, &ScTrackSegment::getTrackFlag, nullptr, "onlyAllowedUnderwater"); dukglue_register_property( - ctx, &ScTrackSegment::getTrackFlag, nullptr, "onlyAllowedAboveGround"); - dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "allowsChainLift"); - dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isBanked"); - dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isInversion"); - dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isSteepUp"); + ctx, &ScTrackSegment::getTrackFlag, nullptr, "onlyAllowedAboveGround"); + dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "allowsChainLift"); + dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isBanked"); + dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isInversion"); + dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isSteepUp"); dukglue_register_property( - ctx, &ScTrackSegment::getTrackFlag, nullptr, "startsHalfHeightUp"); - dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "countsAsInversion"); - dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isBankedTurn"); - dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isSlopedTurn"); - dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isHelix"); + ctx, &ScTrackSegment::getTrackFlag, nullptr, "startsHalfHeightUp"); + dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "countsAsInversion"); + dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isBankedTurn"); + dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isSlopedTurn"); + dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag, nullptr, "isHelix"); dukglue_register_property( - ctx, &ScTrackSegment::getTrackFlag, nullptr, "countsAsInversion"); + ctx, &ScTrackSegment::getTrackFlag, nullptr, "countsAsInversion"); dukglue_register_method(ctx, &ScTrackSegment::getSubpositionLength, "getSubpositionLength"); dukglue_register_method(ctx, &ScTrackSegment::getSubpositions, "getSubpositions"); @@ -199,15 +199,15 @@ static DukValue _trackCurveToString(duk_context* ctx, TrackCurve curve) { static const EnumMap map( { - { "straight", TrackCurve::None }, - { "left", TrackCurve::Left }, - { "right", TrackCurve::Right }, - { "left_small", TrackCurve::LeftSmall }, - { "right_small", TrackCurve::RightSmall }, - { "left_very_small", TrackCurve::LeftVerySmall }, - { "right_very_small", TrackCurve::RightVerySmall }, - { "left_large", TrackCurve::LeftLarge }, - { "right_large", TrackCurve::RightLarge }, + { "straight", TrackCurve::none }, + { "left", TrackCurve::left }, + { "right", TrackCurve::right }, + { "left_small", TrackCurve::leftSmall }, + { "right_small", TrackCurve::rightSmall }, + { "left_very_small", TrackCurve::leftVerySmall }, + { "right_very_small", TrackCurve::rightVerySmall }, + { "left_large", TrackCurve::leftLarge }, + { "right_large", TrackCurve::rightLarge }, }); u8string text = u8string(map[curve]); @@ -242,7 +242,7 @@ DukValue ScTrackSegment::getMirrorElement() const { const auto ctx = GetContext()->GetScriptEngine().GetContext(); const auto& ted = GetTrackElementDescriptor(_type); - if (ted.mirrorElement == TrackElemType::None) + if (ted.mirrorElement == TrackElemType::none) return ToDuk(ctx, nullptr); return ToDuk(ctx, EnumValue(ted.mirrorElement)); } @@ -251,7 +251,7 @@ DukValue ScTrackSegment::getAlternativeElement() const { const auto ctx = GetContext()->GetScriptEngine().GetContext(); const auto& ted = GetTrackElementDescriptor(_type); - if (ted.alternativeType == TrackElemType::None) + if (ted.alternativeType == TrackElemType::none) return ToDuk(ctx, nullptr); return ToDuk(ctx, EnumValue(ted.alternativeType)); } @@ -263,12 +263,12 @@ int32_t ScTrackSegment::getPriceModifier() const return ted.priceModifier; } -template +template bool ScTrackSegment::getTrackFlag() const { const auto& ted = GetTrackElementDescriptor(_type); - return ted.flags & flag; + return ted.flags.has(flag); } int32_t ScTrackSegment::getTrackGroup() const @@ -281,9 +281,9 @@ int32_t ScTrackSegment::getTrackGroup() const std::string ScTrackSegment::getTrackCurvature() const { const auto& ted = GetTrackElementDescriptor(_type); - if (ted.flags & TRACK_ELEM_FLAG_TURN_LEFT) + if (ted.flags.has(TrackElementFlag::turnLeft)) return "left"; - if (ted.flags & TRACK_ELEM_FLAG_TURN_RIGHT) + if (ted.flags.has(TrackElementFlag::turnRight)) return "right"; return "straight"; } @@ -291,9 +291,9 @@ std::string ScTrackSegment::getTrackCurvature() const std::string ScTrackSegment::getTrackPitchDirection() const { const auto& ted = GetTrackElementDescriptor(_type); - if (ted.flags & TRACK_ELEM_FLAG_UP) + if (ted.flags.has(TrackElementFlag::up)) return "up"; - if (ted.flags & TRACK_ELEM_FLAG_DOWN) + if (ted.flags.has(TrackElementFlag::down)) return "down"; return "flat"; } diff --git a/src/openrct2/scripting/bindings/ride/ScTrackSegment.h b/src/openrct2/scripting/bindings/ride/ScTrackSegment.h index a87e6317a356..4bac66cd1317 100644 --- a/src/openrct2/scripting/bindings/ride/ScTrackSegment.h +++ b/src/openrct2/scripting/bindings/ride/ScTrackSegment.h @@ -25,7 +25,7 @@ namespace OpenRCT2::Scripting dukSubposition.Set("x", value.x); dukSubposition.Set("y", value.y); dukSubposition.Set("z", value.z); - dukSubposition.Set("yaw", value.direction); + dukSubposition.Set("yaw", value.yaw); dukSubposition.Set("pitch", EnumValue(value.pitch)); dukSubposition.Set("roll", EnumValue(value.roll)); return dukSubposition.Take(); @@ -65,7 +65,7 @@ namespace OpenRCT2::Scripting int32_t getPriceModifier() const; int32_t getPreviewZOffset() const; int32_t getTrackGroup() const; - template + template bool getTrackFlag() const; std::string getTrackCurvature() const; std::string getTrackPitchDirection() const; diff --git a/src/openrct2/scripting/bindings/world/ScAward.cpp b/src/openrct2/scripting/bindings/world/ScAward.cpp index 739c86818f9e..5bb814b2388a 100644 --- a/src/openrct2/scripting/bindings/world/ScAward.cpp +++ b/src/openrct2/scripting/bindings/world/ScAward.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -12,6 +12,7 @@ #include "ScAward.hpp" #include "../../../GameState.h" + #include "../../../localisation/Formatter.h" #include "../../../localisation/Formatting.h" #include "../../../management/Award.h" #include "../../../windows/Intent.h" diff --git a/src/openrct2/scripting/bindings/world/ScAward.hpp b/src/openrct2/scripting/bindings/world/ScAward.hpp index f38b1a556f13..71ab30b46c46 100644 --- a/src/openrct2/scripting/bindings/world/ScAward.hpp +++ b/src/openrct2/scripting/bindings/world/ScAward.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScClimate.hpp b/src/openrct2/scripting/bindings/world/ScClimate.hpp index 54771ce53133..2944a8b5e90d 100644 --- a/src/openrct2/scripting/bindings/world/ScClimate.hpp +++ b/src/openrct2/scripting/bindings/world/ScClimate.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScDate.hpp b/src/openrct2/scripting/bindings/world/ScDate.hpp index 5c4148f9475e..c3e2e1c2faee 100644 --- a/src/openrct2/scripting/bindings/world/ScDate.hpp +++ b/src/openrct2/scripting/bindings/world/ScDate.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScMap.cpp b/src/openrct2/scripting/bindings/world/ScMap.cpp index bf9bef1b64e2..17b56e09bb11 100644 --- a/src/openrct2/scripting/bindings/world/ScMap.cpp +++ b/src/openrct2/scripting/bindings/world/ScMap.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScMap.hpp b/src/openrct2/scripting/bindings/world/ScMap.hpp index cf59c8662260..91dbff457655 100644 --- a/src/openrct2/scripting/bindings/world/ScMap.hpp +++ b/src/openrct2/scripting/bindings/world/ScMap.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScPark.cpp b/src/openrct2/scripting/bindings/world/ScPark.cpp index a06af41f299f..a855fac0e90c 100644 --- a/src/openrct2/scripting/bindings/world/ScPark.cpp +++ b/src/openrct2/scripting/bindings/world/ScPark.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -15,6 +15,7 @@ #include "../../../Date.h" #include "../../../GameState.h" #include "../../../core/String.hpp" + #include "../../../drawing/Drawing.h" #include "../../../entity/Guest.h" #include "../../../management/Finance.h" #include "../../../management/NewsItem.h" diff --git a/src/openrct2/scripting/bindings/world/ScPark.hpp b/src/openrct2/scripting/bindings/world/ScPark.hpp index dcef4d43775c..b46fc2a1236e 100644 --- a/src/openrct2/scripting/bindings/world/ScPark.hpp +++ b/src/openrct2/scripting/bindings/world/ScPark.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScParkMessage.cpp b/src/openrct2/scripting/bindings/world/ScParkMessage.cpp index 9a38e6a355c3..a4ec1682265c 100644 --- a/src/openrct2/scripting/bindings/world/ScParkMessage.cpp +++ b/src/openrct2/scripting/bindings/world/ScParkMessage.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScParkMessage.hpp b/src/openrct2/scripting/bindings/world/ScParkMessage.hpp index f619412dd056..ddaffac2bd80 100644 --- a/src/openrct2/scripting/bindings/world/ScParkMessage.hpp +++ b/src/openrct2/scripting/bindings/world/ScParkMessage.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScResearch.cpp b/src/openrct2/scripting/bindings/world/ScResearch.cpp index 971240fbe9c0..f97e1577d8c9 100644 --- a/src/openrct2/scripting/bindings/world/ScResearch.cpp +++ b/src/openrct2/scripting/bindings/world/ScResearch.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScResearch.hpp b/src/openrct2/scripting/bindings/world/ScResearch.hpp index 1cdb611258af..b62344c21c24 100644 --- a/src/openrct2/scripting/bindings/world/ScResearch.hpp +++ b/src/openrct2/scripting/bindings/world/ScResearch.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScScenario.hpp b/src/openrct2/scripting/bindings/world/ScScenario.hpp index 96f06ecc155a..e00b0e5d288f 100644 --- a/src/openrct2/scripting/bindings/world/ScScenario.hpp +++ b/src/openrct2/scripting/bindings/world/ScScenario.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScTile.cpp b/src/openrct2/scripting/bindings/world/ScTile.cpp index 187d4731de98..27ad134401ee 100644 --- a/src/openrct2/scripting/bindings/world/ScTile.cpp +++ b/src/openrct2/scripting/bindings/world/ScTile.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include "../../../Context.h" #include "../../../core/Guard.hpp" + #include "../../../drawing/ScrollingText.h" #include "../../../entity/EntityRegistry.h" #include "../../../object/LargeSceneryEntry.h" #include "../../../ride/Track.h" diff --git a/src/openrct2/scripting/bindings/world/ScTile.hpp b/src/openrct2/scripting/bindings/world/ScTile.hpp index 158b5dc094b2..43acb2d2ed77 100644 --- a/src/openrct2/scripting/bindings/world/ScTile.hpp +++ b/src/openrct2/scripting/bindings/world/ScTile.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/bindings/world/ScTileElement.cpp b/src/openrct2/scripting/bindings/world/ScTileElement.cpp index 7c88a296a5f1..68f8eeaadaf3 100644 --- a/src/openrct2/scripting/bindings/world/ScTileElement.cpp +++ b/src/openrct2/scripting/bindings/world/ScTileElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -13,6 +13,7 @@ #include "../../../Context.h" #include "../../../core/Guard.hpp" + #include "../../../drawing/ScrollingText.h" #include "../../../entity/EntityRegistry.h" #include "../../../object/LargeSceneryEntry.h" #include "../../../object/WallSceneryEntry.h" @@ -1462,7 +1463,7 @@ namespace OpenRCT2::Scripting case TileElementType::Banner: { auto* el = _element->AsBanner(); - el->GetBanner()->textColour = static_cast(value); + el->GetBanner()->textColour = static_cast(value); Invalidate(); break; } @@ -2245,7 +2246,7 @@ namespace OpenRCT2::Scripting { banner->text = {}; banner->colour = 0; - banner->textColour = TextColour::black; + banner->textColour = Drawing::TextColour::black; banner->flags = {}; if (_element->GetType() == TileElementType::Wall) banner->flags.set(BannerFlag::isWall); diff --git a/src/openrct2/scripting/bindings/world/ScTileElement.hpp b/src/openrct2/scripting/bindings/world/ScTileElement.hpp index bb1f6ab22dc0..52c72fb04177 100644 --- a/src/openrct2/scripting/bindings/world/ScTileElement.hpp +++ b/src/openrct2/scripting/bindings/world/ScTileElement.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/scripting/rpc/RpcUtils.cpp b/src/openrct2/scripting/rpc/RpcUtils.cpp index 4c77486137bc..776308b205d8 100644 --- a/src/openrct2/scripting/rpc/RpcUtils.cpp +++ b/src/openrct2/scripting/rpc/RpcUtils.cpp @@ -185,33 +185,33 @@ namespace OpenRCT2::Scripting::Rpc using GameActions::Status; switch (status) { - case Status::Ok: + case Status::ok: return "ok"; - case Status::InvalidParameters: + case Status::invalidParameters: return "invalidParameters"; - case Status::Disallowed: + case Status::disallowed: return "disallowed"; - case Status::GamePaused: + case Status::gamePaused: return "gamePaused"; - case Status::InsufficientFunds: + case Status::insufficientFunds: return "insufficientFunds"; - case Status::NotInEditorMode: + case Status::notInEditorMode: return "notInEditor"; - case Status::NotOwned: + case Status::notOwned: return "notOwned"; - case Status::TooLow: + case Status::tooLow: return "tooLow"; - case Status::TooHigh: + case Status::tooHigh: return "tooHigh"; - case Status::NoClearance: + case Status::noClearance: return "noClearance"; - case Status::ItemAlreadyPlaced: + case Status::itemAlreadyPlaced: return "itemAlreadyPlaced"; - case Status::NotClosed: + case Status::notClosed: return "notClosed"; - case Status::Broken: + case Status::broken: return "broken"; - case Status::NoFreeElements: + case Status::noFreeElements: return "noFreeElements"; default: return "unknown"; @@ -220,8 +220,8 @@ namespace OpenRCT2::Scripting::Rpc std::string BuildGameActionErrorMessage(const GameActions::Result& result) { - std::string message = result.GetErrorMessage(); - std::string title = result.GetErrorTitle(); + std::string message = result.getErrorMessage(); + std::string title = result.getErrorTitle(); if (!title.empty()) { @@ -237,7 +237,7 @@ namespace OpenRCT2::Scripting::Rpc if (message.empty()) { - message = "Game action failed (" + std::string(GameActionStatusToString(result.Error)) + ")"; + message = "Game action failed (" + std::string(GameActionStatusToString(result.error)) + ")"; } return message; } @@ -270,12 +270,12 @@ namespace OpenRCT2::Scripting::Rpc json_t BuildActionSuccessPayload(const GameActions::Result& result) { json_t payload = json_t::object(); - payload["status"] = GameActionStatusToString(result.Error); - payload["cost"] = MoneyToDouble(result.Cost); - payload["position"] = BuildPositionPayload(result.Position); - if (result.Expenditure != ExpenditureType::count) + payload["status"] = GameActionStatusToString(result.error); + payload["cost"] = MoneyToDouble(result.cost); + payload["position"] = BuildPositionPayload(result.position); + if (result.expenditure != ExpenditureType::count) { - payload["expenditure"] = static_cast(result.Expenditure); + payload["expenditure"] = static_cast(result.expenditure); } return payload; } diff --git a/src/openrct2/scripting/rpc/handlers/FinanceHandlers.cpp b/src/openrct2/scripting/rpc/handlers/FinanceHandlers.cpp index d676f872c7d7..109d07421d58 100644 --- a/src/openrct2/scripting/rpc/handlers/FinanceHandlers.cpp +++ b/src/openrct2/scripting/rpc/handlers/FinanceHandlers.cpp @@ -243,7 +243,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::ParkSetLoanAction(desiredLoan); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } diff --git a/src/openrct2/scripting/rpc/handlers/GuestHandlers.cpp b/src/openrct2/scripting/rpc/handlers/GuestHandlers.cpp index aa54c3fa7339..f5bca962c2e4 100644 --- a/src/openrct2/scripting/rpc/handlers/GuestHandlers.cpp +++ b/src/openrct2/scripting/rpc/handlers/GuestHandlers.cpp @@ -1352,7 +1352,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers GameActions::PeepPickupAction pickupAction{ GameActions::PeepPickupType::Pickup, guest->Id, nullLoc, Network::GetCurrentPlayerId() }; auto result = GameActions::Execute(&pickupAction, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -1406,7 +1406,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers GameActions::PeepPickupAction placeAction{ GameActions::PeepPickupType::Place, guest->Id, coords, Network::GetCurrentPlayerId() }; auto result = GameActions::Execute(&placeAction, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -1460,7 +1460,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers GameActions::PeepPickupAction cancelAction{ GameActions::PeepPickupType::Cancel, guest->Id, restoreLoc, playerId }; auto result = GameActions::Execute(&cancelAction, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } diff --git a/src/openrct2/scripting/rpc/handlers/MapHandlers.cpp b/src/openrct2/scripting/rpc/handlers/MapHandlers.cpp index 876fa2bdfa30..86e94e5b8e5b 100644 --- a/src/openrct2/scripting/rpc/handlers/MapHandlers.cpp +++ b/src/openrct2/scripting/rpc/handlers/MapHandlers.cpp @@ -1881,7 +1881,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers CoordsXYZD loc{ coords.x, coords.y, zCoord, 0 }; auto action = GameActions::SmallSceneryPlaceAction(loc, 0, entryIndexOpt.value(), 0, 0, 0); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -1982,7 +1982,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers CoordsXYZD loc{ coords.x, coords.y, zCoord, direction }; auto action = GameActions::SmallSceneryPlaceAction(loc, quadrant, entryIndexOpt.value(), primaryColour, secondaryColour, 0); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2091,7 +2091,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers CoordsXYZ loc{ coords.x, coords.y, zCoord }; auto action = GameActions::FootpathAdditionPlaceAction(loc, entryIndexOpt.value()); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2174,7 +2174,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers CoordsXYZ loc{ coords.x, coords.y, zCoord }; auto action = GameActions::FootpathAdditionRemoveAction(loc); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2411,7 +2411,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::FootpathPlaceAction( location, slope, surfaceSelection->entryIndex, railingsIndex, kInvalidDirection, constructFlags); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2529,7 +2529,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::ClearAction(range, GameActions::CLEARABLE_ITEMS::kSceneryFootpath); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2542,7 +2542,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers payload["tile"] = tileObj; payload["height"] = foundZ; payload["queue"] = isQueue; - payload["cost"] = static_cast(result.Cost) / 10.0; // Convert to currency display format + payload["cost"] = static_cast(result.cost) / 10.0; // Convert to currency display format if (!surfaceName.empty()) { @@ -2646,7 +2646,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers result = GameActions::Execute(&action, getGameState()); } - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2730,7 +2730,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers result = GameActions::Execute(&action, getGameState()); } - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2827,7 +2827,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::ClearAction(range, itemsToClear); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2838,7 +2838,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers payload["y"] = tile.y; payload["width"] = width; payload["height"] = height; - payload["cost"] = result.Cost; + payload["cost"] = result.cost; // Build filter description std::vector clearedTypes; diff --git a/src/openrct2/scripting/rpc/handlers/ParkHandlers.cpp b/src/openrct2/scripting/rpc/handlers/ParkHandlers.cpp index e4f2063c0d01..e9f0320cd7bf 100644 --- a/src/openrct2/scripting/rpc/handlers/ParkHandlers.cpp +++ b/src/openrct2/scripting/rpc/handlers/ParkHandlers.cpp @@ -865,7 +865,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers : GameActions::ParkParameter::Close; GameActions::ParkSetParameterAction action(mode); auto result = GameActions::Execute(&action, gameState); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -904,7 +904,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers GameActions::ParkSetEntranceFeeAction action(fee); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -979,7 +979,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::CheatSetAction(descriptor->type, *valueParam ? 1 : 0); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } diff --git a/src/openrct2/scripting/rpc/handlers/ResearchHandlers.cpp b/src/openrct2/scripting/rpc/handlers/ResearchHandlers.cpp index c1e45d1160b1..7b1be821f297 100644 --- a/src/openrct2/scripting/rpc/handlers/ResearchHandlers.cpp +++ b/src/openrct2/scripting/rpc/handlers/ResearchHandlers.cpp @@ -845,7 +845,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::ParkSetResearchFundingAction(priorities, funding); auto result = GameActions::Execute(&action, gameState); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -952,7 +952,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::ParkMarketingAction(*typeValue, item, weeks); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } diff --git a/src/openrct2/scripting/rpc/handlers/RideHandlers.cpp b/src/openrct2/scripting/rpc/handlers/RideHandlers.cpp index de6130b69314..01569211244d 100644 --- a/src/openrct2/scripting/rpc/handlers/RideHandlers.cpp +++ b/src/openrct2/scripting/rpc/handlers/RideHandlers.cpp @@ -17,6 +17,7 @@ #include "../../../Context.h" #include "../../../Diagnostic.h" #include "../../../GameState.h" +#include "../../../actions/CommandFlag.h" #include "../../../actions/GameActionResult.h" #include "../../../actions/RideCreateAction.h" #include "../../../actions/RideDemolishAction.h" @@ -112,7 +113,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers { TileCoordsXY anchor; Direction direction{ 0 }; - OpenRCT2::TrackElemType trackType{ OpenRCT2::TrackElemType::None }; + OpenRCT2::TrackElemType trackType{ OpenRCT2::TrackElemType::none }; std::vector tiles; }; @@ -566,7 +567,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto& gameState = getGameState(); std::set> seen; RideFootprint footprint; - footprint.trackType = TrackElemType::None; + footprint.trackType = TrackElemType::none; TileCoordsXY tilePos; for (tilePos.y = 0; tilePos.y < gameState.mapSize.y; ++tilePos.y) @@ -583,7 +584,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers { footprint.tiles.push_back(tilePos); } - if (footprint.trackType == TrackElemType::None) + if (footprint.trackType == TrackElemType::none) { footprint.anchor = tilePos; footprint.direction = trackElement->GetDirection(); @@ -669,14 +670,14 @@ namespace OpenRCT2::Scripting::Rpc::Handlers continue; } - if (trackElement->GetTrackType() == TrackElemType::Maze) + if (trackElement->GetTrackType() == TrackElemType::maze) { return DirectionReverse(searchDir); } Direction relativeDir = (DirectionReverse(searchDir) - trackElement->GetDirection()) & 3; const auto& ted = TrackMetaData::GetTrackElementDescriptor(trackElement->GetTrackType()); - if (ted.sequences[trackElement->GetSequenceIndex()].flags & (1 << relativeDir)) + if (ted.sequences[trackElement->GetSequenceIndex()].getEntranceConnectionSides() & (1 << relativeDir)) { return DirectionReverse(searchDir); } @@ -778,7 +779,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers if (descriptor.BuildCosts.TrackPrice == kMoney64Undefined) return std::nullopt; money64 price = descriptor.BuildCosts.TrackPrice; - if (descriptor.StartTrackPiece != TrackElemType::None) + if (descriptor.StartTrackPiece != TrackElemType::none) { const auto& startPieceDescriptor = TrackMetaData::GetTrackElementDescriptor(descriptor.StartTrackPiece); price *= startPieceDescriptor.priceModifier; @@ -795,32 +796,31 @@ namespace OpenRCT2::Scripting::Rpc::Handlers return static_cast(value) / 100.0; } - int32_t GetInspectionIntervalMinutes(uint8_t index) + int32_t GetInspectionIntervalMinutes(RideInspection interval) { + auto index = static_cast(interval); if (index >= kRideInspectionIntervalMinutes.size()) return 0; return kRideInspectionIntervalMinutes[index]; } - std::string_view InspectionIntervalToString(uint8_t value) + std::string_view InspectionIntervalToString(RideInspection value) { switch (value) { - case 0: + case RideInspection::every10Minutes: return "10min"; - case 1: + case RideInspection::every20Minutes: return "20min"; - case 2: + case RideInspection::every30Minutes: return "30min"; - case 3: + case RideInspection::every45Minutes: return "45min"; - case 4: + case RideInspection::everyHour: return "60min"; - case 5: - return "90min"; - case 6: + case RideInspection::every2Hours: return "120min"; - case 7: + case RideInspection::never: return "never"; default: return "unknown"; @@ -1145,12 +1145,12 @@ namespace OpenRCT2::Scripting::Rpc::Handlers rideJson["downtimePercent"] = ride.downtime; rideJson["minutesSinceInspection"] = ride.lastInspection; rideJson["inspectionIntervalMinutes"] = inspectionIntervalMinutes; - rideJson["inspectionIntervalIndex"] = ride.inspectionInterval; + rideJson["inspectionIntervalIndex"] = static_cast(ride.inspectionInterval); rideJson["inspectionIntervalLabel"] = InspectionIntervalToString(ride.inspectionInterval); rideJson["dueInspection"] = (ride.lifecycleFlags & RIDE_LIFECYCLE_DUE_INSPECTION) != 0; rideJson["isBrokenDown"] = (ride.lifecycleFlags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN)) != 0; - rideJson["mechanicDispatched"] = ride.mechanicStatus != 0; + rideJson["mechanicDispatched"] = ride.mechanicStatus != MechanicStatus::undefined; rideJson["ageMonths"] = ride.getAge(); rideJson["numInversions"] = ride.numInversions; rideJson["lifecycleFlags"] = ride.lifecycleFlags; @@ -1241,19 +1241,19 @@ namespace OpenRCT2::Scripting::Rpc::Handlers return node; } - std::string MechanicStatusKey(uint8_t status) + std::string MechanicStatusKey(MechanicStatus status) { switch (status) { - case RIDE_MECHANIC_STATUS_CALLING: + case MechanicStatus::calling: return "calling"; - case RIDE_MECHANIC_STATUS_HEADING: + case MechanicStatus::heading: return "heading"; - case RIDE_MECHANIC_STATUS_FIXING: + case MechanicStatus::fixing: return "fixing"; - case RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES: + case MechanicStatus::hasFixedStationBrakes: return "resetting"; - case RIDE_MECHANIC_STATUS_UNDEFINED: + case MechanicStatus::undefined: default: return "idle"; } @@ -2225,7 +2225,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers const auto previousStatus = rideLookup->ride->status; auto action = GameActions::RideSetStatusAction(rideLookup->id, desiredStatus.value()); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2308,7 +2308,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::RideSetPriceAction(rideLookup->id, newPrice, !secondary); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2365,7 +2365,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers hint.requestWindowFocus = false; auto action = GameActions::RideDemolishAction(rideLookup->id, *modifyType); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2407,7 +2407,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers const std::string previousName = rideLookup->ride->getName(); auto action = GameActions::RideSetNameAction(rideLookup->id, *newNameParam); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -2451,7 +2451,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto execSetting = [&](RideSetSetting setting, uint8_t value) -> bool { auto action = GameActions::RideSetSettingAction(rideLookup->id, setting, value); lastResult = GameActions::Execute(&action, getGameState()); - if (lastResult.Error != GameActions::Status::Ok) + if (lastResult.error != GameActions::Status::ok) { return false; } @@ -2538,7 +2538,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers std::optional inspectionValue; if (auto inspectionIndex = GetIntParam(params, "inspectionIndex")) { - if (*inspectionIndex < 0 || *inspectionIndex > RIDE_INSPECTION_NEVER) + if (*inspectionIndex < 0 || *inspectionIndex > static_cast(RideInspection::never)) { return RpcResult::Error(kErrorInvalidParams, "inspectionIndex out of range"); } @@ -2567,7 +2567,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(lastResult)); } applied["inspectionIntervalIndex"] = inspectionValue.value(); - applied["inspectionIntervalLabel"] = InspectionIntervalToString(inspectionValue.value()); + applied["inspectionIntervalLabel"] = InspectionIntervalToString(static_cast(inspectionValue.value())); } // Operating option (laps, launch speed, rotations, time limit - depends on ride type) @@ -2966,7 +2966,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers { return RpcResult::Error(kErrorInvalidParams, "rides.place currently supports flat rides only"); } - if (blueprint->descriptor->StartTrackPiece == OpenRCT2::TrackElemType::None) + if (blueprint->descriptor->StartTrackPiece == OpenRCT2::TrackElemType::none) { return RpcResult::Error(kErrorInvalidParams, "Ride does not define a buildable start piece"); } @@ -2998,17 +2998,17 @@ namespace OpenRCT2::Scripting::Rpc::Handlers int32_t colour2 = RideGetUnusedPresetVehicleColour(blueprint->entryIndex); auto rideCreate = GameActions::RideCreateAction( - blueprint->rideType, blueprint->entryIndex, colour1, colour2, gameState.lastEntranceStyle); + blueprint->rideType, blueprint->entryIndex, colour1, colour2, gameState.lastEntranceStyle, RideInspection::every10Minutes); auto createQueryResult = GameActions::Query(&rideCreate, gameState); json_t payload = json_t::object(); payload["dryRun"] = true; - payload["feasible"] = (createQueryResult.Error == GameActions::Status::Ok); + payload["feasible"] = (createQueryResult.error == GameActions::Status::ok); - if (createQueryResult.Error == GameActions::Status::Ok) + if (createQueryResult.error == GameActions::Status::ok) { payload["status"] = "ok"; - payload["estimatedCost"] = MoneyToDouble(createQueryResult.Cost); + payload["estimatedCost"] = MoneyToDouble(createQueryResult.cost); payload["message"] = "Placement would succeed. Cost is an estimate; actual cost may vary slightly."; } else @@ -3049,20 +3049,20 @@ namespace OpenRCT2::Scripting::Rpc::Handlers int32_t colour2 = RideGetUnusedPresetVehicleColour(blueprint->entryIndex); auto rideCreate = GameActions::RideCreateAction( - blueprint->rideType, blueprint->entryIndex, colour1, colour2, gameState.lastEntranceStyle); + blueprint->rideType, blueprint->entryIndex, colour1, colour2, gameState.lastEntranceStyle, RideInspection::every10Minutes); auto createResult = GameActions::ExecuteNested(&rideCreate, gameState); - if (createResult.Error != GameActions::Status::Ok) + if (createResult.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(createResult)); } - RideId rideId = createResult.GetData(); + RideId rideId = createResult.getData(); SelectedLiftAndInverted liftFlags{}; CoordsXYZD origin{ coords.x, coords.y, *placementHeight, direction }; auto trackAction = GameActions::TrackPlaceAction( rideId, blueprint->descriptor->StartTrackPiece, blueprint->rideType, origin, 0, 0, 0, liftFlags, false); auto placeResult = GameActions::ExecuteNested(&trackAction, gameState); - if (placeResult.Error != GameActions::Status::Ok) + if (placeResult.error != GameActions::Status::ok) { auto demolish = GameActions::RideDemolishAction(rideId, GameActions::RideModifyType::demolish); GameActions::Execute(&demolish, gameState); @@ -3075,15 +3075,15 @@ namespace OpenRCT2::Scripting::Rpc::Handlers return RpcResult::Error(kErrorServerError, "Ride data unavailable after placement"); } - money64 totalCost = createResult.Cost + placeResult.Cost; + money64 totalCost = createResult.cost + placeResult.cost; json_t payload = json_t::object(); - payload["status"] = GameActionStatusToString(placeResult.Error); + payload["status"] = GameActionStatusToString(placeResult.error); payload["cost"] = MoneyToDouble(totalCost); json_t costBreakdown = json_t::object(); - costBreakdown["create"] = MoneyToDouble(createResult.Cost); - costBreakdown["build"] = MoneyToDouble(placeResult.Cost); + costBreakdown["create"] = MoneyToDouble(createResult.cost); + costBreakdown["build"] = MoneyToDouble(placeResult.cost); payload["costBreakdown"] = costBreakdown; payload["ride"] = BuildRidePayload(*ride); @@ -3213,7 +3213,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::RideEntranceExitPlaceAction( coords, actionDirection, rideLookup->id, stationIndex, isExit); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -3714,8 +3714,8 @@ namespace OpenRCT2::Scripting::Rpc::Handlers location.direction = directionParam & 3; // Execute the action in query mode - auto action = GameActions::TrackDesignAction(location, trackDesign, false); - action.SetFlags(GAME_COMMAND_FLAG_NO_SPEND); // Query only + auto action = GameActions::TrackDesignAction(location, trackDesign, false, RideInspection::every10Minutes); + action.SetFlags({ GameActions::CommandFlag::noSpend }); // Query only auto result = GameActions::Query(&action, gameState); json_t payload = json_t::object(); @@ -3767,13 +3767,13 @@ namespace OpenRCT2::Scripting::Rpc::Handlers placement["z"] = zParam; placement["zAutoDetected"] = !zExplicit; placement["direction"] = directionParam; - placement["cost"] = MoneyToDouble(result.Cost); - placement["canPlace"] = result.Error == GameActions::Status::Ok; + placement["cost"] = MoneyToDouble(result.cost); + placement["canPlace"] = result.error == GameActions::Status::ok; - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { - placement["errorMessage"] = result.GetErrorMessage(); - std::string errMsg = result.GetErrorMessage(); + placement["errorMessage"] = result.getErrorMessage(); + std::string errMsg = result.getErrorMessage(); // Provide targeted height suggestions based on error type if (errMsg.find("Too high") != std::string::npos || errMsg.find("too high") != std::string::npos) @@ -3928,12 +3928,12 @@ namespace OpenRCT2::Scripting::Rpc::Handlers location.direction = directionParam & 3; // Execute the action - auto action = GameActions::TrackDesignAction(location, trackDesign, placeScenery); + auto action = GameActions::TrackDesignAction(location, trackDesign, placeScenery, RideInspection::every10Minutes); auto result = GameActions::Execute(&action, gameState); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { - std::string errorMsg = result.GetErrorMessage(); + std::string errorMsg = result.getErrorMessage(); // Add targeted hint based on error type std::string hint; if (errorMsg.find("Too high") != std::string::npos || errorMsg.find("too high") != std::string::npos) @@ -3964,7 +3964,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers } // Get the created ride - auto rideId = result.GetData(); + auto rideId = result.getData(); auto* ride = GetRide(rideId); if (ride == nullptr) { @@ -3983,7 +3983,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers json_t payload = json_t::object(); payload["status"] = "ok"; - payload["cost"] = MoneyToDouble(result.Cost); + payload["cost"] = MoneyToDouble(result.cost); // Ride info - even if ride lookup failed, the coaster was placed successfully json_t rideInfo = json_t::object(); @@ -4168,7 +4168,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::RideSetAppearanceAction( rideLookup->id, type, static_cast(value), static_cast(schemeIndex)); auto result = GameActions::Execute(&action, getGameState()); - return result.Error == GameActions::Status::Ok; + return result.error == GameActions::Status::ok; }; // Process main color @@ -4258,7 +4258,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::RideSetAppearanceAction( rideLookup->id, type, static_cast(value), static_cast(trainIndex)); auto result = GameActions::Execute(&action, getGameState()); - return result.Error == GameActions::Status::Ok; + return result.error == GameActions::Status::ok; }; // Process body color @@ -4343,7 +4343,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers rideLookup->id, GameActions::RideSetAppearanceType::VehicleColourScheme, static_cast(*modeVal), 0); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -4394,7 +4394,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers rideLookup->id, GameActions::RideSetAppearanceType::EntranceStyle, static_cast(*styleVal), 0); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } diff --git a/src/openrct2/scripting/rpc/handlers/ShopHandlers.cpp b/src/openrct2/scripting/rpc/handlers/ShopHandlers.cpp index 587145c7f7fc..5a2a6a03ae96 100644 --- a/src/openrct2/scripting/rpc/handlers/ShopHandlers.cpp +++ b/src/openrct2/scripting/rpc/handlers/ShopHandlers.cpp @@ -864,8 +864,8 @@ namespace OpenRCT2::Scripting::Rpc::Handlers json_t BuildActionSuccessPayload(const GameActions::Result& result) { json_t payload = json_t::object(); - payload["status"] = GameActionStatusToString(result.Error); - payload["cost"] = MoneyToDouble(result.Cost); + payload["status"] = GameActionStatusToString(result.error); + payload["cost"] = MoneyToDouble(result.cost); return payload; } @@ -1129,17 +1129,17 @@ namespace OpenRCT2::Scripting::Rpc::Handlers int32_t colour2 = RideGetUnusedPresetVehicleColour(shopInfo->entryIndex); auto rideCreate = GameActions::RideCreateAction( - shopInfo->rideType, shopInfo->entryIndex, colour1, colour2, gameState.lastEntranceStyle); + shopInfo->rideType, shopInfo->entryIndex, colour1, colour2, gameState.lastEntranceStyle, RideInspection::every10Minutes); auto createQueryResult = GameActions::Query(&rideCreate, gameState); json_t payload = json_t::object(); payload["dryRun"] = true; - payload["feasible"] = (createQueryResult.Error == GameActions::Status::Ok); + payload["feasible"] = (createQueryResult.error == GameActions::Status::ok); - if (createQueryResult.Error == GameActions::Status::Ok) + if (createQueryResult.error == GameActions::Status::ok) { payload["status"] = "ok"; - payload["estimatedCost"] = MoneyToDouble(createQueryResult.Cost); + payload["estimatedCost"] = MoneyToDouble(createQueryResult.cost); payload["message"] = "Placement would succeed. Cost is an estimate; actual cost may vary slightly."; } else @@ -1179,21 +1179,21 @@ namespace OpenRCT2::Scripting::Rpc::Handlers int32_t colour2 = RideGetUnusedPresetVehicleColour(shopInfo->entryIndex); auto rideCreate = GameActions::RideCreateAction( - shopInfo->rideType, shopInfo->entryIndex, colour1, colour2, gameState.lastEntranceStyle); + shopInfo->rideType, shopInfo->entryIndex, colour1, colour2, gameState.lastEntranceStyle, RideInspection::every10Minutes); auto createResult = GameActions::ExecuteNested(&rideCreate, gameState); - if (createResult.Error != GameActions::Status::Ok) + if (createResult.error != GameActions::Status::ok) { return RpcResult::Error(-32000, BuildGameActionErrorMessage(createResult)); } - RideId rideId = createResult.GetData(); + RideId rideId = createResult.getData(); SelectedLiftAndInverted liftFlags{}; CoordsXYZD origin{ coords.x, coords.y, *placementHeight, direction }; auto trackAction = GameActions::TrackPlaceAction( rideId, shopInfo->descriptor->StartTrackPiece, shopInfo->rideType, origin, 0, 0, 0, liftFlags, false); auto placeResult = GameActions::ExecuteNested(&trackAction, gameState); - if (placeResult.Error != GameActions::Status::Ok) + if (placeResult.error != GameActions::Status::ok) { auto demolish = GameActions::RideDemolishAction(rideId, GameActions::RideModifyType::demolish); GameActions::Execute(&demolish, gameState); @@ -1206,7 +1206,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers return RpcResult::Error(-32000, detailedMessage); } - money64 totalCost = createResult.Cost + placeResult.Cost; + money64 totalCost = createResult.cost + placeResult.cost; auto* ride = GetRide(rideId); // Automatically open the shop after placement @@ -1214,12 +1214,12 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto openResult = GameActions::ExecuteNested(&openAction, gameState); json_t payload = json_t::object(); - payload["status"] = GameActionStatusToString(placeResult.Error); + payload["status"] = GameActionStatusToString(placeResult.error); payload["cost"] = MoneyToDouble(totalCost); json_t costBreakdown = json_t::object(); - costBreakdown["create"] = MoneyToDouble(createResult.Cost); - costBreakdown["build"] = MoneyToDouble(placeResult.Cost); + costBreakdown["create"] = MoneyToDouble(createResult.cost); + costBreakdown["build"] = MoneyToDouble(placeResult.cost); payload["costBreakdown"] = costBreakdown; json_t tileNode = json_t::object(); @@ -1289,7 +1289,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers json_t rideSnapshot = BuildRidePayload(*rideLookup->ride); auto action = GameActions::RideDemolishAction(rideLookup->id, GameActions::RideModifyType::demolish); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(-32000, BuildGameActionErrorMessage(result)); } @@ -1367,7 +1367,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers const auto previousStatus = rideLookup->ride->status; auto action = GameActions::RideSetStatusAction(rideLookup->id, desiredStatus.value()); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(-32000, BuildGameActionErrorMessage(result)); } @@ -1506,7 +1506,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::RideSetPriceAction(rideLookup->id, newPrice, !secondary); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(-32000, BuildGameActionErrorMessage(result)); } diff --git a/src/openrct2/scripting/rpc/handlers/StaffHandlers.cpp b/src/openrct2/scripting/rpc/handlers/StaffHandlers.cpp index 85771f79931d..c1821cef1dd4 100644 --- a/src/openrct2/scripting/rpc/handlers/StaffHandlers.cpp +++ b/src/openrct2/scripting/rpc/handlers/StaffHandlers.cpp @@ -374,10 +374,10 @@ namespace OpenRCT2::Scripting::Rpc::Handlers json_t BuildActionSuccessPayload(const GameActions::Result& result) { json_t payload = json_t::object(); - payload["status"] = GameActionStatusToString(result.Error); - payload["cost"] = MoneyToDouble(result.Cost); + payload["status"] = GameActionStatusToString(result.error); + payload["cost"] = MoneyToDouble(result.cost); json_t position = json_t::object(); - auto coords = result.Position; + auto coords = result.position; position["x"] = coords.x; position["y"] = coords.y; position["z"] = coords.z; @@ -397,9 +397,9 @@ namespace OpenRCT2::Scripting::Rpc::Handlers } position["tile"] = tile; payload["position"] = position; - if (result.Expenditure != ExpenditureType::count) + if (result.expenditure != ExpenditureType::count) { - payload["expenditure"] = static_cast(result.Expenditure); + payload["expenditure"] = static_cast(result.expenditure); } return payload; } @@ -765,12 +765,12 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::StaffHireNewAction(autoPlace, *staffType, costumeIndex, orders); // Use ExecuteNested to bypass queueing and get immediate result with valid entity ID auto result = GameActions::ExecuteNested(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } - auto hireResult = result.GetData(); + auto hireResult = result.getData(); Staff* newestStaff = nullptr; if (!hireResult.StaffEntityId.IsNull()) { @@ -863,7 +863,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::StaffFireAction(staff->Id); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -942,7 +942,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::StaffSetOrdersAction(staff->Id, desiredOrders); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -1034,7 +1034,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers auto action = GameActions::StaffSetPatrolAreaAction(staff->Id, range, *mode); auto result = GameActions::Execute(&action, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -1120,7 +1120,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers GameActions::PeepPickupAction pickupAction{ GameActions::PeepPickupType::Pickup, staff->Id, nullLoc, Network::GetCurrentPlayerId() }; auto result = GameActions::Execute(&pickupAction, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -1173,7 +1173,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers GameActions::PeepPickupAction cancelAction{ GameActions::PeepPickupType::Cancel, staff->Id, restoreLoc, playerId }; auto result = GameActions::Execute(&cancelAction, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } @@ -1227,7 +1227,7 @@ namespace OpenRCT2::Scripting::Rpc::Handlers GameActions::PeepPickupAction placeAction{ GameActions::PeepPickupType::Place, staff->Id, coords, Network::GetCurrentPlayerId() }; auto result = GameActions::Execute(&placeAction, getGameState()); - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { return RpcResult::Error(kErrorActionFailed, BuildGameActionErrorMessage(result)); } diff --git a/src/openrct2/ui/DummyUiContext.cpp b/src/openrct2/ui/DummyUiContext.cpp index 1f638361f8e1..d2a175c63778 100644 --- a/src/openrct2/ui/DummyUiContext.cpp +++ b/src/openrct2/ui/DummyUiContext.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ui/DummyWindowManager.cpp b/src/openrct2/ui/DummyWindowManager.cpp index e37e0421563b..f6e21888072d 100644 --- a/src/openrct2/ui/DummyWindowManager.cpp +++ b/src/openrct2/ui/DummyWindowManager.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/ui/UiContext.h b/src/openrct2/ui/UiContext.h index 3dfe29b190f0..1f4feed2e925 100644 --- a/src/openrct2/ui/UiContext.h +++ b/src/openrct2/ui/UiContext.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -18,7 +18,6 @@ #include struct ScreenCoordsXY; -struct RenderTarget; struct ITitleSequencePlayer; namespace OpenRCT2 @@ -27,9 +26,9 @@ namespace OpenRCT2 { struct IDrawingEngineFactory; struct IWeatherDrawer; + struct RenderTarget; using DrawWeatherFunc = void (*)( - RenderTarget& rt, OpenRCT2::Drawing::IWeatherDrawer* weatherDrawer, int32_t left, int32_t top, int32_t width, - int32_t height); + RenderTarget& rt, IWeatherDrawer* weatherDrawer, int32_t left, int32_t top, int32_t width, int32_t height); } // namespace Drawing namespace Ui @@ -106,7 +105,7 @@ namespace OpenRCT2 virtual void InitialiseScriptExtensions() = 0; virtual void Tick() = 0; - virtual void Draw(RenderTarget& rt) = 0; + virtual void Draw(Drawing::RenderTarget& rt) = 0; // Window virtual void CreateWindow() = 0; @@ -156,7 +155,7 @@ namespace OpenRCT2 // Drawing [[nodiscard]] virtual std::shared_ptr GetDrawingEngineFactory() = 0; virtual void DrawWeatherAnimation( - OpenRCT2::Drawing::IWeatherDrawer* weatherDrawer, RenderTarget& rt, OpenRCT2::Drawing::DrawWeatherFunc drawFunc) + Drawing::IWeatherDrawer* weatherDrawer, Drawing::RenderTarget& rt, Drawing::DrawWeatherFunc drawFunc) = 0; // Text input diff --git a/src/openrct2/ui/WindowManager.h b/src/openrct2/ui/WindowManager.h index 1bd9d6f46cba..acec8e38e380 100644 --- a/src/openrct2/ui/WindowManager.h +++ b/src/openrct2/ui/WindowManager.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/util/Util.cpp b/src/openrct2/util/Util.cpp index 9653fcaf6d68..e989e4b07749 100644 --- a/src/openrct2/util/Util.cpp +++ b/src/openrct2/util/Util.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/util/Util.h b/src/openrct2/util/Util.h index 93a942d91676..61438e0c3d4e 100644 --- a/src/openrct2/util/Util.h +++ b/src/openrct2/util/Util.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/windows/Intent.cpp b/src/openrct2/windows/Intent.cpp index 9e7d9e3ca112..3db105abc08a 100644 --- a/src/openrct2/windows/Intent.cpp +++ b/src/openrct2/windows/Intent.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/windows/Intent.h b/src/openrct2/windows/Intent.h index bf7c14e4eb6f..e1f62d1d081f 100644 --- a/src/openrct2/windows/Intent.h +++ b/src/openrct2/windows/Intent.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/windows/TileInspectorGlobals.h b/src/openrct2/windows/TileInspectorGlobals.h index f6ac60f759df..396ed69812a3 100644 --- a/src/openrct2/windows/TileInspectorGlobals.h +++ b/src/openrct2/windows/TileInspectorGlobals.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/Banner.cpp b/src/openrct2/world/Banner.cpp index 8975b23c236b..aeec4dc64895 100644 --- a/src/openrct2/world/Banner.cpp +++ b/src/openrct2/world/Banner.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -389,7 +389,7 @@ void UnlinkAllBannersForRide(RideId rideId) auto& gameState = getGameState(); for (auto& banner : gameState.banners) { - if (!banner.isNull() && (banner.flags.has(BannerFlag::linkedToRide)) && banner.rideIndex == rideId) + if (!banner.isNull() && banner.flags.has(BannerFlag::linkedToRide) && banner.rideIndex == rideId) { banner.flags.unset(BannerFlag::linkedToRide); banner.rideIndex = RideId::GetNull(); @@ -442,7 +442,7 @@ Banner* CreateBanner() banner->type = 0; banner->text = {}; banner->colour = COLOUR_WHITE; - banner->textColour = TextColour::white; + banner->textColour = Drawing::TextColour::white; } return banner; } diff --git a/src/openrct2/world/Banner.h b/src/openrct2/world/Banner.h index 6cc15423928f..99b8069626bf 100644 --- a/src/openrct2/world/Banner.h +++ b/src/openrct2/world/Banner.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -28,8 +28,6 @@ namespace OpenRCT2 constexpr OpenRCT2::ObjectEntryIndex kBannerNull = OpenRCT2::kObjectEntryIndexNull; constexpr size_t kMaxBanners = 8192; -constexpr uint8_t kScrollingModeNone = 255; - enum class BannerFlag : uint8_t { noEntry = 0, @@ -48,7 +46,7 @@ struct Banner mutable std::string formattedTextBuffer; uint8_t colour{}; RideId rideIndex{}; - OpenRCT2::TextColour textColour{}; + OpenRCT2::Drawing::TextColour textColour{}; TileCoordsXY position; bool isNull() const diff --git a/src/openrct2/world/Climate.cpp b/src/openrct2/world/Climate.cpp index 11ed1c07cd2f..0dfe3c7c048e 100644 --- a/src/openrct2/world/Climate.cpp +++ b/src/openrct2/world/Climate.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,6 +19,7 @@ #include "../audio/AudioMixer.h" #include "../config/Config.h" #include "../core/EnumUtils.hpp" +#include "../drawing/Drawing.h" #include "../object/ClimateObject.h" #include "../object/ObjectManager.h" #include "../profiling/Profiling.h" @@ -30,6 +31,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Drawing; using namespace OpenRCT2::Audio; struct WeatherTrait diff --git a/src/openrct2/world/Climate.h b/src/openrct2/world/Climate.h index 7b93fa5dc6dc..e8d987a85511 100644 --- a/src/openrct2/world/Climate.h +++ b/src/openrct2/world/Climate.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -85,7 +85,10 @@ void ClimateUpdateSound(); void ClimateStopWeatherSound(); void ClimateForceWeather(WeatherType weather); -enum class FilterPaletteID : int32_t; +namespace OpenRCT2::Drawing +{ + enum class FilterPaletteID : int32_t; +} bool ClimateIsRaining(); bool ClimateTransitioningToSnow(); @@ -94,5 +97,5 @@ bool ClimateIsSnowingHeavily(); bool ClimateIsPrecipitating(); bool WeatherIsDry(WeatherType); bool ClimateHasWeatherEffect(); -FilterPaletteID ClimateGetWeatherGloomPaletteId(const WeatherState& state); +OpenRCT2::Drawing::FilterPaletteID ClimateGetWeatherGloomPaletteId(const WeatherState& state); uint32_t ClimateGetWeatherSpriteId(const WeatherType weatherType); diff --git a/src/openrct2/world/ConstructionClearance.cpp b/src/openrct2/world/ConstructionClearance.cpp index bafe549d3f9b..e373165e38b7 100644 --- a/src/openrct2/world/ConstructionClearance.cpp +++ b/src/openrct2/world/ConstructionClearance.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -34,15 +34,17 @@ #include "tile_element/WallElement.h" using namespace OpenRCT2; +using OpenRCT2::GameActions::CommandFlag; +using OpenRCT2::GameActions::CommandFlags; -static int32_t MapPlaceClearFunc( - TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price, bool is_scenery) +static bool MapPlaceClearFunc( + TileElement** tile_element, const CoordsXY& coords, CommandFlags flags, money64* price, bool is_scenery) { if ((*tile_element)->GetType() != TileElementType::SmallScenery) - return 1; + return false; - if (is_scenery && !(flags & GAME_COMMAND_FLAG_TRACK_DESIGN)) - return 1; + if (is_scenery && !flags.has(CommandFlag::trackDesign)) + return false; auto* scenery = (*tile_element)->AsSmallScenery()->GetEntry(); @@ -50,31 +52,31 @@ static int32_t MapPlaceClearFunc( if (park.flags & PARK_FLAGS_FORBID_TREE_REMOVAL) { if (scenery != nullptr && scenery->HasFlag(SMALL_SCENERY_FLAG_IS_TREE)) - return 1; + return false; } if (!(park.flags & PARK_FLAGS_NO_MONEY) && scenery != nullptr) *price += scenery->removal_price; - if (flags & GAME_COMMAND_FLAG_GHOST) - return 0; + if (flags.has(CommandFlag::ghost)) + return true; - if (!(flags & GAME_COMMAND_FLAG_APPLY)) - return 0; + if (!flags.has(CommandFlag::apply)) + return true; MapInvalidateTile({ coords, (*tile_element)->GetBaseZ(), (*tile_element)->GetClearanceZ() }); TileElementRemove(*tile_element); (*tile_element)--; - return 0; + return true; } /** * * rct2: 0x006E0D6E, 0x006B8D88 */ -int32_t MapPlaceSceneryClearFunc(TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price) +bool MapPlaceSceneryClearFunc(TileElement** tile_element, const CoordsXY& coords, CommandFlags flags, money64* price) { return MapPlaceClearFunc(tile_element, coords, flags, price, /*is_scenery=*/true); } @@ -83,42 +85,58 @@ int32_t MapPlaceSceneryClearFunc(TileElement** tile_element, const CoordsXY& coo * * rct2: 0x006C5A4F, 0x006CDE57, 0x006A6733, 0x0066637E */ -int32_t MapPlaceNonSceneryClearFunc(TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price) +bool MapPlaceNonSceneryClearFunc(TileElement** tile_element, const CoordsXY& coords, CommandFlags flags, money64* price) { return MapPlaceClearFunc(tile_element, coords, flags, price, /*is_scenery=*/false); } +static bool landSlopeFitsUnderTrack(int32_t baseZ, uint8_t slope, const TrackElement& trackElement) +{ + const auto [slopeNorthZ, slopeEastZ, slopeSouthZ, slopeWestZ] = GetSlopeCornerHeights(baseZ, slope); + + const TrackElemType trackElemType = trackElement.GetTrackType(); + const auto& ted = OpenRCT2::TrackMetaData::GetTrackElementDescriptor(trackElemType); + const uint8_t sequenceIndex = trackElemType == TrackElemType::maze ? 0 : trackElement.GetSequenceIndex(); + const auto& trackClearances = ted.sequences[sequenceIndex].clearance; + const auto trackQuarters = trackClearances.quarterTile.Rotate(trackElement.GetDirection()); + const auto trackQuarterHeights = trackQuarters.GetQuarterHeights(trackElement.GetBaseZ()); + const uint8_t trackOccupiedQuarters = trackQuarters.GetBaseQuarterOccupied(); + + if ((!(trackOccupiedQuarters & 0b0001) || slopeNorthZ <= trackQuarterHeights.north) + && (!(trackOccupiedQuarters & 0b0010) || slopeEastZ <= trackQuarterHeights.east) + && (!(trackOccupiedQuarters & 0b0100) || slopeSouthZ <= trackQuarterHeights.south) + && (!(trackOccupiedQuarters & 0b1000) || slopeWestZ <= trackQuarterHeights.west)) + { + return true; + } + + return false; +} + +static bool landSlopeFitsUnderPath(int32_t baseZ, uint8_t slope, const PathElement& pathElement) +{ + const auto slopeCornerHeights = GetSlopeCornerHeights(baseZ, slope); + + const uint8_t pathSlope = Numerics::rol4(kTileSlopeSWSideUp, pathElement.GetSlopeDirection()); + const auto pathCornerHeights = GetSlopeCornerHeights(pathElement.GetBaseZ(), pathSlope); + + return (slopeCornerHeights <= pathCornerHeights); +} + static bool MapLoc68BABCShouldContinue( - TileElement** tileElementPtr, const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, const uint8_t flags, money64& price, - const CreateCrossingMode crossingMode, const bool canBuildCrossing, const uint8_t slope) + TileElement** tileElementPtr, const CoordsXYRangedZ& pos, ClearingFunction clearFunc, const CommandFlags flags, + money64& price, const CreateCrossingMode crossingMode, const bool canBuildCrossing, const uint8_t slope) { - if (clearFunc != nullptr) + if (clearFunc(tileElementPtr, pos, flags, &price)) { - if (!clearFunc(tileElementPtr, pos, flags, &price)) - { - return true; - } + return true; } const TileElement* const tileElement = *tileElementPtr; if (slope != kTileSlopeFlat && tileElement->GetType() == TileElementType::Track) { - const auto [slopeNorthZ, slopeEastZ, slopeSouthZ, slopeWestZ] = GetSlopeCornerHeights(pos.baseZ, slope); - - const TrackElement* const trackElement = tileElement->AsTrack(); - const TrackElemType trackElemType = trackElement->GetTrackType(); - const auto& ted = OpenRCT2::TrackMetaData::GetTrackElementDescriptor(trackElemType); - const uint8_t sequenceIndex = trackElemType == TrackElemType::Maze ? 0 : trackElement->GetSequenceIndex(); - const auto& trackClearances = ted.sequences[sequenceIndex].clearance; - const auto trackQuarters = trackClearances.quarterTile.Rotate(trackElement->GetDirection()); - const auto trackQuarterHeights = trackQuarters.GetQuarterHeights(trackElement->GetBaseZ()); - const uint8_t trackOccupiedQuarters = trackQuarters.GetBaseQuarterOccupied(); - - if ((!(trackOccupiedQuarters & 0b0001) || slopeNorthZ <= trackQuarterHeights.north) - && (!(trackOccupiedQuarters & 0b0010) || slopeEastZ <= trackQuarterHeights.east) - && (!(trackOccupiedQuarters & 0b0100) || slopeSouthZ <= trackQuarterHeights.south) - && (!(trackOccupiedQuarters & 0b1000) || slopeWestZ <= trackQuarterHeights.west)) + if (landSlopeFitsUnderTrack(pos.baseZ, slope, *tileElement->AsTrack())) { return true; } @@ -126,13 +144,7 @@ static bool MapLoc68BABCShouldContinue( if (slope != kTileSlopeFlat && tileElement->GetType() == TileElementType::Path && tileElement->AsPath()->IsSloped()) { - const auto slopeCornerHeights = GetSlopeCornerHeights(pos.baseZ, slope); - - const PathElement& pathElement = *tileElement->AsPath(); - const uint8_t pathSlope = Numerics::rol4(kTileSlopeSWSideUp, pathElement.GetSlopeDirection()); - const auto pathCornerHeights = GetSlopeCornerHeights(pathElement.GetBaseZ(), pathSlope); - - if (slopeCornerHeights <= pathCornerHeights) + if (landSlopeFitsUnderPath(pos.baseZ, slope, *tileElement->AsPath())) { return true; } @@ -146,7 +158,7 @@ static bool MapLoc68BABCShouldContinue( else if ( crossingMode == CreateCrossingMode::pathOverTrack && canBuildCrossing && tileElement->GetType() == TileElementType::Track && tileElement->GetBaseZ() == pos.baseZ - && tileElement->AsTrack()->GetTrackType() == TrackElemType::Flat) + && tileElement->AsTrack()->GetTrackType() == TrackElemType::flat) { auto ride = GetRide(tileElement->AsTrack()->GetRideIndex()); if (ride != nullptr && ride->getRideTypeDescriptor().HasFlag(RtdFlag::supportsLevelCrossings)) @@ -169,33 +181,33 @@ static bool MapLoc68BABCShouldContinue( * bl = bl */ GameActions::Result MapCanConstructWithClearAt( - const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, const QuarterTile quarterTile, const uint8_t flags, const uint8_t slope, - const CreateCrossingMode crossingMode, const bool isTree) + const CoordsXYRangedZ& pos, ClearingFunction clearFunc, const QuarterTile quarterTile, const CommandFlags flags, + const uint8_t slope, const CreateCrossingMode crossingMode, const bool isTree) { auto res = GameActions::Result(); uint8_t groundFlags = ELEMENT_IS_ABOVE_GROUND; - res.SetData(ConstructClearResult{ groundFlags }); + res.setData(ConstructClearResult{ groundFlags }); bool canBuildCrossing = false; if (MapIsEdge(pos)) { - res.Error = GameActions::Status::InvalidParameters; - res.ErrorMessage = STR_OFF_EDGE_OF_MAP; + res.error = GameActions::Status::invalidParameters; + res.errorMessage = STR_OFF_EDGE_OF_MAP; return res; } if (getGameState().cheats.disableClearanceChecks) { - res.SetData(ConstructClearResult{ groundFlags }); + res.setData(ConstructClearResult{ groundFlags }); return res; } TileElement* tileElement = MapGetFirstElementAt(pos); if (tileElement == nullptr) { - res.Error = GameActions::Status::Unknown; - res.ErrorMessage = kStringIdNone; + res.error = GameActions::Status::unknown; + res.errorMessage = kStringIdNone; return res; } @@ -209,13 +221,13 @@ GameActions::Result MapCanConstructWithClearAt( if (tileElement->GetOccupiedQuadrants() & (quarterTile.GetBaseQuarterOccupied())) { if (MapLoc68BABCShouldContinue( - &tileElement, pos, clearFunc, flags, res.Cost, crossingMode, canBuildCrossing, slope)) + &tileElement, pos, clearFunc, flags, res.cost, crossingMode, canBuildCrossing, slope)) { continue; } MapGetObstructionErrorText(tileElement, res); - res.Error = GameActions::Status::NoClearance; + res.error = GameActions::Status::noClearance; return res; } } @@ -228,10 +240,10 @@ GameActions::Result MapCanConstructWithClearAt( groundFlags |= ELEMENT_IS_UNDERWATER; if (waterHeight < pos.clearanceZ) { - if (clearFunc != nullptr && clearFunc(&tileElement, pos, flags, &res.Cost)) + if (!clearFunc(&tileElement, pos, flags, &res.cost)) { - res.Error = GameActions::Status::NoClearance; - res.ErrorMessage = STR_CANNOT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_WATER; + res.error = GameActions::Status::noClearance; + res.errorMessage = STR_CANNOT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_WATER; return res; } } @@ -243,8 +255,8 @@ GameActions::Result MapCanConstructWithClearAt( if (heightFromGround > (18 * kCoordsZStep)) { - res.Error = GameActions::Status::Disallowed; - res.ErrorMessage = STR_LOCAL_AUTHORITY_WONT_ALLOW_CONSTRUCTION_ABOVE_TREE_HEIGHT; + res.error = GameActions::Status::disallowed; + res.errorMessage = STR_LOCAL_AUTHORITY_WONT_ALLOW_CONSTRUCTION_ABOVE_TREE_HEIGHT; return res; } } @@ -280,26 +292,33 @@ GameActions::Result MapCanConstructWithClearAt( } if (MapLoc68BABCShouldContinue( - &tileElement, pos, clearFunc, flags, res.Cost, crossingMode, canBuildCrossing, slope)) + &tileElement, pos, clearFunc, flags, res.cost, crossingMode, canBuildCrossing, slope)) { continue; } MapGetObstructionErrorText(tileElement, res); - res.Error = GameActions::Status::NoClearance; + res.error = GameActions::Status::noClearance; return res; } } } while (!(tileElement++)->IsLastForTile()); - res.SetData(ConstructClearResult{ groundFlags }); + res.setData(ConstructClearResult{ groundFlags }); return res; } +static bool dummyClearFunc( + [[maybe_unused]] OpenRCT2::TileElement** tile_element, [[maybe_unused]] const CoordsXY& coords, + [[maybe_unused]] CommandFlags flags, [[maybe_unused]] money64* price) +{ + return false; +} + GameActions::Result MapCanConstructAt(const CoordsXYRangedZ& pos, QuarterTile bl) { - return MapCanConstructWithClearAt(pos, nullptr, bl, 0, kTileSlopeFlat); + return MapCanConstructWithClearAt(pos, dummyClearFunc, bl, {}, kTileSlopeFlat); } /** @@ -310,30 +329,30 @@ void MapGetObstructionErrorText(TileElement* tileElement, GameActions::Result& r { Ride* ride; - res.ErrorMessage = STR_OBJECT_IN_THE_WAY; + res.errorMessage = STR_OBJECT_IN_THE_WAY; switch (tileElement->GetType()) { case TileElementType::Surface: - res.ErrorMessage = STR_RAISE_OR_LOWER_LAND_FIRST; + res.errorMessage = STR_RAISE_OR_LOWER_LAND_FIRST; break; case TileElementType::Path: - res.ErrorMessage = STR_FOOTPATH_IN_THE_WAY; + res.errorMessage = STR_FOOTPATH_IN_THE_WAY; break; case TileElementType::Track: ride = GetRide(tileElement->AsTrack()->GetRideIndex()); if (ride != nullptr) { - res.ErrorMessage = STR_X_IN_THE_WAY; + res.errorMessage = STR_X_IN_THE_WAY; - Formatter ft(res.ErrorMessageArgs.data()); + Formatter ft(res.errorMessageArgs.data()); ride->formatNameTo(ft); } break; case TileElementType::SmallScenery: { auto* sceneryEntry = tileElement->AsSmallScenery()->GetEntry(); - res.ErrorMessage = STR_X_IN_THE_WAY; - auto ft = Formatter(res.ErrorMessageArgs.data()); + res.errorMessage = STR_X_IN_THE_WAY; + auto ft = Formatter(res.errorMessageArgs.data()); StringId stringId = sceneryEntry != nullptr ? sceneryEntry->name : static_cast(kStringIdEmpty); ft.Add(stringId); break; @@ -342,21 +361,21 @@ void MapGetObstructionErrorText(TileElement* tileElement, GameActions::Result& r switch (tileElement->AsEntrance()->GetEntranceType()) { case ENTRANCE_TYPE_RIDE_ENTRANCE: - res.ErrorMessage = STR_RIDE_ENTRANCE_IN_THE_WAY; + res.errorMessage = STR_RIDE_ENTRANCE_IN_THE_WAY; break; case ENTRANCE_TYPE_RIDE_EXIT: - res.ErrorMessage = STR_RIDE_EXIT_IN_THE_WAY; + res.errorMessage = STR_RIDE_EXIT_IN_THE_WAY; break; case ENTRANCE_TYPE_PARK_ENTRANCE: - res.ErrorMessage = STR_PARK_ENTRANCE_IN_THE_WAY; + res.errorMessage = STR_PARK_ENTRANCE_IN_THE_WAY; break; } break; case TileElementType::Wall: { auto* wallEntry = tileElement->AsWall()->GetEntry(); - res.ErrorMessage = STR_X_IN_THE_WAY; - auto ft = Formatter(res.ErrorMessageArgs.data()); + res.errorMessage = STR_X_IN_THE_WAY; + auto ft = Formatter(res.errorMessageArgs.data()); StringId stringId = wallEntry != nullptr ? wallEntry->name : static_cast(kStringIdEmpty); ft.Add(stringId); break; @@ -364,8 +383,8 @@ void MapGetObstructionErrorText(TileElement* tileElement, GameActions::Result& r case TileElementType::LargeScenery: { auto* sceneryEntry = tileElement->AsLargeScenery()->GetEntry(); - res.ErrorMessage = STR_X_IN_THE_WAY; - auto ft = Formatter(res.ErrorMessageArgs.data()); + res.errorMessage = STR_X_IN_THE_WAY; + auto ft = Formatter(res.errorMessageArgs.data()); StringId stringId = sceneryEntry != nullptr ? sceneryEntry->name : static_cast(kStringIdEmpty); ft.Add(stringId); break; diff --git a/src/openrct2/world/ConstructionClearance.h b/src/openrct2/world/ConstructionClearance.h index 78e907d31ad6..4e30ae823006 100644 --- a/src/openrct2/world/ConstructionClearance.h +++ b/src/openrct2/world/ConstructionClearance.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -9,6 +9,7 @@ #pragma once +#include "../actions/CommandFlag.h" #include "../actions/GameActionResult.h" #include "Location.hpp" @@ -23,7 +24,8 @@ struct CoordsXY; struct CoordsXYRangedZ; class QuarterTile; -using CLEAR_FUNC = int32_t (*)(OpenRCT2::TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price); +using ClearingFunction = bool (&)( + OpenRCT2::TileElement** tile_element, const CoordsXY& coords, OpenRCT2::GameActions::CommandFlags flags, money64* price); enum { @@ -42,9 +44,10 @@ enum class CreateCrossingMode pathOverTrack, }; -int32_t MapPlaceNonSceneryClearFunc( - OpenRCT2::TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price); -int32_t MapPlaceSceneryClearFunc(OpenRCT2::TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price); +bool MapPlaceNonSceneryClearFunc( + OpenRCT2::TileElement** tile_element, const CoordsXY& coords, OpenRCT2::GameActions::CommandFlags flags, money64* price); +bool MapPlaceSceneryClearFunc( + OpenRCT2::TileElement** tile_element, const CoordsXY& coords, OpenRCT2::GameActions::CommandFlags flags, money64* price); struct ConstructClearResult { @@ -52,8 +55,8 @@ struct ConstructClearResult }; [[nodiscard]] OpenRCT2::GameActions::Result MapCanConstructWithClearAt( - const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, QuarterTile quarterTile, uint8_t flags, uint8_t slope, - CreateCrossingMode crossingMode = CreateCrossingMode::none, bool isTree = false); + const CoordsXYRangedZ& pos, ClearingFunction clearFunc, QuarterTile quarterTile, OpenRCT2::GameActions::CommandFlags flags, + uint8_t slope, CreateCrossingMode crossingMode = CreateCrossingMode::none, bool isTree = false); [[nodiscard]] OpenRCT2::GameActions::Result MapCanConstructAt(const CoordsXYRangedZ& pos, QuarterTile bl); diff --git a/src/openrct2/world/Entrance.cpp b/src/openrct2/world/Entrance.cpp index 89b72bfd30c9..9a7a0acdfdd6 100644 --- a/src/openrct2/world/Entrance.cpp +++ b/src/openrct2/world/Entrance.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -34,6 +34,7 @@ #include "tile_element/TrackElement.h" using namespace OpenRCT2; +using OpenRCT2::GameActions::CommandFlag; bool gParkEntranceGhostExists = false; CoordsXYZD gParkEntranceGhostPosition = { 0, 0, 0, 0 }; @@ -46,10 +47,10 @@ static money64 RideEntranceExitPlaceGhost( { auto rideEntranceExitPlaceAction = GameActions::RideEntranceExitPlaceAction( entranceExitCoords, direction, rideIndex, stationNum, placeType == ENTRANCE_TYPE_RIDE_EXIT); - rideEntranceExitPlaceAction.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_GHOST); + rideEntranceExitPlaceAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::ghost }); auto res = GameActions::Execute(&rideEntranceExitPlaceAction, getGameState()); - return res.Error == GameActions::Status::Ok ? res.Cost : kMoney64Undefined; + return res.error == GameActions::Status::ok ? res.cost : kMoney64Undefined; } /** @@ -62,7 +63,7 @@ void ParkEntranceRemoveGhost() { gParkEntranceGhostExists = false; auto parkEntranceRemoveAction = GameActions::ParkEntranceRemoveAction(gParkEntranceGhostPosition); - parkEntranceRemoveAction.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + parkEntranceRemoveAction.SetFlags({ CommandFlag::ghost, CommandFlag::allowDuringPaused }); GameActions::Execute(&parkEntranceRemoveAction, getGameState()); } } @@ -104,7 +105,7 @@ void RideEntranceExitRemoveGhost() gRideEntranceExitGhostPosition, _currentRideIndex, gRideEntranceExitGhostStationIndex, gRideEntranceExitPlaceType == ENTRANCE_TYPE_RIDE_EXIT); - rideEntranceExitRemove.SetFlags(GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + rideEntranceExitRemove.SetFlags({ CommandFlag::ghost, CommandFlag::allowDuringPaused }); GameActions::Execute(&rideEntranceExitRemove, getGameState()); } } @@ -152,7 +153,7 @@ void MazeEntranceHedgeReplacement(const CoordsXYE& entrance) continue; if (tileElement->GetBaseZ() != z) continue; - if (tileElement->AsTrack()->GetTrackType() != TrackElemType::Maze) + if (tileElement->AsTrack()->GetTrackType() != TrackElemType::maze) continue; // Each maze element is split into 4 sections with 4 different walls @@ -189,7 +190,7 @@ void MazeEntranceHedgeRemoval(const CoordsXYE& entrance) continue; if (tileElement->GetBaseZ() != z) continue; - if (tileElement->AsTrack()->GetTrackType() != TrackElemType::Maze) + if (tileElement->AsTrack()->GetTrackType() != TrackElemType::maze) continue; // Each maze element is split into 4 sections with 4 different walls diff --git a/src/openrct2/world/Entrance.h b/src/openrct2/world/Entrance.h index c3e1f20e92a8..4aaa57164185 100644 --- a/src/openrct2/world/Entrance.h +++ b/src/openrct2/world/Entrance.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/Footpath.cpp b/src/openrct2/world/Footpath.cpp index 8b8110a0a3de..18da69199fc2 100644 --- a/src/openrct2/world/Footpath.cpp +++ b/src/openrct2/world/Footpath.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -49,6 +49,8 @@ using namespace OpenRCT2; using namespace OpenRCT2::TrackMetaData; +using OpenRCT2::GameActions::CommandFlag; +using OpenRCT2::GameActions::CommandFlags; void FootpathUpdateQueueEntranceBanner(const CoordsXY& footpathPos, TileElement* tileElement); @@ -480,7 +482,7 @@ static void Loc6A6FD2(const CoordsXYZ& initialTileElementPos, int32_t direction, static void Loc6A6F1F( const CoordsXYZ& initialTileElementPos, int32_t direction, TileElement* tileElement, TileElement* initialTileElement, - const CoordsXY& targetPos, int32_t flags, bool query, FootpathNeighbourList* neighbourList) + const CoordsXY& targetPos, CommandFlags flags, bool query, FootpathNeighbourList* neighbourList) { if (query) { @@ -516,14 +518,15 @@ static void Loc6A6F1F( } else { - FootpathDisconnectQueueFromPath(targetPos, tileElement, 1 + ((flags >> 6) & 1)); + const bool isGhost = flags.has(CommandFlag::ghost); + FootpathDisconnectQueueFromPath(targetPos, tileElement, isGhost ? 2 : 1); tileElement->AsPath()->SetEdges(tileElement->AsPath()->GetEdges() | (1 << DirectionReverse(direction))); if (tileElement->AsPath()->IsQueue()) { FootpathQueueChainPush(tileElement->AsPath()->GetRideIndex()); } } - if (!(flags & (GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED))) + if (!flags.hasAny(CommandFlag::ghost, CommandFlag::allowDuringPaused)) { FootpathInterruptPeeps({ targetPos, tileElement->GetBaseZ() }); } @@ -532,7 +535,7 @@ static void Loc6A6F1F( } static void Loc6A6D7E( - const CoordsXYZ& initialTileElementPos, int32_t direction, TileElement* initialTileElement, int32_t flags, bool query, + const CoordsXYZ& initialTileElementPos, int32_t direction, TileElement* initialTileElement, CommandFlags flags, bool query, FootpathNeighbourList* neighbourList) { auto targetPos = CoordsXY{ initialTileElementPos } + CoordsDirectionDelta[direction]; @@ -593,13 +596,13 @@ static void Loc6A6D7E( const auto trackType = tileElement->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElement->AsTrack()->GetSequenceIndex(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.sequences[trackSequence].flags & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) + if (!ted.sequences[trackSequence].flags.has(SequenceFlag::connectsToPath)) { return; } uint16_t dx = DirectionReverse((direction - tileElement->GetDirection()) & kTileElementDirectionMask); - - if (!(ted.sequences[trackSequence].flags & (1 << dx))) + auto connectionSides = ted.sequences[trackSequence].getEntranceConnectionSides(); + if (!(connectionSides & (1 << dx))) { return; } @@ -660,7 +663,7 @@ static void Loc6A6D7E( // TODO: Change this into a simple check that validates if the direction should be fully checked with Loc6A6D7E and move the // calling of Loc6A6D7E into the parent function. static void Loc6A6C85( - const CoordsXYE& tileElementPos, int32_t direction, int32_t flags, bool query, FootpathNeighbourList* neighbourList) + const CoordsXYE& tileElementPos, int32_t direction, CommandFlags flags, bool query, FootpathNeighbourList* neighbourList) { if (query && WallInTheWay( @@ -692,12 +695,13 @@ static void Loc6A6C85( const auto trackType = tileElementPos.element->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElementPos.element->AsTrack()->GetSequenceIndex(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.sequences[trackSequence].flags & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) + if (!ted.sequences[trackSequence].flags.has(SequenceFlag::connectsToPath)) { return; } uint16_t dx = (direction - tileElementPos.element->GetDirection()) & kTileElementDirectionMask; - if (!(ted.sequences[trackSequence].flags & (1 << dx))) + auto connectionSides = ted.sequences[trackSequence].getEntranceConnectionSides(); + if (!(connectionSides & (1 << dx))) { return; } @@ -726,7 +730,7 @@ static void Loc6A6C85( * * rct2: 0x006A6C66 */ -void FootpathConnectEdges(const CoordsXY& footpathPos, TileElement* tileElement, int32_t flags) +void FootpathConnectEdges(const CoordsXY& footpathPos, TileElement* tileElement, CommandFlags flags) { FootpathNeighbourList neighbourList; FootpathNeighbour neighbour; @@ -968,6 +972,51 @@ void FootpathUpdateQueueChains() } } +int32_t FootpathQueueCountConnections(const CoordsXY& position, const PathElement& pathElement) +{ + int32_t connectionCount = 0; + for (const Direction direction : kAllDirections) + { + const uint8_t edge = 1 << direction; + if (pathElement.GetEdges() & edge) + { + const CoordsXY adjacentPathPosition = position + CoordsDirectionDelta[direction]; + const int32_t z = pathElement.GetBaseZ(); + const TileElement* tileElement = FootpathGetElement({ adjacentPathPosition, z, z + kLandHeightStep }, direction); + + if (tileElement == nullptr) + { + tileElement = FootpathGetElement({ adjacentPathPosition, z - kLandHeightStep, z }, direction); + + if (tileElement == nullptr) + { + const EntranceElement* entrance = MapGetRideEntranceElementAt(CoordsXYZ{ adjacentPathPosition, z }, true); + if (entrance == nullptr) + { + entrance = MapGetRideEntranceElementAt(CoordsXYZ{ adjacentPathPosition, z + kLandHeightStep }, true); + if (entrance == nullptr) + continue; + } + + if (entrance_has_direction(*entrance, direction + entrance->GetDirection())) + { + connectionCount++; + } + continue; + } + } + + const PathElement& adjacentPath = *tileElement->AsPath(); + + if (adjacentPath.GetEdges() & Numerics::rol4(edge, 2)) + { + connectionCount++; + } + } + } + return connectionCount; +} + /** * * rct2: 0x0069ADBD @@ -1003,7 +1052,7 @@ static void FootpathFixOwnership(const CoordsXY& mapPos) auto landSetRightsAction = GameActions::LandSetRightsAction( mapPos, GameActions::LandSetRightSetting::SetOwnershipWithChecks, ownership); - landSetRightsAction.SetFlags(GAME_COMMAND_FLAG_NO_SPEND); + landSetRightsAction.SetFlags({ CommandFlag::noSpend }); GameActions::Execute(&landSetRightsAction, getGameState()); } @@ -1656,10 +1705,11 @@ bool TileElementWantsPathConnectionTowards(const TileCoordsXYZD& coords, const T const auto trackType = tileElement->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElement->AsTrack()->GetSequenceIndex(); const auto& ted = GetTrackElementDescriptor(trackType); - if (ted.sequences[trackSequence].flags & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) + if (ted.sequences[trackSequence].flags.has(SequenceFlag::connectsToPath)) { uint16_t dx = ((coords.direction - tileElement->GetDirection()) & kTileElementDirectionMask); - if (ted.sequences[trackSequence].flags & (1 << dx)) + auto connectionSides = ted.sequences[trackSequence].getEntranceConnectionSides(); + if (connectionSides & (1 << dx)) { // Track element has the flags required for the given direction return true; @@ -1685,49 +1735,6 @@ bool TileElementWantsPathConnectionTowards(const TileCoordsXYZD& coords, const T return false; } -// fix up the corners around the given path element that gets removed -static void FootpathFixCornersAround(const TileCoordsXY& footpathPos, TileElement* pathElement) -{ - // A mask for the paths' corners of each possible neighbour - static constexpr uint8_t cornersTouchingTile[3][3] = { - { 0b0010, 0b0011, 0b0001 }, - { 0b0110, 0b0000, 0b1001 }, - { 0b0100, 0b1100, 0b1000 }, - }; - - // Sloped paths don't create filled corners, so no need to remove any - if (pathElement->GetType() == TileElementType::Path && pathElement->AsPath()->IsSloped()) - return; - - for (int32_t xOffset = -1; xOffset <= 1; xOffset++) - { - for (int32_t yOffset = -1; yOffset <= 1; yOffset++) - { - // Skip self - if (xOffset == 0 && yOffset == 0) - continue; - - TileElement* tileElement = MapGetFirstElementAt( - TileCoordsXY{ footpathPos.x + xOffset, footpathPos.y + yOffset }.ToCoordsXY()); - if (tileElement == nullptr) - continue; - do - { - if (tileElement->GetType() != TileElementType::Path) - continue; - if (tileElement->AsPath()->IsSloped()) - continue; - if (tileElement->BaseHeight != pathElement->BaseHeight) - continue; - - const int32_t ix = xOffset + 1; - const int32_t iy = yOffset + 1; - tileElement->AsPath()->SetCorners(tileElement->AsPath()->GetCorners() & ~(cornersTouchingTile[iy][ix])); - } while (!(tileElement++)->IsLastForTile()); - } - } -} - /** * * rct2: 0x006A6AA7 @@ -1749,7 +1756,6 @@ void FootpathRemoveEdgesAt(const CoordsXY& footpathPos, TileElement* tileElement FootpathUpdateQueueEntranceBanner(footpathPos, tileElement); - bool fixCorners = false; for (uint8_t direction = 0; direction < kNumOrthogonalDirections; direction++) { int32_t z1 = tileElement->BaseHeight; @@ -1777,18 +1783,6 @@ void FootpathRemoveEdgesAt(const CoordsXY& footpathPos, TileElement* tileElement FootpathRemoveEdgesTowards( { footpathPos + CoordsDirectionDelta[direction], z0 * kCoordsZStep, z1 * kCoordsZStep }, direction, isQueue); } - else - { - // A footpath may stay connected, but its edges must be fixed later on when another edge does get removed. - fixCorners = true; - } - } - - // Only fix corners when needed, to avoid changing corners that have been set for its looks. - if (fixCorners && tileElement->IsGhost()) - { - auto tileFootpathPos = TileCoordsXY{ footpathPos }; - FootpathFixCornersAround(tileFootpathPos, tileElement); } if (tileElement->GetType() == TileElementType::Path) @@ -1873,7 +1867,7 @@ bool PathElement::IsLevelCrossing(const CoordsXY& coords) const return false; } - if (trackElement->GetTrackType() != TrackElemType::Flat) + if (trackElement->GetTrackType() != TrackElemType::flat) { return false; } diff --git a/src/openrct2/world/Footpath.h b/src/openrct2/world/Footpath.h index 9690d468f89b..1c93b5477b89 100644 --- a/src/openrct2/world/Footpath.h +++ b/src/openrct2/world/Footpath.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,7 +10,15 @@ #pragma once #include "../Identifiers.h" -#include "../object/Object.h" +#include "../actions/CommandFlag.h" +#include "../drawing/ImageIndexType.h" +#include "../drawing/ScrollingText.h" +#include "../interface/Colour.h" +#include "../localisation/StringIdType.h" +#include "../object/ObjectTypes.h" +#include "Location.hpp" + +#include namespace OpenRCT2 { @@ -30,30 +38,32 @@ constexpr auto kPathClearance = 4 * kCoordsZStep; enum class RailingEntrySupportType : uint8_t { - Box = 0, - Pole = 1, - Count + box = 0, + pole = 1, + count }; struct PathSurfaceDescriptor { - StringId Name; - uint32_t Image; - uint32_t PreviewImage; - uint8_t Flags; + StringId name = kStringIdNone; + ImageIndex image{}; + ImageIndex previewImage{}; + uint8_t flags{}; }; +constexpr PathSurfaceDescriptor kPathSurfaceDescriptorDummy{}; struct PathRailingsDescriptor { - StringId Name; - uint32_t PreviewImage; - uint32_t BridgeImage; - uint32_t RailingsImage; - RailingEntrySupportType SupportType; - colour_t SupportColour; - uint8_t Flags; - uint8_t ScrollingMode; + StringId name = kStringIdNone; + ImageIndex previewImage{}; + ImageIndex bridgeImage{}; + ImageIndex railingsImage{}; + RailingEntrySupportType supportType{}; + colour_t supportColour = COLOUR_NULL; + uint8_t flags{}; + uint8_t scrollingMode = kScrollingModeNone; }; +constexpr PathRailingsDescriptor kPathRailingsDescriptorDummy{}; using PathConstructFlags = uint8_t; namespace OpenRCT2::PathConstructFlag @@ -64,15 +74,15 @@ namespace OpenRCT2::PathConstructFlag struct FootpathSelection { - OpenRCT2::ObjectEntryIndex LegacyPath = OpenRCT2::kObjectEntryIndexNull; - OpenRCT2::ObjectEntryIndex NormalSurface = OpenRCT2::kObjectEntryIndexNull; - OpenRCT2::ObjectEntryIndex QueueSurface = OpenRCT2::kObjectEntryIndexNull; - OpenRCT2::ObjectEntryIndex Railings = OpenRCT2::kObjectEntryIndexNull; - bool IsQueueSelected{}; + OpenRCT2::ObjectEntryIndex legacyPath = OpenRCT2::kObjectEntryIndexNull; + OpenRCT2::ObjectEntryIndex normalSurface = OpenRCT2::kObjectEntryIndexNull; + OpenRCT2::ObjectEntryIndex queueSurface = OpenRCT2::kObjectEntryIndexNull; + OpenRCT2::ObjectEntryIndex railings = OpenRCT2::kObjectEntryIndexNull; + bool isQueueSelected{}; - OpenRCT2::ObjectEntryIndex GetSelectedSurface() const + OpenRCT2::ObjectEntryIndex getSelectedSurface() const { - return IsQueueSelected ? QueueSurface : NormalSurface; + return isQueueSelected ? queueSurface : normalSurface; } }; @@ -172,7 +182,8 @@ extern const std::array BenchUseOffsets; OpenRCT2::PathElement* MapGetFootpathElement(const CoordsXYZ& coords); void FootpathInterruptPeeps(const CoordsXYZ& footpathPos); void FootpathRemoveLitter(const CoordsXYZ& footpathPos); -void FootpathConnectEdges(const CoordsXY& footpathPos, OpenRCT2::TileElement* tileElement, int32_t flags); +void FootpathConnectEdges( + const CoordsXY& footpathPos, OpenRCT2::TileElement* tileElement, OpenRCT2::GameActions::CommandFlags flags); void FootpathUpdateQueueChains(); void FootpathChainRideQueue( RideId rideIndex, StationIndex entranceIndex, const CoordsXY& footpathPos, OpenRCT2::TileElement* tileElement, @@ -189,6 +200,7 @@ const OpenRCT2::FootpathRailingsObject* GetPathRailingsEntry(OpenRCT2::ObjectEnt void FootpathQueueChainReset(); void FootpathQueueChainPush(RideId rideIndex); +int32_t FootpathQueueCountConnections(const CoordsXY& position, const OpenRCT2::PathElement& pathElement); bool FootpathIsZAndDirectionValid(const OpenRCT2::PathElement& tileElement, int32_t currentZ, int32_t currentDirection); FootpathPlacementResult FootpathGetOnTerrainPlacement(const TileCoordsXY& location); diff --git a/src/openrct2/world/Location.hpp b/src/openrct2/world/Location.hpp index 1b12e2581fb5..02104bb37f04 100644 --- a/src/openrct2/world/Location.hpp +++ b/src/openrct2/world/Location.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 9048a28186ad..7a9df32179b3 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -1444,7 +1444,7 @@ void ClearElementAt(const CoordsXY& loc, TileElement** elementPtr) auto parkEntranceRemoveAction = GameActions::ParkEntranceRemoveAction(CoordsXYZ{ seqLoc, element->GetBaseZ() }); auto result = GameActions::ExecuteNested(&parkEntranceRemoveAction, gameState); // If asking nicely did not work, forcibly remove this to avoid an infinite loop. - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { TileElementRemove(element); } @@ -1456,7 +1456,7 @@ void ClearElementAt(const CoordsXY& loc, TileElement** elementPtr) auto wallRemoveAction = GameActions::WallRemoveAction(wallLocation); auto result = GameActions::ExecuteNested(&wallRemoveAction, gameState); // If asking nicely did not work, forcibly remove this to avoid an infinite loop. - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { TileElementRemove(element); } @@ -1468,7 +1468,7 @@ void ClearElementAt(const CoordsXY& loc, TileElement** elementPtr) { loc.x, loc.y, element->GetBaseZ(), element->GetDirection() }, element->AsLargeScenery()->GetSequenceIndex()); auto result = GameActions::ExecuteNested(&removeSceneryAction, gameState); // If asking nicely did not work, forcibly remove this to avoid an infinite loop. - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { TileElementRemove(element); } @@ -1480,7 +1480,7 @@ void ClearElementAt(const CoordsXY& loc, TileElement** elementPtr) { loc.x, loc.y, element->GetBaseZ(), element->AsBanner()->GetPosition() }); auto result = GameActions::ExecuteNested(&bannerRemoveAction, gameState); // If asking nicely did not work, forcibly remove this to avoid an infinite loop. - if (result.Error != GameActions::Status::Ok) + if (result.error != GameActions::Status::ok) { TileElementRemove(element); } diff --git a/src/openrct2/world/Map.h b/src/openrct2/world/Map.h index abedff9baf27..2b4eaea7c673 100644 --- a/src/openrct2/world/Map.h +++ b/src/openrct2/world/Map.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/MapAnimation.cpp b/src/openrct2/world/MapAnimation.cpp index 8784c1f1435f..ede9bd23a749 100644 --- a/src/openrct2/world/MapAnimation.cpp +++ b/src/openrct2/world/MapAnimation.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -209,20 +209,20 @@ static bool UpdateTrackAnimation(TrackElement& track, const CoordsXYZ& loc, cons { switch (track.GetTrackType()) { - case TrackElemType::Waterfall: + case TrackElemType::waterfall: if constexpr (invalidate) { Invalidate(viewport, loc.x, loc.y, baseZ + 14, baseZ + 46, kMaxZoom); } return true; - case TrackElemType::Rapids: - case TrackElemType::Whirlpool: + case TrackElemType::rapids: + case TrackElemType::whirlpool: if constexpr (invalidate) { Invalidate(viewport, loc.x, loc.y, baseZ + 14, baseZ + 18, kMaxZoom); } return true; - case TrackElemType::SpinningTunnel: + case TrackElemType::spinningTunnel: if constexpr (invalidate) { Invalidate(viewport, loc.x, loc.y, baseZ + 14, baseZ + 32, kMaxZoom); @@ -485,7 +485,7 @@ static bool UpdateTemporaryAnimation(const TemporaryMapAnimation& animation) case MapAnimations::TemporaryType::onRidePhoto: { if (tileElement->GetType() == TileElementType::Track && tileElement->BaseHeight == tileCoords.z - && tileElement->AsTrack()->GetTrackType() == TrackElemType::OnRidePhoto) + && tileElement->AsTrack()->GetTrackType() == TrackElemType::onRidePhoto) { isAnimating |= UpdateOnRidePhotoAnimation(*tileElement->AsTrack(), animation.location); } @@ -581,10 +581,10 @@ static std::optional IsElementAnimated(const TileElementBase& elemen const auto* const track = element.AsTrack(); switch (track->GetTrackType()) { - case TrackElemType::Waterfall: - case TrackElemType::Rapids: - case TrackElemType::Whirlpool: - case TrackElemType::SpinningTunnel: + case TrackElemType::waterfall: + case TrackElemType::rapids: + case TrackElemType::whirlpool: + case TrackElemType::spinningTunnel: return std::optional(UpdateType::invalidate); default: break; diff --git a/src/openrct2/world/MapAnimation.h b/src/openrct2/world/MapAnimation.h index e657266afd04..42416f212b76 100644 --- a/src/openrct2/world/MapAnimation.h +++ b/src/openrct2/world/MapAnimation.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/MapLimits.h b/src/openrct2/world/MapLimits.h index c903a1efac8f..fc7e36260442 100644 --- a/src/openrct2/world/MapLimits.h +++ b/src/openrct2/world/MapLimits.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/MapSelection.cpp b/src/openrct2/world/MapSelection.cpp index fa0138906f18..af6e0468adaf 100644 --- a/src/openrct2/world/MapSelection.cpp +++ b/src/openrct2/world/MapSelection.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -19,44 +19,15 @@ CoordsXY gMapSelectPositionB; CoordsXYZ gMapSelectArrowPosition; uint8_t gMapSelectArrowDirection; -std::vector gMapSelectionTiles; +static std::vector _mapSelectionTiles; +static bool _mapSelectionTilesInvalidate = false; -/** - * - * rct2: 0x0068AB1B - */ -void MapInvalidateMapSelectionTiles() -{ - if (!(gMapSelectFlags.has(MapSelectFlag::enableConstruct))) - return; - - for (const auto& position : gMapSelectionTiles) - MapInvalidateTileFull(position); -} - -/** - * - * rct2: 0x0068AAE1 - */ -void MapInvalidateSelectionRect() -{ - int32_t x0, y0, x1, y1, left, right, top, bottom; - - if (!(gMapSelectFlags.has(MapSelectFlag::enable))) - return; - - x0 = gMapSelectPositionA.x + 16; - y0 = gMapSelectPositionA.y + 16; - x1 = gMapSelectPositionB.x + 16; - y1 = gMapSelectPositionB.y + 16; - MapGetBoundingBox({ x0, y0, x1, y1 }, &left, &top, &right, &bottom); - left -= 32; - right += 32; - bottom += 32; - top -= 32 + 2080; - - OpenRCT2::ViewportsInvalidate({ { left, top }, { right, bottom } }); -} +static MapSelectFlags _previousMapSelectFlags; +static MapSelectType _previousMapSelectType; +static CoordsXY _previousMapSelectPositionA; +static CoordsXY _previousMapSelectPositionB; +static CoordsXYZ _previousMapSelectArrowPosition; +static uint8_t _previousMapSelectArrowDirection; MapRange getMapSelectRange() { @@ -74,3 +45,85 @@ void setMapSelectRange(const CoordsXY coords) { setMapSelectRange({ coords, coords }); } + +namespace OpenRCT2::MapSelection +{ + void clearSelectedTiles() + { + for (const CoordsXY& coords : _mapSelectionTiles) + { + MapInvalidateTileFull(coords); + } + _mapSelectionTiles.clear(); + _mapSelectionTilesInvalidate = false; + } + + void addSelectedTile(const CoordsXY& coords) + { + _mapSelectionTiles.push_back(coords); + _mapSelectionTilesInvalidate = true; + } + + const std::vector& getSelectedTiles() + { + return _mapSelectionTiles; + } + + void invalidate() + { + if (!_previousMapSelectFlags.has(MapSelectFlag::enable) && gMapSelectFlags.has(MapSelectFlag::enable)) + { + MapInvalidateRegion(gMapSelectPositionA, gMapSelectPositionB); + } + else if (_previousMapSelectFlags.has(MapSelectFlag::enable) && !gMapSelectFlags.has(MapSelectFlag::enable)) + { + MapInvalidateRegion(_previousMapSelectPositionA, _previousMapSelectPositionB); + } + else if ( + gMapSelectFlags.has(MapSelectFlag::enable) + && (_previousMapSelectPositionA != gMapSelectPositionA || _previousMapSelectPositionB != gMapSelectPositionB)) + { + MapInvalidateRegion(_previousMapSelectPositionA, _previousMapSelectPositionB); + MapInvalidateRegion(gMapSelectPositionA, gMapSelectPositionB); + } + else if (_previousMapSelectType != gMapSelectType) + { + MapInvalidateRegion(gMapSelectPositionA, gMapSelectPositionB); + } + + if (!_previousMapSelectFlags.has(MapSelectFlag::enableArrow) && gMapSelectFlags.has(MapSelectFlag::enableArrow)) + { + MapInvalidateTile({ gMapSelectArrowPosition, gMapSelectArrowPosition.z }); + } + else if (_previousMapSelectFlags.has(MapSelectFlag::enableArrow) && !gMapSelectFlags.has(MapSelectFlag::enableArrow)) + { + MapInvalidateTile({ _previousMapSelectArrowPosition, _previousMapSelectArrowPosition.z }); + } + else if (gMapSelectFlags.has(MapSelectFlag::enableArrow) && _previousMapSelectArrowPosition != gMapSelectArrowPosition) + { + MapInvalidateTile({ _previousMapSelectArrowPosition, _previousMapSelectArrowPosition.z }); + MapInvalidateTile({ gMapSelectArrowPosition, gMapSelectArrowPosition.z }); + } + else if (_previousMapSelectArrowDirection != gMapSelectArrowDirection) + { + MapInvalidateTile({ gMapSelectArrowPosition, gMapSelectArrowPosition.z }); + } + + if (_previousMapSelectFlags.has(MapSelectFlag::enableConstruct) != gMapSelectFlags.has(MapSelectFlag::enableConstruct) + || _mapSelectionTilesInvalidate) + { + for (const CoordsXY& coords : _mapSelectionTiles) + { + MapInvalidateTileFull(coords); + } + _mapSelectionTilesInvalidate = false; + } + + _previousMapSelectFlags = gMapSelectFlags; + _previousMapSelectType = gMapSelectType; + _previousMapSelectPositionA = gMapSelectPositionA; + _previousMapSelectPositionB = gMapSelectPositionB; + _previousMapSelectArrowPosition = gMapSelectArrowPosition; + _previousMapSelectArrowDirection = gMapSelectArrowDirection; + } +} // namespace OpenRCT2::MapSelection diff --git a/src/openrct2/world/MapSelection.h b/src/openrct2/world/MapSelection.h index 8899b8c76cdf..cc70b7d634da 100644 --- a/src/openrct2/world/MapSelection.h +++ b/src/openrct2/world/MapSelection.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -61,10 +61,15 @@ extern CoordsXY gMapSelectPositionB; extern CoordsXYZ gMapSelectArrowPosition; extern uint8_t gMapSelectArrowDirection; -extern std::vector gMapSelectionTiles; - -void MapInvalidateMapSelectionTiles(); -void MapInvalidateSelectionRect(); MapRange getMapSelectRange(); void setMapSelectRange(const MapRange& range); void setMapSelectRange(const CoordsXY coords); + +namespace OpenRCT2::MapSelection +{ + void clearSelectedTiles(); + void addSelectedTile(const CoordsXY& coords); + const std::vector& getSelectedTiles(); + + void invalidate(); +} // namespace OpenRCT2::MapSelection diff --git a/src/openrct2/world/Park.cpp b/src/openrct2/world/Park.cpp index c08c608924c5..90f7aded6c9a 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -511,10 +511,9 @@ namespace OpenRCT2::Park money64 CalculateCompanyValue(const ParkData& park) { - auto result = park.value - park.bankLoan; + money64 result = park.value - park.bankLoan; - // Clamp addition to prevent overflow - result = AddClamp(result, park.cash); + result = AddClamp(result, park.cash); return result; } diff --git a/src/openrct2/world/Park.h b/src/openrct2/world/Park.h index aab0ac117bf5..fc8062d69ac6 100644 --- a/src/openrct2/world/Park.h +++ b/src/openrct2/world/Park.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/ParkData.h b/src/openrct2/world/ParkData.h index 738e431ddc84..1503fe3750ab 100644 --- a/src/openrct2/world/ParkData.h +++ b/src/openrct2/world/ParkData.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/QuarterTile.cpp b/src/openrct2/world/QuarterTile.cpp index 03613ebc6a65..ca036a67d30c 100644 --- a/src/openrct2/world/QuarterTile.cpp +++ b/src/openrct2/world/QuarterTile.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/QuarterTile.h b/src/openrct2/world/QuarterTile.h index 44e1d2dc0200..72fcab2503fa 100644 --- a/src/openrct2/world/QuarterTile.h +++ b/src/openrct2/world/QuarterTile.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/Scenery.cpp b/src/openrct2/world/Scenery.cpp index 8e3b78ebfc96..5b736050582d 100644 --- a/src/openrct2/world/Scenery.cpp +++ b/src/openrct2/world/Scenery.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -59,6 +59,7 @@ int16_t gSceneryCtrlPressed; int16_t gSceneryCtrlPressZ; using namespace OpenRCT2; +using OpenRCT2::GameActions::CommandFlag; // rct2: 0x009A3E74 const CoordsXY SceneryQuadrantOffsets[] = { @@ -242,8 +243,7 @@ void SceneryRemoveGhostToolPlacement() auto removeSceneryAction = GameActions::SmallSceneryRemoveAction( gSceneryGhostPosition, gSceneryQuadrant, gSceneryPlaceObject.EntryIndex); - removeSceneryAction.SetFlags( - GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + removeSceneryAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); removeSceneryAction.Execute(gameState); } @@ -264,8 +264,7 @@ void SceneryRemoveGhostToolPlacement() continue; auto footpathAdditionRemoveAction = GameActions::FootpathAdditionRemoveAction(gSceneryGhostPosition); - footpathAdditionRemoveAction.SetFlags( - GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + footpathAdditionRemoveAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); GameActions::Execute(&footpathAdditionRemoveAction, gameState); break; } while (!(tileElement++)->IsLastForTile()); @@ -277,7 +276,7 @@ void SceneryRemoveGhostToolPlacement() CoordsXYZD wallLocation = { gSceneryGhostPosition, gSceneryGhostWallRotation }; auto wallRemoveAction = GameActions::WallRemoveAction(wallLocation); - wallRemoveAction.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + wallRemoveAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); wallRemoveAction.Execute(gameState); } @@ -286,8 +285,7 @@ void SceneryRemoveGhostToolPlacement() gSceneryGhostType &= ~SCENERY_GHOST_FLAG_3; auto removeSceneryAction = GameActions::LargeSceneryRemoveAction({ gSceneryGhostPosition, gSceneryPlaceRotation }, 0); - removeSceneryAction.SetFlags( - GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + removeSceneryAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); removeSceneryAction.Execute(gameState); } @@ -296,8 +294,7 @@ void SceneryRemoveGhostToolPlacement() gSceneryGhostType &= ~SCENERY_GHOST_FLAG_4; auto removeSceneryAction = GameActions::BannerRemoveAction({ gSceneryGhostPosition, gSceneryPlaceRotation }); - removeSceneryAction.SetFlags( - GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); + removeSceneryAction.SetFlags({ CommandFlag::allowDuringPaused, CommandFlag::noSpend, CommandFlag::ghost }); GameActions::Execute(&removeSceneryAction, gameState); } } diff --git a/src/openrct2/world/Scenery.h b/src/openrct2/world/Scenery.h index de4ec0ea4989..71af78286587 100644 --- a/src/openrct2/world/Scenery.h +++ b/src/openrct2/world/Scenery.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/ScenerySelection.h b/src/openrct2/world/ScenerySelection.h index 1a1984ab73b1..a7c7b6d678af 100644 --- a/src/openrct2/world/ScenerySelection.h +++ b/src/openrct2/world/ScenerySelection.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/SurfaceData.cpp b/src/openrct2/world/SurfaceData.cpp index f1c374164402..bd8433ef0f37 100644 --- a/src/openrct2/world/SurfaceData.cpp +++ b/src/openrct2/world/SurfaceData.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/SurfaceData.h b/src/openrct2/world/SurfaceData.h index 3f3dfae8cf53..e74c2d82c443 100644 --- a/src/openrct2/world/SurfaceData.h +++ b/src/openrct2/world/SurfaceData.h @@ -1,3 +1,12 @@ +/***************************************************************************** + * Copyright (c) 2014-2026 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + #pragma once #include diff --git a/src/openrct2/world/TileElementsView.h b/src/openrct2/world/TileElementsView.h index 662a6dcfd0e8..502ff41bbaef 100644 --- a/src/openrct2/world/TileElementsView.h +++ b/src/openrct2/world/TileElementsView.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/TileInspector.cpp b/src/openrct2/world/TileInspector.cpp index 7f7d5b568eaa..6875c5f6a7de 100644 --- a/src/openrct2/world/TileInspector.cpp +++ b/src/openrct2/world/TileInspector.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,7 @@ #include "../Diagnostic.h" #include "../actions/GameAction.h" +#include "../core/Guard.hpp" #include "../object/LargeSceneryEntry.h" #include "../ride/Station.h" #include "../ride/Track.h" @@ -53,19 +54,19 @@ namespace OpenRCT2::TileInspector { LOG_ERROR("First element is out of range for the tile"); return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); } if (secondElement == nullptr) { LOG_ERROR("Second element is out of range for the tile"); return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); } if (firstElement == secondElement) { LOG_ERROR("Can't swap the element with itself"); return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_CANT_SWAP_TILE_ELEMENT_WITH_ITSELF); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_CANT_SWAP_TILE_ELEMENT_WITH_ITSELF); } // Swap their memory @@ -145,7 +146,7 @@ namespace OpenRCT2::TileInspector TileElement* const tileElement = MapGetNthElementAt(loc, elementIndex); if (tileElement == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -187,7 +188,7 @@ namespace OpenRCT2::TileInspector if (isExecuting) { auto res = SwapTileElements(loc, first, second); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) { return res; } @@ -210,7 +211,7 @@ namespace OpenRCT2::TileInspector TileElement* const tileElement = MapGetNthElementAt(loc, elementIndex); if (tileElement == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -289,7 +290,7 @@ namespace OpenRCT2::TileInspector TileElement* const tileElement = MapGetNthElementAt(loc, elementIndex); if (tileElement == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); if (!isExecuting) { @@ -307,7 +308,7 @@ namespace OpenRCT2::TileInspector // Make sure there is enough space for the new element if (!MapCheckCapacityAndReorganise(loc)) { - return GameActions::Result(GameActions::Status::NoFreeElements, STR_CANT_PASTE, STR_TILE_ELEMENT_LIMIT_REACHED); + return GameActions::Result(GameActions::Status::noFreeElements, STR_CANT_PASTE, STR_TILE_ELEMENT_LIMIT_REACHED); } auto tileLoc = TileCoordsXY(loc); @@ -322,7 +323,7 @@ namespace OpenRCT2::TileInspector if (newBanner == nullptr) { LOG_ERROR("No free banners available"); - return GameActions::Result(GameActions::Status::Unknown, STR_TOO_MANY_BANNERS_IN_GAME, kStringIdNone); + return GameActions::Result(GameActions::Status::unknown, STR_TOO_MANY_BANNERS_IN_GAME, kStringIdNone); } auto newId = newBanner->id; // Copy the banners style @@ -375,7 +376,7 @@ namespace OpenRCT2::TileInspector const TileElement* const firstElement = MapGetFirstElementAt(loc); if (firstElement == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); // Count elements on tile int32_t numElement = 0; @@ -400,7 +401,7 @@ namespace OpenRCT2::TileInspector && otherElement->ClearanceHeight > currentElement->ClearanceHeight))) { auto res = SwapTileElements(loc, currentId - 1, currentId); - if (res.Error != GameActions::Status::Ok) + if (res.error != GameActions::Status::ok) { // don't return error here, we've already ran some actions // and moved things as far as we could, the only sensible @@ -430,19 +431,19 @@ namespace OpenRCT2::TileInspector int16_t newClearanceHeight = static_cast(tileElement->ClearanceHeight + heightOffset); if (newBaseHeight < 0) { - return GameActions::Result(GameActions::Status::TooLow, STR_CANT_LOWER_ELEMENT_HERE, STR_TOO_LOW); + return GameActions::Result(GameActions::Status::tooLow, STR_CANT_LOWER_ELEMENT_HERE, STR_TOO_LOW); } if (newBaseHeight > kMaxTileElementHeight) { - return GameActions::Result(GameActions::Status::TooHigh, STR_CANT_RAISE_ELEMENT_HERE, STR_TOO_HIGH); + return GameActions::Result(GameActions::Status::tooHigh, STR_CANT_RAISE_ELEMENT_HERE, STR_TOO_HIGH); } if (newClearanceHeight < 0) { - return GameActions::Result(GameActions::Status::NoClearance, STR_CANT_LOWER_ELEMENT_HERE, STR_NO_CLEARANCE); + return GameActions::Result(GameActions::Status::noClearance, STR_CANT_LOWER_ELEMENT_HERE, STR_NO_CLEARANCE); } if (newClearanceHeight > kMaxTileElementHeight) { - return GameActions::Result(GameActions::Status::NoClearance, STR_CANT_RAISE_ELEMENT_HERE, STR_NO_CLEARANCE); + return GameActions::Result(GameActions::Status::noClearance, STR_CANT_RAISE_ELEMENT_HERE, STR_NO_CLEARANCE); } return GameActions::Result(); } @@ -452,10 +453,10 @@ namespace OpenRCT2::TileInspector TileElement* const tileElement = MapGetNthElementAt(loc, elementIndex); if (tileElement == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); auto heightValidationResult = ValidateTileHeight(tileElement, heightOffset); - if (heightValidationResult.Error != GameActions::Status::Ok) + if (heightValidationResult.error != GameActions::Status::ok) return heightValidationResult; if (isExecuting) @@ -498,7 +499,7 @@ namespace OpenRCT2::TileInspector // No surface element on tile if (surfaceelement == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -518,7 +519,7 @@ namespace OpenRCT2::TileInspector // No surface element on tile if (surfaceElement == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -565,7 +566,7 @@ namespace OpenRCT2::TileInspector // No surface element on tile if (surfaceElement == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_SURFACE_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -581,7 +582,7 @@ namespace OpenRCT2::TileInspector TileElement* const pathElement = MapGetNthElementAt(loc, elementIndex); if (pathElement == nullptr || pathElement->GetType() != TileElementType::Path) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PATH_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PATH_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -597,7 +598,7 @@ namespace OpenRCT2::TileInspector TileElement* const pathElement = MapGetNthElementAt(loc, elementIndex); if (pathElement == nullptr || pathElement->GetType() != TileElementType::Path) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PATH_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PATH_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -612,7 +613,7 @@ namespace OpenRCT2::TileInspector TileElement* const pathElement = MapGetNthElementAt(loc, elementIndex); if (pathElement == nullptr || pathElement->GetType() != TileElementType::Path) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PATH_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PATH_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -627,7 +628,7 @@ namespace OpenRCT2::TileInspector TileElement* const pathElement = MapGetNthElementAt(loc, elementIndex); if (pathElement == nullptr || pathElement->GetType() != TileElementType::Path) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PATH_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_PATH_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -643,12 +644,12 @@ namespace OpenRCT2::TileInspector TileElement* const entranceElement = MapGetNthElementAt(loc, elementIndex); if (entranceElement == nullptr || entranceElement->GetType() != TileElementType::Entrance) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ENTRANCE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_ENTRANCE_ELEMENT_NOT_FOUND); auto ride = GetRide(entranceElement->AsEntrance()->GetRideIndex()); if (ride == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); if (isExecuting) { @@ -674,7 +675,7 @@ namespace OpenRCT2::TileInspector TileElement* const wallElement = MapGetNthElementAt(loc, elementIndex); if (wallElement == nullptr || wallElement->GetType() != TileElementType::Wall) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_WALL_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_WALL_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -691,7 +692,7 @@ namespace OpenRCT2::TileInspector TileElement* const wallElement = MapGetNthElementAt(loc, elementIndex); if (wallElement == nullptr || wallElement->GetType() != TileElementType::Wall) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_WALL_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_WALL_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -712,7 +713,7 @@ namespace OpenRCT2::TileInspector TileElement* const trackElement = MapGetNthElementAt(loc, elementIndex); if (trackElement == nullptr || trackElement->GetType() != TileElementType::Track) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -725,13 +726,13 @@ namespace OpenRCT2::TileInspector auto ride = GetRide(rideIndex); if (ride == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); const auto& ted = GetTrackElementDescriptor(type); auto sequenceIndex = trackElement->AsTrack()->GetSequenceIndex(); if (sequenceIndex >= ted.numSequences) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_BLOCK_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_BLOCK_NOT_FOUND); const auto& trackBlock = ted.sequences[sequenceIndex].clearance; uint8_t originDirection = trackElement->GetDirection(); @@ -756,7 +757,7 @@ namespace OpenRCT2::TileInspector { LOG_ERROR("Track map element part not found!"); return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); } // track_remove returns here on failure, not sure when this would ever be hit. Only thing I can think of is @@ -783,7 +784,7 @@ namespace OpenRCT2::TileInspector TileElement* const trackElement = MapGetNthElementAt(loc, elementIndex); if (trackElement == nullptr || trackElement->GetType() != TileElementType::Track) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -807,13 +808,13 @@ namespace OpenRCT2::TileInspector auto ride = GetRide(rideIndex); if (ride == nullptr) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_RIDE_NOT_FOUND); const auto& ted = GetTrackElementDescriptor(type); auto sequenceIndex = trackElement->AsTrack()->GetSequenceIndex(); if (sequenceIndex >= ted.numSequences) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_BLOCK_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_BLOCK_NOT_FOUND); const auto& trackBlock = ted.sequences[sequenceIndex].clearance; uint8_t originDirection = trackElement->GetDirection(); @@ -838,7 +839,7 @@ namespace OpenRCT2::TileInspector { LOG_ERROR("Track map element part not found!"); return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); } // track_remove returns here on failure, not sure when this would ever be hit. Only thing I can think of is @@ -863,7 +864,7 @@ namespace OpenRCT2::TileInspector TileElement* const trackElement = MapGetNthElementAt(loc, elementIndex); if (trackElement == nullptr || trackElement->GetType() != TileElementType::Track) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -879,7 +880,7 @@ namespace OpenRCT2::TileInspector TileElement* const trackElement = MapGetNthElementAt(loc, elementIndex); if (trackElement == nullptr || trackElement->GetType() != TileElementType::Track) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TRACK_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -895,7 +896,7 @@ namespace OpenRCT2::TileInspector TileElement* const tileElement = MapGetNthElementAt(loc, elementIndex); if (tileElement == nullptr || tileElement->GetType() != TileElementType::SmallScenery) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -915,7 +916,7 @@ namespace OpenRCT2::TileInspector TileElement* const tileElement = MapGetNthElementAt(loc, elementIndex); if (tileElement == nullptr || tileElement->GetType() != TileElementType::SmallScenery) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -932,7 +933,7 @@ namespace OpenRCT2::TileInspector TileElement* const bannerElement = MapGetNthElementAt(loc, elementIndex); if (bannerElement == nullptr || bannerElement->GetType() != TileElementType::Banner) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_BANNER_ELEMENT_NOT_FOUND); if (isExecuting) { @@ -949,7 +950,7 @@ namespace OpenRCT2::TileInspector TileElement* const wallElement = MapGetNthElementAt(loc, elementIndex); if (wallElement == nullptr || wallElement->GetType() != TileElementType::Wall) return GameActions::Result( - GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_WALL_ELEMENT_NOT_FOUND); + GameActions::Status::invalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_WALL_ELEMENT_NOT_FOUND); if (isExecuting) { diff --git a/src/openrct2/world/TileInspector.h b/src/openrct2/world/TileInspector.h index 025eee264c49..ab59207315f8 100644 --- a/src/openrct2/world/TileInspector.h +++ b/src/openrct2/world/TileInspector.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/TilePointerIndex.hpp b/src/openrct2/world/TilePointerIndex.hpp index f0fbc535a220..201cbe09b179 100644 --- a/src/openrct2/world/TilePointerIndex.hpp +++ b/src/openrct2/world/TilePointerIndex.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/Wall.cpp b/src/openrct2/world/Wall.cpp index a37edc2405af..096c3bdee217 100644 --- a/src/openrct2/world/Wall.cpp +++ b/src/openrct2/world/Wall.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/Wall.h b/src/openrct2/world/Wall.h index 504377533106..177c86487f32 100644 --- a/src/openrct2/world/Wall.h +++ b/src/openrct2/world/Wall.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/HeightMap.hpp b/src/openrct2/world/map_generator/HeightMap.hpp index 83bdaf62dfab..f58768ea7cad 100644 --- a/src/openrct2/world/map_generator/HeightMap.hpp +++ b/src/openrct2/world/map_generator/HeightMap.hpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/MapGen.cpp b/src/openrct2/world/map_generator/MapGen.cpp index e714cc196fbe..2200f368f5aa 100644 --- a/src/openrct2/world/map_generator/MapGen.cpp +++ b/src/openrct2/world/map_generator/MapGen.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/MapGen.h b/src/openrct2/world/map_generator/MapGen.h index 431a23121715..88474c88f59a 100644 --- a/src/openrct2/world/map_generator/MapGen.h +++ b/src/openrct2/world/map_generator/MapGen.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/MapHelpers.cpp b/src/openrct2/world/map_generator/MapHelpers.cpp index 7c7d7998864a..13ccc777c1d5 100644 --- a/src/openrct2/world/map_generator/MapHelpers.cpp +++ b/src/openrct2/world/map_generator/MapHelpers.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/MapHelpers.h b/src/openrct2/world/map_generator/MapHelpers.h index 32ac6f026cd0..c4fe03262d60 100644 --- a/src/openrct2/world/map_generator/MapHelpers.h +++ b/src/openrct2/world/map_generator/MapHelpers.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/PngTerrainGenerator.cpp b/src/openrct2/world/map_generator/PngTerrainGenerator.cpp index 9b3501da5728..6a8072fc3f2e 100644 --- a/src/openrct2/world/map_generator/PngTerrainGenerator.cpp +++ b/src/openrct2/world/map_generator/PngTerrainGenerator.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/PngTerrainGenerator.h b/src/openrct2/world/map_generator/PngTerrainGenerator.h index 6563d2b9af4d..f06a1e089b05 100644 --- a/src/openrct2/world/map_generator/PngTerrainGenerator.h +++ b/src/openrct2/world/map_generator/PngTerrainGenerator.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/SimplexNoise.cpp b/src/openrct2/world/map_generator/SimplexNoise.cpp index a79c3092668d..c772d819afed 100644 --- a/src/openrct2/world/map_generator/SimplexNoise.cpp +++ b/src/openrct2/world/map_generator/SimplexNoise.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/SimplexNoise.h b/src/openrct2/world/map_generator/SimplexNoise.h index f8e5a3f5151d..93f13d137ce2 100644 --- a/src/openrct2/world/map_generator/SimplexNoise.h +++ b/src/openrct2/world/map_generator/SimplexNoise.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/SurfaceSelection.cpp b/src/openrct2/world/map_generator/SurfaceSelection.cpp index 109b770524a6..ec95ad937645 100644 --- a/src/openrct2/world/map_generator/SurfaceSelection.cpp +++ b/src/openrct2/world/map_generator/SurfaceSelection.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/SurfaceSelection.h b/src/openrct2/world/map_generator/SurfaceSelection.h index 878441022a49..19c8e57ce99c 100644 --- a/src/openrct2/world/map_generator/SurfaceSelection.h +++ b/src/openrct2/world/map_generator/SurfaceSelection.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/TreePlacement.cpp b/src/openrct2/world/map_generator/TreePlacement.cpp index b87417c07cd2..c03bc0adb718 100644 --- a/src/openrct2/world/map_generator/TreePlacement.cpp +++ b/src/openrct2/world/map_generator/TreePlacement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/map_generator/TreePlacement.h b/src/openrct2/world/map_generator/TreePlacement.h index 80b45555abd9..b15e531474e6 100644 --- a/src/openrct2/world/map_generator/TreePlacement.h +++ b/src/openrct2/world/map_generator/TreePlacement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/BannerElement.h b/src/openrct2/world/tile_element/BannerElement.h index f84ebb032090..141353b6ffe2 100644 --- a/src/openrct2/world/tile_element/BannerElement.h +++ b/src/openrct2/world/tile_element/BannerElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/EntranceElement.cpp b/src/openrct2/world/tile_element/EntranceElement.cpp index 045bda544247..67db84ece392 100644 --- a/src/openrct2/world/tile_element/EntranceElement.cpp +++ b/src/openrct2/world/tile_element/EntranceElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/EntranceElement.h b/src/openrct2/world/tile_element/EntranceElement.h index aaa249f8add1..de20fab960db 100644 --- a/src/openrct2/world/tile_element/EntranceElement.h +++ b/src/openrct2/world/tile_element/EntranceElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/LargeSceneryElement.cpp b/src/openrct2/world/tile_element/LargeSceneryElement.cpp index 151abac85cd3..b88e4913c15a 100644 --- a/src/openrct2/world/tile_element/LargeSceneryElement.cpp +++ b/src/openrct2/world/tile_element/LargeSceneryElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/LargeSceneryElement.h b/src/openrct2/world/tile_element/LargeSceneryElement.h index edaaa4fdc969..98d0ed3be402 100644 --- a/src/openrct2/world/tile_element/LargeSceneryElement.h +++ b/src/openrct2/world/tile_element/LargeSceneryElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/PathElement.cpp b/src/openrct2/world/tile_element/PathElement.cpp index 340fdb3be52d..41861ec4e33f 100644 --- a/src/openrct2/world/tile_element/PathElement.cpp +++ b/src/openrct2/world/tile_element/PathElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -206,43 +206,43 @@ namespace OpenRCT2 return (Flags2 & FOOTPATH_ELEMENT_FLAGS2_LEGACY_PATH_ENTRY) != 0; } - const PathSurfaceDescriptor* PathElement::GetSurfaceDescriptor() const + const PathSurfaceDescriptor& PathElement::GetSurfaceDescriptor() const { if (HasLegacyPathEntry()) { const auto* legacyPathEntry = GetLegacyPathEntry(); if (legacyPathEntry == nullptr) - return nullptr; + return kPathSurfaceDescriptorDummy; if (IsQueue()) - return &legacyPathEntry->GetQueueSurfaceDescriptor(); + return legacyPathEntry->GetQueueSurfaceDescriptor(); - return &legacyPathEntry->GetPathSurfaceDescriptor(); + return legacyPathEntry->GetPathSurfaceDescriptor(); } const auto* surfaceEntry = GetSurfaceEntry(); if (surfaceEntry == nullptr) - return nullptr; + return kPathSurfaceDescriptorDummy; - return &surfaceEntry->GetDescriptor(); + return surfaceEntry->GetDescriptor(); } - const PathRailingsDescriptor* PathElement::GetRailingsDescriptor() const + const PathRailingsDescriptor& PathElement::GetRailingsDescriptor() const { if (HasLegacyPathEntry()) { const auto* legacyPathEntry = GetLegacyPathEntry(); if (legacyPathEntry == nullptr) - return nullptr; + return kPathRailingsDescriptorDummy; - return &legacyPathEntry->GetPathRailingsDescriptor(); + return legacyPathEntry->GetPathRailingsDescriptor(); } const auto* railingsEntry = GetRailingsEntry(); if (railingsEntry == nullptr) - return nullptr; + return kPathRailingsDescriptorDummy; - return &railingsEntry->GetDescriptor(); + return railingsEntry->GetDescriptor(); } ObjectEntryIndex PathElement::GetSurfaceEntryIndex() const @@ -299,7 +299,7 @@ namespace OpenRCT2 bool PathElement::ShouldDrawPathOverSupports() const { // TODO: make this an actual decision of the tile element. - return (GetRailingsDescriptor()->Flags & RAILING_ENTRY_FLAG_DRAW_PATH_OVER_SUPPORTS); + return (GetRailingsDescriptor().flags & RAILING_ENTRY_FLAG_DRAW_PATH_OVER_SUPPORTS); } void PathElement::SetShouldDrawPathOverSupports(bool on) diff --git a/src/openrct2/world/tile_element/PathElement.h b/src/openrct2/world/tile_element/PathElement.h index 236b6295b831..ef1f618f4545 100644 --- a/src/openrct2/world/tile_element/PathElement.h +++ b/src/openrct2/world/tile_element/PathElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -83,8 +83,8 @@ namespace OpenRCT2 const FootpathRailingsObject* GetRailingsEntry() const; void SetRailingsEntryIndex(ObjectEntryIndex newIndex); - const PathSurfaceDescriptor* GetSurfaceDescriptor() const; - const PathRailingsDescriptor* GetRailingsDescriptor() const; + const PathSurfaceDescriptor& GetSurfaceDescriptor() const; + const PathRailingsDescriptor& GetRailingsDescriptor() const; uint8_t GetQueueBannerDirection() const; void SetQueueBannerDirection(uint8_t direction); diff --git a/src/openrct2/world/tile_element/Slope.cpp b/src/openrct2/world/tile_element/Slope.cpp index 02b63117d48c..3a23c31c8c06 100644 --- a/src/openrct2/world/tile_element/Slope.cpp +++ b/src/openrct2/world/tile_element/Slope.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/Slope.h b/src/openrct2/world/tile_element/Slope.h index 9e61c9507df3..e21ca6a2ebaf 100644 --- a/src/openrct2/world/tile_element/Slope.h +++ b/src/openrct2/world/tile_element/Slope.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/SmallSceneryElement.cpp b/src/openrct2/world/tile_element/SmallSceneryElement.cpp index abd29dc16669..a7bb8dd0615b 100644 --- a/src/openrct2/world/tile_element/SmallSceneryElement.cpp +++ b/src/openrct2/world/tile_element/SmallSceneryElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/SmallSceneryElement.h b/src/openrct2/world/tile_element/SmallSceneryElement.h index cb63a03cf99d..70adc2ec472f 100644 --- a/src/openrct2/world/tile_element/SmallSceneryElement.h +++ b/src/openrct2/world/tile_element/SmallSceneryElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/SurfaceElement.cpp b/src/openrct2/world/tile_element/SurfaceElement.cpp index d04d3b66f9d1..1e4c2707e77a 100644 --- a/src/openrct2/world/tile_element/SurfaceElement.cpp +++ b/src/openrct2/world/tile_element/SurfaceElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -69,7 +69,7 @@ namespace OpenRCT2 const auto* surfaceObject = objMgr.GetLoadedObject(surfaceStyle); if (surfaceObject != nullptr) { - if (surfaceObject->Flags & TerrainSurfaceFlags::canGrow) + if (surfaceObject->Flags.has(TerrainSurfaceFlag::canGrow)) { return true; } diff --git a/src/openrct2/world/tile_element/SurfaceElement.h b/src/openrct2/world/tile_element/SurfaceElement.h index b985d19dda9c..feb5cc1c4886 100644 --- a/src/openrct2/world/tile_element/SurfaceElement.h +++ b/src/openrct2/world/tile_element/SurfaceElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/TileElement.cpp b/src/openrct2/world/tile_element/TileElement.cpp index 11c17c7aca85..978b06a0ae5c 100644 --- a/src/openrct2/world/tile_element/TileElement.cpp +++ b/src/openrct2/world/tile_element/TileElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -11,6 +11,7 @@ #include "../../Diagnostic.h" #include "../../core/Guard.hpp" +#include "../../drawing/ScrollingText.h" #include "../../interface/WindowClasses.h" #include "../../ui/WindowManager.h" #include "BannerElement.h" diff --git a/src/openrct2/world/tile_element/TileElement.h b/src/openrct2/world/tile_element/TileElement.h index 02a78c28c211..a0e2afc500fa 100644 --- a/src/openrct2/world/tile_element/TileElement.h +++ b/src/openrct2/world/tile_element/TileElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -10,7 +10,6 @@ #pragma once #include "../../Identifiers.h" -#include "../Banner.h" #include "TileElementBase.h" namespace OpenRCT2 diff --git a/src/openrct2/world/tile_element/TileElementBase.cpp b/src/openrct2/world/tile_element/TileElementBase.cpp index 30a69b708adf..b8761693a17d 100644 --- a/src/openrct2/world/tile_element/TileElementBase.cpp +++ b/src/openrct2/world/tile_element/TileElementBase.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/TileElementBase.h b/src/openrct2/world/tile_element/TileElementBase.h index b0344a921c2d..3060370c689a 100644 --- a/src/openrct2/world/tile_element/TileElementBase.h +++ b/src/openrct2/world/tile_element/TileElementBase.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/TileElementType.h b/src/openrct2/world/tile_element/TileElementType.h index e4e6ec0d53ca..1209b35c7bc1 100644 --- a/src/openrct2/world/tile_element/TileElementType.h +++ b/src/openrct2/world/tile_element/TileElementType.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/TrackElement.cpp b/src/openrct2/world/tile_element/TrackElement.cpp index 1175b7532f33..a8e18a66cdbc 100644 --- a/src/openrct2/world/tile_element/TrackElement.cpp +++ b/src/openrct2/world/tile_element/TrackElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -41,15 +41,15 @@ namespace OpenRCT2 { switch (GetTrackType()) { - case TrackElemType::EndStation: - case TrackElemType::CableLiftHill: - case TrackElemType::BlockBrakes: - case TrackElemType::DiagBlockBrakes: + case TrackElemType::endStation: + case TrackElemType::cableLiftHill: + case TrackElemType::blockBrakes: + case TrackElemType::diagBlockBrakes: return true; - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: + case TrackElemType::up25ToFlat: + case TrackElemType::up60ToFlat: + case TrackElemType::diagUp25ToFlat: + case TrackElemType::diagUp60ToFlat: return HasChain(); default: return false; @@ -65,7 +65,7 @@ namespace OpenRCT2 { const auto* ride = GetRide(GetRideIndex()); if (ride != nullptr && ride->getRideTypeDescriptor().HasFlag(RtdFlag::hasLandscapeDoors)) - return DEFAULT_SEAT_ROTATION; + return kDefaultSeatRotation; return URide.ColourScheme >> 4; } diff --git a/src/openrct2/world/tile_element/TrackElement.h b/src/openrct2/world/tile_element/TrackElement.h index f65e2d1435c4..875e1f36a52a 100644 --- a/src/openrct2/world/tile_element/TrackElement.h +++ b/src/openrct2/world/tile_element/TrackElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/WallElement.cpp b/src/openrct2/world/tile_element/WallElement.cpp index f57bde5cf744..acbfd5125c3e 100644 --- a/src/openrct2/world/tile_element/WallElement.cpp +++ b/src/openrct2/world/tile_element/WallElement.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/world/tile_element/WallElement.h b/src/openrct2/world/tile_element/WallElement.h index 45aaa7bacea8..4b2a48a07109 100644 --- a/src/openrct2/world/tile_element/WallElement.h +++ b/src/openrct2/world/tile_element/WallElement.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2025 OpenRCT2 developers + * Copyright (c) 2014-2026 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/test/tests/CryptTests.cpp b/test/tests/CryptTests.cpp index 5dc16917ae9f..48d0373d6870 100644 --- a/test/tests/CryptTests.cpp +++ b/test/tests/CryptTests.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include using namespace OpenRCT2; diff --git a/test/tests/FormattingTests.cpp b/test/tests/FormattingTests.cpp index 107b2a25b7c1..1c2f88b61d4b 100644 --- a/test/tests/FormattingTests.cpp +++ b/test/tests/FormattingTests.cpp @@ -19,7 +19,6 @@ #include #include #include -#include #include using namespace OpenRCT2; diff --git a/test/tests/ImageImporterTests.cpp b/test/tests/ImageImporterTests.cpp index 5ff11d633917..460e7bc7a4d7 100644 --- a/test/tests/ImageImporterTests.cpp +++ b/test/tests/ImageImporterTests.cpp @@ -48,9 +48,9 @@ TEST_F(ImageImporterTests, Import_Logo) ASSERT_EQ(result.Buffer.data(), result.Element.offset); ASSERT_EQ(128, result.Element.width); ASSERT_EQ(128, result.Element.height); - ASSERT_EQ(3, result.Element.x_offset); - ASSERT_EQ(5, result.Element.y_offset); - ASSERT_EQ(0, result.Element.zoomed_offset); + ASSERT_EQ(3, result.Element.xOffset); + ASSERT_EQ(5, result.Element.yOffset); + ASSERT_EQ(0, result.Element.zoomedOffset); // Check to ensure RLE data doesn't change unexpectedly. // Update expected hash if change is expected. diff --git a/test/tests/IniWriterTest.cpp b/test/tests/IniWriterTest.cpp index 8283baf1fd07..e74d548cbae6 100644 --- a/test/tests/IniWriterTest.cpp +++ b/test/tests/IniWriterTest.cpp @@ -28,7 +28,7 @@ static auto Enum_Currency = ConfigEnum({ TEST_F(IniWriterTest, create_empty) { - OpenRCT2::MemoryStream ms(0); + MemoryStream ms(0); ASSERT_EQ(ms.CanRead(), true); ASSERT_EQ(ms.CanWrite(), true); auto iw = CreateIniWriter(&ms); @@ -37,7 +37,7 @@ TEST_F(IniWriterTest, create_empty) TEST_F(IniWriterTest, create_one_section) { - OpenRCT2::MemoryStream ms(1000); + MemoryStream ms(1000); auto iw = CreateIniWriter(&ms); ASSERT_NE(iw, nullptr); iw->WriteSection("OpenRCT2"); @@ -53,7 +53,7 @@ TEST_F(IniWriterTest, create_one_section) TEST_F(IniWriterTest, create_multiple_sections) { - OpenRCT2::MemoryStream ms(1000); + MemoryStream ms(1000); auto iw = CreateIniWriter(&ms); ASSERT_NE(iw, nullptr); iw->WriteSection("OpenRCT1"); @@ -75,7 +75,7 @@ TEST_F(IniWriterTest, create_multiple_sections) TEST_F(IniWriterTest, create_loose_bool_entry) { - OpenRCT2::MemoryStream ms(1000); + MemoryStream ms(1000); auto iw = CreateIniWriter(&ms); ASSERT_NE(iw, nullptr); iw->WriteBoolean("boolval", true); @@ -91,7 +91,7 @@ TEST_F(IniWriterTest, create_loose_bool_entry) TEST_F(IniWriterTest, create_loose_enum_entry) { - OpenRCT2::MemoryStream ms(1000); + MemoryStream ms(1000); auto iw = CreateIniWriter(&ms); ASSERT_NE(iw, nullptr); iw->WriteEnum("by_string", "stringval"); @@ -108,7 +108,7 @@ TEST_F(IniWriterTest, create_loose_enum_entry) TEST_F(IniWriterTest, create_loose_float_entry) { - OpenRCT2::MemoryStream ms(1000); + MemoryStream ms(1000); auto iw = CreateIniWriter(&ms); ASSERT_NE(iw, nullptr); iw->WriteFloat("one", 1.); @@ -125,7 +125,7 @@ TEST_F(IniWriterTest, create_loose_float_entry) TEST_F(IniWriterTest, create_loose_int32_t_entry) { - OpenRCT2::MemoryStream ms(1000); + MemoryStream ms(1000); auto iw = CreateIniWriter(&ms); ASSERT_NE(iw, nullptr); iw->WriteInt32("one", 1); @@ -148,7 +148,7 @@ TEST_F(IniWriterTest, create_loose_int32_t_entry) TEST_F(IniWriterTest, create_loose_string_entry) { - OpenRCT2::MemoryStream ms(1000); + MemoryStream ms(1000); auto iw = CreateIniWriter(&ms); ASSERT_NE(iw, nullptr); iw->WriteString("path", u8"C:'\\some/dir\\here/神鷹暢遊"); @@ -165,7 +165,7 @@ TEST_F(IniWriterTest, create_loose_string_entry) TEST_F(IniWriterTest, create_multiple_section_with_values) { - OpenRCT2::MemoryStream ms(1000); + MemoryStream ms(1000); auto iw = CreateIniWriter(&ms); ASSERT_NE(iw, nullptr); iw->WriteSection("bool"); @@ -191,7 +191,7 @@ TEST_F(IniWriterTest, create_multiple_section_with_values) TEST_F(IniWriterTest, create_duplicate_sections) { - OpenRCT2::MemoryStream ms(1000); + MemoryStream ms(1000); auto iw = CreateIniWriter(&ms); ASSERT_NE(iw, nullptr); iw->WriteSection("section"); diff --git a/test/tests/LanguagePackTest.cpp b/test/tests/LanguagePackTest.cpp index e5910e9d45fe..e0bdebd2ed97 100644 --- a/test/tests/LanguagePackTest.cpp +++ b/test/tests/LanguagePackTest.cpp @@ -10,7 +10,6 @@ #include "openrct2/localisation/LanguagePack.h" #include "openrct2/localisation/Language.h" -#include "openrct2/localisation/StringIds.h" #include diff --git a/test/tests/MultiLaunch.cpp b/test/tests/MultiLaunch.cpp index 3df8473a0d19..b871812eb200 100644 --- a/test/tests/MultiLaunch.cpp +++ b/test/tests/MultiLaunch.cpp @@ -14,12 +14,7 @@ #include #include #include -#include -#include -#include -#include #include -#include #include #include diff --git a/test/tests/Pathfinding.cpp b/test/tests/Pathfinding.cpp index ace8fcb08067..12c2ea368d74 100644 --- a/test/tests/Pathfinding.cpp +++ b/test/tests/Pathfinding.cpp @@ -6,19 +6,15 @@ #include #include #include -#include #include -#include #include #include #include #include -#include #include #include #include #include -#include #include using namespace OpenRCT2; diff --git a/test/tests/PlayTests.cpp b/test/tests/PlayTests.cpp index 46db582abb64..330d2e2f23ca 100644 --- a/test/tests/PlayTests.cpp +++ b/test/tests/PlayTests.cpp @@ -20,16 +20,15 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include #include -#include #include using namespace OpenRCT2; diff --git a/test/tests/ReplayTests.cpp b/test/tests/ReplayTests.cpp index 7780b158d494..0ed0d68d2f3f 100644 --- a/test/tests/ReplayTests.cpp +++ b/test/tests/ReplayTests.cpp @@ -9,19 +9,17 @@ #include "TestData.h" +#include #include #include -#include +#include #include #include #include -#include -#include #include #include #include #include -#include #include using namespace OpenRCT2; @@ -58,7 +56,7 @@ static std::vector GetReplayFiles() { ReplayTestData test; test.name = sanitizeTestName(scanner->GetFileInfo().Name); - test.filePath = scanner->GetPath(); + test.filePath = Path::GetAbsolute(scanner->GetPath()); res.push_back(std::move(test)); } return res; @@ -84,8 +82,15 @@ TEST_P(ReplayTests, RunReplay) IReplayManager* replayManager = context->GetReplayManager(); ASSERT_NE(replayManager, nullptr); - bool startedReplay = replayManager->StartPlayback(replayFile); - ASSERT_TRUE(startedReplay); + try + { + replayManager->StartPlayback(replayFile); + } + catch (const std::exception& e) + { + LOG_WARNING("Can't start replay!. %s", e.what()); + FAIL(); + } while (replayManager->IsReplaying()) { diff --git a/test/tests/RideRatings.cpp b/test/tests/RideRatings.cpp index fae206b7bb54..31224ef7f696 100644 --- a/test/tests/RideRatings.cpp +++ b/test/tests/RideRatings.cpp @@ -14,11 +14,9 @@ #include #include #include -#include #include #include #include -#include #include #include #include @@ -34,7 +32,7 @@ class RideRatings : public testing::Test auto& gameState = getGameState(); for (const auto& ride : RideManager(gameState)) { - OpenRCT2::RideRating::UpdateRide(ride); + RideRating::UpdateRide(ride); } } @@ -50,7 +48,7 @@ class RideRatings : public testing::Test std::string FormatRatings(const Ride& ride) { - OpenRCT2::RideRating::Tuple ratings = ride.ratings; + RideRating::Tuple ratings = ride.ratings; auto name = std::string(ride.getRideTypeDescriptor().Name); std::string line = String::stdFormat( "%s: (%d, %d, %d)", name.c_str(), static_cast(ratings.excitement), static_cast(ratings.intensity), diff --git a/test/tests/S6ImportExportTests.cpp b/test/tests/S6ImportExportTests.cpp index fdf928140666..774edce68072 100644 --- a/test/tests/S6ImportExportTests.cpp +++ b/test/tests/S6ImportExportTests.cpp @@ -10,7 +10,6 @@ #include "TestData.h" #include -#include #include #include #include @@ -20,21 +19,17 @@ #include #include #include -#include #include -#include #include +#include #include #include -#include #include #include -#include #include #include #include #include -#include #include #include @@ -121,7 +116,7 @@ static bool ExportSave(MemoryStream& stream, std::unique_ptr& context) exporter->ExportObjectsList = objManager.GetPackableObjects(); auto& gameState = getGameState(); - exporter->Export(gameState, stream, OpenRCT2::kParkFileSaveCompressionLevel); + exporter->Export(gameState, stream, kParkFileSaveCompressionLevel); return true; } diff --git a/test/tests/SawyerCodingTest.cpp b/test/tests/SawyerCodingTest.cpp index 823459ecb99a..38cdc5d23527 100644 --- a/test/tests/SawyerCodingTest.cpp +++ b/test/tests/SawyerCodingTest.cpp @@ -37,16 +37,15 @@ class SawyerCodingTest : public testing::Test void TestEncodeDecode(ChunkEncoding encoding_type) { // Encode - SawyerCoding::ChunkHeader chdr_in; + ChunkHeader chdr_in; chdr_in.encoding = encoding_type; chdr_in.length = sizeof(randomdata); uint8_t* encodedDataBuffer = new uint8_t[BUFFER_SIZE]; - size_t encodedDataSize = SawyerCoding::WriteChunkBuffer( - encodedDataBuffer, reinterpret_cast(randomdata), chdr_in); + size_t encodedDataSize = WriteChunkBuffer(encodedDataBuffer, reinterpret_cast(randomdata), chdr_in); ASSERT_GT(encodedDataSize, sizeof(SawyerCoding::ChunkHeader)); // Decode - OpenRCT2::MemoryStream ms(encodedDataBuffer, encodedDataSize); + MemoryStream ms(encodedDataBuffer, encodedDataSize); SawyerChunkReader reader(&ms); auto chunk = reader.ReadChunk(); ASSERT_EQ(chunk->GetEncoding(), chdr_in.encoding); @@ -59,11 +58,11 @@ class SawyerCodingTest : public testing::Test void TestDecode(const uint8_t* data, size_t size) { - auto expectedLength = size - sizeof(SawyerCoding::ChunkHeader); - auto chdr_in = reinterpret_cast(data); + auto expectedLength = size - sizeof(ChunkHeader); + auto chdr_in = reinterpret_cast(data); ASSERT_EQ(chdr_in->length, expectedLength); - OpenRCT2::MemoryStream ms(data, size); + MemoryStream ms(data, size); SawyerChunkReader reader(&ms); auto chunk = reader.ReadChunk(); ASSERT_EQ(chunk->GetEncoding(), chdr_in->encoding); @@ -120,7 +119,7 @@ TEST_F(SawyerCodingTest, decode_chunk_rotate) TEST_F(SawyerCodingTest, invalid1) { - OpenRCT2::MemoryStream ms(invalid1, sizeof(invalid1)); + MemoryStream ms(invalid1, sizeof(invalid1)); SawyerChunkReader reader(&ms); std::shared_ptr ptr; EXPECT_THROW(ptr = reader.ReadChunk(), SawyerChunkException); @@ -128,7 +127,7 @@ TEST_F(SawyerCodingTest, invalid1) TEST_F(SawyerCodingTest, invalid2) { - OpenRCT2::MemoryStream ms(invalid2, sizeof(invalid2)); + MemoryStream ms(invalid2, sizeof(invalid2)); SawyerChunkReader reader(&ms); std::shared_ptr ptr; EXPECT_THROW(ptr = reader.ReadChunk(), SawyerChunkException); @@ -136,7 +135,7 @@ TEST_F(SawyerCodingTest, invalid2) TEST_F(SawyerCodingTest, invalid3) { - OpenRCT2::MemoryStream ms(invalid3, sizeof(invalid3)); + MemoryStream ms(invalid3, sizeof(invalid3)); SawyerChunkReader reader(&ms); std::shared_ptr ptr; EXPECT_THROW(ptr = reader.ReadChunk(), SawyerChunkException); @@ -144,7 +143,7 @@ TEST_F(SawyerCodingTest, invalid3) TEST_F(SawyerCodingTest, invalid4) { - OpenRCT2::MemoryStream ms(invalid4, sizeof(invalid4)); + MemoryStream ms(invalid4, sizeof(invalid4)); SawyerChunkReader reader(&ms); std::shared_ptr ptr; EXPECT_THROW(ptr = reader.ReadChunk(), SawyerChunkException); @@ -152,7 +151,7 @@ TEST_F(SawyerCodingTest, invalid4) TEST_F(SawyerCodingTest, invalid5) { - OpenRCT2::MemoryStream ms(invalid5, sizeof(invalid5)); + MemoryStream ms(invalid5, sizeof(invalid5)); SawyerChunkReader reader(&ms); std::shared_ptr ptr; EXPECT_THROW(ptr = reader.ReadChunk(), SawyerChunkException); @@ -160,7 +159,7 @@ TEST_F(SawyerCodingTest, invalid5) TEST_F(SawyerCodingTest, invalid6) { - OpenRCT2::MemoryStream ms(invalid6, sizeof(invalid6)); + MemoryStream ms(invalid6, sizeof(invalid6)); SawyerChunkReader reader(&ms); std::shared_ptr ptr; EXPECT_THROW(ptr = reader.ReadChunk(), SawyerChunkException); @@ -168,7 +167,7 @@ TEST_F(SawyerCodingTest, invalid6) TEST_F(SawyerCodingTest, invalid7) { - OpenRCT2::MemoryStream ms(invalid7, sizeof(invalid7)); + MemoryStream ms(invalid7, sizeof(invalid7)); SawyerChunkReader reader(&ms); std::shared_ptr ptr; EXPECT_THROW(ptr = reader.ReadChunk(), SawyerChunkException); @@ -176,7 +175,7 @@ TEST_F(SawyerCodingTest, invalid7) TEST_F(SawyerCodingTest, empty) { - OpenRCT2::MemoryStream ms(empty, 0); + MemoryStream ms(empty, 0); SawyerChunkReader reader(&ms); std::shared_ptr ptr; EXPECT_THROW(ptr = reader.ReadChunk(), IOException); diff --git a/test/tests/StringTest.cpp b/test/tests/StringTest.cpp index 2fb0e36439cc..7a30610fd90a 100644 --- a/test/tests/StringTest.cpp +++ b/test/tests/StringTest.cpp @@ -91,7 +91,7 @@ TEST_F(StringTest, Convert_950_to_UTF8) { auto input = StringFromHex("a7d6b374aabab4c4a6e2aab0af57"); auto expected = u8"快速的棕色狐狸"; - auto actual = String::convertToUtf8(input, OpenRCT2::CodePage::CP_950); + auto actual = String::convertToUtf8(input, CP_950); ASSERT_EQ(expected, actual); } @@ -99,7 +99,7 @@ TEST_F(StringTest, Convert_UTF8_to_UTF8) { auto input = u8"سريع|brown|ثعلب"; auto expected = input; - auto actual = String::convertToUtf8(input, OpenRCT2::CodePage::UTF8); + auto actual = String::convertToUtf8(input, UTF8); ASSERT_EQ(expected, actual); } @@ -107,7 +107,7 @@ TEST_F(StringTest, Convert_Empty) { auto input = ""; auto expected = input; - auto actual = String::convertToUtf8(input, OpenRCT2::CodePage::CP_1252); + auto actual = String::convertToUtf8(input, CP_1252); ASSERT_EQ(expected, actual); } diff --git a/test/tests/TileElements.cpp b/test/tests/TileElements.cpp index 9cd3b1b328dd..9d2757b15829 100644 --- a/test/tests/TileElements.cpp +++ b/test/tests/TileElements.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -161,7 +160,7 @@ TEST_F(TileElementWantsFootpathConnection, MapEdge) // Calculate the connected edges and set the appropriate edge flags // FIXME: The footpath functions should only take PathElement and not TileElement. - FootpathConnectEdges({ 16, 64 }, pathElement->as(), 0); + FootpathConnectEdges({ 16, 64 }, pathElement->as(), {}); auto edges = pathElement->GetEdges(); // The tiles alongside in the Y direction are both on the map edge so should be marked as an edge diff --git a/test/tests/TileElementsView.cpp b/test/tests/TileElementsView.cpp index 79f868bdefad..fb213ba9ec9d 100644 --- a/test/tests/TileElementsView.cpp +++ b/test/tests/TileElementsView.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include diff --git a/test/tests/testdata/ratings/BigMapTest.sv6.txt b/test/tests/testdata/ratings/BigMapTest.sv6.txt index f3f684f653c7..e11501c474d0 100644 --- a/test/tests/testdata/ratings/BigMapTest.sv6.txt +++ b/test/tests/testdata/ratings/BigMapTest.sv6.txt @@ -34,7 +34,7 @@ mine_train_rc: (642, 708, 468) looping_rc: (606, 564, 264) stand_up_rc: (536, 943, 644) corkscrew_rc: (613, 830, 365) -lim_launched_rc: (632, 937, 529) +lim_launched_rc: (632, 870, 529) twister_rc: (784, 645, 372) hyper_twister: (737, 620, 344) giga_rc: (851, 545, 305) diff --git a/test/tests/testdata/ratings/EverythingPark.park.txt b/test/tests/testdata/ratings/EverythingPark.park.txt index 4a670df88ffc..69a86548deef 100644 --- a/test/tests/testdata/ratings/EverythingPark.park.txt +++ b/test/tests/testdata/ratings/EverythingPark.park.txt @@ -428,9 +428,9 @@ giga_rc: (460, 1219, 505) maze: (139, 52, 0) submarine_ride: (247, 180, 140) submarine_ride: (247, 180, 140) -lim_launched_rc: (53, 61, 40) -lim_launched_rc: (53, 61, 40) -lim_launched_rc: (53, 61, 40) +lim_launched_rc: (53, 57, 40) +lim_launched_rc: (53, 57, 40) +lim_launched_rc: (53, 57, 40) flying_rc: (31, 282, 473) flying_rc: (31, 282, 473) flying_rc: (31, 282, 473) @@ -475,9 +475,9 @@ maze: (150, 90, 0) maze: (150, 90, 0) maze: (150, 90, 0) corkscrew_rc: (482, 510, 220) -lim_launched_rc: (528, 730, 443) -lim_launched_rc: (532, 727, 436) -lim_launched_rc: (530, 812, 472) +lim_launched_rc: (528, 678, 443) +lim_launched_rc: (532, 675, 436) +lim_launched_rc: (530, 754, 472) miniature_railway: (154, 12, 1) miniature_railway: (154, 12, 1) miniature_railway: (149, 12, 1) diff --git a/test/tests/testdata/ratings/bpb.sv6.txt b/test/tests/testdata/ratings/bpb.sv6.txt index 9910aa43f5bc..5946f1ee7bbd 100644 --- a/test/tests/testdata/ratings/bpb.sv6.txt +++ b/test/tests/testdata/ratings/bpb.sv6.txt @@ -96,7 +96,7 @@ mini_rc: (539, 563, 397) spiral_rc: (620, 373, 215) looping_rc: (467, 441, 182) stand_up_rc: (553, 790, 558) -lim_launched_rc: (680, 944, 573) +lim_launched_rc: (680, 876, 573) twister_rc: (778, 769, 425) giga_rc: (624, 359, 200) inverted_rc: (678, 850, 686)