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 |
-|------------------------------------------------------------------------------------------------------------------------|--------------------------|
-| [](https://openrct2.io/download/release/latest) | [](https://openrct2.io/download/develop/latest) |
+| Latest release | Latest development build |
+|----------------------------------------------------------------------------------------------------------------------|--------------------------|
+| [](https://openrct2.io/download/release/latest) | [](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